CMS Project Sync
|
After Width: | Height: | Size: 558 B |
@@ -0,0 +1,833 @@
|
||||
import { SMUSH_BEFORE_SIZES, LAZY_BEFORE_SIZES, AutoResizing } from '../frontend/lazy-load/auto-resizing';
|
||||
import { isSmushLazySizesInstance } from '../frontend/lazy-load/helper/lazysizes';
|
||||
|
||||
jest.mock( '../frontend/lazy-load/helper/lazysizes', () => ( {
|
||||
isSmushLazySizesInstance: jest.fn(),
|
||||
} ) );
|
||||
|
||||
describe( 'AutoResizing', () => {
|
||||
let instance;
|
||||
let originalDevicePixelRatio;
|
||||
|
||||
beforeEach( () => {
|
||||
document.body.innerHTML = ''; // Clear DOM
|
||||
originalDevicePixelRatio = window.devicePixelRatio;
|
||||
isSmushLazySizesInstance.mockReset();
|
||||
instance = new AutoResizing( { precision: 5, skipAutoWidth: true } );
|
||||
} );
|
||||
|
||||
afterEach( () => {
|
||||
window.matchMedia = undefined;
|
||||
window.devicePixelRatio = originalDevicePixelRatio;
|
||||
} );
|
||||
|
||||
test( 'initializes with default values', () => {
|
||||
const auto = new AutoResizing();
|
||||
expect( auto.precision ).toBe( 0 );
|
||||
expect( auto.skipAutoWidth ).toBe( false );
|
||||
} );
|
||||
|
||||
test.each([
|
||||
[
|
||||
'Smush LazySizes instance is valid',
|
||||
true,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=500x0 500w'
|
||||
],
|
||||
[
|
||||
'Smush LazySizes instance is invalid',
|
||||
false,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w'
|
||||
]
|
||||
])( 'Should handle LAZY_BEFORE_SIZES event based on Smush LazySizes instance: %s', ( description, isValidLazyInstance, expectedSrcset ) => {
|
||||
isSmushLazySizesInstance.mockReturnValue( isValidLazyInstance );
|
||||
|
||||
const imageMarkup = `<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px">`;
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
// Appending the image into document to ensures the event can propagate through the DOM tree,
|
||||
// allowing listeners on document to catch it.
|
||||
document.body.appendChild( img );
|
||||
|
||||
const event = new CustomEvent( LAZY_BEFORE_SIZES, {
|
||||
detail: { instance: {}, width: 500, dataAttr: true },
|
||||
bubbles: true,
|
||||
} );
|
||||
Object.defineProperty( event, 'target', { value: img } );
|
||||
document.dispatchEvent( event );
|
||||
|
||||
const srcset = img.getAttribute( 'data-srcset' );
|
||||
expect( srcset ).toBe( expectedSrcset );
|
||||
} );
|
||||
|
||||
test.each( [
|
||||
[
|
||||
'skips resizing when width is invalid',
|
||||
'img', null, true, 'https://smushcdn.com/img-300x300.jpg 300w'
|
||||
],
|
||||
[
|
||||
'skips resizing when not initial render',
|
||||
'img', 500, false, 'https://smushcdn.com/img-300x300.jpg 300w'
|
||||
],
|
||||
[
|
||||
'performs resizing for valid image and initial render',
|
||||
'img', 500, true, 'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=500x0 500w'
|
||||
],
|
||||
[
|
||||
'skips resizing when element is not an image',
|
||||
'div', 500, true, 'https://smushcdn.com/img-300x300.jpg 300w'
|
||||
],
|
||||
] )( 'skips processing when element is not image or missing width, dataAttr: %s', ( description, tagName, resizeWidth, isInitialRender, expectedSrcset ) => {
|
||||
const element = document.createElement( tagName );
|
||||
element.setAttribute( 'data-src', 'https://smushcdn.com/img.jpg' );
|
||||
element.setAttribute( 'data-srcset', 'https://smushcdn.com/img-300x300.jpg 300w' );
|
||||
element.setAttribute( 'data-original-sizes', '(max-width: 1024px) 100vw, 1024px' );
|
||||
document.body.appendChild( element );
|
||||
|
||||
const event = new CustomEvent( LAZY_BEFORE_SIZES, {
|
||||
detail: { instance: {}, width: resizeWidth, dataAttr: isInitialRender },
|
||||
bubbles: true,
|
||||
} );
|
||||
Object.defineProperty( event, 'target', { value: element } );
|
||||
|
||||
isSmushLazySizesInstance.mockReturnValue( true );
|
||||
document.dispatchEvent( event );
|
||||
|
||||
const srcset = element.getAttribute( 'data-srcset' );
|
||||
expect( srcset ).toBe( expectedSrcset );
|
||||
} );
|
||||
|
||||
test.each( [
|
||||
[
|
||||
'Image element eligible for resizing',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 400px) 100vw, 400px"
|
||||
width="350" >`,
|
||||
true
|
||||
],
|
||||
[
|
||||
'Image element NOT eligible for resizing due to missing data-src',
|
||||
`<img src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 400px) 100vw, 400px"
|
||||
width="350" >`,
|
||||
false
|
||||
],
|
||||
[
|
||||
'Image element NOT eligible for resizing due to missing data-srcset',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 400px) 100vw, 400px"
|
||||
width="350" >`,
|
||||
false
|
||||
],
|
||||
[
|
||||
'Image element NOT eligible for resizing due to missing data-original-sizes',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto"
|
||||
width="350" >`,
|
||||
false
|
||||
],
|
||||
] )( 'test isElementEligibleForResizing: %s', ( description, imageMarkup, expectedResult ) => {
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
|
||||
expect( instance.isElementEligibleForResizing( img ) ).toBe( expectedResult );
|
||||
} );
|
||||
|
||||
test.each( [
|
||||
[
|
||||
'Image has max width smaller than resizing width, revert to original sizes.',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px">`,
|
||||
'(max-width: 300px) 100vw, 300px'
|
||||
],
|
||||
[
|
||||
'Image has max width equal resizing width does not revert sizes.',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 900w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 350px) 100vw, 350px">`,
|
||||
null
|
||||
],
|
||||
[
|
||||
'Image has width auto, revert to original sizes.',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 400w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 400px) 100vw, 400px"
|
||||
style="width:auto" >`,
|
||||
'(max-width: 400px) 100vw, 400px'
|
||||
],
|
||||
[
|
||||
'Valid resizing image, keep using data-size="auto".',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 400w"
|
||||
data-sizes="auto"
|
||||
data-original-sizes="(max-width: 400px) 100vw, 400px" >`,
|
||||
null
|
||||
],
|
||||
[
|
||||
'Image with no data-original-sizes does not revert sizes.',
|
||||
`<img data-src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img.jpg 300w"
|
||||
data-sizes="auto" style="width:auto">`,
|
||||
null
|
||||
],
|
||||
] )( 'reverts to original sizes if applicable: %s', ( description, imageMarkup, expectedSizes ) => {
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
const isRevertedToOriginalSizes = Boolean( expectedSizes );
|
||||
|
||||
const preventDefault = jest.fn();
|
||||
const event = {
|
||||
detail: { instance: {}, width: 350, dataAttr: true },
|
||||
target: img,
|
||||
preventDefault,
|
||||
};
|
||||
|
||||
instance.maybeAutoResize( event );
|
||||
|
||||
expect( img.getAttribute( 'sizes' ) ).toBe( expectedSizes );
|
||||
expect( preventDefault ).toHaveBeenCalledTimes( isRevertedToOriginalSizes ? 1 : 0 );
|
||||
} );
|
||||
|
||||
test( 'Revert original sizes via custom event', () => {
|
||||
isSmushLazySizesInstance.mockReturnValue( true );
|
||||
|
||||
const img = document.createElement( 'img' );
|
||||
img.setAttribute( 'data-original-sizes', '(max-width: 400px) 100vw, 400px' );
|
||||
img.setAttribute( 'data-src', 'https://example.com/img.jpg?size=400x0' );
|
||||
img.setAttribute( 'data-srcset', 'https://example.com/img.jpg 400w' );
|
||||
img.setAttribute( 'data-sizes', 'auto' );
|
||||
// Appending the image into document to ensures the event can propagate through the DOM tree,
|
||||
// allowing listeners on document to catch it.
|
||||
document.body.appendChild( img );
|
||||
|
||||
// Listen and prevent default on the custom event
|
||||
const handler = function( e ) {
|
||||
e.preventDefault();
|
||||
};
|
||||
document.addEventListener( SMUSH_BEFORE_SIZES, handler );
|
||||
|
||||
// Create a real CustomEvent
|
||||
const event = new CustomEvent( LAZY_BEFORE_SIZES, {
|
||||
detail: { instance: {}, width: 350, dataAttr: true },
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
} );
|
||||
Object.defineProperty( event, 'target', { value: img } );
|
||||
|
||||
// Call the method that triggers the event internally
|
||||
document.dispatchEvent( event );
|
||||
|
||||
expect( img.getAttribute( 'sizes' ) ).toBe( '(max-width: 400px) 100vw, 400px' );
|
||||
expect( img.getAttribute( 'data-srcset' ) ).toBe( 'https://example.com/img.jpg 400w' );
|
||||
|
||||
document.removeEventListener( SMUSH_BEFORE_SIZES, handler );
|
||||
} );
|
||||
|
||||
const skippedImages = [
|
||||
[
|
||||
'Image missing data-src',
|
||||
`<img src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w'
|
||||
],
|
||||
[
|
||||
'Image missing data-srcset',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
''
|
||||
],
|
||||
[
|
||||
'Image skipped due to source is not from Smush CDN',
|
||||
`<img src="https://example.com/img.jpg"
|
||||
data-srcset="https://example.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://example.com/img-300x300.jpg 300w'
|
||||
],
|
||||
[
|
||||
'Image skipped due to has similar source in srcset',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=605x0 605w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=605x0 605w'
|
||||
],
|
||||
];
|
||||
|
||||
const autoResizedImages = [
|
||||
[
|
||||
'Resizes CDN image and appends new srcset entry for requested width',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w'
|
||||
],
|
||||
[
|
||||
'Adds new CDN srcset entry for 600w since it is not within precision (5) of existing 594w',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w, https://smushcdn.com/img.jpg?size=600x0 600w'
|
||||
],
|
||||
[
|
||||
'Adds new CDN srcset entry for 600w since similar source in srcset smaller than requested width',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w, https://smushcdn.com/img.jpg?size=600x0 600w'
|
||||
],
|
||||
];
|
||||
|
||||
test.each( [
|
||||
...skippedImages,
|
||||
...autoResizedImages,
|
||||
] )( 'test resizeImageWithCDN: %s', ( description, imageMarkup, expectedSrcset ) => {
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
|
||||
const event = {
|
||||
detail: { width: 600, instance: {}, dataAttr: true },
|
||||
target: img,
|
||||
preventDefault: jest.fn(),
|
||||
};
|
||||
|
||||
instance.maybeAutoResize( event );
|
||||
|
||||
const newSrcset = img.getAttribute( 'data-srcset' ) || '';
|
||||
expect( newSrcset ).toBe( expectedSrcset );
|
||||
} );
|
||||
|
||||
const autoResizedImagesWithRetina = [
|
||||
[
|
||||
'Resizes CDN image and appends new srcset entry for requested width',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=315x0 315w, https://smushcdn.com/img.jpg?size=552x0 552w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
],
|
||||
[
|
||||
'Appends new CDN srcset entry for requested width, preserving existing retina source',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=552x0 552w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=552x0 552w, https://smushcdn.com/img.jpg?size=315x0 315w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >`,
|
||||
],
|
||||
[
|
||||
'Adds both standard and retina srcset entries when original sizes match requested width',
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 315px) 100vw, 315px" >`,
|
||||
`<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=315x0 315w, https://smushcdn.com/img.jpg?size=552x0 552w"
|
||||
data-original-sizes="(max-width: 315px) 100vw, 315px" >`,
|
||||
],
|
||||
[
|
||||
'Appends new CDN srcset entry to all responsive <source> elements in a <picture> element',
|
||||
`<picture>
|
||||
<source
|
||||
media="(min-width: 800px)" type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium-large.webp 800w, https://smushcdn.com/large.webp 1024w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(min-width: 800px)" type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(max-width: 799px)" type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium.webp 500w, https://smushcdn.com/medium-smaller.webp 400w"
|
||||
data-sizes="100vw">
|
||||
<source
|
||||
media="(max-width: 799px)" type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w"
|
||||
data-sizes="100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium-large.webp 800w, https://smushcdn.com/large.webp 1024w, https://smushcdn.com/large.webp?size=315x0 315w, https://smushcdn.com/large.webp?size=552x0 552w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w, https://smushcdn.com/large.jpg?size=315x0 315w, https://smushcdn.com/large.jpg?size=552x0 552w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium.webp 500w, https://smushcdn.com/medium-smaller.webp 400w, https://smushcdn.com/medium.webp?size=315x0 315w, https://smushcdn.com/medium.webp?size=552x0 552w"
|
||||
data-sizes="100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w, https://smushcdn.com/medium.jpg?size=315x0 315w, https://smushcdn.com/medium.jpg?size=552x0 552w"
|
||||
data-sizes="100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=315x0 315w, https://smushcdn.com/img.jpg?size=552x0 552w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px">
|
||||
</picture>`,
|
||||
'media="(max-width: 799px)"'
|
||||
],
|
||||
[
|
||||
'For non-responsive <source> elements in a <picture>, only appends new CDN srcset entry only to the selected source.',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-1024x1024.webp" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300" type="image/jpeg">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-1024x1024.webp" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=315x0 315w, https://smushcdn.com/img.jpg?size=552x0 552w" type="image/jpeg">
|
||||
<img data-src="https://smushcdn.com/img.jpg" data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=315x0 315w, https://smushcdn.com/img.jpg?size=552x0 552w\" data-original-sizes="(max-width: 1024px) 100vw, 1024px">
|
||||
</picture>`,
|
||||
'type="image/jpeg"',
|
||||
],
|
||||
];
|
||||
|
||||
test.each(
|
||||
autoResizedImagesWithRetina
|
||||
)( 'test resizeImageWithCDN with retina: %s', ( description, imageMarkup, expectedMarkup, selectedSourceString = 'source' ) => {
|
||||
jest.spyOn(instance, 'isSourceActive').mockImplementation((sourceElement) => {
|
||||
const markup = sourceElement.outerHTML;
|
||||
return markup.includes( selectedSourceString );
|
||||
});
|
||||
window.devicePixelRatio = 1.75; // Simulate retina display
|
||||
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
document.body.appendChild( container );
|
||||
|
||||
const event = {
|
||||
detail: { width: 315, instance: {}, dataAttr: true },
|
||||
target: container.querySelector('img'),
|
||||
preventDefault: jest.fn(),
|
||||
};
|
||||
|
||||
instance.maybeAutoResize( event );
|
||||
|
||||
const updatedMarkup = (document.body.querySelector('picture') || document.body.querySelector('img')).outerHTML;
|
||||
|
||||
expect( normalizeHtml( updatedMarkup ) ).toBe( normalizeHtml( expectedMarkup ) );
|
||||
} );
|
||||
|
||||
test( 'resizeImageWithCDN with custom resizing width', () => {
|
||||
const imageMarkup = `<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px">`;
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = imageMarkup;
|
||||
const img = container.firstElementChild;
|
||||
// Appending the image into document to ensures the event can propagate through the DOM tree,
|
||||
// allowing listeners on document to catch it.
|
||||
document.body.appendChild( img );
|
||||
|
||||
// Listen and prevent default on the custom event.
|
||||
const handler = function( e ) {
|
||||
e.detail.resizeWidth = 400;
|
||||
};
|
||||
document.addEventListener( SMUSH_BEFORE_SIZES, handler );
|
||||
|
||||
// Create a real CustomEvent
|
||||
const event = new CustomEvent( LAZY_BEFORE_SIZES, {
|
||||
detail: { instance: {}, width: 600, dataAttr: true },
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
} );
|
||||
|
||||
Object.defineProperty( event, 'target', { value: img } );
|
||||
|
||||
isSmushLazySizesInstance.mockReturnValue( true );
|
||||
document.dispatchEvent( event );
|
||||
|
||||
const newSrcset = img.getAttribute( 'data-srcset' );
|
||||
const expectedSrcset = 'https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=400x0 400w';
|
||||
expect( newSrcset ).toBe( expectedSrcset );
|
||||
|
||||
document.removeEventListener( SMUSH_BEFORE_SIZES, handler );
|
||||
} );
|
||||
|
||||
const autoResizedPictures = [
|
||||
[
|
||||
'New srcset entry appended to source with webp type',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.webp 300w, https://smushcdn.com/img.webp 1024w" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300 300w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.webp 300w, https://smushcdn.com/img.webp 1024w, https://smushcdn.com/img.webp?size=600x0 600w" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300 300w, https://smushcdn.com/img.jpg?size=600x0 600w">
|
||||
<img data-src="https://smushcdn.com/img.jpg" data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w" data-original-sizes="(max-width: 1024px) 100vw, 1024px">
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Adds new CDN srcset entry for 600w in <picture> since it is not within precision (5) of existing 594w',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w, https://smushcdn.com/img.jpg?size=600x0 600w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=594x0 594w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Adds new CDN srcset entry for 600w in <picture> since similar source in srcset smaller than requested width',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w, https://smushcdn.com/img.jpg?size=600x0 600w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Adds new CDN srcset entry for 600w in <picture> since similar source in srcset smaller than requested width',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w, https://smushcdn.com/img.jpg?size=600x0 600w">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=595x0 595w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Multi-Breakpoint <Picture> template using srcset and sizes',
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(min-width: 500px)"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w"
|
||||
data-sizes="(min-width: 500px) 100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w, https://smushcdn.com/large.jpg?size=600x0 600w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(min-width: 500px)"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w, https://smushcdn.com/medium.jpg?size=600x0 600w"
|
||||
data-sizes="(min-width: 500px) 100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px">
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Responsive <source> with type and media attributes in <picture> element',
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium-large.webp 800w, https://smushcdn.com/large.webp 1024w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium.webp 500w, https://smushcdn.com/medium-smaller.webp 400w"
|
||||
data-sizes="100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w"
|
||||
data-sizes="100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium-large.webp 800w, https://smushcdn.com/large.webp 1024w, https://smushcdn.com/large.webp?size=600x0 600w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source media="(min-width: 800px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium-large.jpg 800w, https://smushcdn.com/large.jpg 1024w, https://smushcdn.com/large.jpg?size=600x0 600w"
|
||||
data-sizes="(min-width: 800px) 100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/webp"
|
||||
data-srcset="https://smushcdn.com/medium.webp 500w, https://smushcdn.com/medium-smaller.webp 400w, https://smushcdn.com/medium.webp?size=600x0 600w"
|
||||
data-sizes="100vw">
|
||||
<source
|
||||
media="(max-width: 799px)"
|
||||
type="image/jpeg"
|
||||
data-srcset="https://smushcdn.com/medium.jpg 500w, https://smushcdn.com/medium-smaller.jpg 400w, https://smushcdn.com/medium.jpg?size=600x0 600w"
|
||||
data-sizes="100vw">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px">
|
||||
</picture>`
|
||||
],
|
||||
[
|
||||
'Multi-format <source> elements in the <picture> element',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-1024x1024.webp" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300" type="image/jpeg">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-1024x1024.webp" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=600x0" type="image/jpeg">
|
||||
<img data-src="https://smushcdn.com/img.jpg" data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w" data-original-sizes="(max-width: 1024px) 100vw, 1024px">
|
||||
</picture>`,
|
||||
'type="image/jpeg"',
|
||||
],
|
||||
[
|
||||
'<source> elements with descending min-widths in the <picture> element',
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)" data-srcset="https://smushcdn.com/large.jpg">
|
||||
<source media="(min-width: 500px)" data-srcset="https://smushcdn.com/medium.jpg">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source media="(min-width: 800px)" data-srcset="https://smushcdn.com/large.jpg?size=600x0">
|
||||
<source media="(min-width: 500px)" data-srcset="https://smushcdn.com/medium.jpg">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w"
|
||||
data-original-sizes="(max-width: 300px) 100vw, 300px">
|
||||
</picture>`,
|
||||
'media="(min-width: 800px)"',
|
||||
],
|
||||
];
|
||||
|
||||
const skippedPictures = [
|
||||
[
|
||||
'Srcset not changed in <source> elements when x descriptor is found',
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.webp 1x, https://smushcdn.com/img.webp 2x" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300 1x">
|
||||
<img data-src="https://smushcdn.com/img.jpg"
|
||||
data-srcset="https://smushcdn.com/img-300x300.jpg 300w"
|
||||
data-original-sizes="(max-width: 1024px) 100vw, 1024px" >
|
||||
</picture>`,
|
||||
`<picture>
|
||||
<source data-srcset="https://smushcdn.com/img-300x300.webp 1x, https://smushcdn.com/img.webp 2x" type="image/webp">
|
||||
<source data-srcset="https://smushcdn.com/img.jpg?size=300x300 1x">
|
||||
<img data-src="https://smushcdn.com/img.jpg" data-srcset="https://smushcdn.com/img-300x300.jpg 300w, https://smushcdn.com/img.jpg?size=600x0 600w" data-original-sizes="(max-width: 1024px) 100vw, 1024px">
|
||||
</picture>`
|
||||
]
|
||||
];
|
||||
|
||||
test.each([
|
||||
...skippedPictures,
|
||||
... autoResizedPictures
|
||||
] )( 'test auto resize picture element: %s', ( description, pictureMarkup, expectedMarkup, selectedSourceString = 'source' ) => {
|
||||
jest.spyOn(instance, 'isSourceActive').mockImplementation((sourceElement) => {
|
||||
const markup = sourceElement.outerHTML;
|
||||
return markup.includes( selectedSourceString );
|
||||
});
|
||||
const container = document.createElement( 'div' );
|
||||
container.innerHTML = pictureMarkup;
|
||||
document.body.appendChild( container );
|
||||
|
||||
const event = {
|
||||
detail: { width: 600, instance: {}, dataAttr: true },
|
||||
target: container.querySelector('img'),
|
||||
preventDefault: jest.fn(),
|
||||
};
|
||||
|
||||
instance.maybeAutoResize( event );
|
||||
const updatedMarkup = document.body.querySelector('picture').outerHTML;
|
||||
|
||||
expect( normalizeHtml( updatedMarkup ) ).toBe( normalizeHtml( expectedMarkup ) );
|
||||
} );
|
||||
|
||||
function normalizeHtml(html) {
|
||||
return html
|
||||
.replace(/\s+/g, ' ') // collapse whitespace
|
||||
.replace(/\s+>/g, '>') // remove space(s) before '>'
|
||||
.trim();
|
||||
}
|
||||
|
||||
test.each(
|
||||
[
|
||||
[
|
||||
// 1
|
||||
'No match: all sources are smaller than required width',
|
||||
[
|
||||
{ value: 300, unit: 'w' },
|
||||
{ value: 600, unit: 'w' },
|
||||
],
|
||||
602,
|
||||
undefined,
|
||||
],
|
||||
[
|
||||
// 2
|
||||
'No match: units do not match',
|
||||
[
|
||||
{ value: 300, unit: 'w' },
|
||||
{ value: 604, unit: 'h' },
|
||||
],
|
||||
602,
|
||||
undefined,
|
||||
],
|
||||
[
|
||||
// 3
|
||||
'Match found: source within precision range of required width',
|
||||
[
|
||||
{ value: 300, unit: 'w' },
|
||||
{ value: 604, unit: 'w' },
|
||||
],
|
||||
602,
|
||||
{ value: 604 },
|
||||
],
|
||||
]
|
||||
)( 'findSimilarSource returns matching source within precision: %s', ( description, sources, resizeWidth, expectedMatch ) => {
|
||||
const unit = 'w';
|
||||
const precision = 5;
|
||||
const found = instance.findSimilarSource( sources, resizeWidth, unit, precision );
|
||||
const expectedResult = expectedMatch ? expect.objectContaining( expectedMatch ) : undefined;
|
||||
expect( found ).toEqual( expectedResult );
|
||||
} );
|
||||
|
||||
test( 'getElementWidth returns correctly.', () => {
|
||||
const img = document.createElement( 'img' );
|
||||
// Mock getComputedStyle to return a non-numeric width
|
||||
window.getComputedStyle = () => ( { width: 'auto' } );
|
||||
expect( instance.getElementWidth( img ) ).toBe( 'auto' );
|
||||
window.getComputedStyle = () => ( { width: '100px' } );
|
||||
expect( instance.getElementWidth( img ) ).toBe( 100 );
|
||||
} );
|
||||
|
||||
test( 'parseSrcSet sorts sources in descending order', () => {
|
||||
const srcset = 'img-200.jpg 200w, img-400.jpg 400w, img-300.jpg 300w';
|
||||
const sources = instance.parseSrcSet( srcset );
|
||||
expect( sources[ 0 ].value ).toBe( 400 );
|
||||
expect( sources[ 1 ].value ).toBe( 300 );
|
||||
expect( sources[ 2 ].value ).toBe( 200 );
|
||||
} );
|
||||
|
||||
test( 'parseSrcSet parses retina descriptors correctly', () => {
|
||||
const srcset = 'img-1x.jpg 1x, img-2x.jpg 2x, img-400.jpg 400w';
|
||||
const sources = instance.parseSrcSet( srcset );
|
||||
|
||||
// Should parse the 'x' descriptors as floats and unit as 'x'
|
||||
expect( sources.find( ( s ) => s.unit === 'x' && s.value === 2 ).src ).toBe( 'img-2x.jpg' );
|
||||
expect( sources.find( ( s ) => s.unit === 'x' && s.value === 1 ).src ).toBe( 'img-1x.jpg' );
|
||||
// Should also parse the 'w' descriptor
|
||||
expect( sources.find( ( s ) => s.unit === 'w' && s.value === 400 ).src ).toBe( 'img-400.jpg' );
|
||||
} );
|
||||
|
||||
test.each( [
|
||||
[
|
||||
'Not a thumbnail',
|
||||
'https://example.com/image.jpg',
|
||||
[
|
||||
{ value: 500, src: 'https://example.com/image-500x500.jpg' },
|
||||
{ value: 300, src: 'https://example.com/image-300x300.jpg' },
|
||||
{ value: 200, src: 'https://example.com/image-200x200.jpg' },
|
||||
],
|
||||
400,
|
||||
'https://example.com/image.jpg',
|
||||
],
|
||||
[
|
||||
'Is a thumbnail but no larger source',
|
||||
'https://example.com/image.jpg',
|
||||
[
|
||||
{ value: 300, src: 'https://example.com/image-300x300.jpg' },
|
||||
{ value: 200, src: 'https://example.com/image-200x200.jpg' },
|
||||
],
|
||||
400,
|
||||
'https://example.com/image.jpg',
|
||||
],
|
||||
[
|
||||
'Is a thumbnail and larger source exists',
|
||||
'https://example.com/image-400x400.jpg',
|
||||
[
|
||||
{ value: 500, src: 'https://example.com/image-500x500.jpg' },
|
||||
{ value: 300, src: 'https://example.com/image-300x300.jpg' },
|
||||
{ value: 200, src: 'https://example.com/image-200x200.jpg' },
|
||||
],
|
||||
400,
|
||||
'https://example.com/image-500x500.jpg',
|
||||
]
|
||||
] )(
|
||||
'getBaseImageSrcForResize %s',
|
||||
( desc, src, sortedSources, resizeWidth, expected ) => {
|
||||
expect( instance.getBaseImageSrcForResize( src, sortedSources, resizeWidth ) ).toBe( expected );
|
||||
}
|
||||
);
|
||||
|
||||
test( 'updateElementSrcset sets attribute only if changed', () => {
|
||||
const img = document.createElement( 'img' );
|
||||
const originalSrcset = 'img-300.jpg 300w, img-600.jpg 600w';
|
||||
const newSrcset = 'img-300.jpg 300w, img-600.jpg 600w, img-900.jpg 900w';
|
||||
|
||||
// Should set attribute because newSrcset !== originalSrcset
|
||||
instance.updateElementSrcset( img, originalSrcset, newSrcset );
|
||||
expect( img.getAttribute( 'data-srcset' ) ).toBe( newSrcset );
|
||||
|
||||
// Should NOT set attribute because newSrcset === originalSrcset
|
||||
img.removeAttribute( 'data-srcset' );
|
||||
instance.updateElementSrcset( img, originalSrcset, originalSrcset );
|
||||
expect( img.getAttribute( 'data-srcset' ) ).toBe( null );
|
||||
} );
|
||||
|
||||
test( 'parseSrcSet handles sources with equal values and sorts descending', () => {
|
||||
const srcset = 'img-200.jpg 200w, img-400.jpg 400w, img-400b.jpg 400w, img-300.jpg 300w';
|
||||
const sources = instance.parseSrcSet( srcset );
|
||||
|
||||
// Should be sorted descending, and equal values retain their relative order
|
||||
expect( sources[ 0 ].value ).toBe( 400 );
|
||||
expect( sources[ 1 ].value ).toBe( 400 );
|
||||
expect( sources[ 2 ].value ).toBe( 300 );
|
||||
expect( sources[ 3 ].value ).toBe( 200 );
|
||||
|
||||
// The two 400w sources should both be present and in the order they appeared in the srcset
|
||||
expect( sources[ 0 ].src ).toBe( 'img-400.jpg' );
|
||||
expect( sources[ 1 ].src ).toBe( 'img-400b.jpg' );
|
||||
} );
|
||||
} );
|
||||
@@ -0,0 +1,168 @@
|
||||
import { describe, expect, test, it } from '@jest/globals';
|
||||
import { LCPDetector, SmushLCPDetector } from '../frontend/detector';
|
||||
|
||||
describe( 'background data from property value', () => {
|
||||
const dataSet = [
|
||||
[
|
||||
// background-image: url
|
||||
"url('http://localhost/wp-content/uploads/2024/08/image1.jpeg')",
|
||||
'background-image',
|
||||
[
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg'
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: relative url
|
||||
"url('/wp-content/uploads/2024/08/image1.jpeg')",
|
||||
'background-image',
|
||||
[
|
||||
'/wp-content/uploads/2024/08/image1.jpeg'
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set
|
||||
'image-set(' +
|
||||
"'http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg' 1x, " +
|
||||
"'http://localhost/wp-content/uploads/2024/08/image1.jpeg' 2x" +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set with relative URL.
|
||||
'image-set(' +
|
||||
"'/wp-content/uploads/2024/08/image1-768x437.jpeg' 1x, " +
|
||||
"'/wp-content/uploads/2024/08/image1.jpeg' 2x" +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'/wp-content/uploads/2024/08/image1-768x437.jpeg',
|
||||
'/wp-content/uploads/2024/08/image1.jpeg',
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set with url
|
||||
'image-set(' +
|
||||
"url('http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg') 1x, " +
|
||||
"url('http://localhost/wp-content/uploads/2024/08/image1.jpeg') 2x" +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set with url and relative URL
|
||||
'image-set(' +
|
||||
"url('/wp-content/uploads/2024/08/image1-768x437.jpeg') 1x, " +
|
||||
"url('/wp-content/uploads/2024/08/image1.jpeg') 2x" +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'/wp-content/uploads/2024/08/image1-768x437.jpeg',
|
||||
'/wp-content/uploads/2024/08/image1.jpeg',
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set query params
|
||||
'image-set(' +
|
||||
'http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg?hello=world 1x, ' +
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg?yellow=world 2x' +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'http://localhost/wp-content/uploads/2024/08/image1-768x437.jpeg?hello=world',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg?yellow=world',
|
||||
]
|
||||
],
|
||||
[
|
||||
// background-image: image-set query params with relative URL
|
||||
'image-set(' +
|
||||
'/wp-content/uploads/2024/08/image1-768x437.jpeg?hello=world 1x, ' +
|
||||
'/wp-content/uploads/2024/08/image1.jpeg?yellow=world 2x' +
|
||||
');',
|
||||
'background-image-set',
|
||||
[
|
||||
'/wp-content/uploads/2024/08/image1-768x437.jpeg?hello=world',
|
||||
'/wp-content/uploads/2024/08/image1.jpeg?yellow=world',
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
it.each( dataSet )( 'returns correct data for given property value', ( propertyValue, type, urls ) => {
|
||||
const lcpDetector = new SmushLCPDetector();
|
||||
lcpDetector.shouldUseRelativeImageURL = ! propertyValue.includes( 'http://localhost' );
|
||||
const backgroundDataForElement = lcpDetector.getBackgroundDataForPropertyValue( propertyValue );
|
||||
|
||||
expect( backgroundDataForElement ).toStrictEqual( {
|
||||
type,
|
||||
urls,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
|
||||
describe( 'shouldUseRelativeImageURL', () => {
|
||||
const dataSet = [
|
||||
[
|
||||
// Case: Element contains absolute URL in src attribute
|
||||
'<img src="http://localhost/wp-content/uploads/2024/08/image1.jpeg">',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
false,
|
||||
],
|
||||
[
|
||||
// Case: Element contains relative URL in src attribute
|
||||
'<img src="/wp-content/uploads/2024/08/image1.jpeg">',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
true,
|
||||
],
|
||||
[
|
||||
// Case: Element does not contain the URL
|
||||
'<img src="/wp-content/uploads/2024/08/other-image.jpeg">',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
false,
|
||||
],
|
||||
[
|
||||
// Case: Element contains absolute URL in background style
|
||||
'<div style="background-image: url(http://localhost/wp-content/uploads/2024/08/image1.jpeg);"></div>',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
false,
|
||||
],
|
||||
[
|
||||
// Case: Element contains relative URL in background style
|
||||
'<div style="background-image: url(/wp-content/uploads/2024/08/image1.jpeg);"></div>',
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
true,
|
||||
],
|
||||
[
|
||||
// Case: Element is null
|
||||
null,
|
||||
'http://localhost/wp-content/uploads/2024/08/image1.jpeg',
|
||||
false,
|
||||
],
|
||||
];
|
||||
|
||||
it.each( dataSet )(
|
||||
'returns %s when element is %s and absoluteImageUrl is %s',
|
||||
( elementHTML, absoluteImageUrl, expected ) => {
|
||||
const lcpDetector = new SmushLCPDetector();
|
||||
const element = elementHTML
|
||||
? document.createElement( 'div' )
|
||||
: null;
|
||||
|
||||
if ( element ) {
|
||||
element.innerHTML = elementHTML;
|
||||
}
|
||||
|
||||
const result = lcpDetector.shouldUseRelativeImageURL(
|
||||
element?.firstChild || element,
|
||||
absoluteImageUrl
|
||||
);
|
||||
|
||||
expect( result ).toBe( expected );
|
||||
}
|
||||
);
|
||||
} );
|
||||
@@ -0,0 +1,59 @@
|
||||
import '../scss/app.scss';
|
||||
|
||||
/**
|
||||
* Admin modules
|
||||
*/
|
||||
|
||||
const WP_Smush = WP_Smush || {};
|
||||
window.WP_Smush = WP_Smush;
|
||||
|
||||
/**
|
||||
* IE polyfill for includes.
|
||||
*
|
||||
* @since 3.1.0
|
||||
* @param {string} search
|
||||
* @param {number} start
|
||||
* @return {boolean} Returns true if searchString appears as a substring of the result of converting this
|
||||
* object to a String, at one or more positions that are
|
||||
* greater than or equal to position; otherwise, returns false.
|
||||
*/
|
||||
if ( ! String.prototype.includes ) {
|
||||
String.prototype.includes = function( search, start ) {
|
||||
if ( typeof start !== 'number' ) {
|
||||
start = 0;
|
||||
}
|
||||
|
||||
if ( start + search.length > this.length ) {
|
||||
return false;
|
||||
}
|
||||
return this.indexOf( search, start ) !== -1;
|
||||
};
|
||||
}
|
||||
|
||||
require( './modules/helpers' );
|
||||
require( './modules/admin' );
|
||||
require( './modules/admin-common' );
|
||||
require( './modules/bulk-smush' );
|
||||
require( './common/media-library-scanner' );
|
||||
require( './modules/media-library-scanner-on-bulk-smush' );
|
||||
require( './modules/media-library-scanner-on-dashboard' );
|
||||
require( './modules/onboarding' );
|
||||
require( './modules/onboarding-free' );
|
||||
require( './modules/directory-smush' );
|
||||
require( './smush/lazy-load' );
|
||||
require( './modules/bulk-restore' );
|
||||
require( './smush/settings' );
|
||||
require( './smush/product-analytics' );
|
||||
|
||||
/**
|
||||
* Notice scripts.
|
||||
*
|
||||
* Notices are used in the following functions:
|
||||
*
|
||||
* @used-by \Smush\Core\Modules\Smush::smush_updated()
|
||||
* @used-by \Smush\Core\Integrations\S3::3_support_required_notice()
|
||||
* @used-by \Smush\App\Abstract_Page::installation_notice()
|
||||
*
|
||||
* TODO: should this be moved out in a separate file like common.scss?
|
||||
*/
|
||||
require( './modules/notice' );
|
||||
@@ -0,0 +1,220 @@
|
||||
/* global WP_Smush */
|
||||
export const UpsellManger = ( () => {
|
||||
return {
|
||||
maybeShowCDNActivationNotice() {
|
||||
if ( ! wp_smush_msgs.smush_cdn_activation_notice ) {
|
||||
return;
|
||||
}
|
||||
WP_Smush.helpers.renderActivationCDNNotice( wp_smush_msgs.smush_cdn_activation_notice );
|
||||
},
|
||||
maybeShowCDNUpsellForPreSiteOnStart() {
|
||||
const upsellCdn = document.querySelector( '.wp-smush-upsell-cdn' );
|
||||
if ( upsellCdn ) {
|
||||
upsellCdn.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
maybeShowCDNUpsellForPreSiteOnCompleted() {
|
||||
const upsellCdn = document.querySelector( '.wp-smush-upsell-cdn' );
|
||||
if ( upsellCdn ) {
|
||||
upsellCdn.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
};
|
||||
} )();
|
||||
export const GlobalStats = ( () => {
|
||||
const $ = document.querySelector.bind( document );
|
||||
const summarySmush = $( '.sui-summary-smush-metabox' );
|
||||
if ( ! summarySmush ) {
|
||||
return {};
|
||||
}
|
||||
// Cache initial stats.
|
||||
let boStats = window.wp_smushit_data.bo_stats;
|
||||
let globalStats = {
|
||||
count_images: 0,
|
||||
count_total: 0,
|
||||
count_resize: 0,
|
||||
count_skipped: 0,
|
||||
count_smushed: 0,
|
||||
savings_bytes: 0,
|
||||
savings_resize: 0,
|
||||
size_after: 0,
|
||||
size_before: 0,
|
||||
savings_percent: 0,
|
||||
percent_grade: 'sui-grade-dismissed',
|
||||
percent_metric: 0,
|
||||
percent_optimized: 0,
|
||||
remaining_count: 0,
|
||||
human_bytes: '',
|
||||
savings_conversion_human: '',
|
||||
savings_conversion: 0,
|
||||
};
|
||||
|
||||
const imageScore = $( '#smush-image-score' );
|
||||
const logBulk = $( '.smush-final-log .smush-bulk-errors' );
|
||||
const bulkSmushCountContent = $( '#wp-smush-bulk-content' );
|
||||
let allErrors = {};
|
||||
|
||||
const generateGlobalStatsFromSmushData = ( smushScriptData ) => {
|
||||
window.wp_smushit_data = Object.assign( window.wp_smushit_data, smushScriptData || {} );
|
||||
globalStats = Object.keys( globalStats ).reduce( function( newStats, key ) {
|
||||
if ( key in window.wp_smushit_data ) {
|
||||
newStats[ key ] = window.wp_smushit_data[ key ];
|
||||
}
|
||||
return newStats;
|
||||
}, {} );
|
||||
}
|
||||
|
||||
generateGlobalStatsFromSmushData( window.wp_smushit_data );
|
||||
|
||||
return {
|
||||
isChangedStats( newBoStats ) {
|
||||
const primaryKeys = [ 'total_items', 'processed_items', 'failed_items', 'is_cancelled', 'is_completed', 'is_dead' ];
|
||||
return primaryKeys.some( ( key ) => {
|
||||
return newBoStats[ key ] !== boStats[ key ];
|
||||
} );
|
||||
},
|
||||
setBoStats( newBoStats ) {
|
||||
boStats = Object.assign( boStats, newBoStats || {} );
|
||||
return this;
|
||||
},
|
||||
getBoStats() {
|
||||
return boStats;
|
||||
},
|
||||
setGlobalStats( newGlobalStats ) {
|
||||
globalStats = Object.assign( globalStats, newGlobalStats || {} );
|
||||
return this;
|
||||
},
|
||||
getGlobalStats() {
|
||||
return globalStats;
|
||||
},
|
||||
/**
|
||||
* Circle progress bar.
|
||||
*/
|
||||
renderScoreProgress() {
|
||||
imageScore.className = imageScore.className.replace( /(^|\s)sui-grade-\S+/g, '' );
|
||||
imageScore.classList.add( globalStats.percent_grade );
|
||||
imageScore.dataset.score = globalStats.percent_optimized;
|
||||
imageScore.querySelector( '.sui-circle-score-label' ).innerHTML = globalStats.percent_optimized;
|
||||
|
||||
imageScore
|
||||
.querySelector( 'circle:last-child' )
|
||||
.setAttribute( 'style', '--metric-array:' + ( 2.63893782902 * globalStats.percent_metric ) + ' ' + ( 263.893782902 - globalStats.percent_metric ) );
|
||||
},
|
||||
/**
|
||||
* Summary detail - center meta box.
|
||||
*/
|
||||
renderSummaryDetail() {
|
||||
this.renderTotalStats();
|
||||
this.renderResizedStats();
|
||||
this.renderConversionSavings();
|
||||
},
|
||||
renderTotalStats() {
|
||||
// Total savings.
|
||||
summarySmush.querySelector( '.sui-summary-large.wp-smush-stats-human' ).innerHTML = globalStats.human_bytes;
|
||||
// Update the savings percent.
|
||||
summarySmush.querySelector( '.wp-smush-savings .wp-smush-stats-percent' ).innerHTML = globalStats.savings_percent;
|
||||
// To total smushed images files.
|
||||
summarySmush.querySelector( '.wp-smush-count-total .wp-smush-total-optimised' ).innerHTML = globalStats.count_images;
|
||||
},
|
||||
renderResizedStats() {
|
||||
const resizeCountElement = summarySmush.querySelector( '.wp-smush-count-resize-total' );
|
||||
if ( ! resizeCountElement ) {
|
||||
return;
|
||||
}
|
||||
if ( globalStats.count_resize > 0 ) {
|
||||
resizeCountElement.classList.remove( 'sui-hidden' );
|
||||
} else {
|
||||
resizeCountElement.classList.add( 'sui-hidden' );
|
||||
}
|
||||
resizeCountElement.querySelector( '.wp-smush-total-optimised' ).innerHTML = globalStats.count_resize;
|
||||
},
|
||||
renderConversionSavings() {
|
||||
// PNG2JPG Savings.
|
||||
const conversionSavingsElement = summarySmush.querySelector( '.smush-conversion-savings .wp-smush-stats' );
|
||||
if ( ! conversionSavingsElement ) {
|
||||
return;
|
||||
}
|
||||
conversionSavingsElement.innerHTML = globalStats.savings_conversion_human;
|
||||
if ( globalStats.savings_conversion > 0 ) {
|
||||
conversionSavingsElement.parentElement.classList.remove( 'sui-hidden' );
|
||||
} else {
|
||||
conversionSavingsElement.parentElement.classList.add( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
renderBoxSummary() {
|
||||
// Circle core progress.
|
||||
this.renderScoreProgress();
|
||||
// Summary detail.
|
||||
this.renderSummaryDetail();
|
||||
},
|
||||
setErrors( newErrors ) {
|
||||
allErrors = newErrors || {};
|
||||
},
|
||||
getErrors() {
|
||||
return allErrors;
|
||||
},
|
||||
renderErrors() {
|
||||
if ( ! Object.keys( allErrors ).length || ! boStats.is_completed ) {
|
||||
return;
|
||||
}
|
||||
const errors = [];
|
||||
const errorKeys = Object.keys( allErrors );
|
||||
// Cache error code to avoid double upsell notice.
|
||||
let showAnimatedUpsell = false;
|
||||
errorKeys.map( ( image_id, index ) => {
|
||||
const upsellErrorCode = allErrors[ image_id ].error_code;
|
||||
if ( index < 5 && 'animated' === upsellErrorCode ) {
|
||||
showAnimatedUpsell = true;
|
||||
}
|
||||
errors.push( WP_Smush.helpers.prepareBulkSmushErrorRow(
|
||||
allErrors[ image_id ].error_message,
|
||||
allErrors[ image_id ].file_name,
|
||||
allErrors[ image_id ].thumbnail,
|
||||
image_id,
|
||||
'media',
|
||||
allErrors[ image_id ].error_code,
|
||||
) );
|
||||
}
|
||||
);
|
||||
logBulk.innerHTML = errors.join( '' );
|
||||
logBulk.parentElement.classList.remove( 'sui-hidden' );
|
||||
logBulk.parentElement.style.display = null;
|
||||
// Show view all.
|
||||
if ( errorKeys.length > 1 ) {
|
||||
$( '.smush-bulk-errors-actions' ).classList.remove( 'sui-hidden' );
|
||||
}
|
||||
|
||||
// Show animated upsell CDN if user disabled CDN and found an animated error in first 5 errors.
|
||||
if ( showAnimatedUpsell ) {
|
||||
UpsellManger.maybeShowCDNActivationNotice();
|
||||
}
|
||||
},
|
||||
resetAndHideBulkErrors() {
|
||||
if ( ! logBulk ) {
|
||||
return;
|
||||
}
|
||||
this.resetErrors();
|
||||
logBulk.parentElement.classList.add( 'sui-hidden' );
|
||||
logBulk.innerHTML = '';
|
||||
},
|
||||
resetErrors() {
|
||||
allErrors = {};
|
||||
},
|
||||
renderStats() {
|
||||
// Render Smush box summary.
|
||||
this.renderBoxSummary();
|
||||
// Render Errors.
|
||||
this.renderErrors();
|
||||
},
|
||||
maybeUpdateBulkSmushCountContent( newContent ) {
|
||||
if ( newContent && bulkSmushCountContent ) {
|
||||
bulkSmushCountContent.innerHTML = newContent;
|
||||
}
|
||||
},
|
||||
updateGlobalStatsFromSmushScriptData( smushScriptData ) {
|
||||
this.maybeUpdateBulkSmushCountContent( smushScriptData?.content );
|
||||
generateGlobalStatsFromSmushData( smushScriptData );
|
||||
return this;
|
||||
},
|
||||
};
|
||||
} )();
|
||||
@@ -0,0 +1,294 @@
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* Abstract Media Library Scanner.
|
||||
*
|
||||
*/
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import { scanProgressBar } from './progressbar';
|
||||
import { GlobalStats } from './globalStats';
|
||||
import loopbackTester from '../loopback-tester';
|
||||
const { __ } = wp.i18n;
|
||||
export default class MediaLibraryScanner {
|
||||
constructor() {
|
||||
this.autoSyncDuration = 1500;
|
||||
this.progressTimeoutId = 0;
|
||||
this.scanProgress = scanProgressBar( this.autoSyncDuration );
|
||||
}
|
||||
|
||||
startScan( optimizeOnScanCompleted = false ) {
|
||||
this.onStart();
|
||||
const processType = optimizeOnScanCompleted ? 'smush' : 'scan';
|
||||
loopbackTester.performTest().then( ( res ) => {
|
||||
const isLoopbackHealthy = res?.loopback;
|
||||
if ( isLoopbackHealthy ) {
|
||||
Fetcher.scanMediaLibrary.start( optimizeOnScanCompleted ).then( ( response ) => {
|
||||
if ( ! response?.success ) {
|
||||
this.showFailureNotice( response );
|
||||
this.onStartFailure( response );
|
||||
return;
|
||||
}
|
||||
this.showProgressBar().autoSyncStatus();
|
||||
} );
|
||||
} else {
|
||||
this.showLoopbackErrorModal( processType );
|
||||
this.onStartFailure( res );
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
console.error( 'Error:', error );
|
||||
this.showLoopbackErrorModal( processType );
|
||||
this.onStartFailure( error );
|
||||
} );
|
||||
}
|
||||
|
||||
onStart() {
|
||||
// Do nothing at the moment.
|
||||
}
|
||||
|
||||
onStartFailure( response ) {
|
||||
// Do nothing at the moment.
|
||||
}
|
||||
|
||||
showFailureNotice( response ) {
|
||||
WP_Smush.helpers.showNotice( response, {
|
||||
showdismiss: true,
|
||||
autoclose: false,
|
||||
} );
|
||||
}
|
||||
|
||||
showLoopbackErrorModal( processType ) {
|
||||
const loopbackErrorModal = document.getElementById( 'smush-loopback-error-dialog' );
|
||||
if ( ! loopbackErrorModal || ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Cache current process type.
|
||||
loopbackErrorModal.dataset.processType = processType || 'scan';
|
||||
|
||||
WP_Smush.helpers.showModal( loopbackErrorModal.id );
|
||||
}
|
||||
|
||||
showProgressBar() {
|
||||
this.onShowProgressBar();
|
||||
this.scanProgress.reset().setOnCancelCallback( this.showStopScanningModal.bind( this ) ).open();
|
||||
return this;
|
||||
}
|
||||
|
||||
onShowProgressBar() {
|
||||
// Do nothing at the moment.
|
||||
}
|
||||
|
||||
showStopScanningModal() {
|
||||
if ( ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.onShowStopScanningModal();
|
||||
|
||||
window.SUI.openModal(
|
||||
'smush-stop-scanning-dialog',
|
||||
'wpbody-content',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
onShowStopScanningModal() {
|
||||
this.registerCancelProcessEvent();
|
||||
}
|
||||
|
||||
registerCancelProcessEvent() {
|
||||
const stopScanButton = document.querySelector( '.smush-stop-scanning-dialog-button' );
|
||||
if ( ! stopScanButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
stopScanButton.addEventListener( 'click', this.cancelProgress.bind( this ), { once: true } );
|
||||
}
|
||||
|
||||
closeStopScanningModal() {
|
||||
if ( ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
const stopScanningElement = document.querySelector( '#smush-stop-scanning-dialog' );
|
||||
const isModalClosed = ( ! stopScanningElement ) || ! stopScanningElement.classList.contains( 'sui-content-fade-in' );
|
||||
if ( isModalClosed ) {
|
||||
return;
|
||||
}
|
||||
window.SUI.closeModal( 'smush-stop-scanning-dialog' );
|
||||
}
|
||||
|
||||
closeProgressBar() {
|
||||
this.onCloseProgressBar();
|
||||
this.scanProgress.close();
|
||||
}
|
||||
|
||||
onCloseProgressBar() {
|
||||
// Do nothing at the moment.
|
||||
}
|
||||
|
||||
updateProgress( stats ) {
|
||||
const totalItems = this.getTotalItems( stats );
|
||||
const processedItems = this.getProcessedItems( stats );
|
||||
|
||||
return this.scanProgress.update( processedItems, totalItems );
|
||||
}
|
||||
|
||||
getProcessedItems( stats ) {
|
||||
return stats?.processed_items || 0;
|
||||
}
|
||||
|
||||
getTotalItems( stats ) {
|
||||
return stats?.total_items || 0;
|
||||
}
|
||||
|
||||
cancelProgress() {
|
||||
this.scanProgress.setCancelButtonOnCancelling();
|
||||
return Fetcher.scanMediaLibrary.cancel().then( ( response ) => {
|
||||
if ( ! response?.success ) {
|
||||
this.onCancelFailure( response );
|
||||
return;
|
||||
}
|
||||
this.onCancelled( response.data );
|
||||
} );
|
||||
}
|
||||
|
||||
onCancelFailure( response ) {
|
||||
WP_Smush.helpers.showNotice( response, {
|
||||
showdismiss: true,
|
||||
autoclose: false,
|
||||
} );
|
||||
this.scanProgress.resetCancelButtonOnFailure();
|
||||
}
|
||||
|
||||
onDead( stats ) {
|
||||
this.clearProgressTimeout();
|
||||
this.closeProgressBar();
|
||||
this.closeStopScanningModal();
|
||||
this.showRetryScanModal();
|
||||
}
|
||||
|
||||
showRetryScanModal() {
|
||||
const retryScanModalElement = document.getElementById( 'smush-retry-scan-notice' );
|
||||
if ( ! window.SUI || ! retryScanModalElement ) {
|
||||
return;
|
||||
}
|
||||
|
||||
retryScanModalElement.querySelector( '.smush-retry-scan-notice-button' ).addEventListener( 'click', ( e ) => {
|
||||
window.SUI.closeModal( 'smush-retry-scan-notice' );
|
||||
const recheckImagesBtn = document.querySelector( '.wp-smush-scan' );
|
||||
if ( ! recheckImagesBtn ) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
recheckImagesBtn.click();
|
||||
}, { once: true } );
|
||||
|
||||
window.SUI.openModal(
|
||||
'smush-retry-scan-notice',
|
||||
'wpbody-content',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
onCompleted( stats ) {
|
||||
this.onFinish( stats );
|
||||
}
|
||||
|
||||
onCancelled( stats ) {
|
||||
this.onFinish( stats );
|
||||
}
|
||||
|
||||
onFinish( stats ) {
|
||||
this.clearProgressTimeout();
|
||||
const globalStats = stats?.global_stats;
|
||||
this.updateGlobalStatsAndBulkContent( globalStats );
|
||||
this.closeProgressBar();
|
||||
this.closeStopScanningModal();
|
||||
}
|
||||
|
||||
clearProgressTimeout() {
|
||||
if ( this.progressTimeoutId ) {
|
||||
clearTimeout( this.progressTimeoutId );
|
||||
}
|
||||
}
|
||||
|
||||
updateGlobalStatsAndBulkContent( globalStats ) {
|
||||
if ( ! globalStats ) {
|
||||
return;
|
||||
}
|
||||
GlobalStats.updateGlobalStatsFromSmushScriptData( globalStats );
|
||||
GlobalStats.renderStats();
|
||||
}
|
||||
|
||||
getStatus() {
|
||||
return Fetcher.scanMediaLibrary.getScanStatus();
|
||||
}
|
||||
|
||||
autoSyncStatus() {
|
||||
const startTime = new Date().getTime();
|
||||
this.getStatus().then( ( response ) => {
|
||||
if ( ! response?.success ) {
|
||||
return;
|
||||
}
|
||||
const stats = response.data;
|
||||
|
||||
if ( stats.is_dead ) {
|
||||
this.onDead( response.data );
|
||||
return;
|
||||
}
|
||||
|
||||
this.beforeUpdateStatus( stats );
|
||||
|
||||
this.updateProgress( stats ).then( () => {
|
||||
this.scanProgress.increaseDurationToHaveChangeOnProgress( new Date().getTime() - startTime );
|
||||
|
||||
const isCompleted = stats?.is_completed;
|
||||
if ( isCompleted ) {
|
||||
this.onCompleted( stats );
|
||||
return;
|
||||
}
|
||||
const isCancelled = stats?.is_cancelled;
|
||||
if ( isCancelled ) {
|
||||
this.onCancelled( stats );
|
||||
return;
|
||||
}
|
||||
|
||||
this.progressTimeoutId = setTimeout( () => this.autoSyncStatus(), this.autoSyncDuration );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
beforeUpdateStatus() {
|
||||
// Do nothing at the moment.
|
||||
}
|
||||
|
||||
setInnerText( element, newText ) {
|
||||
if ( ! element ) {
|
||||
return;
|
||||
}
|
||||
element.dataset.originalText = element.dataset.originalText || element.innerText.trim();
|
||||
element.innerText = newText;
|
||||
}
|
||||
|
||||
revertInnerText( element ) {
|
||||
if ( ! element || ! element.dataset.originalText ) {
|
||||
return;
|
||||
}
|
||||
element.innerText = element.dataset.originalText.trim();
|
||||
}
|
||||
|
||||
hideAnElement( element ) {
|
||||
if ( element ) {
|
||||
element.classList.add( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
|
||||
showAnElement( element ) {
|
||||
if ( element ) {
|
||||
element.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,349 @@
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* SmushProgressBar
|
||||
* TODO: Update progressbar for free version.
|
||||
*
|
||||
* @param autoSyncDuration
|
||||
*/
|
||||
export const scanProgressBar = ( autoSyncDuration ) => {
|
||||
const { __, _n } = wp.i18n;
|
||||
const scanProgressBar = document.querySelector( '.wp-smush-scan-progress-bar-wrapper' );
|
||||
const percentElement = scanProgressBar.querySelector( '.wp-smush-progress-percent' );
|
||||
const progressElement = scanProgressBar.querySelector( '.wp-smush-progress-inner' );
|
||||
const remainingTimeElement = scanProgressBar.querySelector( '.wp-smush-remaining-time' );
|
||||
const cancelBtn = scanProgressBar.querySelector( '.wp-smush-cancel-scan-progress-btn' );
|
||||
const holdOnNoticeElement = scanProgressBar.querySelector( '.wp-smush-scan-hold-on-notice' );
|
||||
let onCancelCallback = () => {};
|
||||
let intervalProgressAnimation = 0;
|
||||
// It should be smaller than autoSyncDuration.
|
||||
const progressTransitionDuration = autoSyncDuration - 300;//1200
|
||||
scanProgressBar.style.setProperty( '--progress-transition-duration', progressTransitionDuration / 1000 + 's' );
|
||||
|
||||
let prevProcessedItems = window.wp_smushit_data?.media_library_scan?.processed_items || 0;
|
||||
const cacheProcessTimePerItem = [];
|
||||
let durationToHaveChangeOnProgress = autoSyncDuration;
|
||||
let timeLimitToShowNotice = 60000;// 60s.
|
||||
return {
|
||||
update( processedItems, totalItems ) {
|
||||
this.updateRemainingTime( processedItems, totalItems );
|
||||
|
||||
let width = ( totalItems && Math.floor( processedItems / totalItems * 100 ) ) || 0;
|
||||
width = Math.min( width, 100 );
|
||||
|
||||
let currentWidth = progressElement.style.width;
|
||||
currentWidth = ( currentWidth && currentWidth.replace( '%', '' ) ) || 0;
|
||||
progressElement.style.width = width + '%';
|
||||
|
||||
return this.animateProgressBar( currentWidth, width );
|
||||
},
|
||||
animateProgressBar( currentWidth, width ) {
|
||||
if ( intervalProgressAnimation ) {
|
||||
clearInterval( intervalProgressAnimation );
|
||||
}
|
||||
return new Promise( ( resolve ) => {
|
||||
const delayTime = progressTransitionDuration / ( width - currentWidth );
|
||||
intervalProgressAnimation = setInterval( () => {
|
||||
// Progress bar label.
|
||||
percentElement.innerHTML = currentWidth + '%';
|
||||
currentWidth++;
|
||||
if ( currentWidth > width ) {
|
||||
resolve();
|
||||
clearInterval( intervalProgressAnimation );
|
||||
}
|
||||
}, delayTime );
|
||||
} );
|
||||
},
|
||||
updateRemainingTime( processedItems, totalItems ) {
|
||||
if ( ! remainingTimeElement ) {
|
||||
return;
|
||||
}
|
||||
const processTimePerItem = this.calcProcessTimePerItem( processedItems ) || 500;
|
||||
const remainingTime = processTimePerItem * ( totalItems - processedItems );
|
||||
remainingTimeElement.innerText = this.formatTime( remainingTime );
|
||||
},
|
||||
calcProcessTimePerItem( processedItems ) {
|
||||
if ( ! processedItems ) {
|
||||
return;
|
||||
}
|
||||
prevProcessedItems = prevProcessedItems <= processedItems ? prevProcessedItems : 0;
|
||||
if ( prevProcessedItems != processedItems ) {
|
||||
const processTimePerItem = Math.floor( durationToHaveChangeOnProgress / ( processedItems - prevProcessedItems ) );
|
||||
|
||||
prevProcessedItems = processedItems;
|
||||
cacheProcessTimePerItem.push( processTimePerItem );
|
||||
this.resetDurationToHaveChangeOnProgress();
|
||||
} else {
|
||||
this.increaseDurationToHaveChangeOnProgress( autoSyncDuration );
|
||||
}
|
||||
|
||||
if ( ! cacheProcessTimePerItem.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
return cacheProcessTimePerItem.reduce(
|
||||
( accumulator, processTime ) => accumulator + processTime, 0
|
||||
) / cacheProcessTimePerItem.length;
|
||||
},
|
||||
increaseDurationToHaveChangeOnProgress( increaseTime ) {
|
||||
durationToHaveChangeOnProgress += increaseTime;
|
||||
if ( durationToHaveChangeOnProgress > timeLimitToShowNotice ) {
|
||||
this.showHoldOnNotice();
|
||||
}
|
||||
},
|
||||
showHoldOnNotice() {
|
||||
holdOnNoticeElement.classList.remove( 'sui-hidden' );
|
||||
timeLimitToShowNotice = 100000000;
|
||||
},
|
||||
resetHoldOnNoticeVisibility() {
|
||||
holdOnNoticeElement.classList.add( 'sui-hidden' );
|
||||
},
|
||||
resetDurationToHaveChangeOnProgress() {
|
||||
durationToHaveChangeOnProgress = autoSyncDuration;
|
||||
},
|
||||
formatTime( totalMilliSeconds ) {
|
||||
const totalSeconds = Math.floor( ( totalMilliSeconds + progressTransitionDuration ) / 1000 );
|
||||
const seconds = totalSeconds % 60;
|
||||
const minutes = Math.floor( totalSeconds / 60 );
|
||||
|
||||
let timeString = '';
|
||||
if ( minutes ) {
|
||||
timeString += minutes + ' ' + _n( 'minute', 'minutes', minutes, 'wp-smushit' );
|
||||
}
|
||||
|
||||
timeString += ' ' + seconds + ' ' + _n( 'second', 'seconds', seconds, 'wp-smushit' );
|
||||
|
||||
return timeString.trim();
|
||||
},
|
||||
reset() {
|
||||
progressElement.style.width = '0%';
|
||||
percentElement.innerHTML = '0%';
|
||||
|
||||
this.resetCancelButton();
|
||||
this.resetHoldOnNoticeVisibility();
|
||||
return this;
|
||||
},
|
||||
open() {
|
||||
cancelBtn.onclick = onCancelCallback;
|
||||
scanProgressBar.classList.remove( 'sui-hidden' );
|
||||
},
|
||||
close() {
|
||||
scanProgressBar.classList.add( 'sui-hidden' );
|
||||
this.reset();
|
||||
},
|
||||
setOnCancelCallback( callBack ) {
|
||||
if ( 'function' !== typeof callBack ) {
|
||||
return;
|
||||
}
|
||||
onCancelCallback = callBack;
|
||||
return this;
|
||||
},
|
||||
setCancelButtonLabel( textContent ) {
|
||||
cancelBtn.textContent = textContent;
|
||||
return this;
|
||||
},
|
||||
setCancelButtonOnCancelling() {
|
||||
this.setCancelButtonLabel( wp_smush_msgs.cancelling );
|
||||
this.setOnCancelCallback( () => false );
|
||||
cancelBtn.setAttribute( 'disabled', true );
|
||||
},
|
||||
resetCancelButton() {
|
||||
this.setOnCancelCallback( () => {} );
|
||||
this.resetCancelButtonLabel();
|
||||
cancelBtn.removeAttribute( 'disabled' );
|
||||
},
|
||||
resetCancelButtonLabel() {
|
||||
this.setCancelButtonLabel( __( 'Cancel Scan', 'wp-smushit' ) );
|
||||
},
|
||||
resetCancelButtonOnFailure() {
|
||||
this.resetCancelButtonLabel();
|
||||
cancelBtn.removeAttribute( 'disabled' );
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const SmushProgressBar = () => {
|
||||
'use strict';
|
||||
const progressBar = document.querySelector( '.wp-smush-bulk-progress-bar-wrapper' );
|
||||
if ( ! progressBar ) {
|
||||
return {
|
||||
isEmptyObject: true,
|
||||
};
|
||||
}
|
||||
const cancelBtn = progressBar.querySelector( '.wp-smush-cancel-btn' );
|
||||
const bulkSmushDescription = document.querySelector( '.wp-smush-bulk-wrapper' );
|
||||
const bulkRunningNotice = progressBar.querySelector( '#wp-smush-running-notice' );
|
||||
const bulkSmushAllDone = document.querySelector( '.wp-smush-all-done' );
|
||||
const stopBulkSmushModal = document.getElementById( 'smush-stop-bulk-smush-modal' );
|
||||
const holdOnNoticeElement = progressBar.querySelector( '.wp-smush-bulk-hold-on-notice' );
|
||||
let isStateHidden = false;
|
||||
let onCancelCallback = () => {};
|
||||
|
||||
return {
|
||||
/**
|
||||
* Update progress bar.
|
||||
*
|
||||
* @param {number} processedItems
|
||||
* @param {number} totalItems
|
||||
*/
|
||||
update( processedItems, totalItems ) {
|
||||
let width = totalItems && Math.floor( processedItems / totalItems * 100 ) || 0;
|
||||
width = Math.min( width, 100 );
|
||||
|
||||
// Progress bar label.
|
||||
progressBar.querySelector( '.wp-smush-images-percent' ).innerHTML = width + '%';
|
||||
// Progress bar.
|
||||
progressBar.querySelector( '.wp-smush-progress-inner' ).style.width = width + '%';
|
||||
|
||||
// Update processed/total.
|
||||
const processStateStats = progressBar.querySelector( '.sui-progress-state-text' );
|
||||
processStateStats.firstElementChild.innerHTML = processedItems;
|
||||
processStateStats.lastElementChild.innerHTML = totalItems;
|
||||
|
||||
return this;
|
||||
},
|
||||
close() {
|
||||
progressBar.classList.add( 'sui-hidden' );
|
||||
this.setCancelButtonLabel( window.wp_smush_msgs.cancel )
|
||||
.setOnCancelCallback( () => {} )
|
||||
.update( 0, 0 );
|
||||
this.resetOriginalNotice();
|
||||
this.closeStopBulkSmushModal();
|
||||
return this;
|
||||
},
|
||||
show() {
|
||||
// Show progress bar.
|
||||
progressBar.classList.remove( 'sui-hidden' );
|
||||
cancelBtn.onclick = this.showStopBulkSmushModal.bind( this );
|
||||
this.hideBulkSmushDescription();
|
||||
this.hideBulkSmushAllDone();
|
||||
this.hideRecheckImagesNotice();
|
||||
},
|
||||
showStopBulkSmushModal() {
|
||||
if ( ! stopBulkSmushModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const stopBulkSmushButton = stopBulkSmushModal.querySelector( '.smush-stop-bulk-smush-button' );
|
||||
stopBulkSmushButton.addEventListener( 'click', onCancelCallback, { once: true } );
|
||||
|
||||
// Displays the modal with the release's higlights if it exists.
|
||||
const modalId = stopBulkSmushModal.id,
|
||||
focusAfterClosed = 'wpbody-content',
|
||||
focusWhenOpen = undefined,
|
||||
hasOverlayMask = false,
|
||||
isCloseOnEsc = false,
|
||||
isAnimated = true;
|
||||
|
||||
window.SUI.openModal(
|
||||
modalId,
|
||||
focusAfterClosed,
|
||||
focusWhenOpen,
|
||||
hasOverlayMask,
|
||||
isCloseOnEsc,
|
||||
isAnimated
|
||||
);
|
||||
},
|
||||
closeStopBulkSmushModal() {
|
||||
if ( ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
const isModalClosed = ( ! stopBulkSmushModal ) || ! stopBulkSmushModal.classList.contains( 'sui-content-fade-in' );
|
||||
if ( isModalClosed ) {
|
||||
return;
|
||||
}
|
||||
window.SUI.closeModal( stopBulkSmushModal.id );
|
||||
},
|
||||
setCancelButtonLabel( textContent ) {
|
||||
cancelBtn.textContent = textContent;
|
||||
return this;
|
||||
},
|
||||
showBulkSmushDescription() {
|
||||
bulkSmushDescription.classList.remove( 'sui-hidden' );
|
||||
},
|
||||
hideBulkSmushDescription() {
|
||||
bulkSmushDescription.classList.add( 'sui-hidden' );
|
||||
},
|
||||
showBulkSmushAllDone() {
|
||||
bulkSmushAllDone.classList.remove( 'sui-hidden' );
|
||||
},
|
||||
hideBulkSmushAllDone() {
|
||||
bulkSmushAllDone.classList.add( 'sui-hidden' );
|
||||
},
|
||||
hideState() {
|
||||
if ( isStateHidden ) {
|
||||
return this;
|
||||
}
|
||||
isStateHidden = true;
|
||||
progressBar.querySelector( '.sui-progress-state' ).classList.add( 'sui-hidden' );
|
||||
return this;
|
||||
},
|
||||
showState() {
|
||||
if ( ! isStateHidden ) {
|
||||
return this;
|
||||
}
|
||||
isStateHidden = false;
|
||||
progressBar.querySelector( '.sui-progress-state' ).classList.remove( 'sui-hidden' );
|
||||
return this;
|
||||
},
|
||||
setNotice( inProcessNotice ) {
|
||||
const progressMessage = bulkRunningNotice.querySelector( '.sui-notice-message p' );
|
||||
this.cacheOriginalNotice( progressMessage );
|
||||
progressMessage.innerHTML = inProcessNotice;
|
||||
return this;
|
||||
},
|
||||
cacheOriginalNotice( progressMessage ) {
|
||||
if ( bulkRunningNotice.dataset.progressMessage ) {
|
||||
return;
|
||||
}
|
||||
bulkRunningNotice.dataset.progressMessage = progressMessage.innerHTML;
|
||||
},
|
||||
resetOriginalNotice() {
|
||||
if ( ! bulkRunningNotice.dataset.progressMessage ) {
|
||||
return;
|
||||
}
|
||||
const progressMessage = bulkRunningNotice.querySelector( '.sui-notice-message p' );
|
||||
progressMessage.innerHTML = bulkRunningNotice.dataset.progressMessage;
|
||||
},
|
||||
hideBulkProcessingNotice() {
|
||||
bulkRunningNotice.classList.add( 'sui-hidden' );
|
||||
return this;
|
||||
},
|
||||
showBulkProcessingNotice() {
|
||||
bulkRunningNotice.classList.remove( 'sui-hidden' );
|
||||
return this;
|
||||
},
|
||||
setCountUnitText( unitText ) {
|
||||
const progressUnit = progressBar.querySelector( '.sui-progress-state-unit' );
|
||||
progressUnit.innerHTML = unitText;
|
||||
},
|
||||
setOnCancelCallback( callBack ) {
|
||||
if ( 'function' !== typeof callBack ) {
|
||||
return;
|
||||
}
|
||||
onCancelCallback = callBack;
|
||||
return this;
|
||||
},
|
||||
disableExceedLimitMode() {
|
||||
progressBar.classList.remove( 'wp-smush-exceed-limit' );
|
||||
progressBar.querySelector( '#bulk-smush-resume-button' ).classList.add( 'sui-hidden' );
|
||||
},
|
||||
hideRecheckImagesNotice() {
|
||||
const recheckImagesNoticeElement = document.querySelector( '.wp-smush-recheck-images-notice-box' );
|
||||
if ( recheckImagesNoticeElement ) {
|
||||
recheckImagesNoticeElement.classList.add( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
showHoldOnNotice() {
|
||||
if ( holdOnNoticeElement ) {
|
||||
holdOnNoticeElement.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
hideHoldOnNotice() {
|
||||
if ( holdOnNoticeElement ) {
|
||||
holdOnNoticeElement.classList.add( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
export default new SmushProgressBar();
|
||||
@@ -0,0 +1,180 @@
|
||||
import unique from 'unique-selector';
|
||||
import getXPath from 'get-xpath';
|
||||
|
||||
export class SmushLCPDetector {
|
||||
onLCP(data) {
|
||||
const element = data?.entries[0]?.element;
|
||||
const imageUrl = data?.attribution?.url;
|
||||
if (!element || !imageUrl) {
|
||||
return;
|
||||
}
|
||||
|
||||
const selector = unique(element);
|
||||
const xpath = getXPath(element, {ignoreId: true});
|
||||
this.useRelativeImageURL = this.shouldUseRelativeImageURL( element, imageUrl );
|
||||
const body = {
|
||||
url: window.location.href,
|
||||
data: JSON.stringify({
|
||||
selector: selector,
|
||||
selector_xpath: xpath,
|
||||
selector_id: element?.id,
|
||||
selector_class: element?.className,
|
||||
image_url: this.useRelativeImageURL ? this.makeImageURLRelative( imageUrl ) : imageUrl,
|
||||
background_data: this.getBackgroundDataForElement( element ),
|
||||
} ),
|
||||
nonce: smush_detector.nonce,
|
||||
is_mobile: smush_detector.is_mobile,
|
||||
data_store: JSON.stringify(smush_detector.data_store),
|
||||
previous_data_version: smush_detector.previous_data_version,
|
||||
previous_data_hash: smush_detector.previous_data_hash,
|
||||
};
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', smush_detector.ajax_url + '?action=smush_handle_lcp_data', true);
|
||||
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
const urlEncodedData = Object.keys(body)
|
||||
.map(key => encodeURIComponent(key) + "=" + encodeURIComponent(body[key]))
|
||||
.join("&");
|
||||
xhr.send(urlEncodedData);
|
||||
}
|
||||
|
||||
shouldUseRelativeImageURL( element, absoluteImageUrl ) {
|
||||
if ( ! element?.outerHTML ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const outerHTML = element.outerHTML;
|
||||
const containsAbsoluteUrl = outerHTML.includes( absoluteImageUrl );
|
||||
|
||||
if ( containsAbsoluteUrl ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const relativeImageUrl = this.makeImageURLRelative( absoluteImageUrl );
|
||||
const containsRelativeUrl = outerHTML.includes( relativeImageUrl );
|
||||
|
||||
return containsRelativeUrl;
|
||||
}
|
||||
|
||||
makeImageURLRelative( imageUrl ) {
|
||||
try {
|
||||
const url = new URL( imageUrl, window.location.origin ); // Parse the URL
|
||||
if ( url.hostname === window.location.hostname ) {
|
||||
// Only make the URL relative if it belongs to the current host
|
||||
return url.pathname + url.search; // Keep the path and query string
|
||||
}
|
||||
} catch ( e ) {
|
||||
// If the URL is invalid or relative, return it as-is.
|
||||
}
|
||||
|
||||
return imageUrl; // Return the original URL if it doesn't belong to the host
|
||||
}
|
||||
|
||||
getBackgroundDataForElement(element) {
|
||||
const computedStyle = window.getComputedStyle(element, null);
|
||||
const backgroundProps = [
|
||||
computedStyle.getPropertyValue("background-image"),
|
||||
getComputedStyle(element, ":after").getPropertyValue("background-image"),
|
||||
getComputedStyle(element, ":before").getPropertyValue("background-image")
|
||||
].filter((prop) => prop !== "none");
|
||||
if (backgroundProps.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return this.getBackgroundDataForPropertyValue(backgroundProps[0]);
|
||||
}
|
||||
|
||||
getBackgroundDataForPropertyValue(fullBackgroundProp) {
|
||||
let type = "background-image";
|
||||
if (fullBackgroundProp.includes("image-set(")) {
|
||||
type = "background-image-set";
|
||||
}
|
||||
if (!fullBackgroundProp || fullBackgroundProp === "" || fullBackgroundProp.includes("data:image")) {
|
||||
return null;
|
||||
}
|
||||
// IMPORTANT: the following regex is a copy of the one in the PHP function Parser::get_image_urls. Remember to keep them synced.
|
||||
const cssBackgroundUrlRegex = /((?:https?:\/|\.+)?\/[^'",\s()]+\.(jpe?g|png|gif|webp|svg|avif)(?:\?[^\s'",?)]+)?)\b/ig;
|
||||
const matches = [ ...fullBackgroundProp.matchAll( cssBackgroundUrlRegex ) ];
|
||||
const backgroundSet = matches.map( ( match ) => {
|
||||
const imageURL = match[ 1 ].trim();
|
||||
|
||||
return this.useRelativeImageURL
|
||||
? this.makeImageURLRelative( imageURL )
|
||||
: imageURL;
|
||||
} );
|
||||
|
||||
if ( backgroundSet.length <= 0 ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
type: type,
|
||||
urls: backgroundSet,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
(function () {
|
||||
let lcpEntry = null;
|
||||
let finalized = false;
|
||||
const initialViewportBottom = window.innerHeight;
|
||||
const pageLoadStartedAtTop = document?.documentElement?.scrollTop === 0;
|
||||
|
||||
if (!pageLoadStartedAtTop || !('PerformanceObserver' in window)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const po = new PerformanceObserver((list) => {
|
||||
for (const entry of list.getEntries()) {
|
||||
if (isInInitialViewport(entry)) {
|
||||
lcpEntry = entry; // always keep the latest candidate
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
po.observe({type: 'largest-contentful-paint', buffered: true});
|
||||
} catch (e) {
|
||||
// not supported
|
||||
}
|
||||
|
||||
function finalizeLCP() {
|
||||
if (finalized) {
|
||||
return;
|
||||
}
|
||||
finalized = true;
|
||||
|
||||
if (lcpEntry) {
|
||||
const detector = new SmushLCPDetector();
|
||||
detector.onLCP({
|
||||
entries: [lcpEntry],
|
||||
attribution: {
|
||||
url: lcpEntry.url || '',
|
||||
element: lcpEntry.element || ''
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (po) {
|
||||
po.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
function isInInitialViewport(entry) {
|
||||
const el = entry && entry.element;
|
||||
if (!el) {
|
||||
return true;
|
||||
}
|
||||
const rect = el.getBoundingClientRect();
|
||||
const elementTop = rect.top + window.scrollY;
|
||||
return elementTop <= initialViewportBottom;
|
||||
}
|
||||
|
||||
// Finalize on first *trusted* user input
|
||||
['keydown', 'click', 'pointerdown', 'touchstart'].forEach((type) => {
|
||||
addEventListener(type, (event) => {
|
||||
if (event.isTrusted) {
|
||||
finalizeLCP();
|
||||
}
|
||||
}, {once: true, capture: true});
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,8 @@
|
||||
import restoreLazySizesConfig from './lazy-load/helper/break-lazysizes';
|
||||
import lazySizes from './lazy-load/helper/lazysizes';
|
||||
require( './lazy-load/lazy-load-background-images' );
|
||||
require( './lazy-load/lazy-load-video' );
|
||||
|
||||
lazySizes.init();
|
||||
|
||||
restoreLazySizesConfig();
|
||||
@@ -0,0 +1,637 @@
|
||||
import { isSmushLazySizesInstance } from './helper/lazysizes';
|
||||
|
||||
export const LAZY_BEFORE_SIZES = 'lazybeforesizes';
|
||||
export const SMUSH_BEFORE_SIZES = 'smush:beforeSizes';
|
||||
const SMUSH_CDN_DOMAIN = 'smushcdn.com';
|
||||
const ATTR_DATA_ORIGINAL_SIZES = 'data-original-sizes';
|
||||
const ATTR_DATA_SRCSET = 'data-srcset';
|
||||
const ATTR_DATA_SRC = 'data-src';
|
||||
const SUPPORTED_EXTENSIONS = [ 'gif', 'jpg', 'jpeg', 'png', 'webp' ];
|
||||
const SRCSET_WIDTH_DESCRIPTOR = 'w';
|
||||
const SRCSET_DENSITY_DESCRIPTOR = 'x';
|
||||
/**
|
||||
* Class representing lazy loading functionality with CDN support.
|
||||
*/
|
||||
export class AutoResizing {
|
||||
/**
|
||||
* Create a SmushLazyload instance.
|
||||
*
|
||||
* @param {Object} [options={}] - Auto resize options for the instance.
|
||||
* @param {number} [options.precision=0] - Allowed width variation (in pixels) for determining if resizing is necessary.
|
||||
* @param {boolean} [options.skipAutoWidth=false] - Whether to skip auto width resizing.
|
||||
*/
|
||||
constructor( { precision = 0, skipAutoWidth = false } = {} ) {
|
||||
this.precision = parseInt( precision, 10 );
|
||||
this.precision = isNaN( this.precision ) ? 0 : this.precision;
|
||||
this.skipAutoWidth = skipAutoWidth;
|
||||
|
||||
this.initEventListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize event listeners.
|
||||
*/
|
||||
initEventListeners() {
|
||||
document.addEventListener( LAZY_BEFORE_SIZES, ( e ) => {
|
||||
if ( ! isSmushLazySizesInstance( e.detail?.instance ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.maybeAutoResize( e );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto resize for CDN images.
|
||||
*
|
||||
* @param {Object} lazyEvent - Event object.
|
||||
* @return {void}
|
||||
*/
|
||||
maybeAutoResize( lazyEvent ) {
|
||||
const element = lazyEvent.target;
|
||||
let resizeWidth = lazyEvent.detail?.width;
|
||||
const isImage = 'IMG' === element?.nodeName;
|
||||
|
||||
// Exit early if the element is not an image or resizeWidth is missing.
|
||||
if ( ! isImage || ! resizeWidth ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isInitialRender = lazyEvent.detail?.dataAttr;
|
||||
|
||||
// Skip processing if it's not the initial render.
|
||||
if ( ! isInitialRender ) {
|
||||
if ( ! this.getOriginalSizesAttr( element ) ) {
|
||||
lazyEvent.preventDefault();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the element is eligible for resizing.
|
||||
if ( ! this.isElementEligibleForResizing( element ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle reverting to original sizes if necessary.
|
||||
if ( this.shouldRevertToOriginalSizes( element, resizeWidth ) ) {
|
||||
if ( this.revertToOriginalSizesIfNeeded( element ) ) {
|
||||
// Prevent lazySizes from resizing the image.
|
||||
lazyEvent.preventDefault();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const customEvent = this.triggerEvent( element, SMUSH_BEFORE_SIZES, {
|
||||
resizeWidth
|
||||
} );
|
||||
|
||||
if ( customEvent.defaultPrevented ) {
|
||||
// If the event is prevented, do not proceed with resizing and revert the sizes.
|
||||
if ( this.revertToOriginalSizesIfNeeded( element ) ) {
|
||||
// Prevent lazySizes from resizing the image.
|
||||
lazyEvent.preventDefault();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
resizeWidth = customEvent.detail?.resizeWidth || resizeWidth;
|
||||
|
||||
// Resize the image using CDN if applicable.
|
||||
const src = this.getDataSrc( element );
|
||||
if ( this.isFromSmushCDN( src ) ) {
|
||||
this.resizeImageWithCDN( element, resizeWidth );
|
||||
|
||||
if ( this.isChildOfPicture( element ) ) {
|
||||
this.resizeSourceElements( element.parentNode.querySelectorAll( 'source' ), resizeWidth );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decide whether Smush should apply auto-resize for this image.
|
||||
*
|
||||
* Rules:
|
||||
* 1. If wrapper is inline/inline-block and wrapper/image already equal resizeWidth, skip (prevents Divi shrink).
|
||||
* 2. Otherwise, allow.
|
||||
*
|
||||
* @param imageElement
|
||||
* @param resizeWidth
|
||||
*/
|
||||
/**
|
||||
* Decide whether Smush should apply auto-resize for this image.
|
||||
*
|
||||
* Rules:
|
||||
* 1. If wrapper is inline/inline-block and wrapper/image already equal resizeWidth, skip (prevents Divi shrink).
|
||||
* 2. Otherwise, allow.
|
||||
*
|
||||
* @param imageElement
|
||||
* @param resizeWidth
|
||||
*/
|
||||
shouldAutoResize( imageElement, resizeWidth ) {
|
||||
const wrapper = imageElement.parentNode;
|
||||
|
||||
if ( wrapper && this.isInlineElement( wrapper ) ) {
|
||||
if ( 'PICTURE' === wrapper.nodeName ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const wrapperWidth = wrapper.clientWidth;
|
||||
const imageWidth = imageElement.offsetWidth;
|
||||
const isWrapperAndImageSameWidth = resizeWidth === wrapperWidth && wrapperWidth === imageWidth;
|
||||
|
||||
if ( isWrapperAndImageSameWidth ) {
|
||||
// BAIL: doing a resize here risks shrinking the inline wrapper
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
isInlineElement( el ) {
|
||||
if ( ! el || el.nodeType !== 1 ) {
|
||||
return false;
|
||||
}
|
||||
const display = window.getComputedStyle( el ).display;
|
||||
return display === 'inline' || display === 'inline-block';
|
||||
}
|
||||
|
||||
isChildOfPicture( imageElement ) {
|
||||
return imageElement && 'PICTURE' === imageElement?.parentNode?.nodeName;
|
||||
}
|
||||
|
||||
resizeSourceElements( sourceElements, resizeWidth ) {
|
||||
if ( ! sourceElements || ! sourceElements?.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
sourceElements.forEach( ( sourceElement ) => this.resizeSourceElement( sourceElement, resizeWidth ) );
|
||||
}
|
||||
|
||||
resizeSourceElement( sourceElement, resizeWidth ) {
|
||||
const srcset = sourceElement.getAttribute( ATTR_DATA_SRCSET );
|
||||
if ( ! srcset ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const sortedSources = this.parseSrcSet( srcset );
|
||||
if ( ! sortedSources || ! sortedSources.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isNonResponsive = 1 === sortedSources.length && '' === sortedSources[ 0 ].unit;
|
||||
if ( isNonResponsive ) {
|
||||
this.resizeNonResponsiveSource( sourceElement, sortedSources[ 0 ].src, resizeWidth );
|
||||
return;
|
||||
}
|
||||
|
||||
const baseSourceSrc = this.getBaseSourceSrcForResize( sortedSources, resizeWidth );
|
||||
if ( ! this.isFromSmushCDN( baseSourceSrc ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.updateSrcsetForResize( sourceElement, srcset, baseSourceSrc, resizeWidth, sortedSources );
|
||||
}
|
||||
|
||||
resizeNonResponsiveSource(sourceElement, sourceSrc, resizeWidth ) {
|
||||
if ( ! this.isFromSmushCDN( sourceSrc ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! this.isSourceActive( sourceElement ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
let newSrcset = this.getResizedCDNURL( sourceSrc, resizeWidth );
|
||||
|
||||
// Add a new retina source to the srcset if no similar source exists for the retina width.
|
||||
const scale = this.getPixelRatio();
|
||||
if ( scale > 1 ) {
|
||||
const retinaWidth = Math.ceil( resizeWidth * scale );
|
||||
const retinaCDNURL = this.getResizedCDNURL( sourceSrc, retinaWidth );
|
||||
const newRetinaSourceString = retinaCDNURL + ' ' + retinaWidth + SRCSET_WIDTH_DESCRIPTOR;
|
||||
newSrcset += ` ${ resizeWidth }${ SRCSET_WIDTH_DESCRIPTOR }, ${ newRetinaSourceString }`;
|
||||
}
|
||||
|
||||
// Update the element's data-srcset attribute if the srcset has changed.
|
||||
this.updateElementSrcset( sourceElement, null, newSrcset );
|
||||
}
|
||||
|
||||
isSourceActive( sourceElement ) {
|
||||
const media = sourceElement.getAttribute( 'media' );
|
||||
if ( media && ! window?.matchMedia( media )?.matches ) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
getBaseSourceSrcForResize( sortedSources, resizeWidth ) {
|
||||
const largestSource = sortedSources[ 0 ];
|
||||
|
||||
if ( SRCSET_WIDTH_DESCRIPTOR !== largestSource.unit ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (
|
||||
! this.isThumbnail( largestSource.src ) ||
|
||||
largestSource.value >= resizeWidth
|
||||
) {
|
||||
return largestSource.src;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
isElementEligibleForResizing( element ) {
|
||||
const existOriginalSizes = this.getOriginalSizesAttr( element );
|
||||
const existSrc = this.getDataSrc( element );
|
||||
const existSrcSet = this.getDataSrcSet( element );
|
||||
/**
|
||||
* lazybeforesizes only fires for images with data-sizes="auto",
|
||||
* so skip checking it.
|
||||
*/
|
||||
return Boolean( existOriginalSizes && existSrc && existSrcSet );
|
||||
}
|
||||
|
||||
shouldRevertToOriginalSizes( element, resizeWidth ) {
|
||||
const imageWidth = this.getElementWidth( element );
|
||||
|
||||
// Skip resizing if width is 'auto' and skipping is enabled.
|
||||
if ( imageWidth === 'auto' ) {
|
||||
return this.shouldSkipAutoWidth();
|
||||
}
|
||||
|
||||
const originalSizes = this.getOriginalSizesAttr( element );
|
||||
const maxWidthFromSizes = this.getMaxWidthFromSizes( originalSizes );
|
||||
if ( maxWidthFromSizes && resizeWidth > maxWidthFromSizes && ! this.isChildOfPicture( element ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return ! this.shouldAutoResize( element, resizeWidth );
|
||||
}
|
||||
|
||||
triggerEvent( elem, name, detail = {}, bubbles = true, cancelable = true ) {
|
||||
const event = new CustomEvent( name, {
|
||||
detail,
|
||||
bubbles,
|
||||
cancelable,
|
||||
} );
|
||||
|
||||
elem.dispatchEvent( event );
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if auto width resizing should be skipped.
|
||||
*
|
||||
* @return {boolean} - True if auto width resizing should be skipped, false otherwise.
|
||||
*/
|
||||
shouldSkipAutoWidth() {
|
||||
return this.skipAutoWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize the image using the CDN to generate appropriate sizes for the target width.
|
||||
*
|
||||
* @param {HTMLElement} element - The image element to resize.
|
||||
* @param {number} resizeWidth - The target width for the image.
|
||||
*/
|
||||
resizeImageWithCDN( element, resizeWidth ) {
|
||||
const srcset = this.getDataSrcSet( element );
|
||||
const src = this.getDataSrc( element );
|
||||
|
||||
// Exit early if the srcset or src is missing.
|
||||
if ( ! srcset || ! src ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse the srcset once and reuse the parsed sources.
|
||||
const sortedSources = this.parseSrcSet( srcset );
|
||||
|
||||
//the src attribute can be a thumbnail, so we need to get the larger image url to resize from it.
|
||||
const baseImageSrc = this.getBaseImageSrcForResize( src, sortedSources, resizeWidth );
|
||||
|
||||
this.updateSrcsetForResize( element, srcset, baseImageSrc, resizeWidth, sortedSources );
|
||||
}
|
||||
|
||||
updateSrcsetForResize( element, srcset, baseImageSrc, resizeWidth, sources ) {
|
||||
// Update the srcset with the target width.
|
||||
let newSrcset = this.updateSrcsetWithTargetWidth( srcset, baseImageSrc, resizeWidth, sources );
|
||||
|
||||
// Update the srcset with retina-specific widths if applicable.
|
||||
newSrcset = this.updateSrcsetWithRetinaWidth( newSrcset, baseImageSrc, resizeWidth, sources );
|
||||
|
||||
// Update the element's data-srcset attribute if the srcset has changed.
|
||||
this.updateElementSrcset( element, srcset, newSrcset );
|
||||
}
|
||||
|
||||
getBaseImageSrcForResize( src, sortedSources, resizeWidth ) {
|
||||
if ( ! this.isThumbnail( src ) ) {
|
||||
return src;
|
||||
}
|
||||
|
||||
// Find the largest source that is larger than resizing width.
|
||||
const largerSource = sortedSources.find( ( source ) => {
|
||||
return source.value >= resizeWidth;
|
||||
} );
|
||||
|
||||
return largerSource ? largerSource.src : src;
|
||||
}
|
||||
|
||||
isThumbnail( src ) {
|
||||
// Find the largest source that is larger than the current src.
|
||||
const regex = new RegExp( `(-\\d+x\\d+)\\.(${ SUPPORTED_EXTENSIONS.join( '|' ) })(?:\\?.+)?$`, 'i' );
|
||||
|
||||
return regex.test( src );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the srcset with the target width if no similar source exists.
|
||||
*
|
||||
* @param {string} srcset - The current srcset string.
|
||||
* @param {string} src - The original source URL of the image.
|
||||
* @param {number} resizeWidth - The target width for the image.
|
||||
* @param {Array} sources - The parsed sources from the srcset.
|
||||
* @return {string} The updated srcset string.
|
||||
*/
|
||||
updateSrcsetWithTargetWidth( srcset, src, resizeWidth, sources ) {
|
||||
// Add a new source to the srcset if no similar source exists for the target width.
|
||||
if ( ! this.findSimilarSource( sources, resizeWidth ) ) {
|
||||
const resizedCDNURL = this.getResizedCDNURL( src, resizeWidth );
|
||||
return srcset + ', ' + resizedCDNURL + ' ' + resizeWidth + SRCSET_WIDTH_DESCRIPTOR;
|
||||
}
|
||||
|
||||
return srcset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the srcset with retina-specific widths if applicable.
|
||||
*
|
||||
* @param {string} srcset - The current srcset string.
|
||||
* @param {string} src - The original source URL of the image.
|
||||
* @param {number} resizeWidth - The target width for the image.
|
||||
* @param {Array} sources - The parsed sources from the srcset.
|
||||
* @return {string} The updated srcset string.
|
||||
*/
|
||||
updateSrcsetWithRetinaWidth( srcset, src, resizeWidth, sources ) {
|
||||
const scale = this.getPixelRatio();
|
||||
if ( scale <= 1 ) {
|
||||
return srcset;
|
||||
}
|
||||
|
||||
const retinaWidth = Math.ceil( resizeWidth * scale );
|
||||
const hasRetinaSource = this.findSimilarSource( sources, scale, SRCSET_DENSITY_DESCRIPTOR ) ||
|
||||
this.findSimilarSource( sources, retinaWidth, SRCSET_WIDTH_DESCRIPTOR );
|
||||
|
||||
if ( hasRetinaSource ) {
|
||||
return srcset;
|
||||
}
|
||||
|
||||
// Add a new retina source to the srcset if no similar source exists for the retina width.
|
||||
const retinaCDNURL = this.getResizedCDNURL( src, retinaWidth );
|
||||
const newRetinaSourceString = retinaCDNURL + ' ' + retinaWidth + SRCSET_WIDTH_DESCRIPTOR;
|
||||
|
||||
return srcset + ', ' + newRetinaSourceString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the element's data-srcset attribute if the srcset has changed.
|
||||
*
|
||||
* @param {HTMLElement} element - The image element to update.
|
||||
* @param {string} originalSrcset - The original srcset string.
|
||||
* @param {string} newSrcset - The updated srcset string.
|
||||
*/
|
||||
updateElementSrcset( element, originalSrcset, newSrcset ) {
|
||||
if ( newSrcset !== originalSrcset ) {
|
||||
element.setAttribute( 'data-srcset', newSrcset );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the device pixel ratio.
|
||||
*
|
||||
* @return {number} The device pixel ratio. Default is 1 if the property is not available.
|
||||
*/
|
||||
getPixelRatio() {
|
||||
return window.devicePixelRatio || 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds and returns the first source object that has a similar width to the target width.
|
||||
*
|
||||
* @param {Array} sources - An array of source objects to search through.
|
||||
* @param {number} resizeWidth - The target width to match against the source widths.
|
||||
* @param {string} [unit='w'] - The unit of measurement for the width (default is 'w').
|
||||
* @param {number} [precision=this.precision] - The allowed width variation (in pixels) used to determine if a source width matches the target width during resizing.
|
||||
* @return {Object|null} - The first source object that matches the criteria, or null if no match is found.
|
||||
*/
|
||||
findSimilarSource( sources, resizeWidth, unit = SRCSET_WIDTH_DESCRIPTOR, precision = this.precision ) {
|
||||
return sources.find( ( source ) => {
|
||||
return unit === source.unit && source.value >= resizeWidth &&
|
||||
this.isFuzzyMatch( source.value, resizeWidth, precision );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the resized image CDN URL.
|
||||
*
|
||||
* @param {string} src - The original source URL of the image.
|
||||
* @param {number} resizeWidth - The target width for the resized image.
|
||||
* @return {string|undefined} The resized image CDN URL, or undefined if resizing is not applicable.
|
||||
*/
|
||||
getResizedCDNURL( src, resizeWidth ) {
|
||||
const url = this.parseURL( src );
|
||||
if ( ! url ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams( url.search );
|
||||
searchParams.set( 'size', `${ resizeWidth }x0` );
|
||||
// Get the base URL (without search parameters).
|
||||
const baseUrl = url.origin + url.pathname;
|
||||
|
||||
return `${ baseUrl }?${ searchParams.toString() }`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the URL from the source string.
|
||||
*
|
||||
* @param {string} src - The source URL string.
|
||||
* @return {URL|null} The parsed URL object, or null if parsing fails.
|
||||
*/
|
||||
parseURL( src ) {
|
||||
try {
|
||||
return new URL( src );
|
||||
} catch ( error ) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract width, unit, and src from srcset.
|
||||
*
|
||||
* @param {string} srcset - The srcset string.
|
||||
* @return {Array} An array of objects source info.
|
||||
*/
|
||||
parseSrcSet( srcset ) {
|
||||
const sources = this.extractSourcesFromSrcSet( srcset );
|
||||
return this.sortSources( sources );
|
||||
}
|
||||
|
||||
extractSourcesFromSrcSet( srcset ) {
|
||||
return srcset.split( ',' ).map( ( item ) => {
|
||||
const [ src, descriptor ] = item.trim().split( /\s+/ );
|
||||
let value = 0;
|
||||
let unit = '';
|
||||
|
||||
if ( descriptor ) {
|
||||
if ( descriptor.endsWith( SRCSET_WIDTH_DESCRIPTOR ) ) {
|
||||
value = parseInt( descriptor, 10 );
|
||||
unit = SRCSET_WIDTH_DESCRIPTOR;
|
||||
} else if ( descriptor.endsWith( SRCSET_DENSITY_DESCRIPTOR ) ) {
|
||||
value = parseFloat( descriptor );
|
||||
unit = SRCSET_DENSITY_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
markup: item,
|
||||
src,
|
||||
value,
|
||||
unit,
|
||||
};
|
||||
} );
|
||||
}
|
||||
|
||||
sortSources( sources ) {
|
||||
sources.sort( ( a, b ) => {
|
||||
if ( a.value === b.value ) {
|
||||
return 0;
|
||||
}
|
||||
return a.value > b.value ? -1 : 1;
|
||||
} );
|
||||
return sources;
|
||||
}
|
||||
|
||||
/**
|
||||
* Revert to the original sizes attribute.
|
||||
*
|
||||
* @param {Object} element - Image element.
|
||||
* @return {boolean} True if the original sizes were reverted, false otherwise.
|
||||
*/
|
||||
revertToOriginalSizesIfNeeded( element ) {
|
||||
const originalSizes = this.getOriginalSizesAttr( element );
|
||||
if ( originalSizes ) {
|
||||
element.setAttribute( 'sizes', originalSizes );
|
||||
element.removeAttribute( ATTR_DATA_ORIGINAL_SIZES );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the image width.
|
||||
*
|
||||
* @param {Object} element - Image element.
|
||||
* @return {string|number} The image width.
|
||||
*/
|
||||
getElementWidth( element ) {
|
||||
/**
|
||||
* Check if the element has an inline width set to 'auto'.
|
||||
* Note: For external CSS, we couldn't cover it due to getComputedStyle just returning the parsed value.
|
||||
*/
|
||||
const inlineWidth = element.style?.width;
|
||||
if ( inlineWidth && 'auto' === inlineWidth.trim() ) {
|
||||
return 'auto';
|
||||
}
|
||||
|
||||
const widthStr = window.getComputedStyle( element ).width;
|
||||
const width = parseInt( widthStr, 10 );
|
||||
|
||||
return isNaN( width ) ? widthStr : width;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the content width from the original sizes attribute.
|
||||
*
|
||||
* @param {string} originalSizes - The original sizes attribute.
|
||||
* @return {number} The content width.
|
||||
*/
|
||||
getMaxWidthFromSizes( originalSizes ) {
|
||||
const regex = /\(max-width:\s*(\d+)px\)\s*100vw,\s*\1px/;
|
||||
const match = originalSizes.match( regex );
|
||||
|
||||
return match ? parseInt( match[ 1 ], 10 ) : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the original sizes attribute.
|
||||
*
|
||||
* @param {Object} element - Image element.
|
||||
* @return {string} The original sizes attribute.
|
||||
*/
|
||||
getOriginalSizesAttr( element ) {
|
||||
return element.getAttribute( ATTR_DATA_ORIGINAL_SIZES );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the srcset attribute.
|
||||
*
|
||||
* @param {Object} element - Image element.
|
||||
* @return {string} The srcset attribute.
|
||||
*/
|
||||
getDataSrcSet( element ) {
|
||||
return element.getAttribute( ATTR_DATA_SRCSET );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the src attribute.
|
||||
*
|
||||
* @param {Object} element - Image element.
|
||||
* @return {string} The src attribute.
|
||||
*/
|
||||
getDataSrc( element ) {
|
||||
return element.getAttribute( ATTR_DATA_SRC );
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the source is from the CDN.
|
||||
*
|
||||
* @param {string} src - The source URL.
|
||||
* @return {boolean} True if the source is from the CDN, false otherwise.
|
||||
*/
|
||||
isFromSmushCDN( src ) {
|
||||
return src && src.includes( SMUSH_CDN_DOMAIN );
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a fuzzy match between two numbers.
|
||||
*
|
||||
* @param {number} number1 - The first number.
|
||||
* @param {number} number2 - The second number.
|
||||
* @param {number} [precision=1] - The allowed variation. Default is 1.
|
||||
* @return {boolean} True if the numbers are close enough, false otherwise.
|
||||
*/
|
||||
isFuzzyMatch( number1, number2, precision = 1 ) {
|
||||
return Math.abs( number1 - number2 ) <= precision;
|
||||
}
|
||||
}
|
||||
( () => {
|
||||
'use strict';
|
||||
const isAutoResizingEnabled = window.smushLazyLoadOptions?.autoResizingEnabled;
|
||||
if ( ! isAutoResizingEnabled ) {
|
||||
return;
|
||||
}
|
||||
|
||||
let autoResizeOptions = window.smushLazyLoadOptions?.autoResizeOptions || {};
|
||||
autoResizeOptions = Object.assign(
|
||||
{
|
||||
precision: 5, //5px.
|
||||
skipAutoWidth: true, // Whether to skip the image has 'auto' width.
|
||||
},
|
||||
autoResizeOptions
|
||||
);
|
||||
new AutoResizing( autoResizeOptions );
|
||||
} )();
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* @see https://github.com/aFarkas/lazysizes/issues/643#issuecomment-486168297
|
||||
* Or https://github.com/aFarkas/lazysizes/issues/647#issuecomment-487724519
|
||||
*/
|
||||
const originalLazySizesConfig = window.lazySizesConfig || null;
|
||||
if ( originalLazySizesConfig ) {
|
||||
delete window.lazySizesConfig;
|
||||
}
|
||||
|
||||
export default () => {
|
||||
// Restore the original lazySizesConfig if it was set before.
|
||||
if ( originalLazySizesConfig ) {
|
||||
window.lazySizesConfig = originalLazySizesConfig;
|
||||
} else if ( 'lazySizesConfig' in window ) {
|
||||
delete window.lazySizesConfig;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,15 @@
|
||||
import lazySizes from 'lazysizes';
|
||||
|
||||
/*
|
||||
* TODO: Change the lazyClass name to be more specific to avoid conflicts with other plugins
|
||||
* in the case that they are using the same default class name.
|
||||
* @see https://github.com/aFarkas/lazysizes/issues/643#issuecomment-486168297
|
||||
* or https://github.com/aFarkas/lazysizes/issues/647#issuecomment-487724519
|
||||
*/
|
||||
|
||||
export const isSmushLazySizesInstance = ( instance ) => {
|
||||
return instance === lazySizes ||
|
||||
( JSON.stringify( instance?.cfg || {} ) === JSON.stringify( lazySizes?.cfg || {} ) );
|
||||
};
|
||||
|
||||
export default lazySizes;
|
||||
@@ -0,0 +1,34 @@
|
||||
import { isSmushLazySizesInstance } from './helper/lazysizes';
|
||||
|
||||
( () => {
|
||||
'use strict';
|
||||
// Lazyload for background images.
|
||||
const lazyloadBackground = ( element ) => {
|
||||
const backgroundValue = element.getAttribute( 'data-bg-image' ) || element.getAttribute( 'data-bg' );
|
||||
const cssProperty = element.hasAttribute( 'data-bg-image' ) ? 'background-image' : 'background';
|
||||
|
||||
if ( backgroundValue ) {
|
||||
const currentStyle = element.getAttribute( 'style' ) || '';
|
||||
const newBackgroundCSS = `${ cssProperty }: ${ backgroundValue };`;
|
||||
const backgroundRegex = new RegExp( `${ cssProperty }\\s*:\\s*[^;]+;?` );
|
||||
|
||||
let updatedStyle;
|
||||
if ( backgroundRegex.test( currentStyle ) ) {
|
||||
updatedStyle = currentStyle.replace( backgroundRegex, newBackgroundCSS );
|
||||
} else {
|
||||
updatedStyle = currentStyle.length > 0 ? currentStyle.replace( /;$/g, '' ) + ';' + newBackgroundCSS : newBackgroundCSS;
|
||||
}
|
||||
|
||||
element.setAttribute( 'style', updatedStyle.trim() );
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener( 'lazybeforeunveil', function( e ) {
|
||||
if ( ! isSmushLazySizesInstance( e?.detail?.instance ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Lazy background image.
|
||||
lazyloadBackground( e.target );
|
||||
} );
|
||||
} )();
|
||||
@@ -0,0 +1,261 @@
|
||||
import { isSmushLazySizesInstance } from './helper/lazysizes';
|
||||
|
||||
( () => {
|
||||
'use strict';
|
||||
// Constants
|
||||
const VIDEO_WRAPPER_CLASS = 'smush-lazyload-video';
|
||||
const LAZY_LOADED_CLASS = 'smush-lazyloaded-video';
|
||||
const AUTO_PLAY_CLASS = 'smush-lazyload-autoplay';
|
||||
const PLAY_BUTTON_CLASS = 'smush-play-btn';
|
||||
const DEFAULT_ALLOW_ATTR = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';
|
||||
const USER_INTERACTION_EVENT = 'ontouchstart' in window ? 'touchstart' : 'pointerdown';
|
||||
const FALLBACK_VIDEO_RENDER_DELAY = Number( window?.smush_video_render_delay ) || 0;
|
||||
|
||||
/**
|
||||
* LazyLoadVideo Class
|
||||
* Handles lazy loading and autoplay functionality for videos.
|
||||
*/
|
||||
class LazyLoadVideo {
|
||||
constructor() {
|
||||
this.shouldDelayVideoRenderingForMobile = this.supportsIntersectionObserver();
|
||||
this.queuedVideoElements = [];
|
||||
this.isMobileOrSafari = null;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize event listeners and fallback mechanisms.
|
||||
*/
|
||||
init() {
|
||||
document.addEventListener( 'lazybeforeunveil', ( e ) => this.handleVideoLazyLoad( e ) );
|
||||
document.addEventListener(
|
||||
USER_INTERACTION_EVENT,
|
||||
() => this.enableVideoRenderingForMobile(),
|
||||
{ once: true, passive: true }
|
||||
);
|
||||
|
||||
// Unified fallback for delayed video rendering.
|
||||
const maybeTriggerVideoRenderingFallbackForMobile = () => {
|
||||
if ( FALLBACK_VIDEO_RENDER_DELAY <= 0 ) {
|
||||
const hasAutoPlayVideo = document.querySelector( `.${ VIDEO_WRAPPER_CLASS }.${ AUTO_PLAY_CLASS }` );
|
||||
if ( hasAutoPlayVideo ) {
|
||||
this.enableVideoRenderingForMobile();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
setTimeout( () => this.enableVideoRenderingForMobile(), FALLBACK_VIDEO_RENDER_DELAY );
|
||||
};
|
||||
|
||||
document.addEventListener( 'DOMContentLoaded', maybeTriggerVideoRenderingFallbackForMobile );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles lazy loading of video elements.
|
||||
*
|
||||
* @param {Event} e - The lazybeforeunveil event.
|
||||
*/
|
||||
handleVideoLazyLoad( e ) {
|
||||
const videoWrapper = e.target;
|
||||
|
||||
if (
|
||||
! isSmushLazySizesInstance( e?.detail?.instance ) ||
|
||||
! videoWrapper.classList.contains( VIDEO_WRAPPER_CLASS )
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.handleButtonPlay( videoWrapper );
|
||||
this.maybePrepareVideoForPlay( videoWrapper );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the play button click event.
|
||||
*
|
||||
* @param {HTMLElement} videoWrapper - The video wrapper element.
|
||||
*/
|
||||
handleButtonPlay( videoWrapper ) {
|
||||
const playButton = videoWrapper.querySelector( `.${ PLAY_BUTTON_CLASS }` );
|
||||
|
||||
if ( playButton ) {
|
||||
const playHandler = () => this.loadIframeVideoWithAutoPlay( videoWrapper );
|
||||
playButton.addEventListener( 'click', playHandler );
|
||||
playButton.addEventListener( 'keydown', ( e ) => {
|
||||
if ( e.key === 'Enter' || e.key === ' ' ) {
|
||||
e.preventDefault();
|
||||
playHandler();
|
||||
}
|
||||
} );
|
||||
} else {
|
||||
this.loadIframeVideo( videoWrapper );
|
||||
window.console?.warning( 'Missing play button [.smush-play-btn] for video element:', videoWrapper );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares the video for play based on autoplay and device conditions.
|
||||
*
|
||||
* @param {HTMLElement} videoWrapper - The video wrapper element.
|
||||
*/
|
||||
maybePrepareVideoForPlay( videoWrapper ) {
|
||||
const shouldAutoPlay = videoWrapper.classList.contains( AUTO_PLAY_CLASS );
|
||||
|
||||
if ( this.shouldPrepareIframeForPlay() ) {
|
||||
this.maybePrepareVideoForMobileAndSafari( videoWrapper, shouldAutoPlay );
|
||||
} else if ( shouldAutoPlay ) {
|
||||
this.loadIframeVideoWithAutoPlay( videoWrapper );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables video rendering for mobile devices.
|
||||
*/
|
||||
enableVideoRenderingForMobile() {
|
||||
if ( ! this.shouldDelayVideoRenderingForMobile ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.shouldDelayVideoRenderingForMobile = false;
|
||||
this.maybeObserveQueuedVideoElements();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the browser supports IntersectionObserver.
|
||||
*
|
||||
* @return {boolean} True if supported, false otherwise.
|
||||
*/
|
||||
supportsIntersectionObserver() {
|
||||
return 'IntersectionObserver' in window;
|
||||
}
|
||||
|
||||
/**
|
||||
* Observes queued video elements for lazy loading.
|
||||
*/
|
||||
maybeObserveQueuedVideoElements() {
|
||||
if ( this.queuedVideoElements.length ) {
|
||||
this.observeQueuedVideoElements();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Observes video elements using IntersectionObserver.
|
||||
*/
|
||||
observeQueuedVideoElements() {
|
||||
const observer = new IntersectionObserver(
|
||||
( entries ) => {
|
||||
entries.forEach( ( entry ) => {
|
||||
if ( entry.isIntersecting ) {
|
||||
const videoWrapper = entry.target;
|
||||
|
||||
this.loadIframeVideo( videoWrapper );
|
||||
observer.unobserve( videoWrapper );
|
||||
}
|
||||
} );
|
||||
},
|
||||
{
|
||||
rootMargin: '0px 0px 200px 0px',
|
||||
threshold: 0.1,
|
||||
}
|
||||
);
|
||||
|
||||
this.queuedVideoElements.forEach( ( videoWrapper ) => {
|
||||
observer.observe( videoWrapper );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares video for mobile and Safari browsers.
|
||||
*
|
||||
* @param {HTMLElement} videoWrapper - The video wrapper element.
|
||||
* @param {boolean} shouldAutoPlay - Whether the video should autoplay.
|
||||
*/
|
||||
maybePrepareVideoForMobileAndSafari( videoWrapper, shouldAutoPlay ) {
|
||||
if ( this.shouldDelayVideoRenderingForMobile ) {
|
||||
this.queuedVideoElements.push( videoWrapper );
|
||||
return;
|
||||
}
|
||||
|
||||
this.loadIframeVideo( videoWrapper, shouldAutoPlay );
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the iframe should be prepared for play.
|
||||
*
|
||||
* @return {boolean} True if preparation is needed, false otherwise.
|
||||
*/
|
||||
shouldPrepareIframeForPlay() {
|
||||
if ( this.isMobileOrSafari === null ) {
|
||||
this.isMobileOrSafari = this.checkIfMobileOrSafari();
|
||||
}
|
||||
|
||||
return this.isMobileOrSafari;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the device is mobile or Safari browser.
|
||||
*
|
||||
* @return {boolean} True if mobile or Safari, false otherwise.
|
||||
*/
|
||||
checkIfMobileOrSafari() {
|
||||
const userAgent = navigator.userAgent;
|
||||
return userAgent.includes( 'Mobi' ) || ( userAgent.includes( 'Safari' ) && ! userAgent.includes( 'Chrome' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the iframe video.
|
||||
*
|
||||
* @param {HTMLElement} videoWrapper - The video wrapper element.
|
||||
* @param {boolean} [autoPlay=false] - Whether to autoplay the video.
|
||||
*/
|
||||
loadIframeVideo( videoWrapper, autoPlay = false ) {
|
||||
if ( videoWrapper.classList.contains( LAZY_LOADED_CLASS ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
videoWrapper.classList.add( LAZY_LOADED_CLASS, 'loading' );
|
||||
|
||||
const iframe = videoWrapper.querySelector( 'iframe' );
|
||||
if ( ! iframe ) {
|
||||
window.console?.error( 'Missing iframe element in video wrapper:', videoWrapper );
|
||||
return;
|
||||
}
|
||||
|
||||
let videoUrl = iframe.dataset?.src;
|
||||
if ( ! videoUrl ) {
|
||||
window.console?.error( 'Missing data-src attribute for iframe:', iframe );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( autoPlay ) {
|
||||
const url = new URL( videoUrl );
|
||||
url.searchParams.set( 'autoplay', '1' );
|
||||
url.searchParams.set( 'playsinline', '1' );
|
||||
videoUrl = url.toString();
|
||||
}
|
||||
|
||||
let allowAttribute = iframe.getAttribute( 'allow' ) || DEFAULT_ALLOW_ATTR;
|
||||
if ( ! allowAttribute.includes( 'autoplay' ) ) {
|
||||
allowAttribute += '; autoplay';
|
||||
}
|
||||
|
||||
iframe.setAttribute( 'allow', allowAttribute );
|
||||
iframe.setAttribute( 'allowFullscreen', 'true' );
|
||||
iframe.setAttribute( 'src', videoUrl );
|
||||
|
||||
videoWrapper.classList.remove( 'loading' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the iframe video with autoplay enabled.
|
||||
*
|
||||
* @param {HTMLElement} videoWrapper - The video wrapper element.
|
||||
*/
|
||||
loadIframeVideoWithAutoPlay( videoWrapper ) {
|
||||
this.loadIframeVideo( videoWrapper, true );
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize LazyLoadVideo
|
||||
new LazyLoadVideo();
|
||||
} )();
|
||||
@@ -0,0 +1,76 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
// Source: https://developers.google.com/speed/webp/faq#in_your_own_javascript.
|
||||
function check_feature(feature, callback) {
|
||||
const testImages = {
|
||||
webp: "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
|
||||
avif: "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A="
|
||||
};
|
||||
const img = new Image();
|
||||
img.onload = function () {
|
||||
const result = (img.width > 0) && (img.height > 0);
|
||||
callback(result);
|
||||
};
|
||||
img.onerror = function () {
|
||||
callback(false);
|
||||
};
|
||||
img.src = testImages[feature];
|
||||
}
|
||||
|
||||
function make_callback(fallbackAttributeName, dataValueName, extension) {
|
||||
return function (isNextGenSupported) {
|
||||
document.documentElement.classList.add(isNextGenSupported ? extension : 'no-' + extension);
|
||||
if (isNextGenSupported) {
|
||||
return;
|
||||
}
|
||||
|
||||
const originalGetAttribute = Object.getOwnPropertyDescriptor(Element.prototype, 'getAttribute');
|
||||
|
||||
// Redefine the getAttribute function with a custom implementation
|
||||
Object.defineProperty(Element.prototype, 'getAttribute', {
|
||||
value: function (attributeName) {
|
||||
if (!this.dataset.hasOwnProperty(dataValueName)) {
|
||||
return originalGetAttribute.value.call(this, attributeName);
|
||||
}
|
||||
|
||||
const fallbackObject = JSON.parse(this.dataset[dataValueName]);
|
||||
|
||||
if (attributeName in fallbackObject) {
|
||||
return fallbackObject[attributeName];
|
||||
}
|
||||
|
||||
return originalGetAttribute.value.call(this, attributeName);
|
||||
}
|
||||
});
|
||||
|
||||
const elementsWithFallback = document.querySelectorAll('[' + fallbackAttributeName + ']:not(.lazyload)');
|
||||
if (elementsWithFallback.length) {
|
||||
// Update background image, src, srcset.
|
||||
const imageDisplayAttrs = ['src', 'srcset'];
|
||||
elementsWithFallback.forEach((element) => {
|
||||
const fallbackObject = JSON.parse(element.dataset[dataValueName]);
|
||||
imageDisplayAttrs.forEach(function (attrName) {
|
||||
if (attrName in fallbackObject) {
|
||||
element.setAttribute(attrName, fallbackObject[attrName]);
|
||||
}
|
||||
});
|
||||
|
||||
// Update background image.
|
||||
if ('bg' in fallbackObject) {
|
||||
element.style.background = fallbackObject.bg;
|
||||
}
|
||||
if ('bg-image' in fallbackObject) {
|
||||
element.style.backgroundImage = fallbackObject['bg-image'];
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (wp_smushit_nextgen_data?.mode === 'avif') {
|
||||
check_feature('avif', make_callback('data-smush-avif-fallback', 'smushAvifFallback', 'avif'));
|
||||
} else {
|
||||
check_feature('webp', make_callback('data-smush-webp-fallback', 'smushWebpFallback', 'webp'));
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,437 @@
|
||||
import '../../scss/resize-detection.scss';
|
||||
|
||||
/**
|
||||
* Image resize detection (IRD).
|
||||
*
|
||||
* Show all wrongly scaled images with a highlighted border and resize box.
|
||||
*
|
||||
* Made in pure JS.
|
||||
* DO NOT ADD JQUERY SUPPORT!!!
|
||||
*
|
||||
* @since 2.9
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
|
||||
const SmushIRS = {
|
||||
bar: document.getElementById( 'smush-image-bar' ),
|
||||
toggle: document.getElementById( 'smush-image-bar-toggle' ),
|
||||
images: {
|
||||
bigger: [],
|
||||
smaller: [],
|
||||
},
|
||||
strings: window.wp_smush_resize_vars,
|
||||
|
||||
/**
|
||||
* Init scripts.
|
||||
*/
|
||||
init() {
|
||||
/**
|
||||
* Make sure these are set, before we proceed.
|
||||
*/
|
||||
if ( ! this.bar ) {
|
||||
this.bar = document.getElementById( 'smush-image-bar' );
|
||||
}
|
||||
if ( ! this.toggle ) {
|
||||
this.toggle = document.getElementById(
|
||||
'smush-image-bar-toggle'
|
||||
);
|
||||
}
|
||||
|
||||
this.process();
|
||||
|
||||
// Register the event handler after everything is done.
|
||||
this.toggle.addEventListener(
|
||||
'click',
|
||||
this.handleToggleClick.bind( this )
|
||||
);
|
||||
|
||||
this.initImageVisibilityObserver();
|
||||
},
|
||||
|
||||
/**
|
||||
* Do image processing.
|
||||
*/
|
||||
process() {
|
||||
const icon = this.toggle.querySelector( 'i' );
|
||||
|
||||
icon.classList.add( 'sui-icon-loader' );
|
||||
icon.classList.remove( 'sui-icon-info' );
|
||||
|
||||
this.detectImages();
|
||||
|
||||
if ( ! this.images.bigger.length && ! this.images.smaller.length ) {
|
||||
this.toggle.classList.add( 'smush-toggle-success' );
|
||||
document.getElementById(
|
||||
'smush-image-bar-notice'
|
||||
).style.display = 'block';
|
||||
document.getElementById(
|
||||
'smush-image-bar-notice-desc'
|
||||
).style.display = 'none';
|
||||
} else {
|
||||
this.toggle.classList.remove( 'smush-toggle-success' );
|
||||
document.getElementById(
|
||||
'smush-image-bar-notice'
|
||||
).style.display = 'none';
|
||||
document.getElementById(
|
||||
'smush-image-bar-notice-desc'
|
||||
).style.display = 'block';
|
||||
this.generateMarkup( 'bigger' );
|
||||
this.generateMarkup( 'smaller' );
|
||||
}
|
||||
|
||||
this.toggleDivs();
|
||||
|
||||
icon.classList.remove( 'sui-icon-loader' );
|
||||
icon.classList.add( 'sui-icon-info' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Various checks to see if the image should be processed.
|
||||
*
|
||||
* @param {Object} image
|
||||
* @return {boolean} Should skip image or not.
|
||||
*/
|
||||
shouldSkipImage( image ) {
|
||||
if ( this.isIgnoredImage( image ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Skip 1x1px and 0x0px images.
|
||||
if (
|
||||
image.clientWidth === image.clientHeight &&
|
||||
( 1 === image.clientWidth || 0 === image.clientWidth )
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Skip 1x1px and 0x0px placeholders.
|
||||
if ( this.isPlaceholder( image ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If width attribute is not set, do not continue.
|
||||
return null === image.clientWidth || null === image.clientHeight;
|
||||
},
|
||||
|
||||
isIgnoredImage( image ) {
|
||||
// Skip avatars.
|
||||
if ( image.classList.contains( 'avatar' ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Skip images from Smush CDN with auto-resize feature.
|
||||
return 'string' === typeof image.getAttribute( 'no-resize-detection' );
|
||||
},
|
||||
|
||||
isPlaceholder( image ) {
|
||||
return image.naturalWidth === image.naturalHeight && image.naturalWidth < 32;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get tooltip text.
|
||||
*
|
||||
* @param {Object} props
|
||||
* @return {string} Tooltip.
|
||||
*/
|
||||
getTooltipText( props ) {
|
||||
let tooltipText = '';
|
||||
|
||||
if ( props.bigger_width || props.bigger_height ) {
|
||||
/** @param {string} strings.large_image */
|
||||
tooltipText = this.strings.large_image;
|
||||
} else if ( props.smaller_width || props.smaller_height ) {
|
||||
/** @param {string} strings.small_image */
|
||||
tooltipText = this.strings.small_image;
|
||||
}
|
||||
|
||||
return tooltipText
|
||||
.replace( 'width', props.real_width )
|
||||
.replace( 'height', props.real_height );
|
||||
},
|
||||
|
||||
/**
|
||||
* Generate markup.
|
||||
*
|
||||
* @param {string} type Accepts: 'bigger' or 'smaller'.
|
||||
*/
|
||||
generateMarkup( type ) {
|
||||
this.images[ type ].forEach( ( image, index ) => {
|
||||
const item = document.createElement( 'div' ),
|
||||
tooltip = this.getTooltipText( image.props );
|
||||
|
||||
item.setAttribute(
|
||||
'class',
|
||||
'smush-resize-box smush-tooltip smush-tooltip-constrained'
|
||||
);
|
||||
item.setAttribute( 'data-tooltip', tooltip );
|
||||
item.setAttribute( 'data-image', image.class );
|
||||
item.addEventListener( 'click', ( e ) =>
|
||||
this.highlightImage( e )
|
||||
);
|
||||
|
||||
item.innerHTML = `
|
||||
<div class="smush-image-info">
|
||||
<span>${ index + 1 }</span>
|
||||
<span class="smush-tag">${ image.props.computed_width } x ${ image.props.computed_height }px</span>
|
||||
<i class="smush-front-icons smush-front-icon-arrows-in" aria-hidden="true"> </i>
|
||||
<span class="smush-tag smush-tag-success">${ image.props.real_width } × ${ image.props.real_height }px</span>
|
||||
</div>
|
||||
<div class="smush-image-description">${ tooltip }</div>
|
||||
`;
|
||||
|
||||
document
|
||||
.getElementById( 'smush-image-bar-items-' + type )
|
||||
.appendChild( item );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show/hide sections based on images.
|
||||
*/
|
||||
toggleDivs() {
|
||||
const types = [ 'bigger', 'smaller' ];
|
||||
types.forEach( ( type ) => {
|
||||
const div = document.getElementById(
|
||||
'smush-image-bar-items-' + type
|
||||
);
|
||||
if ( 0 === this.images[ type ].length ) {
|
||||
div.style.display = 'none';
|
||||
} else {
|
||||
div.style.display = 'block';
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Scroll the selected image into view and highlight it.
|
||||
*
|
||||
* @param {Object} e
|
||||
*/
|
||||
highlightImage( e ) {
|
||||
this.removeSelection();
|
||||
|
||||
const el = document.getElementsByClassName(
|
||||
e.currentTarget.dataset.image
|
||||
);
|
||||
if ( 'undefined' !== typeof el[ 0 ] ) {
|
||||
// Display description box.
|
||||
e.currentTarget.classList.toggle( 'show-description' );
|
||||
|
||||
// Scroll and flash image.
|
||||
el[ 0 ].scrollIntoView( {
|
||||
behavior: 'smooth',
|
||||
block: 'center',
|
||||
inline: 'nearest',
|
||||
} );
|
||||
el[ 0 ].style.opacity = '0.5';
|
||||
setTimeout( () => {
|
||||
el[ 0 ].style.opacity = '1';
|
||||
}, 1000 );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle click on the toggle item.
|
||||
*/
|
||||
handleToggleClick() {
|
||||
this.bar.classList.toggle( 'closed' );
|
||||
this.toggle.classList.toggle( 'closed' );
|
||||
this.removeSelection();
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove selected items.
|
||||
*/
|
||||
removeSelection() {
|
||||
const items = document.getElementsByClassName( 'show-description' );
|
||||
if ( items.length > 0 ) {
|
||||
Array.from( items ).forEach( ( div ) =>
|
||||
div.classList.remove( 'show-description' )
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Function to highlight all scaled images.
|
||||
*
|
||||
* Add yellow border and then show one small box to
|
||||
* resize the images as per the required size, on fly.
|
||||
*/
|
||||
detectImages() {
|
||||
const images = document.getElementsByTagName( 'img' );
|
||||
for ( const image of images ) {
|
||||
if ( this.shouldSkipImage( image ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get defined width and height.
|
||||
const props = {
|
||||
real_width: image.clientWidth,
|
||||
real_height: image.clientHeight,
|
||||
computed_width: image.naturalWidth,
|
||||
computed_height: image.naturalHeight,
|
||||
bigger_width: image.clientWidth * 1.5 < image.naturalWidth,
|
||||
bigger_height:
|
||||
image.clientHeight * 1.5 < image.naturalHeight,
|
||||
smaller_width: image.clientWidth > image.naturalWidth,
|
||||
smaller_height: image.clientHeight > image.naturalHeight,
|
||||
};
|
||||
|
||||
// In case image is in correct size, do not continue.
|
||||
if (
|
||||
! props.bigger_width &&
|
||||
! props.bigger_height &&
|
||||
! props.smaller_width &&
|
||||
! props.smaller_height
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const imgType =
|
||||
props.bigger_width || props.bigger_height
|
||||
? 'bigger'
|
||||
: 'smaller',
|
||||
imageClass =
|
||||
`smush-image-${ imgType }-${ this.images[ imgType ].length + 1 }`;
|
||||
|
||||
// Fill the images arrays.
|
||||
this.images[ imgType ].push( {
|
||||
src: image,
|
||||
props,
|
||||
class: imageClass,
|
||||
} );
|
||||
|
||||
/**
|
||||
* Add class to original image.
|
||||
* Can't add two classes in single add(), because no support in IE11.
|
||||
* image.classList.add('smush-detected-img', imageClass);
|
||||
*/
|
||||
image.classList.add( 'smush-detected-img' );
|
||||
image.classList.add( imageClass );
|
||||
}
|
||||
}, // End detectImages()
|
||||
|
||||
/**
|
||||
* Allows refreshing the list. A good way is to refresh on lazyload actions.
|
||||
*
|
||||
* @since 3.6.0
|
||||
*/
|
||||
refresh() {
|
||||
// Clear out classes on DOM.
|
||||
for ( let id in this.images.bigger ) {
|
||||
if ( this.images.bigger.hasOwnProperty( id ) ) {
|
||||
this.images.bigger[ id ].src.classList.remove(
|
||||
'smush-detected-img'
|
||||
);
|
||||
this.images.bigger[ id ].src.classList.remove(
|
||||
'smush-image-bigger-' + ( ++id )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for ( let id in this.images.smaller ) {
|
||||
if ( this.images.smaller.hasOwnProperty( id ) ) {
|
||||
this.images.smaller[ id ].src.classList.remove(
|
||||
'smush-detected-img'
|
||||
);
|
||||
this.images.smaller[ id ].src.classList.remove(
|
||||
'smush-image-smaller-' + ( ++id )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
this.images = {
|
||||
bigger: [],
|
||||
smaller: [],
|
||||
};
|
||||
|
||||
// This might be overkill - there will probably never be a situation when there are less images than on
|
||||
// initial page load.
|
||||
const elements = document.getElementsByClassName(
|
||||
'smush-resize-box'
|
||||
);
|
||||
while ( elements.length > 0 ) {
|
||||
elements[ 0 ].remove();
|
||||
}
|
||||
|
||||
this.process();
|
||||
},
|
||||
|
||||
/**
|
||||
* This will monitor all images on the page and detect their sizes once they’ve loaded.
|
||||
*
|
||||
* @since 3.18.0
|
||||
*/
|
||||
initImageVisibilityObserver() {
|
||||
let imagesSelector = 'img:not(.smush-detected-img)';
|
||||
const smushLazyloadEnabled = typeof window.lazySizes !== 'undefined';
|
||||
if ( smushLazyloadEnabled ) {
|
||||
const lazyLoadClassName = window.lazySizes?.cfg?.lazyClass || 'lazyload';
|
||||
imagesSelector += `:not(.${ lazyLoadClassName } )`;
|
||||
}
|
||||
const lazyImages = document.querySelectorAll( imagesSelector );
|
||||
|
||||
if ( ! lazyImages.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const config = {
|
||||
threshold: 0.1
|
||||
};
|
||||
|
||||
let refreshTimeout = null;
|
||||
|
||||
const debouncedRefresh = () => {
|
||||
if ( refreshTimeout ) {
|
||||
clearTimeout( refreshTimeout );
|
||||
}
|
||||
refreshTimeout = setTimeout( () => {
|
||||
this.refresh();
|
||||
refreshTimeout = null;
|
||||
}, 500 );
|
||||
};
|
||||
|
||||
const imageObserver = new IntersectionObserver( ( entries ) => {
|
||||
entries.forEach( ( entry ) => {
|
||||
if ( entry.isIntersecting ) {
|
||||
const img = entry.target;
|
||||
|
||||
if ( ! img.classList.contains( 'smush-detected-img' ) ) {
|
||||
if ( img.complete && ! this.isPlaceholder( img ) ) {
|
||||
debouncedRefresh();
|
||||
} else {
|
||||
img.addEventListener( 'load', () => {
|
||||
debouncedRefresh();
|
||||
}, { once: true } );
|
||||
}
|
||||
|
||||
imageObserver.unobserve( img );
|
||||
}
|
||||
}
|
||||
} );
|
||||
}, config );
|
||||
|
||||
lazyImages.forEach( ( img ) => {
|
||||
if ( this.isIgnoredImage( img ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
imageObserver.observe( img );
|
||||
} );
|
||||
},
|
||||
|
||||
}; // End WP_Smush_IRS
|
||||
|
||||
/**
|
||||
* After page load, initialize toggle event.
|
||||
*/
|
||||
window.addEventListener( 'DOMContentLoaded', () => SmushIRS.init() );
|
||||
window.addEventListener( 'lazyloaded', ( event ) => {
|
||||
if ( 'IMG' !== event?.target?.tagName ) {
|
||||
return;
|
||||
}
|
||||
|
||||
SmushIRS.refresh();
|
||||
} );
|
||||
}() );
|
||||
@@ -0,0 +1,62 @@
|
||||
import tracker from './utils/tracker';
|
||||
|
||||
export default class GlobalTracking {
|
||||
init() {
|
||||
this.trackSubmenuProUpsell();
|
||||
this.trackPluginListProUpsell();
|
||||
this.trackDashboardWidgetProUpsell();
|
||||
}
|
||||
|
||||
trackSubmenuProUpsell() {
|
||||
const submenuUpgradeLink = document.querySelector( '#toplevel_page_smush a[href*="utm_campaign=smush_submenu_upsell' );
|
||||
if ( submenuUpgradeLink ) {
|
||||
submenuUpgradeLink.addEventListener( 'click', ( event ) => {
|
||||
this.trackGeneralProUpsell( 'submenu', event?.target?.href );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
trackPluginListProUpsell() {
|
||||
const pluginlistUpgradeLink = document.getElementById( 'smush-pluginlist-upgrade-link' );
|
||||
if ( pluginlistUpgradeLink ) {
|
||||
pluginlistUpgradeLink.addEventListener( 'click', ( event ) => {
|
||||
this.trackGeneralProUpsell( 'plugins_list', event?.target?.href );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
trackDashboardWidgetProUpsell() {
|
||||
const upsellBox = document.getElementById( 'smush-box-dashboard-upsell-upsell' );
|
||||
if ( ! upsellBox ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dashboardProUpsellLink = upsellBox.querySelector( 'a[href*=smush-dashboard-upsell]' );
|
||||
if ( dashboardProUpsellLink ) {
|
||||
dashboardProUpsellLink.addEventListener( 'click', ( event ) => {
|
||||
this.trackGeneralProUpsell( 'dash_widget', event?.target?.href );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
trackSetupWizardProUpsell( utmLink, proInterests ) {
|
||||
this.trackGeneralProUpsell( 'wizard', utmLink, proInterests );
|
||||
}
|
||||
|
||||
trackGeneralProUpsell( localtion, utmLink, proInterests = 'na' ) {
|
||||
this.trackProUpsell( {
|
||||
Feature: 'pro_general',
|
||||
Location: localtion,
|
||||
'UTM Link': utmLink,
|
||||
'Pro Interests': proInterests,
|
||||
} );
|
||||
}
|
||||
|
||||
trackProUpsell( properties ) {
|
||||
properties = Object.assign( {
|
||||
'User Action': 'cta_clicked',
|
||||
}, properties );
|
||||
|
||||
tracker.track( 'smush_pro_upsell', properties );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
import '../scss/common.scss';
|
||||
import DeactivationSurvey from './modules/deactivation-survey';
|
||||
import GlobalTracking from './global-tracking';
|
||||
|
||||
/* global ajaxurl */
|
||||
|
||||
document.addEventListener( 'DOMContentLoaded', function() {
|
||||
// Deactivation survey modal.
|
||||
( new DeactivationSurvey() ).init();
|
||||
// Global Trackings.
|
||||
( new GlobalTracking() ).init();
|
||||
|
||||
// Dismiss notices.
|
||||
const dismissNoticeButton = document.querySelectorAll(
|
||||
'.smush-dismissible-notice .smush-dismiss-notice-button'
|
||||
);
|
||||
dismissNoticeButton.forEach((button) => {
|
||||
button.addEventListener('click', handleDismissNotice);
|
||||
});
|
||||
|
||||
function handleDismissNotice(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const button = event.target;
|
||||
const notice = button.closest('.smush-dismissible-notice');
|
||||
const key = notice.getAttribute('data-key');
|
||||
|
||||
dismissNotice( key, notice );
|
||||
}
|
||||
|
||||
function dismissNotice( key, notice ) {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'POST',
|
||||
ajaxurl + '?action=smush_dismiss_notice&key=' + key + '&_ajax_nonce=' + smush_global.nonce,
|
||||
true
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if (notice) {
|
||||
// Trigger WordPress notice dismissal.
|
||||
const noticeDismissButton = notice.querySelector('button.notice-dismiss');
|
||||
if (noticeDismissButton) {
|
||||
noticeDismissButton.dispatchEvent(new MouseEvent('click', {
|
||||
view: window,
|
||||
bubbles: true,
|
||||
cancelable: true
|
||||
}));
|
||||
} else {
|
||||
notice.style.display = 'none';
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
const dismissCacheNoticeButton = document.querySelector( '#wp-smush-cache-notice .smush-dismiss-notice-button' );
|
||||
if ( dismissCacheNoticeButton ) {
|
||||
dismissCacheNoticeButton.addEventListener( 'click', function() {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'POST',
|
||||
ajaxurl + '?action=smush_dismiss_cache_notice&_ajax_nonce=' + smush_global.nonce,
|
||||
true
|
||||
);
|
||||
xhr.onload = () => {
|
||||
window.SUI.closeNotice( 'wp-smush-cache-notice' );
|
||||
};
|
||||
xhr.send();
|
||||
} );
|
||||
}
|
||||
|
||||
// Show header notices.
|
||||
const handleHeaderNotice = () => {
|
||||
const headerNotice = document.querySelector('.wp-smush-dismissible-header-notice');
|
||||
if ( ! headerNotice || ! headerNotice.id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { dismissKey, message } = headerNotice.dataset;
|
||||
if ( ! message ) {
|
||||
return;
|
||||
}
|
||||
|
||||
headerNotice.onclick = (e) => {
|
||||
const classList = e.target.classList;
|
||||
const isCloseAndDismissLink = classList && classList.contains( 'smush-close-and-dismiss-notice' );
|
||||
const shouldDismissNotice = classList && ( isCloseAndDismissLink || classList.contains('sui-icon-check') || classList.contains('sui-button-icon') );
|
||||
if ( ! shouldDismissNotice ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( dismissKey ) {
|
||||
dismissNotice( dismissKey );
|
||||
}
|
||||
|
||||
if ( isCloseAndDismissLink ) {
|
||||
window.SUI.closeNotice( headerNotice.id );
|
||||
}
|
||||
}
|
||||
|
||||
const noticeOptions = {
|
||||
type: 'warning',
|
||||
icon: 'info',
|
||||
dismiss: {
|
||||
show: true,
|
||||
label: wp_smush_msgs.noticeDismiss,
|
||||
tooltip: wp_smush_msgs.noticeDismissTooltip,
|
||||
},
|
||||
};
|
||||
|
||||
window.SUI.openNotice(
|
||||
headerNotice.id,
|
||||
message,
|
||||
noticeOptions
|
||||
);
|
||||
}
|
||||
|
||||
handleHeaderNotice();
|
||||
});
|
||||
@@ -0,0 +1,50 @@
|
||||
import Fetcher from './utils/fetcher';
|
||||
|
||||
class LoopbackTester {
|
||||
delayTimeOnFailure = 5000;
|
||||
|
||||
performTest() {
|
||||
return new Promise( ( resolve, reject ) => {
|
||||
this.startTest().then( ( res ) => {
|
||||
if ( res?.success ) {
|
||||
this.getResult(
|
||||
resolve,
|
||||
() => {
|
||||
setTimeout( () => {
|
||||
this.getResult( resolve, reject, reject );
|
||||
}, this.delayTimeOnFailure );
|
||||
},
|
||||
reject
|
||||
);
|
||||
} else {
|
||||
reject( res );
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
reject( error );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
startTest() {
|
||||
return Fetcher.background.backgroundHealthyCheck();
|
||||
}
|
||||
|
||||
getResult( successCallback, failedCallback, errorCallback ) {
|
||||
return this.fetchResult().then( ( status ) => {
|
||||
let data = status?.data;
|
||||
if (status?.success && data?.loopback) {
|
||||
successCallback(data);
|
||||
} else {
|
||||
failedCallback(status);
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
errorCallback( error );
|
||||
} );
|
||||
}
|
||||
|
||||
fetchResult() {
|
||||
return Fetcher.background.backgroundHealthyStatus();
|
||||
}
|
||||
}
|
||||
|
||||
export default ( new LoopbackTester() );
|
||||
@@ -0,0 +1,22 @@
|
||||
jQuery(function ($) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Handle the Smush Stats link click
|
||||
*/
|
||||
$( 'body' ).on( 'click', 'a.smush-stats-details', function ( e ) {
|
||||
// If disabled
|
||||
if ( $( this ).prop( 'disabled' ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
const $link = $( this );
|
||||
const $wrapper = $link.parents().eq( 1 ).find( '.smush-stats-wrapper' );
|
||||
|
||||
// Toggle expanded state
|
||||
$link.toggleClass( 'smush-stats-expanded' );
|
||||
$wrapper.slideToggle();
|
||||
} );
|
||||
});
|
||||
@@ -0,0 +1,472 @@
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* Bulk Smush Background Optimization.
|
||||
*
|
||||
* @since 3.12.0
|
||||
*/
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import tracker from '../utils/tracker';
|
||||
import SmushProgress from '../common/progressbar';
|
||||
import {GlobalStats, UpsellManger} from "../common/globalStats";
|
||||
import loopbackTester from '../loopback-tester';
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
if (!window.wp_smush_msgs) {
|
||||
return;
|
||||
}
|
||||
const $ = document.querySelector.bind(document);
|
||||
const NO_FREE_LIMITED = 50;
|
||||
|
||||
/**
|
||||
* Handle Background Process.
|
||||
* @returns
|
||||
*/
|
||||
const BackgroundProcess = () => {
|
||||
return {
|
||||
handle(action) {
|
||||
return Fetcher.background[action]();
|
||||
},
|
||||
initState() {
|
||||
return Fetcher.background.initState();
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Background Optimization.
|
||||
*/
|
||||
const BackgroundSmush = (() => {
|
||||
|
||||
const startBtn = window.wp_smushit_data && window.wp_smushit_data.bo_stats && $('.wp-smush-bo-start');
|
||||
if (!startBtn) {
|
||||
return;
|
||||
}
|
||||
|
||||
const BO = new BackgroundProcess();
|
||||
const bulkWrapper = $('.bulk-smush-wrapper');
|
||||
const reScanImagesButton = $('.wp-smush-scan');
|
||||
let intervalHandle = 0;
|
||||
let cancellationInProgress = false;
|
||||
return {
|
||||
hookStatusChecks() {
|
||||
if (intervalHandle) {
|
||||
// Already done
|
||||
return;
|
||||
}
|
||||
|
||||
let count = 0;
|
||||
let statusSyncInProgress = false;
|
||||
let statSyncInProgress = false;
|
||||
intervalHandle = setInterval(() => {
|
||||
if (statusSyncInProgress) {
|
||||
return;
|
||||
}
|
||||
statusSyncInProgress = true;
|
||||
|
||||
count++;
|
||||
const statusSynced = this.syncBackgroundStatus();
|
||||
if (count % 3 === 0) {
|
||||
// Do a full update every nth time
|
||||
statusSynced.then(() => {
|
||||
if (!statSyncInProgress) {
|
||||
this.syncStats().then(() => {
|
||||
statSyncInProgress = false;
|
||||
});
|
||||
statSyncInProgress = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
statusSynced.finally(() => {
|
||||
statusSyncInProgress = false;
|
||||
});
|
||||
}, 3 * 1000);
|
||||
},
|
||||
resetBOStatsOnStart() {
|
||||
GlobalStats.setBoStats( {
|
||||
is_cancelled: false,
|
||||
is_completed: false,
|
||||
processed_items: 0,
|
||||
failed_items: 0,
|
||||
} );
|
||||
},
|
||||
start() {
|
||||
// Reset boStats.
|
||||
this.resetBOStatsOnStart();
|
||||
|
||||
// Disable UI.
|
||||
this.onStart();
|
||||
|
||||
loopbackTester.performTest().then( ( res ) => {
|
||||
const isLoopbackHealthy = res?.loopback;
|
||||
if ( isLoopbackHealthy ) {
|
||||
// Start BO.
|
||||
this.startBulkSmush();
|
||||
} else {
|
||||
this.showLoopbackErrorModal();
|
||||
this.onStartFailure();
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
console.error( 'Error:', error );
|
||||
this.showLoopbackErrorModal();
|
||||
this.onStartFailure();
|
||||
} );
|
||||
},
|
||||
startBulkSmush() {
|
||||
BO.handle('start').then((res) => {
|
||||
if (res.success) {
|
||||
// Update stats.
|
||||
const updatedStats = this.updateStats(res.data, false);
|
||||
// Show progress bar.
|
||||
this.showProgressBar();
|
||||
this.hookStatusChecks();
|
||||
if ( updatedStats ) {
|
||||
// Render stats.
|
||||
GlobalStats.renderStats();
|
||||
}
|
||||
} else {
|
||||
this.showFailureNotice( res );
|
||||
this.onStartFailure( res );
|
||||
}
|
||||
});
|
||||
},
|
||||
showFailureNotice( res ) {
|
||||
WP_Smush.helpers.showNotice( res, {
|
||||
'showdismiss': true,
|
||||
'autoclose' : false,
|
||||
} );
|
||||
},
|
||||
onStartFailure( res ) {
|
||||
this.cancelBulk();
|
||||
},
|
||||
showLoopbackErrorModal() {
|
||||
const loopbackErrorModal = document.getElementById( 'smush-loopback-error-dialog' );
|
||||
if ( ! loopbackErrorModal || ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Cache current process type.
|
||||
loopbackErrorModal.dataset.processType = 'smush';
|
||||
|
||||
WP_Smush.helpers.showModal( loopbackErrorModal.id );
|
||||
},
|
||||
/**
|
||||
* Initial state when load the Bulk Smush page while BO is running.
|
||||
*/
|
||||
initState() {
|
||||
if (!GlobalStats.getBoStats().in_processing) {
|
||||
return;
|
||||
}
|
||||
// Disable UI.
|
||||
this.onStart();
|
||||
// Start BO.
|
||||
BO.initState().then((res) => {
|
||||
if (res.success) {
|
||||
// Update stats.
|
||||
this.updateStats(res.data, false);
|
||||
// Show progress bar.
|
||||
this.showProgressBar();
|
||||
this.hookStatusChecks();
|
||||
// Maybe update errors.
|
||||
if ( res.data.errors && ! Object.keys( GlobalStats.getErrors() ).length ) {
|
||||
GlobalStats.setErrors( res.data.errors );
|
||||
}
|
||||
// Render stats.
|
||||
GlobalStats.renderStats();
|
||||
} else {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Cancel.
|
||||
*/
|
||||
cancel() {
|
||||
cancellationInProgress = true;
|
||||
this.setCancelButtonStateToStarted();
|
||||
BO.handle('cancel').then((res) => {
|
||||
if (res.success) {
|
||||
this.cancelBulk();
|
||||
} else {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
});
|
||||
},
|
||||
hideProgressBar() {
|
||||
// Hide progress bar.
|
||||
SmushProgress.close().update(0, GlobalStats.getBoStats().total_items);
|
||||
},
|
||||
showProgressBar() {
|
||||
// Reset progress bar.
|
||||
SmushProgress.update(GlobalStats.getBoStats().processed_items, GlobalStats.getBoStats().total_items);
|
||||
// Show progress bar.
|
||||
SmushProgress.show();
|
||||
},
|
||||
/**
|
||||
* Update stats.
|
||||
* @param {Object} newStats Included increment stats and new BO stats.
|
||||
* @param updateGlobal
|
||||
*/
|
||||
updateStats(newStats, updateGlobal) {
|
||||
// Make sure we have processed_stats/errors property (not added by default when start).
|
||||
newStats.global_stats = newStats.global_stats || {};
|
||||
newStats.errors = newStats.errors || {};
|
||||
const {
|
||||
global_stats,
|
||||
errors,
|
||||
...newBoStats
|
||||
} = newStats;
|
||||
if ( ! GlobalStats.isChangedStats( newBoStats ) ) {
|
||||
return false;
|
||||
}
|
||||
// Update BO stats.
|
||||
GlobalStats.setBoStats(newBoStats);
|
||||
if (updateGlobal) {
|
||||
// Update global stats.
|
||||
GlobalStats.setGlobalStats(global_stats);
|
||||
}
|
||||
// Update Errors.
|
||||
GlobalStats.setErrors( errors );
|
||||
return true;
|
||||
},
|
||||
cancelBulk() {
|
||||
// Sync Stats.
|
||||
this.syncStats(() => {
|
||||
if (100 === GlobalStats.getGlobalStats().percent_optimized) {
|
||||
// If the last item was getting processed when the user cancelled then the process might have completed
|
||||
GlobalStats.setBoStats( {
|
||||
is_completed: true
|
||||
} );
|
||||
this.onCompletedBulk();
|
||||
} else {
|
||||
// Update status of boStats.
|
||||
GlobalStats.setBoStats( {
|
||||
is_cancelled: true
|
||||
} );
|
||||
// Reset and hide progress bar.
|
||||
this.onFinish();
|
||||
// Bulk is cancelled, show bulk desc.
|
||||
SmushProgress.showBulkSmushDescription();
|
||||
}
|
||||
|
||||
cancellationInProgress = false;
|
||||
});
|
||||
},
|
||||
showCompletedMessage() {
|
||||
// Render completed message.
|
||||
// Show completed message.
|
||||
const processedWrapper = bulkWrapper.querySelector('.wp-smush-all-done');
|
||||
if ( GlobalStats.getBoStats().failed_items ) {
|
||||
let completeMessage = wp_smush_msgs.all_failed;
|
||||
if ( ! this.isFailedAllItems() ) {
|
||||
completeMessage = wp_smush_msgs.error_in_bulk.replace( '{{smushed}}', GlobalStats.getBoStats().total_items - GlobalStats.getBoStats().failed_items )
|
||||
.replace('{{total}}', GlobalStats.getBoStats().total_items )
|
||||
.replace('{{errors}}', GlobalStats.getBoStats().failed_items );
|
||||
}
|
||||
processedWrapper.querySelector('p').innerHTML = completeMessage;
|
||||
processedWrapper.classList.remove('sui-notice-success', 'sui-notice-warning');
|
||||
const noticeType = this.getNoticeType();
|
||||
const noticeIcon = 'warning' === noticeType ? 'info' : 'check-tick';
|
||||
const iconElement = processedWrapper.querySelector('.sui-notice-icon');
|
||||
processedWrapper.classList.add( 'sui-notice-' + noticeType );
|
||||
iconElement.classList.remove('sui-icon-check-tick', 'sui-icon-info');
|
||||
iconElement.classList.add( 'sui-icon-' + noticeIcon );
|
||||
} else {
|
||||
processedWrapper.querySelector('p').innerHTML = wp_smush_msgs.all_smushed;
|
||||
}
|
||||
processedWrapper.classList.remove('sui-hidden');
|
||||
},
|
||||
isFailedAllItems() {
|
||||
return GlobalStats.getBoStats().failed_items === GlobalStats.getBoStats().total_items;
|
||||
},
|
||||
getNoticeType() {
|
||||
return this.isFailedAllItems() ? 'warning' : 'success';
|
||||
},
|
||||
onCompletedBulk() {
|
||||
// Reset and hide progress bar.
|
||||
this.onFinish();
|
||||
// Bulk is completed, hide bulk desc.
|
||||
SmushProgress.hideBulkSmushDescription();
|
||||
// Show completed message.
|
||||
this.showCompletedMessage();
|
||||
|
||||
// Reset the progress when we finish so the next smushing starts from zero.
|
||||
SmushProgress.update(0, GlobalStats.getBoStats().total_items);
|
||||
},
|
||||
completeBulk() {
|
||||
// Sync Stats.
|
||||
this.syncStats(() => this.onCompletedBulk());
|
||||
},
|
||||
syncStats(onComplete = () => false) {
|
||||
return BO.handle('getStats').then((res) => {
|
||||
if ( res.success ) {
|
||||
const responseErrors = res.data.errors || {};
|
||||
this.updateStats( { global_stats: res.data, errors: responseErrors }, true );
|
||||
GlobalStats.renderStats();
|
||||
if ( res.data.content ) {
|
||||
$('#wp-smush-bulk-content').innerHTML = res.data.content;
|
||||
}
|
||||
onComplete();
|
||||
} else {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
}).catch( (error) => console.log('error', error));
|
||||
},
|
||||
syncBackgroundStatus() {
|
||||
return BO.handle('getStatus').then((res) => {
|
||||
if ((res.data || {}).in_process_notice) {
|
||||
SmushProgress.setNotice( res.data.in_process_notice );
|
||||
}
|
||||
|
||||
if ( (res.data || {}).is_process_stuck ) {
|
||||
SmushProgress.showHoldOnNotice();
|
||||
}
|
||||
|
||||
if (res.success) {
|
||||
// Update stats.
|
||||
if ( this.updateStats(res.data, false) ) {
|
||||
// Update progress bar.
|
||||
SmushProgress.update(GlobalStats.getBoStats().processed_items, GlobalStats.getBoStats().total_items);
|
||||
|
||||
if (! GlobalStats.getBoStats().is_cancelled && ! GlobalStats.getBoStats().is_completed) {
|
||||
// Render stats.
|
||||
GlobalStats.renderStats();
|
||||
}
|
||||
}
|
||||
|
||||
if (GlobalStats.getBoStats().is_cancelled && !cancellationInProgress) {
|
||||
// Cancelled on server side
|
||||
this.cancelBulk();
|
||||
} else if (GlobalStats.getBoStats().is_completed) {
|
||||
this.completeBulk();
|
||||
} else if ( GlobalStats.getBoStats().is_dead ) {
|
||||
this.onDead();
|
||||
}
|
||||
} else {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
});
|
||||
},
|
||||
onStart() {
|
||||
// Disable btn.
|
||||
startBtn.setAttribute('disabled', '');
|
||||
// Disable re-check images.
|
||||
reScanImagesButton && reScanImagesButton.setAttribute('disabled', '');
|
||||
$('.wp-smush-restore').setAttribute('disabled', '');
|
||||
// Show upsell cdn.
|
||||
UpsellManger.maybeShowCDNUpsellForPreSiteOnStart();
|
||||
|
||||
this.hideBulkSmushFailedNotice();
|
||||
|
||||
this.setCancelButtonStateToInitial();
|
||||
},
|
||||
hideBulkSmushFailedNotice() {
|
||||
const bulkSmushFailedNotice = document.querySelector( '.wp-smush-inline-retry-bulk-smush-notice' );
|
||||
if ( bulkSmushFailedNotice ) {
|
||||
bulkSmushFailedNotice.parentElement.classList.add( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
onFinish() {
|
||||
// Clear interval.
|
||||
if (intervalHandle) {
|
||||
clearInterval(intervalHandle);
|
||||
intervalHandle = 0;
|
||||
}
|
||||
|
||||
// Disable btn.
|
||||
startBtn.removeAttribute('disabled');
|
||||
// Reset and hide Progress Bar.
|
||||
this.hideProgressBar();
|
||||
// Disable re-check images.
|
||||
reScanImagesButton && reScanImagesButton.removeAttribute('disabled', '');
|
||||
$('.wp-smush-restore').removeAttribute('disabled', '');
|
||||
|
||||
// Show upsell cdn.
|
||||
UpsellManger.maybeShowCDNUpsellForPreSiteOnCompleted();
|
||||
},
|
||||
onDead() {
|
||||
this.onFinish();
|
||||
SmushProgress.showBulkSmushDescription();
|
||||
this.showRetryBulkSmushModal();
|
||||
},
|
||||
showRetryBulkSmushModal() {
|
||||
const retryModalElement = document.getElementById( 'smush-retry-bulk-smush-notice' );
|
||||
if ( ! window.SUI || ! retryModalElement ) {
|
||||
return;
|
||||
}
|
||||
|
||||
retryModalElement.querySelector('.smush-retry-bulk-smush-notice-button').onclick = (e) => {
|
||||
e.preventDefault();
|
||||
window.SUI.closeModal( 'smush-retry-bulk-smush-notice' );
|
||||
this.start();
|
||||
}
|
||||
|
||||
window.SUI.openModal(
|
||||
'smush-retry-bulk-smush-notice',
|
||||
'wpbody-content',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
},
|
||||
init() {
|
||||
if (!startBtn) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Start BO.
|
||||
startBtn.onclick = () => {
|
||||
const requiredScanMedia = startBtn.classList.contains('wp-smush-scan-and-bulk-smush');
|
||||
if ( requiredScanMedia ) {
|
||||
return;
|
||||
}
|
||||
this.start();
|
||||
}
|
||||
|
||||
const triggerBulkSmushButton = document.querySelector( '.wp-smush-inline-retry-bulk-smush-notice .wp-smush-trigger-bulk-smush' );
|
||||
if ( triggerBulkSmushButton ) {
|
||||
triggerBulkSmushButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
|
||||
startBtn.click();
|
||||
} );
|
||||
}
|
||||
|
||||
// If BO is running, initial new state.
|
||||
this.initState();
|
||||
},
|
||||
setCancelButtonStateToInitial() {
|
||||
SmushProgress.setCancelButtonLabel( wp_smush_msgs.cancel );
|
||||
SmushProgress.setOnCancelCallback( this.cancel.bind(this) );
|
||||
},
|
||||
setCancelButtonStateToStarted() {
|
||||
SmushProgress.setCancelButtonLabel( wp_smush_msgs.cancelling );
|
||||
SmushProgress.setOnCancelCallback( () => false );
|
||||
},
|
||||
}
|
||||
})();
|
||||
// Run.
|
||||
BackgroundSmush && BackgroundSmush.init();
|
||||
/**
|
||||
* For globalStats, we will need to update it on reload and after re-checking images,
|
||||
* and on finish the BO.
|
||||
* 1. On finish, we handled via BackgroundSmush.syncStats -> BackgroundSmush.updateStats
|
||||
* 2. On reload or after re-checking images, we need to update globalStats from global variable:
|
||||
* window.wp_smushit_data
|
||||
*/
|
||||
// Update global stats after re-checking images.
|
||||
document.addEventListener('wpSmushAfterRecheckImages', function(){
|
||||
GlobalStats.updateGlobalStatsFromSmushScriptData();
|
||||
});
|
||||
|
||||
document.addEventListener('backgroundBulkSmushOnScanCompleted', function(){
|
||||
if ( ! BackgroundSmush ) {
|
||||
return;
|
||||
}
|
||||
GlobalStats.setBoStats({
|
||||
in_processing: true,
|
||||
});
|
||||
BackgroundSmush.initState();
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,303 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
/* global _ */
|
||||
|
||||
import tracker from "../utils/tracker";
|
||||
|
||||
/**
|
||||
* Bulk restore JavaScript code.
|
||||
*
|
||||
* @since 3.2.2
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Bulk restore modal.
|
||||
*
|
||||
* @since 3.2.2
|
||||
*/
|
||||
WP_Smush.restore = {
|
||||
modal: document.getElementById('smush-restore-images-dialog'),
|
||||
contentContainer: document.getElementById('smush-bulk-restore-content'),
|
||||
settings: {
|
||||
slide: 'start', // start, progress or finish.
|
||||
success: 0,
|
||||
errors: [],
|
||||
},
|
||||
items: [], // total items, 1 item = 1 step.
|
||||
success: [], // successful items restored.
|
||||
errors: [], // failed items.
|
||||
currentStep: 0,
|
||||
totalSteps: 0,
|
||||
|
||||
/**
|
||||
* Init module.
|
||||
*/
|
||||
init() {
|
||||
if (!this.modal) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.settings = {
|
||||
slide: 'start',
|
||||
success: 0,
|
||||
errors: [],
|
||||
};
|
||||
|
||||
this.resetModalWidth();
|
||||
this.renderTemplate();
|
||||
|
||||
// Show the modal.
|
||||
|
||||
window.SUI.openModal(
|
||||
'smush-restore-images-dialog',
|
||||
'wpbody-content',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the template, register new listeners.
|
||||
*/
|
||||
renderTemplate() {
|
||||
const template = WP_Smush.onboarding.template('smush-bulk-restore');
|
||||
const content = template(this.settings);
|
||||
|
||||
if (content) {
|
||||
this.contentContainer.innerHTML = content;
|
||||
}
|
||||
|
||||
this.bindSubmit();
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset modal width.
|
||||
*
|
||||
* @since 3.6.0
|
||||
*/
|
||||
resetModalWidth() {
|
||||
this.modal.style.maxWidth = '460px';
|
||||
this.modal.querySelector('.sui-box').style.maxWidth = '460px';
|
||||
},
|
||||
|
||||
/**
|
||||
* Catch "Finish setup wizard" button click.
|
||||
*/
|
||||
bindSubmit() {
|
||||
const confirmButton = this.modal.querySelector(
|
||||
'button[id="smush-bulk-restore-button"]'
|
||||
);
|
||||
const self = this;
|
||||
|
||||
if (confirmButton) {
|
||||
confirmButton.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
self.resetModalWidth();
|
||||
|
||||
self.settings = { slide: 'progress' };
|
||||
self.errors = [];
|
||||
self.success = [];
|
||||
|
||||
self.renderTemplate();
|
||||
self.initScan();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel the bulk restore.
|
||||
*/
|
||||
cancel() {
|
||||
if (
|
||||
'start' === this.settings.slide ||
|
||||
'finish' === this.settings.slide
|
||||
) {
|
||||
// Hide the modal.
|
||||
window.SUI.closeModal();
|
||||
} else {
|
||||
this.updateProgressBar(true);
|
||||
window.location.reload();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Update progress bar during directory smush.
|
||||
*
|
||||
* @param {boolean} cancel Cancel status.
|
||||
*/
|
||||
updateProgressBar(cancel = false) {
|
||||
let progress = 0;
|
||||
if (0 < this.currentStep) {
|
||||
progress = Math.min(
|
||||
Math.round((this.currentStep * 100) / this.totalSteps),
|
||||
99
|
||||
);
|
||||
}
|
||||
|
||||
if (progress > 100) {
|
||||
progress = 100;
|
||||
}
|
||||
|
||||
// Update progress bar
|
||||
this.modal.querySelector('.sui-progress-text span').innerHTML =
|
||||
progress + '%';
|
||||
this.modal.querySelector('.sui-progress-bar span').style.width =
|
||||
progress + '%';
|
||||
|
||||
const statusDiv = this.modal.querySelector(
|
||||
'.sui-progress-state-text'
|
||||
);
|
||||
if (progress >= 90) {
|
||||
statusDiv.innerHTML = 'Finalizing...';
|
||||
} else if (cancel) {
|
||||
statusDiv.innerHTML = 'Cancelling...';
|
||||
} else {
|
||||
statusDiv.innerHTML =
|
||||
this.currentStep +
|
||||
'/' +
|
||||
this.totalSteps +
|
||||
' ' +
|
||||
'images restored';
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* First step in bulk restore - get the bulk attachment count.
|
||||
*/
|
||||
initScan() {
|
||||
const self = this;
|
||||
const _nonce = document.getElementById('_wpnonce');
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', ajaxurl + '?action=get_image_count', true);
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if (200 === xhr.status) {
|
||||
const res = JSON.parse(xhr.response);
|
||||
if ('undefined' !== typeof res.data.items) {
|
||||
self.items = res.data.items;
|
||||
self.totalSteps = res.data.items.length;
|
||||
self.step();
|
||||
}
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send('_ajax_nonce=' + _nonce.value);
|
||||
},
|
||||
|
||||
/**
|
||||
* Execute a scan step recursively
|
||||
*/
|
||||
step() {
|
||||
const self = this;
|
||||
const _nonce = document.getElementById('_wpnonce');
|
||||
|
||||
if (0 < this.items.length) {
|
||||
const item = this.items.pop();
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', ajaxurl + '?action=restore_step', true);
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
this.currentStep++;
|
||||
|
||||
if (200 === xhr.status) {
|
||||
const res = JSON.parse(xhr.response);
|
||||
const data = ((res || {}).data || {});
|
||||
if (data.success) {
|
||||
self.success.push(item);
|
||||
} else {
|
||||
self.errors.push({
|
||||
id: item,
|
||||
src: data.src || "Error",
|
||||
thumb: data.thumb,
|
||||
link: data.link,
|
||||
error_code: data.error_code || '',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
self.updateProgressBar();
|
||||
self.step();
|
||||
};
|
||||
xhr.send('item=' + item + '&_ajax_nonce=' + _nonce.value);
|
||||
} else {
|
||||
this.onFinish();
|
||||
|
||||
}
|
||||
},
|
||||
onFinish() {
|
||||
const missingBackupCount = this.errors.filter(
|
||||
(e) => e.error_code === 'missing_backup'
|
||||
).length;
|
||||
|
||||
const errorCopyCount = this.errors.filter(
|
||||
(e) => e.error_code === 'copy_failed'
|
||||
).length;
|
||||
|
||||
// Finish.
|
||||
this.settings = {
|
||||
slide: 'finish',
|
||||
success: this.success.length,
|
||||
errors: this.errors,
|
||||
errorsCount: this.errors.length,
|
||||
missingBackupCount: missingBackupCount,
|
||||
errorCopyCount: errorCopyCount,
|
||||
total: this.totalSteps,
|
||||
};
|
||||
|
||||
this.renderTemplate();
|
||||
if (0 < this.errors.length) {
|
||||
this.modal.style.maxWidth = '660px';
|
||||
this.modal.querySelector('.sui-box').style.maxWidth =
|
||||
'660px';
|
||||
}
|
||||
|
||||
this.trackBulkRestoredEvent();
|
||||
},
|
||||
|
||||
trackBulkRestoredEvent() {
|
||||
tracker.track(
|
||||
'Bulk Restore Triggered',
|
||||
{
|
||||
Type: 'All',
|
||||
'Total images restored': this.settings.success,
|
||||
'Total images': this.settings.total,
|
||||
'Backup not found': this.settings.missingBackupCount
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Template function (underscores based).
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
WP_Smush.restore.template = _.memoize((id) => {
|
||||
let compiled;
|
||||
const options = {
|
||||
evaluate: /<#([\s\S]+?)#>/g,
|
||||
interpolate: /{{{([\s\S]+?)}}}/g,
|
||||
escape: /{{([^}]+?)}}(?!})/g,
|
||||
variable: 'data',
|
||||
};
|
||||
|
||||
return (data) => {
|
||||
_.templateSettings = options;
|
||||
compiled =
|
||||
compiled || _.template(document.getElementById(id).innerHTML);
|
||||
return compiled(data);
|
||||
};
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,202 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* Bulk Smush functionality.
|
||||
*
|
||||
* @since 2.9.0 Moved from admin.js
|
||||
*/
|
||||
|
||||
import Smush from '../smush/smush';
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import SmushProcess from '../common/progressbar';
|
||||
|
||||
( function( $ ) {
|
||||
'use strict';
|
||||
|
||||
class WP_Smush_Bulk {
|
||||
#bulkSmushObj;
|
||||
|
||||
constructor() {
|
||||
this.onClickBulkSmushNow();
|
||||
this.onClickIgnoreImage();
|
||||
this.onClickIgnoreAllImages();
|
||||
this.onScanCompleted();
|
||||
this.resumeBulkSmushHandler();
|
||||
}
|
||||
|
||||
onClickBulkSmushNow() {
|
||||
/**
|
||||
* Handle the Bulk Smush/Bulk re-Smush button click.
|
||||
*/
|
||||
const self = this;
|
||||
$( '.wp-smush-all' ).on( 'click', function( e ) {
|
||||
const bulkSmushButton = $( this );
|
||||
if ( bulkSmushButton.hasClass( 'wp-smush-scan-and-bulk-smush' ) ) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
|
||||
self.ajaxBulkSmushStart( bulkSmushButton );
|
||||
} );
|
||||
}
|
||||
|
||||
resumeBulkSmushHandler() {
|
||||
const resumeButton = document.querySelector( '.wp-smush-resume-bulk-smush' );
|
||||
if ( ! resumeButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
resumeButton.addEventListener( 'click', ( e ) => {
|
||||
if ( ! this.#bulkSmushObj ) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
const isUserClick = e.clientX > 0 && e.clientY > 0 && e.isTrusted;
|
||||
if ( ! isUserClick ) {
|
||||
return;
|
||||
}
|
||||
|
||||
WP_Smush_Bulk.#resumeBulkSmush( this.#bulkSmushObj );
|
||||
} );
|
||||
}
|
||||
|
||||
ajaxBulkSmushStart( bulkSmushButton ) {
|
||||
bulkSmushButton = bulkSmushButton || $( '#wp-smush-bulk-content .wp-smush-all' );
|
||||
// Check for IDs, if there is none (unsmushed or lossless), don't call Smush function.
|
||||
/** @param {Array} wp_smushit_data.unsmushed */
|
||||
if (
|
||||
'undefined' === typeof window.wp_smushit_data ||
|
||||
( 0 === window.wp_smushit_data.unsmushed.length &&
|
||||
0 === window.wp_smushit_data.resmush.length )
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
// Disable re-Smush and scan button.
|
||||
// TODO: refine what is disabled.
|
||||
$(
|
||||
'.wp-resmush.wp-smush-action, .wp-smush-scan, .wp-smush-all:not(.sui-progress-close), a.wp-smush-lossy-enable, button.wp-smush-resize-enable, button#save-settings-button'
|
||||
).prop( 'disabled', true );
|
||||
|
||||
this.#bulkSmushObj = new Smush( bulkSmushButton, true );
|
||||
SmushProcess.setOnCancelCallback( () => {
|
||||
this.#bulkSmushObj.cancelAjax();
|
||||
} ).update( 0, this.#bulkSmushObj.ids.length ).show();
|
||||
|
||||
// Show upsell cdn.
|
||||
this.maybeShowCDNUpsellForPreSiteOnStart();
|
||||
|
||||
// Run bulk Smush.
|
||||
this.#bulkSmushObj.run();
|
||||
}
|
||||
|
||||
static #resumeBulkSmush( bulkSmushObj ) {
|
||||
SmushProcess.disableExceedLimitMode();
|
||||
SmushProcess.hideBulkSmushDescription();
|
||||
bulkSmushObj.onStart();
|
||||
bulkSmushObj.callAjax();
|
||||
}
|
||||
|
||||
onClickIgnoreImage() {
|
||||
/**
|
||||
* Ignore file from bulk Smush.
|
||||
*
|
||||
* @since 2.9.0
|
||||
*/
|
||||
$( 'body' ).on( 'click', '.smush-ignore-image', function( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
const self = $( this );
|
||||
|
||||
self.prop( 'disabled', true );
|
||||
self.attr( 'data-tooltip' );
|
||||
self.removeClass( 'sui-tooltip' );
|
||||
$.post( ajaxurl, {
|
||||
action: 'ignore_bulk_image',
|
||||
id: self.attr( 'data-id' ),
|
||||
_ajax_nonce: wp_smush_msgs.nonce,
|
||||
} ).done( ( response ) => {
|
||||
if ( self.is( 'a' ) && response.success && 'undefined' !== typeof response.data.html ) {
|
||||
if ( e.target.closest( '.smush-status-links' ) ) {
|
||||
self.closest( '.smush-status-links' ).parent().html( response.data.html );
|
||||
} else if ( e.target.closest( '.smush-bulk-error-row' ) ) {
|
||||
self.addClass( 'disabled' );
|
||||
e.target.closest( '.smush-bulk-error-row' ).style.opacity = 0.5;
|
||||
}
|
||||
}
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
onClickIgnoreAllImages() {
|
||||
/**
|
||||
* Ignore file from bulk Smush.
|
||||
*
|
||||
* @since 3.12.0
|
||||
*/
|
||||
const ignoreAll = document.querySelector( '.wp_smush_ignore_all_failed_items' );
|
||||
if ( ignoreAll ) {
|
||||
ignoreAll.onclick = ( e ) => {
|
||||
e.preventDefault();
|
||||
e.target.setAttribute( 'disabled', '' );
|
||||
e.target.style.cursor = 'progress';
|
||||
const type = e.target.dataset.type || null;
|
||||
e.target.classList.remove( 'sui-tooltip' );
|
||||
Fetcher.smush.ignoreAll( type ).then( ( res ) => {
|
||||
if ( res.success ) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
e.target.style.cursor = 'pointer';
|
||||
e.target.removeAttribute( 'disabled' );
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
} );
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
onScanCompleted() {
|
||||
document.addEventListener( 'ajaxBulkSmushOnScanCompleted', ( e ) => {
|
||||
this.ajaxBulkSmushStart();
|
||||
} );
|
||||
}
|
||||
|
||||
maybeShowCDNUpsellForPreSiteOnStart() {
|
||||
// Show upsell cdn.
|
||||
const upsell_cdn = document.querySelector( '.wp-smush-upsell-cdn' );
|
||||
if ( upsell_cdn ) {
|
||||
upsell_cdn.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
|
||||
isBulkSmushInProgress() {
|
||||
return this.#bulkSmushObj?.ids?.length > 0 && this.#bulkSmushObj.button?.hasClass( 'wp-smush-started' );
|
||||
}
|
||||
|
||||
getTotalEnqueuedImages() {
|
||||
return this.#bulkSmushObj?.total || 0;
|
||||
}
|
||||
|
||||
getCompletionPercentage() {
|
||||
const bulkSmushObj = this.#bulkSmushObj;
|
||||
if ( ! bulkSmushObj ) {
|
||||
return 0;
|
||||
}
|
||||
const totalEnqueuedImages = this.getTotalEnqueuedImages();
|
||||
const smushed = Number( bulkSmushObj.smushed ) || 0;
|
||||
const errors = Array.isArray( bulkSmushObj.errors ) ? bulkSmushObj.errors.length : 0;
|
||||
const processedImages = smushed + errors;
|
||||
|
||||
if ( totalEnqueuedImages > 0 ) {
|
||||
return Math.ceil( ( processedImages * 100 ) / totalEnqueuedImages );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
WP_Smush.bulk = new WP_Smush_Bulk();
|
||||
|
||||
}( jQuery ) );
|
||||
@@ -0,0 +1,210 @@
|
||||
// Deactivation survey.
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import tracker from '../utils/tracker';
|
||||
|
||||
export default class DeactivationSurvey {
|
||||
constructor() {
|
||||
this.reason = 'not_set';
|
||||
this.requestedAssistance = 'na';
|
||||
this.modalAction = 'close';
|
||||
this.modalId = 'wp-smush-deactivation-survey-modal';
|
||||
this.modal = document.getElementById( this.modalId );
|
||||
}
|
||||
|
||||
init() {
|
||||
if ( ! this.modal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.handleSurveyModal();
|
||||
}
|
||||
|
||||
handleSurveyModal() {
|
||||
this.deactivatePluginLink = document.querySelector( 'a[id^="deactivate-smush"]' ) || document.querySelector( 'a[id^="deactivate-wp-smushit"]' );
|
||||
if ( ! this.deactivatePluginLink ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.deactivatePluginLink.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
|
||||
// Show modal.
|
||||
this.showModal();
|
||||
|
||||
// Handle survey form.
|
||||
this.handleSurveyForm();
|
||||
} );
|
||||
}
|
||||
|
||||
handleSurveyForm() {
|
||||
this.registerRequestAssistanceLinkClickEvent();
|
||||
this.handleRadioChange();
|
||||
this.handleSkipDeactivation();
|
||||
this.handleSubmitForm();
|
||||
this.handleTrackDeactivate();
|
||||
}
|
||||
|
||||
registerRequestAssistanceLinkClickEvent() {
|
||||
const requestAssistanceLink = this.modal.querySelector( '#smush-request-assistance-link' );
|
||||
if ( requestAssistanceLink ) {
|
||||
this.requestedAssistance = 'no';
|
||||
requestAssistanceLink.addEventListener( 'click', () => {
|
||||
this.requestedAssistance = 'yes';
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
handleRadioChange() {
|
||||
const that = this;
|
||||
this.userMessageField = document.getElementById( 'smush-deactivation-user-message-field' );
|
||||
if ( ! this.userMessageField ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.modal.querySelectorAll( 'input[type="radio"]' ).forEach( ( inputRadio ) => {
|
||||
inputRadio.addEventListener( 'change', function() {
|
||||
that.reason = this.value;
|
||||
that.toggleUserMessageField( this.parentElement );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
handleSkipDeactivation() {
|
||||
const skipButton = this.modal.querySelector( '.smush-skip-deactivate-button' );
|
||||
if ( ! skipButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
skipButton.addEventListener( 'click', ( e ) => {
|
||||
e.target.classList.add( 'sui-button-onload' );
|
||||
|
||||
this.modalAction = 'skip';
|
||||
// Close modal and track on closed event.
|
||||
this.closeModal();
|
||||
|
||||
// Deactivate the plugin when tracking is disabled; otherwise, handle it after tracking.
|
||||
// @see this.trackDeactivate().
|
||||
if ( ! tracker.allowToTrack() ) {
|
||||
this.redirectToDeactivateLink();
|
||||
}
|
||||
}, { once: true } );
|
||||
}
|
||||
|
||||
handleSubmitForm() {
|
||||
const submitButton = this.modal.querySelector( '.smush-submit-deactivate-button' );
|
||||
if ( ! submitButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
submitButton.addEventListener( 'click', ( e ) => {
|
||||
e.target.classList.add( 'sui-button-onload' );
|
||||
|
||||
this.modalAction = 'submit';
|
||||
// Close modal and track on closed event.
|
||||
this.closeModal();
|
||||
|
||||
// Plugin deactivation has been handled after tracking.
|
||||
// @see this.trackDeactivate().
|
||||
}, { once: true } );
|
||||
}
|
||||
|
||||
toggleUserMessageField( labelField ) {
|
||||
if ( ! this.userMessageField ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove current user message field.
|
||||
this.userMessageField.remove();
|
||||
|
||||
const placeholder = labelField.dataset?.placeholder;
|
||||
if ( ! placeholder ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update placeholder.
|
||||
const textarea = this.userMessageField.querySelector( 'textarea' );
|
||||
textarea.placeholder = placeholder;
|
||||
|
||||
// Append user message field.
|
||||
labelField.after( this.userMessageField );
|
||||
this.userMessageField.classList.remove( 'sui-hidden' );
|
||||
|
||||
// Focus on textarea.
|
||||
textarea.focus();
|
||||
}
|
||||
|
||||
getDeactivateLink() {
|
||||
return this.deactivatePluginLink.href;
|
||||
}
|
||||
|
||||
showModal() {
|
||||
const focusAfterClosed = 'wpbody-content',
|
||||
focusWhenOpen = undefined,
|
||||
hasOverlayMask = true,
|
||||
isCloseOnEsc = false,
|
||||
isAnimated = true;
|
||||
|
||||
window.SUI?.openModal(
|
||||
this.modalId,
|
||||
focusAfterClosed,
|
||||
focusWhenOpen,
|
||||
hasOverlayMask,
|
||||
isCloseOnEsc,
|
||||
isAnimated
|
||||
);
|
||||
}
|
||||
|
||||
closeModal() {
|
||||
window.SUI?.closeModal( true );
|
||||
}
|
||||
|
||||
handleTrackDeactivate() {
|
||||
this.modal.addEventListener( 'afterClose', () => this.trackDeactivate(), { once: true } );
|
||||
}
|
||||
|
||||
trackDeactivate() {
|
||||
if ( ! this.shouldTrack() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const event = 'Deactivation Survey';
|
||||
const textarea = this.userMessageField.querySelector( 'textarea' );
|
||||
const message = textarea.value;
|
||||
const properties = {
|
||||
Reason: this.reason,
|
||||
Message: message,
|
||||
'Modal Action': this.modalAction,
|
||||
'Requested Assistance': this.requestedAssistance,
|
||||
'Tracking Status': tracker.allowToTrack() ? 'opted_in' : 'opted_out',
|
||||
};
|
||||
|
||||
Fetcher.common.request( {
|
||||
action: 'smush_track_deactivate',
|
||||
event,
|
||||
properties,
|
||||
} ).finally( () => {
|
||||
if ( this.shouldDeactivatePlugin() ) {
|
||||
this.redirectToDeactivateLink();
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
shouldTrack() {
|
||||
return tracker.allowToTrack() || this.isSubmitAction();
|
||||
}
|
||||
|
||||
isSubmitAction() {
|
||||
return 'submit' === this.modalAction;
|
||||
}
|
||||
|
||||
shouldDeactivatePlugin() {
|
||||
const skipAndDeactivate = 'skip' === this.modalAction;
|
||||
|
||||
return skipAndDeactivate || this.isSubmitAction();
|
||||
}
|
||||
|
||||
redirectToDeactivateLink() {
|
||||
const deactivateLink = this.getDeactivateLink();
|
||||
window.location.href = deactivateLink;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,284 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* Directory Smush module JavaScript code.
|
||||
*
|
||||
* @since 2.8.1 Separated from admin.js into dedicated file.
|
||||
*/
|
||||
|
||||
import { createTree } from 'jquery.fancytree';
|
||||
import Scanner from '../smush/directory-scanner';
|
||||
|
||||
( function( $ ) {
|
||||
'use strict';
|
||||
|
||||
WP_Smush.directory = {
|
||||
selected: [],
|
||||
tree: [],
|
||||
wp_smush_msgs: [],
|
||||
triggered: false,
|
||||
|
||||
init() {
|
||||
const self = this,
|
||||
progressDialog = $( '#wp-smush-progress-dialog' );
|
||||
|
||||
let totalSteps = 0,
|
||||
currentScanStep = 0;
|
||||
|
||||
// Make sure directory smush vars are set.
|
||||
if ( typeof window.wp_smushit_data.dir_smush !== 'undefined' ) {
|
||||
totalSteps = window.wp_smushit_data.dir_smush.totalSteps;
|
||||
currentScanStep =
|
||||
window.wp_smushit_data.dir_smush.currentScanStep;
|
||||
}
|
||||
|
||||
// Init image scanner.
|
||||
this.scanner = new Scanner( totalSteps, currentScanStep );
|
||||
|
||||
/**
|
||||
* Smush translation strings.
|
||||
*
|
||||
* @param {Array} wp_smush_msgs
|
||||
*/
|
||||
this.wp_smush_msgs = window.wp_smush_msgs || {};
|
||||
|
||||
/**
|
||||
* Open the "Select Smush directory" modal.
|
||||
*/
|
||||
$( 'button.wp-smush-browse, a#smush-directory-open-modal' ).on(
|
||||
'click',
|
||||
function( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
if ( $( e.currentTarget ).hasClass( 'wp-smush-browse' ) ) {
|
||||
// Hide all the notices.
|
||||
$( 'div.wp-smush-scan-result div.wp-smush-notice' ).hide();
|
||||
|
||||
// Remove notice.
|
||||
$( 'div.wp-smush-info' ).remove();
|
||||
}
|
||||
|
||||
window.SUI.openModal(
|
||||
'wp-smush-list-dialog',
|
||||
e.currentTarget,
|
||||
$(
|
||||
'#wp-smush-list-dialog .sui-box-header [data-modal-close]'
|
||||
)[0],
|
||||
true
|
||||
);
|
||||
//Display File tree for Directory Smush
|
||||
self.initFileTree();
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Smush images: Smush in Choose Directory modal clicked
|
||||
*/
|
||||
$( '#wp-smush-select-dir' ).on( 'click', function( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
$( 'div.wp-smush-list-dialog div.sui-box-body' ).css( {
|
||||
opacity: '0.8',
|
||||
} );
|
||||
$( 'div.wp-smush-list-dialog div.sui-box-body a' ).off(
|
||||
'click'
|
||||
);
|
||||
|
||||
const button = $( this );
|
||||
|
||||
// Display the spinner.
|
||||
button.addClass('sui-button-onload');
|
||||
|
||||
const selectedFolders = self.tree.getSelectedNodes();
|
||||
|
||||
const paths = [];
|
||||
selectedFolders.forEach( function( folder ) {
|
||||
paths.push( folder.key );
|
||||
} );
|
||||
|
||||
// Send a ajax request to get a list of all the image files
|
||||
const param = {
|
||||
action: 'image_list',
|
||||
smush_path: paths,
|
||||
image_list_nonce: $(
|
||||
'input[name="image_list_nonce"]'
|
||||
).val(),
|
||||
};
|
||||
|
||||
$.post( ajaxurl, param, function( response ) {
|
||||
if ( response.success ) {
|
||||
// Close the modal.
|
||||
window.SUI.closeModal();
|
||||
|
||||
self.scanner = new Scanner( response.data, 0 );
|
||||
self.showProgressDialog( response.data );
|
||||
self.scanner.scan();
|
||||
} else {
|
||||
// Remove the spinner.
|
||||
button.removeClass('sui-button-onload');
|
||||
|
||||
window.SUI.openNotice(
|
||||
'wp-smush-ajax-notice',
|
||||
response.data.message,
|
||||
{ type: 'warning' }
|
||||
);
|
||||
}
|
||||
} );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Cancel scan.
|
||||
*/
|
||||
progressDialog.on(
|
||||
'click',
|
||||
'#cancel-directory-smush, #dialog-close-div, .wp-smush-cancel-dir',
|
||||
function( e ) {
|
||||
e.preventDefault();
|
||||
// Display the spinner
|
||||
$( '.wp-smush-cancel-dir' ).addClass( 'sui-button-onload' );
|
||||
self.scanner
|
||||
.cancel()
|
||||
.done(
|
||||
() => {
|
||||
const directorySmushUrl = `${ self.wp_smush_msgs.bulk_smush_url }&smush__directory-scan=done#directory_smush-settings-row`;
|
||||
if ( window.location.href === directorySmushUrl ) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
window.location.href = directorySmushUrl;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Continue scan.
|
||||
*/
|
||||
progressDialog.on(
|
||||
'click',
|
||||
'.sui-icon-play, .wp-smush-resume-scan',
|
||||
function( e ) {
|
||||
e.preventDefault();
|
||||
self.scanner.resume();
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Check to see if we should open the directory module.
|
||||
* Used to redirect from dashboard page.
|
||||
*
|
||||
* @since 3.8.6
|
||||
*/
|
||||
const queryString = window.location.search;
|
||||
const urlParams = new URLSearchParams( queryString );
|
||||
if ( urlParams.has( 'smush__directory-start' ) && ! this.triggered ) {
|
||||
this.triggered = true;
|
||||
$( 'button.wp-smush-browse' ).trigger( 'click' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Init fileTree.
|
||||
*/
|
||||
initFileTree() {
|
||||
const self = this,
|
||||
smushButton = $( 'button#wp-smush-select-dir' ),
|
||||
ajaxSettings = {
|
||||
type: 'GET',
|
||||
url: ajaxurl,
|
||||
data: {
|
||||
action: 'smush_get_directory_list',
|
||||
list_nonce: $( 'input[name="list_nonce"]' ).val(),
|
||||
},
|
||||
cache: false,
|
||||
};
|
||||
|
||||
// Object already defined.
|
||||
if ( Object.entries( self.tree ).length > 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.tree = createTree( '.wp-smush-list-dialog .content', {
|
||||
autoCollapse: true, // Automatically collapse all siblings, when a node is expanded
|
||||
clickFolderMode: 3, // 1:activate, 2:expand, 3:activate and expand, 4:activate (dblclick expands)
|
||||
checkbox: true, // Show checkboxes
|
||||
debugLevel: 0, // 0:quiet, 1:errors, 2:warnings, 3:infos, 4:debug
|
||||
selectMode: 3, // 1:single, 2:multi, 3:multi-hier
|
||||
tabindex: '0', // Whole tree behaves as one single control
|
||||
keyboard: true, // Support keyboard navigation
|
||||
quicksearch: true, // Navigate to next node by typing the first letters
|
||||
source: ajaxSettings,
|
||||
lazyLoad: ( event, data ) => {
|
||||
data.result = new Promise( function( resolve, reject ) {
|
||||
ajaxSettings.data.dir = data.node.key;
|
||||
$.ajax( ajaxSettings )
|
||||
.done( ( response ) => resolve( response ) )
|
||||
.fail( reject );
|
||||
} );
|
||||
},
|
||||
loadChildren: ( event, data ) =>
|
||||
data.node.fixSelection3AfterClick(), // Apply parent's state to new child nodes:
|
||||
select: () =>
|
||||
smushButton.prop(
|
||||
'disabled',
|
||||
! +self.tree.getSelectedNodes().length
|
||||
),
|
||||
init: () => smushButton.prop( 'disabled', true ),
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Show progress dialog.
|
||||
*
|
||||
* @param {number} items Number of items in the scan.
|
||||
*/
|
||||
showProgressDialog( items ) {
|
||||
// Update items status and show the progress dialog..
|
||||
$( '.wp-smush-progress-dialog .sui-progress-state-text' ).html(
|
||||
'0/' + items + ' ' + self.wp_smush_msgs.progress_smushed
|
||||
);
|
||||
|
||||
window.SUI.openModal(
|
||||
'wp-smush-progress-dialog',
|
||||
'dialog-close-div',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update progress bar during directory smush.
|
||||
*
|
||||
* @param {number} progress Current progress in percent.
|
||||
* @param {boolean} cancel Cancel status.
|
||||
*/
|
||||
updateProgressBar( progress, cancel = false ) {
|
||||
if ( progress > 100 ) {
|
||||
progress = 100;
|
||||
}
|
||||
|
||||
// Update progress bar
|
||||
$( '.sui-progress-block .sui-progress-text span' ).text(
|
||||
progress + '%'
|
||||
);
|
||||
$( '.sui-progress-block .sui-progress-bar span' ).width(
|
||||
progress + '%'
|
||||
);
|
||||
|
||||
if ( progress >= 90 ) {
|
||||
$( '.sui-progress-state .sui-progress-state-text' ).text(
|
||||
'Finalizing...'
|
||||
);
|
||||
}
|
||||
|
||||
if ( cancel ) {
|
||||
$( '.sui-progress-state .sui-progress-state-text' ).text(
|
||||
'Cancelling...'
|
||||
);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
WP_Smush.directory.init();
|
||||
}( jQuery ) );
|
||||
@@ -0,0 +1,105 @@
|
||||
// Disconnect Site.
|
||||
/* global WP_Smush */
|
||||
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import tracker from '../utils/tracker';
|
||||
|
||||
class DisconnectSite {
|
||||
constructor() {
|
||||
document.addEventListener( 'DOMContentLoaded', () => {
|
||||
this.modalAction = 'cancel';
|
||||
this.modalId = 'smush-disconnect-site-modal';
|
||||
this.modal = document.getElementById( this.modalId );
|
||||
|
||||
this._onAfterClose = this.trackDisconnectSite.bind( this );
|
||||
if ( this.modal ) {
|
||||
this.modal.addEventListener( 'afterClose', this._onAfterClose, { once: true } );
|
||||
document.addEventListener( 'onSavedSmushSettings', ( e ) => {
|
||||
const usage = document.getElementById( 'usage' );
|
||||
if ( usage ) {
|
||||
tracker.setAllowToTrack( usage.checked );
|
||||
}
|
||||
} );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
trackDisconnectSite() {
|
||||
const textarea = document.getElementById( 'smush-disconnect-site-message' );
|
||||
const message = textarea.value.trim();
|
||||
const skipMessage = message.length === 0;
|
||||
|
||||
if ( skipMessage && this.isSubmitAction() ) {
|
||||
this.setModalAction( 'skip' );
|
||||
}
|
||||
|
||||
if ( ! this.shouldTrack() ) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
const event = 'Disconnect Site';
|
||||
const properties = {
|
||||
'User Message': message,
|
||||
'Modal Action': this.modalAction,
|
||||
'Tracking Status': tracker.allowToTrack() ? 'opted_in' : 'opted_out',
|
||||
};
|
||||
|
||||
return tracker.setAllowToTrack( true ).track( event, properties );
|
||||
}
|
||||
|
||||
shouldTrack() {
|
||||
return tracker.allowToTrack() || this.isSubmitAction();
|
||||
}
|
||||
|
||||
isSubmitAction() {
|
||||
return 'submit' === this.modalAction;
|
||||
}
|
||||
|
||||
setModalAction( action ) {
|
||||
this.modalAction = action;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
closeModal() {
|
||||
if ( ! this.modal ) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return new Promise( ( resolve ) => {
|
||||
// Ensure only one event listener is active.
|
||||
this.modal.removeEventListener( 'afterClose', this._onAfterClose );
|
||||
this.modal.addEventListener( 'afterClose', async () => {
|
||||
await this.trackDisconnectSite();
|
||||
resolve();
|
||||
}, { once: true } );
|
||||
|
||||
window.SUI?.closeModal( true );
|
||||
} );
|
||||
}
|
||||
|
||||
disconnect( btn ) {
|
||||
if ( btn ) {
|
||||
btn.classList.add( 'sui-button-onload-text' );
|
||||
}
|
||||
|
||||
return Fetcher.settings.disconnectSite().then( async ( res ) => {
|
||||
if ( res.success ) {
|
||||
await this.setModalAction( 'submit' ).closeModal();
|
||||
window.location.search = window.location.search + `&smush-notice=site-disconnected`;
|
||||
} else {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
WP_Smush.helpers.showNotice( error );
|
||||
} ).finally( () => {
|
||||
if ( btn ) {
|
||||
btn.classList.remove( 'sui-button-onload-text' );
|
||||
}
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
const disconnectSite = new DisconnectSite();
|
||||
|
||||
export default disconnectSite;
|
||||
@@ -0,0 +1,328 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
/* global wp_smush_msgs */
|
||||
|
||||
/**
|
||||
* Helpers functions.
|
||||
*
|
||||
* @since 2.9.0 Moved from admin.js
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
|
||||
WP_Smush.helpers = {
|
||||
init: () => {},
|
||||
cacheUpsellErrorCodes: [],
|
||||
|
||||
/**
|
||||
* Convert bytes to human-readable form.
|
||||
*
|
||||
* @param {number} a Bytes
|
||||
* @param {number} b Number of digits
|
||||
* @return {*} Formatted Bytes
|
||||
*/
|
||||
formatBytes: ( a, b ) => {
|
||||
const thresh = 1024,
|
||||
units = [ 'KB', 'MB', 'GB', 'TB', 'PB' ];
|
||||
|
||||
if ( Math.abs( a ) < thresh ) {
|
||||
return a + ' B';
|
||||
}
|
||||
|
||||
let u = -1;
|
||||
|
||||
do {
|
||||
a /= thresh;
|
||||
++u;
|
||||
} while ( Math.abs( a ) >= thresh && u < units.length - 1 );
|
||||
|
||||
return a.toFixed( b ) + ' ' + units[ u ];
|
||||
},
|
||||
|
||||
/**
|
||||
* Get size from a string.
|
||||
*
|
||||
* @param {string} formattedSize Formatter string
|
||||
* @return {*} Formatted Bytes
|
||||
*/
|
||||
getSizeFromString: ( formattedSize ) => {
|
||||
return formattedSize.replace( /[a-zA-Z]/g, '' ).trim();
|
||||
},
|
||||
|
||||
/**
|
||||
* Get type from formatted string.
|
||||
*
|
||||
* @param {string} formattedSize Formatted string
|
||||
* @return {*} Formatted Bytes
|
||||
*/
|
||||
getFormatFromString: ( formattedSize ) => {
|
||||
return formattedSize.replace( /[0-9.]/g, '' ).trim();
|
||||
},
|
||||
|
||||
/**
|
||||
* Stackoverflow: http://stackoverflow.com/questions/1726630/formatting-a-number-with-exactly-two-decimals-in-javascript
|
||||
*
|
||||
* @param {number} num
|
||||
* @param {number} decimals
|
||||
* @return {number} Number
|
||||
*/
|
||||
precise_round: ( num, decimals ) => {
|
||||
const sign = num >= 0 ? 1 : -1;
|
||||
// Keep the percentage below 100.
|
||||
num = num > 100 ? 100 : num;
|
||||
return (
|
||||
Math.round( num * Math.pow( 10, decimals ) + sign * 0.001 ) /
|
||||
Math.pow( 10, decimals )
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Displays a floating error message using the #wp-smush-ajax-notice container.
|
||||
*
|
||||
* @since 3.8.0
|
||||
*
|
||||
* @param {string} message
|
||||
*/
|
||||
showErrorNotice: ( message ) => {
|
||||
if ( 'undefined' === typeof message ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const noticeMessage = `<p>${ message }</p>`,
|
||||
noticeOptions = {
|
||||
type: 'error',
|
||||
icon: 'info',
|
||||
};
|
||||
|
||||
SUI.openNotice( 'wp-smush-ajax-notice', noticeMessage, noticeOptions );
|
||||
|
||||
const loadingButton = document.querySelector( '.sui-button-onload' );
|
||||
if ( loadingButton ) {
|
||||
loadingButton.classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset settings.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
resetSettings: () => {
|
||||
const _nonce = document.getElementById( 'wp_smush_reset' );
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=reset_settings', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
window.location.href = wp_smush_msgs.smush_url;
|
||||
}
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send( '_ajax_nonce=' + _nonce.value );
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare error row. Will only allow to hide errors for WP media attachments (not nextgen).
|
||||
*
|
||||
* @since 1.9.0
|
||||
* @since 3.12.0 Moved from Smush.
|
||||
*
|
||||
* @param {string} errorMsg Error message.
|
||||
* @param {string} fileName File name.
|
||||
* @param {string} thumbnail Thumbnail for image (if available).
|
||||
* @param {number} id Image ID.
|
||||
* @param {string} type Smush type: media or netxgen.
|
||||
* @param {string} errorCode Error code.
|
||||
*
|
||||
* @return {string} Row with error.
|
||||
*/
|
||||
prepareBulkSmushErrorRow: (errorMsg, fileName, thumbnail, id, type, errorCode) => {
|
||||
const thumbDiv =
|
||||
thumbnail && 'undefined' !== typeof thumbnail ?
|
||||
`<img class="attachment-thumbnail" src="${thumbnail}" />` :
|
||||
'<i class="sui-icon-photo-picture" aria-hidden="true"></i>';
|
||||
const editLink = window.wp_smush_msgs.edit_link.replace('{{id}}', id);
|
||||
fileName =
|
||||
'undefined' === fileName || 'undefined' === typeof fileName ?
|
||||
'undefined' :
|
||||
fileName;
|
||||
|
||||
let tableDiv =
|
||||
`<div class="smush-bulk-error-row" data-error-code="${errorCode}">
|
||||
<div class="smush-bulk-image-data">
|
||||
<div class="smush-bulk-image-title">
|
||||
${ thumbDiv }
|
||||
<span class="smush-image-name">
|
||||
<a href="${editLink}">${fileName}</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="smush-image-error">
|
||||
${errorMsg}
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
if ('media' === type) {
|
||||
tableDiv +=
|
||||
`<div class="smush-bulk-image-actions">
|
||||
<a href="javascript:void(0)" class="sui-tooltip sui-tooltip-constrained sui-tooltip-left smush-ignore-image" data-tooltip="${window.wp_smush_msgs.error_ignore}" data-id="${id}">
|
||||
${window.wp_smush_msgs.btn_ignore}
|
||||
</a>
|
||||
<a class="smush-link-detail" href="${editLink}">
|
||||
${window.wp_smush_msgs.view_detail}
|
||||
</a>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
tableDiv += '</div>';
|
||||
|
||||
tableDiv += WP_Smush.helpers.upsellWithError( errorCode );
|
||||
|
||||
return tableDiv;
|
||||
},
|
||||
cacheUpsellErrorCode( errorCode ) {
|
||||
this.cacheUpsellErrorCodes.push( errorCode );
|
||||
},
|
||||
/**
|
||||
* Get upsell base on error code.
|
||||
* @param {string} errorCode Error code.
|
||||
* @returns {string}
|
||||
*/
|
||||
upsellWithError(errorCode) {
|
||||
if (
|
||||
!errorCode
|
||||
|| !window.wp_smush_msgs['error_' + errorCode]
|
||||
|| this.isUpsellRendered( errorCode )
|
||||
) {
|
||||
return '';
|
||||
}
|
||||
this.cacheRenderedUpsell( errorCode );
|
||||
|
||||
return '<div class="smush-bulk-error-row smush-error-upsell">' +
|
||||
'<div class="smush-bulk-image-title">' +
|
||||
'<span class="smush-image-error">' +
|
||||
window.wp_smush_msgs['error_' + errorCode] +
|
||||
'</span>' +
|
||||
'</div></div>';
|
||||
},
|
||||
// Do not use arrow function to use `this`.
|
||||
isUpsellRendered( errorCode ) {
|
||||
return this.cacheUpsellErrorCodes.includes( errorCode );
|
||||
},
|
||||
// Do not use arrow function to use `this`.
|
||||
cacheRenderedUpsell( errorCode ) {
|
||||
this.cacheUpsellErrorCodes.push( errorCode );
|
||||
},
|
||||
/**
|
||||
* Get error message from Ajax response or Error.
|
||||
* @param {Object} resp
|
||||
*/
|
||||
getErrorMessage: ( resp ) => {
|
||||
return resp.message || resp.data && resp.data.message ||
|
||||
resp.responseJSON && resp.responseJSON.data && resp.responseJSON.data.message ||
|
||||
window.wp_smush_msgs.generic_ajax_error ||
|
||||
resp.status && 'Request failed. Returned status of ' + resp.status
|
||||
},
|
||||
|
||||
/**
|
||||
* Displays a floating message from response,
|
||||
* using the #wp-smush-ajax-notice container.
|
||||
*
|
||||
* @param {Object|string} notice
|
||||
* @param {Object} noticeOptions
|
||||
*/
|
||||
showNotice: function( notice, noticeOptions ) {
|
||||
let message;
|
||||
if ( 'object' === typeof notice ) {
|
||||
message = this.getErrorMessage( notice );
|
||||
} else {
|
||||
message = notice;
|
||||
}
|
||||
|
||||
if ( ! message ) {
|
||||
return;
|
||||
}
|
||||
|
||||
noticeOptions = noticeOptions || {};
|
||||
noticeOptions = Object.assign({
|
||||
showdismiss: false,
|
||||
autoclose: true,
|
||||
},noticeOptions);
|
||||
noticeOptions = {
|
||||
type: noticeOptions.type || 'error',
|
||||
icon: noticeOptions.icon || ( 'success' === noticeOptions.type ? 'check-tick' : 'info' ),
|
||||
dismiss: {
|
||||
show: noticeOptions.showdismiss,
|
||||
label: window.wp_smush_msgs.noticeDismiss,
|
||||
tooltip: window.wp_smush_msgs.noticeDismissTooltip,
|
||||
},
|
||||
autoclose: {
|
||||
show: noticeOptions.autoclose
|
||||
}
|
||||
};
|
||||
|
||||
const noticeMessage = `<p>${ message }</p>`;
|
||||
|
||||
SUI.openNotice( 'wp-smush-ajax-notice', noticeMessage, noticeOptions );
|
||||
return Promise.resolve( '#wp-smush-ajax-notice' );
|
||||
},
|
||||
closeNotice() {
|
||||
window.SUI.closeNotice( 'wp-smush-ajax-notice' );
|
||||
},
|
||||
renderActivationCDNNotice: function( noticeMessage ) {
|
||||
const animatedNotice = document.getElementById('wp-smush-animated-upsell-notice');
|
||||
if ( animatedNotice ) {
|
||||
return;
|
||||
}
|
||||
const upsellHtml = `<div class="sui-notice sui-notice-info sui-margin-top" id="wp-smush-animated-upsell-notice">
|
||||
<div class="sui-notice-content">
|
||||
<div class="sui-notice-message">
|
||||
<i class="sui-notice-icon sui-icon-info" aria-hidden="true"></i>
|
||||
<p>${noticeMessage}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
document.querySelector( '#smush-box-bulk .wp-smush-bulk-wrapper' ).outerHTML += upsellHtml;
|
||||
},
|
||||
redirectToPage( page ) {
|
||||
page = `page=smush-${page}`;
|
||||
if ( window.location.href.includes( page ) ) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
window.location.search = page;
|
||||
}
|
||||
},
|
||||
showModal( modalId, options = {} ) {
|
||||
if ( ! window.SUI ) {
|
||||
return;
|
||||
}
|
||||
|
||||
options = Object.assign( {
|
||||
focusAfterClosed: 'wpbody-content',
|
||||
focusWhenOpen: undefined,
|
||||
hasOverlayMask: false,
|
||||
isCloseOnEsc: false,
|
||||
isAnimated: true,
|
||||
}, options );
|
||||
|
||||
window.SUI.openModal(
|
||||
modalId,
|
||||
options.focusAfterClosed,
|
||||
options.focusWhenOpen,
|
||||
options.hasOverlayMask,
|
||||
options.isCloseOnEsc,
|
||||
options.isAnimated
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
WP_Smush.helpers.init();
|
||||
}() );
|
||||
@@ -0,0 +1,440 @@
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* Scan Media Library.
|
||||
*
|
||||
*/
|
||||
import SmushProgress from '../common/progressbar';
|
||||
import MediaLibraryScanner from '../common/media-library-scanner';
|
||||
import { GlobalStats } from '../common/globalStats';
|
||||
|
||||
( function() {
|
||||
'use strict';
|
||||
if ( ! window.wp_smush_msgs ) {
|
||||
return;
|
||||
}
|
||||
const $ = document.querySelector.bind( document );
|
||||
const existScanProgressBar = $( '.wp-smush-scan-progress-bar-wrapper' );
|
||||
if ( ! existScanProgressBar ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const recheckImagesBtn = $( '.wp-smush-scan' );
|
||||
if ( ! recheckImagesBtn ) {
|
||||
return;
|
||||
}
|
||||
const bulkSmushButton = $( '.wp-smush-bo-start' ) || $( '.wp-smush-bulk-wrapper .wp-smush-all' );
|
||||
const { __ } = wp.i18n;
|
||||
|
||||
class MediaLibraryScannerOnBulkSmush extends MediaLibraryScanner {
|
||||
constructor() {
|
||||
super();
|
||||
this.runBulkSmushOnComplete = false;
|
||||
this.restoreButton = $( '.wp-smush-restore' );
|
||||
this.autoBulkSmushNotification = $( '.wp-smush-auto-bulk-smush-notification' );
|
||||
}
|
||||
|
||||
startScanThenBulkSmushOnComplete() {
|
||||
this.runBulkSmushOnComplete = true;
|
||||
this.startScan( true );
|
||||
}
|
||||
|
||||
onStart() {
|
||||
this.hideRecheckNotice();
|
||||
this.hideFailedBulkSmushNotice();
|
||||
this.disableRelatedButtons();
|
||||
this.setRecheckImagesButtonOnLoad();
|
||||
this.toggleBulkSmushBoxContent();
|
||||
return this;
|
||||
}
|
||||
|
||||
onStartFailure( response ) {
|
||||
super.onStartFailure( response );
|
||||
this.revertRelatedButtons();
|
||||
}
|
||||
|
||||
onCloseProgressBar() {
|
||||
this.maybeHideAutoBulkSmushNotification();
|
||||
}
|
||||
|
||||
disableRelatedButtons() {
|
||||
this.restoreButton.setAttribute( 'disabled', true );
|
||||
if ( bulkSmushButton ) {
|
||||
bulkSmushButton.setAttribute( 'disabled', true );
|
||||
this.setInnerText( bulkSmushButton, __( 'Waiting for Re-check to finish', 'wp-smushit' ) );
|
||||
}
|
||||
}
|
||||
|
||||
revertRelatedButtons() {
|
||||
if ( bulkSmushButton ) {
|
||||
bulkSmushButton.removeAttribute( 'disabled' );
|
||||
this.revertInnerText( bulkSmushButton );
|
||||
}
|
||||
this.restoreButton.removeAttribute( 'disabled' );
|
||||
this.revertRecheckImagesButton();
|
||||
return this;
|
||||
}
|
||||
|
||||
setRecheckImagesButtonOnLoad() {
|
||||
// recheckImagesBtn.classList.add( 'sui-button-onload' );
|
||||
this.disableRecheckImagesButton();
|
||||
this.setInnerText( recheckImagesBtn.querySelector( '.wp-smush-inner-text' ), __( 'Checking Images', 'wp-smushit' ) );
|
||||
}
|
||||
|
||||
disableRecheckImagesButton() {
|
||||
recheckImagesBtn.setAttribute( 'disabled', true );
|
||||
}
|
||||
|
||||
revertRecheckImagesButton() {
|
||||
// recheckImagesBtn.classList.remove( 'sui-button-onload' );
|
||||
recheckImagesBtn.removeAttribute( 'disabled' );
|
||||
this.revertInnerText( recheckImagesBtn.querySelector( '.wp-smush-inner-text' ) );
|
||||
}
|
||||
|
||||
beforeUpdateStatus( stats ) {
|
||||
this.runBulkSmushOnComplete = stats?.optimize_on_scan_completed;
|
||||
this.maybeShowAutoBulkSmushNotification();
|
||||
}
|
||||
|
||||
onDead( stats ) {
|
||||
super.onDead( stats );
|
||||
this.revertRelatedButtons();
|
||||
this.setRequiredScanForBulkSmushButton();
|
||||
}
|
||||
|
||||
onFinish( stats ) {
|
||||
const globalStats = stats.global_stats;
|
||||
super.onFinish( stats );
|
||||
this.revertRelatedButtons();
|
||||
this.toggleBulkSmushDescription( globalStats );
|
||||
if ( globalStats.is_outdated ) {
|
||||
this.setRequiredScanForBulkSmushButton();
|
||||
} else {
|
||||
this.removeScanEventFromBulkSmushButton();
|
||||
}
|
||||
|
||||
this.revertRecheckWarning();
|
||||
}
|
||||
|
||||
onCompleted( stats ) {
|
||||
const requiredReloadPage = ! bulkSmushButton;
|
||||
if ( requiredReloadPage ) {
|
||||
window.location.reload();
|
||||
return;
|
||||
}
|
||||
this.onFinish( stats );
|
||||
const globalStats = stats.global_stats;
|
||||
const allImagesSmushed = globalStats.remaining_count < 1;
|
||||
if ( allImagesSmushed ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! this.runBulkSmushOnComplete ) {
|
||||
this.showRecheckNoticeSuccess();
|
||||
return;
|
||||
}
|
||||
this.runBulkSmushOnComplete = false;
|
||||
|
||||
this.triggerBulkSmushEvent( stats );
|
||||
}
|
||||
|
||||
showNotice( stats ) {
|
||||
if ( ! stats.notice ) {
|
||||
return;
|
||||
}
|
||||
let type = 'success';
|
||||
if ( 'undefined' !== typeof stats.noticeType ) {
|
||||
type = stats.noticeType;
|
||||
}
|
||||
window.SUI.openNotice(
|
||||
'wp-smush-ajax-notice',
|
||||
'<p>' + stats.notice + '</p>',
|
||||
{ type, icon: 'check-tick' }
|
||||
);
|
||||
}
|
||||
|
||||
showRecheckNoticeSuccess() {
|
||||
const recheckNotice = $( '.wp-smush-recheck-images-notice-box' );
|
||||
if ( ! recheckNotice ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.hideFailedBulkSmushNotice();
|
||||
this.showAnElement( recheckNotice );
|
||||
this.hideAnElement( recheckNotice.querySelector( '.wp-smush-recheck-images-notice-warning' ) );
|
||||
this.showAnElement( recheckNotice.querySelector( '.wp-smush-recheck-images-notice-success' ) );
|
||||
}
|
||||
|
||||
showRecheckNoticeWarning() {
|
||||
const recheckNotice = $( '.wp-smush-recheck-images-notice-box' );
|
||||
if ( ! recheckNotice ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.hideFailedBulkSmushNotice();
|
||||
this.showAnElement( recheckNotice );
|
||||
this.hideAnElement( recheckNotice.querySelector( '.wp-smush-recheck-images-notice-success' ) );
|
||||
this.showAnElement( recheckNotice.querySelector( '.wp-smush-recheck-images-notice-warning' ) );
|
||||
}
|
||||
|
||||
hideRecheckNotice() {
|
||||
this.hideAnElement( $( '.wp-smush-recheck-images-notice-box' ) );
|
||||
}
|
||||
|
||||
hideFailedBulkSmushNotice() {
|
||||
this.hideAnElement( $( '#smush-box-inline-retry-bulk-smush-notice' ) );
|
||||
}
|
||||
|
||||
showProgressErrorNoticeOnRecheckNotice() {
|
||||
const recheckWarningElement = $( '.wp-smush-recheck-images-notice-box .wp-smush-recheck-images-notice-warning' );
|
||||
if ( ! recheckWarningElement ) {
|
||||
return;
|
||||
}
|
||||
recheckWarningElement.classList.add( 'sui-notice-error' );
|
||||
recheckWarningElement.classList.remove( 'sui-notice-warning' );
|
||||
this.showRecheckNoticeWarning();
|
||||
}
|
||||
|
||||
revertRecheckWarning() {
|
||||
const recheckWarningElement = $( '.wp-smush-recheck-images-notice-box .wp-smush-recheck-images-notice-warning' );
|
||||
if ( ! recheckWarningElement ) {
|
||||
return;
|
||||
}
|
||||
recheckWarningElement.classList.add( 'sui-notice-warning' );
|
||||
recheckWarningElement.classList.remove( 'sui-notice-error' );
|
||||
this.revertInnerText( recheckWarningElement.querySelector( 'span' ) );
|
||||
}
|
||||
|
||||
triggerBulkSmushEvent( stats ) {
|
||||
this.disableRecheckImagesButton();
|
||||
|
||||
if ( stats.enabled_background_process ) {
|
||||
this.triggerBackgroundBulkSmushEvent( stats.global_stats );
|
||||
} else {
|
||||
this.triggerAjaxBulkSmushEvent( stats.global_stats );
|
||||
}
|
||||
}
|
||||
|
||||
toggleBulkSmushDescription( globalStats ) {
|
||||
if ( SmushProgress.isEmptyObject ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( globalStats.remaining_count < 1 ) {
|
||||
SmushProgress.hideBulkSmushDescription();
|
||||
SmushProgress.showBulkSmushAllDone();
|
||||
} else {
|
||||
SmushProgress.showBulkSmushDescription();
|
||||
SmushProgress.hideBulkSmushAllDone();
|
||||
}
|
||||
}
|
||||
|
||||
setRequiredScanForBulkSmushButton() {
|
||||
bulkSmushButton && bulkSmushButton.classList.add( 'wp-smush-scan-and-bulk-smush' );
|
||||
}
|
||||
|
||||
removeScanEventFromBulkSmushButton() {
|
||||
bulkSmushButton && bulkSmushButton.classList.remove( 'wp-smush-scan-and-bulk-smush' );
|
||||
}
|
||||
|
||||
triggerBackgroundBulkSmushEvent( globalStats ) {
|
||||
document.dispatchEvent(
|
||||
new CustomEvent( 'backgroundBulkSmushOnScanCompleted', {
|
||||
detail: globalStats
|
||||
} )
|
||||
);
|
||||
}
|
||||
|
||||
triggerAjaxBulkSmushEvent( globalStats ) {
|
||||
document.dispatchEvent(
|
||||
new CustomEvent( 'ajaxBulkSmushOnScanCompleted', {
|
||||
detail: globalStats
|
||||
} )
|
||||
);
|
||||
}
|
||||
|
||||
onCancelled( stats ) {
|
||||
this.onFinish( stats );
|
||||
this.runBulkSmushOnComplete = false;
|
||||
this.setRequiredScanForBulkSmushButton();
|
||||
}
|
||||
|
||||
maybeShowAutoBulkSmushNotification() {
|
||||
if (
|
||||
! this.runBulkSmushOnComplete
|
||||
) {
|
||||
return;
|
||||
}
|
||||
this.showAnElement( this.autoBulkSmushNotification );
|
||||
}
|
||||
|
||||
maybeHideAutoBulkSmushNotification() {
|
||||
if (
|
||||
! this.runBulkSmushOnComplete
|
||||
) {
|
||||
return;
|
||||
}
|
||||
this.hideAnElement( this.autoBulkSmushNotification );
|
||||
}
|
||||
|
||||
toggleBulkSmushBoxContent() {
|
||||
GlobalStats.resetAndHideBulkErrors();
|
||||
this.toggleBulkSmushDescription( GlobalStats.getGlobalStats() );
|
||||
}
|
||||
}
|
||||
const mediaLibScanner = new MediaLibraryScannerOnBulkSmush();
|
||||
|
||||
/**
|
||||
* Event Listeners.
|
||||
*/
|
||||
|
||||
// Background Scan Media Library.
|
||||
const registerScanMediaLibraryEvent = () => {
|
||||
if ( ! recheckImagesBtn ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const canScanInBackground = recheckImagesBtn.classList.contains( 'wp-smush-background-scan' );
|
||||
if ( ! canScanInBackground ) {
|
||||
return;
|
||||
}
|
||||
|
||||
recheckImagesBtn.addEventListener( 'click', () => mediaLibScanner.startScan() );
|
||||
|
||||
//Check scan is running.
|
||||
if ( window.wp_smushit_data.media_library_scan?.in_processing ) {
|
||||
mediaLibScanner.onStart().showProgressBar().autoSyncStatus();
|
||||
}
|
||||
};
|
||||
|
||||
const maybeAutoStartMediaLibraryScanOnRedirect = () => {
|
||||
if ( ! recheckImagesBtn || ! window.location.search.includes( 'smush-action=start-scan-media' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
recheckImagesBtn.click();
|
||||
const removeScanActionFromURLAddress = () => {
|
||||
const cleanedURL = window.location.href.replace( '&smush-action=start-scan-media', '' );
|
||||
window.history.pushState( null, null, cleanedURL );
|
||||
};
|
||||
removeScanActionFromURLAddress();
|
||||
};
|
||||
|
||||
/**
|
||||
* Recheck Images Notice events.
|
||||
*/
|
||||
const registerEventsRelatedInlineNoticeOnBulkSmushPage = () => {
|
||||
const recheckImagesNotice = $( '.wp-smush-recheck-images-notice-box' );
|
||||
if ( ! recheckImagesNotice || ! recheckImagesBtn ) {
|
||||
return;
|
||||
}
|
||||
const triggerBackgroundScanImagesLink = recheckImagesNotice.querySelector( '.wp-smush-trigger-background-scan' );
|
||||
if ( triggerBackgroundScanImagesLink ) {
|
||||
triggerBackgroundScanImagesLink.onclick = ( e ) => {
|
||||
e.preventDefault();
|
||||
recheckImagesBtn.click();
|
||||
};
|
||||
|
||||
if ( ! window.location.search.includes( 'smush-action=start-scan-media' ) ) {
|
||||
if ( window.wp_smushit_data.media_library_scan?.is_dead ) {
|
||||
mediaLibScanner.showProgressErrorNoticeOnRecheckNotice();
|
||||
} else if( window.wp_smushit_data.is_outdated && ! window.wp_smushit_data?.bo_stats?.is_dead ) {
|
||||
mediaLibScanner.showRecheckNoticeWarning();
|
||||
}
|
||||
}
|
||||
}
|
||||
const triggerBulkSmush = recheckImagesNotice.querySelector( '.wp-smush-trigger-bulk-smush' );
|
||||
if ( triggerBulkSmush && bulkSmushButton ) {
|
||||
triggerBulkSmush.onclick = ( e ) => {
|
||||
e.preventDefault();
|
||||
recheckImagesNotice.classList.add( 'sui-hidden' );
|
||||
bulkSmushButton.click();
|
||||
};
|
||||
}
|
||||
const dismissNotices = recheckImagesNotice.querySelectorAll( 'button.sui-button-icon' );
|
||||
if ( dismissNotices ) {
|
||||
dismissNotices.forEach( ( dismissNotice ) => {
|
||||
dismissNotice.onclick = ( e ) => {
|
||||
dismissNotice.closest( '.sui-recheck-images-notice' ).classList.add( 'sui-hidden' );
|
||||
};
|
||||
} );
|
||||
}
|
||||
|
||||
document.addEventListener( 'onSavedSmushSettings', function( e ) {
|
||||
if ( ! e?.detail?.is_outdated_stats ) {
|
||||
return;
|
||||
}
|
||||
|
||||
mediaLibScanner.setRequiredScanForBulkSmushButton();
|
||||
|
||||
const bulkSmushFailedNotice = document.querySelector( '#smush-box-inline-retry-bulk-smush-notice' );
|
||||
const isShowingBulkSmushFailedNotice = bulkSmushFailedNotice && ! bulkSmushFailedNotice.classList.contains( 'sui-hidden' );
|
||||
if ( isShowingBulkSmushFailedNotice ) {
|
||||
return;
|
||||
}
|
||||
|
||||
recheckImagesNotice.classList.remove( 'sui-hidden' );
|
||||
recheckImagesNotice.querySelector( '.wp-smush-recheck-images-notice-success' ).classList.add( 'sui-hidden' );
|
||||
recheckImagesNotice.querySelector( '.wp-smush-recheck-images-notice-warning' ).classList.remove( 'sui-hidden' );
|
||||
} );
|
||||
};
|
||||
|
||||
// Scan and Bulk Smush.
|
||||
const registerScanAndBulkSmushEvent = () => {
|
||||
if ( ! bulkSmushButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const handleScanAndBulkSmush = ( e ) => {
|
||||
const shouldRunScan = bulkSmushButton.classList.contains( 'wp-smush-scan-and-bulk-smush' );
|
||||
if ( ! shouldRunScan ) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
mediaLibScanner.startScanThenBulkSmushOnComplete();
|
||||
};
|
||||
|
||||
bulkSmushButton.addEventListener( 'click', handleScanAndBulkSmush );
|
||||
};
|
||||
|
||||
const autoStartBulkSmushOnRedirect = () => {
|
||||
if ( ! bulkSmushButton || ! window.location.search.includes( 'smush-action=start-bulk-' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
bulkSmushButton.click();
|
||||
|
||||
const removeSmushActionFromURLAddress = () => {
|
||||
const cleanedURL = window.location.href.replace( /&smush-action=start-bulk-(smush|webp-conversion)/i, '' );
|
||||
window.history.pushState( null, null, cleanedURL );
|
||||
};
|
||||
removeSmushActionFromURLAddress();
|
||||
};
|
||||
|
||||
const registerRetryProcessFromLoopbackErrorModal = () => {
|
||||
const loopbackErrorModal = document.getElementById( 'smush-loopback-error-dialog' );
|
||||
if ( ! loopbackErrorModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const retryButton = loopbackErrorModal.querySelector( '.smush-retry-process-button' );
|
||||
if ( retryButton ) {
|
||||
retryButton.addEventListener( 'click', () => {
|
||||
const processType = loopbackErrorModal.dataset?.processType || 'scan';
|
||||
if ( 'scan' === processType ) {
|
||||
recheckImagesBtn.click();
|
||||
} else {
|
||||
bulkSmushButton.click();
|
||||
}
|
||||
} );
|
||||
}
|
||||
};
|
||||
|
||||
registerScanMediaLibraryEvent();
|
||||
registerScanAndBulkSmushEvent();
|
||||
registerEventsRelatedInlineNoticeOnBulkSmushPage();
|
||||
maybeAutoStartMediaLibraryScanOnRedirect();
|
||||
autoStartBulkSmushOnRedirect();
|
||||
registerRetryProcessFromLoopbackErrorModal();
|
||||
}() );
|
||||
@@ -0,0 +1,63 @@
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* Scan Media Library.
|
||||
*
|
||||
*/
|
||||
import MediaLibraryScanner from '../common/media-library-scanner';
|
||||
|
||||
( function() {
|
||||
'use strict';
|
||||
if ( ! window.wp_smush_msgs ) {
|
||||
return;
|
||||
}
|
||||
const $ = document.querySelector.bind( document );
|
||||
const existScanProgressBar = $( '.wp-smush-scan-progress-bar-wrapper' );
|
||||
if ( ! existScanProgressBar ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const recheckImagesBtn = $( '.wp-smush-scan' );
|
||||
if ( recheckImagesBtn ) {
|
||||
return;
|
||||
}
|
||||
//Check scan is running.
|
||||
const is_scan_running = window.wp_smushit_data.media_library_scan?.in_processing;
|
||||
if ( ! is_scan_running ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { __ } = wp.i18n;
|
||||
|
||||
class mediaLibraryScannerOnDashboard extends MediaLibraryScanner {
|
||||
constructor() {
|
||||
super();
|
||||
this.bulkSmushLink = $( '.wp-smush-bulk-smush-link' );
|
||||
}
|
||||
onShowProgressBar() {
|
||||
this.disableBulkSmushLink();
|
||||
}
|
||||
|
||||
onCloseProgressBar() {
|
||||
this.revertBulkSmushLink();
|
||||
}
|
||||
|
||||
disableBulkSmushLink() {
|
||||
if ( ! this.bulkSmushLink ) {
|
||||
return;
|
||||
}
|
||||
this.bulkSmushLink.setAttribute( 'disabled', true );
|
||||
this.setInnerText( this.bulkSmushLink, __( 'Waiting for Re-check to finish', 'wp-smushit' ) );
|
||||
}
|
||||
|
||||
revertBulkSmushLink() {
|
||||
if ( ! this.bulkSmushLink ) {
|
||||
return;
|
||||
}
|
||||
this.bulkSmushLink.removeAttribute( 'disabled' );
|
||||
this.revertInnerText( this.bulkSmushLink );
|
||||
}
|
||||
}
|
||||
|
||||
( new mediaLibraryScannerOnDashboard() ).showProgressBar().autoSyncStatus();
|
||||
}() );
|
||||
@@ -0,0 +1,52 @@
|
||||
import Smush from '../smush/smush';
|
||||
import SmushProcess from '../common/progressbar';
|
||||
|
||||
(function($) {
|
||||
$(function() {
|
||||
/** Handle NextGen Gallery smush button click **/
|
||||
$('body').on('click', '.wp-smush-nextgen-send', function (e) {
|
||||
// prevent the default action
|
||||
e.preventDefault();
|
||||
new Smush($(this), false, 'nextgen');
|
||||
});
|
||||
|
||||
/** Handle NextGen Gallery Bulk smush button click **/
|
||||
$('body').on('click', '.wp-smush-nextgen-bulk', function (e) {
|
||||
// prevent the default action
|
||||
e.preventDefault();
|
||||
|
||||
// Remove existing Re-Smush notices.
|
||||
// TODO: REMOVE re-smush-notice since no longer used.
|
||||
$('.wp-smush-resmush-notice').remove();
|
||||
|
||||
//Check for ids, if there is none (Unsmushed or lossless), don't call smush function
|
||||
if (
|
||||
'undefined' === typeof wp_smushit_data ||
|
||||
(wp_smushit_data.unsmushed.length === 0 &&
|
||||
wp_smushit_data.resmush.length === 0)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const bulkSmush = new Smush( $(this), true, 'nextgen' );
|
||||
SmushProcess.setOnCancelCallback( () => {
|
||||
bulkSmush.cancelAjax();
|
||||
}).update( 0, bulkSmush.ids.length ).show();
|
||||
|
||||
jQuery('.wp-smush-all, .wp-smush-scan').prop('disabled', true);
|
||||
$('.wp-smush-notice.wp-smush-remaining').hide();
|
||||
|
||||
// Run bulk Smush.
|
||||
bulkSmush.run();
|
||||
})
|
||||
.on('click', '.wp-smush-trigger-nextgen-bulk', function(e){
|
||||
e.preventDefault();
|
||||
const bulkSmushButton = $('.wp-smush-nextgen-bulk');
|
||||
if ( bulkSmushButton.length ) {
|
||||
bulkSmushButton.trigger('click');
|
||||
SUI.closeNotice( 'wp-smush-ajax-notice' );
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
}(window.jQuery));
|
||||
@@ -0,0 +1,113 @@
|
||||
/* global ajaxurl */
|
||||
/* global wp_smush_msgs */
|
||||
|
||||
( function( $ ) {
|
||||
'use strict';
|
||||
|
||||
const s3alert = $( '#wp-smush-s3support-alert' );
|
||||
|
||||
/**
|
||||
* S3 support alert.
|
||||
*
|
||||
* @since 3.6.2 Moved from class-s3.php
|
||||
*/
|
||||
if ( s3alert.length ) {
|
||||
const noticeOptions = {
|
||||
type: 'warning',
|
||||
icon: 'info',
|
||||
dismiss: {
|
||||
show: true,
|
||||
label: wp_smush_msgs.noticeDismiss,
|
||||
tooltip: wp_smush_msgs.noticeDismissTooltip,
|
||||
},
|
||||
};
|
||||
|
||||
window.SUI.openNotice(
|
||||
'wp-smush-s3support-alert',
|
||||
s3alert.data( 'message' ),
|
||||
noticeOptions
|
||||
);
|
||||
}
|
||||
|
||||
// Dismiss S3 support alert.
|
||||
s3alert.on( 'click', 'button', () => {
|
||||
$.post( ajaxurl,
|
||||
{
|
||||
action: 'dismiss_s3support_alert',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
}
|
||||
);
|
||||
} );
|
||||
|
||||
// Remove API message.
|
||||
$( '#wp-smush-api-message button.sui-button-icon' ).on( 'click', function( e ) {
|
||||
e.preventDefault();
|
||||
const notice = $( '#wp-smush-api-message' );
|
||||
notice.slideUp( 'slow', function() {
|
||||
notice.remove();
|
||||
} );
|
||||
$.post( ajaxurl,
|
||||
{
|
||||
action: 'hide_api_message',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
}
|
||||
);
|
||||
} );
|
||||
|
||||
// Hide the notice after a CTA button was clicked
|
||||
function removeNotice( e ) {
|
||||
const $notice = $( e.currentTarget ).closest( '.smush-notice' );
|
||||
$notice.fadeTo( 100, 0, () =>
|
||||
$notice.slideUp( 100, () => $notice.remove() )
|
||||
);
|
||||
}
|
||||
|
||||
// Only used for the Dashboard notification for now.
|
||||
$( '.smush-notice .smush-notice-act' ).on( 'click', ( e ) => {
|
||||
removeNotice( e );
|
||||
} );
|
||||
|
||||
// Dismiss the update notice.
|
||||
$( '.wp-smush-update-info' ).on( 'click', '.notice-dismiss', ( e ) => {
|
||||
e.preventDefault();
|
||||
removeNotice( e );
|
||||
$.post( ajaxurl,
|
||||
{
|
||||
action: 'dismiss_update_info',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
}
|
||||
);
|
||||
} );
|
||||
|
||||
function insertHubConnectNotice() {
|
||||
const mediaHubConnectNotice = $( '#smush-hub-connect-media-notice' );
|
||||
if ( ! mediaHubConnectNotice.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const headerEnd = $( '.wrap > .wp-header-end' );
|
||||
if ( headerEnd.length ) {
|
||||
headerEnd.after( mediaHubConnectNotice.show() );
|
||||
}
|
||||
}
|
||||
|
||||
insertHubConnectNotice();
|
||||
|
||||
$( '#smush-media-notification-skip' ).on( 'click', function ( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
$.post( ajaxurl, {
|
||||
action: 'dismiss_media_hub_connect_notice',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
} )
|
||||
.done( function ( response ) {
|
||||
if ( response && response.success ) {
|
||||
$( '#smush-hub-connect-media-notice' ).remove();
|
||||
}
|
||||
} )
|
||||
.fail( function () {
|
||||
console.error( 'Failed to dismiss the media hub connect notice.' );
|
||||
} );
|
||||
} );
|
||||
|
||||
}( jQuery ) );
|
||||
@@ -0,0 +1,558 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
import tracker from '../utils/tracker';
|
||||
import GlobalTracking from '../global-tracking';
|
||||
|
||||
/**
|
||||
* Modals JavaScript code.
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
const onBoardingTemplateID = 'smush-onboarding-free';
|
||||
if ( ! document.getElementById( onBoardingTemplateID ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Onboarding modal.
|
||||
*
|
||||
* @since 3.1
|
||||
*/
|
||||
WP_Smush.onboarding = {
|
||||
membership: 'free', // Assume free by default.
|
||||
onboardingModal: document.getElementById( 'smush-onboarding-dialog' ),
|
||||
settings: {
|
||||
first: true,
|
||||
last: false,
|
||||
slide: 'start',
|
||||
fields: {},
|
||||
},
|
||||
fields: {},
|
||||
contentContainer: document.getElementById( 'smush-onboarding-content' ),
|
||||
onboardingSlides: [],
|
||||
touchX: null,
|
||||
touchY: null,
|
||||
recheckImagesLink: '',
|
||||
upsellUTMClicked: false,
|
||||
|
||||
registerEventListeners() {
|
||||
document.addEventListener(
|
||||
'smush-onboarding:rendered-slide-scan_completed',
|
||||
this.progressBarAnimation.bind( this )
|
||||
);
|
||||
|
||||
// Skip setup.
|
||||
this.skipButton = this.onboardingModal.querySelector(
|
||||
'.smush-onboarding-skip-link'
|
||||
);
|
||||
if ( this.skipButton ) {
|
||||
this.skipButton.addEventListener( 'click', this.skipSetup.bind( this ) );
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Init module.
|
||||
*/
|
||||
init() {
|
||||
if ( ! this.onboardingModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.onboardingSlides = window.onBoardingData?.slideKeys || [];
|
||||
this.fields = window.onBoardingData?.slideFields || {};
|
||||
this.settings.slide = this.onboardingSlides.length ? this.onboardingSlides[ 0 ] : 'start';
|
||||
|
||||
const dialog = document.getElementById( onBoardingTemplateID );
|
||||
|
||||
this.membership = dialog.dataset.type;
|
||||
this.recheckImagesLink = dialog.dataset.ctaUrl;
|
||||
|
||||
if ( 'false' === dialog.dataset.tracking ) {
|
||||
this.onboardingSlides.pop();
|
||||
}
|
||||
|
||||
this.registerEventListeners();
|
||||
this.renderTemplate();
|
||||
|
||||
// Show the modal.
|
||||
window.SUI.openModal(
|
||||
'smush-onboarding-dialog',
|
||||
'wpcontent',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get swipe coordinates.
|
||||
*
|
||||
* @param {Object} e
|
||||
*/
|
||||
handleTouchStart( e ) {
|
||||
const firstTouch = e.touches[ 0 ];
|
||||
this.touchX = firstTouch.clientX;
|
||||
this.touchY = firstTouch.clientY;
|
||||
},
|
||||
|
||||
/**
|
||||
* Process swipe left/right.
|
||||
*
|
||||
* @param {Object} e
|
||||
*/
|
||||
handleTouchMove( e ) {
|
||||
if ( ! this.touchX || ! this.touchY ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const xUp = e.touches[ 0 ].clientX,
|
||||
yUp = e.touches[ 0 ].clientY,
|
||||
xDiff = this.touchX - xUp,
|
||||
yDiff = this.touchY - yUp;
|
||||
|
||||
if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {
|
||||
if ( xDiff > 0 ) {
|
||||
if ( false === WP_Smush.onboarding.settings.last ) {
|
||||
WP_Smush.onboarding.next( null, 'next' );
|
||||
}
|
||||
} else if ( false === WP_Smush.onboarding.settings.first ) {
|
||||
WP_Smush.onboarding.next( null, 'prev' );
|
||||
}
|
||||
}
|
||||
|
||||
this.touchX = null;
|
||||
this.touchY = null;
|
||||
},
|
||||
|
||||
progressBarAnimation( event ) {
|
||||
const progressBar = this.onboardingModal.querySelector( '.sui-progress-bar span' );
|
||||
const progressText = this.onboardingModal.querySelector( '.sui-progress-text' );
|
||||
let start = 0;
|
||||
const duration = 3000; // 3 seconds
|
||||
const step = 10; // ms
|
||||
|
||||
if ( ! progressBar || ! progressText ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const interval = setInterval( () => {
|
||||
start += step;
|
||||
const percent = Math.min( Math.round( ( start / duration ) * 100 ), 100 );
|
||||
progressBar.style.width = percent + '%';
|
||||
progressText.textContent = percent + '%';
|
||||
if ( percent >= 100 ) {
|
||||
clearInterval( interval );
|
||||
const loader = this.onboardingModal.querySelector( '.sui-icon-loader' );
|
||||
if ( loader ) {
|
||||
loader.classList.remove( 'sui-icon-loader', 'sui-loading' );
|
||||
loader.style.color = '#1ABC9C';
|
||||
loader.classList.add( 'sui-icon-check-tick' );
|
||||
}
|
||||
const scanStats = this.onboardingModal.querySelector( '.scan-stats' );
|
||||
if ( scanStats ) {
|
||||
scanStats.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
}, step );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the template, register new listeners.
|
||||
*
|
||||
* @param {string} directionClass Accepts: fadeInRight, fadeInLeft, none.
|
||||
*
|
||||
* Todo: Maybe redirect to finish scan slide when users go to in progressing slide.
|
||||
*/
|
||||
renderTemplate( directionClass = 'none' ) {
|
||||
// Grab the selected value.
|
||||
this.updateCheckboxStates();
|
||||
|
||||
const template = WP_Smush.onboarding.template( onBoardingTemplateID );
|
||||
const settings = this.settings;
|
||||
settings.fields = this.fields;
|
||||
const content = template( settings );
|
||||
|
||||
if ( content ) {
|
||||
this.contentContainer.innerHTML = content;
|
||||
|
||||
if ( 'none' === directionClass ) {
|
||||
this.contentContainer.classList.add( 'loaded' );
|
||||
} else {
|
||||
this.contentContainer.classList.remove( 'loaded' );
|
||||
this.contentContainer.classList.add( directionClass );
|
||||
setTimeout( () => {
|
||||
this.contentContainer.classList.add( 'loaded' );
|
||||
this.contentContainer.classList.remove(
|
||||
directionClass
|
||||
);
|
||||
}, 600 );
|
||||
}
|
||||
}
|
||||
|
||||
this.onboardingModal.addEventListener(
|
||||
'touchstart',
|
||||
this.handleTouchStart,
|
||||
false
|
||||
);
|
||||
this.onboardingModal.addEventListener(
|
||||
'touchmove',
|
||||
this.handleTouchMove,
|
||||
false
|
||||
);
|
||||
|
||||
this.bindSubmit();
|
||||
this.toggleSkipButton();
|
||||
this.maybeHandleUpsellUTMClick();
|
||||
|
||||
const slideRendered = new CustomEvent(
|
||||
`smush-onboarding:rendered-slide-${ this.settings.slide }`,
|
||||
{
|
||||
detail: {
|
||||
settings: this.settings,
|
||||
},
|
||||
}
|
||||
);
|
||||
document.dispatchEvent( slideRendered );
|
||||
},
|
||||
|
||||
updateCheckboxStates() {
|
||||
const inputs = this.onboardingModal.querySelectorAll(
|
||||
'input[type="checkbox"]'
|
||||
);
|
||||
if ( inputs ) {
|
||||
inputs.forEach( ( checkbox ) => {
|
||||
this.fields[ checkbox.id ] = checkbox.checked;
|
||||
} );
|
||||
}
|
||||
},
|
||||
|
||||
toggleSkipButton() {
|
||||
if ( ! this.skipButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( this.settings.last ) {
|
||||
this.skipButton.classList.add( 'sui-hidden' );
|
||||
} else {
|
||||
this.skipButton.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Catch "Finish setup wizard" button click.
|
||||
*/
|
||||
bindSubmit() {
|
||||
const submitButton = this.onboardingModal.querySelector(
|
||||
'button[type="submit"]'
|
||||
);
|
||||
const self = this;
|
||||
|
||||
if ( submitButton ) {
|
||||
submitButton.addEventListener( 'click', async function( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
submitButton.classList.add( 'sui-button-onload-text' );
|
||||
|
||||
// Because we are not rendering the template, we need to update the last element value.
|
||||
self.updateCheckboxStates();
|
||||
|
||||
try {
|
||||
await self.trackFinishSetupWizard();
|
||||
} catch ( err ) {}
|
||||
|
||||
const _nonce = document.getElementById(
|
||||
'smush_quick_setup_nonce'
|
||||
);
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_free_setup', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
self.onFinishingSetup();
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' +
|
||||
xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send(
|
||||
'smush_settings=' +
|
||||
JSON.stringify( self.fields ) +
|
||||
'&_ajax_nonce=' +
|
||||
_nonce.value
|
||||
);
|
||||
} );
|
||||
}
|
||||
},
|
||||
|
||||
onFinishingSetup() {
|
||||
this.onFinish();
|
||||
if ( window.onBoardingData?.isSiteConnected ) {
|
||||
this.redirectAndStartBulkSmush();
|
||||
} else {
|
||||
this.redirectToConnectSite();
|
||||
}
|
||||
},
|
||||
|
||||
redirectAndStartBulkSmush() {
|
||||
if ( window.onBoardingData?.startBulkSmushURL ) {
|
||||
window.location.href = window.onBoardingData?.startBulkSmushURL;
|
||||
}
|
||||
},
|
||||
|
||||
onFinish() {
|
||||
window.SUI.closeModal();
|
||||
},
|
||||
|
||||
redirectToConnectSite() {
|
||||
if ( ! window.onBoardingData?.connectSiteUrl ) {
|
||||
return;
|
||||
}
|
||||
window.location.href = window.onBoardingData?.connectSiteUrl;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle navigation.
|
||||
*
|
||||
* @param {Object} e
|
||||
* @param {null|string} whereTo
|
||||
*/
|
||||
next( e, whereTo = null ) {
|
||||
const index = this.onboardingSlides.indexOf( this.settings.slide );
|
||||
let newIndex = 0;
|
||||
|
||||
if ( ! whereTo ) {
|
||||
newIndex =
|
||||
null !== e && e.classList.contains( 'next' )
|
||||
? index + 1
|
||||
: index - 1;
|
||||
} else {
|
||||
newIndex = 'next' === whereTo ? index + 1 : index - 1;
|
||||
}
|
||||
|
||||
const directionClass =
|
||||
null !== e && e.classList.contains( 'next' )
|
||||
? 'fadeInRight'
|
||||
: 'fadeInLeft';
|
||||
|
||||
this.settings = {
|
||||
first: 0 === newIndex,
|
||||
last: newIndex + 1 === this.onboardingSlides.length, // length !== index
|
||||
slide: this.onboardingSlides[ newIndex ],
|
||||
fields: this.fields,
|
||||
};
|
||||
|
||||
this.renderTemplate( directionClass );
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle circle navigation.
|
||||
*
|
||||
* @param {string} target
|
||||
*/
|
||||
goTo( target ) {
|
||||
const newIndex = this.onboardingSlides.indexOf( target );
|
||||
|
||||
this.settings = {
|
||||
first: 0 === newIndex,
|
||||
last: newIndex + 1 === this.onboardingSlides.length, // length !== index
|
||||
slide: target,
|
||||
fields: this.fields,
|
||||
};
|
||||
|
||||
this.renderTemplate();
|
||||
},
|
||||
|
||||
/**
|
||||
* Skip onboarding experience.
|
||||
*/
|
||||
async skipSetup() {
|
||||
const _nonce = document.getElementById( 'smush_quick_setup_nonce' );
|
||||
|
||||
this.updateCheckboxStates();
|
||||
|
||||
try {
|
||||
await this.trackSkipSetupWizard();
|
||||
} catch ( err ) {}
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'POST',
|
||||
ajaxurl + '?action=skip_smush_setup&_ajax_nonce=' + _nonce.value
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
this.onSkipSetup();
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
},
|
||||
|
||||
onSkipSetup() {
|
||||
this.onFinish();
|
||||
this.redirectBulkSmushPage();
|
||||
},
|
||||
|
||||
redirectBulkSmushPage() {
|
||||
const bulkSmushPage = window.wp_smush_msgs?.bulk_smush_url;
|
||||
if ( bulkSmushPage ) {
|
||||
window.location.href = bulkSmushPage;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide new features modal.
|
||||
*
|
||||
* @param e
|
||||
* @param button
|
||||
* @since 3.7.0
|
||||
* @since 3.12.2 Add a new parameter redirectUrl
|
||||
*/
|
||||
hideUpgradeModal: ( e, button ) => {
|
||||
const isRedirectRequired = '_blank' !== button?.target;
|
||||
if ( isRedirectRequired ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
button.classList.add( 'wp-smush-link-in-progress' );
|
||||
const redirectUrl = button?.href;
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=hide_new_features&_ajax_nonce=' + window.wp_smush_msgs.nonce );
|
||||
xhr.onload = () => {
|
||||
window.SUI.closeModal();
|
||||
button.classList.remove( 'wp-smush-link-in-progress' );
|
||||
|
||||
const actionName = redirectUrl ? 'cta_clicked' : 'closed';
|
||||
tracker.track( 'update_modal_displayed', {
|
||||
Action: actionName,
|
||||
} );
|
||||
|
||||
if ( 200 === xhr.status ) {
|
||||
if ( redirectUrl && isRedirectRequired ) {
|
||||
window.location.href = redirectUrl;
|
||||
}
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
},
|
||||
maybeHandleUpsellUTMClick() {
|
||||
const isConfigureSlide = 'configure' === this.settings?.slide;
|
||||
if ( ! isConfigureSlide ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const upsellLink = this.onboardingModal.querySelector( '.smush-btn-pro-upsell' );
|
||||
|
||||
if ( upsellLink ) {
|
||||
upsellLink.addEventListener( 'click', () => {
|
||||
this.upsellUTMClicked = true;
|
||||
}, { once: true } );
|
||||
}
|
||||
|
||||
this.trackProUpsellOnClick( upsellLink );
|
||||
},
|
||||
trackFinishSetupWizard() {
|
||||
return this.trackSetupWizard( window.onBoardingData?.isSiteConnected ? 'complete_wizard' : 'connect' );
|
||||
},
|
||||
trackSkipSetupWizard() {
|
||||
return this.trackSetupWizard( 'quit' );
|
||||
},
|
||||
trackSetupWizard( action ) {
|
||||
const isWizardQuit = 'quit' === action;
|
||||
const properties = {
|
||||
Action: action,
|
||||
'Quit Step': this.getQuitStep( isWizardQuit ),
|
||||
'Settings Enabled': this.getEnabledSettings( isWizardQuit ),
|
||||
'Wizard Upsell': this.upsellUTMClicked ? 'clicked_utm' : 'na',
|
||||
};
|
||||
|
||||
const allowToTrack = this.fields?.usage;
|
||||
|
||||
return tracker.setAllowToTrack( allowToTrack ).track( 'Setup Wizard New', properties );
|
||||
},
|
||||
getQuitStep( isWizardQuit ) {
|
||||
return isWizardQuit ? ( this.settings.slide || 'na' ) : 'na';
|
||||
},
|
||||
getEnabledSettings( isWizardQuit ) {
|
||||
if ( isWizardQuit ) {
|
||||
return 'na';
|
||||
}
|
||||
|
||||
const fieldMapsForTracking = this.getFieldMapsForTracking();
|
||||
const enabledSettings = [];
|
||||
|
||||
Object.entries( this.fields ).forEach( ( [ setting, enabled ] ) => {
|
||||
if ( enabled ) {
|
||||
const featureName = setting in fieldMapsForTracking ? fieldMapsForTracking[ setting ] : setting;
|
||||
enabledSettings.push( featureName );
|
||||
}
|
||||
} );
|
||||
|
||||
return enabledSettings;
|
||||
},
|
||||
getProInterests() {
|
||||
if ( 'pro' === this.membership || ! this.upsellUTMClicked.length ) {
|
||||
return 'na';
|
||||
}
|
||||
|
||||
return this.upsellUTMClicked;
|
||||
},
|
||||
getFieldMapsForTracking() {
|
||||
return {
|
||||
usage: 'tracking',
|
||||
auto: 'auto_smush',
|
||||
lossy: 'super_smush',
|
||||
strip_exif: 'strip_exif',
|
||||
compress_backup: 'compress_backup',
|
||||
lazy_load: 'lazy_load',
|
||||
};
|
||||
},
|
||||
trackProUpsellOnClick( upsellLink ) {
|
||||
if ( ! upsellLink ) {
|
||||
return;
|
||||
}
|
||||
|
||||
upsellLink.addEventListener( 'click', ( event ) => {
|
||||
const allowToTrack = this.fields?.usage;
|
||||
tracker.setAllowToTrack( allowToTrack );
|
||||
( new GlobalTracking() ).trackSetupWizardProUpsell( event?.target?.href, 'na' );
|
||||
} );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Template function (underscores based).
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
WP_Smush.onboarding.template = _.memoize( ( id ) => {
|
||||
let compiled;
|
||||
const options = {
|
||||
evaluate: /<#([\s\S]+?)#>/g,
|
||||
interpolate: /{{{([\s\S]+?)}}}/g,
|
||||
escape: /{{([^}]+?)}}(?!})/g,
|
||||
variable: 'data',
|
||||
};
|
||||
|
||||
return ( data ) => {
|
||||
_.templateSettings = options;
|
||||
compiled =
|
||||
compiled ||
|
||||
_.template( document.getElementById( id ).innerHTML );
|
||||
return compiled( data );
|
||||
};
|
||||
} );
|
||||
|
||||
window.addEventListener( 'load', () => WP_Smush.onboarding.init() );
|
||||
}() );
|
||||
@@ -0,0 +1,542 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
import tracker from "../utils/tracker";
|
||||
import GlobalTracking from '../global-tracking';
|
||||
|
||||
/**
|
||||
* Modals JavaScript code.
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
|
||||
// Keep loading onboarding script for other dependencies.
|
||||
if ( document.getElementById( 'smush-onboarding-free' ) ) {
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Onboarding modal.
|
||||
*
|
||||
* @since 3.1
|
||||
*/
|
||||
WP_Smush.onboarding = {
|
||||
membership: 'free', // Assume free by default.
|
||||
onboardingModal: document.getElementById( 'smush-onboarding-dialog' ),
|
||||
first_slide: 'usage',
|
||||
settings: {
|
||||
first: true,
|
||||
last: false,
|
||||
slide: 'usage',
|
||||
value: false,
|
||||
},
|
||||
selection: {
|
||||
usage: false,
|
||||
auto: true,
|
||||
lossy: true,
|
||||
strip_exif: true,
|
||||
original: true,
|
||||
preload_images: true,
|
||||
lazy_load: true,
|
||||
},
|
||||
contentContainer: document.getElementById( 'smush-onboarding-content' ),
|
||||
onboardingSlides: [
|
||||
'usage',
|
||||
'auto',
|
||||
'lossy',
|
||||
'strip_exif',
|
||||
'original',
|
||||
'preload_images',
|
||||
'lazy_load',
|
||||
],
|
||||
touchX: null,
|
||||
touchY: null,
|
||||
recheckImagesLink: '',
|
||||
proFeaturesClicked: [],
|
||||
/**
|
||||
* Init module.
|
||||
*/
|
||||
init() {
|
||||
if ( ! this.onboardingModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dialog = document.getElementById( 'smush-onboarding' );
|
||||
|
||||
this.membership = dialog.dataset.type;
|
||||
this.recheckImagesLink = dialog.dataset.ctaUrl;
|
||||
|
||||
if ( 'pro' !== this.membership ) {
|
||||
this.onboardingSlides = [
|
||||
'usage',
|
||||
'auto',
|
||||
'lossy',
|
||||
'strip_exif',
|
||||
'original',
|
||||
'lazy_load',
|
||||
'pro_upsell',
|
||||
];
|
||||
}
|
||||
|
||||
if ( 'false' === dialog.dataset.tracking ) {
|
||||
this.onboardingSlides.pop();
|
||||
}
|
||||
|
||||
this.renderTemplate();
|
||||
|
||||
// Skip setup.
|
||||
this.skipButton = this.onboardingModal.querySelector(
|
||||
'.smush-onboarding-skip-link'
|
||||
);
|
||||
if ( this.skipButton ) {
|
||||
this.skipButton.addEventListener( 'click', this.skipSetup.bind( this ) );
|
||||
}
|
||||
|
||||
// Show the modal.
|
||||
window.SUI.openModal(
|
||||
'smush-onboarding-dialog',
|
||||
'wpcontent',
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Get swipe coordinates.
|
||||
*
|
||||
* @param {Object} e
|
||||
*/
|
||||
handleTouchStart( e ) {
|
||||
const firstTouch = e.touches[ 0 ];
|
||||
this.touchX = firstTouch.clientX;
|
||||
this.touchY = firstTouch.clientY;
|
||||
},
|
||||
|
||||
/**
|
||||
* Process swipe left/right.
|
||||
*
|
||||
* @param {Object} e
|
||||
*/
|
||||
handleTouchMove( e ) {
|
||||
if ( ! this.touchX || ! this.touchY ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const xUp = e.touches[ 0 ].clientX,
|
||||
yUp = e.touches[ 0 ].clientY,
|
||||
xDiff = this.touchX - xUp,
|
||||
yDiff = this.touchY - yUp;
|
||||
|
||||
if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {
|
||||
if ( xDiff > 0 ) {
|
||||
if ( false === WP_Smush.onboarding.settings.last ) {
|
||||
WP_Smush.onboarding.next( null, 'next' );
|
||||
}
|
||||
} else if ( false === WP_Smush.onboarding.settings.first ) {
|
||||
WP_Smush.onboarding.next( null, 'prev' );
|
||||
}
|
||||
}
|
||||
|
||||
this.touchX = null;
|
||||
this.touchY = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the template, register new listeners.
|
||||
*
|
||||
* @param {string} directionClass Accepts: fadeInRight, fadeInLeft, none.
|
||||
*/
|
||||
renderTemplate( directionClass = 'none' ) {
|
||||
this.updateCheckboxStates();
|
||||
|
||||
const template = WP_Smush.onboarding.template( 'smush-onboarding' );
|
||||
const content = template( this.settings );
|
||||
|
||||
if ( content ) {
|
||||
this.contentContainer.innerHTML = content;
|
||||
|
||||
if ( 'none' === directionClass ) {
|
||||
this.contentContainer.classList.add( 'loaded' );
|
||||
} else {
|
||||
this.contentContainer.classList.remove( 'loaded' );
|
||||
this.contentContainer.classList.add( directionClass );
|
||||
setTimeout( () => {
|
||||
this.contentContainer.classList.add( 'loaded' );
|
||||
this.contentContainer.classList.remove(
|
||||
directionClass
|
||||
);
|
||||
}, 600 );
|
||||
}
|
||||
}
|
||||
|
||||
this.onboardingModal.addEventListener(
|
||||
'touchstart',
|
||||
this.handleTouchStart,
|
||||
false
|
||||
);
|
||||
this.onboardingModal.addEventListener(
|
||||
'touchmove',
|
||||
this.handleTouchMove,
|
||||
false
|
||||
);
|
||||
|
||||
this.bindSubmit();
|
||||
this.toggleSkipButton();
|
||||
this.maybeHandleProFeatureClick();
|
||||
},
|
||||
|
||||
updateCheckboxStates() {
|
||||
// Grab the selected value.
|
||||
const input = this.onboardingModal.querySelector(
|
||||
'input[type="checkbox"]'
|
||||
);
|
||||
if ( input ) {
|
||||
this.selection[ input.id ] = input.checked;
|
||||
}
|
||||
},
|
||||
|
||||
toggleSkipButton() {
|
||||
if ( ! this.skipButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( this.settings.last ) {
|
||||
this.skipButton.classList.add( 'sui-hidden' );
|
||||
} else {
|
||||
this.skipButton.classList.remove( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Catch "Finish setup wizard" button click.
|
||||
*/
|
||||
bindSubmit() {
|
||||
const submitButton = this.onboardingModal.querySelector(
|
||||
'button[type="submit"]'
|
||||
);
|
||||
const self = this;
|
||||
|
||||
if ( submitButton ) {
|
||||
submitButton.addEventListener( 'click', async function( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
submitButton.classList.add( 'sui-button-onload-text' );
|
||||
|
||||
// Because we are not rendering the template, we need to update the last element value.
|
||||
self.updateCheckboxStates();
|
||||
|
||||
try {
|
||||
await self.trackFinishSetupWizard();
|
||||
} catch ( err ) {
|
||||
// Do nothing..
|
||||
}
|
||||
|
||||
const _nonce = document.getElementById(
|
||||
'smush_quick_setup_nonce'
|
||||
);
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_setup', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
self.onFinishingSetup();
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' +
|
||||
xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send(
|
||||
'smush_settings=' +
|
||||
JSON.stringify( self.selection ) +
|
||||
'&_ajax_nonce=' +
|
||||
_nonce.value
|
||||
);
|
||||
} );
|
||||
}
|
||||
},
|
||||
|
||||
onFinishingSetup() {
|
||||
this.onFinish();
|
||||
this.startRecheckImages();
|
||||
},
|
||||
|
||||
onFinish() {
|
||||
window.SUI.closeModal();
|
||||
},
|
||||
|
||||
startRecheckImages() {
|
||||
if ( ! this.recheckImagesLink ) {
|
||||
return;
|
||||
}
|
||||
window.location.href = this.recheckImagesLink;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle navigation.
|
||||
*
|
||||
* @param {Object} e
|
||||
* @param {null|string} whereTo
|
||||
*/
|
||||
next( e, whereTo = null ) {
|
||||
const index = this.onboardingSlides.indexOf( this.settings.slide );
|
||||
let newIndex = 0;
|
||||
|
||||
if ( ! whereTo ) {
|
||||
newIndex =
|
||||
null !== e && e.classList.contains( 'next' )
|
||||
? index + 1
|
||||
: index - 1;
|
||||
} else {
|
||||
newIndex = 'next' === whereTo ? index + 1 : index - 1;
|
||||
}
|
||||
|
||||
const directionClass =
|
||||
null !== e && e.classList.contains( 'next' )
|
||||
? 'fadeInRight'
|
||||
: 'fadeInLeft';
|
||||
|
||||
this.settings = {
|
||||
first: 0 === newIndex,
|
||||
last: newIndex + 1 === this.onboardingSlides.length, // length !== index
|
||||
slide: this.onboardingSlides[ newIndex ],
|
||||
value: this.selection[ this.onboardingSlides[ newIndex ] ],
|
||||
};
|
||||
|
||||
this.renderTemplate( directionClass );
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle circle navigation.
|
||||
*
|
||||
* @param {string} target
|
||||
*/
|
||||
goTo( target ) {
|
||||
const newIndex = this.onboardingSlides.indexOf( target );
|
||||
|
||||
this.settings = {
|
||||
first: 0 === newIndex,
|
||||
last: newIndex + 1 === this.onboardingSlides.length, // length !== index
|
||||
slide: target,
|
||||
value: this.selection[ target ],
|
||||
};
|
||||
|
||||
this.renderTemplate();
|
||||
},
|
||||
|
||||
/**
|
||||
* Skip onboarding experience.
|
||||
*/
|
||||
async skipSetup() {
|
||||
const _nonce = document.getElementById( 'smush_quick_setup_nonce' );
|
||||
this.updateCheckboxStates();
|
||||
|
||||
// Track skip setup wizard.
|
||||
try {
|
||||
await this.trackSkipSetupWizard();
|
||||
} catch ( err ) {
|
||||
// Do nothing..
|
||||
}
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'POST',
|
||||
ajaxurl + '?action=skip_smush_setup&_ajax_nonce=' + _nonce.value
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
this.onSkipSetup();
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
},
|
||||
|
||||
onSkipSetup() {
|
||||
this.onFinish();
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide new features modal.
|
||||
* @since 3.7.0
|
||||
* @since 3.12.2 Add a new parameter redirectUrl
|
||||
*/
|
||||
hideUpgradeModal: ( e, button ) => {
|
||||
const isRedirectRequired = '_blank' !== button?.target;
|
||||
if ( isRedirectRequired ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
button.classList.add( 'wp-smush-link-in-progress' );
|
||||
const redirectUrl = button?.href;
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=hide_new_features&_ajax_nonce=' + window.wp_smush_msgs.nonce );
|
||||
xhr.onload = () => {
|
||||
window.SUI.closeModal();
|
||||
button.classList.remove( 'wp-smush-link-in-progress' );
|
||||
|
||||
const actionName = redirectUrl ? 'cta_clicked' : 'closed';
|
||||
tracker.track( 'update_modal_displayed', {
|
||||
Action: actionName,
|
||||
} );
|
||||
|
||||
if ( 200 === xhr.status ) {
|
||||
if ( redirectUrl && isRedirectRequired ) {
|
||||
window.location.href = redirectUrl;
|
||||
}
|
||||
} else {
|
||||
window.console.log(
|
||||
'Request failed. Returned status of ' + xhr.status
|
||||
);
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
},
|
||||
maybeHandleProFeatureClick() {
|
||||
const isProUpsellSlide = 'pro_upsell' === this.settings?.slide;
|
||||
if ( ! isProUpsellSlide ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.upsellButton = this.onboardingModal.querySelector( '.smush-btn-pro-upsell' );
|
||||
const proFeatureToggleContainer = this.onboardingModal.querySelector( '.sui-field-list' );
|
||||
|
||||
if ( proFeatureToggleContainer ) {
|
||||
proFeatureToggleContainer.addEventListener( 'click', ( event ) => {
|
||||
const proFeatureClicked = event.target.matches( 'label' ) || event.target.closest( '.sui-toggle' );
|
||||
if ( proFeatureClicked ) {
|
||||
const featureName = event.target.closest( '.sui-field-list-item' ).querySelector( 'input[type="checkbox"]' )?.name;
|
||||
this.handleProFeatureClicked( featureName );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.maybeTrackProUpsell();
|
||||
},
|
||||
handleProFeatureClicked( featureName ) {
|
||||
this.cacheProFeatureClick( featureName );
|
||||
this.highlightUpsellButton();
|
||||
},
|
||||
highlightUpsellButton() {
|
||||
if ( ! this.upsellButton ) {
|
||||
return;
|
||||
}
|
||||
this.upsellButton.classList.remove( 'smush-btn-ripple' );
|
||||
void this.upsellButton.offsetWidth; // Trigger a reflow.
|
||||
this.upsellButton.classList.add( 'smush-btn-ripple' );
|
||||
},
|
||||
cacheProFeatureClick( proFeature ) {
|
||||
if ( ! this.proFeaturesClicked.includes( proFeature ) ) {
|
||||
this.proFeaturesClicked.push( proFeature );
|
||||
}
|
||||
},
|
||||
trackFinishSetupWizard() {
|
||||
return this.trackSetupWizard( 'finish' );
|
||||
},
|
||||
trackSkipSetupWizard() {
|
||||
return this.trackSetupWizard( 'quit' );
|
||||
},
|
||||
trackSetupWizard( action ) {
|
||||
const quitWizard = 'quit' === action;
|
||||
const properties = {
|
||||
Action: quitWizard ? 'quit' : 'finish',
|
||||
'Quit Step': this.getQuitStep( quitWizard ),
|
||||
'Settings Enabled': this.getEnabledSettings( quitWizard ),
|
||||
'Pro Interests': this.getProInterests(),
|
||||
};
|
||||
|
||||
const allowToTrack = this.selection?.usage;
|
||||
|
||||
return tracker.setAllowToTrack( allowToTrack ).track( 'Setup Wizard', properties );
|
||||
},
|
||||
getQuitStep( quitWizard ) {
|
||||
if ( ! quitWizard ) {
|
||||
return 'na';
|
||||
}
|
||||
|
||||
const fieldMapsForTracking = this.getFieldMapsForTracking();
|
||||
const setting = this.settings.slide;
|
||||
|
||||
return setting in fieldMapsForTracking ? fieldMapsForTracking[ setting ] : 'na';
|
||||
},
|
||||
getEnabledSettings( quitWizard ) {
|
||||
if ( quitWizard ) {
|
||||
return 'na';
|
||||
}
|
||||
|
||||
const fieldMapsForTracking = this.getFieldMapsForTracking();
|
||||
const enabledSettings = [];
|
||||
|
||||
Object.entries( this.selection ).forEach( ( [ setting, enabled ] ) => {
|
||||
if ( enabled ) {
|
||||
const featureName = setting in fieldMapsForTracking ? fieldMapsForTracking[ setting ] : setting;
|
||||
enabledSettings.push( featureName );
|
||||
}
|
||||
} );
|
||||
|
||||
return enabledSettings;
|
||||
},
|
||||
getProInterests() {
|
||||
if ( 'pro' === this.membership || ! this.proFeaturesClicked.length ) {
|
||||
return 'na';
|
||||
}
|
||||
|
||||
return this.proFeaturesClicked;
|
||||
},
|
||||
getFieldMapsForTracking() {
|
||||
return {
|
||||
usage: 'tracking',
|
||||
auto: 'auto_smush',
|
||||
lossy: 'free' === this.membership ? 'super_smush' : 'ultra_smush',
|
||||
strip_exif: 'strip_exif',
|
||||
original: 'full_size',
|
||||
lazy_load: 'lazy_load',
|
||||
pro_upsell: 'upgrade',
|
||||
preload_images: 'preload_images',
|
||||
};
|
||||
},
|
||||
maybeTrackProUpsell() {
|
||||
if ( ! this.upsellButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.upsellButton.addEventListener( 'click', ( event ) => {
|
||||
const allowToTrack = this.selection?.usage;
|
||||
tracker.setAllowToTrack( allowToTrack );
|
||||
( new GlobalTracking() ).trackSetupWizardProUpsell( event?.target?.href, this.getProInterests() );
|
||||
} );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Template function (underscores based).
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
WP_Smush.onboarding.template = _.memoize( ( id ) => {
|
||||
let compiled;
|
||||
const options = {
|
||||
evaluate: /<#([\s\S]+?)#>/g,
|
||||
interpolate: /{{{([\s\S]+?)}}}/g,
|
||||
escape: /{{([^}]+?)}}(?!})/g,
|
||||
variable: 'data',
|
||||
};
|
||||
|
||||
return ( data ) => {
|
||||
_.templateSettings = options;
|
||||
compiled =
|
||||
compiled ||
|
||||
_.template( document.getElementById( id ).innerHTML );
|
||||
data.first_slide = WP_Smush.onboarding.first_slide;
|
||||
return compiled( data );
|
||||
};
|
||||
} );
|
||||
|
||||
window.addEventListener( 'load', () => WP_Smush.onboarding.init() );
|
||||
}() );
|
||||
@@ -0,0 +1,105 @@
|
||||
// Review Prompts
|
||||
import Tracker from '../utils/tracker';
|
||||
import Fetcher from '../utils/fetcher';
|
||||
|
||||
class ReviewPrompts {
|
||||
#dismissNoticeKey = 'review-prompts';
|
||||
constructor() {
|
||||
document.addEventListener( 'DOMContentLoaded', this.init.bind( this ) );
|
||||
}
|
||||
|
||||
init() {
|
||||
this.reviewPromptsElement = document.getElementById( 'smush-review-prompts-notice' );
|
||||
if ( ! this.reviewPromptsElement ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.remindLater = this.reviewPromptsElement.querySelector( '#smush-review-prompts-remind-later' );
|
||||
this.alreadyDid = this.reviewPromptsElement.querySelector( '#smush-review-prompts-already-did' );
|
||||
this.rateLink = this.reviewPromptsElement.querySelector( '.button-primary' );
|
||||
|
||||
this.bindEvents();
|
||||
}
|
||||
|
||||
bindEvents() {
|
||||
if ( this.alreadyDid ) {
|
||||
this.alreadyDid.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.handleDismissNotice();
|
||||
this.trackRateNoticeEvent( 'dismiss' );
|
||||
} );
|
||||
}
|
||||
|
||||
if ( this.remindLater ) {
|
||||
this.remindLater.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.handleRemindLater();
|
||||
this.trackRateNoticeEvent( 'remind_later' );
|
||||
} );
|
||||
}
|
||||
|
||||
if ( this.rateLink ) {
|
||||
this.rateLink.addEventListener( 'click', () => {
|
||||
this.handleDismissNotice();
|
||||
this.trackRateNoticeEvent( 'rate' );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
handleDismissNotice() {
|
||||
this.alreadyDid.classList.add( 'wp-smush-link-in-progress' );
|
||||
return Fetcher.common.dismissNotice( this.#dismissNoticeKey ).then( ( res ) => {
|
||||
if ( res.success ) {
|
||||
this.reviewPromptsElement.style.display = 'none';
|
||||
} else {
|
||||
window.WP_Smush?.helpers.showNotice( res );
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
window.WP_Smush?.helpers.showNotice( error );
|
||||
} ).finally( () => {
|
||||
this.alreadyDid.classList.remove( 'wp-smush-link-in-progress' );
|
||||
} );
|
||||
}
|
||||
|
||||
handleRemindLater() {
|
||||
this.alreadyDid.classList.add( 'wp-smush-link-in-progress' );
|
||||
|
||||
return Fetcher.common.remindReviewPrompt().then( ( res ) => {
|
||||
if ( res.success ) {
|
||||
this.reviewPromptsElement.style.display = 'none';
|
||||
} else {
|
||||
window.WP_Smush?.helpers.showNotice( res );
|
||||
}
|
||||
} ).catch( ( error ) => {
|
||||
window.WP_Smush?.helpers.showNotice( error );
|
||||
} ).finally( () => {
|
||||
this.alreadyDid.classList.remove( 'wp-smush-link-in-progress' );
|
||||
} );
|
||||
}
|
||||
|
||||
trackRateNoticeEvent( userAction ) {
|
||||
if ( userAction ) {
|
||||
const url = new URL( window.location.href );
|
||||
const page = url.searchParams.get( 'page' );
|
||||
const locationMaps = {
|
||||
smush: 'Dashboard',
|
||||
'smush-bulk': 'Bulk Smush',
|
||||
'smush-lazy-preload': 'Lazy Load',
|
||||
'smush-cdn': 'CDN',
|
||||
'smush-next-gen': 'Next-Gen Formats',
|
||||
'smush-integrations': 'Integrations',
|
||||
'smush-settings': 'Settings',
|
||||
'smush-cross-sell': 'More free Plugins',
|
||||
};
|
||||
const location = locationMaps[ page ] || 'WordPress admin';
|
||||
|
||||
Tracker.track( 'Rating Notice', {
|
||||
Action: userAction,
|
||||
'Notice type': this.reviewPromptsElement.dataset.noticeType,
|
||||
Location: location
|
||||
} );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
new ReviewPrompts();
|
||||
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Shared UI JS libraries. Use only what we need to keep the vendor file size smaller.
|
||||
*
|
||||
* @package
|
||||
*/
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/code-snippet' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/modal-dialog' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/notifications' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/select2.full' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/select2' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/tabs' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/upload' ); // Used on lazy load page (since 3.2.2).
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/reviews' );
|
||||
require( '@wpmudev/shared-ui/dist/js/_src/accordion' );
|
||||
@@ -0,0 +1,15 @@
|
||||
import NextGen from './next-gen';
|
||||
|
||||
/**
|
||||
* Avif Class.
|
||||
*/
|
||||
class Avif extends NextGen {
|
||||
constructor() {
|
||||
super( 'avif' );
|
||||
}
|
||||
}
|
||||
|
||||
( function() {
|
||||
'use strict';
|
||||
new Avif();
|
||||
}() );
|
||||
@@ -0,0 +1,147 @@
|
||||
/**
|
||||
* BLOCK: extend image block
|
||||
*/
|
||||
const { createHigherOrderComponent } = wp.compose,
|
||||
{ Fragment } = wp.element,
|
||||
{ InspectorControls } = wp.blockEditor,
|
||||
{ PanelBody } = wp.components;
|
||||
|
||||
/**
|
||||
* Transform bytes to human readable format.
|
||||
*
|
||||
* @param {number} bytes
|
||||
* @return {string} Readable size string.
|
||||
*/
|
||||
function humanFileSize( bytes ) {
|
||||
const thresh = 1024,
|
||||
units = [ 'kB', 'MB', 'GB', 'TB' ];
|
||||
|
||||
if ( Math.abs( bytes ) < thresh ) {
|
||||
return bytes + ' B';
|
||||
}
|
||||
|
||||
let u = -1;
|
||||
do {
|
||||
bytes /= thresh;
|
||||
++u;
|
||||
} while ( Math.abs( bytes ) >= thresh && u < units.length - 1 );
|
||||
|
||||
return bytes.toFixed( 1 ) + ' ' + units[ u ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate Smush stats table.
|
||||
*
|
||||
* @param {number} id
|
||||
* @param {Object} stats
|
||||
* @return {*} Smush stats.
|
||||
*/
|
||||
export function smushStats( id, stats ) {
|
||||
if ( 'undefined' === typeof stats ) {
|
||||
return window.smush_vars.strings.gb.select_image;
|
||||
} else if ( 'string' === typeof stats ) {
|
||||
return stats;
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
id="smush-stats"
|
||||
className="sui-smush-media smush-stats-wrapper hidden"
|
||||
style={ { display: 'block' } }
|
||||
>
|
||||
<table className="wp-smush-stats-holder">
|
||||
<thead>
|
||||
<tr>
|
||||
<th className="smush-stats-header">
|
||||
{ window.smush_vars.strings.gb.size }
|
||||
</th>
|
||||
<th className="smush-stats-header">
|
||||
{ window.smush_vars.strings.gb.savings }
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{ Object.keys( stats.sizes )
|
||||
.filter( ( item ) => 0 < stats.sizes[ item ].percent )
|
||||
.map( ( item, i ) => (
|
||||
<tr key={ i }>
|
||||
<td>{ item.toUpperCase() }</td>
|
||||
<td>
|
||||
{ humanFileSize(
|
||||
stats.sizes[ item ].bytes
|
||||
) }{ ' ' }
|
||||
( { stats.sizes[ item ].percent }% )
|
||||
</td>
|
||||
</tr>
|
||||
) ) }
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch image data. If image is Smushing, update in 3 seconds.
|
||||
*
|
||||
* TODO: this could be optimized not to query so much.
|
||||
*
|
||||
* @param {Object} props
|
||||
*/
|
||||
export function fetchProps( props ) {
|
||||
const image = new wp.api.models.Media( { id: props.attributes.id } ),
|
||||
smushData = props.attributes.smush;
|
||||
|
||||
image.fetch( { attribute: 'smush' } ).done( function( img ) {
|
||||
if ( 'string' === typeof img.smush ) {
|
||||
props.setAttributes( { smush: img.smush } );
|
||||
//setTimeout( () => fetch( props ), 3000 );
|
||||
} else if (
|
||||
'undefined' !== typeof img.smush &&
|
||||
( 'undefined' === typeof smushData ||
|
||||
JSON.stringify( smushData ) !== JSON.stringify( img.smush ) )
|
||||
) {
|
||||
props.setAttributes( { smush: img.smush } );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify the block’s edit component.
|
||||
* Receives the original block BlockEdit component and returns a new wrapped component.
|
||||
*/
|
||||
const smushStatsControl = createHigherOrderComponent( ( BlockEdit ) => {
|
||||
return ( props ) => {
|
||||
// If not image block or not selected, return unmodified block.
|
||||
if (
|
||||
'core/image' !== props.name ||
|
||||
! props.isSelected ||
|
||||
'undefined' === typeof props.attributes.id
|
||||
) {
|
||||
return (
|
||||
<Fragment>
|
||||
<BlockEdit { ...props } />
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
const smushData = props.attributes.smush;
|
||||
fetchProps( props );
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<BlockEdit { ...props } />
|
||||
<InspectorControls>
|
||||
<PanelBody title={ window.smush_vars.strings.gb.stats }>
|
||||
{ smushStats( props.attributes.id, smushData ) }
|
||||
</PanelBody>
|
||||
</InspectorControls>
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
}, 'withInspectorControl' );
|
||||
|
||||
wp.hooks.addFilter(
|
||||
'editor.BlockEdit',
|
||||
'wp-smush/smush-data-control',
|
||||
smushStatsControl
|
||||
);
|
||||
@@ -0,0 +1,139 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* CDN functionality.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
|
||||
WP_Smush.CDN = {
|
||||
cdnEnableButton: document.getElementById( 'smush-enable-cdn' ),
|
||||
cdnDisableButton: document.getElementById( 'smush-cancel-cdn' ),
|
||||
cdnStatsBox: document.querySelector( '.smush-cdn-stats' ),
|
||||
|
||||
init() {
|
||||
/**
|
||||
* Handle "Get Started" button click on disabled CDN page.
|
||||
*/
|
||||
if ( this.cdnEnableButton ) {
|
||||
this.cdnEnableButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
e.currentTarget.classList.add( 'sui-button-onload' );
|
||||
this.toggle_cdn( true );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "Deactivate' button click on CDN page.
|
||||
*/
|
||||
if ( this.cdnDisableButton ) {
|
||||
this.cdnDisableButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
e.currentTarget.classList.add( 'sui-button-onload' );
|
||||
|
||||
this.toggle_cdn( false );
|
||||
} );
|
||||
}
|
||||
|
||||
this.updateStatsBox();
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle CDN.
|
||||
*
|
||||
* @since 3.0
|
||||
*
|
||||
* @param {boolean} enable
|
||||
*/
|
||||
toggle_cdn( enable ) {
|
||||
const nonceField = document.getElementsByName(
|
||||
'wp_smush_options_nonce'
|
||||
);
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_toggle_cdn', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
WP_Smush.helpers.redirectToPage( 'cdn' );
|
||||
} else if ( 'undefined' !== typeof res.data.message ) {
|
||||
WP_Smush.helpers.showErrorNotice( res.data.message );
|
||||
}
|
||||
} else {
|
||||
WP_Smush.helpers.showErrorNotice( 'Request failed. Returned status of ' + xhr.status );
|
||||
}
|
||||
};
|
||||
xhr.send(
|
||||
'param=' + enable + '&_ajax_nonce=' + nonceField[ 0 ].value
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the CDN stats box in summary meta box. Only fetch new data when on CDN page.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
updateStatsBox() {
|
||||
if (
|
||||
'undefined' === typeof this.cdnStatsBox ||
|
||||
! this.cdnStatsBox
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Only fetch the new stats, when user is on CDN page.
|
||||
if ( ! window.location.search.includes( 'page=smush-cdn' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.toggleElements();
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=get_cdn_stats', true );
|
||||
xhr.onload = () => {
|
||||
const endpoint_missing = xhr.status === 400 && xhr.response === '0';
|
||||
if (200 === xhr.status) {
|
||||
const res = JSON.parse(xhr.response);
|
||||
if ('undefined' !== typeof res.success && res.success) {
|
||||
this.toggleElements();
|
||||
} else if ('undefined' !== typeof res.data.message) {
|
||||
WP_Smush.helpers.showErrorNotice(res.data.message);
|
||||
}
|
||||
} else if (!endpoint_missing) {
|
||||
WP_Smush.helpers.showErrorNotice('Request failed. Returned status of ' + xhr.status);
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
},
|
||||
|
||||
/**
|
||||
* Show/hide elements during status update in the updateStatsBox()
|
||||
*
|
||||
* @since 3.1 Moved out from updateStatsBox()
|
||||
*/
|
||||
toggleElements() {
|
||||
const spinner = this.cdnStatsBox.querySelector(
|
||||
'.sui-icon-loader'
|
||||
);
|
||||
const elements = this.cdnStatsBox.querySelectorAll(
|
||||
'.wp-smush-stats > :not(.sui-icon-loader)'
|
||||
);
|
||||
|
||||
for ( let i = 0; i < elements.length; i++ ) {
|
||||
elements[ i ].classList.toggle( 'sui-hidden' );
|
||||
}
|
||||
|
||||
spinner.classList.toggle( 'sui-hidden' );
|
||||
},
|
||||
};
|
||||
|
||||
WP_Smush.CDN.init();
|
||||
} )();
|
||||
@@ -0,0 +1,212 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* Directory scanner module that will Smush images in the Directory Smush modal.
|
||||
*
|
||||
* @since 2.8.1
|
||||
*
|
||||
* @param {string|number} totalSteps
|
||||
* @param {string|number} currentStep
|
||||
* @return {Object} Scan object.
|
||||
* @class
|
||||
*/
|
||||
const DirectoryScanner = ( totalSteps, currentStep ) => {
|
||||
totalSteps = parseInt( totalSteps );
|
||||
currentStep = parseInt( currentStep );
|
||||
|
||||
let cancelling = false,
|
||||
failedItems = 0,
|
||||
skippedItems = 0;
|
||||
|
||||
const obj = {
|
||||
scan() {
|
||||
const remainingSteps = totalSteps - currentStep;
|
||||
if ( currentStep !== 0 ) {
|
||||
// Scan started on a previous page load.
|
||||
step( remainingSteps ).fail( this.showScanError );
|
||||
} else {
|
||||
jQuery
|
||||
.post( ajaxurl, {
|
||||
action: 'directory_smush_start',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce
|
||||
}, () =>
|
||||
step( remainingSteps ).fail( this.showScanError )
|
||||
)
|
||||
.fail( this.showScanError );
|
||||
}
|
||||
},
|
||||
|
||||
cancel() {
|
||||
cancelling = true;
|
||||
return jQuery.post( ajaxurl, {
|
||||
action: 'directory_smush_cancel',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce
|
||||
} );
|
||||
},
|
||||
|
||||
getProgress() {
|
||||
if ( cancelling ) {
|
||||
return 0;
|
||||
}
|
||||
// O M G ... Logic at it's finest!
|
||||
const remainingSteps = totalSteps - currentStep;
|
||||
return Math.min(
|
||||
Math.round(
|
||||
( parseInt( totalSteps - remainingSteps ) * 100 ) /
|
||||
totalSteps
|
||||
),
|
||||
99
|
||||
);
|
||||
},
|
||||
|
||||
onFinishStep( progress ) {
|
||||
jQuery( '.wp-smush-progress-dialog .sui-progress-state-text' ).html(
|
||||
currentStep -
|
||||
failedItems +
|
||||
'/' +
|
||||
totalSteps +
|
||||
' ' +
|
||||
window.wp_smush_msgs.progress_smushed
|
||||
);
|
||||
WP_Smush.directory.updateProgressBar( progress );
|
||||
},
|
||||
|
||||
onFinish() {
|
||||
WP_Smush.directory.updateProgressBar( 100 );
|
||||
const directorySmushUrl = `${ self.wp_smush_msgs.bulk_smush_url }&smush__directory-scan=done#directory_smush-settings-row`;
|
||||
if ( window.location.href === directorySmushUrl ) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
window.location.href = directorySmushUrl;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Displays an error when the scan request fails.
|
||||
*
|
||||
* @param {Object} res XHR object.
|
||||
*/
|
||||
showScanError( res ) {
|
||||
const dialog = jQuery( '#wp-smush-progress-dialog' );
|
||||
|
||||
// Add the error class to show/hide elements in the dialog.
|
||||
dialog
|
||||
.removeClass( 'wp-smush-exceed-limit' )
|
||||
.addClass( 'wp-smush-scan-error' );
|
||||
|
||||
// Add the error status and description to the error message.
|
||||
dialog
|
||||
.find( '#smush-scan-error' )
|
||||
.text( `${ res.status } ${ res.statusText }` );
|
||||
|
||||
// Show/hide the 403 error specific instructions.
|
||||
const forbiddenMessage = dialog.find( '.smush-403-error-message' );
|
||||
if ( 403 !== res.status ) {
|
||||
forbiddenMessage.addClass( 'sui-hidden' );
|
||||
} else {
|
||||
forbiddenMessage.removeClass( 'sui-hidden' );
|
||||
}
|
||||
},
|
||||
|
||||
limitReached() {
|
||||
const dialog = jQuery( '#wp-smush-progress-dialog' );
|
||||
|
||||
dialog.addClass( 'wp-smush-exceed-limit' );
|
||||
dialog
|
||||
.find( '#cancel-directory-smush' )
|
||||
.attr( 'data-tooltip', window.wp_smush_msgs.bulk_resume );
|
||||
dialog
|
||||
.find( '.sui-box-body .sui-icon-close' )
|
||||
.removeClass( 'sui-icon-close' )
|
||||
.addClass( 'sui-icon-play' );
|
||||
dialog
|
||||
.find( '#cancel-directory-smush' )
|
||||
.attr( 'id', 'cancel-directory-smush-disabled' );
|
||||
},
|
||||
|
||||
resume() {
|
||||
const dialog = jQuery( '#wp-smush-progress-dialog' );
|
||||
const resume = dialog.find( '#cancel-directory-smush-disabled' );
|
||||
|
||||
dialog.removeClass( 'wp-smush-exceed-limit' );
|
||||
dialog
|
||||
.find( '.sui-box-body .sui-icon-play' )
|
||||
.removeClass( 'sui-icon-play' )
|
||||
.addClass( 'sui-icon-close' );
|
||||
resume.attr( 'data-tooltip', 'Cancel' );
|
||||
resume.attr( 'id', 'cancel-directory-smush' );
|
||||
|
||||
obj.scan();
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Execute a scan step recursively
|
||||
*
|
||||
* Private to avoid overriding
|
||||
*
|
||||
* @param {number} remainingSteps
|
||||
*/
|
||||
const step = function( remainingSteps ) {
|
||||
if ( remainingSteps >= 0 ) {
|
||||
currentStep = totalSteps - remainingSteps;
|
||||
return jQuery.post(
|
||||
ajaxurl,
|
||||
{
|
||||
action: 'directory_smush_check_step',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
step: currentStep,
|
||||
},
|
||||
( response ) => {
|
||||
// We're good - continue on.
|
||||
if (
|
||||
'undefined' !== typeof response.success &&
|
||||
response.success
|
||||
) {
|
||||
if (
|
||||
'undefined' !== typeof response.data &&
|
||||
'undefined' !== typeof response.data.skipped &&
|
||||
true === response.data.skipped
|
||||
) {
|
||||
skippedItems++;
|
||||
}
|
||||
|
||||
currentStep++;
|
||||
remainingSteps = remainingSteps - 1;
|
||||
obj.onFinishStep( obj.getProgress() );
|
||||
step( remainingSteps ).fail( obj.showScanError );
|
||||
} else if (
|
||||
'undefined' !== typeof response.data.error &&
|
||||
'dir_smush_limit_exceeded' === response.data.error
|
||||
) {
|
||||
// Limit reached. Stop.
|
||||
obj.limitReached();
|
||||
} else {
|
||||
// Error? never mind, continue, but count them.
|
||||
failedItems++;
|
||||
currentStep++;
|
||||
remainingSteps = remainingSteps - 1;
|
||||
obj.onFinishStep( obj.getProgress() );
|
||||
step( remainingSteps ).fail( obj.showScanError );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
return jQuery.post(
|
||||
ajaxurl,
|
||||
{
|
||||
action: 'directory_smush_finish',
|
||||
_ajax_nonce: window.wp_smush_msgs.nonce,
|
||||
items: totalSteps - ( failedItems + skippedItems ),
|
||||
failed: failedItems,
|
||||
skipped: skippedItems,
|
||||
},
|
||||
( response ) => obj.onFinish( response )
|
||||
);
|
||||
};
|
||||
|
||||
return obj;
|
||||
};
|
||||
|
||||
export default DirectoryScanner;
|
||||
@@ -0,0 +1,307 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* Lazy loading functionality.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
( function() {
|
||||
'use strict';
|
||||
|
||||
WP_Smush.Lazyload = {
|
||||
lazyloadEnableButton: document.getElementById(
|
||||
'smush-enable-lazyload'
|
||||
),
|
||||
lazyloadDisableButton: document.getElementById(
|
||||
'smush-cancel-lazyload'
|
||||
),
|
||||
lazyloadIframeCheckbox: document.getElementById( 'format-iframe' ),
|
||||
init() {
|
||||
const self = this;
|
||||
|
||||
/**
|
||||
* Handle "Activate" button click on disabled Lazy load page.
|
||||
*/
|
||||
if ( this.lazyloadEnableButton ) {
|
||||
this.lazyloadEnableButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
e.currentTarget.classList.add( 'sui-button-onload' );
|
||||
|
||||
this.toggle_lazy_load( true );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "Deactivate' button click on Lazy load page.
|
||||
*/
|
||||
if ( this.lazyloadDisableButton ) {
|
||||
this.lazyloadDisableButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
e.currentTarget.classList.add( 'sui-button-onload' );
|
||||
|
||||
this.toggle_lazy_load( false );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "Remove icon" button click on Lazy load page.
|
||||
*
|
||||
* This removes the image from the upload placeholder.
|
||||
*
|
||||
* @since 3.2.2
|
||||
*/
|
||||
const removeSpinner = document.getElementById(
|
||||
'smush-remove-spinner'
|
||||
);
|
||||
if ( removeSpinner ) {
|
||||
removeSpinner.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.removeLoaderIcon();
|
||||
} );
|
||||
}
|
||||
const removePlaceholder = document.getElementById(
|
||||
'smush-remove-placeholder'
|
||||
);
|
||||
if ( removePlaceholder ) {
|
||||
removePlaceholder.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.removeLoaderIcon( 'placeholder' );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "Remove" icon click.
|
||||
*
|
||||
* This removes the select icon from the list (not same as above functions).
|
||||
*
|
||||
* @since 3.2.2
|
||||
*/
|
||||
const items = document.querySelectorAll( '.smush-ll-remove' );
|
||||
if ( items && 0 < items.length ) {
|
||||
items.forEach( function( el ) {
|
||||
el.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
e.target.closest( 'li' ).style.display = 'none';
|
||||
self.remove(
|
||||
e.target.dataset.id,
|
||||
e.target.dataset.type
|
||||
);
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
this.handlePredefinedPlaceholders();
|
||||
this.handleEmbedVideosBoxVisibility();
|
||||
},
|
||||
|
||||
handleEmbedVideosBoxVisibility() {
|
||||
if ( ! this.lazyloadIframeCheckbox ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const embedVideosBox = document.querySelector( '.lazyload-embed-videos' );
|
||||
if ( ! embedVideosBox ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.lazyloadIframeCheckbox.addEventListener( 'click', function() {
|
||||
if ( true === this.checked ) {
|
||||
embedVideosBox.classList.remove( 'sui-hidden' );
|
||||
} else {
|
||||
embedVideosBox.classList.add( 'sui-hidden' );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle background color changes for the two predefined placeholders.
|
||||
*
|
||||
* @since 3.7.1
|
||||
*/
|
||||
handlePredefinedPlaceholders() {
|
||||
const pl1 = document.getElementById( 'placeholder-icon-1' );
|
||||
if ( pl1 ) {
|
||||
pl1.addEventListener( 'click', () => this.changeColor( '#F3F3F3' ) );
|
||||
}
|
||||
|
||||
const pl2 = document.getElementById( 'placeholder-icon-2' );
|
||||
if ( pl2 ) {
|
||||
pl2.addEventListener( 'click', () => this.changeColor( '#333333' ) );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set color.
|
||||
*
|
||||
* @since 3.7.1
|
||||
* @param {string} color
|
||||
*/
|
||||
changeColor( color ) {
|
||||
document.getElementById( 'smush-color-picker' ).value = color;
|
||||
document.querySelector( '.sui-colorpicker-hex .sui-colorpicker-value > span > span' ).style.backgroundColor = color;
|
||||
document.querySelector( '.sui-colorpicker-hex .sui-colorpicker-value > input' ).value = color;
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle lazy loading.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*
|
||||
* @param {string} enable
|
||||
*/
|
||||
toggle_lazy_load( enable ) {
|
||||
const nonceField = document.getElementsByName(
|
||||
'wp_smush_options_nonce'
|
||||
);
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'POST',
|
||||
ajaxurl + '?action=smush_toggle_lazy_load',
|
||||
true
|
||||
);
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
if ( 200 === xhr.status ) {
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
WP_Smush.helpers.redirectToPage( 'lazy-preload' );
|
||||
} else if ( 'undefined' !== typeof res.data.message ) {
|
||||
WP_Smush.helpers.showErrorNotice( res.data.message );
|
||||
document.querySelector( '.sui-button-onload' ).classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
} else {
|
||||
WP_Smush.helpers.showErrorNotice( 'Request failed. Returned status of ' + xhr.status );
|
||||
document.querySelector( '.sui-button-onload' ).classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
};
|
||||
xhr.send(
|
||||
'param=' + enable + '&_ajax_nonce=' + nonceField[ 0 ].value
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Add lazy load spinner icon.
|
||||
*
|
||||
* @since 3.2.2
|
||||
* @param {string} type Accepts: spinner, placeholder.
|
||||
*/
|
||||
addLoaderIcon( type = 'spinner' ) {
|
||||
let frame;
|
||||
|
||||
// If the media frame already exists, reopen it.
|
||||
if ( frame ) {
|
||||
frame.open();
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a new media frame
|
||||
frame = wp.media( {
|
||||
title: 'Select or upload an icon',
|
||||
button: {
|
||||
text: 'Select icon',
|
||||
},
|
||||
multiple: false, // Set to true to allow multiple files to be selected
|
||||
} );
|
||||
|
||||
// When an image is selected in the media frame...
|
||||
frame.on( 'select', function() {
|
||||
// Get media attachment details from the frame state
|
||||
const attachment = frame
|
||||
.state()
|
||||
.get( 'selection' )
|
||||
.first()
|
||||
.toJSON();
|
||||
|
||||
// Send the attachment URL to our custom image input field.
|
||||
const imageIcon = document.getElementById(
|
||||
'smush-' + type + '-icon-preview'
|
||||
);
|
||||
imageIcon.style.backgroundImage =
|
||||
'url("' + attachment.url + '")';
|
||||
imageIcon.style.display = 'block';
|
||||
|
||||
// Send the attachment id to our hidden input
|
||||
document
|
||||
.getElementById( 'smush-' + type + '-icon-file' )
|
||||
.setAttribute( 'value', attachment.id );
|
||||
|
||||
// Hide the add image link
|
||||
document.getElementById(
|
||||
'smush-upload-' + type
|
||||
).style.display = 'none';
|
||||
|
||||
// Unhide the remove image link
|
||||
const removeDiv = document.getElementById(
|
||||
'smush-remove-' + type
|
||||
);
|
||||
removeDiv.querySelector( 'span' ).innerHTML =
|
||||
attachment.filename;
|
||||
removeDiv.style.display = 'block';
|
||||
} );
|
||||
|
||||
// Finally, open the modal on click
|
||||
frame.open();
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove lazy load spinner icon.
|
||||
*
|
||||
* @since 3.2.2
|
||||
* @param {string} type Accepts: spinner, placeholder.
|
||||
*/
|
||||
removeLoaderIcon: ( type = 'spinner' ) => {
|
||||
// Clear out the preview image
|
||||
const imageIcon = document.getElementById(
|
||||
'smush-' + type + '-icon-preview'
|
||||
);
|
||||
imageIcon.style.backgroundImage = '';
|
||||
imageIcon.style.display = 'none';
|
||||
|
||||
// Un-hide the add image link
|
||||
document.getElementById( 'smush-upload-' + type ).style.display =
|
||||
'block';
|
||||
|
||||
// Hide the delete image link
|
||||
document.getElementById( 'smush-remove-' + type ).style.display =
|
||||
'none';
|
||||
|
||||
// Delete the image id from the hidden input
|
||||
document
|
||||
.getElementById( 'smush-' + type + '-icon-file' )
|
||||
.setAttribute( 'value', '' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove item.
|
||||
*
|
||||
* @param {number} id Image ID.
|
||||
* @param {string} type Accepts: spinner, placeholder.
|
||||
*/
|
||||
remove: ( id, type = 'spinner' ) => {
|
||||
const nonceField = document.getElementsByName(
|
||||
'wp_smush_options_nonce'
|
||||
);
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_remove_icon', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.send(
|
||||
'id=' +
|
||||
id +
|
||||
'&type=' +
|
||||
type +
|
||||
'&_ajax_nonce=' +
|
||||
nonceField[ 0 ].value
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
WP_Smush.Lazyload.init();
|
||||
} )();
|
||||
@@ -0,0 +1,180 @@
|
||||
/* global smush_vars */
|
||||
/* global _ */
|
||||
|
||||
/**
|
||||
* Adds a Smush Now button and displays stats in Media Attachment Details Screen
|
||||
*/
|
||||
(function ($, _) {
|
||||
'use strict';
|
||||
|
||||
// Local reference to the WordPress media namespace.
|
||||
const smushMedia = wp.media,
|
||||
sharedTemplate =
|
||||
"<span class='setting smush-stats' data-setting='smush'>" +
|
||||
"<span class='name'><%= label %></span>" +
|
||||
"<span class='value'><%= value %></span>" +
|
||||
'</span>',
|
||||
template = _.template(sharedTemplate);
|
||||
|
||||
/**
|
||||
* Create the template.
|
||||
*
|
||||
* @param {string} smushHTML
|
||||
* @return {Object} Template object
|
||||
*/
|
||||
const prepareTemplate = function (smushHTML) {
|
||||
/**
|
||||
* @param {Array} smush_vars.strings Localization strings.
|
||||
* @param {Object} smush_vars Object from wp_localize_script()
|
||||
*/
|
||||
return template({
|
||||
label: smush_vars.strings.stats_label,
|
||||
value: smushHTML,
|
||||
});
|
||||
};
|
||||
|
||||
if (
|
||||
'undefined' !== typeof smushMedia.view &&
|
||||
'undefined' !== typeof smushMedia.view.Attachment.Details.TwoColumn
|
||||
) {
|
||||
// Local instance of the Attachment Details TwoColumn used in the edit attachment modal view
|
||||
const smushMediaTwoColumn =
|
||||
smushMedia.view.Attachment.Details.TwoColumn;
|
||||
|
||||
/**
|
||||
* Add Smush details to attachment.
|
||||
*
|
||||
* A similar view to media.view.Attachment.Details
|
||||
* for use in the Edit Attachment modal.
|
||||
*
|
||||
* @see wp-includes/js/media-grid.js
|
||||
*/
|
||||
smushMedia.view.Attachment.Details.TwoColumn = smushMediaTwoColumn.extend(
|
||||
{
|
||||
initialize() {
|
||||
smushMediaTwoColumn.prototype.initialize.apply(this, arguments);
|
||||
this.listenTo(this.model, 'change:smush', this.render);
|
||||
},
|
||||
|
||||
render() {
|
||||
// Ensure that the main attachment fields are rendered.
|
||||
smushMedia.view.Attachment.prototype.render.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
|
||||
const smushHTML = this.model.get('smush');
|
||||
if (typeof smushHTML === 'undefined') {
|
||||
return this;
|
||||
}
|
||||
|
||||
this.model.fetch();
|
||||
|
||||
/**
|
||||
* Detach the views, append our custom fields, make sure that our data is fully updated
|
||||
* and re-render the updated view.
|
||||
*/
|
||||
this.views.detach();
|
||||
this.$el
|
||||
.find('.settings')
|
||||
.append(prepareTemplate(smushHTML));
|
||||
this.views.render();
|
||||
|
||||
return this;
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// Local instance of the Attachment Details TwoColumn used in the edit attachment modal view
|
||||
const smushAttachmentDetails = smushMedia.view.Attachment.Details;
|
||||
|
||||
/**
|
||||
* Add Smush details to attachment.
|
||||
*/
|
||||
smushMedia.view.Attachment.Details = smushAttachmentDetails.extend({
|
||||
initialize() {
|
||||
smushAttachmentDetails.prototype.initialize.apply(this, arguments);
|
||||
this.listenTo(this.model, 'change:smush', this.render);
|
||||
},
|
||||
|
||||
render() {
|
||||
// Ensure that the main attachment fields are rendered.
|
||||
smushMedia.view.Attachment.prototype.render.apply(this, arguments);
|
||||
|
||||
const smushHTML = this.model.get('smush');
|
||||
if (typeof smushHTML === 'undefined') {
|
||||
return this;
|
||||
}
|
||||
|
||||
this.model.fetch();
|
||||
|
||||
/**
|
||||
* Detach the views, append our custom fields, make sure that our data is fully updated
|
||||
* and re-render the updated view.
|
||||
*/
|
||||
this.views.detach();
|
||||
this.$el.append(prepareTemplate(smushHTML));
|
||||
|
||||
return this;
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Create a new MediaLibraryTaxonomyFilter we later will instantiate
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
const MediaLibraryTaxonomyFilter = wp.media.view.AttachmentFilters.extend({
|
||||
id: 'media-attachment-smush-filter',
|
||||
|
||||
createFilters() {
|
||||
this.filters = {
|
||||
all: {
|
||||
text: smush_vars.strings.filter_all,
|
||||
props: { stats: 'all' },
|
||||
priority: 10,
|
||||
},
|
||||
|
||||
unsmushed: {
|
||||
text: smush_vars.strings.filter_not_processed,
|
||||
props: { stats: 'unsmushed' },
|
||||
priority: 20,
|
||||
},
|
||||
|
||||
excluded: {
|
||||
text: smush_vars.strings.filter_excl,
|
||||
props: { stats: 'excluded' },
|
||||
priority: 30,
|
||||
},
|
||||
|
||||
failed: {
|
||||
text: smush_vars.strings.filter_failed,
|
||||
props: { stats: 'failed_processing' },
|
||||
priority: 40,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Extend and override wp.media.view.AttachmentsBrowser to include our new filter.
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
const AttachmentsBrowser = wp.media.view.AttachmentsBrowser;
|
||||
wp.media.view.AttachmentsBrowser = wp.media.view.AttachmentsBrowser.extend({
|
||||
createToolbar() {
|
||||
// Make sure to load the original toolbar
|
||||
AttachmentsBrowser.prototype.createToolbar.call(this);
|
||||
this.toolbar.set(
|
||||
'MediaLibraryTaxonomyFilter',
|
||||
new MediaLibraryTaxonomyFilter({
|
||||
controller: this.controller,
|
||||
model: this.collection.props,
|
||||
priority: -75,
|
||||
}).render()
|
||||
);
|
||||
},
|
||||
});
|
||||
})(jQuery, _);
|
||||
@@ -0,0 +1,283 @@
|
||||
/* global ajaxurl */
|
||||
/* global WP_Smush */
|
||||
|
||||
/**
|
||||
* NextGen class.
|
||||
*/
|
||||
export default class NextGen {
|
||||
constructor( nextGenFormat ) {
|
||||
this.nextGenFormat = nextGenFormat;
|
||||
this.nonceField = document.getElementsByName( 'wp_smush_options_nonce' );
|
||||
this.toggleModuleButton = document.getElementById( `smush-toggle-${ nextGenFormat }-button` );
|
||||
this.deleteAllButton = document.getElementById( `wp-smush-${ nextGenFormat }-delete-all` );
|
||||
|
||||
this.registerGlobalEvents();
|
||||
this.registerEvents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register global events.
|
||||
*/
|
||||
registerGlobalEvents() {
|
||||
if ( NextGen.isGlobalEventListenerAdded ) {
|
||||
return;
|
||||
}
|
||||
NextGen.isGlobalEventListenerAdded = true;
|
||||
|
||||
document.addEventListener( 'onSavedSmushSettings', this.onSavedNextGenSettingsHandler.bind( this ) );
|
||||
document.addEventListener( 'on-smush-next-gen-activated-notice', this.showNextGenActivatedModal.bind( this ) );
|
||||
document.addEventListener( 'on-smush-next-gen-conversion-changed-notice', this.showNextGenConversionChangedModal.bind( this ) );
|
||||
}
|
||||
|
||||
registerEvents() {
|
||||
this.maybeShowDeleteAllSuccessNotice();
|
||||
|
||||
/**
|
||||
* Handles the "Deactivate" and "Get Started" buttons on the Next-Gen page.
|
||||
*/
|
||||
if ( this.toggleModuleButton ) {
|
||||
this.toggleModuleButton.addEventListener( 'click', ( e ) =>
|
||||
this.toggleModule( e )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the "Delete Next-Gen images" button.
|
||||
*/
|
||||
if ( this.deleteAllButton ) {
|
||||
this.deleteAllButton.addEventListener( 'click', ( e ) => this.deleteAll( e ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle Next-Gen module.
|
||||
*
|
||||
* @param {Event} e
|
||||
*/
|
||||
toggleModule( e ) {
|
||||
e.preventDefault();
|
||||
|
||||
const button = e.currentTarget,
|
||||
doEnable = 'enable' === button.dataset.action;
|
||||
|
||||
button.classList.add( 'sui-button-onload' );
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + `?action=smush_${ this.nextGenFormat }_toggle`, true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
|
||||
xhr.onload = () => {
|
||||
const res = JSON.parse( xhr.response );
|
||||
|
||||
if ( 200 === xhr.status ) {
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
const scanPromise = this.runScan();
|
||||
scanPromise.onload = () => {
|
||||
this.redirectToNextGenPage();
|
||||
};
|
||||
} else if ( 'undefined' !== typeof res.data.message ) {
|
||||
this.showNotice( res.data.message );
|
||||
button.classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
} else {
|
||||
let message = window.wp_smush_msgs.generic_ajax_error;
|
||||
if ( res && 'undefined' !== typeof res.data.message ) {
|
||||
message = res.data.message;
|
||||
}
|
||||
this.showNotice( message );
|
||||
button.classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
};
|
||||
|
||||
xhr.send(
|
||||
'param=' + doEnable + '&_ajax_nonce=' + this.nonceField[ 0 ].value
|
||||
);
|
||||
}
|
||||
|
||||
deleteAll( e ) {
|
||||
const button = e.currentTarget;
|
||||
button.classList.add( 'sui-button-onload' );
|
||||
|
||||
let message = false;
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + `?action=smush_${ this.nextGenFormat }_delete_all`, true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
|
||||
xhr.onload = () => {
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 200 === xhr.status ) {
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
const scanPromise = this.runScan();
|
||||
scanPromise.onload = () => {
|
||||
location.search =
|
||||
location.search + `&smush-notice=${ this.nextGenFormat }-deleted`;
|
||||
};
|
||||
} else {
|
||||
message = window.wp_smush_msgs.generic_ajax_error;
|
||||
}
|
||||
} else {
|
||||
message = window.wp_smush_msgs.generic_ajax_error;
|
||||
}
|
||||
|
||||
if ( res && res.data && res.data.message ) {
|
||||
message = res.data.message;
|
||||
}
|
||||
|
||||
if ( message ) {
|
||||
button.classList.remove( 'sui-button-onload' );
|
||||
|
||||
const noticeMessage = `<p style="text-align: left;">${ message }</p>`;
|
||||
const noticeOptions = {
|
||||
type: 'error',
|
||||
icon: 'info',
|
||||
autoclose: {
|
||||
show: false,
|
||||
},
|
||||
};
|
||||
|
||||
window.SUI.openNotice(
|
||||
'wp-smush-next-gen-delete-all-error-notice',
|
||||
noticeMessage,
|
||||
noticeOptions
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
xhr.send( '_ajax_nonce=' + this.nonceField[ 0 ].value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the scanning of images for updating the images to re-smush.
|
||||
*
|
||||
* @since 3.8.0
|
||||
*/
|
||||
runScan() {
|
||||
const xhr = new XMLHttpRequest(),
|
||||
nonceField = document.getElementsByName(
|
||||
'wp_smush_options_nonce'
|
||||
);
|
||||
|
||||
xhr.open( 'POST', ajaxurl + '?action=scan_for_resmush', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
|
||||
xhr.send( '_ajax_nonce=' + nonceField[ 0 ].value );
|
||||
|
||||
return xhr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show message (notice).
|
||||
*
|
||||
* @param {string} message
|
||||
* @param {string} type
|
||||
*/
|
||||
showNotice( message, type ) {
|
||||
if ( 'undefined' === typeof message ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const noticeMessage = `<p>${ message }</p>`;
|
||||
const noticeOptions = {
|
||||
type: type || 'error',
|
||||
icon: 'info',
|
||||
dismiss: {
|
||||
show: true,
|
||||
label: window.wp_smush_msgs.noticeDismiss,
|
||||
tooltip: window.wp_smush_msgs.noticeDismissTooltip,
|
||||
},
|
||||
autoclose: {
|
||||
show: false,
|
||||
},
|
||||
};
|
||||
|
||||
window.SUI.openNotice(
|
||||
'wp-smush-ajax-notice',
|
||||
noticeMessage,
|
||||
noticeOptions
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show delete all webp success notice.
|
||||
*/
|
||||
maybeShowDeleteAllSuccessNotice() {
|
||||
const deletedAllNoticeElementID = `wp-smush-${ this.nextGenFormat }-delete-all-notice`;
|
||||
const deletedAllNoticeElement = document.getElementById( deletedAllNoticeElementID );
|
||||
if ( ! deletedAllNoticeElement ) {
|
||||
return;
|
||||
}
|
||||
const noticeMessage = `<p>${
|
||||
deletedAllNoticeElement
|
||||
.dataset.message
|
||||
}</p>`;
|
||||
|
||||
const noticeOptions = {
|
||||
type: 'success',
|
||||
icon: 'check-tick',
|
||||
dismiss: {
|
||||
show: true,
|
||||
},
|
||||
};
|
||||
|
||||
window.SUI.openNotice(
|
||||
deletedAllNoticeElementID,
|
||||
noticeMessage,
|
||||
noticeOptions
|
||||
);
|
||||
}
|
||||
|
||||
onSavedNextGenSettingsHandler( status ) {
|
||||
if ( 'next-gen' === status?.detail?.page ) {
|
||||
if ( status?.detail?.next_gen_format_changed ) {
|
||||
this.redirectToNextGenPage( '&smush-notice=next-gen-conversion-changed' );
|
||||
} else if ( status?.detail?.webp_method_changed ) {
|
||||
this.redirectToNextGenPage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
showNextGenActivatedModal() {
|
||||
if ( ! window.WP_Smush ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const activatedModalId = 'smush-next-gen-activated-modal';
|
||||
if ( ! document.getElementById( activatedModalId ) ) {
|
||||
this.redirectToNextGenPage();
|
||||
return;
|
||||
}
|
||||
|
||||
window.WP_Smush.helpers.showModal( activatedModalId, {
|
||||
isCloseOnEsc: true,
|
||||
} );
|
||||
}
|
||||
|
||||
showNextGenConversionChangedModal() {
|
||||
if ( ! window.WP_Smush ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const conversionChangedModalId = 'smush-next-gen-conversion-changed-modal';
|
||||
if ( ! document.getElementById( conversionChangedModalId ) ) {
|
||||
this.redirectToNextGenPage();
|
||||
return;
|
||||
}
|
||||
|
||||
window.WP_Smush.helpers.showModal( conversionChangedModalId, {
|
||||
isCloseOnEsc: true,
|
||||
} );
|
||||
}
|
||||
|
||||
redirectToNextGenPage( noticeParam ) {
|
||||
window.location.href = window.wp_smush_msgs.nextGenURL + ( noticeParam || '' );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,519 @@
|
||||
import tracker from '../utils/tracker';
|
||||
|
||||
class ProductAnalytics {
|
||||
troubleshootClicked = false;
|
||||
resumeBulkSmushCount = 0;
|
||||
missedEventsKey = 'wp_smush_missed_events';
|
||||
|
||||
init() {
|
||||
if ( ! tracker.allowToTrack() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.trackUltraLinks();
|
||||
this.trackUpsellLinks();
|
||||
|
||||
this.registerTroubleshootClickEvent();
|
||||
|
||||
// Scan Interrupted Event from Scan Modal.
|
||||
this.trackScanInterruptedEventOnStopScanningModal();
|
||||
this.trackScanInterruptedEventOnRetryScanModal();
|
||||
|
||||
// Bulk Smush Interrupted Event from Bulk Smush Modal.
|
||||
this.trackBulkSmushInterruptedEventOnStopBulkSmushModal();
|
||||
this.trackBulkSmushInterruptedEventOnRetryBulkSmushModal();
|
||||
this.registerBulkSmushResumeClickEvent();
|
||||
|
||||
// Bulk Smush Interrupted Event when exit ajax bulk smush.
|
||||
this.trackBulkSmushInterruptedEventWhenExitingAjaxBulkSmush();
|
||||
|
||||
// Interrupted Event from Inline Notice.
|
||||
this.trackInterruptedEventFromInlineNotice();
|
||||
|
||||
// Interrupted Event from Loopback Error Modal.
|
||||
this.trackInterruptedEventFromLoopbackErrorModal();
|
||||
|
||||
this.maybeTrackMissedEventsOnLoad();
|
||||
}
|
||||
|
||||
trackUltraLinks() {
|
||||
const ultraUpsellLinks = document.querySelectorAll( '.wp-smush-upsell-ultra-compression' );
|
||||
if ( ! ultraUpsellLinks ) {
|
||||
return;
|
||||
}
|
||||
const getLocation = ( ultraLink ) => {
|
||||
const locations = {
|
||||
settings: 'bulksmush_settings',
|
||||
dashboard: 'dash_summary',
|
||||
bulk: 'bulksmush_summary',
|
||||
directory: 'directory_summary',
|
||||
'lazy-preload': 'lazy_summary',
|
||||
cdn: 'cdn_summary',
|
||||
'next-gen': 'webp_summary',
|
||||
};
|
||||
const locationId = ultraLink.classList.contains( 'wp-smush-ultra-compression-link' ) ? 'settings' : this.getCurrentPageSlug();
|
||||
return locations[ locationId ] || 'bulksmush_settings';
|
||||
};
|
||||
|
||||
ultraUpsellLinks.forEach( ( ultraLink ) => {
|
||||
const eventName = 'ultra_upsell_modal';
|
||||
ultraLink.addEventListener( 'click', ( e ) => {
|
||||
tracker.track( eventName, {
|
||||
Location: getLocation( e.target ),
|
||||
'Modal Action': 'direct_cta',
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackUpsellLinks() {
|
||||
const upsellLinks = document.querySelectorAll( '[href*="utm_source=smush"]' );
|
||||
if ( ! upsellLinks ) {
|
||||
return;
|
||||
}
|
||||
upsellLinks.forEach( ( upsellLink ) => {
|
||||
upsellLink.addEventListener( 'click', ( e ) => {
|
||||
const params = new URL( e.target.href ).searchParams;
|
||||
if ( ! params ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const campaign = params.get( 'utm_campaign' );
|
||||
const upsellLocations = {
|
||||
// CDN.
|
||||
summary_cdn: 'dash_summary',
|
||||
'smush-dashboard-cdn-upsell': 'dash_widget',
|
||||
smush_bulksmush_cdn: 'bulk_smush_progress',
|
||||
smush_cdn_upgrade_button: 'cdn_page',
|
||||
smush_bulksmush_library_gif_cdn: 'media_library',
|
||||
smush_bulk_smush_complete_global: 'bulk_smush_complete',
|
||||
|
||||
// Local Next-Gen.
|
||||
'summary_next-gen': 'dash_summary',
|
||||
'smush-dashboard-next-gen-upsell': 'dash_widget',
|
||||
'smush_next-gen_upgrade_button': 'Next-Gen Formats',// Moved from React WebP - free-content.jsx
|
||||
};
|
||||
|
||||
if ( ! ( campaign in upsellLocations ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const Location = upsellLocations[ campaign ];
|
||||
const matches = campaign.match( /(cdn|next-gen)/i );
|
||||
const upsellModule = matches && matches[ 0 ];
|
||||
|
||||
const eventName = 'next-gen' === upsellModule ? 'local_webp_upsell' : 'cdn_upsell';
|
||||
tracker.track( eventName, { Location } );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackScanInterruptedEventOnStopScanningModal() {
|
||||
const stopScanningModal = document.getElementById( 'smush-stop-scanning-dialog' );
|
||||
if ( ! stopScanningModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const closeButtons = stopScanningModal.querySelectorAll( '[data-modal-close]' );
|
||||
closeButtons.forEach( ( closeButton ) => {
|
||||
closeButton.addEventListener( 'click', ( e ) => {
|
||||
const action = e.target.dataset?.action || 'Close';
|
||||
this.trackScanInterruptedEvent( {
|
||||
Trigger: 'cancel_in_progress',
|
||||
'Modal Action': action,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEventOnStopBulkSmushModal() {
|
||||
const stopBulkSmushModal = document.getElementById( 'smush-stop-bulk-smush-modal' );
|
||||
if ( ! stopBulkSmushModal ) {
|
||||
return;
|
||||
}
|
||||
const closeButtons = stopBulkSmushModal.querySelectorAll( '[data-modal-close]' );
|
||||
closeButtons.forEach( ( closeButton ) => {
|
||||
closeButton.addEventListener( 'click', ( e ) => {
|
||||
const action = e.target.dataset?.action || 'Close';
|
||||
this.trackBulkSmushInterruptedEvent( {
|
||||
Trigger: 'cancel_in_progress',
|
||||
'Modal Action': action,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackScanInterruptedEventOnRetryScanModal() {
|
||||
const retryScanModal = document.getElementById( 'smush-retry-scan-notice' );
|
||||
if ( ! retryScanModal ) {
|
||||
return;
|
||||
}
|
||||
const retryButton = retryScanModal.querySelector( '.smush-retry-scan-notice-button' );
|
||||
if ( retryButton ) {
|
||||
retryButton.addEventListener( 'click', ( e ) => {
|
||||
const recheckImagesBtn = document.querySelector( '.wp-smush-scan' );
|
||||
if ( recheckImagesBtn ) {
|
||||
this.trackScanInterruptedEvent( {
|
||||
Trigger: 'failed_modal',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
|
||||
const event = 'Scan Interrupted';
|
||||
const properties = this.getScanInterruptedEventProperties( {
|
||||
Trigger: 'failed_modal',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
|
||||
tracker.track( event, properties ).catch( () => {
|
||||
this.cacheMissedEvent( {
|
||||
event,
|
||||
properties,
|
||||
} );
|
||||
} ).finally( () => {
|
||||
window.location.href = e.target.href;
|
||||
} );
|
||||
} );
|
||||
}
|
||||
const closeButtons = retryScanModal.querySelectorAll( '[data-modal-close]' );
|
||||
closeButtons.forEach( ( closeButton ) => {
|
||||
closeButton.addEventListener( 'click', ( e ) => {
|
||||
const action = e.target.dataset?.action || 'Close';
|
||||
this.trackScanInterruptedEvent( {
|
||||
Trigger: 'failed_modal',
|
||||
'Modal Action': action,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEventOnRetryBulkSmushModal() {
|
||||
const retryBulkModal = document.getElementById( 'smush-retry-bulk-smush-notice' );
|
||||
if ( ! retryBulkModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const retryButton = retryBulkModal.querySelector( '.smush-retry-bulk-smush-notice-button' );
|
||||
if ( retryButton ) {
|
||||
retryButton.addEventListener( 'click', () => {
|
||||
this.trackBulkSmushInterruptedEvent( {
|
||||
Trigger: 'failed_modal',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
const closeButtons = retryBulkModal.querySelectorAll( '[data-modal-close]' );
|
||||
closeButtons.forEach( ( closeButton ) => {
|
||||
closeButton.addEventListener( 'click', ( e ) => {
|
||||
const action = e.target.dataset?.action || 'Close';
|
||||
this.trackBulkSmushInterruptedEvent( {
|
||||
Trigger: 'failed_modal',
|
||||
'Modal Action': action,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackScanInterruptedEvent( properties ) {
|
||||
return tracker.track( 'Scan Interrupted', this.getScanInterruptedEventProperties( properties ) );
|
||||
}
|
||||
|
||||
getScanInterruptedEventProperties( properties ) {
|
||||
return Object.assign( {
|
||||
Troubleshoot: this.troubleshootClicked ? 'Yes' : 'No',
|
||||
}, properties );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEventWhenExitingAjaxBulkSmush() {
|
||||
if ( this.canUseBackgroundOptimization() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const progressBar = document.querySelector( '.wp-smush-bulk-progress-bar-wrapper' );
|
||||
if ( ! progressBar ) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.addEventListener( 'beforeunload', async () => {
|
||||
const isBulkSmushInProgress = window.WP_Smush?.bulk.isBulkSmushInProgress() && ! progressBar.classList.contains( 'sui-hidden' );
|
||||
if ( ! isBulkSmushInProgress ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isFreeExceeded = progressBar.classList.contains( 'wp-smush-exceed-limit' );
|
||||
|
||||
const event = 'Bulk Smush Interrupted';
|
||||
const properties = this.getBulkSmushInterruptedEventProperties(
|
||||
{
|
||||
Trigger: isFreeExceeded ? 'exit_50_limit' : 'exit_in_progress',
|
||||
'Modal Action': 'Exit',
|
||||
'Retry Attempts': this.resumeBulkSmushCount,
|
||||
}
|
||||
);
|
||||
|
||||
await tracker.track( event, properties ).catch( () => {
|
||||
this.cacheMissedEvent( {
|
||||
event,
|
||||
properties,
|
||||
} );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
cacheMissedEvent( eventData ) {
|
||||
if ( window.localStorage ) {
|
||||
// As now we only use it for one event, so let's keep it as a simple array.
|
||||
window.localStorage.setItem( this.missedEventsKey, JSON.stringify( [ eventData ] ) );
|
||||
}
|
||||
}
|
||||
|
||||
getMissedEvents() {
|
||||
if ( ! window.localStorage ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const properties = window.localStorage.getItem( this.missedEventsKey );
|
||||
if ( ! properties ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return JSON.parse( properties );
|
||||
}
|
||||
|
||||
clearMissedEvents() {
|
||||
if ( window.localStorage ) {
|
||||
window.localStorage.removeItem( this.missedEventsKey );
|
||||
}
|
||||
}
|
||||
|
||||
canUseBackgroundOptimization() {
|
||||
return 'undefined' !== typeof window.wp_smushit_data?.bo_stats;
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEvent( properties ) {
|
||||
return tracker.track( 'Bulk Smush Interrupted', this.getBulkSmushInterruptedEventProperties( properties ) );
|
||||
}
|
||||
|
||||
getBulkSmushInterruptedEventProperties( properties ) {
|
||||
return Object.assign(
|
||||
{
|
||||
Troubleshoot: this.troubleshootClicked ? 'Yes' : 'No',
|
||||
},
|
||||
this.getBulkSmushProcessStats(),
|
||||
properties
|
||||
);
|
||||
}
|
||||
|
||||
getBulkSmushProcessStats() {
|
||||
if ( this.canUseBackgroundOptimization() ) {
|
||||
// Handled it via PHP.
|
||||
return {};
|
||||
}
|
||||
const bulkSmushObject = window.WP_Smush?.bulk;
|
||||
if ( ! bulkSmushObject ) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return {
|
||||
'Retry Attempts': this.resumeBulkSmushCount,
|
||||
'Total Enqueued Images': bulkSmushObject.getTotalEnqueuedImages(),
|
||||
'Completion Percentage': bulkSmushObject.getCompletionPercentage(),
|
||||
};
|
||||
}
|
||||
|
||||
trackInterruptedEventFromInlineNotice() {
|
||||
this.trackInterruptedEventFromInlineNoticeOnDashboard();
|
||||
this.trackBulkSmushInterruptedEventFromInlineNoticeOnBulkSmush();
|
||||
this.trackScanInterruptedEventFromInlineNoticeOnBulkSmush();
|
||||
}
|
||||
|
||||
trackInterruptedEventFromInlineNoticeOnDashboard() {
|
||||
const dashboardBulkElement = document.getElementById( 'smush-box-dashboard-bulk' );
|
||||
if ( ! dashboardBulkElement ) {
|
||||
return;
|
||||
}
|
||||
this.trackBulkSmushInterruptedEventFromInlineNoticeOnDashboard( dashboardBulkElement );
|
||||
this.trackScanInterruptedEventFromInlineNoticeOnDashboard( dashboardBulkElement );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEventFromInlineNoticeOnDashboard( dashboardBulkElement ) {
|
||||
const triggerBulkSmushButton = dashboardBulkElement.querySelector( '.wp-smush-retry-bulk-smush-link' );
|
||||
if ( ! triggerBulkSmushButton ) {
|
||||
return;
|
||||
}
|
||||
triggerBulkSmushButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
|
||||
const event = 'Bulk Smush Interrupted';
|
||||
const properties = this.getBulkSmushInterruptedEventProperties(
|
||||
{
|
||||
Trigger: 'failed_notice',
|
||||
'Modal Action': 'Retry',
|
||||
}
|
||||
);
|
||||
|
||||
tracker.track( event, properties ).catch( () => {
|
||||
this.cacheMissedEvent( {
|
||||
event,
|
||||
properties,
|
||||
} );
|
||||
} ).finally( () => {
|
||||
window.location.href = e.target.href;
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedInlineNoticeEvent() {
|
||||
return this.trackBulkSmushInterruptedEvent( {
|
||||
Trigger: 'failed_notice',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
}
|
||||
|
||||
trackBulkSmushInterruptedEventFromInlineNoticeOnBulkSmush() {
|
||||
const triggerBulkSmushButton = document.querySelector( '.wp-smush-inline-retry-bulk-smush-notice .wp-smush-trigger-bulk-smush' );
|
||||
if ( ! triggerBulkSmushButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
triggerBulkSmushButton.addEventListener( 'click', () => {
|
||||
this.trackBulkSmushInterruptedInlineNoticeEvent();
|
||||
} );
|
||||
}
|
||||
|
||||
trackScanInterruptedEventFromInlineNoticeOnDashboard( dashboardBulkElement ) {
|
||||
const triggerScanButton = dashboardBulkElement.querySelector( '.wp-smush-retry-scan-link' );
|
||||
if ( ! triggerScanButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
triggerScanButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
|
||||
const event = 'Scan Interrupted';
|
||||
const properties = this.getScanInterruptedEventProperties( {
|
||||
Trigger: 'failed_notice',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
|
||||
tracker.track( event, properties ).catch( () => {
|
||||
this.cacheMissedEvent( {
|
||||
event,
|
||||
properties,
|
||||
} );
|
||||
} ).finally( () => {
|
||||
window.location.href = e.target.href;
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
trackScanInterruptedEventFromInlineNoticeOnBulkSmush() {
|
||||
const recheckImagesNotice = document.querySelector( '.wp-smush-recheck-images-notice-box' );
|
||||
if ( ! recheckImagesNotice ) {
|
||||
return;
|
||||
}
|
||||
const triggerBackgroundScanImagesLink = recheckImagesNotice.querySelector( '.wp-smush-trigger-background-scan' );
|
||||
if ( triggerBackgroundScanImagesLink ) {
|
||||
triggerBackgroundScanImagesLink.addEventListener( 'click', () => {
|
||||
// We are using the same frame for failed scan notice and generic required scan notice,
|
||||
// so we need to verify the failed notice before tracking the event.
|
||||
const containTroubleshootingLink = triggerBackgroundScanImagesLink?.previousElementSibling?.querySelector( 'a' );
|
||||
if ( ! containTroubleshootingLink ) {
|
||||
return;
|
||||
}
|
||||
this.trackScanInterruptedEvent( {
|
||||
Trigger: 'failed_notice',
|
||||
'Modal Action': 'Retry',
|
||||
} );
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
trackInterruptedEventFromLoopbackErrorModal() {
|
||||
const loopbackErrorModal = document.getElementById( 'smush-loopback-error-dialog' );
|
||||
if ( ! loopbackErrorModal ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const loopbackErrorDocsLink = loopbackErrorModal.querySelector( 'a[href*="#loopback-request-issue"]' );
|
||||
let isTroubleshootClicked = false;
|
||||
if ( loopbackErrorDocsLink ) {
|
||||
loopbackErrorDocsLink.addEventListener( 'click', () => {
|
||||
isTroubleshootClicked = true;
|
||||
}, { once: true } );
|
||||
}
|
||||
|
||||
const trackLoopbackErrorEvent = ( action, processType ) => {
|
||||
const properties = {
|
||||
Trigger: 'loopback_error',
|
||||
'Modal Action': action,
|
||||
Troubleshoot: isTroubleshootClicked ? 'Yes' : 'No',
|
||||
};
|
||||
|
||||
if ( 'scan' === processType ) {
|
||||
this.trackScanInterruptedEvent( properties );
|
||||
} else {
|
||||
this.trackBulkSmushInterruptedEvent( properties );
|
||||
}
|
||||
};
|
||||
|
||||
const closeButtons = loopbackErrorModal.querySelectorAll( '[data-modal-close]' );
|
||||
closeButtons.forEach( ( closeButton ) => {
|
||||
closeButton.addEventListener( 'click', ( e ) => {
|
||||
const action = e.target.dataset?.action || 'Close';
|
||||
const processType = loopbackErrorModal.dataset?.processType || 'scan';
|
||||
trackLoopbackErrorEvent( action, processType );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
registerTroubleshootClickEvent() {
|
||||
const troubleshootLinks = document.querySelectorAll( 'a[href*="#troubleshooting-guide"]' );
|
||||
if ( ! troubleshootLinks ) {
|
||||
return;
|
||||
}
|
||||
|
||||
troubleshootLinks.forEach( ( troubleshootLink ) => {
|
||||
troubleshootLink.addEventListener( 'click', () => {
|
||||
this.troubleshootClicked = true;
|
||||
}, { once: true } );
|
||||
} );
|
||||
}
|
||||
|
||||
maybeTrackMissedEventsOnLoad() {
|
||||
window.addEventListener( 'load', () => {
|
||||
const missedEvents = this.getMissedEvents();
|
||||
if ( 0 === missedEvents.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.clearMissedEvents();
|
||||
|
||||
missedEvents.forEach( ( missedEvent ) => {
|
||||
tracker.track( missedEvent.event, missedEvent.properties );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
registerBulkSmushResumeClickEvent() {
|
||||
const resumeBulkSmushButton = document.querySelector( '.wp-smush-resume-bulk-smush' );
|
||||
if ( ! resumeBulkSmushButton ) {
|
||||
return;
|
||||
}
|
||||
|
||||
resumeBulkSmushButton.addEventListener( 'click', () => {
|
||||
this.resumeBulkSmushCount += 1;
|
||||
} );
|
||||
}
|
||||
|
||||
getCurrentPageSlug() {
|
||||
const searchParams = new URLSearchParams( document.location.search );
|
||||
const pageSlug = searchParams.get( 'page' );
|
||||
return 'smush' === pageSlug ? 'dashboard' : pageSlug.replace( 'smush-', '' );
|
||||
}
|
||||
}
|
||||
|
||||
( new ProductAnalytics() ).init();
|
||||
@@ -0,0 +1,317 @@
|
||||
/* global ajaxurl */
|
||||
/* global wp_smush_msgs */
|
||||
/* global WP_Smush */
|
||||
/* global SUI */
|
||||
|
||||
( function( $ ) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Bulk compress page.
|
||||
*/
|
||||
$( 'form#smush-bulk-form' ).on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload' );
|
||||
saveSettings( $( this ).serialize(), 'bulk' );
|
||||
// runReCheck();
|
||||
} );
|
||||
|
||||
/**
|
||||
* Lazy load page.
|
||||
*/
|
||||
const lazyLoadForm = $( 'form#smush-lazy-preload-form' );
|
||||
lazyLoadForm.on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
const tabField = $( this ).find( '[name="tab"]' );
|
||||
const isLazyLoadPage = tabField.length && 'lazy_load' === tabField.val();
|
||||
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload-text' );
|
||||
saveSettings( $( this ).serialize(), isLazyLoadPage ? 'lazy-load' : 'preload' );
|
||||
} );
|
||||
|
||||
lazyLoadForm.on( 'keydown', function( e ) {
|
||||
if ( e.key === 'Enter' ) {
|
||||
lazyLoadForm.trigger( 'submit' );
|
||||
}
|
||||
} );
|
||||
|
||||
/**
|
||||
* CDN page.
|
||||
*/
|
||||
$( 'form#smush-cdn-form' ).on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload-text' );
|
||||
saveSettings( $( this ).serialize(), 'cdn' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Next-Gen page.
|
||||
*/
|
||||
$( 'form#smush-next-gen-form' ).on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload-text' );
|
||||
saveSettings( $( this ).serialize(), 'next-gen' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Integrations page.
|
||||
*/
|
||||
$( 'form#smush-integrations-form' ).on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload-text' );
|
||||
saveSettings( $( this ).serialize(), 'integrations' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Settings page.
|
||||
*/
|
||||
$( 'form#smush-settings-form' ).on( 'submit', function( e ) {
|
||||
e.preventDefault();
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload-text' );
|
||||
saveSettings( $( this ).serialize(), 'settings' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Save settings.
|
||||
*
|
||||
* @param {string} settings JSON string of settings.
|
||||
* @param {string} page Settings page.
|
||||
*/
|
||||
function saveSettings( settings, page ) {
|
||||
const xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_save_settings', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
|
||||
xhr.onload = () => {
|
||||
$( '#save-settings-button' ).removeClass(
|
||||
'sui-button-onload-text sui-button-onload'
|
||||
);
|
||||
|
||||
if ( 200 === xhr.status ) {
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 'undefined' !== typeof res.success && res.success ) {
|
||||
showSuccessNotice( wp_smush_msgs.settingsUpdated );
|
||||
triggerSavedSmushSettingsEvent( res.data );
|
||||
} else if ( res.data && res.data.message ) {
|
||||
WP_Smush.helpers.showErrorNotice( res.data.message );
|
||||
} else {
|
||||
WP_Smush.helpers.showErrorNotice( 'Request failed.' );
|
||||
}
|
||||
} else {
|
||||
WP_Smush.helpers.showErrorNotice( 'Request failed. Returned status of ' + xhr.status );
|
||||
}
|
||||
};
|
||||
|
||||
xhr.send( 'page=' + page + '&' + settings + '&_ajax_nonce=' + wp_smush_msgs.nonce );
|
||||
}
|
||||
|
||||
function triggerSavedSmushSettingsEvent( status ) {
|
||||
document.dispatchEvent(
|
||||
new CustomEvent( 'onSavedSmushSettings', {
|
||||
detail: status
|
||||
} )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show successful update notice.
|
||||
*
|
||||
* @param {string} msg Notice message.
|
||||
*/
|
||||
function showSuccessNotice( msg ) {
|
||||
const noticeMessage = `<p>${ msg }</p>`,
|
||||
noticeOptions = {
|
||||
type: 'success',
|
||||
icon: 'check',
|
||||
};
|
||||
|
||||
SUI.openNotice( 'wp-smush-ajax-notice', noticeMessage, noticeOptions );
|
||||
|
||||
const loadingButton = document.querySelector( '.sui-button-onload' );
|
||||
if ( loadingButton ) {
|
||||
loadingButton.classList.remove( 'sui-button-onload' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-check images from bulk smush and integrations pages.
|
||||
*/
|
||||
function runReCheck() {
|
||||
$( '#save-settings-button' ).addClass( 'sui-button-onload' );
|
||||
|
||||
const param = {
|
||||
action: 'scan_for_resmush',
|
||||
wp_smush_options_nonce: $( '#wp_smush_options_nonce' ).val(),
|
||||
type: 'media',
|
||||
};
|
||||
|
||||
// Send ajax, Update Settings, And Check For resmush.
|
||||
$.post( ajaxurl, $.param( param ) ).done( function() {
|
||||
$( '#save-settings-button' ).removeClass( 'sui-button-onload' );
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse remove data change.
|
||||
*/
|
||||
$( 'input[name=keep_data]' ).on( 'change', function( e ) {
|
||||
const otherClass =
|
||||
'keep_data-true' === e.target.id
|
||||
? 'keep_data-false'
|
||||
: 'keep_data-true';
|
||||
e.target.parentNode.classList.add( 'active' );
|
||||
document
|
||||
.getElementById( otherClass )
|
||||
.parentNode.classList.remove( 'active' );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Handle highlighting notice display based on detection checkbox state.
|
||||
*/
|
||||
function handleHighlightingNotice( isAfterSave = false ) {
|
||||
const detectionEnabled = $( '#detection' ).is( ':checked' );
|
||||
const $notice = $( '.smush-highlighting-notice' );
|
||||
const $warning = $( '.smush-highlighting-warning' );
|
||||
|
||||
if ( ! detectionEnabled ) {
|
||||
$notice.hide();
|
||||
$warning.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( isAfterSave ) {
|
||||
$notice.show();
|
||||
$warning.hide();
|
||||
} else {
|
||||
// Show warning only if notice isn't visible yet.
|
||||
const noticeVisible = $notice.is( ':visible' ) || $notice.css( 'display' ) !== 'none';
|
||||
if ( noticeVisible ) {
|
||||
$notice.show();
|
||||
$warning.hide();
|
||||
} else {
|
||||
$notice.hide();
|
||||
$warning.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle auto-detect checkbox toggle, to show/hide highlighting notice.
|
||||
*/
|
||||
$( 'input#detection' ).on( 'click', function () {
|
||||
handleHighlightingNotice( false );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Handle settings saved event.
|
||||
*/
|
||||
$( document ).on( 'onSavedSmushSettings', function () {
|
||||
handleHighlightingNotice( true );
|
||||
} );
|
||||
|
||||
/**
|
||||
* Form notice via query var smush-notice handler.
|
||||
*/
|
||||
const formNoticeHandler = () => {
|
||||
if ( ! window.URL || ! window.URLSearchParams ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const url = new URL( window.location );
|
||||
const noticeKey = url.searchParams.get( 'smush-notice' );
|
||||
if ( ! noticeKey ) {
|
||||
return;
|
||||
}
|
||||
|
||||
document.dispatchEvent(
|
||||
new CustomEvent( `on-smush-${ noticeKey }-notice` )
|
||||
);
|
||||
|
||||
// Remove the smush-notice query parameter.
|
||||
url.searchParams.delete( 'smush-notice' );
|
||||
window.history.replaceState( {}, document.title, url.toString() );
|
||||
};
|
||||
|
||||
formNoticeHandler();
|
||||
|
||||
// Handle toggle fields.
|
||||
const toggleFieldVisibility = ( fieldVisibilitySettings, fieldWrapperClassName ) => {
|
||||
for ( const fieldName in fieldVisibilitySettings ) {
|
||||
const field = document.querySelector( `[name="${ fieldName }"]` );
|
||||
if ( ! field ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const fieldWrapper = field.closest( `.${ fieldWrapperClassName }` );
|
||||
if ( ! fieldWrapper ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( 'show' === fieldVisibilitySettings[ fieldName ] ) {
|
||||
fieldWrapper.classList.remove( 'sui-hidden' );
|
||||
} else {
|
||||
fieldWrapper.classList.add( 'sui-hidden' );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const toggleFieldsHandler = () => {
|
||||
const settingsForm = document.querySelector( '.wp-smush-settings-form' );
|
||||
if ( ! settingsForm ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const fieldWrapperClassName = 'sui-box-settings-row';
|
||||
const conditionalFields = settingsForm.querySelectorAll( '[data-toggle-fields]' );
|
||||
if ( conditionalFields ) {
|
||||
conditionalFields.forEach( function( conditionalField ) {
|
||||
const fieldVisibilitySettings = JSON.parse( conditionalField.dataset.toggleFields );
|
||||
if ( ! fieldVisibilitySettings && 'object' !== typeof fieldVisibilitySettings ) {
|
||||
return;
|
||||
}
|
||||
|
||||
conditionalField.addEventListener( 'change', function() {
|
||||
if ( ! this.checked ) {
|
||||
return;
|
||||
}
|
||||
|
||||
toggleFieldVisibility( fieldVisibilitySettings, fieldWrapperClassName );
|
||||
} );
|
||||
} );
|
||||
}
|
||||
|
||||
if ( window.SUI?.tabs ) {
|
||||
window.SUI.tabs(
|
||||
{
|
||||
callback( tab, panel ) {
|
||||
const conditionalField = tab.next( '[data-toggle-fields]' );
|
||||
if ( conditionalField.length ) {
|
||||
const fieldVisibilitySettings = conditionalField.data( 'toggle-fields' );
|
||||
if ( fieldVisibilitySettings && 'object' === typeof fieldVisibilitySettings ) {
|
||||
toggleFieldVisibility( fieldVisibilitySettings, fieldWrapperClassName );
|
||||
}
|
||||
}
|
||||
|
||||
const childFields = panel.find( '[data-toggle-fields]' );
|
||||
if ( childFields.length ) {
|
||||
childFields.each( function() {
|
||||
if ( $( this ).is( ':checked' ) ) {
|
||||
const fieldVisibilitySettings = $( this ).data( 'toggle-fields' );
|
||||
if ( fieldVisibilitySettings && 'object' === typeof fieldVisibilitySettings ) {
|
||||
toggleFieldVisibility( fieldVisibilitySettings, fieldWrapperClassName );
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
toggleFieldsHandler();
|
||||
}( jQuery ) );
|
||||
@@ -0,0 +1,133 @@
|
||||
/* global WP_Smush */
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* WebP functionality.
|
||||
*
|
||||
* @since 3.8.0
|
||||
*/
|
||||
import Fetcher from '../utils/fetcher';
|
||||
import NextGen from './next-gen';
|
||||
|
||||
class WebP extends NextGen {
|
||||
constructor() {
|
||||
super( 'webp' );
|
||||
|
||||
this.recheckStatusButton = document.getElementById( 'smush-webp-recheck' );
|
||||
this.recheckStatusLink = document.getElementById( 'smush-webp-recheck-link' );
|
||||
this.showWizardButton = document.getElementById( 'smush-webp-toggle-wizard' );
|
||||
this.switchWebpMethod = document.getElementById( 'smush-switch-webp-method' );
|
||||
|
||||
this.webpInit();
|
||||
}
|
||||
|
||||
webpInit() {
|
||||
/**
|
||||
* Handle "RE-CHECK STATUS' button click on WebP page.
|
||||
*/
|
||||
if ( this.recheckStatusButton ) {
|
||||
this.recheckStatusButton.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.recheckStatus();
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "RE-CHECK STATUS' link click on WebP page.
|
||||
*/
|
||||
if ( this.recheckStatusLink ) {
|
||||
this.recheckStatusLink.addEventListener( 'click', ( e ) => {
|
||||
e.preventDefault();
|
||||
this.recheckStatus();
|
||||
} );
|
||||
}
|
||||
|
||||
if ( this.showWizardButton ) {
|
||||
this.showWizardButton.addEventListener(
|
||||
'click',
|
||||
this.toggleWizard
|
||||
);
|
||||
}
|
||||
|
||||
if ( this.switchWebpMethod ) {
|
||||
this.switchWebpMethod.addEventListener(
|
||||
'click',
|
||||
( e ) => {
|
||||
e.preventDefault();
|
||||
e.target.classList.add( 'wp-smush-link-in-progress' );
|
||||
this.switchMethod( this.switchWebpMethod.dataset.method );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
switchMethod( newMethod ) {
|
||||
Fetcher.webp.switchMethod( newMethod ).then( ( res ) => {
|
||||
if ( ! res?.success ) {
|
||||
WP_Smush.helpers.showNotice( res );
|
||||
return;
|
||||
}
|
||||
window.location.reload();
|
||||
} );
|
||||
}
|
||||
|
||||
/**
|
||||
* re-check server configuration for WebP.
|
||||
*/
|
||||
recheckStatus() {
|
||||
this.recheckStatusButton.classList.add( 'sui-button-onload' );
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open( 'POST', ajaxurl + '?action=smush_webp_get_status', true );
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
xhr.onload = () => {
|
||||
this.recheckStatusButton.classList.remove( 'sui-button-onload' );
|
||||
let message = false;
|
||||
const res = JSON.parse( xhr.response );
|
||||
if ( 200 === xhr.status ) {
|
||||
const isConfigured = res.success ? '1' : '0';
|
||||
if (
|
||||
isConfigured !==
|
||||
this.recheckStatusButton.dataset.isConfigured
|
||||
) {
|
||||
// Reload the page when the configuration status changed.
|
||||
location.reload();
|
||||
}
|
||||
} else {
|
||||
message = window.wp_smush_msgs.generic_ajax_error;
|
||||
}
|
||||
|
||||
if ( res && res.data ) {
|
||||
message = res.data;
|
||||
}
|
||||
|
||||
if ( message ) {
|
||||
this.showNotice( message );
|
||||
}
|
||||
};
|
||||
xhr.send( '_ajax_nonce=' + window.wp_smush_msgs.webp_nonce );
|
||||
}
|
||||
|
||||
toggleWizard( e ) {
|
||||
e.currentTarget.classList.add( 'sui-button-onload' );
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
'GET',
|
||||
ajaxurl +
|
||||
'?action=smush_toggle_webp_wizard&_ajax_nonce=' +
|
||||
window.wp_smush_msgs.webp_nonce,
|
||||
true
|
||||
);
|
||||
xhr.onload = () => location.href = window.wp_smush_msgs.nextGenURL;
|
||||
xhr.send();
|
||||
}
|
||||
}
|
||||
|
||||
( function() {
|
||||
'use strict';
|
||||
WP_Smush.WebP = new WebP();
|
||||
}() );
|
||||
@@ -0,0 +1,200 @@
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import assign from 'lodash/assign';
|
||||
|
||||
/**
|
||||
* Wrapper function for ajax calls to WordPress.
|
||||
*
|
||||
* @since 3.12.0
|
||||
*/
|
||||
function SmushFetcher() {
|
||||
/**
|
||||
* Request ajax with a promise.
|
||||
* Use FormData Object as data if you need to upload file
|
||||
*
|
||||
* @param {string} action
|
||||
* @param {Object|FormData} data
|
||||
* @param {string} method
|
||||
* @return {Promise<any>} Request results.
|
||||
*/
|
||||
function request(action, data = {}, method = 'POST') {
|
||||
const args = {
|
||||
url: ajaxurl,
|
||||
method,
|
||||
cache: false
|
||||
};
|
||||
|
||||
if (data instanceof FormData) {
|
||||
data.append('action', action);
|
||||
data.append('_ajax_nonce', window.wp_smush_msgs.nonce);
|
||||
args.contentType = false;
|
||||
args.processData = false;
|
||||
} else {
|
||||
data._ajax_nonce = data._ajax_nonce || window.smush_global.nonce || window.wp_smush_msgs.nonce;
|
||||
data.action = action;
|
||||
}
|
||||
args.data = data;
|
||||
return new Promise((resolve, reject) => {
|
||||
jQuery.ajax(args).done(resolve).fail(reject);
|
||||
}).then((response) => {
|
||||
if (typeof response !== 'object') {
|
||||
response = JSON.parse(response);
|
||||
}
|
||||
return response;
|
||||
}).catch((error) => {
|
||||
console.error('Error:', error);
|
||||
return error;
|
||||
});
|
||||
}
|
||||
|
||||
const methods = {
|
||||
/**
|
||||
* Manage ajax for background.
|
||||
*/
|
||||
background: {
|
||||
/**
|
||||
* Start background process.
|
||||
*/
|
||||
start: () => {
|
||||
return request('bulk_smush_start');
|
||||
},
|
||||
|
||||
/**
|
||||
* Cancel background process.
|
||||
*/
|
||||
cancel: () => {
|
||||
return request('bulk_smush_cancel');
|
||||
},
|
||||
|
||||
/**
|
||||
* Initial State - Get stats on the first time.
|
||||
*/
|
||||
initState: () => {
|
||||
return request('bulk_smush_get_status');
|
||||
},
|
||||
|
||||
/**
|
||||
* Get stats.
|
||||
*/
|
||||
getStatus: () => {
|
||||
return request('bulk_smush_get_status');
|
||||
},
|
||||
|
||||
getStats: () => {
|
||||
return request('bulk_smush_get_global_stats');
|
||||
},
|
||||
|
||||
backgroundHealthyCheck: () => {
|
||||
return request('smush_start_background_pre_flight_check');
|
||||
},
|
||||
|
||||
backgroundHealthyStatus: () => {
|
||||
return request('smush_get_background_pre_flight_status');
|
||||
}
|
||||
},
|
||||
smush: {
|
||||
/**
|
||||
* Sync stats.
|
||||
*/
|
||||
syncStats: ( data ) => {
|
||||
data = data || {};
|
||||
return request('get_stats', data);
|
||||
},
|
||||
|
||||
/**
|
||||
* Ignore All.
|
||||
*/
|
||||
ignoreAll: ( type ) => {
|
||||
return request('wp_smush_ignore_all_failed_items', {
|
||||
type: type,
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* Manage ajax for other requests
|
||||
*/
|
||||
common: {
|
||||
/**
|
||||
* Dismiss Notice.
|
||||
*
|
||||
* @param {string} dismissId Notification id.
|
||||
*/
|
||||
dismissNotice: (dismissId) => {
|
||||
return request('smush_dismiss_notice', {
|
||||
key: dismissId
|
||||
});
|
||||
},
|
||||
|
||||
remindReviewPrompt: () => {
|
||||
return request( 'wp_smush_review_prompts_remind_later' );
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide the new features modal.
|
||||
*
|
||||
* @param {string} modalID Notification id.
|
||||
*/
|
||||
hideModal: (modalID) => request('hide_modal', {
|
||||
modal_id: modalID,
|
||||
}),
|
||||
|
||||
track: ( event, properties ) => request('smush_analytics_track_event', {
|
||||
event,
|
||||
properties
|
||||
}),
|
||||
|
||||
/**
|
||||
* Custom request.
|
||||
*
|
||||
* @param {Object} data
|
||||
*/
|
||||
request: (data) => data.action && request(data.action, data),
|
||||
},
|
||||
|
||||
scanMediaLibrary: {
|
||||
start: ( optimize_on_scan_completed = false ) => {
|
||||
optimize_on_scan_completed = optimize_on_scan_completed ? 1 : 0;
|
||||
const _ajax_nonce = window.wp_smushit_data.media_library_scan.nonce;
|
||||
return request( 'wp_smush_start_background_scan', {
|
||||
optimize_on_scan_completed,
|
||||
_ajax_nonce,
|
||||
} );
|
||||
},
|
||||
|
||||
cancel: () => {
|
||||
const _ajax_nonce = window.wp_smushit_data.media_library_scan.nonce;
|
||||
return request( 'wp_smush_cancel_background_scan', {
|
||||
_ajax_nonce,
|
||||
} );
|
||||
},
|
||||
|
||||
getScanStatus: () => {
|
||||
const _ajax_nonce = window.wp_smushit_data.media_library_scan.nonce;
|
||||
return request( 'wp_smush_get_background_scan_status', {
|
||||
_ajax_nonce,
|
||||
} );
|
||||
},
|
||||
},
|
||||
|
||||
webp: {
|
||||
switchMethod: ( method ) => {
|
||||
return request( 'webp_switch_method', { method } );
|
||||
},
|
||||
},
|
||||
|
||||
settings: {
|
||||
disconnectSite: () => {
|
||||
return request( 'wp_smush_disconnect_site' );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
assign(this, methods);
|
||||
}
|
||||
|
||||
const SmushAjax = new SmushFetcher();
|
||||
export default SmushAjax;
|
||||
@@ -0,0 +1,49 @@
|
||||
import Fetcher from './fetcher';
|
||||
|
||||
class Tracker {
|
||||
/* @private */
|
||||
#doingEvents = new Set();
|
||||
#allowToTrack;
|
||||
|
||||
track( event, properties = {} ) {
|
||||
if ( ! this.allowToTrack() || this.inProgressEvent( event ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.setInProgressEvent( event );
|
||||
|
||||
return Fetcher.common.track( event, properties ).then( ( res ) => {
|
||||
setTimeout( () => {
|
||||
this.restoreInProgressEvent( event );
|
||||
}, 1000 );
|
||||
|
||||
return res;
|
||||
} );
|
||||
}
|
||||
|
||||
inProgressEvent( event ) {
|
||||
return this.#doingEvents.has( event );
|
||||
}
|
||||
|
||||
setInProgressEvent( event ) {
|
||||
this.#doingEvents.add( event );
|
||||
}
|
||||
|
||||
restoreInProgressEvent( event ) {
|
||||
this.#doingEvents.delete( event );
|
||||
}
|
||||
|
||||
allowToTrack() {
|
||||
return this.#allowToTrack || !! ( window.wp_smush_mixpanel?.opt_in );
|
||||
}
|
||||
|
||||
setAllowToTrack( allowToTrack ) {
|
||||
this.#allowToTrack = allowToTrack;
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
const tracker = new Tracker();
|
||||
|
||||
export default tracker;
|
||||
@@ -0,0 +1,91 @@
|
||||
import React, {useEffect, useRef, useState} from "react";
|
||||
import {post} from "../utils/request";
|
||||
import MediaLibraryScannerModal from "./media-library-scanner-modal";
|
||||
|
||||
export default function AjaxMediaLibraryScannerModal(
|
||||
{
|
||||
nonce = '',
|
||||
onScanCompleted = () => false,
|
||||
onClose = () => false,
|
||||
focusAfterClose = ''
|
||||
}
|
||||
) {
|
||||
const [inProgress, setInProgress] = useState(false);
|
||||
const [progress, setProgress] = useState(0);
|
||||
const [cancelled, setCancelled] = useState(false);
|
||||
const cancelledRef = useRef();
|
||||
|
||||
useEffect(() => {
|
||||
cancelledRef.current = cancelled;
|
||||
}, [cancelled]);
|
||||
|
||||
function start() {
|
||||
setInProgress(true);
|
||||
|
||||
post('wp_smush_before_scan_library', nonce).then((response) => {
|
||||
const sliceCount = response?.slice_count;
|
||||
const slicesList = range(sliceCount, 1);
|
||||
const parallelRequests = response?.parallel_requests;
|
||||
|
||||
handleBatch(slicesList, sliceCount, parallelRequests)
|
||||
.then(() => {
|
||||
setTimeout(() => {
|
||||
onScanCompleted();
|
||||
}, 1000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function handleBatch(remainingSlicesList, sliceCount, parallelRequests) {
|
||||
const batchPromises = [];
|
||||
const completedSliceCount = Math.max(sliceCount - remainingSlicesList.length, 0);
|
||||
const batch = remainingSlicesList.splice(0, parallelRequests);
|
||||
|
||||
updateProgress(completedSliceCount, sliceCount);
|
||||
|
||||
batch.forEach((sliceNumber) => {
|
||||
batchPromises.push(
|
||||
post('wp_smush_scan_library_slice', nonce, {slice: sliceNumber})
|
||||
);
|
||||
});
|
||||
|
||||
return new Promise((resolve) => {
|
||||
Promise.all(batchPromises)
|
||||
.then(() => {
|
||||
if (!cancelledRef.current) {
|
||||
if (remainingSlicesList.length) {
|
||||
handleBatch(remainingSlicesList, sliceCount, parallelRequests)
|
||||
.then(resolve);
|
||||
} else {
|
||||
updateProgress(sliceCount, sliceCount);
|
||||
resolve();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function range(size, startAt = 0) {
|
||||
return [...Array(size).keys()].map(i => i + startAt);
|
||||
}
|
||||
|
||||
function cancelScan() {
|
||||
setCancelled(true);
|
||||
setInProgress(false);
|
||||
setProgress(0);
|
||||
}
|
||||
|
||||
function updateProgress(completedSlices, totalSlices) {
|
||||
const progress = (completedSlices / totalSlices) * 100;
|
||||
setProgress(progress);
|
||||
}
|
||||
|
||||
return <MediaLibraryScannerModal
|
||||
inProgress={inProgress}
|
||||
progress={progress}
|
||||
onCancel={cancelScan}
|
||||
focusAfterClose={focusAfterClose}
|
||||
onClose={onClose}
|
||||
onStart={start}
|
||||
/>;
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
import React, {useRef, useState} from "react";
|
||||
import {post} from "../utils/request";
|
||||
import MediaLibraryScannerModal from "./media-library-scanner-modal";
|
||||
|
||||
export default function BackgroundMediaLibraryScannerModal(
|
||||
{
|
||||
nonce = '',
|
||||
onScanCompleted = () => false,
|
||||
onClose = () => false,
|
||||
focusAfterClose = ''
|
||||
}
|
||||
) {
|
||||
const [inProgress, setInProgress] = useState(false);
|
||||
const [progress, setProgress] = useState(0);
|
||||
const [cancelled, setCancelled] = useState(false);
|
||||
const progressTimeoutId = useRef(0);
|
||||
|
||||
function start() {
|
||||
post('wp_smush_start_background_scan', nonce).then(() => {
|
||||
setInProgress(true);
|
||||
progressTimeoutId.current = setTimeout(updateProgress, 2000);
|
||||
});
|
||||
}
|
||||
|
||||
function clearProgressTimeout() {
|
||||
if (progressTimeoutId.current) {
|
||||
clearTimeout(progressTimeoutId.current);
|
||||
}
|
||||
}
|
||||
|
||||
function updateProgress() {
|
||||
post('wp_smush_get_background_scan_status', nonce).then(response => {
|
||||
const isCompleted = response?.is_completed;
|
||||
if (isCompleted) {
|
||||
clearProgressTimeout();
|
||||
onScanCompleted();
|
||||
return;
|
||||
}
|
||||
|
||||
const isCancelled = response?.is_cancelled;
|
||||
if (isCancelled) {
|
||||
clearProgressTimeout();
|
||||
changeStateToCancelled();
|
||||
return;
|
||||
}
|
||||
|
||||
const totalItems = response?.total_items;
|
||||
const processedItems = response?.processed_items;
|
||||
const progress = (processedItems / totalItems) * 100;
|
||||
setProgress(progress);
|
||||
|
||||
progressTimeoutId.current = setTimeout(updateProgress, 1000);
|
||||
});
|
||||
}
|
||||
|
||||
function cancelScan() {
|
||||
clearProgressTimeout();
|
||||
post('wp_smush_cancel_background_scan', nonce)
|
||||
.then(changeStateToCancelled);
|
||||
}
|
||||
|
||||
function changeStateToCancelled() {
|
||||
setCancelled(true);
|
||||
setProgress(0);
|
||||
setInProgress(false);
|
||||
}
|
||||
|
||||
return <MediaLibraryScannerModal
|
||||
inProgress={inProgress}
|
||||
progress={progress}
|
||||
onCancel={cancelScan}
|
||||
focusAfterClose={focusAfterClose}
|
||||
onClose={onClose}
|
||||
onStart={start}
|
||||
/>;
|
||||
};
|
||||
@@ -0,0 +1,49 @@
|
||||
import React, {useEffect, useRef, useState} from "react";
|
||||
import Modal from "../common/modal";
|
||||
import {post} from "../utils/request";
|
||||
import Button from "../common/button";
|
||||
import ProgressBar from "../common/progress-bar";
|
||||
|
||||
const {__} = wp.i18n;
|
||||
|
||||
export default function MediaLibraryScannerModal(
|
||||
{
|
||||
inProgress = false,
|
||||
progress = 0,
|
||||
onClose = () => false,
|
||||
onStart = () => false,
|
||||
onCancel = () => false,
|
||||
focusAfterClose = ''
|
||||
}
|
||||
) {
|
||||
function content() {
|
||||
if (inProgress) {
|
||||
return <>
|
||||
<ProgressBar progress={progress}/>
|
||||
<Button id="wp-smush-cancel-media-library-scan"
|
||||
icon="sui-icon-close"
|
||||
text={__('Cancel', 'wp-smushit')}
|
||||
ghost={true}
|
||||
onClick={onCancel}
|
||||
/>
|
||||
</>;
|
||||
} else {
|
||||
return <>
|
||||
<Button id="wp-smush-start-media-library-scan"
|
||||
icon="sui-icon-play"
|
||||
text={__('Start', 'wp-smushit')}
|
||||
onClick={onStart}
|
||||
/>
|
||||
</>;
|
||||
}
|
||||
}
|
||||
|
||||
return <Modal id="wp-smush-media-library-scanner-modal"
|
||||
title={__('Scan Media Library', 'wp-smushit')}
|
||||
description={__('Scans the media library to detect items to Smush.', 'wp-smushit')}
|
||||
onClose={onClose}
|
||||
focusAfterClose={focusAfterClose}
|
||||
disableCloseButton={inProgress}>
|
||||
{content()}
|
||||
</Modal>;
|
||||
};
|
||||
@@ -0,0 +1,52 @@
|
||||
import React, {useState} from "react";
|
||||
import domReady from '@wordpress/dom-ready';
|
||||
import ReactDOM from "react-dom";
|
||||
import Button from "../common/button";
|
||||
import FloatingNoticePlaceholder from "../common/floating-notice-placeholder";
|
||||
import {showSuccessNotice} from "../utils/notices";
|
||||
import AjaxMediaLibraryScannerModal from "./ajax-media-library-scanner-modal";
|
||||
import BackgroundMediaLibraryScannerModal from "./background-media-library-scanner-modal";
|
||||
|
||||
const {__} = wp.i18n;
|
||||
|
||||
function MediaLibraryScanner({}) {
|
||||
const [modalOpen, setModalOpen] = useState(false);
|
||||
|
||||
return <>
|
||||
<FloatingNoticePlaceholder id="wp-smush-media-library-scanner-notice"/>
|
||||
|
||||
{modalOpen &&
|
||||
<BackgroundMediaLibraryScannerModal
|
||||
focusAfterClose="wp-smush-open-media-library-scanner"
|
||||
nonce={mediaLibraryScan.nonce}
|
||||
onScanCompleted={() => {
|
||||
showSuccessNotice(
|
||||
'wp-smush-media-library-scanner-notice',
|
||||
__('Scan completed successfully!', 'wp-smushit'),
|
||||
true
|
||||
);
|
||||
setModalOpen(false);
|
||||
window.location.reload();
|
||||
}}
|
||||
onClose={() => setModalOpen(false)}
|
||||
/>
|
||||
}
|
||||
|
||||
<Button id="wp-smush-open-media-library-scanner" text={__('Re-Check Images', 'wp-smushit')}
|
||||
className="wp-smush-scan"
|
||||
icon="sui-icon-update"
|
||||
disabled={modalOpen}
|
||||
onClick={() => setModalOpen(true)}
|
||||
/>
|
||||
</>;
|
||||
}
|
||||
|
||||
domReady(function () {
|
||||
const scannerContainer = document.getElementById('wp-smush-media-library-scanner');
|
||||
if (scannerContainer) {
|
||||
ReactDOM.render(
|
||||
<MediaLibraryScanner/>,
|
||||
scannerContainer
|
||||
);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,70 @@
|
||||
import React from "react";
|
||||
import classnames from "classnames";
|
||||
|
||||
export default function Button(
|
||||
{
|
||||
id = "",
|
||||
text = "",
|
||||
color = "",
|
||||
dashed = false,
|
||||
icon = '',
|
||||
loading = false,
|
||||
ghost = false,
|
||||
disabled = false,
|
||||
href = "",
|
||||
target = "",
|
||||
className = "",
|
||||
onClick = () => false,
|
||||
}
|
||||
) {
|
||||
function handleClick(e) {
|
||||
e.preventDefault();
|
||||
|
||||
onClick();
|
||||
}
|
||||
|
||||
function textTag() {
|
||||
const iconTag = icon ? <span className={icon} aria-hidden="true"/> : "";
|
||||
return (
|
||||
<span className={classnames({"sui-loading-text": loading})}>
|
||||
{iconTag} {text}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
function loadingIcon() {
|
||||
return loading
|
||||
? <span className="sui-icon-loader sui-loading" aria-hidden="true"/>
|
||||
: "";
|
||||
}
|
||||
|
||||
let HtmlTag, props;
|
||||
if (href) {
|
||||
HtmlTag = 'a';
|
||||
props = {href: href, target: target};
|
||||
} else {
|
||||
HtmlTag = 'button';
|
||||
props = {
|
||||
disabled: disabled,
|
||||
onClick: e => handleClick(e)
|
||||
};
|
||||
}
|
||||
const hasText = text && text.trim();
|
||||
|
||||
return (
|
||||
<HtmlTag
|
||||
{...props}
|
||||
className={classnames(className, "sui-button-" + color, {
|
||||
"sui-button-onload": loading,
|
||||
"sui-button-ghost": ghost,
|
||||
"sui-button-icon": !hasText,
|
||||
"sui-button-dashed": dashed,
|
||||
"sui-button": hasText
|
||||
})}
|
||||
id={id}
|
||||
>
|
||||
{textTag()}
|
||||
{loadingIcon()}
|
||||
</HtmlTag>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import React from "react";
|
||||
|
||||
export default function FloatingNoticePlaceholder({id = ''}) {
|
||||
return <div className="sui-floating-notices">
|
||||
<div role="alert"
|
||||
id={id}
|
||||
className="sui-notice"
|
||||
aria-live="assertive">
|
||||
</div>
|
||||
</div>;
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
import React, {useEffect} from 'react';
|
||||
import classnames from 'classnames';
|
||||
import SUI from 'SUI';
|
||||
import $ from 'jquery';
|
||||
|
||||
const {__} = wp.i18n;
|
||||
|
||||
export default function Modal(
|
||||
{
|
||||
id = '',
|
||||
title = '',
|
||||
description = '',
|
||||
small = false,
|
||||
headerActions = false,
|
||||
focusAfterOpen = '',
|
||||
focusAfterClose = 'container',
|
||||
dialogClasses = [],
|
||||
disableCloseButton = false,
|
||||
enterDisabled = false,
|
||||
beforeTitle = false,
|
||||
onEnter = () => false,
|
||||
onClose = () => false,
|
||||
footer,
|
||||
children
|
||||
}
|
||||
) {
|
||||
useEffect(() => {
|
||||
SUI.openModal(
|
||||
id,
|
||||
focusAfterClose,
|
||||
focusAfterOpen ? focusAfterOpen : getTitleId(),
|
||||
false,
|
||||
false
|
||||
);
|
||||
|
||||
return () => SUI.closeModal();
|
||||
}, []);
|
||||
|
||||
const handleKeyDown = (event) => {
|
||||
const isTargetInput = $(event.target).is('.sui-modal.sui-active input');
|
||||
if (isTargetInput && event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
if (!enterDisabled && onEnter) {
|
||||
onEnter(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getTitleId() {
|
||||
return id + '-modal-title';
|
||||
}
|
||||
|
||||
function getHeaderActions() {
|
||||
const closeButton = getCloseButton();
|
||||
if (small) {
|
||||
return closeButton;
|
||||
} else if (headerActions) {
|
||||
return headerActions;
|
||||
} else {
|
||||
return <div className="sui-actions-right">{closeButton}</div>
|
||||
}
|
||||
}
|
||||
|
||||
function getCloseButton() {
|
||||
return <button id={id + '-close-button'}
|
||||
type="button"
|
||||
onClick={() => onClose()}
|
||||
disabled={disableCloseButton}
|
||||
className={classnames("sui-button-icon", {
|
||||
'sui-button-float--right': small
|
||||
})}>
|
||||
|
||||
<span className="sui-icon-close sui-md" aria-hidden="true"/>
|
||||
<span className="sui-screen-reader-text">
|
||||
{__('Close this dialog window', 'wds')}
|
||||
</span>
|
||||
</button>
|
||||
}
|
||||
|
||||
function getDialogClasses() {
|
||||
return Object.assign({}, {
|
||||
'sui-modal-sm': small,
|
||||
'sui-modal-lg': !small
|
||||
}, dialogClasses);
|
||||
}
|
||||
|
||||
return <div className={classnames('sui-modal', getDialogClasses())}
|
||||
onKeyDown={e => handleKeyDown(e)}>
|
||||
<div role="dialog"
|
||||
id={id}
|
||||
className={classnames('sui-modal-content', id + '-modal')}
|
||||
aria-modal="true"
|
||||
aria-labelledby={id + '-modal-title'}
|
||||
aria-describedby={id + '-modal-description'}>
|
||||
|
||||
<div className="sui-box" role="document">
|
||||
<div className={classnames('sui-box-header', {
|
||||
'sui-flatten sui-content-center sui-spacing-top--40': small
|
||||
})}>
|
||||
{beforeTitle}
|
||||
|
||||
<h3 id={getTitleId()}
|
||||
className={classnames('sui-box-title', {
|
||||
'sui-lg': small
|
||||
})}>
|
||||
|
||||
{title}
|
||||
</h3>
|
||||
|
||||
{getHeaderActions()}
|
||||
</div>
|
||||
|
||||
<div className={classnames('sui-box-body', {
|
||||
'sui-content-center': small
|
||||
})}>
|
||||
{description &&
|
||||
<p className="sui-description"
|
||||
id={id + '-modal-description'}>
|
||||
{description}
|
||||
</p>}
|
||||
|
||||
{children}
|
||||
</div>
|
||||
|
||||
{footer && <div className="sui-box-footer">
|
||||
{footer}
|
||||
</div>}
|
||||
</div>
|
||||
</div>
|
||||
</div>;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import React from "react";
|
||||
|
||||
export default function ProgressBar(
|
||||
{
|
||||
progress = 0,
|
||||
stateMessage = ''
|
||||
}
|
||||
) {
|
||||
progress = Math.ceil(progress);
|
||||
const progressPercentage = progress + "%";
|
||||
|
||||
return (
|
||||
<React.Fragment>
|
||||
<div className="sui-progress-block">
|
||||
<div className="sui-progress">
|
||||
<span className="sui-progress-icon" aria-hidden="true">
|
||||
<span className="sui-icon-loader sui-loading"/>
|
||||
</span>
|
||||
|
||||
<div className="sui-progress-text">{progressPercentage}</div>
|
||||
|
||||
<div className="sui-progress-bar">
|
||||
<span
|
||||
style={{
|
||||
transition: progress === 0 ? false : "transform 0.4s linear 0s",
|
||||
transformOrigin: "left center",
|
||||
transform: `translateX(${progress - 100}%)`,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="sui-progress-state">{stateMessage}</div>
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
import domReady from '@wordpress/dom-ready';
|
||||
const { __, sprintf } = wp.i18n;
|
||||
|
||||
/**
|
||||
* SUI dependencies
|
||||
*/
|
||||
import { Presets } from '@wpmudev/shared-presets';
|
||||
|
||||
export const Configs = ({ isWidget }) => {
|
||||
// TODO: Handle the html interpolation and translation better.
|
||||
const proDescription = (
|
||||
<>
|
||||
{__(
|
||||
'You can easily apply configs to multiple sites at once via ',
|
||||
'wp-smushit'
|
||||
)}
|
||||
<a
|
||||
href={window.smushReact.links.hubConfigs}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{__('the Hub.')}
|
||||
</a>
|
||||
</>
|
||||
);
|
||||
|
||||
const closeIcon = __('Close this dialog window', 'wp-smushit'),
|
||||
cancelButton = __('Cancel', 'wp-smushit');
|
||||
|
||||
const lang = {
|
||||
title: __('Preset Configs', 'wp-smushit'),
|
||||
upload: __('Upload', 'wp-smushit'),
|
||||
save: __('Save config', 'wp-smushit'),
|
||||
loading: __('Updating the config list…', 'wp-smushit'),
|
||||
emptyNotice: __(
|
||||
'You don’t have any available config. Save preset configurations of Smush’s settings, then upload and apply them to your other sites in just a few clicks!',
|
||||
'wp-smushit'
|
||||
),
|
||||
baseDescription: __(
|
||||
'Use configs to save preset configurations of Smush’s settings, then upload and apply them to your other sites in just a few clicks!',
|
||||
'wp-smushit'
|
||||
),
|
||||
freeNoticeMessage: __( 'Tired of saving, downloading and uploading your configs across your sites? WPMU DEV members use The Hub to easily apply configs to multiple sites at once… Try it today!', 'wp-smushit' ),
|
||||
proDescription,
|
||||
syncWithHubText: __(
|
||||
'Created or updated configs via the Hub?',
|
||||
'wp-smushit'
|
||||
),
|
||||
syncWithHubButton: __('Check again', 'wp-smushit'),
|
||||
apply: __('Apply', 'wp-smushit'),
|
||||
download: __('Download', 'wp-smushit'),
|
||||
edit: __('Name and Description', 'wp-smushit'),
|
||||
delete: __('Delete', 'wp-smushit'),
|
||||
notificationDismiss: __('Dismiss notice', 'wp-smushit'),
|
||||
freeButtonLabel: __('Try The Hub', 'wp-smushit'),
|
||||
defaultRequestError: sprintf(
|
||||
/* translators: %s request status */
|
||||
__(
|
||||
'Request failed. Status: %s. Please reload the page and try again.',
|
||||
'wp-smushit'
|
||||
),
|
||||
'{status}'
|
||||
),
|
||||
uploadActionSuccessMessage: sprintf(
|
||||
/* translators: %s request status */
|
||||
__(
|
||||
'%s config has been uploaded successfully – you can now apply it to this site.',
|
||||
'wp-smushit'
|
||||
),
|
||||
'{configName}'
|
||||
),
|
||||
uploadWrongPluginErrorMessage: sprintf(
|
||||
/* translators: %s {pluginName} */
|
||||
__(
|
||||
'The uploaded file is not a %s Config. Please make sure the uploaded file is correct.',
|
||||
'wp-smushit'
|
||||
),
|
||||
'{pluginName}'
|
||||
),
|
||||
applyAction: {
|
||||
closeIcon,
|
||||
cancelButton,
|
||||
title: __('Apply Config', 'wp-smushit'),
|
||||
description: sprintf(
|
||||
/* translators: %s config name */
|
||||
__(
|
||||
'Are you sure you want to apply the %s config to this site? We recommend you have a backup available as your existing settings configuration will be overridden.',
|
||||
'wp-smushit'
|
||||
),
|
||||
'{configName}'
|
||||
),
|
||||
actionButton: __('Apply', 'wp-smushit'),
|
||||
successMessage: sprintf(
|
||||
/* translators: %s. config name */
|
||||
__('%s config has been applied successfully.', 'wp-smushit'),
|
||||
'{configName}'
|
||||
),
|
||||
},
|
||||
deleteAction: {
|
||||
closeIcon,
|
||||
cancelButton,
|
||||
title: __('Delete Configuration File', 'wp-smushit'),
|
||||
description: sprintf(
|
||||
/* translators: %s config name */
|
||||
__(
|
||||
'Are you sure you want to delete %s? You will no longer be able to apply it to this or other connected sites.',
|
||||
'wp-smushit'
|
||||
),
|
||||
'{configName}'
|
||||
),
|
||||
actionButton: __('Delete', 'wp-smushit'),
|
||||
},
|
||||
editAction: {
|
||||
closeIcon,
|
||||
cancelButton,
|
||||
nameInput: __('Config name', 'wp-smushit'),
|
||||
descriptionInput: __('Description', 'wp-smushit'),
|
||||
emptyNameError: __('The config name is required', 'wp-smushit'),
|
||||
actionButton: __('Save', 'wp-smushit'),
|
||||
editTitle: __('Rename Config', 'wp-smushit'),
|
||||
editDescription: __(
|
||||
'Change your config name to something recognizable.',
|
||||
'wp-smushit'
|
||||
),
|
||||
createTitle: __('Save Config', 'wp-smushit'),
|
||||
createDescription: __(
|
||||
'Save your current settings configuration. You’ll be able to then download and apply it to your other sites.',
|
||||
'wp-smushit'
|
||||
),
|
||||
successMessage: sprintf(
|
||||
/* translators: %s. config name */
|
||||
__('%s config created successfully.', 'wp-smushit'),
|
||||
'{configName}'
|
||||
),
|
||||
},
|
||||
settingsLabels: {
|
||||
bulk_smush: __('Bulk Smush', 'wp-smushit'),
|
||||
integrations: __('Integrations', 'wp-smushit'),
|
||||
// Settings::LAZY_PRELOAD_MODULE_NAME.
|
||||
lazy_load: __('Lazy Load & Preload', 'wp-smushit'),
|
||||
cdn: __('CDN', 'wp-smushit'),
|
||||
next_gen: __('Next-Gen Formats', 'wp-smushit'),
|
||||
settings: __('Settings', 'wp-smushit'),
|
||||
networkwide: __('Subsite Controls', 'wp-smushit'),
|
||||
},
|
||||
};
|
||||
|
||||
return (
|
||||
<Presets
|
||||
isWidget={isWidget}
|
||||
isPro={false}
|
||||
isWhitelabel={window.smushReact.hideBranding}
|
||||
sourceLang={lang}
|
||||
sourceUrls={window.smushReact.links}
|
||||
requestsData={window.smushReact.requestsData}
|
||||
proItems={[
|
||||
'PNG to JPEG Conversion',
|
||||
'Email Notification',
|
||||
'CDN',
|
||||
'Next-Gen Formats',
|
||||
'Amazon S3',
|
||||
'NextGen Gallery',
|
||||
'Preload Critical Images',
|
||||
'Auto Resizing',
|
||||
'Add Missing Image Dimensions',
|
||||
] }
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
domReady(function () {
|
||||
const configsPageBox = document.getElementById('smush-box-configs');
|
||||
if (configsPageBox) {
|
||||
createRoot(configsPageBox).render(<Configs isWidget={false} />);
|
||||
}
|
||||
const configsWidgetBox = document.getElementById('smush-widget-configs');
|
||||
if (configsWidgetBox) {
|
||||
createRoot(configsWidgetBox).render(<Configs isWidget={true} />);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
/* global ajaxurl */
|
||||
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
import domReady from '@wordpress/dom-ready';
|
||||
|
||||
/**
|
||||
* Internal dependencies
|
||||
*/
|
||||
import StepsBar from '../views/webp/steps-bar';
|
||||
import StepContent from '../views/webp/step-content';
|
||||
import FreeContent from '../views/webp/free-content';
|
||||
import StepFooter from '../views/webp/step-footer';
|
||||
|
||||
export const WebpPage = ({ smushData }) => {
|
||||
const [currentStep, setCurrentStep] = React.useState(
|
||||
parseInt(smushData.startStep)
|
||||
);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (2 === currentStep) {
|
||||
window.SUI.suiCodeSnippet();
|
||||
}
|
||||
}, [currentStep]);
|
||||
|
||||
const [serverType, setServerType] = React.useState(
|
||||
smushData.detectedServer
|
||||
);
|
||||
const [rulesMethod, setRulesMethod] = React.useState('automatic');
|
||||
const [rulesError, setRulesError] = React.useState(false);
|
||||
|
||||
const makeRequest = (action, verb = 'GET') => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open(
|
||||
verb,
|
||||
`${ajaxurl}?action=${action}&_ajax_nonce=${smushData.nonce}`,
|
||||
true
|
||||
);
|
||||
|
||||
xhr.setRequestHeader(
|
||||
'Content-type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
|
||||
xhr.onload = () => {
|
||||
if (xhr.status >= 200 && xhr.status < 300) {
|
||||
resolve(JSON.parse(xhr.response));
|
||||
} else {
|
||||
reject(xhr);
|
||||
}
|
||||
};
|
||||
xhr.onerror = () => reject(xhr);
|
||||
xhr.send();
|
||||
});
|
||||
};
|
||||
|
||||
const stepContent = smushData.isPro ? (
|
||||
<StepContent
|
||||
currentStep={currentStep}
|
||||
serverType={serverType}
|
||||
rulesMethod={rulesMethod}
|
||||
setRulesMethod={setRulesMethod}
|
||||
rulesError={rulesError}
|
||||
setServerType={setServerType}
|
||||
smushData={smushData}
|
||||
makeRequest={makeRequest}
|
||||
/>
|
||||
) : (
|
||||
<FreeContent smushData={smushData} />
|
||||
);
|
||||
|
||||
return (
|
||||
<React.Fragment>
|
||||
<div className="sui-box-body sui-no-padding">
|
||||
<div className="sui-row-with-sidenav">
|
||||
{ smushData.isPro && <StepsBar smushData={smushData} currentStep={currentStep} /> }
|
||||
{stepContent}
|
||||
</div>
|
||||
</div>
|
||||
{smushData.isPro && (
|
||||
<StepFooter
|
||||
currentStep={currentStep}
|
||||
setCurrentStep={setCurrentStep}
|
||||
serverType={serverType}
|
||||
rulesMethod={rulesMethod}
|
||||
setRulesError={setRulesError}
|
||||
makeRequest={makeRequest}
|
||||
/>
|
||||
)}
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
domReady(function () {
|
||||
const webpPageBox = document.getElementById('smush-box-webp-wizard');
|
||||
if (webpPageBox) {
|
||||
const root = createRoot(webpPageBox);
|
||||
root.render( <WebpPage smushData={window.smushReact} /> );
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
export function showSuccessNotice(id, message, dismissible = true) {
|
||||
return showNotice(id, message, 'success', dismissible);
|
||||
}
|
||||
|
||||
export function showErrorNotice(id, message, dismissible = true) {
|
||||
return showNotice(id, message, 'error', dismissible);
|
||||
}
|
||||
|
||||
export function showInfoNotice(id, message, dismissible = true) {
|
||||
return showNotice(id, message, 'info', dismissible);
|
||||
}
|
||||
|
||||
export function showWarningNotice(id, message, dismissible = true) {
|
||||
return showNotice(id, message, 'warning', dismissible);
|
||||
}
|
||||
|
||||
export function closeNotice(id) {
|
||||
SUI.closeNotice(id);
|
||||
}
|
||||
|
||||
export function showNotice(id, message, type = 'success', dismissible = true) {
|
||||
const icons = {
|
||||
error: 'warning-alert',
|
||||
info: 'info',
|
||||
warning: 'warning-alert',
|
||||
success: 'check-tick'
|
||||
};
|
||||
|
||||
SUI.closeNotice(id);
|
||||
SUI.openNotice(id, '<p>' + message + '</p>', {
|
||||
type: type,
|
||||
icon: icons[type],
|
||||
dismiss: {show: dismissible}
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import $ from 'jquery';
|
||||
import ajaxUrl from 'ajaxUrl';
|
||||
|
||||
export function post(action, nonce, data = {}) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
const request = Object.assign({}, {
|
||||
action: action,
|
||||
_ajax_nonce: nonce
|
||||
}, data);
|
||||
|
||||
$.post(ajaxUrl, request)
|
||||
.done((response) => {
|
||||
if (response.success) {
|
||||
resolve(
|
||||
response?.data
|
||||
);
|
||||
} else {
|
||||
reject(response?.data?.message);
|
||||
}
|
||||
})
|
||||
.fail(() => reject());
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
import tracker from '../../../js/utils/tracker';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
const {__} = wp.i18n;
|
||||
|
||||
export default ({smushData}) => {
|
||||
|
||||
return (
|
||||
<React.Fragment>
|
||||
<div className="sui-box-header">
|
||||
<h3 className="sui-box-title">
|
||||
{__('Next-Gen Formats', 'wp-smushit')}
|
||||
</h3>
|
||||
</div>
|
||||
<div className="sui-box-body">
|
||||
<div className="sui-message">
|
||||
<img
|
||||
className="sui-image"
|
||||
src={smushData.urls.freeImg}
|
||||
srcSet={smushData.urls.freeImg2x + ' 2x'}
|
||||
alt={__('Smush WebP', 'wp-smushit')}
|
||||
/>
|
||||
|
||||
<div className="sui-message-content">
|
||||
<p>
|
||||
{__(
|
||||
'Fix the "Serve images in next-gen format" Google PageSpeed recommendation with a single click! Serve WebP and AVIF images directly from your server to supported browsers, while seamlessly switching to original images for those without WebP or AVIF support. All without relying on a CDN or any server configuration.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</p>
|
||||
|
||||
<ol className="sui-upsell-list">
|
||||
<li>
|
||||
<span
|
||||
className="sui-icon-check sui-sm"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{__(
|
||||
'Activate the Next-Gen Formats feature with a single click; no server configuration required.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
<li>
|
||||
<span
|
||||
className="sui-icon-check sui-sm"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{__(
|
||||
'Fix “Serve images in next-gen format" Google PageSpeed recommendation.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
<li>
|
||||
<span
|
||||
className="sui-icon-check sui-sm"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{__(
|
||||
'Serve WebP and AVIF version of images in the browsers that support it and fall back to JPEGs and PNGs for unsupported browsers.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<p className="sui-margin-top">
|
||||
<a
|
||||
href={smushData.urls.upsell}
|
||||
className="sui-button sui-button-purple"
|
||||
style={{marginRight: '30px'}}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
onClick={ () => {
|
||||
tracker.track( 'local_webp_upsell', {
|
||||
Location: 'Next-Gen Formats',
|
||||
} );
|
||||
} }
|
||||
>
|
||||
{__( 'UNLOCK NEXT-GEN FORMATS WITH PRO', 'wp-smushit')}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,450 @@
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
const { __, sprintf } = wp.i18n;
|
||||
|
||||
export default ({
|
||||
currentStep,
|
||||
serverType,
|
||||
rulesMethod,
|
||||
setRulesMethod,
|
||||
setServerType,
|
||||
rulesError,
|
||||
smushData,
|
||||
makeRequest,
|
||||
}) => {
|
||||
const stepsHeading = {
|
||||
1: {
|
||||
title: __('Choose Server Type', 'wp-smushit'),
|
||||
description: __(
|
||||
'Choose your server type. If you don’t know this, please contact your hosting provider.',
|
||||
'wp-smushit'
|
||||
),
|
||||
},
|
||||
2: {
|
||||
title: __('Add Rules', 'wp-smushit'),
|
||||
description:
|
||||
'apache' === serverType
|
||||
? __(
|
||||
'Smush can automatically apply WebP conversion rules for Apache servers by writing to your .htaccess file. Alternatively, switch to Manual to apply these rules yourself.',
|
||||
'wp-smushit'
|
||||
)
|
||||
: __(
|
||||
'The following configurations are for NGINX servers. If you do not have access to your NGINX config files you will need to contact your hosting provider to make these changes.',
|
||||
'wp-smushit'
|
||||
),
|
||||
},
|
||||
3: {
|
||||
title: __('Finish Setup', 'wp-smushit'),
|
||||
description: __(
|
||||
'The rules have been applied successfully.',
|
||||
'wp-smushit'
|
||||
),
|
||||
},
|
||||
};
|
||||
|
||||
const getTopNotice = () => {
|
||||
if (1 === currentStep && smushData.isS3Enabled) {
|
||||
return (
|
||||
<div className="sui-notice sui-notice-warning">
|
||||
<div className="sui-notice-content">
|
||||
<div className="sui-notice-message">
|
||||
<span
|
||||
className="sui-notice-icon sui-icon-info sui-md"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
<p>
|
||||
{__(
|
||||
'We noticed the Amazon S3 Integration is enabled. Offloaded images will not be served in WebP format, but Smush will create local WebP copies of all images. If this is undesirable, you can quit the setup.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (2 === currentStep) {
|
||||
const switchDirectConversionMethod = ( e ) => {
|
||||
e.preventDefault();
|
||||
WP_Smush.WebP.switchMethod( 'direct_conversion' );
|
||||
};
|
||||
|
||||
const suggestionMessage = sprintf(
|
||||
/* translators: 1: Opening <button> tag, 2: Closing button, 3: Opening support link, 4: Closing the link */
|
||||
__( 'Please try the %1$sDirect Conversion%2$s method if you don’t have server access, or %3$scontact support%4$s for further assistance.', 'wp-smushit' ),
|
||||
'<button type="submit" style="text-decoration: none; color: #17A8E3; font-weight: 500; outline-color: transparent; outline-style: none; box-shadow: none;padding:0;margin:0;background:transparent;border:none;cursor:pointer;">',
|
||||
'</button>',
|
||||
'<a href="https://wpmudev.com/hub2/support/#get-support" target="_blank">',
|
||||
'</a>'
|
||||
);
|
||||
return (
|
||||
<div
|
||||
role="alert"
|
||||
className="sui-notice sui-notice-warning"
|
||||
aria-live="assertive"
|
||||
style={rulesError ? { display: 'block' } : {}}
|
||||
>
|
||||
{rulesError && (
|
||||
<div className="sui-notice-content">
|
||||
<div className="sui-notice-message">
|
||||
<span
|
||||
className="sui-notice-icon sui-icon-info sui-md"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
<p
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: rulesError,
|
||||
}}
|
||||
/>
|
||||
<form onSubmit={ switchDirectConversionMethod }><p dangerouslySetInnerHTML={{ __html: suggestionMessage }} /></form>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (smushData.isWpmudevHost) {
|
||||
const message = !smushData.isWhitelabel
|
||||
? __(
|
||||
'Since your site is hosted with WPMU DEV, we already have done the configurations steps for you. The only step for you would be to create WebP images below.',
|
||||
'wp-smushit'
|
||||
)
|
||||
: __(
|
||||
'WebP conversion is active and working well. Your hosting has automatically pre-configured the conversion for you. The only step for you would be to create WebP images below.',
|
||||
'wp-smushit'
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="sui-notice sui-notice-info">
|
||||
<div className="sui-notice-content">
|
||||
<div className="sui-notice-message">
|
||||
<span
|
||||
className="sui-notice-icon sui-icon-info sui-md"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
<p>{message}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const getStepContent = () => {
|
||||
if (1 === currentStep) {
|
||||
return (
|
||||
<React.Fragment>
|
||||
<div className="sui-box-selectors">
|
||||
<ul>
|
||||
<li>
|
||||
<label
|
||||
htmlFor="smush-wizard-server-type-apache"
|
||||
className="sui-box-selector"
|
||||
>
|
||||
<input
|
||||
id="smush-wizard-server-type-apache"
|
||||
type="radio"
|
||||
value="apache"
|
||||
checked={'apache' === serverType}
|
||||
onChange={(e) =>
|
||||
setServerType(e.currentTarget.value)
|
||||
}
|
||||
/>
|
||||
<span>{__('Apache', 'wp-smushit')}</span>
|
||||
</label>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<label
|
||||
htmlFor="smush-wizard-server-type-nginx"
|
||||
className="sui-box-selector"
|
||||
>
|
||||
<input
|
||||
id="smush-wizard-server-type-nginx"
|
||||
type="radio"
|
||||
value="nginx"
|
||||
checked={'nginx' === serverType}
|
||||
onChange={(e) =>
|
||||
setServerType(e.currentTarget.value)
|
||||
}
|
||||
/>
|
||||
<span>{__('NGINX', 'wp-smushit')}</span>
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="sui-notice" style={{ textAlign: 'left' }}>
|
||||
<div className="sui-notice-content">
|
||||
<div className="sui-notice-message">
|
||||
<span
|
||||
className="sui-notice-icon sui-icon-info sui-md"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
<p>
|
||||
{sprintf(
|
||||
/* translators: server type */
|
||||
__(
|
||||
"We've automatically detected your server type is %s. If this is incorrect, manually select your server type to generate the relevant rules and instructions.",
|
||||
'wp-smushit'
|
||||
),
|
||||
'nginx' === smushData.detectedServer
|
||||
? 'NGINX'
|
||||
: 'Apache / LiteSpeed'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
if (2 === currentStep) {
|
||||
if ('nginx' === serverType) {
|
||||
return (
|
||||
<div className="smush-wizard-rules-wrapper">
|
||||
<ol className="sui-description">
|
||||
<li>
|
||||
{__(
|
||||
'Insert the following in the server context of your configuration file (usually found in /etc/nginx/sites-available). “The server context” refers to the part of the configuration that starts with “server {” and ends with the matching “}”.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
<li>
|
||||
{__(
|
||||
'Copy the generated code found below and paste it inside your http or server blocks.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<pre
|
||||
className="sui-code-snippet"
|
||||
style={{ marginLeft: '12px' }}
|
||||
>
|
||||
{smushData.nginxRules}
|
||||
</pre>
|
||||
<ol className="sui-description" start="3">
|
||||
<li>{__('Reload NGINX.', 'wp-smushit')}</li>
|
||||
</ol>
|
||||
{!smushData.isWhitelabel && (
|
||||
<p className="sui-description">
|
||||
{__('Still having trouble?', 'wp_smushit')}{' '}
|
||||
<a href={smushData.urls.support} target="_blank" rel="noreferrer">
|
||||
{__('Get Support.', 'wp_smushit')}
|
||||
</a>
|
||||
</p>
|
||||
)}
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: The non-selected button isn't focusable this way. Why arrows don't workkkkkkk?
|
||||
return (
|
||||
<div className="sui-side-tabs sui-tabs">
|
||||
<div role="tablist" className="sui-tabs-menu">
|
||||
<button
|
||||
type="button"
|
||||
role="tab"
|
||||
id="smush-tab-automatic"
|
||||
className={
|
||||
'sui-tab-item' +
|
||||
('automatic' === rulesMethod ? ' active' : '')
|
||||
}
|
||||
aria-controls="smush-tab-content-automatic"
|
||||
aria-selected={'automatic' === rulesMethod}
|
||||
onClick={() => setRulesMethod('automatic')}
|
||||
tabIndex={'automatic' === rulesMethod ? '0' : '-1'}
|
||||
>
|
||||
{__('Automatic', 'wp-smushit')}
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
role="tab"
|
||||
id="smush-tab-manual"
|
||||
className={
|
||||
'sui-tab-item' +
|
||||
('manual' === rulesMethod ? ' active' : '')
|
||||
}
|
||||
aria-controls="smush-tab-content-manual"
|
||||
aria-selected={'manual' === rulesMethod}
|
||||
onClick={() => setRulesMethod('manual')}
|
||||
tabIndex={'manual' === rulesMethod ? '0' : '-1'}
|
||||
>
|
||||
{__('Manual', 'wp-smushit')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="sui-tabs-content">
|
||||
<div
|
||||
role="tabpanel"
|
||||
tabIndex="0"
|
||||
id="smush-tab-content-automatic"
|
||||
className={
|
||||
'sui-tab-content' +
|
||||
('automatic' === rulesMethod ? ' active' : '')
|
||||
}
|
||||
aria-labelledby="smush-tab-automatic"
|
||||
hidden={'automatic' !== rulesMethod}
|
||||
>
|
||||
<p
|
||||
className="sui-description"
|
||||
style={{ marginTop: '30px' }}
|
||||
>
|
||||
{__(
|
||||
'Please note: Some servers have both Apache and NGINX software which may not begin serving WebP images after applying the .htaccess rules. If errors occur after applying the rules, we recommend adding NGINX rules manually.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div
|
||||
role="tabpanel"
|
||||
tabIndex="0"
|
||||
id="smush-tab-content-manual"
|
||||
className={
|
||||
'sui-tab-content' +
|
||||
('manual' === rulesMethod ? ' active' : '')
|
||||
}
|
||||
aria-labelledby="smush-tab-manual"
|
||||
hidden={'manual' !== rulesMethod}
|
||||
>
|
||||
<p className="sui-description">
|
||||
{__(
|
||||
'If you are unable to get the automated method working, follow these steps:',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</p>
|
||||
|
||||
<div className="smush-wizard-rules-wrapper">
|
||||
<ol className="sui-description">
|
||||
<li>
|
||||
{__(
|
||||
'Copy the generated code below and paste it at the top of your .htaccess file (before any existing code) in the root directory.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<pre
|
||||
className="sui-code-snippet"
|
||||
style={{ marginLeft: '12px' }}
|
||||
>
|
||||
{smushData.apacheRules}
|
||||
</pre>
|
||||
<ol className="sui-description" start="2">
|
||||
<li>
|
||||
{__(
|
||||
"Next, click Check Status button below to see if it's working.",
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h5
|
||||
className="sui-settings-label"
|
||||
style={{
|
||||
marginTop: '30px',
|
||||
fontSize: '13px',
|
||||
color: '#333333',
|
||||
}}
|
||||
>
|
||||
{__('Troubleshooting', 'wp-smushit')}
|
||||
</h5>
|
||||
|
||||
<p className="sui-description">
|
||||
{__(
|
||||
'If .htaccess does not work, and you have access to vhosts.conf or httpd.conf, try this:',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</p>
|
||||
|
||||
<ol className="sui-description">
|
||||
<li>
|
||||
{__(
|
||||
'Look for your site in the file and find the line that starts with <Directory> - add the code above that line and into that section and save the file.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
<li>
|
||||
{__('Reload Apache.', 'wp-smushit')}
|
||||
</li>
|
||||
<li>
|
||||
{__(
|
||||
"If you don't know where those files are, or you aren't able to reload Apache, you would need to consult with your hosting provider or a system administrator who has access to change the configuration of your server.",
|
||||
'wp-smushit'
|
||||
)}
|
||||
</li>
|
||||
</ol>
|
||||
{!smushData.isWhitelabel && (
|
||||
<p className="sui-description">
|
||||
{__('Still having trouble?', 'wp_smushit')}{' '}
|
||||
<a href={smushData.urls.support} target="_blank" rel="noreferrer">
|
||||
{__('Get Support.', 'wp_smushit')}
|
||||
</a>
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const hideWizard = (e) => {
|
||||
e.preventDefault();
|
||||
makeRequest('smush_toggle_webp_wizard').then(() => {
|
||||
location.href = smushData.urls.bulkPage;
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<React.Fragment>
|
||||
<p style={{ marginBottom: 0 }}><b>{__('Convert Images to WebP', 'wp-smushit')}</b></p>
|
||||
<p className="sui-description" dangerouslySetInnerHTML={ { __html: smushData.thirdStepMsg } } />
|
||||
{!smushData.isMultisite && (
|
||||
<p>
|
||||
<a href={smushData.urls.bulkPage} onClick={hideWizard}>
|
||||
{__('Convert now', 'wp-smushit')}
|
||||
</a>
|
||||
</p>
|
||||
)}
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
const stepIndicatorText = sprintf(
|
||||
/* translators: currentStep/totalSteps indicator */
|
||||
__('Step %s', 'wp-smushit'),
|
||||
currentStep + '/3'
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`smush-wizard-steps-content-wrapper smush-wizard-step-${currentStep}`}
|
||||
>
|
||||
{getTopNotice()}
|
||||
<div className="smush-wizard-steps-content">
|
||||
<span className="smush-step-indicator">
|
||||
{stepIndicatorText}
|
||||
</span>
|
||||
<h2>{stepsHeading[currentStep].title}</h2>
|
||||
<p className="sui-description">
|
||||
{stepsHeading[currentStep].description}
|
||||
</p>
|
||||
{getStepContent()}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,180 @@
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
const { __ } = wp.i18n;
|
||||
|
||||
export default ({
|
||||
currentStep,
|
||||
setCurrentStep,
|
||||
serverType,
|
||||
rulesMethod,
|
||||
setRulesError,
|
||||
makeRequest,
|
||||
}) => {
|
||||
const genericRequestError = __(
|
||||
'Something went wrong with the request.',
|
||||
'wp-smushit'
|
||||
);
|
||||
|
||||
const checkStatus = () => {
|
||||
setRulesError(false);
|
||||
|
||||
makeRequest('smush_webp_get_status')
|
||||
.then((res) => {
|
||||
if (res.success) {
|
||||
setCurrentStep(currentStep + 1);
|
||||
} else {
|
||||
setRulesError(res.data);
|
||||
}
|
||||
})
|
||||
.catch(() => setRulesError(genericRequestError));
|
||||
};
|
||||
|
||||
const applyRules = () => {
|
||||
setRulesError(false);
|
||||
|
||||
makeRequest('smush_webp_apply_htaccess_rules')
|
||||
.then((res) => {
|
||||
if (res.success) {
|
||||
return checkStatus();
|
||||
}
|
||||
|
||||
setRulesError(res.data);
|
||||
})
|
||||
.catch(() => setRulesError(genericRequestError));
|
||||
};
|
||||
|
||||
const hideWizard = (e) => {
|
||||
e.currentTarget.classList.add(
|
||||
'sui-button-onload',
|
||||
'sui-button-onload-text'
|
||||
);
|
||||
makeRequest('smush_toggle_webp_wizard').then(() => location.reload());
|
||||
};
|
||||
|
||||
// Markup stuff.
|
||||
let buttonsLeft;
|
||||
|
||||
const quitButton = (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-ghost"
|
||||
onClick={hideWizard}
|
||||
>
|
||||
<span className="sui-loading-text">
|
||||
<span className="sui-icon-logout" aria-hidden="true"></span>
|
||||
<span className="sui-hidden-xs">
|
||||
{__('Quit setup', 'wp-smushit')}
|
||||
</span>
|
||||
<span className="sui-hidden-sm sui-hidden-md sui-hidden-lg">
|
||||
{__('Quit', 'wp-smushit')}
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<span
|
||||
className="sui-icon-loader sui-loading"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
</button>
|
||||
);
|
||||
|
||||
if (1 !== currentStep) {
|
||||
buttonsLeft = (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-compound sui-button-ghost"
|
||||
onClick={() => setCurrentStep(currentStep - 1)}
|
||||
>
|
||||
<span className="sui-compound-desktop" aria-hidden="true">
|
||||
<span className="sui-icon-arrow-left"></span>
|
||||
{__('Previous', 'wp-smushit')}
|
||||
</span>
|
||||
|
||||
<span className="sui-compound-mobile" aria-hidden="true">
|
||||
<span className="sui-icon-arrow-left"></span>
|
||||
</span>
|
||||
|
||||
<span className="sui-screen-reader-text">
|
||||
{__('Previous', 'wp-smushit')}
|
||||
</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
const getButtonsRight = () => {
|
||||
if (1 === currentStep) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-blue sui-button-icon-right"
|
||||
onClick={() => setCurrentStep(currentStep + 1)}
|
||||
>
|
||||
{__('Next', 'wp-smushit')}
|
||||
<span
|
||||
className="sui-icon-arrow-right"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
if (2 === currentStep) {
|
||||
if ('apache' === serverType && 'automatic' === rulesMethod) {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-blue"
|
||||
onClick={applyRules}
|
||||
>
|
||||
{__('Apply rules', 'wp-smushit')}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-blue"
|
||||
onClick={checkStatus}
|
||||
>
|
||||
{__('Check status', 'wp-smushit')}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
className="sui-button sui-button-blue"
|
||||
onClick={hideWizard}
|
||||
>
|
||||
<span className="sui-button-text-default">
|
||||
{__('Finish', 'wp-smushit')}
|
||||
</span>
|
||||
|
||||
<span className="sui-button-text-onload">
|
||||
<span
|
||||
className="sui-icon-loader sui-loading"
|
||||
aria-hidden="true"
|
||||
></span>
|
||||
{__('Finishing setup…', 'wp-smushit')}
|
||||
</span>
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="sui-box-footer">
|
||||
<div className="sui-actions-left">
|
||||
{quitButton}
|
||||
{buttonsLeft}
|
||||
</div>
|
||||
<div className="sui-actions-right">{getButtonsRight()}</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,114 @@
|
||||
/**
|
||||
* External dependencies
|
||||
*/
|
||||
import React from 'react';
|
||||
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
const { __ } = wp.i18n;
|
||||
|
||||
export default ({ currentStep, smushData }) => {
|
||||
const getStepClass = (step) => {
|
||||
const stepClass = 'smush-wizard-bar-step';
|
||||
|
||||
if (!smushData.isPro) {
|
||||
return stepClass + ' disabled';
|
||||
}
|
||||
|
||||
if (step > currentStep) {
|
||||
return stepClass;
|
||||
}
|
||||
|
||||
return (
|
||||
stepClass +
|
||||
(step === currentStep ? ' current' : ' sui-tooltip done')
|
||||
);
|
||||
};
|
||||
|
||||
const getStepNumber = (step) => {
|
||||
return currentStep > step ? (
|
||||
<span className="sui-icon-check" aria-hidden="true"></span>
|
||||
) : (
|
||||
step
|
||||
);
|
||||
};
|
||||
|
||||
const steps = [
|
||||
{ number: 1, title: __('Server Type', 'wp-smushit') },
|
||||
{ number: 2, title: __('Add Rules', 'wp-smushit') },
|
||||
{ number: 3, title: __('Finish Setup', 'wp-smushit') },
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="sui-sidenav">
|
||||
<span className="smush-wizard-bar-subtitle">
|
||||
{__('Setup', 'wp-smushit')}
|
||||
</span>
|
||||
<div className="smush-sidenav-title">
|
||||
<h4>{__('Local WebP', 'wp-smushit')}</h4>
|
||||
{!smushData.isPro && (
|
||||
<span className="sui-tag sui-tag-pro">
|
||||
{__('Pro', 'wp-smushit')}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="smush-wizard-steps-container">
|
||||
<svg
|
||||
className="smush-svg-mobile"
|
||||
focusable="false"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<line
|
||||
x1="0"
|
||||
x2="50%"
|
||||
stroke={1 !== currentStep ? '#1ABC9C' : '#E6E6E6'}
|
||||
/>
|
||||
<line
|
||||
x1="50%"
|
||||
x2="100%"
|
||||
stroke={3 === currentStep ? '#1ABC9C' : '#E6E6E6'}
|
||||
/>
|
||||
</svg>
|
||||
<ul>
|
||||
{steps.map((step) => (
|
||||
<React.Fragment key={step.number}>
|
||||
<li
|
||||
className={getStepClass(step.number)}
|
||||
data-tooltip={__(
|
||||
'This stage is already completed.',
|
||||
'wp-smushit'
|
||||
)}
|
||||
>
|
||||
<div className="smush-wizard-bar-step-number">
|
||||
{getStepNumber(step.number)}
|
||||
</div>
|
||||
{step.title}
|
||||
</li>
|
||||
{3 !== step.number && (
|
||||
<svg
|
||||
data={step.number}
|
||||
data2={currentStep}
|
||||
className="smush-svg-desktop"
|
||||
focusable="false"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<line
|
||||
y1="0"
|
||||
y2="40px"
|
||||
stroke={
|
||||
step.number < currentStep
|
||||
? '#1ABC9C'
|
||||
: '#E6E6E6'
|
||||
}
|
||||
/>
|
||||
</svg>
|
||||
)}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
@include body-class(true) {
|
||||
&.sui-color-accessible {
|
||||
.smush-final-log .smush-bulk-error-row {
|
||||
box-shadow: inset 2px 0 0 0 $accessible-dark;
|
||||
.smush-bulk-image-data:before {
|
||||
color: $accessible-dark;
|
||||
}
|
||||
}
|
||||
// Bulk Smush Fancy Tree
|
||||
ul.fancytree-container {
|
||||
.fancytree-selected {
|
||||
background-color: #F8F8F8;
|
||||
span.fancytree-checkbox {
|
||||
border: 1px solid $accessible-dark;
|
||||
background-color: $accessible-dark;
|
||||
}
|
||||
}
|
||||
span.fancytree-expander:before,
|
||||
span.fancytree-icon:before,
|
||||
span.fancytree-title {
|
||||
color: $accessible-dark;
|
||||
}
|
||||
}
|
||||
// CDN
|
||||
.smush-filename-extension {
|
||||
background-color: $accessible-dark;
|
||||
}
|
||||
// Check images button.
|
||||
.sui-button {
|
||||
&.smush-button-check-success:before {
|
||||
color: $accessible-light;
|
||||
}
|
||||
}
|
||||
// Smush submit note.
|
||||
.smush-submit-note {
|
||||
color: $accessible-dark;
|
||||
}
|
||||
|
||||
// Hightlight lazyload spinner.
|
||||
.sui-lazyload .sui-box-selector [name="animation[spinner-icon]"]:checked+span {
|
||||
background-color: rgba(220,220,222, 0.7)!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
|
||||
.sui-wrap .sui-toggle-slider {
|
||||
-ms-high-contrast-adjust: none;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// This needs to be here.
|
||||
@import "modules/variables";
|
||||
|
||||
// Share UI styles
|
||||
@import "~@wpmudev/shared-ui/scss/functions";
|
||||
@import "~@wpmudev/shared-ui/scss/colors";
|
||||
@import "~@wpmudev/shared-ui/scss/variables";
|
||||
$google-fonts-url: 'https://fonts.bunny.net/css?family=Roboto:400,500,700';
|
||||
@import "~@wpmudev/shared-ui/scss/mixins";
|
||||
@import "~@wpmudev/shared-ui/scss/accessibility";
|
||||
@import "~@wpmudev/shared-ui/scss/animations";
|
||||
@import "~@wpmudev/shared-ui/scss/typography";
|
||||
@import "~@wpmudev/shared-ui/scss/icons";
|
||||
@import "~@wpmudev/shared-ui/scss/buttons";
|
||||
@import "~@wpmudev/shared-ui/scss/toggles";
|
||||
@import "~@wpmudev/shared-ui/scss/boxes";
|
||||
@import "~@wpmudev/shared-ui/scss/box-settings";
|
||||
@import "~@wpmudev/shared-ui/scss/layout";
|
||||
@import "~@wpmudev/shared-ui/scss/notifications";
|
||||
@import "~@wpmudev/shared-ui/scss/header";
|
||||
@import "~@wpmudev/shared-ui/scss/summary";
|
||||
@import "~@wpmudev/shared-ui/scss/list";
|
||||
@import "~@wpmudev/shared-ui/scss/tooltips";
|
||||
@import "~@wpmudev/shared-ui/scss/select2";
|
||||
@import "~@wpmudev/shared-ui/scss/tags";
|
||||
@import "~@wpmudev/shared-ui/scss/forms";
|
||||
@import "~@wpmudev/shared-ui/scss/radio-checkbox";
|
||||
@import "~@wpmudev/shared-ui/scss/tabs";
|
||||
@import "~@wpmudev/shared-ui/scss/sidenav";
|
||||
@import "~@wpmudev/shared-ui/scss/dropdowns";
|
||||
@import "~@wpmudev/shared-ui/scss/scores";
|
||||
@import "~@wpmudev/shared-ui/scss/footer";
|
||||
@import "~@wpmudev/shared-ui/scss/progress-bars";
|
||||
@import "~@wpmudev/shared-ui/scss/modals";
|
||||
@import "~@wpmudev/shared-ui/scss/utility";
|
||||
@import "~@wpmudev/shared-ui/scss/wp-admin-notices";
|
||||
@import "~@wpmudev/shared-ui/scss/tables";
|
||||
@import "~@wpmudev/shared-ui/scss/accordions";
|
||||
// Used on lazy loading page (since 3.2.2).
|
||||
@import "~@wpmudev/shared-ui/scss/box-selectors";
|
||||
@import "~@wpmudev/shared-ui/scss/upload";
|
||||
@import "~@wpmudev/shared-ui/scss/_colorpickers.scss";
|
||||
// Upgrade page (since 3.2.3).
|
||||
@import "~@wpmudev/shared-ui/scss/upgrade-page";
|
||||
@import "~@wpmudev/shared-ui/scss/reviews";
|
||||
// Used on WebP page (since 3.8.0).
|
||||
@import "~@wpmudev/shared-ui/scss/_code-snippet.scss";
|
||||
// Upsells (since 3.9.1).
|
||||
@import "~@wpmudev/shared-ui/scss/upsells";
|
||||
|
||||
// App styles
|
||||
@import "modules/admin";
|
||||
@import "modules/directory-smush";
|
||||
@import "modules/cdn";
|
||||
@import "modules/webp";
|
||||
|
||||
// SUI Color Accessibility
|
||||
@import "~@wpmudev/shared-ui/scss/color-accessibility";
|
||||
@import "accessibility/color-accessibility";
|
||||
@@ -0,0 +1,603 @@
|
||||
/**
|
||||
* Common styles that are used on all the WP pages in the backend
|
||||
*/
|
||||
@import "modules/media";
|
||||
|
||||
.sui-wrap .smush-upsell-link,
|
||||
.sui-wrap a.smush-upsell-link {
|
||||
color: $purple;
|
||||
> span:before {
|
||||
color: $purple;
|
||||
}
|
||||
&:hover:not(.sui-button),
|
||||
&:focus:not(.sui-button),
|
||||
&:active:not(.sui-button) {
|
||||
color: #64007e;
|
||||
> span:before {
|
||||
color: #64007e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Media details (grid layout)
|
||||
* @since 3.4.0
|
||||
*/
|
||||
.attachment-info .smush-stats .value {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.smush-status {
|
||||
margin: 0 0 10px;
|
||||
flex-basis: 100%;
|
||||
font-size: 12px;
|
||||
line-height: 1.33333;
|
||||
}
|
||||
|
||||
.smush-status-links {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
span.sui-tooltip {
|
||||
float: none;
|
||||
}
|
||||
|
||||
a {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
a:first-of-type {
|
||||
margin-left: 0;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.attachment-info .smush-status-links,
|
||||
.column-smushit .smush-status-links {
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
.column-smushit .smush-status-links > a {
|
||||
box-shadow: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.wp-smush-progress {
|
||||
padding-left: 25px;
|
||||
margin: 0;
|
||||
background-size: 17px 17px;
|
||||
visibility: visible;
|
||||
vertical-align: initial !important; /* prevent from jumping on a line */
|
||||
display: inline;
|
||||
color: #32373c;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
// Fix grid view links.
|
||||
.attachment-details .setting span.wp-smush-progress {
|
||||
width: auto;
|
||||
line-height: 0;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/** Settings Page **/
|
||||
.smush-status.fail {
|
||||
color: #dd3d36;
|
||||
}
|
||||
|
||||
.smush-status.success {
|
||||
color: #0074a2;
|
||||
}
|
||||
|
||||
.smush-status.error {
|
||||
color: red;
|
||||
}
|
||||
|
||||
#wpbody-content .wp-smush-error {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.wp-smush-action[disabled] {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
#post-body-content .smush-status {
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.attachment-info .wp-smush-error-message {
|
||||
margin: 0 0 1em;
|
||||
}
|
||||
|
||||
.smush-stats-wrapper .row {
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
.smush-stats-wrapper .row:first-child {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.smush-stats-wrapper td, .smush-stats-wrapper th {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.smush-skipped .dashicons-editor-help {
|
||||
margin-top: -2px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.smush-skipped {
|
||||
a:focus { box-shadow: 0 0 black; }
|
||||
.sui-tag.sui-tag-purple {
|
||||
min-height: 18px;
|
||||
padding: 2px 10px;
|
||||
font-size: 10px;
|
||||
line-height: 12px;
|
||||
font-weight: 700;
|
||||
background-color: #8d00b1;
|
||||
color: #fff;
|
||||
border: 2px solid transparent;
|
||||
border-radius: 13px;
|
||||
}
|
||||
}
|
||||
|
||||
/** Help Tip **/
|
||||
.ui-tooltip-content {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/** All Smushed **/
|
||||
.wp-smush-notice {
|
||||
background-color: #D1F1EA;
|
||||
border-radius: 5px;
|
||||
color: #333333;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 15px;
|
||||
line-height: 30px;
|
||||
margin-bottom: 30px;
|
||||
padding: 15px 30px;
|
||||
letter-spacing: -0.015em;
|
||||
}
|
||||
|
||||
div.smush-notice-cta a.smush-notice-act.button-primary {
|
||||
padding: 3px 23px;
|
||||
background-color: #00B0DB;
|
||||
box-shadow: none;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
text-shadow: none;
|
||||
font-weight: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
|
||||
&:hover {
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
a.wp-smush-resize-enable:hover,
|
||||
a.wp-smush-lossy-enable:hover {
|
||||
color: #0A9BD6;
|
||||
}
|
||||
|
||||
.wp-smush-bulk-wrapper {
|
||||
#wp-smush-bulk-image-count {
|
||||
color: #333333;
|
||||
font-size: 28px;
|
||||
line-height: 40px;
|
||||
letter-spacing: -0.5px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
#wp-smush-bulk-image-count-description {
|
||||
color: #333333;
|
||||
font-size: 13px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.sui-tooltip,
|
||||
.sui-tooltip > .sui-icon-info {
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
|
||||
/** Image Remaining **/
|
||||
div.wp-smush-dir-limit,
|
||||
div.smush-s3-setup-message {
|
||||
background-color: #FFF5D5;
|
||||
border: none;
|
||||
color: #333333;
|
||||
line-height: 30px;
|
||||
font-size: 15px;
|
||||
letter-spacing: -0.015em;
|
||||
}
|
||||
|
||||
div.smush-s3-setup-message {
|
||||
background-color: #DFF6FA;
|
||||
}
|
||||
|
||||
div.wp-smush-dir-limit {
|
||||
background-color: #dff6fa;
|
||||
}
|
||||
|
||||
.wp-smush-count {
|
||||
color: #888888;
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
/** Stats Container **/
|
||||
|
||||
a.wp-smush-lossy-enable {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/** Re Smush **/
|
||||
.wp-smush-settings-changed {
|
||||
background: #dff6fa;
|
||||
border-radius: 5px;
|
||||
font-size: 13px;
|
||||
line-height: 1.7;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.compat-item .compat-field-wp_smush {
|
||||
display: table-row;
|
||||
}
|
||||
|
||||
.manage-column.column-smushit {
|
||||
width: 265px;
|
||||
}
|
||||
|
||||
.smushit [tooltip],
|
||||
label.setting.smush-stats [tooltip],
|
||||
.compat-field-wp_smush [tooltip] {
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.smushit [tooltip]:before,
|
||||
label.setting.smush-stats [tooltip]:before,
|
||||
.compat-field-wp_smush [tooltip]:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
border: 5px solid transparent;
|
||||
border-top-color: #0B2F3F;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
margin-bottom: -5px;
|
||||
opacity: 0;
|
||||
z-index: -1;
|
||||
transition: margin .2s, opacity .2s, z-index .2s linear .2s;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.smushit [tooltip]:after,
|
||||
label.setting.smush-stats [tooltip]:after,
|
||||
.compat-field-wp_smush [tooltip]:after {
|
||||
background: #0B2F3F;
|
||||
border-radius: 4px;
|
||||
bottom: 100%;
|
||||
color: #FFF;
|
||||
content: attr(tooltip);
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
left: 50%;
|
||||
line-height: 20px;
|
||||
margin-left: -100px;
|
||||
margin-bottom: 5px;
|
||||
opacity: 0;
|
||||
padding: 5px;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
width: 180px;
|
||||
text-align: center;
|
||||
transition: margin .2s, opacity .2s, z-index .2s linear .2s;
|
||||
white-space: pre-wrap;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.smushit .smush-skipped [tooltip]:before,
|
||||
label.setting.smush-stats .smush-skipped [tooltip]:before,
|
||||
.compat-field-wp_smush .smush-skipped [tooltip]:before {
|
||||
border-top-color: transparent;
|
||||
border-left-color: #0B2F3F;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.smushit .smush-skipped [tooltip]:after,
|
||||
label.setting.smush-stats .smush-skipped [tooltip]:after,
|
||||
.compat-field-wp_smush .smush-skipped [tooltip]:after {
|
||||
margin-left: 0;
|
||||
left: -195px;
|
||||
top: -35px;
|
||||
bottom: inherit;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
label.setting.smush-stats .smush-skipped [tooltip]:after {
|
||||
top: -98px;
|
||||
}
|
||||
|
||||
div.media-sidebar label.setting.smush-stats .smush-skipped [tooltip]:after {
|
||||
left: -188px;
|
||||
padding-left: 10px;
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.media-sidebar label.setting.smush-stats .smush-skipped [tooltip]:before {
|
||||
margin-left: -3px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-s:after,
|
||||
label.setting.smush-stats [tooltip].tooltip-s:after,
|
||||
.compat-field-wp_smush [tooltip].tooltip-s:after {
|
||||
width: 150px;
|
||||
margin-left: -75px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-l:after,
|
||||
label.setting.smush-stats [tooltip].tooltip-l:after,
|
||||
.compat-field-wp_smush [tooltip].tooltip-l:after {
|
||||
width: 280px;
|
||||
margin-left: -140px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-right:after, .compat-field-wp_smush [tooltip].tooltip-right:after {
|
||||
margin-left: -180px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-s.tooltip-right:after, .compat-field-wp_smush [tooltip].tooltip-s.tooltip-right:after {
|
||||
margin-left: -130px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-l.tooltip-right:after, .compat-field-wp_smush [tooltip].tooltip-l.tooltip-right:after {
|
||||
margin-left: -260px;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-bottom:before, .compat-field-wp_smush [tooltip].tooltip-bottom:before {
|
||||
border-color: transparent;
|
||||
border-bottom-color: #0B2F3F;
|
||||
top: 100%;
|
||||
bottom: auto;
|
||||
margin-top: -5px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.smushit [tooltip].tooltip-bottom:after, .compat-field-wp_smush [tooltip].tooltip-bottom:after {
|
||||
bottom: auto;
|
||||
top: 100%;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.smushit [tooltip]:hover:before,
|
||||
label.setting.smush-stats [tooltip]:hover:before,
|
||||
.compat-field-wp_smush [tooltip]:hover:before {
|
||||
z-index: 1;
|
||||
margin-bottom: 0;
|
||||
opacity: 1;
|
||||
transition: margin .2s, opacity .2s;
|
||||
}
|
||||
|
||||
.smushit [tooltip]:hover:after,
|
||||
label.setting.smush-stats [tooltip]:hover:after,
|
||||
.compat-field-wp_smush [tooltip]:hover:after {
|
||||
opacity: 1;
|
||||
z-index: 1;
|
||||
margin-bottom: 10px;
|
||||
transition: margin .2s, opacity .2s;
|
||||
}
|
||||
|
||||
.smushit .disabled[tooltip]:before,
|
||||
.smushit .disabled[tooltip]:after,
|
||||
label.setting.smush-stats .disabled[tooltip]:before,
|
||||
label.setting.smush-stats .disabled[tooltip]:after,
|
||||
.compat-field-wp_smush .disabled[tooltip]:before,
|
||||
.compat-field-wp_smush .disabled[tooltip]:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** Image List **/
|
||||
div.wp-smush-scan-result {
|
||||
background: white;
|
||||
|
||||
div.wp-smush-notice {
|
||||
margin-top: 14px;
|
||||
padding: 15px 30px;
|
||||
}
|
||||
|
||||
div.content {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
div.wp-smush-info.notice {
|
||||
font-size: 15px;
|
||||
letter-spacing: -0.015em;
|
||||
margin: 0 0 30px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
/** Media Queries **/
|
||||
|
||||
@media screen and (max-width: 1024px) and (min-width: 800px) {
|
||||
/** Stats Section **/
|
||||
.smush-stats-wrapper h3 {
|
||||
padding: 6px 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** Media Queries for resolution below 782px **/
|
||||
@media only screen and (max-width: 800px) {
|
||||
.dev-box.bulk-smush-wrapper.wp-smush-container {
|
||||
padding: 20px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* CSS styles used Admin notice
|
||||
*/
|
||||
.smush-notice.notice {
|
||||
padding: 0;
|
||||
margin: 5px 0 10px;
|
||||
border: 1px solid #E5E5E5;
|
||||
background: #FFF;
|
||||
overflow: hidden;
|
||||
-webkit-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
|
||||
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
min-height: 80px;
|
||||
display: table; /* The magic ingredient! */
|
||||
font: 13px "Roboto", sans-serif;
|
||||
}
|
||||
|
||||
.smush-notice.notice.loading:before {
|
||||
content: attr(data-message);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(255, 255, 255, 0.7);
|
||||
z-index: 5;
|
||||
text-align: center;
|
||||
line-height: 80px;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.smush-notice > div {
|
||||
display: table-cell; /* The magic ingredient! */
|
||||
vertical-align: middle;
|
||||
cursor: default;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.smush-notice.notice.loading > div {
|
||||
-webkit-filter: blur(2px);
|
||||
-moz-filter: blur(2px);
|
||||
-o-filter: blur(2px);
|
||||
-ms-filter: blur(2px);
|
||||
filter: blur(2px);
|
||||
}
|
||||
|
||||
.smush-notice-logo {
|
||||
padding-left: 30px;
|
||||
}
|
||||
|
||||
.smush-notice-message {
|
||||
color: #23282D;
|
||||
font-size: 13px;
|
||||
font-weight: normal;
|
||||
line-height: 20px;
|
||||
padding: 20px;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.smush-notice-cta {
|
||||
background: #F8F8F8;
|
||||
padding: 0 30px;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.wp-core-ui .smush-notice-cta button,
|
||||
.wp-core-ui .smush-notice-cta .button-primary:active {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.wp-core-ui .smush-notice-cta input[type="email"] {
|
||||
vertical-align: middle;
|
||||
line-height: 20px;
|
||||
margin: 0;
|
||||
min-width: 50px;
|
||||
max-width: 320px;
|
||||
text-align: center;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Upsell lists.
|
||||
* @since 3.9.1
|
||||
*/
|
||||
#smush-box-cdn-upsell,
|
||||
#smush-box-webp-wizard,
|
||||
#smush-box-next-gen-upsell .smush-box-next-gen-upsell {
|
||||
.sui-upsell-list {
|
||||
max-width: 495px;
|
||||
text-align: left;
|
||||
margin: 0 auto;
|
||||
li {
|
||||
font-size:12px;
|
||||
border-bottom:1px solid #f2f2f2;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 15px;
|
||||
letter-spacing: -0.23px;
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#smush-box-cdn-upsell .sui-upsell-list {
|
||||
max-width:350px;
|
||||
}
|
||||
|
||||
@media only all and (max-width: 1000px) {
|
||||
.smush-notice.notice {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.smush-notice > .smush-notice-logo {
|
||||
float: left;
|
||||
display: inline-block;
|
||||
height: 80px;
|
||||
margin: 10px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.smush-notice > .smush-notice-message {
|
||||
width: auto;
|
||||
display: block;
|
||||
min-height: 80px;
|
||||
}
|
||||
|
||||
.smush-notice > .smush-notice-cta {
|
||||
display: block;
|
||||
border-top: 1px solid #E5E5E5;
|
||||
border-left: 0;
|
||||
text-align: center;
|
||||
white-space: normal;
|
||||
line-height: 30px;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.wp-core-ui .smush-notice > .smush-notice-cta > input[type="email"],
|
||||
.smush-notice > .smush-notice-cta > button {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only all and (max-width: 500px) {
|
||||
.wp-core-ui .smush-notice > .smush-notice-cta > input[type="email"],
|
||||
.smush-notice > .smush-notice-cta > button {
|
||||
display: block;
|
||||
width: 100% !important;
|
||||
max-width: none;
|
||||
margin-bottom: 4px;
|
||||
font-size: 16px;
|
||||
height: 34px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
@import "variables";
|
||||
|
||||
/**
|
||||
* CDN styles
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
|
||||
@include body-class {
|
||||
|
||||
.sui-wrap {
|
||||
|
||||
.sui-box-settings-row .sui-box-settings-col-1 {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
&.wrap-smush-cdn {
|
||||
.sui-box-header .sui-actions-right .sui-icon-info{
|
||||
font-size: 16px;
|
||||
position: relative;
|
||||
top: 1.5px;
|
||||
}
|
||||
}
|
||||
|
||||
.sui-cdn {
|
||||
form p:first-of-type {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
.wp-smush-stats {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 0;
|
||||
|
||||
.sui-tooltip {
|
||||
line-height: 10px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Filename Extensions Icons */
|
||||
.smush-filename-extension {
|
||||
border-radius: 4px;
|
||||
display: inline-block;
|
||||
font-size: 9px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
line-height: 43px;
|
||||
height: 30px;
|
||||
margin: 0 5px 0 0;
|
||||
width: 30px;
|
||||
|
||||
&.smush-extension-jpeg,
|
||||
&.smush-extension-jpg { background-color: #F7E100; }
|
||||
&.smush-extension-png { background-color: #FFB694; }
|
||||
&.smush-extension-gif { background-color: #72D5D4; }
|
||||
&.smush-extension-webp { background-color: #72ADD5; }
|
||||
&.smush-extension-svg { background-color: #88D572; }
|
||||
&.smush-extension-iframe {
|
||||
background-color: #8772D5;
|
||||
font-size: 7px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,338 @@
|
||||
/* ****************************************************************************
|
||||
* MODULE: Directory Smush styles.
|
||||
*/
|
||||
|
||||
@include body-class {
|
||||
|
||||
.wp-smush-progress-dialog,
|
||||
.wp-smush-list-dialog {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sui-directory.sui-message {
|
||||
text-align: left;
|
||||
|
||||
.sui-message-content {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.sui-directory .smush-final-log {
|
||||
margin-top: 30px;
|
||||
|
||||
.sui-description {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
ul.fancytree-container {
|
||||
color: #666;
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
letter-spacing: -0.25px;
|
||||
line-height: 40px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
outline: 0 solid transparent;
|
||||
min-height: 0%;
|
||||
position: relative;
|
||||
|
||||
ul {
|
||||
padding: 0 0 0 16px;
|
||||
margin: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Expander icon
|
||||
*
|
||||
* Note: IE6 doesn't correctly evaluate multiples class names,
|
||||
* so we create combined class names that can be used in the CSS.
|
||||
*
|
||||
* Prefix: fancytree-exp-
|
||||
* 1st character: 'e': expanded, 'c': collapsed, 'n': no children
|
||||
* 2nd character (optional): 'd': lazy (Delayed)
|
||||
* 3rd character (optional): 'l': Last sibling
|
||||
*----------------------------------------------------------------------------*/
|
||||
span.fancytree-expander {
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
margin-left: 13px;
|
||||
width: 15px;
|
||||
|
||||
&:before {
|
||||
font-family: wpmudev-plugin-icons, sans-serif;
|
||||
}
|
||||
}
|
||||
|
||||
.fancytree-exp-c span.fancytree-expander,
|
||||
.fancytree-exp-cd:not(.fancytree-unselectable) span.fancytree-expander,
|
||||
.fancytree-exp-cf:not(.fancytree-unselectable) span.fancytree-expander {
|
||||
margin-left: 13px;
|
||||
}
|
||||
|
||||
// --- End nodes (use connectors instead of expanders)
|
||||
|
||||
.fancytree-expanded.fancytree-exp-n span.fancytree-expander,
|
||||
.fancytree-expanded.fancytree-exp-nl span.fancytree-expander {
|
||||
width: 13px;
|
||||
display: inline-block;
|
||||
|
||||
&:before {
|
||||
background-image: none;
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.fancytree-exp-n span.fancytree-expander,
|
||||
.fancytree-exp-nl span.fancytree-expander {
|
||||
width: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.fancytree-exp-nl span.fancytree-expander:before {
|
||||
content: "\131";
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
span.fancytree-ico-c span.fancytree-expander:before {
|
||||
content: '';
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
// --- Collapsed
|
||||
|
||||
.fancytree-exp-c span.fancytree-expander:before,
|
||||
.fancytree-exp-cl span.fancytree-expander:before,
|
||||
.fancytree-exp-cd span.fancytree-expander:before,
|
||||
.fancytree-exp-cdl span.fancytree-expander:before,
|
||||
.fancytree-exp-e span.fancytree-expander:before,
|
||||
.fancytree-exp-ed span.fancytree-expander:before,
|
||||
.fancytree-exp-el span.fancytree-expander:before,
|
||||
.fancytree-exp-edl span.fancytree-expander:before {
|
||||
color: #888888;
|
||||
content: "\2DC";
|
||||
}
|
||||
|
||||
// --- Expanded
|
||||
|
||||
.fancytree-exp-e span.fancytree-expander:before,
|
||||
.fancytree-exp-ed span.fancytree-expander:before,
|
||||
.fancytree-exp-el span.fancytree-expander:before,
|
||||
.fancytree-exp-edl span.fancytree-expander:before {
|
||||
content: "\131";
|
||||
}
|
||||
|
||||
// --- Unselectable
|
||||
|
||||
.fancytree-unselectable span.fancytree-expander:before {
|
||||
content: "9";
|
||||
}
|
||||
|
||||
/* Fade out expanders, when container is not hovered or active */
|
||||
.fancytree-fade-expander {
|
||||
span.fancytree-expander:before {
|
||||
transition: opacity 1.5s;
|
||||
opacity: 0;
|
||||
}
|
||||
&:hover span.fancytree-expander:before,
|
||||
&.fancytree-treefocus span.fancytree-expander:before,
|
||||
.fancytree-treefocus span.fancytree-expander:before,
|
||||
[class*='fancytree-statusnode-'] span.fancytree-expander:before {
|
||||
transition: opacity 0.6s;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Checkbox icon
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
span.fancytree-checkbox {
|
||||
margin-right: 5px;
|
||||
margin-left: 12px;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #ddd;
|
||||
background-color: #e6e6e6;
|
||||
display: inline-block;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
top: 2px;
|
||||
position: relative;
|
||||
transition: .2s;
|
||||
|
||||
@include icon( before, check );
|
||||
&:before {
|
||||
opacity: 0;
|
||||
color: #fff;
|
||||
font-size: 10px;
|
||||
line-height: 14px;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
transition: .2s;
|
||||
}
|
||||
}
|
||||
|
||||
.fancytree-selected span.fancytree-checkbox {
|
||||
border: 1px solid #17a8e3;
|
||||
background-color: #17a8e3;
|
||||
|
||||
&:before {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.fancytree-expanded span.fancytree-checkbox {
|
||||
margin-left: 11px;
|
||||
}
|
||||
|
||||
// Unselectable is dimmed, without hover effects
|
||||
.fancytree-unselectable {
|
||||
background-color: transparent !important;
|
||||
|
||||
// Fix for bug in library.
|
||||
&.fancytree-selected {
|
||||
margin-left: -9px;
|
||||
|
||||
span.fancytree-expander {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
span.fancytree-checkbox {
|
||||
border: 1px solid #ddd;
|
||||
background-color: #e6e6e6;
|
||||
|
||||
&:before {
|
||||
color: #e6e6e6 !important;
|
||||
}
|
||||
}
|
||||
|
||||
span.fancytree-title {
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
span.fancytree-expander,
|
||||
span.fancytree-icon,
|
||||
span.fancytree-checkbox,
|
||||
span.fancytree-title {
|
||||
opacity: 0.4;
|
||||
filter: alpha(opacity=40);
|
||||
|
||||
&:before {
|
||||
color: #666 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Node type icon
|
||||
* Note: IE6 doesn't correctly evaluate multiples class names,
|
||||
* so we create combined class names that can be used in the CSS.
|
||||
*
|
||||
* Prefix: fancytree-ico-
|
||||
* 1st character: 'e': expanded, 'c': collapsed
|
||||
* 2nd character (optional): 'f': folder
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
span.fancytree-icon:before { // Default icon
|
||||
margin-left: 10px;
|
||||
font-family: wpmudev-plugin-icons, sans-serif;
|
||||
font-size: 16px;
|
||||
color: #AAA;
|
||||
content: 'D';
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
|
||||
/* Documents */
|
||||
.fancytree-ico-c span.fancytree-icon:before { // Collapsed folder (empty)
|
||||
content: 'D';
|
||||
}
|
||||
.fancytree-has-children.fancytree-ico-c span.fancytree-icon:before { // Collapsed folder (not empty)
|
||||
content: 'D';
|
||||
}
|
||||
.fancytree-ico-e span.fancytree-icon:before { // Expanded folder
|
||||
content: '\BB';
|
||||
}
|
||||
|
||||
/* Folders */
|
||||
.fancytree-exp-n.fancytree-ico-ef span.fancytree-icon:before,
|
||||
.fancytree-exp-nl.fancytree-ico-ef span.fancytree-icon:before,
|
||||
.fancytree-ico-cf span.fancytree-icon:before { // Collapsed folder (empty)
|
||||
content: '\2D8';
|
||||
}
|
||||
.fancytree-has-children.fancytree-ico-cf span.fancytree-icon:before { // Collapsed folder (not empty)
|
||||
content: '\2D8';
|
||||
}
|
||||
.fancytree-ico-ef span.fancytree-icon:before { // Expanded folder
|
||||
content: '\BB';
|
||||
}
|
||||
|
||||
// 'Loading' status overrides all others
|
||||
.fancytree-loading span.fancytree-expander:before,
|
||||
.fancytree-statusnode-loading span.fancytree-icon:before {
|
||||
content: 'N';
|
||||
display: inline-block;
|
||||
animation: spin 1.3s linear infinite;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Node titles and highlighting
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
span.fancytree-node {
|
||||
display: inherit;
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
min-height: 40px;
|
||||
|
||||
&:not(.fancytree-unselectable):hover {
|
||||
background-color: #F8F8F8;
|
||||
}
|
||||
}
|
||||
span.fancytree-title {
|
||||
color: #666; // inherit doesn't work on IE
|
||||
cursor: pointer;
|
||||
display: inline-block; // Better alignment, when title contains <br>
|
||||
vertical-align: top;
|
||||
min-height: 20px;
|
||||
padding: 0 3px 0 3px; // Otherwise italic font will be outside right bounds
|
||||
margin: 0 0 0 5px;
|
||||
border: 1px solid transparent; // avoid jumping, when a border is added on hover
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
}
|
||||
span.fancytree-node.fancytree-error span.fancytree-title {
|
||||
//color: @fancy-font-error-color;
|
||||
}
|
||||
|
||||
span.fancytree-expanded,
|
||||
span.fancytree-selected {
|
||||
border-radius: 4px;
|
||||
background-color: #F8F8F8;
|
||||
color: #17A8E3;
|
||||
|
||||
span.fancytree-title {
|
||||
color: #666666;
|
||||
}
|
||||
}
|
||||
|
||||
span.fancytree-selected {
|
||||
background-color: #E1F6FF;
|
||||
|
||||
span.fancytree-expander:before,
|
||||
span.fancytree-icon:before,
|
||||
span.fancytree-title {
|
||||
color: #17A8E3;
|
||||
}
|
||||
}
|
||||
|
||||
span.fancytree-focused {
|
||||
background-color: #e1e1e1 !important;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,316 @@
|
||||
/* ****************************************************************************
|
||||
* MEDIA AREA SCSS FILE
|
||||
*/
|
||||
@import "~@wpmudev/shared-ui/scss/functions";
|
||||
@import "~@wpmudev/shared-ui/scss/colors";
|
||||
@import "~@wpmudev/shared-ui/scss/variables";
|
||||
|
||||
// Override body class
|
||||
$sui-version: 'smush-media';
|
||||
$sui-wrap-class: false;
|
||||
|
||||
@import "~@wpmudev/shared-ui/scss/mixins";
|
||||
@import "~@wpmudev/shared-ui/scss/tooltips";
|
||||
@import "~@wpmudev/shared-ui/scss/notifications";
|
||||
@import "~@wpmudev/shared-ui/scss/buttons";
|
||||
|
||||
/* ****************************************************************************
|
||||
* MEDIA AREA STYLES
|
||||
*/
|
||||
|
||||
// Set column width.
|
||||
.manage-column.column-smushit {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
// Margin for buttons.
|
||||
.sui-smush-media {
|
||||
.button {
|
||||
&:last-of-type {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.smush-status-links {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
|
||||
.smush-stats-details {
|
||||
height: 24px;
|
||||
span {
|
||||
&.stats-toggle {
|
||||
color: #666666;
|
||||
font-size: 18px;
|
||||
margin-left: 4px;
|
||||
font-weight: 500;
|
||||
|
||||
&::before {
|
||||
content: '+';
|
||||
}
|
||||
}
|
||||
}
|
||||
&.smush-stats-expanded {
|
||||
.stats-toggle::before {
|
||||
content: '-';
|
||||
}
|
||||
|
||||
&.sui-tooltip[data-tooltip] {
|
||||
&::after,
|
||||
&::before {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:has(.wp-smush-restore) {
|
||||
|
||||
|
||||
.smush-stats-details +,
|
||||
.wp-smush-resmush + {
|
||||
.smush-ignore-image {
|
||||
margin-right: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
&.smushit {
|
||||
&.column-smushit {
|
||||
padding: 8px 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Smush button loading icon.
|
||||
#ngg-listimages,
|
||||
.column-smushit {
|
||||
.spinner {
|
||||
float: none;
|
||||
|
||||
&.visible {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
.smush-status-links{
|
||||
.smush-upgrade-link {
|
||||
color: #8D00B1;
|
||||
font-size: 12px;
|
||||
}
|
||||
.smush-ignore-utm,.smush-revert-utm{
|
||||
display: block;
|
||||
margin: 6px 0 4px;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
span {
|
||||
float: none !important;;
|
||||
}
|
||||
.smush-cdn-notice {
|
||||
color: #50575E;
|
||||
a {
|
||||
color:#2271B1;
|
||||
&:focus {
|
||||
box-shadow: none;
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.smush-status {
|
||||
&.smush-warning,&.smush-ignored,&.smush-success{
|
||||
padding-left:17px;
|
||||
position: relative;
|
||||
&:before{
|
||||
content:"";
|
||||
background: url('../images/icon-warning.png' ) no-repeat 0 0;
|
||||
position: absolute;
|
||||
width:12px;
|
||||
height:12px;
|
||||
background-size: contain;
|
||||
left: 0;
|
||||
top:3px;
|
||||
}
|
||||
}
|
||||
&.smush-ignored{
|
||||
&:before{
|
||||
background-image: url('../images/icon-ignored.png' ) !important;
|
||||
}
|
||||
}
|
||||
&.smush-success{
|
||||
&:before{
|
||||
background-image: url('../images/icon-success.png' ) !important;
|
||||
}
|
||||
}
|
||||
.sui-icon-warning-media-lib {
|
||||
margin-right:4px;
|
||||
position:relative;
|
||||
top:1px;
|
||||
}
|
||||
}
|
||||
.column-smushit .smush-status{
|
||||
color:#50575E;
|
||||
}
|
||||
// Stats table.
|
||||
.sui-smush-media {
|
||||
table.wp-smush-stats-holder {
|
||||
width: 100%;
|
||||
border: 1px solid #E6E6E6;
|
||||
border-radius: 4px;
|
||||
margin-top: 6px;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
thead {
|
||||
th.smush-stats-header {
|
||||
padding: 8px 10px;
|
||||
border-bottom: 1px solid #E6E6E6 !important;
|
||||
color: #32373D;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
letter-spacing: -0.23px;
|
||||
line-height: 16px;
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
tr {
|
||||
border: 1px solid #E6E6E6;
|
||||
}
|
||||
td {
|
||||
overflow-wrap: break-word;
|
||||
vertical-align: middle;
|
||||
padding: 8px 10px;
|
||||
color: #555555;
|
||||
font-size: 11px;
|
||||
letter-spacing: -0.21px;
|
||||
line-height: 16px;
|
||||
border-bottom: 1px solid #E6E6E6;
|
||||
&:first-of-type {
|
||||
max-width: 110px;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Override !important set from WordPress.
|
||||
#the-list {
|
||||
.sui-smush-media {
|
||||
thead {
|
||||
th.smush-stats-header {
|
||||
border-bottom: 1px solid #E6E6E6 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Responsive table for list mode.
|
||||
@media screen and (max-width: 1024px) {
|
||||
.wp-list-table .smushit {
|
||||
table.wp-smush-stats-holder {
|
||||
th {
|
||||
display: table-cell;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
tr td {
|
||||
word-wrap: break-word;
|
||||
display: table-cell !important;
|
||||
&:first-child {
|
||||
border-right: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
&:last-child {
|
||||
box-sizing: border-box;
|
||||
float: none;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NextGen Integration.
|
||||
.iedit .wp-smush-action,
|
||||
.iedit .smush-stats-details {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
/*NextGen Gallery stats*/
|
||||
#ngg-listimages {
|
||||
table.wp-smush-stats-holder {
|
||||
table-layout: fixed;
|
||||
border: 1px solid lightgray;
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
td,
|
||||
th {
|
||||
border: 1px solid #CECECE;
|
||||
}
|
||||
}
|
||||
.column-7 {
|
||||
width: 300px;
|
||||
}
|
||||
.spinner {
|
||||
width: auto;
|
||||
padding-left: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
/** NextGen Gallery tr height, to show the progress bar properly for alternate rows **/
|
||||
.alternate.iedit {
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
/** Allows to click on button, otherwise row-actions from NextGen interferes **/
|
||||
.wp-smush-nextgen-send {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.smush-hub-connect-media-notice {
|
||||
.sui-notice {
|
||||
&-content {
|
||||
|
||||
box-shadow: inset 2px 0 0 0 #17A8E3, inset 0 0 0 1px #E6E6E6 !important;
|
||||
border-radius: unset !important;
|
||||
h4 {
|
||||
font-weight: 700;
|
||||
margin-bottom: 5px;
|
||||
margin-top: 0;
|
||||
}
|
||||
a {
|
||||
font-size: 13px;
|
||||
color: #007CBA;
|
||||
|
||||
&.sui-button {
|
||||
background-color: #007CBA !important;
|
||||
color: #ffffff;
|
||||
text-transform: inherit;
|
||||
|
||||
&:hover {
|
||||
background-color: darken(#007CBA, 6%) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.smus-media-notification-skip {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.wp-smush-restore {
|
||||
&.button {
|
||||
&.disabled {
|
||||
cursor: help !important;
|
||||
background: #eaeaea !important;
|
||||
border: none !important;
|
||||
color: #828282 !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/* ****************************************************************************
|
||||
* MODULE: VARIABLES
|
||||
*/
|
||||
|
||||
$font--path: "../fonts" !default;
|
||||
$img--path: "../images" !default;
|
||||
|
||||
$sui-font-path: '~@wpmudev/shared-ui/dist/fonts/';
|
||||
|
||||
$summary-image: '#{$img--path}/smush-graphic-dashboard-summary.svg';
|
||||
|
||||
// Promo banners for free footer
|
||||
$cross-sell-1: 'hummingbird';
|
||||
$cross-sell-2: 'defender';
|
||||
$cross-sell-3: 'smartcrawl';
|
||||
|
||||
$main-color: #17A8E3;
|
||||
$text-color: #333;
|
||||
$border-radius: 4px;
|
||||
|
||||
$upgrade-image: '../../app/assets/images/hero@2x.png';
|
||||
$upgrade-image-mobile: '../../app/assets/images/hero.png';
|
||||
@@ -0,0 +1,207 @@
|
||||
/**
|
||||
* Webp styles
|
||||
*
|
||||
* @since 3.8.0
|
||||
*/
|
||||
|
||||
@include body-class(true) {
|
||||
|
||||
#smush-box-next-gen-next-gen {
|
||||
.sui-box-header {
|
||||
.smush-sui-tag-new {
|
||||
font-size: 10px;
|
||||
line-height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.sui-box-settings-row.sui-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
#smush-box-webp-wizard {
|
||||
.sui-row-with-sidenav {
|
||||
margin-bottom: 0;
|
||||
|
||||
.sui-sidenav {
|
||||
padding: 30px;
|
||||
border-top-left-radius: $border-radius;
|
||||
background-color: #F8F8F8;
|
||||
|
||||
.smush-wizard-bar-subtitle {
|
||||
font-size: 11px;
|
||||
line-height: 20px;
|
||||
font-weight: 700;
|
||||
color: #AAAAAA;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.smush-sidenav-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 33px;
|
||||
|
||||
h4 {
|
||||
margin: 0;
|
||||
line-height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.smush-wizard-steps-container {
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
|
||||
@include media(max-width, lg) {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.smush-wizard-bar-step {
|
||||
display: inline-block;
|
||||
font-size: 13px;
|
||||
color: #AAAAAA;
|
||||
line-height: 22px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 0;
|
||||
|
||||
.smush-wizard-bar-step-number {
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
text-align: center;
|
||||
border-radius: 50%;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
font-size: 11px;
|
||||
background-color: #F2F2F2;
|
||||
border: 1px solid #DDDDDD;
|
||||
|
||||
@include media(max-width, lg) {
|
||||
display: block;
|
||||
margin: 0 auto 5px auto;
|
||||
}
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
color: #DDDDDD;
|
||||
}
|
||||
|
||||
&.current {
|
||||
color: #333333;
|
||||
|
||||
.smush-wizard-bar-step-number {
|
||||
background-color: #FFFFFF;
|
||||
border-color: #333333;
|
||||
}
|
||||
}
|
||||
|
||||
&.done .smush-wizard-bar-step-number {
|
||||
background-color: #1ABC9C;
|
||||
border-color: #1ABC9C;
|
||||
|
||||
.sui-icon-check::before {
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
@include media(min-width, lg) {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@include media(max-width, lg) {
|
||||
width: 70px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
svg {
|
||||
|
||||
line {
|
||||
stroke-width: 4px;
|
||||
}
|
||||
|
||||
&.smush-svg-desktop {
|
||||
height: 40px;
|
||||
width: 22px;
|
||||
margin-left: 10px;
|
||||
display: none;
|
||||
|
||||
@include media(min-width, lg) {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
&.smush-svg-mobile {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
display: block;
|
||||
margin-bottom: -14px;
|
||||
padding: 0 35px;
|
||||
|
||||
@include media(min-width, lg) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include media(max-width, sm) {
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.smush-wizard-steps-content-wrapper {
|
||||
padding: 20px;
|
||||
|
||||
.smush-wizard-steps-content {
|
||||
padding: 0 70px;
|
||||
text-align: center;
|
||||
|
||||
&:first-child {
|
||||
padding-top: 30px;
|
||||
}
|
||||
|
||||
.smush-step-indicator {
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
color: #888888;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@include media(max-width, sm) {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.smush-wizard-step-1 {
|
||||
|
||||
.sui-box-selectors {
|
||||
padding-left: 115px;
|
||||
padding-right: 115px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
&.smush-wizard-step-2 {
|
||||
|
||||
.smush-wizard-rules-wrapper {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.sui-tabs-menu {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
@include media(min-width, sm) {
|
||||
padding: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
@import url('https://fonts.bunny.net/css?family=Roboto:400,500,700');
|
||||
@import "modules/variables";
|
||||
$font--path: '~@wpmudev/shared-ui/dist/fonts/';
|
||||
|
||||
@font-face {
|
||||
font-family: "wpmudev-plugin-icons";
|
||||
src: url('#{$font--path}/wpmudev-plugin-icons.eot?');
|
||||
src: url('#{$font--path}/wpmudev-plugin-icons.eot?') format('embedded-opentype'),
|
||||
url('#{$font--path}/wpmudev-plugin-icons.ttf') format('truetype'),
|
||||
url('#{$font--path}/wpmudev-plugin-icons.woff') format('woff'),
|
||||
url('#{$font--path}/wpmudev-plugin-icons.woff2') format('woff2'),
|
||||
url('#{$font--path}/wpmudev-plugin-icons.svg') format('svg');
|
||||
font-weight: 400;
|
||||
font-style: normal
|
||||
}
|
||||
|
||||
@media screen and ( max-width: 800px ) {
|
||||
#smush-image-bar-toggle,
|
||||
#smush-image-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and ( min-width: 800px ) {
|
||||
.smush-detected-img {
|
||||
border-radius: 5px;
|
||||
transition: all 0.5s ease;
|
||||
box-shadow: 0 0 0 5px #FECF2F;
|
||||
}
|
||||
|
||||
#smush-image-bar-toggle {
|
||||
position: fixed;
|
||||
top: 60px;
|
||||
right: 330px;
|
||||
height: 50px;
|
||||
width: 60px;
|
||||
z-index: 9999999;
|
||||
border-radius: 4px 0 0 4px;
|
||||
background-color: #FFF;
|
||||
box-shadow: inset 2px 0 0 0 #FECF2F, -13px 5px 20px 0 rgba(0, 0, 0, 0.1);
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
transition-property: all;
|
||||
transition-duration: .5s;
|
||||
transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
|
||||
|
||||
&.closed {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
&.smush-toggle-success {
|
||||
box-shadow: inset 2px 0 0 0 #1abc9c, -13px 5px 20px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
i.sui-icon-info,
|
||||
i.sui-icon-loader {
|
||||
font-family: "wpmudev-plugin-icons" !important;
|
||||
font-style: normal;
|
||||
font-size: 16px;
|
||||
line-height: 50px;
|
||||
color: #FECF2F;
|
||||
}
|
||||
|
||||
i.sui-icon-info:before {
|
||||
content: "I";
|
||||
}
|
||||
|
||||
&.smush-toggle-success i.sui-icon-info {
|
||||
color: #1abc9c;
|
||||
&:before {
|
||||
content: "_";
|
||||
}
|
||||
}
|
||||
|
||||
i.sui-icon-loader {
|
||||
&:before {
|
||||
display: block;
|
||||
content: "N";
|
||||
-webkit-animation: spin 1.3s linear infinite;
|
||||
animation: spin 1.3s linear infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#smush-image-bar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 330px;
|
||||
height: 100%;
|
||||
background-color: #FFF;
|
||||
box-shadow: 0 0 40px 0 rgba(0,0,0,0.1);
|
||||
z-index: 999999;
|
||||
padding: 0 0 20px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
max-width: 330px;
|
||||
transition-property: all;
|
||||
transition-duration: .5s;
|
||||
transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
|
||||
|
||||
&.closed {
|
||||
max-width: 0;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
h3, p, strong, span {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
letter-spacing: -0.25px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #333333;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
line-height: 30px;
|
||||
background-color: #FAFAFA;
|
||||
padding: 15px 20px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #888888;
|
||||
font-size: 13px;
|
||||
line-height: 22px;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: #AAAAAA;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
line-height: 22px;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.smush-resize-box {
|
||||
background-color: #F8F8F8;
|
||||
|
||||
&:first-of-type {
|
||||
border-top: 1px solid #E6E6E6;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
&:last-of-type {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
span:first-of-type {
|
||||
color: #888;
|
||||
height: 34px;
|
||||
width: 40px;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
line-height: 32px;
|
||||
text-align: center;
|
||||
border: 1px solid #DDDDDD;
|
||||
border-radius: 50%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.smush-image-info {
|
||||
background-color: #FFF;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
justify-content: space-between;
|
||||
padding: 17px 20px;
|
||||
border-bottom: 1px solid #E6E6E6;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.smush-front-icons {
|
||||
margin: 0 10px;
|
||||
line-height: 5px;
|
||||
|
||||
&:before {
|
||||
font-family: "wpmudev-plugin-icons" !important;
|
||||
speak: none;
|
||||
font-size: 12px;
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
text-rendering: auto;
|
||||
color: #AAA;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
&.smush-front-icon-arrows-in {
|
||||
&:before {
|
||||
content: '\2264';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.smush-tag {
|
||||
background-color: #fecf2f;
|
||||
color: #333;
|
||||
border-radius: 13px;
|
||||
height: 26px;
|
||||
width: 116px;
|
||||
font-size: 12px;
|
||||
letter-spacing: -0.25px;
|
||||
line-height: 16px;
|
||||
font-weight: 500;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
&.smush-tag-success {
|
||||
background-color: #1abc9c;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
&.smush-tooltip {
|
||||
position: relative;
|
||||
|
||||
&:before,
|
||||
&:after {
|
||||
content: "";
|
||||
opacity: 0;
|
||||
backface-visibility: hidden;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
transition: margin .2s, opacity .2s;
|
||||
}
|
||||
|
||||
&:before {
|
||||
border: 5px solid transparent;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
border-top-color: #000000;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
&:after {
|
||||
content: attr(data-tooltip);
|
||||
min-width: 40px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
background: #000000;
|
||||
box-sizing: border-box;
|
||||
color: #FFFFFF;
|
||||
font: 400 12px/18px "Roboto", Arial, sans-serif;
|
||||
text-transform: none;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
bottom: 100%;
|
||||
left: 50%;
|
||||
margin: 0 0 10px;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
&.smush-tooltip-constrained {
|
||||
&:after {
|
||||
min-width: 240px;
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.show-description):hover {
|
||||
&:before,
|
||||
&:after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:not(.show-description):hover,
|
||||
&.show-description {
|
||||
.smush-image-info { background-color: #F8F8F8; }
|
||||
|
||||
span:first-of-type {
|
||||
background-color: #E6E6E6;
|
||||
color: transparent;
|
||||
&:before {
|
||||
font-family: "wpmudev-plugin-icons" !important;
|
||||
font-weight: 400;
|
||||
content: "";
|
||||
color: #666;
|
||||
margin-right: -7px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.smush-image-description {
|
||||
display: none;
|
||||
border-radius: 4px;
|
||||
background-color: #FFFFFF;
|
||||
box-shadow: 0 2px 0 0 #DDDDDD;
|
||||
margin: 0 20px 20px;
|
||||
padding: 20px;
|
||||
color: #888888;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 13px;
|
||||
letter-spacing: -0.25px;
|
||||
line-height: 22px;
|
||||
}
|
||||
|
||||
&.show-description {
|
||||
padding-bottom: 1px;
|
||||
border-bottom: 1px solid #E6E6E6;
|
||||
|
||||
.smush-image-info { border-bottom: 0; }
|
||||
.smush-image-description { display: block; }
|
||||
|
||||
span:first-of-type {
|
||||
background-color: #FECF2F;
|
||||
border-color: #FECF2F;
|
||||
&:before { color: #333; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#smush-image-bar-notice {
|
||||
display: none;
|
||||
margin: 20px;
|
||||
border: 1px solid #E6E6E6;
|
||||
border-left: 2px solid #1abc9c;
|
||||
border-radius: 4px;
|
||||
padding: 15px 20px 15px 25px;
|
||||
|
||||
p:before {
|
||||
position: absolute;
|
||||
left: 42px;
|
||||
font-family: "wpmudev-plugin-icons" !important;
|
||||
font-weight: 400;
|
||||
content: "_";
|
||||
color: #1abc9c;
|
||||
margin-right: -7px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,383 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Generated by IcoMoon</metadata>
|
||||
<defs>
|
||||
<font id="wpmudev-plugin-icons-12" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="!" glyph-name="warning-alert" d="M512 960c70.667 0 137-13.333 199-40 62.667-26.667 117.166-63.166 163.5-109.5s82.833-100.833 109.5-163.5c26.667-62 40-128.333 40-199s-13.333-137-40-199c-26.667-62.667-63.166-117.166-109.5-163.5s-100.833-82.833-163.5-109.5c-62-26.667-128.333-40-199-40s-137 13.333-199 40c-62.667 26.667-117.166 63.166-163.5 109.5s-82.833 100.833-109.5 163.5c-26.667 62-40 128.333-40 199s13.333 137 40 199c26.667 62.667 63.166 117.166 109.5 163.5s100.833 82.833 163.5 109.5c62 26.667 128.333 40 199 40zM512 704c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64s64 28.654 64 64v192c0 35.346-28.654 64-64 64zM512 192c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" />
|
||||
<glyph unicode=""" glyph-name="arrow-skip-end" d="M229.76 99.83c4.702-4.248 10.107-7.843 15.997-10.569l0.397-0.164c5.507-2.395 11.921-3.787 18.662-3.787 0.426 0 0.852 0.006 1.275 0.017l-0.062-0.002c0.047 0 0.102 0 0.156 0 7.141 0 13.921 1.549 20.021 4.331l-0.302-0.123c6.217 2.8 11.572 6.251 16.33 10.37l-0.083-0.070 311.025 311.897c4.641 4.638 8.371 10.184 10.905 16.35l0.12 0.333c2.477 5.93 3.917 12.819 3.917 20.044 0 0.094 0 0.187-0.001 0.279v-0.015c0 0.078 0.001 0.17 0.001 0.262 0 7.177-1.44 14.017-4.046 20.248l0.129-0.346c-2.617 6.511-6.353 12.065-11.021 16.678l-0.005 0.005-311.751 310.591c-4.539 4.573-9.931 8.291-15.918 10.898l-0.331 0.129c-5.488 2.22-11.852 3.508-18.518 3.508-0.579 0-1.155-0.009-1.729-0.028l0.084 0.003c-0.233 0.005-0.509 0.006-0.786 0.006-13.822 0-26.352-5.539-35.489-14.52l0.007 0.006-36.267-36.558c-4.407-4.602-7.985-10.041-10.465-16.049l-0.126-0.345c-2.647-5.948-4.187-12.889-4.187-20.189 0-13.973 5.645-26.63 14.778-35.81l-0.003 0.003 238.203-239.217-238.203-238.492c-4.607-4.517-8.33-9.915-10.902-15.924l-0.123-0.323c-2.215-5.506-3.497-11.891-3.497-18.575 0-0.458 0.006-0.912 0.017-1.366l-0.002 0.067c0-0.079-0.001-0.172-0.001-0.266 0-7.226 1.439-14.116 4.047-20.397l-0.13 0.353c2.373-6.284 5.984-11.622 10.569-15.938l0.021-0.019 36.558-37.283zM730.244 99.83h87.040c16.023 0 29.013 12.99 29.013 29.013v0 638.299c0 16.023-12.99 29.013-29.013 29.013v0h-87.040c-16.023 0-29.013-12.99-29.013-29.013v0-638.299c0-16.023 12.99-29.013 29.013-29.013v0z" />
|
||||
<glyph unicode="#" glyph-name="align-justify" d="M915.2 896h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v40.619c0 24.743-20.057 44.8-44.8 44.8zM915.2 639.744h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v41.365c0 24.743-20.057 44.8-44.8 44.8zM915.2 384.235h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v41.365c0 24.743-20.057 44.8-44.8 44.8zM915.2 128.725h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-39.125c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v39.872c0 24.743-20.057 44.8-44.8 44.8z" />
|
||||
<glyph unicode="$" glyph-name="monitor" d="M961.194 860.245h-898.389c-34.686 0-62.805-28.119-62.805-62.805v-548.011c0-34.686 28.119-62.805 62.805-62.805h338.261v-95.232h-104.789c-9.897 0-17.92-8.023-17.92-17.92v-19.456c-0.002-0.102-0.003-0.221-0.003-0.341 0-9.897 8.023-17.92 17.92-17.92 0.001 0 0.002 0 0.003 0h422.229c9.897 0 17.92 8.023 17.92 17.92v19.627c0 9.897-8.023 17.92-17.92 17.92h-95.573v95.232h338.261c0 0 0 0 0 0 34.686 0 62.805 28.119 62.805 62.805 0 0.060 0 0.12 0 0.18v548.001c0 34.686-28.119 62.805-62.805 62.805zM111.956 749.311h800.085v-451.755h-800.085z" />
|
||||
<glyph unicode="%" glyph-name="align-left" d="M913.333 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM110.667 512.213h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-586.432c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755zM825.675 127.979h-715.008c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h715.008c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755zM110.667 255.957h498.923c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755h-498.923c0 0 0 0 0 0-24.113 0-43.67-19.505-43.755-43.597v-40.327c0-24.165 19.59-43.755 43.755-43.755z" />
|
||||
<glyph unicode="&" glyph-name="align-right" d="M913.259 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM913.259 640.043h-586.432c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM913.108 127.979h-714.859c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h714.859c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755zM957.163 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32z" />
|
||||
<glyph unicode="'" glyph-name="quote-2" d="M214.449 82.518c-117.589 0-219.477 101.888-214.357 237.568 8.021 222.037 243.029 386.56 426.667 493.568l54.955-46.933c-131.413-78.336-259.755-199.168-267.264-339.456-5.12-141.141 167.083-206.165 167.083-211.627-2.56-73.045-75.776-133.291-167.083-133.291zM757.681 82.347c-117.419 0-219.307 102.4-214.187 237.568 7.851 221.867 242.859 386.389 425.643 493.568l54.955-46.763c-130.731-78.336-258.56-199.168-266.411-339.456-5.12-141.141 167.083-206.165 167.083-211.627-2.56-73.045-75.776-133.291-167.083-133.291z" />
|
||||
<glyph unicode="(" glyph-name="check" d="M968.539 715.568l-62.444 62.444c-7.94 8.099-18.995 13.119-31.221 13.119s-23.282-5.021-31.215-13.112l-460.37-462.087-202.941 202.941c-7.94 8.099-18.995 13.119-31.221 13.119s-23.282-5.021-31.215-13.112l-62.45-62.45c-8.099-7.94-13.119-18.995-13.119-31.221s5.021-23.282 13.112-31.215l266.016-263.518c15.821-15.822 37.676-25.608 61.819-25.608s45.998 9.786 61.819 25.608l523.431 523.275c8.099 7.94 13.119 18.995 13.119 31.221s-5.021 23.282-13.112 31.215z" />
|
||||
<glyph unicode=")" glyph-name="close" d="M620.102 448.032l234.834 234.834c7.407 7.444 11.987 17.708 11.987 29.041s-4.579 21.597-11.988 29.042l-50.879 50.097c-7.444 7.407-17.708 11.987-29.041 11.987s-21.597-4.579-29.042-11.988l-234.832-234.832-234.834 234.834c-7.377 7.168-17.458 11.588-28.572 11.588s-21.195-4.42-28.581-11.598l-50.558-50.401c-7.315-7.428-11.832-17.628-11.832-28.885s4.517-21.457 11.836-28.89l234.828-234.828-234.834-234.834c-7.407-7.444-11.987-17.708-11.987-29.041s4.579-21.597 11.988-29.042l50.566-50.097c7.427-7.445 17.696-12.051 29.041-12.051s21.615 4.606 29.041 12.050l234.835 234.835 234.834-234.834c7.444-7.407 17.708-11.987 29.041-11.987s21.597 4.579 29.042 11.988l50.409 50.409c7.407 7.444 11.987 17.708 11.987 29.041s-4.579 21.597-11.988 29.042z" />
|
||||
<glyph unicode="*" glyph-name="align-y-center" d="M256 512v128c0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64v-128h192c35.346 0 64-28.654 64-64s-28.654-64-64-64h-192v-128c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v128h-192c-35.346 0-64 28.654-64 64s28.654 64 64 64h192z" />
|
||||
<glyph unicode="+" glyph-name="cross-close" d="M1024 448c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512zM680.107 235.349c-5.961-5.964-14.198-9.652-23.296-9.652s-17.335 3.689-23.296 9.652l-121.515 121.515-121.515-121.515c-5.961-5.964-14.198-9.652-23.296-9.652s-17.335 3.689-23.296 9.652l-49.835 49.835c-5.964 5.961-9.652 14.198-9.652 23.296s3.689 17.335 9.652 23.296l121.515 121.515-121.515 121.515c-5.964 5.961-9.652 14.198-9.652 23.296s3.689 17.335 9.652 23.296l49.835 49.835c5.961 5.964 14.198 9.652 23.296 9.652s17.335-3.689 23.296-9.652l121.515-120.832 121.515 121.515c5.961 5.964 14.198 9.652 23.296 9.652s17.335-3.689 23.296-9.652l49.835-49.835c5.964-5.961 9.652-14.198 9.652-23.296s-3.689-17.335-9.652-23.296l-121.515-121.515 121.515-121.515c5.964-5.961 9.652-14.198 9.652-23.296s-3.689-17.335-9.652-23.296z" />
|
||||
<glyph unicode="," glyph-name="clock" d="M512 823.467c207.365 0 375.467-168.102 375.467-375.467s-168.102-375.467-375.467-375.467c-207.365 0-375.467 168.102-375.467 375.467 0.677 207.091 168.375 374.79 375.401 375.466zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM774.144 638.293l-53.248 53.248c-4.962 4.662-11.661 7.527-19.029 7.527s-14.067-2.864-19.044-7.54l-170.652-170.653-93.696 93.696c-4.946 4.7-11.65 7.591-19.029 7.591s-14.083-2.891-19.041-7.602l-53.065-53.066c-4.951-4.865-8.020-11.631-8.021-19.114 0-0.020 0-0.043 0-0.066 0-7.378 3.001-14.055 7.85-18.877l165.719-165.719c4.849-4.851 11.549-7.851 18.95-7.851 0.058 0 0.116 0 0.174 0.001h1.015c7.274 0.098 13.834 3.079 18.603 7.851l242.347 242.347c4.857 4.876 7.86 11.602 7.86 19.029s-3.003 14.153-7.861 19.030z" />
|
||||
<glyph unicode="-" glyph-name="instagram" d="M931.8 447.688c-0.522 0.007-1.044 0.014-1.563 0.020 0 43.786 1.017 87.6-0.287 131.348-1.304 43.68-0.492 87.542-8.619 130.867-15.025 80.104-67.485 132.495-147.681 147.449-43.892 8.189-88.323 7.806-132.57 8.547-76.752 1.287-153.542 1.362-230.298 0.495-46.572-0.522-93.31-1.731-139.622-6.212-94.406-9.144-155.559-64.7-168.54-154.863-6.048-42.022-7.724-84.879-8.499-127.409-1.41-77.315-1.386-154.675-0.539-232.001 0.505-46.001 1.809-92.157 6.127-137.923 8.926-94.522 64.177-156.45 155.778-169.585 40.912-5.868 82.644-8.076 124.017-8.243 110.292-0.444 220.6 0.768 330.889 2.188 22.040 0.283 44.377 2.7 65.987 7.062 75.008 15.148 124.105 59.129 141.708 134.571 5.516 23.631 8.564 48.213 9.424 72.479 2.369 67.038 2.983 134.134 4.291 201.209zM713.388-64.001h-402.773c-6.168 0.853-12.326 1.802-18.504 2.546-20.292 2.451-40.902 3.335-60.836 7.482-115.746 24.081-190.16 92.631-218.092 208.268-7.264 30.078-8.94 61.508-13.182 92.317v402.773c2.106 19.657 3.649 39.393 6.427 58.952 7.98 56.221 27.020 107.803 64.556 151.562 47.599 55.491 109.35 83.613 180.412 93.648 19.651 2.775 39.475 4.335 59.218 6.451h402.773c6.164-0.853 12.322-1.799 18.5-2.546 20.292-2.451 40.905-3.331 60.839-7.479 115.75-24.078 190.15-92.641 218.088-208.268 7.267-30.078 8.943-61.508 13.186-92.32v-402.773c-2.109-19.654-3.656-39.39-6.434-58.948-8.069-56.825-27.436-108.861-65.669-152.852-47.52-54.685-108.865-82.412-179.296-92.355-19.647-2.778-39.472-4.338-59.215-6.458zM511.43 278.487c-92.986 0.222-169.127 76.636-169.052 169.656 0.075 92.955 76.373 169.325 169.322 169.479 93.699 0.157 170.209-76.708 169.817-170.605-0.389-92.969-76.875-168.755-170.086-168.53zM775.95 446.692c0.949 145.681-115.575 263.745-261.789 265.243-146.295 1.502-265.178-115.828-266.11-262.629-0.925-145.712 115.572-263.745 261.789-265.243 146.275-1.502 265.151 115.821 266.11 262.629zM847.602 719.86c0.594 35.386-26.279 63.328-61.31 63.747-34.577 0.413-62.454-26.003-63.358-60.044-0.945-35.345 25.757-63.874 60.512-64.659 35.308-0.795 63.573 26.054 64.157 60.955z" />
|
||||
<glyph unicode="." glyph-name="plug-disconnected" d="M609.963 390.827c-3.917 3.892-9.315 6.297-15.275 6.297s-11.358-2.405-15.276-6.298l0.001 0.001-130.048-130.56-125.099 125.099 130.048 130.048c3.892 3.917 6.297 9.315 6.297 15.275s-2.405 11.358-6.298 15.276l-30.548 30.548c-3.917 3.892-9.315 6.297-15.275 6.297s-11.358-2.405-15.276-6.298l-130.047-130.047-32.597 32.597c-3.101 3.17-7.422 5.135-12.203 5.135s-9.101-1.965-12.2-5.132l-83.63-83.63c-37.202-37.444-60.196-89.045-60.196-146.015 0-45.244 14.502-87.1 39.111-121.175l-0.419 0.609-82.091-82.091c-11.749-11.749-19.016-27.981-19.016-45.909 0-35.857 29.068-64.926 64.926-64.926 17.929 0 34.16 7.267 45.909 19.016l82.091 82.091c33.426-24.103 75.209-38.549 120.366-38.549 57.155 0 108.904 23.143 146.389 60.568l-0.003-0.003 83.456 83.627c3.17 3.101 5.135 7.422 5.135 12.203s-1.965 9.101-5.132 12.2l-32.6 32.6 130.048 130.048c3.892 3.917 6.297 9.315 6.297 15.275s-2.405 11.358-6.298 15.276l0.001-0.001zM1005.056 941.056c-11.741 11.767-27.975 19.046-45.909 19.046s-34.168-7.28-45.908-19.045l-84.481-84.481c-33.426 24.103-75.209 38.549-120.366 38.549-57.155 0-108.904-23.143-146.389-60.568l0.003 0.003-84.139-83.627c-3.17-3.101-5.135-7.422-5.135-12.203s1.965-9.101 5.132-12.2l312.664-312.664c3.101-3.17 7.422-5.135 12.203-5.135s9.101 1.965 12.2 5.132l83.63 83.63c37.423 37.482 60.565 89.231 60.565 146.386 0 45.157-14.446 86.94-38.97 120.98l0.42-0.613 84.48 84.48c11.767 11.741 19.046 27.975 19.046 45.909s-7.28 34.168-19.045 45.908l-0.001 0.001z" />
|
||||
<glyph unicode="/" glyph-name="pencil" d="M0-34.987c-0.395-1.591-0.622-3.418-0.622-5.298 0-6.68 2.864-12.692 7.432-16.873 4.214-4.6 10.225-7.464 16.906-7.464 1.88 0 3.707 0.227 5.455 0.655l312.163 95.029 674.133 674.133c4.857 4.876 7.86 11.602 7.86 19.029s-3.003 14.153-7.861 19.030l-208.212 208.895c-4.849 4.847-11.546 7.845-18.944 7.845s-14.095-2.998-18.944-7.845l-674.304-674.816zM88.235 24.917l60.757 199.168 139.093-139.093z" />
|
||||
<glyph unicode="0" glyph-name="unlock" d="M221.825 512v85.31c0 164.261 132.864 301.343 295.141 298.651 150.243-2.915 272.552-120.417 284.016-270.063 0.038-0.516 0.059-1.038 0.059-1.563 0-10.935-8.797-19.808-19.673-19.86h-125.449c-10.016 0.159-18.236 7.747-19.534 18.306-8.903 61.174-61.339 108.148-124.694 108.148-4.209 0-8.368-0.206-12.559-0.63-63.697-7.605-113.093-62.063-113.093-128.111 0-0.509 0.003-1.018 0.009-1.447v-88.741h445.952c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h29.825z" />
|
||||
<glyph unicode="1" glyph-name="popup" d="M64 960h896c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64zM256 704c-35.346 0-64-28.654-64-64v-384c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v384c0 35.346-28.654 64-64 64h-512zM704 640c35.346 0 64-28.654 64-64s-28.654-64-64-64c-35.346 0-64 28.654-64 64s28.654 64 64 64z" />
|
||||
<glyph unicode="2" glyph-name="slide-in" d="M1024 704h-576c-35.346 0-64-28.654-64-64v-384c0-35.346 28.654-64 64-64h576v-192c0-35.346-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64h896c35.346 0 64-28.654 64-64v-192zM896 640c35.346 0 64-28.654 64-64s-28.654-64-64-64c-35.346 0-64 28.654-64 64s28.654 64 64 64z" />
|
||||
<glyph unicode="3" glyph-name="embed" d="M128 128h768c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v0c0 35.346 28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64zM832 576c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64s-28.654 64-64 64zM128 896h768c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v0c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="4" glyph-name="copy" d="M736 64c0-70.692-57.308-128-128-128h-384c-70.692 0-128 57.308-128 128v576c0 70.692 57.308 128 128 128v-576c0-70.692 57.308-128 128-128h384zM416 960h192v-256c0-35.346 28.654-64 64-64h256v-384c0-70.692-57.308-128-128-128h-416c-53.019 0-96 42.981-96 96v608c0 70.692 57.308 128 128 128zM672 960l256-256h-224c-17.673 0-32 14.327-32 32v224z" />
|
||||
<glyph unicode="5" glyph-name="link" d="M937.837 873.837c-53.702 53.791-127.937 87.068-209.944 87.068-76.601 0-146.422-29.035-199.058-76.699l0.252 0.225-150.034-150.034c-25.673-25.71-46.631-56.139-61.458-89.87-31.665-15.309-58.252-32.532-81.502-53.399l0.273 0.241-150.205-149.693c-52.709-53.514-85.256-127.017-85.256-208.121 0-163.835 132.815-296.651 296.651-296.651 81.104 0 154.606 32.547 208.158 85.293l149.997 149.998c20.623 22.976 37.846 49.563 50.526 78.588 36.363 17.467 66.791 38.424 92.506 64.102l149.86 150.202c47.293 52.346 76.23 122.061 76.23 198.535 0 81.887-33.179 156.025-86.826 209.703zM404.516 128.793v0c-27.092-27.092-64.52-43.849-105.861-43.849-82.683 0-149.711 67.027-149.711 149.711 0 41.341 16.757 78.769 43.849 105.861v0l109.365 109.365c27.541-103.91 107.782-184.094 209.666-211.089zM485.855 421.684c-24.798 24.767-40.912 58.225-43.38 95.415 74.752-4.514 134.187-63.89 139.22-138.191-37.617 2.019-71.081 18.136-95.838 42.944zM840.435 564.883l-118.763-118.763c-27.478 103.889-107.663 184.074-209.496 211.088l107.479 110 9.228 9.228c26.164 22.926 60.662 36.91 98.428 36.91 82.673 0 149.693-67.019 149.693-149.693 0-37.766-13.985-72.264-37.059-98.6z" />
|
||||
<glyph unicode="6" glyph-name="unlink" horiz-adv-x="1025" d="M129.536 783.36l109.397-110.080c5.875-5.875 13.99-9.508 22.955-9.508 17.929 0 32.463 14.534 32.463 32.463 0 8.964-3.634 17.080-9.508 22.955l-108.885 109.568c-5.652 4.91-13.084 7.903-21.215 7.903-17.909 0-32.427-14.518-32.427-32.427 0-8.131 2.993-15.563 7.936-21.254zM318.635 826.88l39.765-150.357c3.88-13.945 16.466-24.008 31.403-24.008 17.972 0 32.541 14.569 32.541 32.541 0 3.036-0.416 5.974-1.193 8.762l-39.711 149.275c-3.878 13.899-16.427 23.926-31.317 23.926-17.927 0-32.459-14.532-32.459-32.459 0-3.036 0.417-5.975 1.196-8.762zM127.829 567.467v0l149.845-40.107c2.559-0.725 5.497-1.142 8.533-1.142 17.927 0 32.459 14.532 32.459 32.459 0 14.891-10.027 27.439-23.697 31.263l-149.562 40.332c-2.559 0.725-5.497 1.142-8.533 1.142-17.927 0-32.459-14.532-32.459-32.459 0-14.891 10.027-27.439 23.697-31.263zM895.147 112.64l-110.080 110.080c-5.875 5.875-13.99 9.508-22.955 9.508-17.929 0-32.463-14.534-32.463-32.463 0-8.964 3.634-17.080 9.508-22.955l109.568-109.568c5.771-5.373 13.536-8.671 22.072-8.671 17.909 0 32.427 14.518 32.427 32.427 0 8.493-3.265 16.224-8.609 22.005zM706.048 69.12l-40.448 150.357c-3.88 13.945-16.466 24.008-31.403 24.008-17.972 0-32.541-14.569-32.541-32.541 0-3.036 0.416-5.974 1.193-8.762l40.052-149.616c3.878-13.899 16.427-23.926 31.317-23.926 17.927 0 32.459 14.532 32.459 32.459 0 3.036-0.417 5.975-1.196 8.762zM896.853 328.533v0l-149.845 40.107c-2.559 0.725-5.497 1.142-8.533 1.142-17.927 0-32.459-14.532-32.459-32.459 0-14.891 10.027-27.439 23.697-31.263l150.074-40.161c2.559-0.725 5.497-1.142 8.533-1.142 17.927 0 32.459 14.532 32.459 32.459 0 14.891-10.027 27.439-23.697 31.263zM492.032 428.203c-40.919 40.905-97.441 66.205-159.872 66.205-58.335 0-111.51-22.088-151.619-58.358l0.196 0.174-114.347-114.347c-38.111-40.385-61.537-94.988-61.537-155.062 0-124.89 101.243-226.133 226.133-226.133 60.074 0 114.677 23.425 155.173 61.64l114.236 114.243c36.095 39.914 58.183 93.089 58.183 151.424 0 62.431-25.3 118.953-66.206 159.873zM417.963 192l-109.397-109.397c-20.662-20.514-49.128-33.193-80.555-33.193-63.151 0-114.345 51.194-114.345 114.345 0 31.724 12.919 60.43 33.783 81.145l109.404 109.404c19.827 17.113 45.846 27.537 74.3 27.537 62.963 0 114.005-51.042 114.005-114.005 0-28.453-10.424-54.472-27.661-74.446zM958.464 893.781c-40.919 40.905-97.441 66.205-159.872 66.205-58.335 0-111.51-22.088-151.619-58.358l0.196 0.174-114.347-114.347c-37.354-40.216-60.276-94.288-60.276-153.712 0-124.89 101.243-226.133 226.133-226.133 59.467 0 113.573 22.954 153.941 60.486l114.207 114.218c36.095 39.914 58.183 93.089 58.183 151.424 0 62.431-25.3 118.953-66.206 159.873zM884.224 658.091l-109.397-109.397c-19.918-17.349-46.131-27.926-74.814-27.926-63.058 0-114.176 51.118-114.176 114.176 0 29.023 10.829 55.518 28.668 75.662l-0.104-0.12 109.397 109.397c19.827 17.113 45.846 27.537 74.3 27.537 62.963 0 114.005-51.042 114.005-114.005 0-28.453-10.424-54.472-27.661-74.446z" />
|
||||
<glyph unicode="7" glyph-name="list-number" d="M384 832h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 512h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 192h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM85.76 687.36v108.16c-4.8-2.24-9.92-3.52-15.040-3.52-18.56 0-32.32 13.44-32.32 32 0 21.44 14.4 30.4 16.64 29.44 6.4-4.16 12.48-6.4 20.16-6.4 13.76 0 25.28 8.64 28.8 23.36h16.64c18.24 0 28.16-9.92 28.16-29.76v-153.28c0-19.52-9.92-29.76-28.16-29.76h-8c-17.6 0-26.88 10.24-26.88 29.76zM25.6 369.6v12.16c0 36.16 35.52 56.64 63.36 69.12 24 11.2 42.56 16.64 42.56 29.44 0 13.12-8.64 19.84-26.56 19.84-21.44 0-34.24-16-37.44-32.32 0-0.64-41.28-2.24-41.28 28.48s29.76 54.080 82.88 54.080c54.72 0 84.48-24.96 84.48-66.88 0-39.68-27.2-52.48-56.64-63.36-24.96-9.6-43.52-16.64-51.2-30.4h79.36c22.080 0 30.080-8.32 30.080-23.36v-2.56c0-16-7.68-24.96-30.080-24.96h-101.12c-29.76 0-38.4 4.16-38.4 30.72zM22.4 62.72c0 32 37.12 31.36 37.76 29.12 5.44-19.52 21.76-29.44 44.8-29.44 20.16 0 32.32 8.32 32.32 21.44s-7.68 18.88-24.32 18.88h-6.4c-20.8 0-29.44 6.72-29.44 20.8v3.2c0 14.080 9.6 21.12 28.8 21.12h11.2c11.2 0 18.24 6.080 18.24 15.68 0 11.52-11.84 18.88-31.36 18.88-27.2 0-37.44-15.040-40.96-27.52-0.32-2.56-36.8-3.52-36.8 28.8 0 26.56 30.4 46.72 79.040 46.72 57.92 0 89.28-20.16 89.28-57.92 0-20.48-13.44-34.88-37.76-41.92 26.56-8.64 40.96-26.56 40.96-51.84 0-40.96-33.28-64.32-92.16-64.32-51.52 0-83.2 22.080-83.2 48.32z" />
|
||||
<glyph unicode="8" glyph-name="list-bullet" d="M384 832h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 512h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 192h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM64 864h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM64 544h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM64 224h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="9" glyph-name="lock" d="M222.575 512l0.016 102.193c7.191 156.872 134.178 281.807 289.779 281.807s282.589-124.933 289.803-282.466v-101.534h29.827c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h30.575zM386.045 512h251.758v101.532c0 70.902-56.355 128.377-125.878 128.377s-125.88-57.478-125.88-128.377v-101.532z" />
|
||||
<glyph unicode=":" glyph-name="arrow-skip-start" d="M794.729 99.707c-4.704-4.25-10.109-7.845-16-10.573l-0.397-0.165c-5.848-2.66-12.683-4.209-19.879-4.209s-14.031 1.549-20.188 4.334l0.309-0.125c-6.234 2.89-11.594 6.486-16.301 10.782l0.050-0.044-312.112 312.112c-4.671 4.572-8.409 10.079-10.913 16.22l-0.116 0.322c-2.207 5.658-3.485 12.207-3.485 19.054 0 0.187 0.001 0.376 0.003 0.562v-0.028c0 0.078-0.001 0.17-0.001 0.262 0 7.179 1.44 14.021 4.047 20.254l-0.129-0.346c2.401 6.771 6.010 12.577 10.613 17.434l-0.020-0.022 312.837 310.661c4.498 4.64 9.904 8.372 15.934 10.909l0.317 0.119c5.872 2.541 12.708 4.020 19.891 4.020 14.167 0 26.989-5.751 36.262-15.046l0.001-0.001 35.549-36.566c9.237-9.35 14.944-22.209 14.944-36.398 0-7.126-1.439-13.917-4.043-20.097l0.128 0.341c-2.696-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-237.24-239.271 237.24-238.546c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.324c2.479-5.769 3.919-12.482 3.919-19.533 0-0.121-0.001-0.244-0.002-0.364v0.018c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.403l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-35.549-37.291zM294.13 99.707h-87.060c-16.027 0-29.019 12.992-29.019 29.019v0 638.444c0 16.027 12.992 29.019 29.019 29.019v0h87.060c16.027 0 29.019-12.992 29.019-29.019v0-638.444c0-16.027-12.992-29.019-29.019-29.019v0z" />
|
||||
<glyph unicode=";" glyph-name="code" d="M137.076 447.767c22.144-13.682 39.454-28.996 51.93-45.943s21.209-38.558 26.199-64.833c4.99-26.275 7.485-59.935 7.485-100.981 0-30.784 0.702-53.483 2.105-68.098s4.211-25.731 8.421-33.349c4.211-7.618 9.279-12.593 15.205-14.926s16.062-4.586 30.409-6.763c11.852-1.555 21.676-7.307 29.474-17.258s11.696-23.010 11.696-39.18c0-37.625-22.924-56.437-68.772-56.437-28.382 0-53.723 5.908-76.023 17.724s-39.532 28.529-51.696 50.141c-12.164 21.611-18.402 46.409-18.713 74.395-0.936 47.265-1.871 85.2-2.807 113.807s-2.339 47.109-4.211 55.504c-4.678 20.834-11.618 36.536-20.819 47.109s-21.209 20.445-36.023 29.618c-14.815 9.173-25.341 17.413-31.579 24.72s-9.357 18.89-9.357 34.749c0 23.010 9.045 40.268 27.135 51.773 22.456 13.993 38.44 25.886 47.953 35.681s16.218 22.388 20.117 37.78c3.899 15.392 6.16 32.183 6.784 50.374s1.559 61.956 2.807 131.298c0.936 42.911 14.581 77.193 40.936 102.846s61.52 38.48 105.497 38.48c45.848 0 68.772-18.501 68.772-55.504 0-16.791-3.821-30.007-11.462-39.646s-17.544-15.237-29.708-16.791c-18.090-2.488-30.721-6.219-37.895-11.194s-11.852-14.615-14.035-28.918c-2.183-14.304-3.587-41.978-4.211-83.023-0.624-40.113-3.041-72.995-7.251-98.649s-12.476-47.497-24.795-65.533c-12.32-18.035-30.175-34.36-53.567-48.974zM886.924 447.767c-22.144-13.682-39.454-28.996-51.93-45.943s-21.209-38.558-26.199-64.833c-4.99-26.275-7.485-59.935-7.485-100.981 0-30.784-0.702-53.483-2.105-68.098s-4.211-25.731-8.421-33.349c-4.211-7.618-9.279-12.593-15.205-14.926s-16.062-4.586-30.409-6.763c-11.852-1.555-21.676-7.307-29.474-17.258s-11.696-23.010-11.696-39.18c0-37.625 22.924-56.437 68.772-56.437 28.382 0 53.723 5.908 76.023 17.724s39.532 28.529 51.696 50.141c12.164 21.611 18.402 46.409 18.713 74.395 0.936 47.265 1.871 85.2 2.807 113.807s2.339 47.109 4.211 55.504c4.678 20.834 11.618 36.536 20.819 47.109s21.209 20.445 36.023 29.618c14.815 9.173 25.341 17.413 31.579 24.72s9.357 18.89 9.357 34.749c0 23.010-9.045 40.268-27.135 51.773-22.456 13.993-38.44 25.886-47.953 35.681s-16.218 22.388-20.117 37.78c-3.899 15.392-6.16 32.183-6.784 50.374s-1.559 61.956-2.807 131.298c-0.936 42.911-14.581 77.193-40.936 102.846s-61.52 38.48-105.497 38.48c-45.848 0-68.772-18.501-68.772-55.504 0-16.791 3.821-30.007 11.462-39.646s17.544-15.237 29.708-16.791c18.090-2.488 30.721-6.219 37.895-11.194s11.852-14.615 14.035-28.918c2.183-14.304 3.587-41.978 4.211-83.023 0.624-40.113 3.041-72.995 7.251-98.649s12.476-47.497 24.795-65.533c12.32-18.035 30.175-34.36 53.567-48.974z" />
|
||||
<glyph unicode="<" glyph-name="style-type" d="M600.183 22.811c0-0.042 0-0.092 0-0.143 0-15.931-7.276-30.162-18.685-39.552-11.343-10.55-26.453-17.019-43.073-17.137-0.026 0-0.030 0-0.033 0-11.14 0-21.521 3.244-30.253 8.839-9.496 6.164-17 15.152-21.316 25.776l-44.678 99.359h-283.307l-44.373-98.645c-4.412-10.932-11.786-19.9-21.129-26.154-8.647-5.591-18.965-8.837-30.041-8.837-0.251 0-0.501 0.002-0.75 0.005-16.766 0.139-32.034 6.598-43.532 17.111-11.636 9.226-19.065 23.426-19.065 39.361 0 0.006 0 0.013 0 0.019 0.497 9.522 2.9 18.373 6.832 26.334l225.616 474.401c5.839 13.038 15.402 23.536 27.33 30.381 11.701 6.853 25.389 10.801 39.998 10.801s28.297-3.948 40.055-10.835c11.808-6.995 21.526-17.206 27.932-29.427l225.816-475.714c3.869-7.822 6.285-16.984 6.652-26.671zM203.041 199.11h194.731l-96.939 217.429zM980.428 346.736q43.52-43.861 43.52-134.144v-188.928c0.067-1.036 0.105-2.247 0.105-3.466 0-15.424-6.089-29.425-15.995-39.732-10.73-9.683-25.041-15.619-40.738-15.619-1.273 0-2.536 0.039-3.789 0.116-0.367-0.026-1-0.037-1.635-0.037-16.095 0-30.664 6.534-41.2 17.094-10.549 10.354-17.086 24.76-17.086 40.694 0 0.514 0.007 1.026 0.020 1.537l-0.002 5.727c-7.996-20.951-22.288-37.999-40.536-49.25-18.994-11.008-41.281-17.361-65.052-17.361-1.28 0-2.555 0.018-3.826 0.055-0.297-0.009-0.87-0.012-1.443-0.012-26.924 0-52.375 6.304-74.959 17.516-20.968 10.24-38.97 26.053-51.962 45.498-12.607 18.963-19.936 41.675-19.936 66.099 0 0.451 0.003 0.902 0.007 1.353-0.104 1.659-0.163 3.679-0.163 5.713 0 24.818 8.756 47.591 23.347 65.398 19.243 18.899 44.285 32.287 72.24 37.242 38.061 7.624 80.858 11.917 124.658 11.917 5.548 0 11.080-0.069 16.595-0.206l20.858 0.016v15.019c0.19 1.951 0.299 4.218 0.299 6.51 0 16.996-5.972 32.597-15.932 44.819-11.911 9.935-27.533 16.048-44.582 16.048-2.294 0-4.563-0.111-6.8-0.327-37.555-3.095-72.498-12.15-104.744-26.231-7.318-4.335-18.437-7.661-30.26-8.382-0.641-0.028-1.133-0.038-1.627-0.038-11.135 0-21.095 5.030-27.732 12.942-6.891 8.683-11.027 19.729-11.027 31.74 0 0.861 0.021 1.718 0.063 2.569-0.029 0.454-0.044 1.126-0.044 1.802 0 9.556 2.815 18.454 7.661 25.911 6.169 8.019 14.031 14.681 23.056 19.429 21.018 11.107 44.941 19.783 70.137 24.97 26.728 6.037 55.41 9.331 84.859 9.347q90.294 0 133.814-43.861zM880.929 75.035c14.043 15.93 22.615 36.976 22.615 60.024 0 1.398-0.032 2.789-0.094 4.172l0.007 13.969h-14.165c-4.533 0.256-9.837 0.403-15.176 0.403-28.403 0-55.84-4.137-81.741-11.842-13.531-4.937-24.486-19.494-24.486-36.61 0-0.748 0.021-1.491 0.062-2.228-0.023-0.401-0.033-0.993-0.033-1.586 0-13.9 5.691-26.471 14.87-35.51 9.691-9.115 22.769-14.712 37.154-14.712 0.62 0 1.238 0.010 1.853 0.031 0.789-0.038 1.821-0.059 2.857-0.059 22.309 0 42.392 9.534 56.396 24.749zM571.852 565.36l19.797 53.589c19.302 51.135 58.945 90.778 108.798 109.654l55.042 19.882-53.589 19.797c-51.135 19.302-90.778 58.945-109.654 108.798l-20.394 55.554-19.797-53.76c-19.302-51.135-58.945-90.778-108.798-109.654l-55.042-20.735 53.589-19.797c51.122-19.322 90.758-58.958 109.653-108.798zM889.633 473.2l13.483 36.352c13.184 34.97 40.294 62.080 74.388 74.973l37.569 13.773-36.693 13.653c-34.97 13.184-62.080 40.294-74.973 74.388l-13.773 37.569-13.483-36.693c-13.221-35-40.396-62.12-74.557-74.974l-37.571-13.772 36.693-13.483c35-13.221 62.12-40.396 74.974-74.557z" />
|
||||
<glyph unicode="=" glyph-name="plus" d="M592 528h224c44.183 0 80-35.817 80-80s-35.817-80-80-80h-224v-224c0-44.183-35.817-80-80-80s-80 35.817-80 80v224h-224c-44.183 0-80 35.817-80 80s35.817 80 80 80h224v224c0 44.183 35.817 80 80 80s80-35.817 80-80v-224z" />
|
||||
<glyph unicode=">" glyph-name="phone" d="M96 644.091c0.383 6.356 0.719 12.715 1.158 19.067 2.407 34.835 9.752 68.393 22.669 100.482 10.283 25.546 23.75 49 40.315 70.389 11.371 14.684 24.127 27.819 37.886 39.915 11.775 10.351 23.209 21.152 34.745 31.815 7.805 7.214 16.098 13.568 25.71 17.741 16.771 7.281 32.938 5.537 48.531-3.861 15.58-9.389 27.495-23.14 38.498-37.917 14.867-19.967 26.85-42.028 39.684-63.47 9.421-15.74 18.561-31.656 26.011-48.611 7.548-17.177 13.557-34.88 15.397-53.95 2.536-26.278-3.773-49.817-20.485-69.211-9.59-11.13-20.792-20.641-31.103-31.069-10.013-10.126-21.434-18.212-32.501-26.842-13.34-10.402-23.591-23.417-27.874-41.004-3.58-14.703-2.625-29.374 0.561-43.979 4.338-19.88 12.228-38.199 21.467-55.904 16.31-31.257 36.336-59.679 57.602-87.145 20.172-26.052 41.282-51.184 64.197-74.492 19.154-19.485 39.281-37.668 62.295-51.801 13.611-8.358 27.832-14.956 43.525-17.296 20.317-3.030 38.018 3.112 53.341 17.542 3.092 2.911 6.23 5.854 8.874 9.211 11.704 14.855 25.651 27.129 39.36 39.64 7.778 7.098 15.694 14.267 24.381 19.919 21.681 14.106 44.907 15.397 68.798 7.237 19.479-6.653 36.955-17.52 52.816-31.050 19.334-16.493 38.017-33.873 56.871-51.008 13.325-12.112 25.947-25.026 36.91-39.689 9.418-12.596 17.396-26.049 20.847-42.074 0.578-2.685 1.014-5.405 1.515-8.109v-9.888c-0.282-1.5-0.581-2.997-0.845-4.501-2.861-16.304-11.322-29.058-22.392-39.964-10.796-10.635-22.351-20.414-32.79-31.428-23.2-24.478-49.419-44.015-79.015-58.372-29.561-14.341-60.527-22.693-92.863-25.201-5.43-0.421-10.862-0.81-16.293-1.214h-12.641c-1.228 0.156-2.453 0.36-3.685 0.46-8.106 0.661-16.235 1.068-24.315 1.989-29.335 3.343-57.659 11.278-85.211 22.44-43.679 17.696-83.615 42.727-121.293 72.116-32.133 25.064-62.033 52.964-90.438 82.743-33.21 34.815-64.16 71.844-93.455 110.497-28.62 37.762-55.164 77.111-78.554 118.856-27.723 49.479-50.598 101.29-64.649 157.281-6.417 25.57-10.826 51.513-12.438 77.972-0.368 6.048-0.749 12.095-1.123 18.143v13.596z" />
|
||||
<glyph unicode="?" glyph-name="question" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM552.789 170.667c-11.513-10.623-26.956-17.137-43.921-17.137-1.059 0-2.113 0.025-3.16 0.076-0.751-0.050-1.805-0.076-2.864-0.076-16.965 0-32.408 6.514-43.966 17.177-11.108 11.186-18 26.656-18 43.736s6.893 32.549 18.048 43.779c12.419 10.757 28.738 17.313 46.589 17.313s34.17-6.556 46.681-17.392c11.062-11.151 17.955-26.621 17.955-43.7s-6.893-32.549-18.048-43.779zM676.352 527.531c-14.593-25.881-32.311-48.004-53.036-66.882l-32.638-31.081c-18.585-17.435-31.085-41.162-34.087-67.765l-1.582-24.907h-102.4c-0.104 2.643-0.163 5.746-0.163 8.863 0 28.82 5.063 56.457 14.347 82.072 11.385 24.359 28.247 46.249 49.016 63.625 18.67 15.401 34.551 32.639 47.867 51.794 8.039 12.997 12.482 27.729 12.496 43.498q0 68.271-62.464 68.271c-0.543 0.017-1.181 0.026-1.822 0.026-17.84 0-33.952-7.398-45.435-19.293-11.575-12.699-18.652-29.637-18.652-48.228 0-0.751 0.012-1.5 0.035-2.246l-116.056 0.109c-0.089 1.957-0.14 4.251-0.14 6.558 0 44.597 19.006 84.754 49.36 112.815 32.988 27.163 75.53 43.576 121.907 43.576 3.801 0 7.575-0.11 11.321-0.328q84.816 0.024 131.067-40.936c28.949-26.748 47.016-64.908 47.016-107.288 0-3.024-0.092-6.026-0.273-9.004 0.020 0.268 0.021 0.101 0.021-0.066 0-23.235-5.614-45.158-15.561-64.488z" />
|
||||
<glyph unicode="@" glyph-name="plus-circle" d="M576 512v128c0 35.346-28.654 64-64 64s-64-28.654-64-64v-128h-128c-35.346 0-64-28.654-64-64s28.654-64 64-64h128v-128c0-35.346 28.654-64 64-64s64 28.654 64 64v128h128c35.346 0 64 28.654 64 64s-28.654 64-64 64h-128zM512-64c-282.77 0-512 229.23-512 512s229.23 512 512 512c282.77 0 512-229.23 512-512s-229.23-512-512-512z" />
|
||||
<glyph unicode="A" glyph-name="paperclip" d="M248.822-63.976c-51.495 1.136-97.52 23.616-129.751 58.91-61.91 61.751-69.59 121.313-65.321 160.396 7.914 52.328 33.104 97.701 69.471 131.097l392.695 392.679c109.568 109.568 182.443 69.462 216.235 35.84 40.789-40.789 68.267-111.275-36.693-215.381l-361.301-361.472-70.315 70.998 361.131 360.448c55.636 55.636 42.839 68.267 36.693 74.752s-19.797 19.797-75.435-35.84l-392.534-392.534c-20.474-18.438-35.098-43.015-40.978-70.817-3.054-26.463 8.893-52.063 36.37-79.711 34.133-34.133 59.904-30.549 68.267-29.355 30.677 7.419 56.812 23.685 76.316 45.914l465.551 465.744c32.165 29.338 56.871 66.31 71.298 108.071 14.547 53.038-2.178 100.313-50.648 148.782-51.2 51.2-133.291 104.448-257.536-19.968l-428.715-429.739c-9.043-9.107-21.57-14.742-35.413-14.742-27.56 0-49.901 22.344-49.901 49.901 0 13.716 5.534 26.14 14.491 35.16l429.224 429.736c133.291 132.779 278.528 140.117 398.678 19.797 93.184-93.184 93.184-183.979 76.627-243.712-19.472-60.91-53.065-112.682-97.048-153.387l-465.811-465.621c-34.177-37.539-79.859-64.066-131.449-74-8.080-1.219-15.674-1.778-23.4-1.778-0.281 0-0.562 0.001-0.843 0.002z" />
|
||||
<glyph unicode="B" glyph-name="bold" d="M684.799 460.033c72.576 14.976 132.48 80.64 132.48 176.127 0 102.528-74.88 195.84-221.184 195.84h-368.767c-19.512 0-35.328-15.816-35.328-35.328v-697.344c0-19.511 15.816-35.328 35.328-35.328h381.439c147.456 0 223.233 92.16 223.233 208.384 0 95.616-63.999 175.616-147.201 187.649zM355.455 688h204.801c55.296 0 89.599-33.408 89.599-80.64 0-49.536-34.56-80.64-89.599-80.64h-204.801v161.28zM567.294 207.871h-211.839v175.104h211.968c63.36 0 97.92-39.168 97.92-87.552 0-55.296-36.864-87.552-97.92-87.552h-0.129z" />
|
||||
<glyph unicode="C" glyph-name="crop" d="M993.343 183.651h-90.771v591.382c0 0.856 0 1.713 0 2.569 0 33.106-26.837 59.943-59.943 59.943h-592.581v88.202c0 18.918-15.336 34.253-34.253 34.253h-57.032c-18.918 0-34.253-15.336-34.253-34.253v0-88.373h-90.257c-18.918 0-34.253-15.336-34.253-34.253v-57.374c0-18.918 15.336-34.253 34.253-34.253h90.771v-590.697c0-0.856 0-1.713 0-2.569 0-33.106 26.837-59.943 59.943-59.943h592.581v-88.716c0-18.918 15.336-34.253 34.253-34.253h57.374c18.918 0 34.253 15.336 34.253 34.253v89.058h89.915c18.918 0 34.253 15.336 34.253 34.253v56.86c0 18.918-15.336 34.253-34.253 34.253zM249.535 183.993v528.527h528.013v-528.87h-527.5z" />
|
||||
<glyph unicode="D" glyph-name="photo-picture" d="M128 831.909h768c70.692 0 128-57.308 128-128v-512c0-70.692-57.308-128-128-128h-768c-70.692 0-128 57.308-128 128v512c0 70.692 57.308 128 128 128zM864 192c17.673 0 32 14.327 32 32v448c0 17.673-14.327 32-32 32h-704c-17.673 0-32-14.327-32-32v-277.114c0-10.479 5.131-20.294 13.735-26.275 14.511-10.087 34.453-6.501 44.54 8.011l5.468 7.866c3.088 5.029 9.354 8.471 16.582 8.471s13.494-3.441 16.631-8.559l42.74-61.863 174.711 252.92c5.545 10.301 17.931 17.472 32.319 17.472 14.004 0 26.108-6.793 31.951-16.825l262.042-379.694c0.826-1.341 1.457-2.78 1.886-4.41h93.395zM736 640c53.019 0 96-42.981 96-96s-42.981-96-96-96c-53.019 0-96 42.981-96 96s42.981 96 96 96z" />
|
||||
<glyph unicode="E" glyph-name="user-reputation-points" d="M957.76 551.040c-22.249-102.144-213.248-181.888-445.76-181.888-247.446 0-448 90.346-448 201.898v-123.051c0-111.552 200.555-201.898 448-201.898s448 90.347 448 201.898c-0.017 4.737-0.764 39.084-2.24 103.042zM512 123.051c-247.446 0-448 90.347-448 201.897v-123.051c0-111.552 200.555-201.897 448-201.897s448 90.347 448 201.897v123.051c0-111.552-200.555-201.897-448-201.897zM960 694.101c0-111.702-200.555-201.301-448-201.301s-448 89.6-448 201.301c0 111.701 200.555 201.899 448 201.899s448-90.347 448-201.899z" />
|
||||
<glyph unicode="F" glyph-name="animation-video" d="M952.182 832l0.031-0.002c39.701-0.323 71.788-33.5 71.788-74.38 0 0 0 0 0-0.002v-619.234c0-0.002 0-0.003 0-0.003 0-40.88-32.087-74.058-71.818-74.38h-879.809c-39.971 0-72.373 33.303-72.373 74.383v619.234c0 41.082 32.403 74.383 72.373 74.383h879.809zM128 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM352 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM576 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM800 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM128 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM352 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM576 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM800 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96z" />
|
||||
<glyph unicode="G" glyph-name="thumbnails" d="M239.765 896h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM584.128 896h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 0 0 0 0 0 0 17.32-14.040 31.36-31.36 31.36-0.052 0-0.105 0-0.158 0zM960 864.64c0 17.32-14.040 31.36-31.36 31.36h-144.405c-17.32 0-31.36-14.040-31.36-31.36v0-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256zM239.765 551.488h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM584.128 551.488h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM928.64 551.488h-144.405c-17.32 0-31.36-14.040-31.36-31.36v0-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM239.765 206.976h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM584.128 206.976h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM928.64 206.976h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36z" />
|
||||
<glyph unicode="H" glyph-name="refresh" d="M716.894 672.58c-1.28 1.166-2.571 2.322-3.872 3.467-69.009 60.732-161.584 87.586-253.821 71.323-165.344-29.155-275.747-186.827-246.593-352.171s186.827-275.747 352.171-246.593c77.947 13.744 145.751 56.436 191.797 118.844 26.232 35.553 76.318 43.109 111.871 16.877s43.109-76.318 16.877-111.871c-70.189-95.128-173.971-160.472-292.762-181.418-252.367-44.499-493.024 124.011-537.524 376.378s124.011 493.024 376.378 537.524c140.63 24.797 282.185-16.266 387.309-108.781 5.96-5.245 11.78-10.637 17.455-16.171l48.279 43.47c11.75 10.579 26.999 16.435 42.81 16.439 35.346 0.008 64.006-28.639 64.014-63.986l0.048-215.702c0-2.244-0.117-4.487-0.352-6.718-3.703-35.152-35.2-60.646-70.352-56.944l-214.515 22.595c-15.724 1.656-30.278 9.074-40.857 20.824-23.651 26.267-21.53 66.734 4.737 90.386l46.901 42.23z" />
|
||||
<glyph unicode="I" glyph-name="info" d="M512 960c70.667 0 137-13.333 199-40 62.667-26.667 117.166-63.166 163.5-109.5s82.833-100.833 109.5-163.5c26.667-62 40-128.333 40-199s-13.333-137-40-199c-26.667-62.667-63.166-117.166-109.5-163.5s-100.833-82.833-163.5-109.5c-62-26.667-128.333-40-199-40s-137 13.333-199 40c-62.667 26.667-117.166 63.166-163.5 109.5s-82.833 100.833-109.5 163.5c-26.667 62-40 128.333-40 199s13.333 137 40 199c26.667 62.667 63.166 117.166 109.5 163.5s100.833 82.833 163.5 109.5c62 26.667 128.333 40 199 40zM512 512c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64s64 28.654 64 64v192c0 35.346-28.654 64-64 64zM512 576c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" />
|
||||
<glyph unicode="J" glyph-name="home" d="M936.881 602.057l-412.161 319.201c-5.37 4.22-12.228 6.767-19.68 6.767s-14.31-2.547-19.748-6.819l-398.972-319.469c-7.236-5.902-11.824-14.814-11.84-24.797v-576.965c0-17.673 14.327-32 32-32h236.959c17.673 0 32 14.327 32 32v353.281h273.121v-353.281c0-17.673 14.327-32 32-32h236.959c17.673 0 32 14.327 32 32v576.962c-0.037 10.179-4.821 19.232-12.251 25.068z" />
|
||||
<glyph unicode="K" glyph-name="heart" d="M984.615 578.511c0 2.507 0 5.162 0 7.67s0 5.604 0 8.554c0 2.95 0 9.586 0 14.748 0 2.065 0 3.981 0 5.899 0 6.047-0.759 12.093-1.519 18.139 0 0.885 0 1.771 0 2.507-6.367 48.931-29.099 91.815-62.608 124.154-46.486 44.413-110.252 71.819-180.597 71.819s-134.113-27.408-180.624-71.843c-35.29-35.503-39.688-47.3-46.966-47.3s-11.978 11.354-47.458 46.452c-45.645 44.199-108.596 71.522-178.109 71.522-0.231 0-0.463 0-0.693-0.002-0.924 0.014-2.059 0.019-3.195 0.019-69.737 0-132.896-27.384-178.73-71.7-33.584-32.102-56.491-74.702-63.092-122.331-0.125-1.975-0.125-2.859-0.125-3.596 0-6.047-1.212-11.945-1.519-18.139 0-1.966 0-3.932 0-5.899 0-4.72 0-9.586 0-14.748s0-5.604 0-8.407c0-2.803 0-5.309 0-7.817 7.231-60.554 28.069-115.236 59.461-162.689l-0.933 1.507c2.121-3.244 3.639-6.636 5.913-9.88 85.517-129.476 333.726-343.153 408.175-343.153 74.599 0 322.657 214.27 408.477 343.745 2.123 3.244 3.792 6.636 5.913 9.88 30.401 46.27 51.058 101.344 57.763 160.506l0.461 0.382z" />
|
||||
<glyph unicode="L" glyph-name="lightbulb" d="M858.453 613.355c0 0.114 0 0.249 0 0.384 0 191.341-155.112 346.453-346.453 346.453s-346.453-155.112-346.453-346.453c0-103.281 45.193-196.007 116.883-259.48 16.89-14.701 27.326-35.713 27.501-59.166v-44.063c0-0.051 0-0.111 0-0.171 0-23.187 18.797-41.984 41.984-41.984 0 0 0 0 0 0h320.171c23.187 0 41.984 18.797 41.984 41.984v44.203c0.203 23.426 10.635 44.375 27.040 58.628 72.14 63.639 117.344 156.172 117.344 259.263 0 0.142 0 0.283 0 0.425zM695.978 74.389h-367.957c-9.991 0-18.091 8.099-18.091 18.091v39.424c0 9.991 8.099 18.091 18.091 18.091h367.957c9.991 0 18.091-8.099 18.091-18.091v-39.424c0-9.991-8.099-18.091-18.091-18.091zM631.125-64.192h-238.933c-9.991 0-18.091 8.099-18.091 18.091v39.253c0 9.991 8.099 18.091 18.091 18.091h238.933c9.991 0 18.091-8.099 18.091-18.091v-39.424c-0.097-9.918-8.159-17.92-18.090-17.92 0 0-0.001 0-0.001 0z" />
|
||||
<glyph unicode="M" glyph-name="help-support" d="M989.867 631.637c-7.098 18.287-24.554 31.016-44.983 31.016-6.033 0-11.807-1.11-17.128-3.137l-14.006-5.18c-44.074 84.36-111.225 151.511-193.089 194.394l2.796 15.526c1.895 4.965 2.992 10.707 2.992 16.706 0 20.352-12.633 37.754-30.485 44.791-54.809 21.677-117.927 34.179-183.964 34.179s-129.155-12.502-187.114-35.269c-14.81-5.894-27.539-23.351-27.539-43.78 0-6.033 1.11-11.807 3.137-17.128l5.18-14.006c-84.36-44.074-151.511-111.225-194.394-193.089l-15.526 2.796c-4.965 1.895-10.707 2.992-16.706 2.992-20.352 0-37.754-12.633-44.791-30.485-21.677-54.809-34.179-117.927-34.179-183.964s12.502-129.155 35.269-187.114c5.894-14.81 23.351-27.539 43.78-27.539 6.033 0 11.807 1.11 17.128 3.137l14.006 5.18c44.083-84.353 111.231-151.501 193.089-194.393l-2.795-15.527c-1.895-4.965-2.992-10.707-2.992-16.706 0-20.352 12.633-37.754 30.485-44.791 54.785-21.656 117.873-34.146 183.878-34.146s129.093 12.49 187.029 35.235c14.81 5.895 27.539 23.351 27.539 43.781 0 6.033-1.11 11.807-3.137 17.128l-5.18 14.006c84.422 44.057 151.629 111.21 194.564 193.091l15.527-2.797c4.965-1.895 10.707-2.992 16.706-2.992 20.352 0 37.754 12.633 44.791 30.485 21.656 54.785 34.146 117.873 34.146 183.878s-12.49 129.093-35.235 187.029zM305.152 365.397l-226.133-83.627c-19.522 49.344-30.84 106.508-30.84 166.315s11.318 116.97 31.93 169.465l10.174-7.246 214.869-79.531c-10.091-24.452-15.95-52.843-15.95-82.603s5.859-58.15 16.487-84.082zM512 911.872c0.020 0 0.044 0 0.068 0 59.758 0 116.869-11.337 169.297-31.979l-7.232-10.176-79.531-214.869c-24.452 10.091-52.843 15.95-82.603 15.95s-58.15-5.859-84.082-16.487l-82.147 226.67c49.292 19.553 106.403 30.891 166.161 30.891 0.024 0 0.048 0 0.072 0zM512-15.701c-0.020 0-0.044 0-0.068 0-59.758 0-116.869 11.337-169.297 31.979l86.763 225.045c24.452-10.091 52.843-15.95 82.603-15.95s58.15 5.859 84.082 16.487l82.147-226.67c-49.301-19.615-106.427-31.011-166.209-31.061zM674.133 513.195c7.926-19.144 12.529-41.376 12.529-64.683s-4.603-45.539-12.949-65.836c-1.787-4.171-3.069-10.354-3.069-16.837 0-20.603 12.946-38.182 31.147-45.047l5.793-2.158c-17.663-26.282-39.596-48.214-65.032-65.341l-2.893 4.925c-6.974 18.532-24.553 31.478-45.156 31.478-6.483 0-12.666-1.282-18.311-3.606-18.824-7.81-41.056-12.413-64.362-12.413s-45.539 4.603-65.836 12.949c-4.13 1.75-10.262 3.009-16.689 3.009-20.58 0-38.144-12.918-45.024-31.088l-2.158-5.792c-26.211 17.68-48.086 39.609-65.169 65.027l4.923 2.898c18.532 6.974 31.478 24.553 31.478 45.156 0 6.483-1.282 12.666-3.606 18.311-7.81 18.824-12.413 41.056-12.413 64.362s4.603 45.539 12.949 65.836c1.75 4.13 3.009 10.262 3.009 16.689 0 20.58-12.918 38.144-31.088 45.024l-5.792 2.158c17.637 26.198 39.509 48.070 64.864 65.171l2.891-4.926c6.974-18.532 24.553-31.478 45.156-31.478 6.483 0 12.666 1.282 18.311 3.606 18.823 7.818 41.054 12.426 64.362 12.426s45.54-4.608 65.834-12.962c4.173-1.787 10.356-3.069 16.839-3.069 20.603 0 38.182 12.946 45.047 31.147l2.158 5.793c26.269-17.621 48.198-39.496 65.343-64.868l-4.927-2.886c-18.501-6.99-31.419-24.554-31.419-45.134 0-6.426 1.26-12.559 3.545-18.163zM944.981 281.771l-11.264 4.096-214.869 79.531c10.091 24.452 15.95 52.843 15.95 82.603s-5.859 58.15-16.487 84.082l226.67 82.147c19.522-49.344 30.84-106.508 30.84-166.315s-11.318-116.97-31.93-169.465z" />
|
||||
<glyph unicode="N" glyph-name="loader" d="M512 960c-34.404 0-62.293-27.89-62.293-62.293v-151.723c0-34.404 27.89-62.293 62.293-62.293s62.293 27.89 62.293 62.293v151.723c0 34.404-27.89 62.293-62.293 62.293zM512 212.309c-34.404 0-62.293-27.89-62.293-62.293v-151.723c0-34.404 27.89-62.293 62.293-62.293s62.293 27.89 62.293 62.293v151.723c0 34.404-27.89 62.293-62.293 62.293zM722.603 596.309c0.033 0 0.071 0 0.11 0 17.165 0 32.7 6.981 43.92 18.259l107.352 107.352c11.99 11.377 19.45 27.428 19.45 45.221 0 34.404-27.89 62.293-62.293 62.293-17.793 0-33.843-7.46-45.195-19.422l-107.375-107.377c-11.263-11.271-18.229-26.838-18.229-44.032 0-34.392 27.871-62.275 62.26-62.293zM301.397 299.691c-0.033 0-0.071 0-0.11 0-17.165 0-32.7-6.981-43.92-18.259l-107.352-107.352c-11.99-11.377-19.45-27.428-19.45-45.221 0-34.404 27.89-62.293 62.293-62.293 17.793 0 33.843 7.46 45.195 19.422l107.375 107.377c11.263 11.271 18.229 26.838 18.229 44.032 0 34.392-27.871 62.275-62.26 62.293zM961.707 510.293h-151.723c-34.404 0-62.293-27.89-62.293-62.293s27.89-62.293 62.293-62.293h151.723c34.404 0 62.293 27.89 62.293 62.293s-27.89 62.293-62.293 62.293zM276.309 448c0 34.404-27.89 62.293-62.293 62.293h-151.723c-34.404 0-62.293-27.89-62.293-62.293s27.89-62.293 62.293-62.293h151.723c34.404 0 62.293 27.89 62.293 62.293zM766.635 281.429c-11.377 11.99-27.428 19.45-45.221 19.45-34.404 0-62.293-27.89-62.293-62.293 0-17.793 7.46-33.843 19.422-45.195l107.377-107.375c11.377-11.99 27.428-19.45 45.221-19.45 34.404 0 62.293 27.89 62.293 62.293 0 17.793-7.46 33.843-19.422 45.195zM238.080 809.984c-11.14 10.571-26.233 17.073-42.843 17.073-34.404 0-62.293-27.89-62.293-62.293 0-16.611 6.502-31.703 17.099-42.871l107.323-107.322c11.377-11.99 27.428-19.45 45.221-19.45 34.404 0 62.293 27.89 62.293 62.293 0 17.793-7.46 33.843-19.422 45.195z" />
|
||||
<glyph unicode="O" glyph-name="plugin-2" d="M757.93 655.274l2.731 274.603c0.001 0.101 0.002 0.221 0.002 0.341 0 16.212-13.143 29.355-29.355 29.355-0.001 0-0.001 0-0.002 0h-87.040c-16.055-0.093-29.068-12.987-29.354-28.986l-2.731-275.312h-200.021l2.731 274.432c0.003 0.152 0.004 0.332 0.004 0.512 0 16.154-13.048 29.26-29.179 29.354h-87.049c-0.001 0-0.003 0-0.004 0-16.126 0-29.233-12.929-29.521-28.986l-2.731-275.312h-76.971v-168.96c0.699-144.669 96.73-266.722 228.462-306.607l5.010-214.268c0.049-8.233 3.581-15.631 9.196-20.803 5.313-5.089 12.508-8.21 20.432-8.21 0.024 0 0.048 0 0.072 0h-0.004c29.355 0 45.568 0.853 61.781 1.536s31.573 1.365 59.904 1.536c0.001 0 0.001 0 0.002 0 16.281 0 29.501 13.101 29.694 29.336v209.597c133.939 40.538 229.895 162.573 230.57 307.121v169.039z" />
|
||||
<glyph unicode="P" glyph-name="forminator" d="M626.592 867.905h169.853c21.555 0 42.225-9.819 57.469-27.296 15.235-17.477 23.801-41.178 23.801-65.895v-745.522c0-24.715-8.565-48.414-23.801-65.895-15.243-17.474-35.913-27.297-57.469-27.297h-568.89c-21.554 0-42.224 9.823-57.465 27.297-15.241 17.481-23.805 41.179-23.805 65.895v745.522c0 24.715 8.563 48.417 23.805 65.895s35.912 27.296 57.465 27.296h169.854c8.542 26.985 24.121 50.302 44.623 66.778s44.931 25.317 69.968 25.317c25.038 0 49.467-8.84 69.966-25.317 20.503-16.477 36.082-39.793 44.626-66.778zM534.574 860.054c-6.683 5.12-14.537 7.851-22.574 7.851-10.777 0-21.112-4.91-28.733-13.648s-11.903-20.59-11.903-32.947c0-9.216 2.383-18.223 6.848-25.886s10.811-13.637 18.237-17.163c7.425-3.527 15.597-4.448 23.478-2.65s15.121 6.235 20.805 12.752c5.682 6.517 9.554 14.819 11.122 23.858s0.763 18.407-2.313 26.921c-3.072 8.514-8.283 15.792-14.967 20.912zM227.555 774.715v-745.522h568.89v745.522h-121.907v-93.19h-325.079v93.19h-121.904zM349.459 401.987h325.079c10.782 0 21.117-4.91 28.738-13.65 7.622-8.735 11.901-20.587 11.901-32.942 0-12.36-4.279-24.213-11.901-32.947-7.622-8.739-17.957-13.65-28.738-13.65h-325.079c-10.777 0-21.112 4.91-28.731 13.65-7.621 8.735-11.903 20.587-11.903 32.947 0 12.354 4.282 24.207 11.903 32.942 7.621 8.739 17.955 13.65 28.731 13.65zM674.538 541.775h-325.079c-10.777 0-21.112-4.91-28.731-13.648s-11.903-20.59-11.903-32.947c0-12.358 4.282-24.209 11.903-32.946s17.955-13.648 28.731-13.648h325.079c10.782 0 21.117 4.91 28.738 13.648s11.901 20.589 11.901 32.946c0 12.358-4.279 24.209-11.901 32.947s-17.957 13.648-28.738 13.648zM512 262.203h162.538c10.782 0 21.117-4.915 28.738-13.648 7.622-8.741 11.901-20.59 11.901-32.944 0-12.361-4.279-24.217-11.901-32.951-7.622-8.741-17.957-13.648-28.738-13.648h-162.538c-10.777 0-21.112 4.907-28.733 13.648-7.621 8.734-11.903 20.59-11.903 32.951 0 12.354 4.282 24.203 11.903 32.944 7.621 8.734 17.955 13.648 28.733 13.648z" />
|
||||
<glyph unicode="Q" glyph-name="trash" d="M864 704l-59.11-709.315c-2.764-33.171-30.493-58.685-63.779-58.685h-458.223c-33.286 0-61.015 25.514-63.779 58.685l-59.11 709.315h-32c-35.346 0-64 28.654-64 64s28.654 64 64 64h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-32zM352 960h320c17.673 0 32-14.327 32-32v-64h-384v64c0 17.673 14.327 32 32 32zM319.883 575.376c-26.445-1.849-46.384-24.786-44.535-51.231l29.019-414.987c1.849-26.445 24.786-46.384 51.231-44.535s46.384 24.786 44.535 51.231l-29.019 414.987c-1.849 26.445-24.786 46.384-51.231 44.535zM512 576c-26.51 0-48-21.49-48-48v-416c0-26.51 21.49-48 48-48s48 21.49 48 48v416c0 26.51-21.49 48-48 48zM707.598 575.376c-26.445 1.849-49.382-18.090-51.231-44.535l-29.019-414.987c-1.849-26.445 18.090-49.382 44.535-51.231s49.382 18.090 51.231 44.535l29.019 414.987c1.849 26.445-18.090 49.382-44.535 51.231z" />
|
||||
<glyph unicode="R" glyph-name="plug-connected" d="M354.645 573.269c-2.821 2.878-6.749 4.661-11.093 4.661s-8.272-1.784-11.091-4.659l-0.002-0.003-119.467-119.467c-33.906-33.962-54.873-80.85-54.873-132.635 0-40.902 13.080-78.749 35.286-109.586l-0.381 0.556-175.957-175.787c-10.657-10.657-17.249-25.38-17.249-41.643 0-32.525 26.367-58.892 58.892-58.892 16.262 0 30.985 6.592 41.643 17.249v0l175.787 176.128c30.28-21.825 68.127-34.905 109.029-34.905 51.785 0 98.673 20.967 132.637 54.876l119.465 119.465c2.836 2.84 4.59 6.762 4.59 11.093s-1.754 8.253-4.59 11.094v0zM1006.933 942.933c-10.629 10.65-25.324 17.239-41.557 17.239s-30.929-6.589-41.556-17.238l-176.129-175.958c-30.26 21.781-68.071 34.834-108.93 34.834-51.75 0-98.609-20.939-132.568-54.806l-119.463-119.463c-2.836-2.84-4.59-6.762-4.59-11.093s1.754-8.253 4.59-11.094v0l282.624-282.624c2.821-2.878 6.749-4.661 11.093-4.661s8.272 1.784 11.091 4.659l0.002 0.003 119.467 119.467c33.906 33.962 54.873 80.85 54.873 132.635 0 40.902-13.080 78.749-35.286 109.586l0.381-0.556 175.957 175.787c10.701 10.637 17.325 25.366 17.325 41.643s-6.623 31.006-17.322 41.64l-0.003 0.003z" />
|
||||
<glyph unicode="S" glyph-name="star" d="M1022.693 572.936c-3.255 9.924-12.398 16.98-23.2 17.067h-346.293l-117.931 333.312c-3.443 9.687-12.531 16.499-23.211 16.499s-19.767-6.811-23.157-16.327l-117.984-334.166h-346.283c-13.554-0.025-24.532-11.018-24.532-24.576 0-7.796 3.63-14.744 9.292-19.247l270.386-214.055-121.003-342.357c-0.92-2.477-1.453-5.339-1.453-8.325 0-13.573 11.003-24.576 24.576-24.576 4.699 0 9.091 1.319 12.824 3.607l317.333 190.403 317.44-190.293c3.626-2.227 8.017-3.546 12.717-3.546 13.573 0 24.576 11.003 24.576 24.576 0 2.986-0.533 5.848-1.508 8.495l-120.948 342.016 270.336 214.016c5.646 4.542 9.228 11.45 9.228 19.194 0 2.907-0.505 5.696-1.431 8.284z" />
|
||||
<glyph unicode="T" glyph-name="shipper-anchor" d="M358.478 960h307.167v-139.637h153.578c56.313 0 102.393-41.891 102.393-93.091v-215.040l65.529-19.549c13.305-3.723 24.569-12.102 30.713-23.273s7.168-24.203 3.072-36.306l-96.753-310.92h-2.56c-81.913 0-154.609 40.96-204.778 93.089-50.169-52.129-122.866-93.089-204.777-93.089s-154.607 40.96-204.777 93.089c-50.17-52.129-122.865-93.089-204.776-93.089h-2.56l-97.269 310.92c-4.608 12.102-3.072 25.135 3.071 36.306s17.406 19.549 30.717 23.273l66.041 19.549v215.040c0 51.2 46.074 93.091 102.387 93.091h153.583v139.637zM563.254 866.909h-102.387v-46.545h102.387v46.545zM512.059 535.971l-275.424-81.455-122.865-36.771 57.849-184.317c27.645 13.963 48.122 32.578 58.361 43.286l77.303 80.057 77.303-80.057c17.406-18.622 65.528-61.44 127.473-61.44s110.066 42.818 127.473 61.44l77.304 80.057 77.305-80.526c10.233-10.701 30.713-29.791 58.361-43.754l57.337 184.789-122.353 36.305-275.425 82.386zM204.895 542.487l307.165 91.694 307.162-91.694v184.785h-614.327v-184.785zM512.059 30.954c71.159 0 142.319 20.011 204.777 59.575 62.457-39.563 133.617-61.44 204.778-61.44h102.385v-93.089h-102.385c-70.649 0-140.273 15.829-204.778 46.080-64.505-30.251-134.641-45.151-204.777-45.151s-140.272 15.36-204.777 45.151c-64.505-29.791-134.128-46.080-204.776-46.080h-102.389v93.089h102.389c71.159 0 142.319 21.877 204.776 61.44 62.457-39.563 133.617-59.575 204.777-59.575z" />
|
||||
<glyph unicode="U" glyph-name="performance" d="M417.792 403.456c1.004 1.77 1.595 3.888 1.595 6.144 0 6.975-5.654 12.629-12.629 12.629-0.021 0-0.042 0-0.063 0h-143.698c-2.535 0.013-4.584 2.071-4.584 4.608 0 1.352 0.582 2.567 1.509 3.41l0.004 0.003 508.075 460.629c-72.482 41.722-159.387 66.332-252.040 66.332-282.77 0-512-229.23-512-512 0-168.707 81.597-318.357 207.479-411.636l1.383-0.979zM789.675 878.080l-186.88-329.045c-0.991-1.775-1.574-3.894-1.574-6.15 0-7.069 5.731-12.8 12.8-12.8 0.133 0 0.266 0.002 0.399 0.006h143.341c2.531-0.018 4.577-2.074 4.577-4.608 0-1.265-0.51-2.41-1.334-3.243v0l-527.36-503.808c80.343-54.904 179.602-87.673 286.514-87.673 282.77 0 512 229.23 512 512 0 182.975-95.982 343.532-240.344 434.070l-2.138 1.251z" />
|
||||
<glyph unicode="V" glyph-name="stopwatch" d="M1004.63 797.657l-99.726 100.512c-12.377 14.769-30.829 24.092-51.462 24.092-37.008 0-67.008-30-67.008-67.008 0-20.631 9.324-39.085 23.988-51.378l99.83-100.755c12.106-12.011 28.781-19.434 47.189-19.434s35.083 7.422 47.194 19.439c11.97 12.12 19.366 28.788 19.366 47.184s-7.396 35.066-19.377 47.196zM116.059 898.171l-100.512-99.726c-9.673-11.536-15.546-26.539-15.546-42.916 0-37.008 30-67.008 67.008-67.008 16.375 0 31.38 5.875 43.020 15.632l100.567 99.799c14.769 12.377 24.092 30.829 24.092 51.462 0 37.008-30 67.008-67.008 67.008-20.631 0-39.085-9.324-51.378-23.988zM507.886 697.775c0.094 0 0.204 0 0.316 0 165.059 0 298.863-133.806 298.863-298.863s-133.806-298.863-298.863-298.863c-165.059 0-298.863 133.806-298.863 298.863 0 82.645 33.546 157.456 87.765 211.558 53.635 53.931 127.883 87.306 209.925 87.306 0.302 0 0.602 0 0.904-0.001zM507.886 825.498c-235.095-0.207-425.595-190.836-425.595-425.96 0-235.251 190.709-425.96 425.96-425.96s425.96 190.709 425.96 425.96c0 117.871-47.878 224.562-125.246 301.684-76.901 77.071-183.215 124.748-300.664 124.748-0.145 0-0.289 0-0.436 0zM633.566 430.369v2.674c-1.409 5.069-2.804 9.151-4.394 13.131 0.304 0.867-0.64 2.599-1.427 4.171v0c-13.481 30.382-37.255 54.158-66.805 67.307l-0.834 0.332h-1.574v125.837h-99.254v-125.837h-0.943c-16.521-6.724-30.636-16.144-42.483-27.853-23.224-23.43-37.582-55.705-37.582-91.334 0-0.126 0-0.253 0.001-0.378v0.020s0 0 0-0.786c0.037-6.525 0.55-12.899 1.506-19.125l-0.092 0.721c1.638-11.347 4.497-21.575 8.493-31.212l-31.773-30.607-12.899-12.899 68.896-68.896 44.358 44.358 2.202-1.102h1.102c13.995-5.58 30.214-8.814 47.189-8.814s33.193 3.237 48.073 9.124l1.631-0.308c47.547 20.067 80.376 66.17 80.693 119.976-0.062 11.245-1.549 22.076-4.292 32.396zM542.335 365.563c-8.852-8.843-21.075-14.314-34.578-14.314-27.018 0-48.918 21.903-48.918 48.918s21.903 48.918 48.918 48.918c13.501 0 25.726-5.47 34.578-14.314 8.899-8.836 14.407-21.077 14.407-34.605s-5.508-25.769-14.404-34.603z" />
|
||||
<glyph unicode="W" glyph-name="web-globe-world" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM925.696 495.275h-125.611c-9.899 146.603-64.853 273.067-143.019 343.040 144.888-55.283 249.655-184.947 268.267-341.061zM460.8 789.333v-293.547h-141.141c11.093 146.773 73.045 256 140.629 293.547zM460.288 400.213v-293.547c-68.267 37.888-129.195 146.261-140.629 292.523zM555.861 103.595v296.107h148.309c-11.776-151.723-77.824-262.827-148.309-296.619zM555.861 495.616v297.131c70.656-34.133 136.533-145.237 148.309-297.472zM366.763 838.315c-78.165-70.656-133.12-196.267-143.019-343.040h-125.44c18.804 158.093 123.57 287.757 265.597 342.078zM98.475 399.701h125.44c10.069-146.261 64.853-271.531 142.848-341.333-144.368 55.070-248.893 183.969-268.084 339.305zM657.237 58.368c77.995 70.485 132.949 195.755 142.848 341.333h125.44c-19.395-157.364-123.919-286.263-265.426-340.372z" />
|
||||
<glyph unicode="X" glyph-name="download" d="M930.718 452.783h-212.388c-0.006 0-0.012 0-0.019 0-26.382 0-48.763-17.131-56.625-40.877-21.036-64.253-80.072-109.543-149.686-109.543s-128.649 45.29-149.248 108.012c-8.298 25.277-30.679 42.408-57.061 42.408-0.007 0-0.013 0-0.021 0h-212.387c0 0 0 0 0 0-32.935 0-59.634-26.699-59.634-59.634 0-0.056 0-0.112 0-0.168v-340.258c0-32.935 26.699-59.634 59.634-59.634h837.433c32.935 0 59.634 26.699 59.634 59.634v340.267c0 32.935-26.699 59.634-59.634 59.634zM499.404 420.893c2.927-4.074 7.652-6.697 12.989-6.697 0.030 0 0.060 0 0.091 0h-0.005c0.025 0 0.055 0 0.086 0 5.338 0 10.062 2.623 12.957 6.649l165.064 232.208c2.068 2.663 3.315 6.052 3.315 9.732 0 8.807-7.139 15.945-15.945 15.945-0.156 0-0.312-0.002-0.468-0.007l-77.629 0.001v208.243c0 8.807-7.139 15.945-15.945 15.945h-143.505c-8.807 0-15.945-7.139-15.945-15.945v-208.243h-77.971c-0.060 0.001-0.131 0.001-0.202 0.001-8.807 0-15.945-7.139-15.945-15.945 0-3.538 1.153-6.807 3.103-9.453z" />
|
||||
<glyph unicode="Y" glyph-name="blog" d="M64 896v-119.467h59.733s0 74.667 74.667 74.667v-283.733s0-14.933-29.867-14.933h-14.933v-44.8h194.133v44.8h-14.933c-29.867 0-29.867 14.933-29.867 14.933v283.733c74.667 0 74.667-74.667 74.667-74.667h59.733v119.467zM930.133 761.6h-388.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h388.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 0h-836.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h836.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 253.867h-836.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h836.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 507.733h-388.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h388.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0z" />
|
||||
<glyph unicode="Z" glyph-name="wand-magic" d="M736.179 470.143l106.335 106.335c4.546 4.541 7.359 10.818 7.359 17.751s-2.812 13.209-7.358 17.751l-88.584 88.755c-4.541 4.546-10.818 7.359-17.751 7.359s-13.209-2.812-17.751-7.358l-106.506-106.336zM558.67 541.146l-469.888-470.059c-6.84-6.803-11.073-16.22-11.073-26.626s4.233-19.824 11.071-26.624l70.834-70.834c6.822-6.799 16.233-11.002 26.626-11.002s19.805 4.203 26.627 11.003l470.058 469.887zM328.419 815.603l14.849-40.281c14.496-38.367 44.243-68.113 81.647-82.29l41.244-15.169-40.281-14.849c-38.367-14.496-68.113-44.243-82.29-81.647l-15.169-41.244-14.849 40.281c-14.424 38.305-44.040 68.034-81.309 82.287l-41.241 15.171 40.281 14.849c38.367 14.496 68.113 44.243 82.29 81.647zM629.503 960l10.241-27.479c9.878-26.261 30.235-46.617 55.839-56.278l28.137-10.458-27.479-10.241c-26.248-9.898-46.597-30.248-56.277-55.838l-10.459-27.454-10.241 27.479c-9.898 26.248-30.248 46.597-55.838 56.277l-28.138 10.459 27.479 10.241c26.261 9.878 46.617 30.235 56.278 55.839zM874.091 311.409l7.852-20.994c7.585-20.051 23.131-35.597 42.679-43.015l21.668-8.019-21.165-7.852c-20.051-7.585-35.597-23.131-43.015-42.679l-8.019-21.497-7.852 20.994c-7.585 20.051-23.131 35.597-42.679 43.015l-21.668 8.019 21.165 7.852c20.051 7.585 35.597 23.131 43.015 42.679z" />
|
||||
<glyph unicode="[" glyph-name="power-on-off" d="M916.651 761.003c-12.235 15.422-30.974 25.224-52.003 25.224-15.397 0-29.566-5.255-40.813-14.069l0.144 0.109c-15.645-12.197-25.611-31.046-25.611-52.223 0-15.306 5.207-29.396 13.945-40.596l-0.11 0.147c49.588-63.037 79.531-143.561 79.531-231.079 0-0.181 0-0.363 0-0.544v0.028c0-209.721-170.012-379.733-379.733-379.733s-379.733 170.012-379.733 379.733v0c-0.001 0.37-0.002 0.807-0.002 1.245 0 87.421 29.877 167.864 79.977 231.675l-0.615-0.813c8.478 10.994 13.589 24.965 13.589 40.129 0 21.067-9.863 39.83-25.223 51.924l-0.141 0.107c-11.057 8.587-25.133 13.767-40.419 13.767-21.171 0-40.022-9.936-52.144-25.398l-0.109-0.144c-66.83-85.078-107.179-193.714-107.179-311.774 0-0.252 0-0.504 0.001-0.756v0.040c0-282.77 229.23-512 512-512s512 229.23 512 512v0c0.002 0.53 0.003 1.158 0.003 1.785 0 117.964-40.283 226.52-107.844 312.661l0.833-1.103zM512 382.123c36.271 0.193 65.61 29.593 65.707 65.868v445.961c0 36.477-29.571 66.048-66.048 66.048s-66.048-29.571-66.048-66.048v0-445.952c0.097-36.404 29.63-65.878 66.048-65.878 0.12 0 0.24 0 0.36 0.001h-0.018z" />
|
||||
<glyph unicode="]" glyph-name="tablet-portrait" d="M847.787 959.998h-673.963c-19.099-1.203-34.134-16.988-34.134-36.284 0-0.084 0-0.168 0.001-0.251v-950.942c0-0.071-0.001-0.155-0.001-0.238 0-19.296 15.035-35.081 34.029-36.279l674.068-0.005c20.171 0 36.523 16.352 36.523 36.523v950.955c0 20.171-16.352 36.523-36.523 36.523zM510.55-33.965c-16.495 0-29.867 13.372-29.867 29.867s13.372 29.867 29.867 29.867c16.495 0 29.867-13.372 29.867-29.867s-13.372-29.867-29.867-29.867zM764.502 55.465h-505.344v785.067h505.173v-785.067z" />
|
||||
<glyph unicode="^" glyph-name="align-center" d="M110.667 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-802.667c0 0 0 0 0 0-24.113 0-43.67-19.505-43.755-43.597v-40.327c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0zM175.029 340.181v0-40.32c0-24.165 19.59-43.755 43.755-43.755h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-586.432c-24.165 0-43.755-19.59-43.755-43.755zM154.72 768.021h714.859c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755h-714.859c-0.045 0-0.097 0-0.149 0-24.165 0-43.755-19.59-43.755-43.755 0 0 0 0 0 0v0-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0.052 0 0.105 0 0.158 0zM218.784 555.819c0-24.165 19.59-43.755 43.755-43.755h498.923c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-498.773c-24.165 0-43.755-19.59-43.755-43.755v0-40.32z" />
|
||||
<glyph unicode="_" glyph-name="check-tick" d="M874.008 810.069c-92.651 92.636-220.639 149.931-362.008 149.931-282.77 0-512-229.23-512-512s229.23-512 512-512c141.37 0 269.358 57.295 362.009 149.932 92.671 92.656 149.991 220.668 149.991 362.068s-57.32 269.412-149.991 362.068zM724.675 535.125l-251.392-251.392c-10.683-10.67-25.435-17.268-41.728-17.268s-31.045 6.599-41.729 17.269l-126.805 126.805c-6.868 6.884-11.116 16.386-11.116 26.88s4.247 19.996 11.116 26.881l29.695 29.695c6.893 6.919 16.429 11.201 26.965 11.201s20.073-4.282 26.964-11.2l85.335-85.335 209.067 210.091c6.884 6.868 16.386 11.116 26.88 11.116s19.996-4.247 26.881-11.116l29.695-29.695c6.868-6.884 11.116-16.386 11.116-26.88s-4.247-19.996-11.116-26.881z" />
|
||||
<glyph unicode="`" glyph-name="list" d="M128 544h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM128 864h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM128 224h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="a" glyph-name="zip" d="M755.131 601.565l-230.261 76.87v102.435l230.261-76.87v-102.435zM755.131 447.999l-230.261 76.87v102.261l230.261-76.696v-102.435zM755.131 294.433l-230.261 76.696v102.435l230.261-76.696v-102.435zM755.131 755.129l-230.261 76.87v102.435l230.261-76.87v-102.435zM192.001 473.564v281.565c0 42.453 34.415 76.87 76.87 76.87h588.696c0 70.693-57.308 128-128 128v0h-537.566c-70.653-0.099-127.902-57.348-128-127.99v-434.792c0-0.103 0-0.225 0-0.347 0-70.693 57.308-128 128-128 0 0 0 0 0 0h537.566c0.052 0 0.113 0 0.174 0 70.597 0 127.826 57.229 127.826 127.826 0 0.061 0 0.122 0 0.183v-0.009h-588.696c-0.052 0-0.113 0-0.174 0-42.358 0-76.696 34.338-76.696 76.696 0 0 0 0 0 0v0zM524.87 217.564h230.261v-203.304c0-43.222-35.039-78.261-78.261-78.261v0h-73.739c-43.222 0-78.261 35.039-78.261 78.261v0 203.304zM473.74 63.999c0-42.453-34.415-76.87-76.87-76.87s-76.87 34.415-76.87 76.87c0 42.453 34.415 76.87 76.87 76.87s76.87-34.415 76.87-76.87zM960.001 63.999c0-42.453-34.415-76.87-76.87-76.87s-76.87 34.415-76.87 76.87c0 42.453 34.415 76.87 76.87 76.87s76.87-34.415 76.87-76.87zM448 89.564h384v-51.13h-384v51.13z" />
|
||||
<glyph unicode="b" glyph-name="archive" d="M96 640h832c17.673 0 32-14.327 32-32v-544c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v544c0 17.673 14.327 32 32 32zM96 896h832c35.346 0 64-28.654 64-64v-96c0-17.673-14.327-32-32-32h-896c-17.673 0-32 14.327-32 32v96c0 35.346 28.654 64 64 64zM384 512c-35.346 0-64-28.654-64-64s28.654-64 64-64h256c35.346 0 64 28.654 64 64s-28.654 64-64 64h-256z" />
|
||||
<glyph unicode="c" glyph-name="inlinecss" d="M128 896h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 128h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="d" glyph-name="social-dropbox" d="M301.227 888.491l-301.227-196.779 208.213-166.741 303.787 187.563-210.773 175.957zM0 358.229v0l301.227-196.779 210.773 175.957-303.787 187.563-208.213-166.741zM512 337.408l210.773-175.957 301.227 196.779-208.213 166.741-303.787-187.563zM722.773 888.491l-210.773-175.957 303.787-187.563 208.213 166.741-301.227 196.779zM301.227 124.245l-90.453 59.051v-66.219l301.909-181.077 301.739 181.077v66.219l-90.453-59.051-211.285 175.275-211.456-175.275z" />
|
||||
<glyph unicode="e" glyph-name="eye" d="M512 223.915c123.759 0 224.085 100.326 224.085 224.085s-100.326 224.085-224.085 224.085c-123.759 0-224.085-100.326-224.085-224.085s100.326-224.085 224.085-224.085zM0 448s136.533 352.085 512 352.085 512-352.085 512-352.085-136.533-352.085-512-352.085-512 352.085-512 352.085zM512 352.085c52.972 0 95.915 42.942 95.915 95.915s-42.942 95.915-95.915 95.915c-52.972 0-95.915-42.942-95.915-95.915s42.942-95.915 95.915-95.915z" />
|
||||
<glyph unicode="f" glyph-name="social-facebook" d="M374.272-64v512h-109.739v176.469h109.739v105.984c0 144.213 62.123 229.547 238.080 229.547h147.115v-176.469h-91.989c-68.267 0-73.216-24.747-73.216-70.656v-88.235h165.205l-18.773-176.64h-146.603v-512z" />
|
||||
<glyph unicode="g" glyph-name="social-google-plus" d="M0.859 463.671c-10.682-134.785 79.418-267.513 206.439-314.614s288.992-15.32 369.92 96.716c53.411 70.766 64.905 161.88 58.635 247.392-103.683 0.229-207.136 0.229-310.705 0.229 0-36.354 0-72.709 0-109.177 61.885-1.943 124.003-1.029 185.772-1.943-27.285-135.243-214.219-179.143-313.491-90.772-100.897 77.625-96.137 247.621 9.637 319.528 73.845 58.076 178.923 43.67 252.883-6.516 28.893 26.616 55.809 54.024 81.285 82.701-60.385 49.568-135.854 83.978-216.085 80.549-167.427 5.258-321.386-139.244-324.289-304.096l-0.001 0.003zM837.879 584.853c0-30.409-0.581-60.82-0.812-91.456l-92.885-0.572v-91.456l92.885-0.915c0-30.41 0-60.819 0.581-91.458h92.885c0 30.41 0 60.819 0.581 91.458l92.885 0.801v92.144l-92.885 0.572c0 30.409 0 60.933-0.581 91.456l-92.654-0.573z" />
|
||||
<glyph unicode="h" glyph-name="social-github" d="M512 934.741c-0.11 0-0.241 0-0.371 0-282.77 0-512-229.23-512-512 0-225.030 145.173-416.153 346.974-484.823 29.205-5.844 37.739 10.028 37.739 23.51s0 44.373 0 87.040c-142.507-30.891-172.544 68.267-172.544 68.267-23.211 59.733-56.661 75.264-56.661 75.264-46.421 31.744 3.584 31.061 3.584 31.061 33.642-4.794 61.856-24.567 78.061-52.229 46.013-78.673 119.741-56.145 149.267-43.003 2.518 26.917 14.443 50.654 32.408 68.248-113.645 12.989-233.112 57.192-233.112 253.458-0.013 0.842-0.020 1.835-0.020 2.83 0 52.018 20.062 99.35 52.871 134.681-6.822 18.19-10.702 39.335-10.702 61.387 0 26.775 5.72 52.215 16.004 75.163s42.541 12.658 140.333-53.731c38.377 10.941 82.454 17.232 128 17.232s89.623-6.291 131.409-18.052c94.383 67.038 137.221 53.385 137.221 53.385 9.885-21.837 15.644-47.349 15.644-74.205 0-21.975-3.856-43.050-10.929-62.584 32.998-33.856 52.995-81.074 52.995-132.964 0-1.105-0.009-2.208-0.027-3.309 0.002-196.442-119.465-239.791-233.811-252.421 18.432-15.872 34.133-47.104 34.133-94.891 0-68.267 0-123.563 0-140.459 0-13.653 9.216-29.696 35.157-24.576 205.138 69.887 350.066 260.877 350.066 485.717 0 282.66-229.052 511.822-511.67 512z" />
|
||||
<glyph unicode="i" glyph-name="social-linkedin" d="M264.704 0.001h-185.621v598.528h185.621zM171.82 680.364c-0.045 0-0.097 0-0.149 0-59.547 0-107.819 48.272-107.819 107.819s48.272 107.819 107.819 107.819c59.547 0 107.819-48.272 107.819-107.819 0-0.045 0-0.097 0-0.149 0-59.465-48.206-107.669-107.669-107.669zM960.149 0.001h-185.472v291.051c0 69.44-1.344 158.741-96.469 158.741s-111.403-75.563-111.403-153.664v-296.128h-185.621v598.528h178.155v-81.835h2.539c24.939 47.040 84.672 96.768 175.616 96.768 188.011 0 222.656-123.947 222.656-284.928v-328.533z" />
|
||||
<glyph unicode="j" glyph-name="like" d="M66.821 114.541c-0.050 0.711-0.079 1.54-0.079 2.375s0.029 1.664 0.086 2.486l-0.007 368.828c0 19.18 15.548 34.728 34.728 34.728h68.118c18.63-0.575 33.532-15.737 33.688-34.415v-376.966c-1.836-17.264-16.143-30.648-33.651-31.017l-0.036-0.001h-68.118c-0.003 0-0.006 0-0.007 0-18.918 0-34.303 15.127-34.718 33.946zM272.364 56.662v500.131c0 19.18 15.548 34.728 34.728 34.728h138.018c2.18 3.226 4.679 6.007 7.51 8.41l135.406 234.531c13.649 24.095 39.075 40.115 68.252 40.219 43.398-0.502 78.374-35.789 78.374-79.244 0-0.158-0.001-0.316-0.002-0.474l0.741 0.024v-203.466h188.031c18.793-0.498 33.836-15.849 33.836-34.715 0-0.005 0-0.007 0-0.012v0.001-385.857c-0.020-4.751-1.943-9.047-5.047-12.17l-133.565-133.565c-2.904-2.418-6.674-3.885-10.786-3.885-0.855 0-1.694 0.063-2.514 0.185l-498.256-0.011c-0.011 0-0.025 0-0.038 0-18.523 0-33.645 14.565-34.537 32.866l-0.004 0.080v1.039s0 0 0 0 0 0 0 0zM916.448 169.748v0 0z" />
|
||||
<glyph unicode="k" glyph-name="dislike" d="M957.15 638.747v0c-0.020 4.749-1.943 9.046-5.046 12.168l-133.543 133.543c-2.922 2.413-6.705 3.876-10.829 3.876-0.839 0-1.663-0.060-2.47-0.178l-497.289 0.011c-0.011 0-0.025 0-0.038 0-18.519 0-33.639-14.563-34.531-32.861l-0.004-0.080v-1.187s0 0 0 0 0 0 0 0v-500.497c-0.007-0.265-0.011-0.578-0.011-0.89 0-19.129 15.468-34.644 34.578-34.722h137.707c2.083-3.341 4.489-6.219 7.238-8.726l1.516-2.551v-1.485h0.89l133.544-230.142c13.782-23.498 38.917-39.026 67.678-39.026 0.1 0 0.197 0 0.296 0.001 43.409 0.335 78.482 35.615 78.482 79.087 0 0.209-0.001 0.42-0.003 0.628l0.742-0.033v203.137h187.259c18.789 0.498 33.832 15.847 33.832 34.711 0 0.005 0 0.007 0 0.012v-0.001 385.795zM202.917 692.758v0c-0.251 18.984-15.699 34.276-34.719 34.276-0.001 0-0.002 0-0.003 0h-67.514c-18.672-0.413-33.67-15.566-33.832-34.26v-376.761c1.7-17.439 16.134-30.998 33.8-31.308h67.991c0 0 0.001 0 0.001 0 19.072 0 34.553 15.376 34.72 34.408 0.054 0.726 0.085 1.554 0.085 2.391s-0.031 1.664-0.090 2.484z" />
|
||||
<glyph unicode="l" glyph-name="cloud-migration" d="M4.084 320h379.916v128h-365.939c35.286 82.255 118.578 141.042 216.896 145.083 13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 204.508-156.092 18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-119.608 0-223.556 83.058-245.090 192zM384 528.297v-288.594c0-35.346 28.654-64 64-64 15.811 0 31.062 5.852 42.814 16.429l160.33 144.297c26.273 23.645 28.402 64.112 4.757 90.385-1.501 1.668-3.089 3.256-4.757 4.757l-160.33 144.297c-26.273 23.645-66.739 21.516-90.385-4.757-10.577-11.752-16.429-27.003-16.429-42.814z" />
|
||||
<glyph unicode="m" glyph-name="mail" d="M0 576l512-192 512 192v-384c0-70.692-57.308-128-128-128h-768c-70.692 0-128 57.308-128 128v384zM128 832h768c70.692 0 128-57.308 128-128v-32l-512-192-512 192v32c0 70.692 57.308 128 128 128z" />
|
||||
<glyph unicode="n" glyph-name="open-new-window" d="M840.532 896h-238.933v-119.467h154.411l-468.011-467.563c-0.527-0.539-0.854-1.277-0.854-2.091s0.326-1.552 0.854-2.092l80.788-80.788c0.539-0.527 1.277-0.854 2.091-0.854s1.552 0.326 2.092 0.854l467.562 468.010v-154.411h119.467v358.4zM840.532 149.333c0-16.495-13.372-29.867-29.867-29.867v0h-597.333c-16.495 0-29.867 13.372-29.867 29.867v0 597.333c0 16.495 13.372 29.867 29.867 29.867v0h194.133v119.467h-224c-65.979 0-119.467-53.487-119.467-119.467v0-657.067c0-65.979 53.487-119.467 119.467-119.467v0h657.067c65.979 0 119.467 53.487 119.467 119.467v0 224h-119.467z" />
|
||||
<glyph unicode="o" glyph-name="combine" d="M725.143 384.331h-256.115l-359.096-359.096c-24.83-24.83-65.088-24.83-89.918 0l-0.124 0.124c-24.83 24.83-24.83 65.088 0 89.918l332.723 332.723-332.723 332.723c-24.83 24.83-24.83 65.088 0 89.918l0.124 0.124c24.83 24.83 65.088 24.83 89.918 0l359.096-359.096h256.115v131.106c0 17.557 14.233 31.791 31.791 31.791 7.373 0 14.516-2.562 20.208-7.25l236.543-194.776c13.554-11.161 15.494-31.196 4.333-44.75-1.302-1.581-2.753-3.032-4.333-4.333l-236.543-194.776c-13.554-11.161-33.589-9.22-44.75 4.333-4.686 5.692-7.25 12.835-7.25 20.208v131.108z" />
|
||||
<glyph unicode="p" glyph-name="defer" d="M214.488 616.412h-122.529c-6.398 0-12.602 2.194-17.578 6.217-12.007 9.708-13.871 27.311-4.164 39.319l178.422 220.684c1.237 1.531 2.633 2.926 4.164 4.164 12.007 9.708 29.611 7.844 39.319-4.164l178.422-220.684c4.022-4.975 6.217-11.18 6.217-17.578 0-15.441-12.517-27.958-27.958-27.958h-122.482v-559.177c0-30.882-25.034-55.916-55.916-55.916s-55.916 25.034-55.916 55.916v559.177zM773.649 280.907h122.482c15.441 0 27.958-12.517 27.958-27.958 0-6.398-2.194-12.602-6.217-17.578l-178.422-220.684c-9.708-12.007-27.311-13.871-39.319-4.164-1.531 1.237-2.926 2.633-4.164 4.164l-178.422 220.684c-9.708 12.007-7.844 29.611 4.164 39.319 4.975 4.022 11.18 6.217 17.578 6.217h122.529v559.177c0 30.882 25.035 55.916 55.916 55.916s55.916-25.034 55.916-55.916v-559.177z" />
|
||||
<glyph unicode="q" glyph-name="eye-hide" d="M201.216 838.997c-2.596 2.605-6.187 4.217-10.155 4.217s-7.559-1.612-10.154-4.216l-61.44-60.928c-2.605-2.596-4.217-6.187-4.217-10.155s1.612-7.559 4.216-10.154l701.27-700.758c2.596-2.605 6.187-4.217 10.155-4.217s7.559 1.612 10.154 4.216l60.928 60.928c2.605 2.596 4.217 6.187 4.217 10.155s-1.612 7.559-4.216 10.154zM665.6 456.533c-4.372 78.297-66.77 140.695-144.666 145.049zM358.4 437.419c5.285-76.768 66.251-137.734 142.541-142.992zM512 671.915c0.243 0.001 0.531 0.002 0.818 0.002 123.288 0 223.232-99.944 223.232-223.232 0-19.895-2.603-39.181-7.486-57.539l150.881-148.97c60.159 57.039 108.919 125.422 142.957 201.809s-134.935 356.101-510.402 356.101c-0.695 0.003-1.517 0.005-2.339 0.005-58.177 0-114.196-9.241-166.669-26.335l113.712-108.838c16.592 4.431 35.643 6.983 55.287 6.997zM512 223.915c-0.228-0.001-0.498-0.001-0.768-0.001-123.288 0-223.232 99.944-223.232 223.232 0 19.337 2.459 38.1 7.081 55.993l-151.38 149.661c-59.739-56.808-108.2-124.836-142.102-200.79s134.934-355.925 510.401-355.925c0.727-0.004 1.587-0.006 2.447-0.006 57.572 0 113.029 9.053 165.026 25.812l-113.884 109.020c-16.056-4.238-34.509-6.722-53.525-6.826z" />
|
||||
<glyph unicode="r" glyph-name="reply" d="M1018.197 2.048c-94.208 337.749-356.693 426.667-516.779 448.683l-84.309 11.605v-223.573l-417.109 327.509 417.109 327.339v-175.957l62.293-10.069c203.264-33.28 352.939-115.2 442.197-243.883 82.773-119.467 115.712-279.723 96.256-461.653z" />
|
||||
<glyph unicode="s" glyph-name="share" d="M801.445 594.226c-18.787-0.030-36.732-3.598-53.217-10.072l-378.911 219.821c0 3.243 0 6.485 0 9.728-0.286 80.75-65.812 146.1-146.602 146.1-80.966 0-146.603-65.636-146.603-146.603s65.636-146.603 146.603-146.603c32.171 0 61.921 10.362 86.096 27.931l352.858-203.215c-4.21-13.064-6.637-28.094-6.637-43.691s2.427-30.627 6.924-44.733l-352.543-202.393c-23.762 17.425-53.583 27.883-85.845 27.883-80.684 0-146.091-65.407-146.091-146.091s65.407-146.091 146.091-146.091c80.684 0 146.091 65.407 146.091 146.091 0 0.037 0 0.075 0 0.112 0 3.066 0 5.968 0 8.869l380.416 220.16c15.309-5.943 33.028-9.386 51.552-9.386 80.778 0 146.261 65.483 146.261 146.261s-65.483 146.261-146.261 146.261c-0.124 0-0.247 0-0.371 0z" />
|
||||
<glyph unicode="t" glyph-name="social-twitter" d="M778.4 864h141.2l-308.4-352.4 362.8-479.6h-284l-222.6 290.8-254.4-290.8h-141.4l329.8 377-347.8 455h291.2l201-265.8 232.6 265.8zM728.8 116.4h78.2l-504.8 667.6h-84l510.6-667.6z" />
|
||||
<glyph unicode="u" glyph-name="movefooter" d="M128 896h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 384h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="v" glyph-name="social-drive" d="M383.488 316.075l-177.664-305.323h640.512l177.664 305.323h-640.512zM329.216 889.344l320.341-554.667 353.28-1.024-320.171 554.667-353.451 1.024zM0 313.173l175.787-306.517 320.171 554.667-175.616 306.517-320.341-554.667z" />
|
||||
<glyph unicode="w" glyph-name="wordpress" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM255.147 644.608c25.259 1.365 47.957 4.096 47.957 4.096 8.85 0.729 15.756 8.091 15.756 17.067 0 9.456-7.665 17.121-17.121 17.121-0.481 0-0.956-0.020-1.427-0.059s-68.205-5.287-111.725-5.287c-7.851 0-17.067 0-26.965 0 76.052 114.526 204.485 188.994 350.311 188.994 109.329 0 208.881-41.857 283.507-110.42l-5.764 0.274c-39.179-1.128-70.51-33.157-70.51-72.505 0-0.67 0.009-1.338 0.027-2.004-0.002-34.035 19.966-63.731 41.129-98.206 21.048-32.798 33.711-72.734 34.132-115.6 0.001-35.952-13.823-77.595-31.914-135.622l-41.813-139.776-150.869 451.925c25.259 1.365 47.957 4.096 47.957 4.096 8.85 0.729 15.756 8.091 15.756 17.067 0 9.456-7.665 17.121-17.121 17.121-0.481 0-0.956-0.020-1.427-0.059s-68.205-5.287-111.725-5.287c-41.131 0-110.421 5.291-110.421 5.291-0.409 0.035-0.885 0.055-1.365 0.055-9.456 0-17.121-7.665-17.121-17.121 0-8.975 6.906-16.337 15.694-17.063s21.395-2.564 44.094-4.1l65.365-179.541-91.819-274.603zM329.045 70.656c-141.030 69.533-236.344 212.284-236.344 377.297 0 61.818 13.377 120.511 37.393 173.343zM519.339 411.989l129.195-353.792c0.957-2.241 1.985-4.148 3.161-5.948-41.53-14.922-89.365-23.635-139.236-23.635-42.262 0-83.063 6.257-121.527 17.896zM722.773 85.675l128 370.347c19.469 44.241 31.134 95.751 31.911 149.895 0.003 0.411 0.004 0.553 0.004 0.694 0 15.086-1.055 29.926-3.094 44.45 32.457-59.671 51.452-128.883 51.452-202.531 0-153.868-82.908-288.372-206.488-361.276z" />
|
||||
<glyph unicode="x" glyph-name="widget-settings-config" d="M938.501 520.575l-113.642 11.2c-8.043 29.678-19.119 55.638-33.222 79.602l73.392 86.905c3.332 4.076 5.35 9.336 5.35 15.068 0 6.596-2.672 12.567-6.993 16.889l-69.143 69.143c-4.324 4.321-10.294 6.993-16.889 6.993-5.733 0-10.994-2.020-15.111-5.385l-88.363-72.543c-22.463 13.288-48.424 24.362-75.854 31.88l-13.449 114.168c-1.253 12.117-11.401 21.488-23.742 21.504h-97.666c-12.343-0.016-22.489-9.387-23.735-21.401l-11.209-113.894c-29.677-8.033-55.636-19.107-79.596-33.22l-86.911 73.39c-4.076 3.332-9.336 5.35-15.068 5.35-6.596 0-12.567-2.672-16.889-6.993l-68.992-68.992c-4.321-4.324-6.993-10.295-6.993-16.889 0-5.731 2.020-10.994 5.385-15.111l72.541-88.363c-13.295-22.465-24.369-48.426-31.882-75.857l-114.316-13.442c-12.117-1.253-21.488-11.403-21.504-23.742v-97.666c0.016-12.343 9.387-22.489 21.401-23.735l113.894-11.209c8.029-29.675 19.103-55.638 33.219-79.594l-73.39-86.912c-3.402-4.081-5.471-9.378-5.471-15.16 0-6.561 2.66-12.5 6.962-16.798l68.992-68.992c4.324-4.321 10.294-6.993 16.889-6.993 5.731 0 10.994 2.020 15.111 5.385l88.363 72.541c22.461-13.325 48.417-24.446 75.844-32.022l13.458-114.175c1.255-12.128 11.419-21.504 23.774-21.504 0.042 0 0.084 0 0.126 0h97.659c12.343 0.016 22.489 9.387 23.735 21.401l11.209 113.745c29.678 8.082 55.638 19.205 79.587 33.367l86.921-73.388c4.076-3.332 9.335-5.35 15.068-5.35 6.596 0 12.567 2.672 16.889 6.993l68.992 68.992c4.302 4.298 6.962 10.236 6.962 16.798 0 5.78-2.065 11.081-5.5 15.199l-72.545 88.366c13.284 22.463 24.358 48.424 31.88 75.852l114.169 13.449c12.247 1.108 21.772 11.309 21.803 23.741v97.668c-0.016 12.343-9.387 22.489-21.401 23.735l-0.098 0.007zM512.004 315.839c-72.991 0-132.161 59.171-132.161 132.16s59.169 132.16 132.161 132.16c72.991 0 132.161-59.169 132.161-132.16s-59.171-132.16-132.161-132.16z" />
|
||||
<glyph unicode="y" glyph-name="social-youtube" d="M1014.113 648.12c0 0-9.729 68.939-41.116 99.375-26.137 25.868-62.396 42.035-102.554 42.459-143.364 10.046-358.365 10.046-358.365 10.046s-215 0-358.439-10.044c-40.234-0.442-76.491-16.603-102.611-42.436-31.41-30.459-40.669-99.4-40.669-99.4-6.069-48.054-9.817-104.254-10.352-161.198l-0.006-76.817c0.482-57.604 4.175-113.815 10.915-169.122s9.33-61.741 39.932-92.177c38.92-39.873 90.080-38.655 112.993-42.762 81.92-7.61 348.239-10.044 348.239-10.044s215.158 0 358.595 10.501c40.103 0.467 76.235 16.564 102.301 42.286 31.408 30.457 40.824 99.396 40.824 99.396 6.032 48.161 9.725 104.427 10.196 161.437l0.006 76.731c-0.476 57.648-4.169 113.913-10.915 169.273l1.028-7.505zM405.206 309.206v281.997l272.125-138.183-272.125-143.814z" />
|
||||
<glyph unicode="z" glyph-name="filter" d="M986.647 776.462c-0.058 41.498-32.921 75.301-74.044 76.87l-797.997 0.005c-0.067 0-0.145 0-0.225 0-42.544 0-77.032-34.489-77.032-77.032 0-24.244 11.2-45.872 28.708-59.994l357.79-358.074v-221.45c0.616-14.21 8.524-26.445 20.054-33.115l0.194-0.103 95.855-55.362c5.842-3.483 12.883-5.541 20.405-5.541 22.276 0 40.336 18.059 40.336 40.336 0 0.058 0 0.115 0 0.173 0 1.098 0 2.047 0 3.155v0 271.91l361.281 361.124c15.197 14.060 24.68 34.107 24.68 56.37 0 0.258-0.001 0.514-0.004 0.772zM301.573 699.271v0z" />
|
||||
<glyph unicode="{" glyph-name="arrow-skip-back" d="M497.129 99.768c-4.641-4.289-10.005-7.889-15.872-10.582l-0.379-0.155c-5.848-2.66-12.683-4.209-19.878-4.209s-14.031 1.549-20.186 4.334l0.309-0.125c-6.287 2.892-11.694 6.487-16.451 10.788l0.056-0.051-311.959 312.104c-4.671 4.572-8.409 10.079-10.912 16.22l-0.116 0.322c-2.207 5.658-3.485 12.206-3.485 19.054 0 0.187 0.001 0.376 0.003 0.562v-0.028c0 0.078-0.001 0.17-0.001 0.262 0 7.178 1.44 14.021 4.046 20.253l-0.129-0.346c2.4 6.77 6.009 12.577 10.613 17.434l-0.020-0.022 312.685 310.653c9.35 9.237 22.207 14.942 36.397 14.942 7.126 0 13.917-1.439 20.095-4.043l-0.341 0.128c6.333-2.695 11.732-6.42 16.244-11.019l0.007-0.007 35.694-36.564c9.237-9.35 14.942-22.207 14.942-36.397 0-7.126-1.439-13.917-4.043-20.095l0.128 0.341c-2.695-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-237.234-239.265 237.234-238.54c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.323c2.479-5.769 3.919-12.482 3.919-19.533 0-0.121-0.001-0.244-0.002-0.364v0.018c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.401l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-35.694-37.289zM873.512 99.768c-4.704-4.25-10.109-7.845-15.999-10.572l-0.397-0.165c-5.77-2.659-12.518-4.208-19.629-4.208-0.087 0-0.176 0-0.263 0.001h0.014c-0.047 0-0.102 0-0.156 0-7.143 0-13.923 1.549-20.025 4.331l0.302-0.123c-6.224 2.933-11.578 6.522-16.309 10.788l0.059-0.051-311.089 312.104c-4.671 4.572-8.409 10.079-10.912 16.22l-0.116 0.322c-2.479 5.965-3.918 12.896-3.918 20.161 0 0.053 0 0.108 0 0.162v-0.008c0 0.078-0.001 0.17-0.001 0.262 0 7.178 1.44 14.021 4.046 20.253l-0.129-0.346c2.617 6.512 6.355 12.067 11.023 16.681l0.005 0.005 311.815 310.653c4.54 4.573 9.933 8.291 15.92 10.9l0.331 0.129c5.488 2.22 11.854 3.509 18.522 3.509 0.579 0 1.155-0.009 1.731-0.028l-0.084 0.003c0.233 0.005 0.509 0.006 0.786 0.006 13.826 0 26.358-5.541 35.495-14.522l-0.007 0.006 36.275-36.564c9.237-9.35 14.942-22.207 14.942-36.397 0-7.126-1.439-13.917-4.043-20.095l0.128 0.341c-2.695-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-238.25-239.265 238.25-238.54c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.323c2.216-5.484 3.501-11.843 3.501-18.502 0-0.483-0.006-0.967-0.020-1.447l0.002 0.071c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.401l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-36.13-37.289z" />
|
||||
<glyph unicode="|" glyph-name="flag" d="M910.404 754.49c-0.036 0-0.077 0-0.118 0-2.422 0-4.731-0.494-6.837-1.39l0.119 0.044c-37.374-20.496-81.739-32.542-128.846-32.556-0.155 0-0.334-0.002-0.511-0.002-85.841 0-162.626 39.821-213.792 102.454-46.563 45.349-109.104 72.959-177.923 72.959-66.249 0-126.68-25.587-172.432-67.66-9.486 21.49-30.172 35.949-54.147 35.949-33.091 0-59.916-27.549-59.916-61.529 0-0.222 0.002-0.445 0.003-0.665v-740.415c0-34.065 26.89-61.68 60.061-61.68s60.061 27.615 60.061 61.68v333.487c36.633 19.388 79.944 30.753 125.841 30.753 85.965 0 162.863-39.873 214.109-102.593 46.514-45.22 108.949-72.744 177.645-72.744 74.257 0 141.198 32.162 188.336 83.661 3.695 3.474 5.927 8.257 5.943 13.578v388.298c0 0.002 0 0.002 0 0.002 0 10.040-7.845 18.198-17.583 18.368h-0.014z" />
|
||||
<glyph unicode="}" glyph-name="arrow-skip-forward" d="M526.871 99.768c4.641-4.289 10.005-7.889 15.872-10.582l0.379-0.155c5.848-2.66 12.683-4.209 19.878-4.209s14.031 1.549 20.186 4.334l-0.309-0.125c6.287 2.892 11.694 6.487 16.451 10.788l-0.056-0.051 311.959 312.104c4.671 4.572 8.409 10.079 10.912 16.22l0.116 0.322c2.207 5.658 3.485 12.206 3.485 19.054 0 0.187-0.001 0.376-0.003 0.562v-0.028c0 0.078 0.001 0.17 0.001 0.262 0 7.178-1.44 14.021-4.046 20.253l0.129-0.346c-2.4 6.77-6.009 12.577-10.613 17.434l0.020-0.022-312.685 310.653c-9.35 9.237-22.207 14.942-36.397 14.942-7.126 0-13.917-1.439-20.095-4.043l0.341 0.128c-6.333-2.695-11.732-6.42-16.244-11.019l-0.007-0.007-35.694-36.564c-9.237-9.35-14.942-22.207-14.942-36.397 0-7.126 1.439-13.917 4.043-20.095l-0.128 0.341c2.695-6.333 6.42-11.732 11.019-16.244l0.007-0.007 237.234-239.265-237.234-238.54c-4.607-4.519-8.332-9.917-10.904-15.928l-0.123-0.323c-2.479-5.769-3.919-12.482-3.919-19.533 0-0.121 0.001-0.244 0.002-0.364v0.018c0-0.079-0.001-0.172-0.001-0.266 0-7.227 1.439-14.118 4.047-20.401l-0.131 0.353c2.552-6.29 6.299-11.62 10.995-15.931l0.031-0.028 35.694-37.289zM150.488 99.768c4.704-4.25 10.109-7.845 15.999-10.572l0.397-0.165c5.509-2.395 11.923-3.787 18.665-3.787 0.426 0 0.852 0.006 1.276 0.017l-0.062-0.002c0.047 0 0.102 0 0.156 0 7.143 0 13.923 1.549 20.025 4.331l-0.302-0.123c6.219 2.8 11.574 6.251 16.334 10.372l-0.083-0.070 311.089 312.104c4.671 4.572 8.409 10.079 10.912 16.22l0.116 0.322c2.479 5.965 3.918 12.896 3.918 20.161 0 0.053 0 0.108 0 0.162v-0.008c0 0.078 0.001 0.17 0.001 0.262 0 7.178-1.44 14.021-4.046 20.253l0.129-0.346c-2.617 6.512-6.355 12.067-11.023 16.681l-0.005 0.005-311.815 310.653c-4.54 4.573-9.933 8.291-15.92 10.9l-0.331 0.129c-5.488 2.22-11.854 3.509-18.522 3.509-0.579 0-1.155-0.009-1.731-0.028l0.084 0.003c-0.233 0.005-0.509 0.006-0.786 0.006-13.826 0-26.358-5.541-35.495-14.522l0.007 0.006-36.275-36.564c-9.237-9.35-14.942-22.207-14.942-36.397 0-7.126 1.439-13.917 4.043-20.095l-0.128 0.341c2.695-6.333 6.42-11.732 11.019-16.244l0.007-0.007 238.25-239.265-238.25-238.54c-4.607-4.519-8.332-9.917-10.904-15.928l-0.123-0.323c-2.216-5.484-3.501-11.843-3.501-18.502 0-0.483 0.006-0.967 0.020-1.447l-0.002 0.071c0-0.079-0.001-0.172-0.001-0.266 0-7.227 1.439-14.118 4.047-20.401l-0.131 0.353c2.426-6.264 6.031-11.593 10.576-15.946l0.017-0.016 36.564-37.289z" />
|
||||
<glyph unicode="~" glyph-name="brush" d="M160.069 366.080c-0.042-1.090-0.069-2.366-0.069-3.65 0-54.576 44.719-98.816 99.886-98.816 1.298 0 2.592 0.024 3.876 0.072l82.621-0.006c0.954 0.054 2.068 0.086 3.192 0.086 32.585 0 59-26.132 59-58.368 0-1.11-0.032-2.214-0.093-3.31l0.008-219.496c0.099-25.692 21.124-46.496 47.086-46.592h112.661c25.97 0.096 47 20.9 47.097 46.582v219.486c-0.061 0.998-0.097 2.164-0.097 3.338 0 32.236 26.415 58.368 59 58.368 1.187 0 2.367-0.034 3.536-0.102l82.645 0.008c1.154-0.048 2.509-0.074 3.869-0.074 55.070 0 99.712 44.164 99.712 98.644 0 1.346-0.028 2.688-0.081 4.020l0.006 102.21h-703.861l0.004-102.4zM420.565 960l-74.183-73.388-74.183 73.388h-112.135v-450.56h703.861v450.56h-443.36z" />
|
||||
<glyph unicode="¡" glyph-name="graph-line" d="M0 60.27v30.507c0 18.872 8.329 36.782 22.761 48.942l277.261 233.626c54.49 45.914 129.926 57.876 195.947 31.070l54.621-22.177c74.466-30.235 159.884-10.889 214.057 48.479l203.715 223.251c11.913 13.055 32.153 13.981 45.208 2.068 6.645-6.063 10.43-14.643 10.43-23.638v-504.398c0-70.692-57.308-128-128-128h-835.73c-33.286 0-60.27 26.984-60.27 60.27zM322.145 508.556l-218.165-174.532c-27.601-22.081-67.875-17.606-89.956 9.995s-17.606 67.875 9.995 89.956l261.785 209.428c58.993 47.194 140.179 55.407 207.428 20.983l74.82-38.3c25.85-13.232 57.37-7.401 76.775 14.203l263.093 292.909c20.545 28.762 60.516 35.424 89.278 14.88s35.424-60.516 14.88-89.278l-275.116-316.685c-55.434-63.809-146.777-82.504-222.822-45.603l-56.154 27.249c-44.423 21.557-97.285 15.639-135.842-15.207z" />
|
||||
<glyph unicode="¢" glyph-name="upload-cloud" d="M512 128v128h80.297c15.811 0 31.062 5.852 42.814 16.429 26.273 23.645 28.402 64.112 4.757 90.385l-144.297 160.33c-1.501 1.668-3.089 3.256-4.757 4.757-26.273 23.645-66.739 21.516-90.385-4.757l-144.297-160.33c-10.577-11.752-16.429-27.003-16.429-42.814 0-35.346 28.654-64 64-64h80.297v-128h-134.826c-134.486 0-249.174 105.007-249.174 233.656l0.002 0.090c0.964 124.682 104.79 225.987 234.836 230.305l0.118 1.032c13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 205.694-155.731l-1.186-0.361c18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 169.706-145.77l-0.004 0.002 1.202-0.204c83.204-16.805 145.664-87.332 145.742-171.82l-0.004-0.235c-2.662-97.469-86.2-175.7-188.862-175.7-0.080 0-0.162 0-0.23 0h-322.904z" />
|
||||
<glyph unicode="£" glyph-name="download-cloud" d="M384 759.638v-247.638h-80.297c-35.346 0-64-28.654-64-64 0-15.811 5.852-31.062 16.429-42.814l144.297-160.33c23.645-26.273 64.112-28.402 90.385-4.757 1.668 1.501 3.256 3.089 4.757 4.757l144.297 160.33c23.645 26.273 21.516 66.739-4.757 90.385-11.752 10.577-27.003 16.429-42.814 16.429h-80.297v245.413c68.105-22.058 120.518-76.658 136.885-145.505 18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-134.486 0-249.174 105.007-249.172 233.746 0.964 124.682 104.79 225.987 234.954 231.337 11.086 79.407 70.491 144.216 149.044 166.555z" />
|
||||
<glyph unicode="¥" glyph-name="color-pick-eyedropper" d="M646.997 791.552l45.056-45.227-304.299-304.469c0.395-4.001 0.62-8.648 0.62-13.348 0-37.29-14.17-71.27-37.419-96.85l22.634-22.41 22.528-22.528c25.415 23.141 59.352 37.311 96.598 37.311 4.687 0 9.321-0.224 13.893-0.663l303.887 304.514 45.056-45.227 51.2 51.2-208.896 208.384zM506.197 385.365c-6.949-6.006-16.072-9.665-26.049-9.665-22.056 0-39.936 17.88-39.936 39.936 0 9.977 3.659 19.1 9.708 26.1l273.024 273.016 56.32-56.491zM999.424 935.424v0c-15.17 15.196-36.14 24.597-59.307 24.597s-44.137-9.401-59.306-24.596l-118.273-118.444 118.613-119.467 118.272 118.443c15.411 15.23 24.955 36.367 24.955 59.733s-9.544 44.503-24.947 59.725zM486.571 51.2h-370.688v371.029h156.331c5.090 0 9.216 4.126 9.216 9.216v96.768c0 5.090-4.126 9.216-9.216 9.216h-262.997c-5.090 0-9.216-4.126-9.216-9.216v-582.997c0-0.008 0-0.016 0-0.025 0-5.090 4.126-9.216 9.216-9.216 0.24 0 0.478 0.009 0.714 0.027l583.819-0.002c5.090 0 9.216 4.126 9.216 9.216v262.485c0 5.090-4.126 9.216-9.216 9.216h-97.451c-5.090 0-9.216-4.126-9.216-9.216z" />
|
||||
<glyph unicode="§" glyph-name="align-y-top" d="M64 832h896c35.346 0 64-28.654 64-64s-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64s28.654 64 64 64zM320 576h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="¨" glyph-name="calculator" d="M192 960h640c70.692 0 128-57.308 128-128v-768c0-70.692-57.308-128-128-128h-640c-70.692 0-128 57.308-128 128v768c0 70.692 57.308 128 128 128zM256 832c-35.346 0-64-28.654-64-64v-32c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v32c0 35.346-28.654 64-64 64h-512zM224 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM224 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM224 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96z" />
|
||||
<glyph unicode="©" glyph-name="layout" d="M958.507 723.968h-893.163v116.928c0 30.433 24.671 55.104 55.104 55.104h782.955c30.433 0 55.104-24.671 55.104-55.104zM272.171 0h-151.723c-30.433 0-55.104 24.671-55.104 55.104v610.624h206.827zM327.424 665.728h631.232v-331.072h-631.232v331.072zM903.403 0h-575.979v275.968h631.083v-220.864c0-30.433-24.671-55.104-55.104-55.104z" />
|
||||
<glyph unicode="ª" glyph-name="branda" d="M882.176 547.328l-310.272 310.272h-469.504v-465.92l351.231-312.32 428.545 467.968zM0 960h614.4l409.6-409.6-563.2-614.4-460.8 409.6v614.4zM187.733 793.456c12.63 8.439 27.479 12.944 42.669 12.944 20.369 0 39.904-8.091 54.306-22.494s22.494-33.938 22.494-54.306c0-15.19-4.505-30.039-12.944-42.669s-20.432-22.472-34.465-28.285c-14.033-5.813-29.478-7.336-44.375-4.371s-28.582 10.278-39.321 21.018c-10.741 10.741-18.055 24.424-21.019 39.322s-1.44 30.341 4.373 44.375c5.813 14.032 15.655 26.026 28.285 34.465z" />
|
||||
<glyph unicode="«" glyph-name="laptop" d="M125.27 257.806h773.803c29.523 0.097 53.419 24.053 53.419 53.589 0 0 0 0 0 0v473.941c0 29.502-23.916 53.419-53.419 53.419h-773.803c-29.502 0-53.419-23.916-53.419-53.419v-474.112c0 0 0 0 0 0 0-29.537 23.896-53.492 53.409-53.589zM178.688 731.748h666.795v-367.275h-666.624zM999.595 204.217h-974.677c-13.667 0-24.747-11.079-24.747-24.747v-59.733c-0.002-0.108-0.003-0.235-0.003-0.363 0-6.447 2.465-12.318 6.505-16.722l34.117-37.87c4.505-4.65 10.806-7.537 17.782-7.537 0.409 0 0.815 0.010 1.219 0.029l902.258-0.002c6.688 0.147 12.7 2.925 17.065 7.337l37.549 37.89c4.351 4.388 7.070 10.401 7.168 17.048v59.752c-0.096 13.534-11.042 24.48-24.567 24.576zM605.184 118.542c0.019-0.161 0.029-0.347 0.029-0.536 0-2.563-1.949-4.672-4.446-4.924l-177.344-0.002c-2.518 0.254-4.466 2.362-4.466 4.926 0 0.189 0.011 0.375 0.031 0.558l-0.002 24.041c-0.019 0.161-0.029 0.347-0.029 0.536 0 2.563 1.949 4.672 4.446 4.924l177.514 0.002c2.518-0.254 4.466-2.362 4.466-4.926 0-0.189-0.011-0.375-0.031-0.558z" />
|
||||
<glyph unicode="¬" glyph-name="arrows-expand" d="M109.982 293.839l-45.997-275.685c-0.147-0.806-0.231-1.734-0.231-2.682 0-4.315 1.744-8.223 4.562-11.058l-0.001 0.001c2.724-2.85 6.557-4.623 10.803-4.623 1.040 0 2.053 0.105 3.032 0.308l274.843 46.428c7.493 1.27 13.129 7.712 13.129 15.471 0 4.342-1.764 8.271-4.615 11.111l-53.764 53.764 144.264 144.264c2.861 2.841 4.63 6.777 4.63 11.127s-1.771 8.285-4.629 11.126l-99.463 99.463c-2.841 2.861-6.777 4.63-11.127 4.63s-8.285-1.771-11.126-4.629l-143.966-144.265-53.764 53.764c-2.839 2.851-6.77 4.615-11.112 4.615-7.759 0-14.201-5.636-15.458-13.035zM914.040 602.081l45.997 275.685c0.133 0.768 0.209 1.652 0.209 2.555 0 4.305-1.734 8.202-4.542 11.037l0.001-0.001c-2.884 2.991-6.926 4.851-11.404 4.851-0.931 0-1.842-0.080-2.729-0.234l-274.843-46.731c-7.493-1.27-13.129-7.712-13.129-15.471 0-4.342 1.764-8.271 4.615-11.111l53.764-53.764-144.264-144.414c-2.861-2.841-4.63-6.777-4.63-11.127s1.771-8.285 4.629-11.126l99.463-99.463c2.841-2.861 6.777-4.63 11.127-4.63s8.285 1.771 11.126 4.629l144.414 144.414 53.764-53.764c2.839-2.851 6.77-4.615 11.112-4.615 7.759 0 14.201 5.636 15.458 13.035z" />
|
||||
<glyph unicode="®" glyph-name="update" d="M311.743 222.622c0.929-0.838 1.863-1.67 2.802-2.497 69.009-60.732 161.584-87.586 253.821-71.323 103.046 18.17 187.795 87.13 227.628 181.864 17.126 40.729 64.026 59.863 104.755 42.737s59.863-64.026 42.737-104.755c-60.693-144.344-190.177-249.705-347.337-277.416-140.63-24.797-282.185 16.266-387.309 108.781-5.599 4.927-11.074 9.985-16.422 15.167l-47.146-42.45c-11.75-10.579-26.999-16.435-42.81-16.439-35.346-0.008-64.006 28.639-64.014 63.986l-0.048 215.702c-0.001 2.244 0.117 4.487 0.352 6.718 3.703 35.152 35.2 60.646 70.352 56.944l214.515-22.595c15.724-1.656 30.278-9.074 40.857-20.824 23.651-26.267 21.53-66.734-4.737-90.386l-47.997-43.216zM716.899 672.584c-1.285 1.17-2.58 2.329-3.885 3.478-69.009 60.732-161.584 87.586-253.821 71.323-103.046-18.17-187.795-87.13-227.628-181.864-17.126-40.729-64.026-59.863-104.755-42.737s-59.863 64.026-42.737 104.755c60.693 144.344 190.177 249.705 347.337 277.416 140.63 24.797 282.185-16.266 387.309-108.781 5.964-5.249 11.788-10.645 17.467-16.183l48.274 43.466c11.75 10.579 26.999 16.435 42.81 16.439 35.346 0.008 64.006-28.639 64.014-63.986l0.048-215.702c0-2.244-0.117-4.487-0.352-6.718-3.703-35.152-35.2-60.646-70.352-56.944l-214.515 22.595c-15.724 1.656-30.278 9.074-40.857 20.824-23.651 26.267-21.53 66.734 4.737 90.386l46.906 42.235z" />
|
||||
<glyph unicode="¯" glyph-name="arrow-right" d="M963.754 468.992l-388.949 388.608c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-62.463-62.121c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l230.569-230.399h-621.909c0 0 0 0-0.001 0-14.644 0-26.527-11.823-26.623-26.444v-95.583c0-14.704 11.92-26.624 26.624-26.624h621.909l-230.4-230.4c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l62.292-61.951c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l388.948 388.607c5.38 5.401 8.706 12.851 8.706 21.077s-3.326 15.677-8.707 21.078z" />
|
||||
<glyph unicode="°" glyph-name="hummingbird" d="M659.2 799.087l61.016-43.886-34.56-319.048-125.443-172.033-3.841-19.749-22.185-113.225-98.986 43.886 114.345 147.017 3.839 22.383 75.095 454.655h30.721zM557.653 886.858l-85.334-526.629-170.666-219.429 298.666-131.657 42.667 219.429 127.998 175.543 42.672 394.971-125.016 87.771h-130.987zM321.282 611.691l190.529-14.698 14.093 87.145-505.848 39.023 457.256-332.305 15.663 96.421-171.693 124.415zM1024 799.087h-210.447l-8.162-76.008 218.609 32.122v43.886zM469.334 886.858h-128v-43.886h128v43.886zM298.666 886.858h-42.666v-43.886h42.666v43.886zM298.666 491.887h-213.333v-43.886h213.333v43.886zM42.666 491.887h-42.666v-43.886h42.666v43.886zM341.334 272.458h-85.334v-43.886h85.334v43.886zM213.334 272.458h-42.667v-43.886h42.667v43.886z" />
|
||||
<glyph unicode="±" glyph-name="uptime" d="M182.38 504.833l35.667 57.002c9.973 16.21 27.72 26.868 47.983 26.868 1.002 0 1.999-0.026 2.988-0.078 20.963-0.726 39.094-12.634 48.475-29.9l41.331-76.592 89.944 160.768c9.965 17.66 28.725 29.404 50.254 29.404 24.723 0 45.794-15.488 53.863-37.202l79.733-220.042 36.184 61.61c10.179 16.966 28.59 28.162 49.64 28.162 0.117 0 0.232 0 0.345 0h122.32l118.891-56.832v256l-447.997 256-447.997-256v-256l118.374 56.832zM752.025 391.169l-81.33-138.24c-10.179-16.962-28.58-28.154-49.622-28.16h-5.688c-22.3 2.314-40.643 16.942-48.116 36.812l-79.22 216.116-79.434-143.36c-9.615-17.626-28.136-29.4-49.43-29.4-0.796 0-1.587 0.016-2.375 0.048-21.49 0.312-40.172 12.404-49.707 30.070l-44.261 82.736c-10.278-16.092-28.15-26.624-48.506-26.624-0.028 0-0.059 0-0.089 0l-150.248 56.832v-255.999l447.995-256 447.997 256v255.999l-118.891-56.832-89.076 0.002z" />
|
||||
<glyph unicode="´" glyph-name="play" d="M293.643 886.078l531.188-386.319c28.586-20.79 34.906-60.816 14.116-89.402-3.938-5.415-8.701-10.178-14.116-14.116l-531.188-386.319c-28.586-20.79-68.612-14.47-89.402 14.116-7.956 10.939-12.241 24.117-12.241 37.643v772.637c0 35.346 28.654 64 64 64 13.526 0 26.704-4.285 37.643-12.241z" />
|
||||
<glyph unicode="µ" glyph-name="profile-male" d="M921.991 173.375c-37.632 62.123-126.037 74.667-170.24 89.6s-129.173 76.907-129.173 76.907v44.8c17.386 16.117 32.259 34.602 44.19 55.017l0.61 1.132c1.792 3.136 3.285 6.123 4.779 8.96v1.195c1.195 2.688 2.24 5.077 3.136 7.467v1.643c0.825 2.114 1.645 4.757 2.298 7.466 1.567 7.063 2.834 15.217 3.613 23.513 7.977 2.92 12.009-1.41 22.165 24.723 11.499 29.867 30.912 96.171 18.219 110.208-2.949 3.455-7.309 5.633-12.176 5.633-3.373 0-6.503-1.045-9.081-2.83 6.241 25.947 9.791 55.696 9.791 86.275 0 7.749-0.228 15.445-0.678 23.080-5.775 93.026-97.764 146.937-182.884 155.298-94.379 9.259-91.989-7.317-102.144-40.917-68.992 1.045-98.261-62.421-98.261-62.421-16.725-38.229-17.771-88.107-3.136-159.787-2.527 1.75-5.655 2.795-9.028 2.795-4.867 0-9.228-2.177-12.159-5.61-12.712-14.060 6.701-80.812 18.2-110.229s14.933-21.205 23.595-24.341c0-3.883 1.195-19.413 2.091-23.445 11.669-33.197 30.989-61.224 55.92-82.983l0.231-46.192s-85.12-62.123-129.323-76.907-132.459-27.776-170.091-89.6-36.437-173.824-36.437-173.824h891.968s1.643 111.253-35.989 173.376z" />
|
||||
<glyph unicode="¶" glyph-name="align-y-bottom" d="M64 192h896c35.346 0 64-28.654 64-64s-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64s28.654 64 64 64zM320 832h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="·" glyph-name="defender" d="M512 960l-475.429-138.24v-424.96c0-209.92 235.213-460.8 475.429-460.8s475.429 250.88 475.429 460.8v424.96l-475.429 138.24zM882.337 396.8c0-148.48-185.168-358.4-370.337-358.4v409.6h-370.334v296.96l370.334 107.52v-404.48h370.337v-51.2z" />
|
||||
<glyph unicode="¸" glyph-name="sitemap" d="M425.472 625.835h173.056c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933h-173.056c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933zM598.528 270.165h-173.056c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.056c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM977.067 270.165h-173.227c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.227c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM220.16 270.165h-173.227c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.227c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM178.005 445.099h290.133v-85.333h89.088v85.333h290.133v-85.333h89.088v85.333c0 49.202-39.886 89.088-89.088 89.088h-669.355c-49.129-0.097-88.917-39.946-88.917-89.088 0 0 0 0 0 0v-85.333h89.088z" />
|
||||
<glyph unicode="º" glyph-name="magnifying-glass-search" d="M1024 39.595l-226.816 226.816c50.818 70.758 81.267 159.126 81.267 254.605 0 242.711-196.756 439.467-439.467 439.467s-439.467-196.756-439.467-439.467c0-242.711 196.756-439.467 439.467-439.467 95.479 0 183.847 30.449 255.922 82.165l225.67-227.715zM146.432 520.704c0 0.051 0 0.111 0 0.171 0 161.744 131.12 292.864 292.864 292.864s292.864-131.12 292.864-292.864c0-161.744-131.12-292.864-292.864-292.864-161.606 0.194-292.573 131.101-292.864 292.665z" />
|
||||
<glyph unicode="»" glyph-name="folder-open" d="M0 768.157c0 35.259 28.862 63.843 63.41 63.843h257.18c35.020 0 76.361-25.903 92.040-57.261l35.369-70.739h-191.688c-70.865 0-144.008-54.934-163.628-123.604l-92.685-324.396v512.157zM155.208 517.359c20.32 67.733 93.979 122.641 164.969 122.641h575.647c70.79 0 111.807-54.566 91.384-122.641l-118.415-394.718c-20.32-67.733-93.979-122.641-164.969-122.641h-575.647c-70.79 0-111.807 54.566-91.384 122.641l118.415 394.718z" />
|
||||
<glyph unicode="¿" glyph-name="clipboard-notes" d="M877.227 836.778v0s0 1.195 0 1.707c0 34.404-27.89 62.293-62.293 62.293h-174.251v40.107c0 0.051 0.001 0.111 0.001 0.171 0 10.462-8.482 18.944-18.944 18.944 0 0-0.001 0-0.001 0h-218.965c-10.462 0-18.944-8.482-18.944-18.944v-40.448h-174.763c-34.404 0-62.293-27.89-62.293-62.293s0-1.024 0-1.707v0-837.803c-0.001-0.152-0.002-0.332-0.002-0.512 0-34.404 27.89-62.293 62.293-62.293 0.001 0 0.002 0 0.002 0h605.696c0 0 0 0 0 0 34.344 0 62.196 27.792 62.293 62.113s0 0.009 0 0.009v0 838.656zM759.126 53.93h-494.933v728.747h59.392v-36.352s0 0 0-1.195c0-11.876 9.628-21.504 21.504-21.504h333.312c11.876 0 21.504 9.628 21.504 21.504s0 0 0 0v37.547h59.221zM383.147 553.471c-0.094 7.751-6.4 13.999-14.164 13.999-0.12 0-0.24-0.002-0.36-0.004h-30.702c-7.823 0-14.165-6.342-14.165-14.165v-30.891c0-7.823 6.342-14.165 14.165-14.165h30.72c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 31.061zM699.905 553.471c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.823 0-14.165-6.342-14.165-14.165v-30.891c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891zM383.147 435.028c0 7.823-6.342 14.165-14.165 14.165h-30.72c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h30.379c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 30.891zM699.905 435.028c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891zM383.147 316.586c0 7.823-6.342 14.165-14.165 14.165h-30.72c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h30.379c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 30.891zM699.905 316.586c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891z" />
|
||||
<glyph unicode="Á" glyph-name="refresh2" d="M995.157 353.621l-65.365 113.152-8.192 15.36-102.741-59.733-14.677-8.363 8.533-14.677 65.365-113.152c7.865-13.361 12.511-29.434 12.511-46.592 0-51.37-41.643-93.013-93.013-93.013-0.078 0-0.157 0-0.235 0h-240.116v-135.509h239.957c0.035 0 0.075 0 0.116 0 126.21 0 228.523 102.313 228.523 228.523 0 42.105-11.387 81.55-31.249 115.424l0.584-1.077zM593.749 778.069l103.253-179.029 9.557-17.067 15.189 11.264 82.091 61.099 12.117 8.875-7.509 12.971-97.451 169.472c-40.252 68.771-113.761 114.229-197.888 114.229s-157.636-45.458-197.304-113.151l-0.584-1.078-65.365-113.323-8.533-14.677 14.677-8.363 102.571-59.563 8.533 14.507 65.365 113.323c16.425 27.992 46.373 46.489 80.64 46.489s64.215-18.497 80.402-46.051l0.238-0.438zM228.864 146.261c-0.015 0-0.034 0-0.052 0-51.37 0-93.013 41.643-93.013 93.013 0 17.158 4.646 33.231 12.748 47.029l-0.237-0.437 110.251 190.976 9.557 17.067-17.067 7.509-94.379 40.107-13.653 5.973-7.509-12.971-104.448-180.907c-19.279-32.797-30.666-72.242-30.666-114.347 0-126.191 102.282-228.492 228.465-228.523h147.629v135.509h-147.627zM397.995 78.336l246.613-142.336v284.843l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507zM289.28 665.429l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507 246.613-142.336v284.843zM851.968 466.091v284.843l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507 246.613-142.336z" />
|
||||
<glyph unicode="Â" glyph-name="arrow-down" d="M532.993-3.924l388.949 388.949c5.46 5.491 8.836 13.061 8.836 21.419s-3.375 15.927-8.837 21.42l-62.463 62.463c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-230.399-230.228v621.568c0.001 0.101 0.002 0.221 0.002 0.341 0 14.704-11.92 26.624-26.624 26.624-0.001 0-0.002 0-0.002 0h-95.403c-14.704 0-26.624-11.92-26.624-26.624v-621.909l-230.4 230.229c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-62.292-62.463c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l388.948-388.948c5.401-5.38 12.851-8.706 21.077-8.706s15.677 3.326 21.078 8.707z" />
|
||||
<glyph unicode="Å" glyph-name="element-checkbox" d="M256 960h512c141.385 0 256-114.615 256-256v-512c0-141.385-114.615-256-256-256h-512c-141.385 0-256 114.615-256 256v512c0 141.385 114.615 256 256 256zM757 535c3.333 3.333 6 7.333 8 12s3 9.667 3 15c0 5.333-1 10.333-3 15s-4.667 8.667-8 12l-30 30c-3.333 3.333-7.333 6-12 8s-9.667 3-15 3c-5.333 0-10.333-1-15-3s-8.667-4.667-12-8l-209-210-85 85c-4 3.333-8.167 6-12.5 8s-9.167 3-14.5 3c-5.333 0-10.333-1-15-3s-8.667-4.667-12-8l-30-30c-3.333-3.333-6-7.333-8-12s-3-9.667-3-15c0-4.667 1-9.333 3-14s4.667-8.667 8-12l127-127c5.333-5.333 11.5-9.667 18.5-13s14.833-5 23.5-5c8 0 15.5 1.667 22.5 5s13.167 7.667 18.5 13l252 251z" />
|
||||
<glyph unicode="Æ" glyph-name="page-pdf" d="M407.040 307.541h-58.368v-109.227h33.109v34.133h25.259c0.757-0.054 1.64-0.085 2.53-0.085 20.736 0 37.547 16.81 37.547 37.547s-16.81 37.547-37.547 37.547c-0.89 0-1.773-0.031-2.648-0.092zM402.773 261.291h-20.992v17.067h20.992c5.632 0 9.899-2.731 9.899-8.704s-4.437-8.533-9.899-8.533zM512 307.541h-48.469v-109.227h48.469c34.133 0 59.733 19.797 59.733 54.784s-25.6 54.443-59.733 54.443zM512 227.157h-15.36v51.2h15.36c0.742 0.082 1.602 0.128 2.474 0.128 13.196 0 23.893-10.697 23.893-23.893 0-0.706-0.031-1.405-0.091-2.095 0.007 0.033 0.007-0.035 0.007-0.102 0-13.95-11.309-25.259-25.259-25.259-0.36 0-0.719 0.008-1.076 0.022zM592.384 198.315h33.109v40.789h48.64v28.843h-48.64v10.752h49.835v28.843h-82.944v-109.227zM870.4 891.733v0 47.787c0 11.311-9.169 20.48-20.48 20.48h-389.12l-307.2-307.2v-696.32c0-11.311 9.169-20.48 20.48-20.48h675.84c11.311 0 20.48 9.169 20.48 20.48v29.013zM271.531 53.931v557.909h209.749c11.311 0 20.48 9.169 20.48 20.48v209.749h250.88v-788.139z" />
|
||||
<glyph unicode="Ç" glyph-name="graph-bar" d="M463.533 359.569h-173.396c-10.274 0-18.604-8.039-18.604-17.957v-259.65c0-9.918 8.33-17.959 18.604-17.959h173.396c10.274 0 18.604 8.039 18.604 17.957v259.812c0 9.918-8.33 17.957-18.604 17.957v-0.16zM733.867 896h-173.396c-10.274 0-18.602-8.041-18.602-17.959v-796.080c0-9.918 8.328-17.957 18.602-17.957h173.396c10.274 0 18.602 8.039 18.602 17.957v796.080c0 9.918-8.328 17.959-18.602 17.959zM1005.398 654.145h-173.226c-10.274 0-18.602-8.041-18.602-17.959v-554.226c0-9.918 8.328-17.959 18.602-17.959h173.226c10.274 0 18.602 8.039 18.602 17.957v554.226c0 9.918-8.328 17.959-18.602 17.959v0.002zM191.832 654.145h-173.228c-10.274 0-18.604-8.041-18.604-17.959v-554.226c0-9.918 8.33-17.959 18.604-17.959h173.228c10.274 0 18.604 8.039 18.604 17.957v554.226c0 9.918-8.33 17.959-18.604 17.959v0.002z" />
|
||||
<glyph unicode="Í" glyph-name="element-radio" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512zM512 192c141.385 0 256 114.615 256 256s-114.615 256-256 256c-141.385 0-256-114.615-256-256s114.615-256 256-256z" />
|
||||
<glyph unicode="Î" glyph-name="storage-server-data" d="M973.995 832h-923.989c-27.758-0.668-50.005-23.329-50.005-51.186 0-0.005 0-0.010 0-0.015v-238.933c0-0.004 0-0.009 0-0.014 0-27.857 22.247-50.518 49.943-51.185l924.051-0.001c27.758 0.668 50.005 23.329 50.005 51.186 0 0.005 0 0.010 0 0.015v238.933c0 0.004 0 0.009 0 0.014 0 27.857-22.247 50.518-49.943 51.185zM137.728 612.864c-26.1 0.853-46.933 22.216-46.933 48.445 0 26.769 21.7 48.469 48.469 48.469 26.76 0 48.455-21.687 48.469-48.444 0-26.77-21.7-48.471-48.469-48.471zM973.995 405.333h-923.989c-27.758-0.668-50.005-23.329-50.005-51.186 0-0.005 0-0.010 0-0.015v-238.933c0-0.004 0-0.009 0-0.014 0-27.857 22.247-50.518 49.943-51.185l924.051-0.001c27.758 0.668 50.005 23.329 50.005 51.186 0 0.005 0 0.010 0 0.015v238.933c0 0.004 0 0.009 0 0.014 0 27.857-22.247 50.518-49.943 51.185zM137.728 186.197c-26.1 0.853-46.933 22.216-46.933 48.445 0 26.769 21.7 48.469 48.469 48.469 26.76 0 48.455-21.687 48.469-48.444 0-26.77-21.7-48.471-48.469-48.471z" />
|
||||
<glyph unicode="Ï" glyph-name="element-select" d="M256 960h512c141.385 0 256-114.615 256-256v-512c0-141.385-114.615-256-256-256h-512c-141.385 0-256 114.615-256 256v512c0 141.385 114.615 256 256 256zM512 256l256 320h-512l256-320z" />
|
||||
<glyph unicode="Ð" glyph-name="cloudflare" d="M699.311 230.329l4.865 17.484c2.331 6.169 3.68 13.292 3.68 20.721 0 12.481-3.807 24.103-10.36 33.831-10.141 13.064-26.265 21.658-44.475 21.957l-369.356 4.589c-2.423 0.020-4.562 1.181-5.874 2.956-0.776 1.144-1.227 2.518-1.227 3.996 0 0.886 0.162 1.737 0.462 2.523 1.302 3.466 4.592 5.987 8.528 6.272l372.667 4.467c49.36 5.311 90.168 36.077 108.48 78.264l21.576 54.666c0.338 1.058 0.531 2.274 0.531 3.534s-0.195 2.476-0.555 3.623c-25.625 105.442-122.001 182.789-237.024 182.789-105.653 0-195.57-65.257-229.144-156.432-18.511 11.439-41.211 19.308-65.81 19.308-60.376 0-109.319-47.412-109.319-105.899 0-9.204 1.212-18.135 3.491-26.649-83.733-1.883-150.447-68.135-150.447-149.482 0-8.034 0.651-15.924 1.905-23.618 0.347-2.592 3.356-5.226 6.998-5.226 0.020 0 0.041 0 0.060 0h682.414c3.98 0.062 7.324 2.627 8.432 6.138l-0.497 0.187zM810.55 477.714c-2.091-0.689-3.635-2.431-3.965-4.557l-14.341-48.393c-2.331-6.169-3.68-13.292-3.68-20.721 0-12.481 3.807-24.103 10.358-33.831 10.37-12.792 26.603-21.091 44.835-21.091 0.048 0 26.357-1.53 78.927-4.589 2.331-0.083 4.368-1.231 5.618-2.954 0.776-1.145 1.227-2.52 1.227-3.998 0-0.886-0.164-1.737-0.462-2.523-1.301-3.466-4.593-5.987-8.527-6.272l-81.703-4.467c-49.568-5.316-90.522-36.306-108.74-78.757l-6.213-15.858c-0.179-0.443-0.282-0.958-0.282-1.494 0-2.249 1.82-4.088 4.112-4.21h281.63c3.461 0 6.332 2.17 7.283 5.156 4.685 15.738 7.372 33.755 7.372 52.38 0 107.959-90.254 195.497-201.656 195.676l-11.792 0.501z" />
|
||||
<glyph unicode="Ò" glyph-name="page" d="M870.4 891.733v0 47.787c0 11.311-9.169 20.48-20.48 20.48h-389.12l-307.2-307.2v-696.32c0-11.311 9.169-20.48 20.48-20.48h675.84c11.311 0 20.48 9.169 20.48 20.48v29.013zM271.531 53.931v557.909h209.749c11.311 0 20.48 9.169 20.48 20.48v209.749h250.88v-788.139z" />
|
||||
<glyph unicode="Ó" glyph-name="chevron-left" d="M716.62 38.236c-5.492-4.91-11.792-9.080-18.644-12.262-7.344-3.354-15.383-5.196-23.852-5.196s-16.508 1.841-23.738 5.146c-7.031 3.224-13.388 7.396-19.008 12.382l-366.854 367.035c-5.463 5.454-9.854 11.98-12.829 19.236-3.048 7.438-4.735 15.621-4.735 24.198s1.687 16.76 4.748 24.235c2.991 7.15 7.377 13.616 12.814 19.027l367.789 365.4c10.89 10.984 25.984 17.784 42.667 17.784s31.777-6.8 42.662-17.78l41.818-43.012c5.397-5.383 9.775-11.785 12.822-18.894 3.056-7.305 4.744-15.342 4.744-23.773s-1.689-16.467-4.746-23.789c-3.067-7.024-7.441-13.367-12.816-18.703l-279.044-281.433 279.040-280.576c5.394-5.385 9.771-11.787 12.821-18.893 3.065-7.145 4.76-15.008 4.76-23.266 0-0.178-0.001-0.357-0.002-0.535 0-0.035 0.001-0.108 0.001-0.182 0-8.477-1.693-16.559-4.76-23.926-2.85-6.986-7.257-13.255-12.781-18.327l-42.021-43.895z" />
|
||||
<glyph unicode="Ô" glyph-name="arrow-up" d="M491.007 899.925l-388.949-388.949c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l62.463-62.463c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l230.399 230.228v-621.568c-0.001-0.102-0.002-0.222-0.002-0.342 0-14.645 11.824-26.528 26.446-26.623h95.412c14.704 0 26.624 11.92 26.624 26.624v621.909l230.4-230.4c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l62.463 62.463c5.46 5.491 8.836 13.061 8.836 21.419s-3.375 15.927-8.837 21.42l-388.948 389.119c-5.401 5.38-12.851 8.706-21.077 8.706s-15.677-3.326-21.078-8.707z" />
|
||||
<glyph unicode="Ø" glyph-name="camera" d="M512.001 527.104c65.98 0 119.467-53.487 119.467-119.467s-53.487-119.467-119.467-119.467c-65.98 0-119.467 53.487-119.467 119.467s53.487 119.467 119.467 119.467zM976.897 774.058v0h-210.603v35.84c0 26.015-21.089 47.104-47.104 47.104h-414.379c-26.015 0-47.104-21.089-47.104-47.104v-35.328h-210.603c0 0-0.001 0-0.001 0-26.015 0-47.104-21.089-47.104-47.104 0-0.12 0-0.24 0.001-0.36v-640.664c-0.001-0.101-0.001-0.221-0.001-0.341 0-26.015 21.089-47.104 47.104-47.104 0 0 0.001 0 0.001 0h929.792c0 0 0.001 0 0.001 0 26.015 0 47.104 21.089 47.104 47.104 0 0.12 0 0.24-0.001 0.36v640.664c0 26.015-21.089 47.104-47.104 47.104zM515.073 162.901c-134.693 0-243.883 109.19-243.883 243.883s109.19 243.883 243.883 243.883c134.693 0 243.883-109.19 243.883-243.883s-109.19-243.883-243.883-243.883zM961.025 585.13h-186.368v125.952h186.368v-125.952z" />
|
||||
<glyph unicode="Ú" glyph-name="element-number" d="M832 192l192 192h-384zM832 704l192-192h-384zM249.96 128c-109.648 0-192.348 33.932-249.96 91.429l87.347 113.108c42.744-39.588 101.285-61.267 160.755-61.267 67.833 0 101.285 33.932 101.285 72.577 0 42.415-32.523 72.577-96.639 72.577-49.249 0-88.276-14.138-122.657-47.128l-110.577 27.334v371.37h449.742v-141.384h-289.917v-121.591c29.735 29.219 78.054 49.956 132.878 49.956 105.002 0 199.782-78.233 199.782-204.536 0-135.729-101.285-222.445-262.040-222.445z" />
|
||||
<glyph unicode="ß" glyph-name="save" d="M256 896v-192c0-35.346 28.654-64 64-64h320c35.346 0 64 28.654 64 64v192h37.49c16.974 0 33.253-6.743 45.255-18.745l154.51-154.51c12.002-12.002 18.745-28.281 18.745-45.255v-613.49c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h128zM512 896h128v-160c0-17.673-14.327-32-32-32h-64c-17.673 0-32 14.327-32 32v160zM256 448c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v192c0 35.346-28.654 64-64 64h-512zM288 384h448c17.673 0 32-14.327 32-32s-14.327-32-32-32h-448c-17.673 0-32 14.327-32 32s14.327 32 32 32zM288 256h448c17.673 0 32-14.327 32-32s-14.327-32-32-32h-448c-17.673 0-32 14.327-32 32s14.327 32 32 32z" />
|
||||
<glyph unicode="å" glyph-name="align-x-left" d="M448 704h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64zM192 960c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64s-64 28.654-64 64v896c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="æ" glyph-name="layers" d="M1011.883 558.080l-447.829-260.267c-14.438-8.497-31.806-13.517-50.347-13.517s-35.908 5.019-50.819 13.773l-450.77 260.181c-7.29 4.311-12.102 12.132-12.102 21.077s4.812 16.766 11.989 21.015l435.655 253.161c17.935 10.569 39.513 16.813 62.549 16.813s44.615-6.244 63.135-17.131l438.54-253.122c7.29-4.311 12.102-12.132 12.102-21.077s-4.812-16.766-11.989-21.015zM1011.883 251.904l-182.784 105.643-264.875-153.6c-14.438-8.497-31.806-13.517-50.347-13.517s-35.908 5.019-50.819 13.773l-268.157 154.197-182.784-106.325c-7.29-4.311-12.102-12.132-12.102-21.077s4.812-16.766 11.989-21.015l451.356-260.499c14.438-8.497 31.806-13.517 50.347-13.517s35.908 5.019 50.819 13.773l447.357 259.327c7.29 4.311 12.102 12.132 12.102 21.077s-4.812 16.766-11.989 21.015z" />
|
||||
<glyph unicode="ç" glyph-name="page-multiple" d="M911.531 741.206h-38.059v-733.867c0-9.426-7.641-17.067-17.067-17.067h-542.208v-37.205c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067v771.584c0 9.426-7.641 17.067-17.067 17.067zM818.688 61.953v772.096c0 9.426-7.641 17.067-17.067 17.067h-37.547v-733.867c0-9.426-7.641-17.067-17.067-17.067h-542.208v-38.059c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067zM709.803 171.35v771.584c0 9.426-7.641 17.067-17.067 17.067h-580.267c-9.426 0-17.067-7.641-17.067-17.067v-771.584c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067z" />
|
||||
<glyph unicode="÷" glyph-name="add-playlist" horiz-adv-x="964" d="M783.059 329.412c33.267 0 60.235-26.968 60.235-60.235v-60.235h60.235c33.267 0 60.235-26.968 60.235-60.235s-26.968-60.235-60.235-60.235h-60.235v-60.235c0-33.267-26.968-60.235-60.235-60.235s-60.235 26.968-60.235 60.235v60.235h-60.235c-33.267 0-60.235 26.968-60.235 60.235s26.968 60.235 60.235 60.235h60.235v60.235c0 33.267 26.968 60.235 60.235 60.235zM481.882 269.176c33.25 0 60.235-26.925 60.235-60.235s-26.985-60.235-60.235-60.235h-421.647c-33.25 0-60.235 26.925-60.235 60.235s26.985 60.235 60.235 60.235h421.647zM722.824 510.118c33.31 0 60.235-26.985 60.235-60.235s-26.925-60.235-60.235-60.235h-662.588c-33.25 0-60.235 26.985-60.235 60.235s26.985 60.235 60.235 60.235h662.588zM722.824 751.059c33.31 0 60.235-26.985 60.235-60.235s-26.925-60.235-60.235-60.235h-662.588c-33.25 0-60.235 26.985-60.235 60.235s26.985 60.235 60.235 60.235h662.588z" />
|
||||
<glyph unicode="ø" glyph-name="speed-optimize" d="M475.793 894.803c-266.855-19.796-475.793-238.971-475.793-506.45 0-152.123 67.582-288.622 174.648-381.687 5.027-4.328 10.882-6.666 17.288-6.666 9.379 0 17.575 5.012 22.004 12.477l43.671 74.793c2.042 3.51 3.246 7.719 3.246 12.207 0 6.912-2.858 13.164-7.468 17.66-73.006 68.243-118.449 164.703-118.449 271.671 0 206.208 168.886 373.374 377.217 373.374s377.217-167.165 377.217-373.374c0-106.966-45.444-203.427-118.265-271.499-4.794-4.668-7.653-10.919-7.653-17.832 0-4.487 1.204-8.697 3.311-12.327l43.692-74.554c4.47-7.53 12.613-12.505 21.929-12.505 6.339 0 12.134 2.303 16.579 6.11 107.517 93.526 175.031 229.964 175.031 382.010 0 280.443-229.684 507.789-513.015 507.789-12.383 0-24.663-0.434-36.826-1.288l1.635 0.091zM462.364 299.645l-58.544 66.013c-5.285 5.937-8.51 13.778-8.51 22.366 0 11.288 5.573 21.288 14.146 27.45l289.953 206.469c5.48 3.846 12.303 6.148 19.67 6.148 10.164 0 19.294-4.382 25.566-11.341l13.156-14.968c5.081-5.878 8.173-13.571 8.173-21.978 0-8.805-3.391-16.825-8.951-22.853l-244.413-258.348c-6.261-6.571-15.116-10.663-24.938-10.663-10.251 0-19.45 4.458-25.727 11.521l0.42 0.186z" />
|
||||
<glyph unicode="ı" glyph-name="chevron-down" d="M921.583 588.559c5.562-5.106 9.969-11.375 12.847-18.431 2.739-6.961 4.255-14.629 4.255-22.65 0-0.738-0.013-1.472-0.038-2.204 0.004-0.035 0.005-0.201 0.005-0.368 0-8.27-1.695-16.144-4.757-23.293-2.949-6.896-7.151-13.123-12.321-18.397l-366.241-367.094c-5.618-4.978-12.096-9.16-19.153-12.272-7.479-3.363-15.665-5.215-24.282-5.215s-16.803 1.851-24.179 5.178c-7.157 3.155-13.635 7.336-19.334 12.377l-366.001 367.035c-5.157 5.267-9.359 11.493-12.31 18.382-3.064 7.134-4.76 14.985-4.76 23.232 0 0.19 0.001 0.38 0.003 0.57-0.001 0.053-0.001 0.149-0.001 0.246 0 8.455 1.694 16.514 4.76 23.857 2.613 7.223 6.867 13.729 12.297 19.037l42.506 43.359c5.538 4.921 11.896 9.094 18.81 12.263 7.349 3.353 15.388 5.195 23.857 5.195s16.508-1.841 23.738-5.146c7.034-3.211 13.393-7.384 19.004-12.379l281.695-281.021 280.576 279.723c10.689 10.554 25.384 17.073 41.602 17.073 0.314 0 0.628-0.002 0.941-0.007 0.026 0.001 0.112 0.001 0.198 0.001 8.523 0 16.651-1.693 24.065-4.762 6.98-2.849 13.25-7.256 18.322-12.78l43.895-41.509z" />
|
||||
<glyph unicode="Œ" glyph-name="pin" d="M297.155 870.486c125.418 101.021 304.273 101.021 429.691 0 123.952-99.841 157.486-274.697 79.264-413.31l-294.109-521.176-294.109 521.176c-78.222 138.613-44.689 313.469 79.264 413.31zM512 486.4c70.692 0 128 57.308 128 128s-57.308 128-128 128c-70.692 0-128-57.308-128-128s57.308-128 128-128z" />
|
||||
<glyph unicode="œ" glyph-name="settings-slider-control" horiz-adv-x="978" d="M768 256h129.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-129.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-513.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h513.906v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906zM448 768v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906h321.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-321.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-321.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h321.906zM256 512v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906h513.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-513.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-129.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h129.906z" />
|
||||
<glyph unicode="ƒ" glyph-name="align-x-center" d="M576 704h128c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-128v-192c0-35.346-28.654-64-64-64s-64 28.654-64 64v192h-128c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h128v192c0 35.346 28.654 64 64 64s64-28.654 64-64v-192z" />
|
||||
<glyph unicode="ˆ" glyph-name="unpublish" d="M586.039 394.981l67.882 67.882c12.497 12.497 12.497 32.758 0 45.255l-45.255 45.255c-12.497 12.497-32.758 12.497-45.255 0l-67.882-67.882-67.882 67.882c-12.497 12.497-32.758 12.497-45.255 0l-45.255-45.255c-12.497-12.497-12.497-32.758 0-45.255l67.882-67.882-67.882-67.882c-12.497-12.497-12.497-32.758 0-45.255l45.255-45.255c12.497-12.497 32.758-12.497 45.255 0l67.882 67.882 67.882-67.882c12.497-12.497 32.758-12.497 45.255 0l45.255 45.255c12.497 12.497 12.497 32.758 0 45.255l-67.882 67.882zM707.353 621.728c87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-134.486 0-249.174 105.007-249.172 233.746 0.964 124.682 104.79 225.987 234.954 231.337 13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 204.508-156.092 18.238 6.353 37.93 9.82 58.468 9.82z" />
|
||||
<glyph unicode="ˇ" glyph-name="post-pin" d="M536.811 853.105l109.038 106.895 378.152-376.456-109.038-109.219c-32.479 20.14-67.665 28.66-105.558 25.562s-69.985-18.59-96.278-46.476l-46.399-44.152c-26.293-27.886-41.372-60.806-45.239-98.762s4.253-73.2 24.359-105.733l-106.718-106.895-143.837 144.076-167.036-167.314c-10.826-10.844-31.706-27.886-62.639-51.124-38.666-27.886-71.918-49.574-99.758-65.066-34.026-20.14-54.905-26.724-62.639-19.752s-1.547 28.273 18.56 63.905c15.466 27.886 37.119 60.419 64.959 97.6 23.2 32.533 40.212 54.222 51.039 65.066l167.036 164.99-143.837 144.076 109.038 109.219c30.933-20.14 65.345-28.66 103.238-25.562s70.758 18.59 98.598 46.476l44.079 44.152c27.84 27.886 43.692 60.806 47.559 98.762s-5.026 73.2-26.679 105.733z" />
|
||||
<glyph unicode="˘" glyph-name="folder" d="M0 768c0 35.346 28.862 64 63.41 64h257.18c35.020 0 76.361-25.903 92.040-57.261l35.369-70.739h-448v64zM0 640h767.625c70.9 0 128.375-56.796 128.375-127.975v-384.049c0-70.679-57.412-127.975-128.375-127.975h-639.25c-70.9 0-128.375 56.796-128.375 127.975v512.025z" />
|
||||
<glyph unicode="˙" glyph-name="automate" d="M931.584 741.355c94.454-135.064 118.112-307.338 63.563-462.862s-180.634-275.28-338.763-321.757c37.684 56.421 72.377 114.782 103.936 174.843 120.064 222.842 171.264 468.98 171.264 609.776zM195.456 696.428c-59.991-31.612-118.309-66.303-174.72-103.933 44.483 151.22 156.145 273.521 302.706 331.549s311.682 45.313 447.63-34.469c11.648-6.4 22.528-14.208 34.048-22.015-141.056 0.64-386.816-51.583-609.664-171.131zM529.024-64h-17.024c-282.77 0-512 229.224-512 511.986 0 5.76 0 11.392 0 17.152 181.888 56.447 569.216 193.531 646.016 116.605s-60.416-464.116-116.992-645.743z" />
|
||||
<glyph unicode="˚" glyph-name="arrows-out" d="M106.101 270.054l-42.263-253.425c-0.101-0.652-0.159-1.406-0.159-2.171 0-4.032 1.598-7.691 4.194-10.378l-0.005 0.005c2.682-2.593 6.341-4.191 10.373-4.191 0.765 0 1.519 0.058 2.253 0.169l252.15 42.701c6.673 1.588 11.559 7.498 11.559 14.547 0 3.826-1.438 7.317-3.804 9.959l-49.418 49.416 132.612 132.612c2.511 2.666 4.054 6.267 4.054 10.229s-1.543 7.564-4.061 10.237l-90.94 91.239c-2.666 2.511-6.267 4.054-10.229 4.054s-7.564-1.543-10.237-4.061l-132.306-132.605-49.431 49.431c-2.628 2.354-6.118 3.792-9.944 3.792-7.051 0-12.96-4.886-14.528-11.457zM917.601 625.778l42.263 253.425c0.101 0.652 0.159 1.406 0.159 2.171 0 4.032-1.598 7.691-4.194 10.378l0.005-0.005c-2.701 2.694-6.429 4.36-10.545 4.36-0.811 0-1.607-0.064-2.384-0.189l-251.847-42.848c-6.673-1.588-11.559-7.498-11.559-14.547 0-3.826 1.438-7.317 3.804-9.959l49.418-49.416-133.359-132.612c-2.511-2.666-4.054-6.267-4.054-10.229s1.543-7.564 4.061-10.237l91.687-91.387c2.666-2.511 6.267-4.054 10.229-4.054s7.564 1.543 10.237 4.061l132.605 132.605 49.431-49.431c2.625-2.338 6.103-3.767 9.916-3.767 7.095 0 13.034 4.949 14.556 11.582zM689.712 42.165l253.873-41.963c0.652-0.101 1.406-0.159 2.171-0.159 4.032 0 7.691 1.598 10.378 4.194l-0.005-0.005c2.593 2.682 4.191 6.341 4.191 10.373 0 0.765-0.058 1.519-0.169 2.253l-43.149 251.85c-1.588 6.673-7.498 11.559-14.547 11.559-3.826 0-7.317-1.438-9.959-3.804l-49.416-49.418-132.612 133.359c-2.666 2.511-6.267 4.054-10.229 4.054s-7.564-1.543-10.237-4.061l-91.387-91.687c-2.511-2.666-4.054-6.267-4.054-10.229s1.543-7.564 4.061-10.237l132.605-132.605-49.431-49.431c-2.338-2.625-3.767-6.103-3.767-9.916 0-7.095 4.949-13.034 11.582-14.556zM333.99 853.667l-253.425 42.263c-0.612 0.090-1.319 0.14-2.037 0.14-4.097 0-7.809-1.65-10.509-4.322l0.001 0.001c-2.682-2.698-4.34-6.419-4.34-10.525 0-0.764 0.058-1.517 0.169-2.25l42.85-251.85c1.588-6.673 7.498-11.559 14.547-11.559 3.826 0 7.317 1.438 9.959 3.804l49.416 49.418 132.612-132.612c2.666-2.511 6.267-4.054 10.229-4.054s7.564 1.543 10.237 4.061l91.387 90.94c2.511 2.666 4.054 6.267 4.054 10.229s-1.543 7.564-4.061 10.237l-132.755 132.306 49.431 49.431c2.338 2.625 3.767 6.103 3.767 9.916 0 7.095-4.949 13.034-11.582 14.556z" />
|
||||
<glyph unicode="˛" glyph-name="graph-bar-2" d="M569.856 960c-10.085 0-18.261-8.176-18.261-18.261-0.035-0.409-0.055-0.885-0.055-1.365s0.020-0.956 0.059-1.427l-0.004 0.062v-433.493c0-10.085 8.176-18.261 18.261-18.261h433.152c0.409-0.035 0.885-0.055 1.365-0.055s0.956 0.020 1.427 0.059c10.024-0.004 18.2 8.172 18.2 18.257-2.666 249.806-204.366 451.626-453.872 454.483zM918.357 400.213c0 10.085-8.176 18.261-18.261 18.261h-398.336c-10.085 0-18.261 8.176-18.261 18.261v397.141c0.028 0.408 0.044 0.885 0.044 1.365s-0.016 0.957-0.048 1.429c0.003 10.021-8.172 18.197-18.258 18.197h-6.144c-0.051 0-0.111 0-0.171 0-253.739 0-459.435-205.696-459.435-459.435s205.696-459.435 459.435-459.435c253.739 0 459.435 205.696 459.435 459.435 0 1.536 0 2.901 0 4.437s0 0 0 0z" />
|
||||
<glyph unicode="˜" glyph-name="chevron-right" d="M308.816 857.398c5.489 4.917 11.79 9.088 18.646 12.264 7.34 3.363 15.379 5.211 23.85 5.211s16.51-1.848 23.736-5.162c7.036-3.211 13.395-7.384 19.006-12.379l364.98-367.037c5.487-5.503 9.971-12.010 13.152-19.22 3.337-7.412 5.188-15.597 5.188-24.214s-1.851-16.803-5.178-24.179c-3.217-7.176-7.697-13.623-13.162-19.084l-365.91-365.398c-10.689-10.554-25.384-17.073-41.602-17.073-0.314 0-0.628 0.002-0.941 0.007 0.015-0.001-0.024-0.001-0.062-0.001-8.512 0-16.628 1.693-24.030 4.761-7.018 2.679-13.345 6.922-18.512 12.289l-43.877 43.024c-4.912 5.491-9.082 11.792-12.263 18.645-3.364 7.341-5.212 15.381-5.212 23.851s1.848 16.51 5.162 23.736c3.219 7.034 7.392 13.392 12.381 19.008l281.020 281.351-279.723 280.576c-5.394 5.385-9.771 11.787-12.821 18.893-3.381 7.189-5.369 15.135-5.609 23.519-0.003 0.196-0.003 0.329-0.003 0.462 0 8.478 1.694 16.561 4.761 23.928 2.85 6.986 7.257 13.255 12.781 18.327l43.387 43.895z" />
|
||||
<glyph unicode="˝" glyph-name="chevron-up" d="M102.581 212.996c-4.926 5.536-9.099 11.895-12.264 18.811-3.343 7.338-5.179 15.366-5.179 23.822 0 8.746 1.964 17.033 5.474 24.444 3.18 6.706 7.231 12.776 12.035 18.159l366.185 365.664c5.619 4.975 12.097 9.157 19.152 12.272 7.482 3.354 15.667 5.199 24.283 5.199s16.801-1.845 24.181-5.162c7.155-3.158 13.632-7.339 19.333-12.378l366-367.035c5.397-5.383 9.775-11.785 12.822-18.894 2.75-6.785 4.259-14.202 4.259-21.972 0-0.453-0.005-0.905-0.015-1.356 0.002-0.015 0.002-0.111 0.002-0.208 0-8.455-1.694-16.514-4.76-23.857-2.613-7.223-6.867-13.729-12.297-19.037l-42.506-43.359c-5.537-4.924-11.896-9.096-18.811-12.264-7.346-3.363-15.385-5.211-23.856-5.211s-16.51 1.848-23.736 5.162c-6.969 3.225-13.27 7.396-18.832 12.376l-281.869 281.025-280.576-279.723c-10.714-10.555-25.431-17.072-41.671-17.072-0.29 0-0.58 0.002-0.869 0.006 0.011-0.001-0.027-0.001-0.066-0.001-8.512 0-16.628 1.693-24.030 4.761-6.981 2.849-13.251 7.256-18.323 12.78l-44.066 41.509z" />
|
||||
<glyph unicode="Ω" glyph-name="beehive" d="M749.721 494.543h-95.087v-232.728h95.087v232.728zM512 853.874l380.343-204.798v-402.154l-380.343-204.8-380.343 204.8v402.154l380.343 204.798zM512 960l-475.429-256v-512l475.429-256 475.429 256v512l-475.429 256zM369.373 354.906h-95.086v-93.091h95.086v93.091zM559.546 634.179h-95.086v-372.365h95.086v372.365z" />
|
||||
<glyph unicode="π" glyph-name="academy" d="M487.166 82.894c-66.404 0-348.164 62.974-348.164 189.082v141.312l337.148-136.549c3.235-1.348 6.993-2.133 10.938-2.133s7.704 0.783 11.127 2.201l333.233 134.943 3.724-1.843v-138.239c0-126.104-281.604-189.082-348.010-189.082l0.004 0.308zM1023.687 64l-65.319 78.49-65.474-78.49v363.569c0 3.379 0 16.742 0 16.742l-183.391 92.159 314.497-69.12-0.313-403.351zM949.057 520.96l-358.248 69.58c-4.658 0.072-7.647-2.885-7.647-6.532 0-2.16 1.045-4.075 2.665-5.281l193.028-126.732-291.689-118.119-439.014 177.883c-39.341 15.941-58.311 60.755-42.371 100.097 7.812 19.28 23.105 34.569 42.386 42.377l438.999 177.767 461.854-187.022c34.251-13.869 50.773-52.879 36.904-87.129-6.793-16.777-20.094-30.085-36.867-36.889z" />
|
||||
<glyph unicode="–" glyph-name="recaptcha" d="M114.335 124.187c-38.041-38.154-75.279-75.503-113.445-113.782v7.172c0 130.93 0.028 261.861-0.040 392.791-0.007 14.057-1.071 28.124-0.808 42.171 2.28 121.833 41.967 229.877 119.48 323.798 19.492 23.619 41.184 45.108 64.736 64.685 0.938 0.779 1.846 1.601 2.712 2.459 0.304 0.301 0.441 0.772 0.8 1.433-37.48 37.561-74.974 75.135-112.467 112.709 0.162 0.473 0.324 0.945 0.486 1.418h5.583c130.729 0 261.457-0.032 392.187 0.044 14.935 0.008 29.878 1.111 44.804 0.885 118.38-1.799 223.831-39.896 316.319-113.972 26.184-20.971 49.824-44.586 71.313-70.366 1.057-1.268 2.177-2.484 3.544-4.039 37.904 38.044 75.565 75.844 113.225 113.646 0.413-0.171 0.824-0.34 1.236-0.51v-435.802h-434.84c-0.515 0.627-1.032 1.254-1.546 1.88 1.607 0.878 3.531 1.437 4.776 2.681 41.474 41.477 82.844 83.060 124.384 124.469 3.17 3.16 3.269 5.171 0.79 8.74-42.557 61.26-100.337 97.799-174.249 108.273-9.338 1.323-18.663 2.781-28.036 3.77-6.083 0.642-6.14 0.313-6.132-5.734 0.066-54.452 0.14-108.904 0.211-163.356 0.003-1.757 0-3.512 0-5.269l-2.322-1.681c-0.946 1.753-1.543 3.855-2.89 5.209-41.035 41.268-82.179 82.427-123.169 123.742-3.057 3.081-5.071 3.514-8.748 0.971-57.225-39.573-93.054-93.281-106.403-161.784-2.449-12.569-3.991-25.32-5.808-38.007-0.971-6.785-0.603-7.092 6.098-7.086 54.153 0.054 108.305 0.117 162.457 0.177 1.663 0.002 3.325 0.001 6.305 0.001-1.874-1.993-2.994-3.246-4.178-4.434-41.092-41.212-82.137-82.471-123.375-123.535-3.613-3.598-3.642-5.929-0.847-9.944 41.284-59.287 97.11-95.568 168.433-107.409 10.496-1.743 21.026-3.747 31.614-4.383 22.49-1.348 44.651 1.572 66.59 6.665 38.584 8.955 71.277 28.858 101.054 54.209 22.663 19.296 41.229 42.027 55.808 68.022 0.29 0.518 0.675 0.982 1.395 2.017 1.328-1.186 2.569-2.178 3.678-3.299 47.473-48.004 94.944-96.009 142.393-144.039 12.558-12.713 24.964-25.578 37.617-38.196 2.631-2.624 2.641-4.311 0.394-7.201-32.139-41.306-69.537-77.049-112.435-106.946-56.715-39.528-118.882-66.473-186.51-80.653-25.087-5.259-50.414-8.57-76.035-9.951-25.784-1.389-51.524-1.133-77.195 1.293-55.054 5.206-107.949 18.945-158.537 41.439-34.715 15.435-66.629 35.527-97.999 56.924-34.407 23.469-62.862 52.803-89.716 84.102-0.788 0.919-1.461 1.938-2.691 3.585z" />
|
||||
<glyph unicode="—" glyph-name="hustle" d="M441.6 435.2l172.8 115.2v-89.6l204.8 89.6-262.4-204.8v89.6l-115.2-89.6v89.6zM921.6 960c25.6-6.4 44.8-19.2 64-32 12.8-12.8 19.2-25.6 25.6-38.4 6.4-25.6 12.8-38.4 12.8-57.6v-768c0-32-12.8-64-38.4-89.6s-57.6-38.4-89.6-38.4c-32 0-64 12.8-89.6 38.4s-38.4 57.6-38.4 89.6c0 102.4-134.4 121.6-307.2 128v-102.4c0-19.2 0-38.4-12.8-57.6-6.4-19.2-19.2-38.4-32-51.2s-32-25.6-51.2-32c-19.2-12.8-38.4-12.8-57.6-12.8s-38.4 0-57.6 12.8c-19.2 6.4-38.4 19.2-51.2 32s-25.6 32-32 51.2c-6.4 19.2-12.8 38.4-12.8 57.6v115.2c-32 12.8-51.2 32-70.4 57.6-19.2 19.2-32 51.2-32 83.2v32c-12.8 6.4-25.6 12.8-38.4 25.6-6.4 12.8-12.8 32-12.8 44.8s6.4 32 12.8 44.8c12.8 12.8 25.6 19.2 38.4 25.6v32c0 38.4 19.2 76.8 44.8 108.8 32 25.6 70.4 44.8 108.8 44.8h153.6c224 0 409.6 6.4 409.6 128 0 25.6 6.4 51.2 19.2 70.4s32 38.4 57.6 44.8c25.6 12.8 51.2 12.8 76.8 12.8zM320 38.4c12.8 0 19.2 6.4 25.6 12.8v0c6.4 6.4 6.4 12.8 12.8 19.2 0 6.4 6.4 12.8 6.4 19.2v102.4h-108.8v-102.4c0-12.8 0-19.2 6.4-32 6.4-6.4 12.8-12.8 25.6-19.2 6.4 0 19.2 0 32 0zM915.2 44.8c6.4 6.4 6.4 12.8 6.4 19.2v768c0 6.4 0 12.8-6.4 19.2s-12.8 6.4-19.2 6.4c-6.4 0-12.8 0-19.2-6.4s-6.4-12.8-6.4-19.2c0-230.4-307.2-230.4-512-230.4h-153.6c-12.8 0-25.6-6.4-32-19.2-12.8-6.4-19.2-19.2-19.2-32v-204.8c0-12.8 6.4-25.6 19.2-32 6.4-6.4 19.2-12.8 32-19.2h153.6c204.8 0 512 0 512-230.4 0-6.4 0-12.8 6.4-19.2s12.8-6.4 19.2-6.4c6.4 0 12.8 0 19.2 6.4z" />
|
||||
<glyph unicode="‘" glyph-name="community-people" d="M1007.275 365.996l-174.251 82.773c41.455 28.313 68.313 75.348 68.313 128.655 0 1.33-0.017 2.656-0.050 3.978 0.004 82.919-57.852 150.162-129.191 150.162-25.188-0.030-48.474-8.152-67.404-21.904 11.888-28.284 18.593-61.357 18.593-95.996 0-0.070 0-0.141 0-0.211 0-0.031 0-0.081 0-0.131 0-51.921-15.274-100.275-41.573-140.813 9.235-8.759 19.124-17.128 30.090-23.927l0.561-0.324 111.787-53.248c30.676-16.277 51.214-48.016 51.214-84.552 0-0.575-0.005-1.148-0.015-1.721l0.001-144.981h119.467c16.264 1.302 28.97 14.821 28.97 31.308 0 0.995-0.046 1.978-0.137 2.949l0.009 136.409c0.025 0.492 0.040 1.069 0.040 1.649 0 12.584-6.809 23.577-16.945 29.496zM314.881 449.11c9.565 6.404 17.855 13.609 25.152 21.725-26.524 40.018-42.391 89.074-42.391 141.835 0 0.278 0 0.557 0.001 0.835 0-0.022 0 0.003 0 0.028 0 35.404 7.023 69.167 19.751 99.973-18.433 10.702-40.452 18.255-64.218 18.569-71.416 0.001-129.272-67.242-129.272-150.357-0.034-1.201-0.053-2.615-0.053-4.033 0-53.923 27.603-101.4 69.45-129.070l-174.869-82.619c-10.863-5.857-18.121-17.153-18.121-30.144 0-0.503 0.011-1.003 0.032-1.5l-0.002-138.169c-0.081-0.847-0.127-1.83-0.127-2.825 0-16.487 12.706-30.007 28.859-31.301l115.823-0.007v145.067c-0.006 0.392-0.009 0.856-0.009 1.32 0 37.149 21.309 69.32 52.37 84.959zM800.939 346.71l-214.699 102.229c28.689 18.918 51.133 45.202 64.919 76.188 12.279 26.534 19.194 56.282 19.22 87.643-0.152 18.264-2.571 35.885-6.988 52.696-18.612 76.678-79.711 135.046-153.268 135.046s-131.584-56.491-151.381-132.949c-4.769-16.314-7.621-35.084-7.849-54.485-0.002-0.29-0.002-0.481-0.002-0.673 0-32.828 7.622-63.876 21.193-91.47 14.181-29.538 36.602-54.589 64.276-72.084l-60.551-29.096-155.648-72.533c-13.416-7.233-22.379-21.184-22.379-37.228 0-0.472 0.008-0.942 0.023-1.411l-0.002-170.598c-0.112-1.107-0.176-2.392-0.176-3.692 0-20.471 15.808-37.25 35.883-38.796l553.946-0.008c20.092 1.681 35.762 18.402 35.762 38.784 0 0.946-0.034 1.884-0.1 2.812l0.007 170.542c0.016 0.427 0.024 0.929 0.024 1.432 0 15.977-8.889 29.878-21.99 37.028z" />
|
||||
<glyph unicode="’" glyph-name="indent-more" d="M910.421 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM910.421 127.979h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM954.325 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM954.325 594.795c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.469c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM71.317 347.2c2.052 0.012 3.903 0.868 5.225 2.237l159.639 92.141c2.235 1.239 3.726 3.58 3.733 6.271 0 0.013 0 0.027 0 0.041 0 2.96-1.757 5.509-4.285 6.661l-0.046 0.019-159.189 92.139c-1.314 1.268-3.105 2.051-5.079 2.051-3.974 0-7.209-3.17-7.315-7.119v-187.124c0-4.041 3.276-7.317 7.317-7.317z" />
|
||||
<glyph unicode="‚" glyph-name="upfront" horiz-adv-x="1000" d="M604.501 902.144l82.603-15.189 16.043-200.021-71.68 47.616-173.568 31.915zM166.912 374.955l3.755 125.952-90.112-84.139zM823.808 379.733l153.6 74.069-19.968 254.464-168.789 113.493zM831.829 277.333v0c-59.051-28.672-142.848-68.267-233.301-111.616l184.32-89.429c113.835 54.443 217.429 104.789 217.088 107.691l-13.653 168.277zM175.787 635.733v0l311.296 287.403-196.949 36.864-271.872-251.733-7.68-226.133zM5.973 345.6l-5.973-173.739 488.107-235.861s84.139 39.595 183.979 86.869z" />
|
||||
<glyph unicode="“" glyph-name="send" d="M1023.402 916.159l-147.45-837.616c-5.008-28.45-32.131-47.453-60.581-42.445-2.635 0.464-5.23 1.129-7.763 1.99l-207.048 70.371c-14.31 4.864-30.141 0.626-40.108-10.735l-130.758-149.054c-13.607-15.511-37.212-17.055-52.723-3.447-8.086 7.094-12.723 17.328-12.723 28.085v200.199c0 8.707 3.041 17.14 8.597 23.843l466.486 562.749-580.279-485.010c-10.358-8.657-24.581-11.054-37.204-6.268l-197.428 74.848c-19.294 7.314-29.005 28.885-21.69 48.178 3.067 8.090 8.847 14.865 16.352 19.168l948.942 544.034c17.901 10.262 40.731 4.071 50.994-13.83 4.347-7.583 5.898-16.45 4.383-25.059z" />
|
||||
<glyph unicode="”" glyph-name="indent-less" d="M910.047 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM910.047 127.979h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM953.951 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM953.951 594.795c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.469c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM63.625 448c0-0.012 0-0.026 0-0.040 0-2.96 1.757-5.509 4.285-6.661l0.046-0.019 159.040-91.84c1.295-1.292 3.085-2.091 5.061-2.091 0.007 0 0.012 0 0.019 0-0.001 0 0 0 0.001 0 3.989 0 7.231 3.191 7.315 7.161v186.974c0 4.041-3.276 7.317-7.317 7.317-0.007 0-0.014 0-0.021 0-2.049 0-3.897-0.86-5.201-2.236l-159.64-92.141c-2.16-1.262-3.588-3.569-3.588-6.209 0-0.075 0.001-0.148 0.004-0.222z" />
|
||||
<glyph unicode="„" glyph-name="drag" d="M352 704c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 704c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM352 352c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 352c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM352 0c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 0c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96z" />
|
||||
<glyph unicode="†" glyph-name="pause" d="M320 832h64c35.346 0 64-28.654 64-64v-640c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64zM640 832h64c35.346 0 64-28.654 64-64v-640c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="‡" glyph-name="smush" d="M512 960c-277.943 0-512-234.057-512-512s234.057-512 512-512 512 226.743 512 512-226.743 512-512 512zM512 38.4c-80.457 0-153.6 73.143-153.6 153.6s73.143 153.6 153.6 153.6 153.6-73.143 153.6-153.6-73.143-153.6-153.6-153.6zM789.943 265.143c-7.314-21.943-7.314-43.886-21.943-58.514-7.314 65.829-29.257 124.343-80.457 168.229-43.886 43.886-109.714 73.143-175.543 73.143-51.2 0-102.4-14.629-146.286-43.886-36.571-21.943-73.143-65.829-87.771-109.714-7.314-29.257-21.943-58.514-21.943-95.086-14.629 36.571-21.943 73.143-21.943 117.029 0 80.457 29.257 146.286 80.457 197.486s117.029 87.771 197.486 87.771c58.514 0 109.714-14.629 160.914-43.886 43.886-29.257 80.457-73.143 102.4-124.343 21.943-58.514 21.943-117.029 14.629-168.229zM892.343 301.714c0 7.314 0 7.314 0 14.629 0 102.4-43.886 197.486-109.714 270.629s-168.229 117.029-270.629 117.029c-80.457 0-146.286-21.943-212.114-65.829s-117.029-102.4-146.286-175.543c-21.943-51.2-29.257-109.714-29.257-160.914-14.629 51.2-21.943 95.086-21.943 146.286 0 109.714 43.886 212.114 117.029 292.571s182.857 117.029 292.571 117.029c80.457 0 160.914-21.943 226.743-65.829s117.029-109.714 146.286-182.857c36.571-80.457 43.886-160.914 29.257-241.371-7.314-21.943-14.629-43.886-21.943-65.829z" />
|
||||
<glyph unicode="•" glyph-name="align-x-right" d="M832 960c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64s-64 28.654-64 64v896c0 35.346 28.654 64 64 64zM192 704h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="…" glyph-name="more" d="M236.715 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272zM630.272 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272zM1024 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272z" />
|
||||
<glyph unicode="‰" glyph-name="undo" d="M322.35 672.58c1.28 1.166 2.571 2.322 3.872 3.467 69.009 60.732 161.584 87.586 253.821 71.323 165.344-29.155 275.747-186.827 246.593-352.171s-186.827-275.747-352.171-246.593c-77.947 13.744-145.751 56.436-191.797 118.844-26.232 35.553-76.318 43.109-111.871 16.877s-43.109-76.318-16.877-111.871c70.189-95.128 173.971-160.472 292.762-181.418 252.367-44.499 493.024 124.011 537.524 376.378s-124.011 493.024-376.378 537.524c-140.63 24.797-282.185-16.266-387.309-108.781-5.96-5.245-11.78-10.637-17.455-16.171l-48.279 43.47c-11.75 10.579-26.999 16.435-42.81 16.439-35.346 0.008-64.006-28.639-64.014-63.986l-0.048-215.702c0-2.244 0.117-4.487 0.352-6.718 3.703-35.152 35.2-60.646 70.352-56.944l214.515 22.595c15.724 1.656 30.278 9.074 40.857 20.824 23.651 26.267 21.53 66.734-4.737 90.386l-46.901 42.23z" />
|
||||
<glyph unicode="‹" glyph-name="wpmudev-logo" d="M95.982 447.999c0 229.761 186.258 416.019 416.019 416.019s416.017-186.258 416.017-416.019c0-229.761-186.256-416.017-416.017-416.017s-416.019 186.256-416.019 416.017zM512.001 960c-282.77 0-512.001-229.231-512.001-512.001 0-282.768 229.231-511.999 512.001-511.999 282.768 0 511.999 229.231 511.999 511.999 0 282.77-229.231 512.001-511.999 512.001zM649.42 215.916c14.967-7.538 31.495-11.447 48.253-11.415 16.784-0.019 33.332 3.89 48.33 11.415 15.255 7.583 27.969 19.466 36.569 34.176 9.099 15.14 13.834 32.506 13.668 50.172v394.469h-70.54v-394.469c0.025-3.359-0.646-6.687-1.977-9.771s-3.283-5.855-5.746-8.139c-5.625-4.94-12.855-7.659-20.336-7.659s-14.711 2.719-20.336 7.659c-2.438 2.297-4.377 5.075-5.695 8.158-1.312 3.077-1.983 6.399-1.958 9.752v298.705c0.345 12.655-1.907 25.248-6.61 37.003-4.696 11.755-11.754 22.424-20.732 31.351-18.591 17.559-43.194 27.341-68.767 27.341s-50.173-9.783-68.764-27.341c-8.979-8.927-16.034-19.595-20.737-31.351-4.701-11.755-6.95-24.348-6.604-37.003v-298.705c0.008-3.359-0.671-6.681-2.001-9.758-1.328-3.084-3.275-5.855-5.723-8.152-5.623-4.94-12.852-7.659-20.335-7.659s-14.71 2.719-20.336 7.659c-2.459 2.284-4.416 5.055-5.746 8.139s-2.005 6.412-1.979 9.771v298.705c0.274 12.681-2.031 25.287-6.774 37.053s-11.824 22.444-20.817 31.391-19.708 15.977-31.495 20.661c-11.789 4.684-24.406 6.926-37.087 6.591-26.364 0.441-51.871-9.361-71.156-27.341-9.622-8.555-17.272-19.098-22.418-30.9s-7.664-24.584-7.384-37.455v-394.47h69.995v394.47c-0.008 3.355 0.671 6.675 2.001 9.755s3.277 5.856 5.723 8.153c2.691 2.64 5.907 4.686 9.442 6.005 3.532 1.317 7.302 1.881 11.065 1.65 3.762 0.205 7.524-0.369 11.052-1.686s6.747-3.349 9.453-5.969c2.437-2.3 4.375-5.077 5.693-8.157s1.985-6.401 1.963-9.751v-298.705c-0.273-12.689 2.033-25.301 6.781-37.074 4.747-11.767 11.836-22.454 20.835-31.398 9.001-8.946 19.724-15.978 31.52-20.655 11.798-4.684 24.421-6.917 37.108-6.571 26.359-0.41 51.856 9.388 71.156 27.343 9.595 8.581 17.225 19.126 22.367 30.926 5.144 11.793 7.679 24.565 7.435 37.433v298.705c0.089 5.020 1.647 9.904 4.481 14.050s6.82 7.369 11.466 9.274 9.749 2.408 14.677 1.445c4.928-0.962 9.467-3.348 13.055-6.859 2.446-2.297 4.396-5.071 5.723-8.153 1.329-3.080 2.009-6.401 2.001-9.755v-298.705c-0.201-17.673 4.534-35.046 13.671-50.172 8.598-14.717 21.31-26.594 36.572-34.176z" />
|
||||
<glyph unicode="›" glyph-name="logout" d="M640 384h-256c-35.346 0-64 28.654-64 64s28.654 64 64 64h256v80.297c0 15.811 5.852 31.062 16.429 42.814 23.645 26.273 64.112 28.402 90.385 4.757l160.33-144.297c1.668-1.501 3.256-3.089 4.757-4.757 23.645-26.273 21.516-66.739-4.757-90.385l-160.33-144.297c-11.752-10.577-27.003-16.429-42.814-16.429-35.346 0-64 28.654-64 64v80.297zM192 64h320c35.346 0 64-28.654 64-64s-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64s-28.654-64-64-64h-320v-768z" />
|
||||
<glyph unicode="⁄" glyph-name="wrench-tool" d="M926.35 751.857l-141.849-141.849c-1.839-0.116-3.989-0.181-6.154-0.181-57.726 0-104.521 46.795-104.521 104.521 0 2.165 0.065 4.315 0.196 6.447l54.336 54.058 87.499 87.499c1.356 1.329 2.196 3.18 2.196 5.225s-0.841 3.896-2.195 5.224c-0.518 0.466-1.108 0.864-1.748 1.176l-0.046 0.021h-1.195c-29.451 13.406-63.872 21.218-100.119 21.218-136.314 0-246.818-110.504-246.818-246.818 0-26.508 4.178-52.038 11.912-75.971l-258.058-255.822c-86.304-1.44-155.716-71.741-155.716-158.253 0-87.412 70.863-158.275 158.275-158.275 86.514 0 156.813 69.41 158.251 155.58l257.57 257.853c22.47-7.454 48.34-11.755 75.213-11.755 136.15 0 246.52 110.371 246.52 246.52 0 36.432-7.903 71.019-22.090 102.139l0.63-0.2c-0.273 0.511-0.569 0.951-0.906 1.357-1.319 1.343-3.168 2.183-5.215 2.183s-3.896-0.841-5.224-2.195zM288.026 158.329c-0.17-35.991-29.385-65.1-65.399-65.1-36.12 0-65.4 29.281-65.4 65.4 0 36.014 29.111 65.229 65.085 65.399 0.105 0.001 0.21 0.001 0.315 0.001 36.12 0 65.4-29.281 65.4-65.4 0-0.105 0-0.211-0.001-0.315z" />
|
||||
<glyph unicode="€" glyph-name="tracking-disabled" d="M750.246 672.721l-58.326 44.618c-6.704 4.526-12.068 10.023-16.090 16.489s-6.704 13.579-8.045 21.339c-3.352 16.813 0.168 32.17 10.559 46.073s24.303 22.471 41.734 25.704l213.193 35.888c1.341 0.647 2.514 0.97 3.52 0.97h3.52c17.431 1.293 32.85-3.718 46.259-15.034s20.783-25.38 22.124-42.193l15.084-208.539c0.67-7.76-0.168-15.358-2.514-22.794s-5.866-14.064-10.559-19.884c-11.397-13.579-25.811-21.339-43.242-23.279s-33.186 2.263-47.264 12.609l-57.321 43.648-282.581-305.535c-13.408-14.873-30.169-22.632-50.281-23.279s-37.543 5.82-52.293 19.399l-137.771 130.943-217.216-227.939c-13.408-13.579-29.834-20.854-49.276-21.824s-36.203 5.011-50.281 17.944c-14.749 12.933-22.459 28.775-23.129 47.528s5.698 35.241 19.107 49.468l266.491 279.346c13.408 14.226 30.169 21.501 50.281 21.824s37.208-6.305 51.287-19.884l136.765-129.003 226.266 245.398zM916.449 193.215l64.249-64.249c11.828-11.828 11.828-31.005 0-42.832l-42.832-42.832c-11.828-11.828-31.005-11.828-42.832 0l-64.249 64.249-64.249-64.249c-11.828-11.828-31.005-11.828-42.832 0l-42.832 42.832c-11.828 11.828-11.828 31.005 0 42.832l64.249 64.249-64.249 64.249c-11.828 11.828-11.828 31.005 0 42.832l42.832 42.832c11.828 11.828 31.005 11.828 42.832 0l64.249-64.249 64.249 64.249c11.828 11.828 31.005 11.828 42.832 0l42.832-42.832c11.828-11.828 11.828-31.005 0-42.832l-64.249-64.249z" />
|
||||
<glyph unicode="™" glyph-name="cloud" d="M707.353 621.728c-20.538 0-40.23-3.466-58.468-9.82-21.468 90.3-104.946 156.092-204.508 156.092-107.128 0-195.634-76.172-209.42-174.917-130.164-5.35-233.99-106.654-234.954-231.337-0.002-128.739 114.686-233.746 249.172-233.746h585.729c102.892 0 186.43 78.231 189.092 175.7-0.074 84.722-62.534 155.249-145.738 172.055-10.65 82.51-83.020 145.972-170.904 145.972z" />
|
||||
<glyph unicode="∂" glyph-name="smart-crawl" d="M739.562 788.568c-67.358 45.008-146.549 69.032-227.562 69.032-108.632 0-212.816-43.154-289.631-119.969s-119.969-180.999-119.969-289.631c0-53.765 10.583-106.731 30.857-155.962l411.967 411.962h-84.424v51.2h204.801v-204.8h-51.2v85.202l-431.481-431.482c31.394-42.365 70.593-78.16 115.343-105.53l247.014 247.010h-84.477v51.2h204.801v-204.8h-51.2v85.153l-221.158-221.162c64.219-19.456 132.454-22.894 198.665-9.721 79.456 15.806 152.438 54.814 209.723 112.098s96.293 130.267 112.098 209.723c15.799 79.453 7.695 161.81-23.303 236.655-31.006 74.845-83.507 138.815-150.864 183.822zM227.547 873.713c84.198 56.259 183.189 86.287 284.453 86.287 135.793 0 266.021-53.944 362.035-149.962 96.022-96.018 149.965-226.246 149.965-362.038 0-101.263-30.032-200.25-86.287-284.453-56.262-84.194-136.222-149.818-229.778-188.577-93.555-38.744-196.504-48.889-295.822-29.133s-190.546 68.52-262.151 140.127c-71.605 71.607-120.369 162.831-140.125 262.149s-9.615 202.265 29.137 295.821c38.752 93.555 104.374 173.519 188.573 229.778z" />
|
||||
<glyph unicode="∆" glyph-name="book" d="M892.798 776.531v0c0 10.721-8.691 19.413-19.413 19.413h-40.32v-716.8c-0.075-10.484-8.385-19.003-18.779-19.411l-604.389-0.001c-9.345 0.103-17.108 6.741-18.943 15.553l-0.021 42.836h562.987c10.74 0.085 19.413 8.811 19.413 19.563 0 0 0 0 0 0.001v0 738.752c0 0 0 0 0 0.001 0 10.752-8.673 19.478-19.405 19.563h-603.166c-10.804 0-19.563-8.758-19.563-19.563s0 0 0-0.747v-855.381s0 0 0 0 0 0 0 0v-0.896c0.085-10.74 8.811-19.413 19.563-19.413 0 0 0 0 0.001 0h722.624c10.74 0.085 19.413 8.811 19.413 19.563 0 0 0 0 0 0.001v0z" />
|
||||
<glyph unicode="∏" glyph-name="calendar" d="M947.712 597.675h-871.424c0 0-0.001 0-0.001 0-9.931 0-17.993-8.002-18.090-17.911v-625.673c0-9.991 8.099-18.091 18.091-18.091h871.424c0.051-0.001 0.111-0.001 0.171-0.001 9.897 0 17.92 8.023 17.92 17.92 0 0.060 0 0.121-0.001 0.181v625.655c0.001 0.051 0.001 0.111 0.001 0.171 0 9.897-8.023 17.92-17.92 17.92-0.060 0-0.121 0-0.181-0.001zM360.618 68.779c-31.96 0.064-62.513 6.006-90.661 16.801-1.627 0.778-3.962 4.026-3.962 7.818 0 0.406 0.027 0.805 0.079 1.197l8.358 61.223c0.395 2.762 1.989 5.086 4.227 6.463 1.187 0.588 2.537 0.919 3.965 0.919s2.778-0.331 3.979-0.92c23.432-9.491 50.672-15.011 79.201-15.011 0.937 0 1.873 0.006 2.807 0.018 31.261-0.001 53.106 14.847 53.106 36.009 0 26.283-12.629 40.448-82.091 44.373-4.77 0.279-8.533 4.215-8.533 9.031 0 0.005 0 0.010 0 0.015v60.927c0 0.008 0 0.017 0 0.026 0 4.755 3.67 8.654 8.332 9.018 60.106 4.781 66.591 21.847 66.591 36.013 0 9.045 0 24.405-40.448 24.405-24.992-0.457-48.421-6.714-69.134-17.477-0.327-0.196-1.737-0.55-3.229-0.55s-2.902 0.355-4.149 0.984c-2.488 1.281-4.294 3.707-4.72 6.583l-8.369 61.147c-0.051 0.36-0.080 0.776-0.080 1.199 0 3.599 2.102 6.707 5.145 8.164 28.28 12.188 61.139 19.262 95.651 19.262 2.753 0 5.495-0.045 8.226-0.134 72.818 0.010 121.97-34.123 121.97-85.323 0-37.888-19.627-65.877-59.904-85.333 34.133-13.312 69.803-37.547 69.803-88.576 0-73.045-61.269-119.467-156.331-119.467zM740.864 82.432c0-4.996-4.050-9.045-9.045-9.045h-74.069c-4.996 0-9.045 4.050-9.045 9.045v246.101l-48.981-18.603c-1.147-0.565-2.498-0.896-3.925-0.896s-2.778 0.331-3.979 0.92c-2.26 1.339-3.87 3.682-4.209 6.419l-8.367 61.312c-0.053 0.365-0.084 0.787-0.084 1.216 0 3.504 2.031 6.534 4.981 7.977l106.719 52.759c1.19 0.626 2.597 1.003 4.089 1.024h37.212c4.858-0.175 8.73-4.155 8.73-9.040 0-0.242-0.010-0.482-0.028-0.72l0.002-348.47zM947.712 879.445h-92.843v-43.52c0-46.080-26.283-95.232-100.181-95.232s-100.181 48.64-100.181 95.232v43.52h-283.819v-43.52c0-46.080-26.283-95.232-100.181-95.232s-100.352 48.64-100.352 95.232v43.52h-93.867c-0.051 0.001-0.111 0.001-0.171 0.001-9.897 0-17.92-8.023-17.92-17.92 0-0.060 0-0.121 0.001-0.181v-183.116c0-9.991 8.099-18.091 18.091-18.091h871.424c0.051-0.001 0.111-0.001 0.171-0.001 9.897 0 17.92 8.023 17.92 17.92 0 0.060 0 0.121-0.001 0.181v183.116c0.001 0.051 0.001 0.111 0.001 0.171 0 9.897-8.023 17.92-17.92 17.92-0.060 0-0.121 0-0.181-0.001zM270.506 798.891c29.867 0 41.984 10.752 41.984 37.035v86.869c0 26.453-12.117 37.205-41.984 37.205s-41.643-10.752-41.643-37.205v-86.869c0-26.453 12.117-37.035 41.984-37.035zM754.688 798.891c29.867 0 41.984 10.752 41.984 37.035v86.869c0 26.453-12.288 37.205-41.984 37.205s-41.984-10.752-41.984-37.205v-86.869c0-26.453 12.117-37.035 41.984-37.035z" />
|
||||
<glyph unicode="∑" glyph-name="gdpr" d="M512-64c-341.333 213.333-512 469.333-512 768 170.667 0 341.333 85.333 512 256 170.667-170.667 341.333-256 512-256 0-298.667-170.667-554.667-512-768zM762.5 598.5l-34 34c-2.333 2.333-4.917 4.167-7.75 5.5s-5.917 2-9.25 2c-3.333 0-6.5-0.667-9.5-2s-5.667-3.167-8-5.5l-251.5-252.5-111 111c-2 2.333-4.5 4.083-7.5 5.25s-6.167 1.75-9.5 1.75c-3.333 0-6.417-0.583-9.25-1.75s-5.417-2.917-7.75-5.25l-34-34c-2.333-2.333-4.167-4.917-5.5-7.75s-2-5.917-2-9.25c0-3.333 0.667-6.5 2-9.5s3.167-5.667 5.5-8l145.5-144c4.333-4.333 9.333-7.75 15-10.25s11.833-3.75 18.5-3.75c6.667 0 12.917 1.25 18.75 3.75s10.917 5.917 15.25 10.25l286 286c2.333 2.333 4.083 5 5.25 8s1.75 6.167 1.75 9.5c0 3.333-0.583 6.417-1.75 9.25s-2.917 5.417-5.25 7.75v-0.5z" />
|
||||
<glyph unicode="√" glyph-name="bookmark" d="M256 960v-1024l256 256 256-256v1024h-512z" />
|
||||
<glyph unicode="∞" glyph-name="layout-grid" d="M464 512h96c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64zM128 896h96c35.346 0 64-28.654 64-64v-416c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v416c0 35.346 28.654 64 64 64zM128 256h96c35.346 0 64-28.654 64-64v-128c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v128c0 35.346 28.654 64 64 64zM800 896h96c35.346 0 64-28.654 64-64v-320c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v320c0 35.346 28.654 64 64 64zM800 352h96c35.346 0 64-28.654 64-64v-224c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v224c0 35.346 28.654 64 64 64zM464 896h96c35.346 0 64-28.654 64-64v-160c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v160c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="∫" glyph-name="paint-bucket" d="M907.435 459.947v0l-383.488 383.488c-5.437 5.441-12.949 8.806-21.248 8.806s-15.811-3.365-21.248-8.806l-62.806-62.806-134.485 134.315c-10.895 11.861-26.477 19.268-43.789 19.268-32.801 0-59.392-26.591-59.392-59.392 0-17.609 7.664-33.429 19.837-44.305l133.86-133.853-325.803-325.803c-5.39-5.428-8.721-12.906-8.721-21.163s3.331-15.735 8.723-21.164l383.657-383.657c5.437-5.441 12.949-8.806 21.248-8.806s15.811 3.365 21.248 8.806l472.406 472.576c5.4 5.455 8.736 12.962 8.736 21.248s-3.336 15.793-8.739 21.251zM671.915 349.696h-515.584l346.453 346.453 257.877-257.707zM1002.667 151.040l-71.339 123.563-1.195 2.731c-3.657 4.662-9.29 7.629-15.616 7.629s-11.959-2.967-15.584-7.586l-0.032-0.043v-1.195c-0.98-1.283-1.837-2.743-2.509-4.303l-69.683-120.796c-13.484-18.059-21.589-40.821-21.589-65.475 0-60.796 49.284-110.080 110.080-110.080s110.080 49.284 110.080 110.080c0 24.655-8.105 47.416-21.796 65.766z" />
|
||||
<glyph unicode="≈" glyph-name="finger-point" d="M839.23 548.523c-0.010 0-0.021 0-0.032 0-20.666 0-39.617-7.347-54.382-19.571-7.65 39.865-42.209 69.443-83.676 69.443-21.062 0-40.342-7.631-55.226-20.278-6.564 41.133-41.748 72.072-84.159 72.072-19.772 0-37.974-6.725-52.443-18.012l0.19 242.489c0 47.128-38.205 85.333-85.333 85.333s-85.333-38.205-85.333-85.333v-440.661l-100.352 95.403c-14.507 11.766-33.194 18.891-53.546 18.891-47.128 0-85.333-38.205-85.333-85.333 0-21.842 8.206-41.767 21.704-56.861l110.008-104.536c40.896-39.332 75.123-85.219 101.064-136.040l32.568-64.493c32.768-75.264 102.059-165.035 251.051-165.035 246.784 0 308.395 171.861 308.395 288.085v238.933c0 47.128-38.205 85.333-85.333 85.333z" />
|
||||
<glyph unicode="≠" glyph-name="target" d="M198.338 511.69c32.371-3.182 57.662-30.483 57.662-63.69s-25.291-60.508-57.662-63.69c25.373-125.635 124.337-224.599 249.972-249.972 3.182 32.371 30.483 57.662 63.69 57.662s60.508-25.291 63.69-57.662c125.635 25.373 224.599 124.337 249.972 249.972-32.371 3.182-57.662 30.483-57.662 63.69s25.291 60.508 57.662 63.69c-25.373 125.635-124.337 224.599-249.972 249.972-3.182-32.371-30.483-57.662-63.69-57.662s-60.508 25.291-63.69 57.662c-125.635-25.373-224.599-124.337-249.972-249.972zM68.537 384h-4.537c-35.346 0-64 28.654-64 64s28.654 64 64 64h4.537c28.065 196.204 183.259 351.398 379.463 379.463v4.537c0 35.346 28.654 64 64 64s64-28.654 64-64v-4.537c196.204-28.065 351.398-183.259 379.463-379.463h4.537c35.346 0 64-28.654 64-64s-28.654-64-64-64h-4.537c-28.065-196.204-183.259-351.398-379.463-379.463v-4.537c0-35.346-28.654-64-64-64s-64 28.654-64 64v4.537c-196.204 28.065-351.398 183.259-379.463 379.463zM512 512c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64s-28.654 64-64 64zM512 640c106.039 0 192-85.961 192-192s-85.961-192-192-192c-106.039 0-192 85.961-192 192s85.961 192 192 192z" />
|
||||
<glyph unicode="≤" glyph-name="arrows-in" d="M377.603 70.087l44.959 271.996c0.108 0.699 0.17 1.506 0.17 2.326 0 4.32-1.712 8.241-4.494 11.12l0.005-0.005c-2.874 2.778-6.794 4.49-11.114 4.49-0.82 0-1.628-0.062-2.414-0.181l-270.627-46.228c-6.921-1.864-11.931-8.084-11.931-15.474 0-3.855 1.363-7.391 3.634-10.154l52.937-52.931-142.238-142.718c-2.69-2.856-4.343-6.715-4.343-10.96s1.653-8.104 4.351-10.968l97.911-97.91c2.856-2.69 6.715-4.343 10.96-4.343s8.104 1.653 10.968 4.351l142.069 142.070 53.599-52.799c2.811-2.505 6.539-4.036 10.625-4.036 7.602 0 13.965 5.3 15.595 12.408zM646.398 825.913l-44.959-271.996c-0.108-0.699-0.17-1.506-0.17-2.326 0-4.32 1.712-8.241 4.494-11.12l-0.005 0.005c2.874-2.778 6.794-4.49 11.114-4.49 0.82 0 1.628 0.062 2.414 0.181l270.627 45.748c7.090 1.744 12.266 8.046 12.266 15.557 0 4.037-1.495 7.725-3.962 10.54l-52.943 52.942 142.077 142.077c2.69 2.856 4.343 6.715 4.343 10.96s-1.653 8.104-4.351 10.968l-97.75 98.55c-2.856 2.69-6.715 4.343-10.96 4.343s-8.104-1.653-10.968-4.351l-142.069-142.070-53.599 52.799c-2.811 2.505-6.539 4.036-10.625 4.036-7.602 0-13.965-5.3-15.595-12.408zM889.914 313.603l-271.996 44.959c-0.699 0.108-1.506 0.17-2.326 0.17-4.32 0-8.241-1.712-11.12-4.494l0.005 0.005c-2.778-2.874-4.49-6.794-4.49-11.114 0-0.82 0.062-1.628 0.181-2.414l46.228-270.627c1.701-7.148 8.032-12.383 15.586-12.383 4.099 0 7.838 1.541 10.67 4.076l52.943 52.945 142.077-142.077c2.856-2.69 6.715-4.343 10.96-4.343s8.104 1.653 10.968 4.351l97.91 97.911c2.69 2.856 4.343 6.715 4.343 10.96s-1.653 8.104-4.351 10.968l-142.070 142.069 52.799 53.439c2.505 2.811 4.036 6.539 4.036 10.625 0 7.602-5.3 13.965-12.408 15.595zM134.088 582.397l271.996-44.959c0.699-0.108 1.506-0.17 2.326-0.17 4.32 0 8.241 1.712 11.12 4.494l-0.005-0.005c2.778 2.874 4.49 6.794 4.49 11.114 0 0.82-0.062 1.628-0.181 2.414l-46.228 270.627c-1.864 6.921-8.084 11.931-15.474 11.931-3.855 0-7.391-1.363-10.154-3.634l-53.572-52.937-142.077 142.238c-2.856 2.69-6.715 4.343-10.96 4.343s-8.104-1.653-10.968-4.351l-97.91-97.911c-2.69-2.856-4.343-6.715-4.343-10.96s1.653-8.104 4.351-10.968l142.070-142.069-52.799-53.599c-2.505-2.811-4.036-6.539-4.036-10.625 0-7.602 5.3-13.965 12.408-15.595z" />
|
||||
<glyph unicode="≥" glyph-name="arrows-compress" d="M408.042 79.040l48.96 295.36c0.182 0.906 0.286 1.946 0.286 3.011 0 4.537-1.888 8.632-4.921 11.543l-0.006 0.006c-3.037 3.021-7.223 4.887-11.846 4.887-1.015 0-2.010-0.090-2.976-0.263l-294.458-49.585c-8.028-1.361-14.065-8.263-14.065-16.576 0-4.652 1.89-8.861 4.944-11.903l57.601-57.601-154.56-154.56c-2.923-3.019-4.724-7.139-4.724-11.68s1.802-8.661 4.729-11.684l107.035-107.035c3.044-3.065 7.261-4.961 11.92-4.961s8.876 1.897 11.919 4.96l154.081 155.041 57.6-57.6c3.042-3.055 7.253-4.945 11.904-4.945 8.313 0 15.215 6.038 16.562 13.966zM616.041 816.96l-49.12-295.36c-0.143-0.823-0.224-1.77-0.224-2.737 0-4.612 1.858-8.788 4.866-11.825l-0.001 0.001c3.060-3.015 7.263-4.876 11.901-4.876 0.996 0 1.972 0.086 2.921 0.25l294.619 49.585c8.028 1.361 14.065 8.263 14.065 16.576 0 4.652-1.89 8.861-4.944 11.903l-58.081 57.601 154.72 154.72c3.065 3.044 4.961 7.261 4.961 11.92s-1.897 8.876-4.96 11.919l-106.721 106.401c-3.044 3.065-7.261 4.961-11.92 4.961s-8.876-1.897-11.919-4.96l-154.081-155.041-57.6 57.6c-3.042 3.055-7.253 4.945-11.904 4.945-8.313 0-15.215-6.038-16.562-13.966z" />
|
||||
<glyph unicode="◊" glyph-name="key" d="M910.161 573.61h-441.344c-44.245 75.622-125.067 125.611-217.564 125.611-138.746 0-251.221-112.476-251.221-251.221s112.476-251.221 251.221-251.221c92.497 0 173.319 49.989 216.922 124.425l48.087 1.186c0.015 0 0.032 0 0.050 0 2.386 0 4.544 0.98 6.093 2.559l88.236 88.919c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l62.123-62.123c1.547-1.559 3.69-2.524 6.059-2.524s4.512 0.965 6.058 2.524l39.254 39.254c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l45.057-45.398c1.547-1.559 3.69-2.524 6.059-2.524s4.512 0.965 6.058 2.524l44.886 45.057c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l36.353-36.353c1.538-1.508 3.647-2.439 5.973-2.439s4.435 0.931 5.975 2.441l110.42 103.593c1.664 1.561 2.701 3.774 2.701 6.229s-1.037 4.668-2.697 6.225l-105.306 101.38c-1.553 1.476-3.657 2.385-5.972 2.389zM136.529 390.826c-31.355 0.29-56.661 25.775-56.661 57.171 0 31.576 25.597 57.173 57.173 57.173s57.172-25.596 57.173-57.171c0-0.001 0-0.002 0-0.002 0-31.576-25.597-57.173-57.173-57.173-0.18 0-0.36 0.001-0.539 0.002z" />
|
||||
<glyph unicode="❤" glyph-name="site-health" d="M640.39 472.324l-99.392-198.788c-11.999-24.198-46.797-23.398-57.796 1.203l-113.794 252.582-59.996-143.392h-188.189l364.979-372.979c14.199-14.598 37.197-14.598 51.397 0l365.179 372.979h-218.189l-44.198 88.395zM947.373 812.105l-4.8 5c-102.989 105.194-271.584 105.194-374.776 0l-55.796-57.197-55.796 56.996c-102.995 105.394-271.784 105.394-374.778 0l-4.8-4.799c-97.394-99.594-101.594-258.185-14.599-364.179h204.788l71.796 172.39c10.799 25.798 47.197 26.398 58.797 0.8l116.393-258.585 97.994 195.788c11.8 23.599 45.396 23.599 57.198 0l55.194-110.394h237.786c86.995 105.994 82.797 264.585-14.598 364.179z" />
|
||||
<glyph unicode="⤉" glyph-name="async" d="M479.996 768h128c8.487 0 16.626 3.372 22.627 9.373s9.373 14.14 9.373 22.627v64c0 8.487-3.372 16.627-9.373 22.627s-14.14 9.373-22.627 9.373h-128c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.487 3.372-16.627 9.372-22.627s14.141-9.373 22.628-9.373zM479.996 512h255.998c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627v64c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-255.998c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.487 3.372-16.627 9.372-22.627s14.141-9.373 22.628-9.373zM991.994 128h-511.998c-8.487 0-16.627-3.373-22.628-9.37-6.001-6.003-9.372-14.144-9.372-22.63v-64c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37h511.998c8.486 0 16.627 3.373 22.63 9.37 5.997 6.003 9.37 14.144 9.37 22.63v64c0 8.486-3.373 16.627-9.37 22.63-6.003 5.997-14.144 9.37-22.63 9.37zM479.996 256h383.998c8.486 0 16.627 3.373 22.63 9.37 5.997 6.003 9.37 14.144 9.37 22.63v64c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-383.998c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37zM31.995 640h96v-608c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37h64c8.487 0 16.626 3.373 22.627 9.37 6.001 6.003 9.373 14.144 9.373 22.63v608h96c28.42 0 42.78 34.48 22.62 54.62l-160 192c-6 5.996-14.136 9.365-22.62 9.365s-16.62-3.369-22.62-9.365l-160-192c-20.080-20.1-5.82-54.62 22.62-54.62z" />
|
||||
<glyph unicode="⥮" glyph-name="import-export" d="M611.556 652.8h-149.334v-307.2h-248.889v307.2h-149.333l273.778 307.2 273.778-307.2zM686.221-64l273.779 307.2h-149.331v307.2h-248.891v-307.2h-149.334l273.777-307.2z" />
|
||||
<glyph unicode="" glyph-name="video-playlist" d="M320 256c35.328 0 64-28.608 64-64s-28.672-64-64-64h-256c-35.328 0-64 28.608-64 64s28.672 64 64 64h256zM64 768h704c35.392 0 64-28.672 64-64s-28.608-64-64-64h-704c-35.328 0-64 28.672-64 64s28.672 64 64 64zM64 512h704c35.392 0 64-28.672 64-64s-28.608-64-64-64h-704c-35.328 0-64 28.672-64 64s28.672 64 64 64zM512 288h256c35.346 0 64-28.654 64-64v-192c0-35.346-28.654-64-64-64h-256c-35.346 0-64 28.654-64 64v192c0 35.346 28.654 64 64 64zM800 128l192.305 164.833c8.051 6.901 20.172 5.969 27.073-2.083 2.983-3.48 4.622-7.912 4.622-12.495v-300.51c0-10.604-8.596-19.2-19.2-19.2-4.583 0-9.015 1.64-12.495 4.622l-192.305 164.833z" />
|
||||
<glyph unicode="" glyph-name="arrow-left" d="M59.905 468.992l388.949 388.608c5.491 5.46 13.061 8.836 21.419 8.836s15.927-3.375 21.42-8.837l62.463-62.463c5.46-5.491 8.836-13.061 8.836-21.419s-3.375-15.927-8.837-21.42l-229.887-230.057h621.227c0.203 0.006 0.443 0.009 0.683 0.009 14.647 0 26.532-11.828 26.623-26.453v-95.582c0-14.704-11.92-26.624-26.624-26.624h-621.909l230.4-230.4c5.46-5.491 8.836-13.061 8.836-21.419s-3.375-15.927-8.837-21.42l-62.975-61.951c-5.491-5.46-13.061-8.836-21.419-8.836s-15.927 3.375-21.42 8.837l-388.948 388.607c-5.38 5.401-8.706 12.851-8.706 21.077s3.326 15.677 8.707 21.078z" />
|
||||
<glyph unicode="fi" glyph-name="snapshot" horiz-adv-x="939" d="M819.938 747.646h64.259v46.734h-181.092v-186.934h46.734v81.784c58.417-64.259 93.467-146.042 93.467-233.668 5.842-93.467-29.208-186.934-87.625-257.034s-146.042-116.834-239.509-128.517c-93.467-11.683-186.934 11.683-262.876 70.1-75.942 52.575-128.517 134.359-146.042 227.826s0 186.934 46.734 268.718 128.517 140.201 216.143 163.567c93.467 23.367 192.776 11.683 274.559-29.208l40.892 81.784c-52.575 29.208-110.992 46.734-175.251 58.417-58.417 5.842-122.675 0-181.092-17.525s-110.992-46.734-163.567-87.625c-46.734-40.892-81.784-87.625-110.992-146.042s-46.734-116.834-52.575-175.251c-5.842-64.259 0-122.675 23.367-181.092s52.575-110.992 93.467-157.726c40.892-46.734 87.625-81.784 146.042-110.992v0c99.309-52.575 210.301-64.259 315.451-40.892s204.459 87.625 268.718 175.251c64.259 87.625 99.309 198.617 87.625 309.61-5.842 99.309-46.734 192.776-116.834 268.718zM662.212 595.762l-52.575-70.1-128.517 204.459-75.942-52.575 40.892-70.1h-210.301v-93.467h81.784l-116.834-169.409 75.942-52.575 157.726 221.984h70.1l46.734-70.1-46.734-70.1h-75.942l-46.734 70.1-52.575-81.784 128.517-204.459 75.942 52.575-46.734 70.1h216.143v93.467h-81.784l116.834 169.409z" />
|
||||
<glyph unicode="fl" glyph-name="hub" d="M36.571 760.889c0 109.966 87.647 199.111 195.765 199.111s195.765-89.145 195.765-199.111v-113.778c0-31.418-25.042-56.889-55.933-56.889s-55.933 25.471-55.933 56.889v113.778c0 47.128-37.563 85.333-83.899 85.333s-83.899-38.205-83.899-85.333v-625.779c0-47.126 37.563-85.328 83.899-85.328s83.899 38.202 83.899 85.328v85.336c0 31.415 25.042 56.89 55.933 56.89s55.933-25.475 55.933-56.89v-85.336c0-109.963-87.647-199.11-195.765-199.11s-195.765 89.146-195.765 199.11v625.779zM987.429 760.889c0 109.966-87.647 199.111-195.767 199.111-108.112 0-195.762-89.145-195.762-199.111v-113.778c0-31.418 25.042-56.889 55.933-56.889s55.935 25.471 55.935 56.889v113.778c0 47.128 37.559 85.333 83.895 85.333s83.902-38.205 83.902-85.333v-625.779c0-47.126-37.566-85.328-83.902-85.328s-83.895 38.202-83.895 85.328v85.336c0 157.094-125.211 284.443-279.666 284.443h-111.865c-30.891 0-55.933-25.471-55.933-56.889s25.042-56.889 55.933-56.889h111.865c92.673 0 167.799-76.41 167.799-170.665v-85.336c0-109.963 87.65-199.11 195.762-199.11 108.12 0 195.767 89.146 195.767 199.11v625.779z" />
|
||||
<glyph unicode="ffiffi" glyph-name="hub" d="M36.571 760.889c0 109.966 87.647 199.111 195.765 199.111s195.765-89.145 195.765-199.111v-113.778c0-31.418-25.042-56.889-55.933-56.889s-55.933 25.471-55.933 56.889v113.778c0 47.128-37.563 85.333-83.899 85.333s-83.899-38.205-83.899-85.333v-625.779c0-47.126 37.563-85.328 83.899-85.328s83.899 38.202 83.899 85.328v85.336c0 31.415 25.042 56.89 55.933 56.89s55.933-25.475 55.933-56.89v-85.336c0-109.963-87.647-199.11-195.765-199.11s-195.765 89.146-195.765 199.11v625.779zM987.429 760.889c0 109.966-87.647 199.111-195.767 199.111-108.112 0-195.762-89.145-195.762-199.111v-113.778c0-31.418 25.042-56.889 55.933-56.889s55.935 25.471 55.935 56.889v113.778c0 47.128 37.559 85.333 83.895 85.333s83.902-38.205 83.902-85.333v-625.779c0-47.126-37.566-85.328-83.902-85.328s-83.895 38.202-83.895 85.328v85.336c0 157.094-125.211 284.443-279.666 284.443h-111.865c-30.891 0-55.933-25.471-55.933-56.889s25.042-56.889 55.933-56.889h111.865c92.673 0 167.799-76.41 167.799-170.665v-85.336c0-109.963 87.65-199.11 195.762-199.11 108.12 0 195.767 89.146 195.767 199.11v625.779z" />
|
||||
<glyph unicode="zip" glyph-name="zip" d="M755.131 601.565l-230.261 76.87v102.435l230.261-76.87v-102.435zM755.131 447.999l-230.261 76.87v102.261l230.261-76.696v-102.435zM755.131 294.433l-230.261 76.696v102.435l230.261-76.696v-102.435zM755.131 755.129l-230.261 76.87v102.435l230.261-76.87v-102.435zM192.001 473.564v281.565c0 42.453 34.415 76.87 76.87 76.87h588.696c0 70.693-57.308 128-128 128v0h-537.566c-70.653-0.099-127.902-57.348-128-127.99v-434.792c0-0.103 0-0.225 0-0.347 0-70.693 57.308-128 128-128 0 0 0 0 0 0h537.566c0.052 0 0.113 0 0.174 0 70.597 0 127.826 57.229 127.826 127.826 0 0.061 0 0.122 0 0.183v-0.009h-588.696c-0.052 0-0.113 0-0.174 0-42.358 0-76.696 34.338-76.696 76.696 0 0 0 0 0 0v0zM524.87 217.564h230.261v-203.304c0-43.222-35.039-78.261-78.261-78.261v0h-73.739c-43.222 0-78.261 35.039-78.261 78.261v0 203.304zM473.74 63.999c0-42.453-34.415-76.87-76.87-76.87s-76.87 34.415-76.87 76.87c0 42.453 34.415 76.87 76.87 76.87s76.87-34.415 76.87-76.87zM960.001 63.999c0-42.453-34.415-76.87-76.87-76.87s-76.87 34.415-76.87 76.87c0 42.453 34.415 76.87 76.87 76.87s76.87-34.415 76.87-76.87zM448 89.564h384v-51.13h-384v51.13z" />
|
||||
<glyph unicode="wrench_tool" glyph-name="wrench-tool" d="M926.35 751.857l-141.849-141.849c-1.839-0.116-3.989-0.181-6.154-0.181-57.726 0-104.521 46.795-104.521 104.521 0 2.165 0.065 4.315 0.196 6.447l54.336 54.058 87.499 87.499c1.356 1.329 2.196 3.18 2.196 5.225s-0.841 3.896-2.195 5.224c-0.518 0.466-1.108 0.864-1.748 1.176l-0.046 0.021h-1.195c-29.451 13.406-63.872 21.218-100.119 21.218-136.314 0-246.818-110.504-246.818-246.818 0-26.508 4.178-52.038 11.912-75.971l-258.058-255.822c-86.304-1.44-155.716-71.741-155.716-158.253 0-87.412 70.863-158.275 158.275-158.275 86.514 0 156.813 69.41 158.251 155.58l257.57 257.853c22.47-7.454 48.34-11.755 75.213-11.755 136.15 0 246.52 110.371 246.52 246.52 0 36.432-7.903 71.019-22.090 102.139l0.63-0.2c-0.273 0.511-0.569 0.951-0.906 1.357-1.319 1.343-3.168 2.183-5.215 2.183s-3.896-0.841-5.224-2.195zM288.026 158.329c-0.17-35.991-29.385-65.1-65.399-65.1-36.12 0-65.4 29.281-65.4 65.4 0 36.014 29.111 65.229 65.085 65.399 0.105 0.001 0.21 0.001 0.315 0.001 36.12 0 65.4-29.281 65.4-65.4 0-0.105 0-0.211-0.001-0.315z" />
|
||||
<glyph unicode="wpmudev_logo" glyph-name="wpmudev-logo" d="M95.982 447.999c0 229.761 186.258 416.019 416.019 416.019s416.017-186.258 416.017-416.019c0-229.761-186.256-416.017-416.017-416.017s-416.019 186.256-416.019 416.017zM512.001 960c-282.77 0-512.001-229.231-512.001-512.001 0-282.768 229.231-511.999 512.001-511.999 282.768 0 511.999 229.231 511.999 511.999 0 282.77-229.231 512.001-511.999 512.001zM649.42 215.916c14.967-7.538 31.495-11.447 48.253-11.415 16.784-0.019 33.332 3.89 48.33 11.415 15.255 7.583 27.969 19.466 36.569 34.176 9.099 15.14 13.834 32.506 13.668 50.172v394.469h-70.54v-394.469c0.025-3.359-0.646-6.687-1.977-9.771s-3.283-5.855-5.746-8.139c-5.625-4.94-12.855-7.659-20.336-7.659s-14.711 2.719-20.336 7.659c-2.438 2.297-4.377 5.075-5.695 8.158-1.312 3.077-1.983 6.399-1.958 9.752v298.705c0.345 12.655-1.907 25.248-6.61 37.003-4.696 11.755-11.754 22.424-20.732 31.351-18.591 17.559-43.194 27.341-68.767 27.341s-50.173-9.783-68.764-27.341c-8.979-8.927-16.034-19.595-20.737-31.351-4.701-11.755-6.95-24.348-6.604-37.003v-298.705c0.008-3.359-0.671-6.681-2.001-9.758-1.328-3.084-3.275-5.855-5.723-8.152-5.623-4.94-12.852-7.659-20.335-7.659s-14.71 2.719-20.336 7.659c-2.459 2.284-4.416 5.055-5.746 8.139s-2.005 6.412-1.979 9.771v298.705c0.274 12.681-2.031 25.287-6.774 37.053s-11.824 22.444-20.817 31.391-19.708 15.977-31.495 20.661c-11.789 4.684-24.406 6.926-37.087 6.591-26.364 0.441-51.871-9.361-71.156-27.341-9.622-8.555-17.272-19.098-22.418-30.9s-7.664-24.584-7.384-37.455v-394.47h69.995v394.47c-0.008 3.355 0.671 6.675 2.001 9.755s3.277 5.856 5.723 8.153c2.691 2.64 5.907 4.686 9.442 6.005 3.532 1.317 7.302 1.881 11.065 1.65 3.762 0.205 7.524-0.369 11.052-1.686s6.747-3.349 9.453-5.969c2.437-2.3 4.375-5.077 5.693-8.157s1.985-6.401 1.963-9.751v-298.705c-0.273-12.689 2.033-25.301 6.781-37.074 4.747-11.767 11.836-22.454 20.835-31.398 9.001-8.946 19.724-15.978 31.52-20.655 11.798-4.684 24.421-6.917 37.108-6.571 26.359-0.41 51.856 9.388 71.156 27.343 9.595 8.581 17.225 19.126 22.367 30.926 5.144 11.793 7.679 24.565 7.435 37.433v298.705c0.089 5.020 1.647 9.904 4.481 14.050s6.82 7.369 11.466 9.274 9.749 2.408 14.677 1.445c4.928-0.962 9.467-3.348 13.055-6.859 2.446-2.297 4.396-5.071 5.723-8.153 1.329-3.080 2.009-6.401 2.001-9.755v-298.705c-0.201-17.673 4.534-35.046 13.671-50.172 8.598-14.717 21.31-26.594 36.572-34.176z" />
|
||||
<glyph unicode="wordpress" glyph-name="wordpress" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM255.147 644.608c25.259 1.365 47.957 4.096 47.957 4.096 8.85 0.729 15.756 8.091 15.756 17.067 0 9.456-7.665 17.121-17.121 17.121-0.481 0-0.956-0.020-1.427-0.059s-68.205-5.287-111.725-5.287c-7.851 0-17.067 0-26.965 0 76.052 114.526 204.485 188.994 350.311 188.994 109.329 0 208.881-41.857 283.507-110.42l-5.764 0.274c-39.179-1.128-70.51-33.157-70.51-72.505 0-0.67 0.009-1.338 0.027-2.004-0.002-34.035 19.966-63.731 41.129-98.206 21.048-32.798 33.711-72.734 34.132-115.6 0.001-35.952-13.823-77.595-31.914-135.622l-41.813-139.776-150.869 451.925c25.259 1.365 47.957 4.096 47.957 4.096 8.85 0.729 15.756 8.091 15.756 17.067 0 9.456-7.665 17.121-17.121 17.121-0.481 0-0.956-0.020-1.427-0.059s-68.205-5.287-111.725-5.287c-41.131 0-110.421 5.291-110.421 5.291-0.409 0.035-0.885 0.055-1.365 0.055-9.456 0-17.121-7.665-17.121-17.121 0-8.975 6.906-16.337 15.694-17.063s21.395-2.564 44.094-4.1l65.365-179.541-91.819-274.603zM329.045 70.656c-141.030 69.533-236.344 212.284-236.344 377.297 0 61.818 13.377 120.511 37.393 173.343zM519.339 411.989l129.195-353.792c0.957-2.241 1.985-4.148 3.161-5.948-41.53-14.922-89.365-23.635-139.236-23.635-42.262 0-83.063 6.257-121.527 17.896zM722.773 85.675l128 370.347c19.469 44.241 31.134 95.751 31.911 149.895 0.003 0.411 0.004 0.553 0.004 0.694 0 15.086-1.055 29.926-3.094 44.45 32.457-59.671 51.452-128.883 51.452-202.531 0-153.868-82.908-288.372-206.488-361.276z" />
|
||||
<glyph unicode="widget_settings_config" glyph-name="widget-settings-config" d="M938.501 520.575l-113.642 11.2c-8.043 29.678-19.119 55.638-33.222 79.602l73.392 86.905c3.332 4.076 5.35 9.336 5.35 15.068 0 6.596-2.672 12.567-6.993 16.889l-69.143 69.143c-4.324 4.321-10.294 6.993-16.889 6.993-5.733 0-10.994-2.020-15.111-5.385l-88.363-72.543c-22.463 13.288-48.424 24.362-75.854 31.88l-13.449 114.168c-1.253 12.117-11.401 21.488-23.742 21.504h-97.666c-12.343-0.016-22.489-9.387-23.735-21.401l-11.209-113.894c-29.677-8.033-55.636-19.107-79.596-33.22l-86.911 73.39c-4.076 3.332-9.336 5.35-15.068 5.35-6.596 0-12.567-2.672-16.889-6.993l-68.992-68.992c-4.321-4.324-6.993-10.295-6.993-16.889 0-5.731 2.020-10.994 5.385-15.111l72.541-88.363c-13.295-22.465-24.369-48.426-31.882-75.857l-114.316-13.442c-12.117-1.253-21.488-11.403-21.504-23.742v-97.666c0.016-12.343 9.387-22.489 21.401-23.735l113.894-11.209c8.029-29.675 19.103-55.638 33.219-79.594l-73.39-86.912c-3.402-4.081-5.471-9.378-5.471-15.16 0-6.561 2.66-12.5 6.962-16.798l68.992-68.992c4.324-4.321 10.294-6.993 16.889-6.993 5.731 0 10.994 2.020 15.111 5.385l88.363 72.541c22.461-13.325 48.417-24.446 75.844-32.022l13.458-114.175c1.255-12.128 11.419-21.504 23.774-21.504 0.042 0 0.084 0 0.126 0h97.659c12.343 0.016 22.489 9.387 23.735 21.401l11.209 113.745c29.678 8.082 55.638 19.205 79.587 33.367l86.921-73.388c4.076-3.332 9.335-5.35 15.068-5.35 6.596 0 12.567 2.672 16.889 6.993l68.992 68.992c4.302 4.298 6.962 10.236 6.962 16.798 0 5.78-2.065 11.081-5.5 15.199l-72.545 88.366c13.284 22.463 24.358 48.424 31.88 75.852l114.169 13.449c12.247 1.108 21.772 11.309 21.803 23.741v97.668c-0.016 12.343-9.387 22.489-21.401 23.735l-0.098 0.007zM512.004 315.839c-72.991 0-132.161 59.171-132.161 132.16s59.169 132.16 132.161 132.16c72.991 0 132.161-59.169 132.161-132.16s-59.171-132.16-132.161-132.16z" />
|
||||
<glyph unicode="web_globe_world" glyph-name="web-globe-world" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM925.696 495.275h-125.611c-9.899 146.603-64.853 273.067-143.019 343.040 144.888-55.283 249.655-184.947 268.267-341.061zM460.8 789.333v-293.547h-141.141c11.093 146.773 73.045 256 140.629 293.547zM460.288 400.213v-293.547c-68.267 37.888-129.195 146.261-140.629 292.523zM555.861 103.595v296.107h148.309c-11.776-151.723-77.824-262.827-148.309-296.619zM555.861 495.616v297.131c70.656-34.133 136.533-145.237 148.309-297.472zM366.763 838.315c-78.165-70.656-133.12-196.267-143.019-343.040h-125.44c18.804 158.093 123.57 287.757 265.597 342.078zM98.475 399.701h125.44c10.069-146.261 64.853-271.531 142.848-341.333-144.368 55.070-248.893 183.969-268.084 339.305zM657.237 58.368c77.995 70.485 132.949 195.755 142.848 341.333h125.44c-19.395-157.364-123.919-286.263-265.426-340.372z" />
|
||||
<glyph unicode="warning_alert" glyph-name="warning-alert" d="M512 960c70.667 0 137-13.333 199-40 62.667-26.667 117.166-63.166 163.5-109.5s82.833-100.833 109.5-163.5c26.667-62 40-128.333 40-199s-13.333-137-40-199c-26.667-62.667-63.166-117.166-109.5-163.5s-100.833-82.833-163.5-109.5c-62-26.667-128.333-40-199-40s-137 13.333-199 40c-62.667 26.667-117.166 63.166-163.5 109.5s-82.833 100.833-109.5 163.5c-26.667 62-40 128.333-40 199s13.333 137 40 199c26.667 62.667 63.166 117.166 109.5 163.5s100.833 82.833 163.5 109.5c62 26.667 128.333 40 199 40zM512 704c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64s64 28.654 64 64v192c0 35.346-28.654 64-64 64zM512 192c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" />
|
||||
<glyph unicode="wand_magic" glyph-name="wand-magic" d="M736.179 470.143l106.335 106.335c4.546 4.541 7.359 10.818 7.359 17.751s-2.812 13.209-7.358 17.751l-88.584 88.755c-4.541 4.546-10.818 7.359-17.751 7.359s-13.209-2.812-17.751-7.358l-106.506-106.336zM558.67 541.146l-469.888-470.059c-6.84-6.803-11.073-16.22-11.073-26.626s4.233-19.824 11.071-26.624l70.834-70.834c6.822-6.799 16.233-11.002 26.626-11.002s19.805 4.203 26.627 11.003l470.058 469.887zM328.419 815.603l14.849-40.281c14.496-38.367 44.243-68.113 81.647-82.29l41.244-15.169-40.281-14.849c-38.367-14.496-68.113-44.243-82.29-81.647l-15.169-41.244-14.849 40.281c-14.424 38.305-44.040 68.034-81.309 82.287l-41.241 15.171 40.281 14.849c38.367 14.496 68.113 44.243 82.29 81.647zM629.503 960l10.241-27.479c9.878-26.261 30.235-46.617 55.839-56.278l28.137-10.458-27.479-10.241c-26.248-9.898-46.597-30.248-56.277-55.838l-10.459-27.454-10.241 27.479c-9.898 26.248-30.248 46.597-55.838 56.277l-28.138 10.459 27.479 10.241c26.261 9.878 46.617 30.235 56.278 55.839zM874.091 311.409l7.852-20.994c7.585-20.051 23.131-35.597 42.679-43.015l21.668-8.019-21.165-7.852c-20.051-7.585-35.597-23.131-43.015-42.679l-8.019-21.497-7.852 20.994c-7.585 20.051-23.131 35.597-42.679 43.015l-21.668 8.019 21.165 7.852c20.051 7.585 35.597 23.131 43.015 42.679z" />
|
||||
<glyph unicode="video_playlist" glyph-name="video-playlist" d="M320 256c35.328 0 64-28.608 64-64s-28.672-64-64-64h-256c-35.328 0-64 28.608-64 64s28.672 64 64 64h256zM64 768h704c35.392 0 64-28.672 64-64s-28.608-64-64-64h-704c-35.328 0-64 28.672-64 64s28.672 64 64 64zM64 512h704c35.392 0 64-28.672 64-64s-28.608-64-64-64h-704c-35.328 0-64 28.672-64 64s28.672 64 64 64zM512 288h256c35.346 0 64-28.654 64-64v-192c0-35.346-28.654-64-64-64h-256c-35.346 0-64 28.654-64 64v192c0 35.346 28.654 64 64 64zM800 128l192.305 164.833c8.051 6.901 20.172 5.969 27.073-2.083 2.983-3.48 4.622-7.912 4.622-12.495v-300.51c0-10.604-8.596-19.2-19.2-19.2-4.583 0-9.015 1.64-12.495 4.622l-192.305 164.833z" />
|
||||
<glyph unicode="user_reputation_points" glyph-name="user-reputation-points" d="M957.76 551.040c-22.249-102.144-213.248-181.888-445.76-181.888-247.446 0-448 90.346-448 201.898v-123.051c0-111.552 200.555-201.898 448-201.898s448 90.347 448 201.898c-0.017 4.737-0.764 39.084-2.24 103.042zM512 123.051c-247.446 0-448 90.347-448 201.897v-123.051c0-111.552 200.555-201.897 448-201.897s448 90.347 448 201.897v123.051c0-111.552-200.555-201.897-448-201.897zM960 694.101c0-111.702-200.555-201.301-448-201.301s-448 89.6-448 201.301c0 111.701 200.555 201.899 448 201.899s448-90.347 448-201.899z" />
|
||||
<glyph unicode="uptime" glyph-name="uptime" d="M182.38 504.833l35.667 57.002c9.973 16.21 27.72 26.868 47.983 26.868 1.002 0 1.999-0.026 2.988-0.078 20.963-0.726 39.094-12.634 48.475-29.9l41.331-76.592 89.944 160.768c9.965 17.66 28.725 29.404 50.254 29.404 24.723 0 45.794-15.488 53.863-37.202l79.733-220.042 36.184 61.61c10.179 16.966 28.59 28.162 49.64 28.162 0.117 0 0.232 0 0.345 0h122.32l118.891-56.832v256l-447.997 256-447.997-256v-256l118.374 56.832zM752.025 391.169l-81.33-138.24c-10.179-16.962-28.58-28.154-49.622-28.16h-5.688c-22.3 2.314-40.643 16.942-48.116 36.812l-79.22 216.116-79.434-143.36c-9.615-17.626-28.136-29.4-49.43-29.4-0.796 0-1.587 0.016-2.375 0.048-21.49 0.312-40.172 12.404-49.707 30.070l-44.261 82.736c-10.278-16.092-28.15-26.624-48.506-26.624-0.028 0-0.059 0-0.089 0l-150.248 56.832v-255.999l447.995-256 447.997 256v255.999l-118.891-56.832-89.076 0.002z" />
|
||||
<glyph unicode="upload_cloud" glyph-name="upload-cloud" d="M512 128v128h80.297c15.811 0 31.062 5.852 42.814 16.429 26.273 23.645 28.402 64.112 4.757 90.385l-144.297 160.33c-1.501 1.668-3.089 3.256-4.757 4.757-26.273 23.645-66.739 21.516-90.385-4.757l-144.297-160.33c-10.577-11.752-16.429-27.003-16.429-42.814 0-35.346 28.654-64 64-64h80.297v-128h-134.826c-134.486 0-249.174 105.007-249.174 233.656l0.002 0.090c0.964 124.682 104.79 225.987 234.836 230.305l0.118 1.032c13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 205.694-155.731l-1.186-0.361c18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 169.706-145.77l-0.004 0.002 1.202-0.204c83.204-16.805 145.664-87.332 145.742-171.82l-0.004-0.235c-2.662-97.469-86.2-175.7-188.862-175.7-0.080 0-0.162 0-0.23 0h-322.904z" />
|
||||
<glyph unicode="upfront" glyph-name="upfront" horiz-adv-x="1000" d="M604.501 902.144l82.603-15.189 16.043-200.021-71.68 47.616-173.568 31.915zM166.912 374.955l3.755 125.952-90.112-84.139zM823.808 379.733l153.6 74.069-19.968 254.464-168.789 113.493zM831.829 277.333v0c-59.051-28.672-142.848-68.267-233.301-111.616l184.32-89.429c113.835 54.443 217.429 104.789 217.088 107.691l-13.653 168.277zM175.787 635.733v0l311.296 287.403-196.949 36.864-271.872-251.733-7.68-226.133zM5.973 345.6l-5.973-173.739 488.107-235.861s84.139 39.595 183.979 86.869z" />
|
||||
<glyph unicode="update" glyph-name="update" d="M311.743 222.622c0.929-0.838 1.863-1.67 2.802-2.497 69.009-60.732 161.584-87.586 253.821-71.323 103.046 18.17 187.795 87.13 227.628 181.864 17.126 40.729 64.026 59.863 104.755 42.737s59.863-64.026 42.737-104.755c-60.693-144.344-190.177-249.705-347.337-277.416-140.63-24.797-282.185 16.266-387.309 108.781-5.599 4.927-11.074 9.985-16.422 15.167l-47.146-42.45c-11.75-10.579-26.999-16.435-42.81-16.439-35.346-0.008-64.006 28.639-64.014 63.986l-0.048 215.702c-0.001 2.244 0.117 4.487 0.352 6.718 3.703 35.152 35.2 60.646 70.352 56.944l214.515-22.595c15.724-1.656 30.278-9.074 40.857-20.824 23.651-26.267 21.53-66.734-4.737-90.386l-47.997-43.216zM716.899 672.584c-1.285 1.17-2.58 2.329-3.885 3.478-69.009 60.732-161.584 87.586-253.821 71.323-103.046-18.17-187.795-87.13-227.628-181.864-17.126-40.729-64.026-59.863-104.755-42.737s-59.863 64.026-42.737 104.755c60.693 144.344 190.177 249.705 347.337 277.416 140.63 24.797 282.185-16.266 387.309-108.781 5.964-5.249 11.788-10.645 17.467-16.183l48.274 43.466c11.75 10.579 26.999 16.435 42.81 16.439 35.346 0.008 64.006-28.639 64.014-63.986l0.048-215.702c0-2.244-0.117-4.487-0.352-6.718-3.703-35.152-35.2-60.646-70.352-56.944l-214.515 22.595c-15.724 1.656-30.278 9.074-40.857 20.824-23.651 26.267-21.53 66.734 4.737 90.386l46.906 42.235z" />
|
||||
<glyph unicode="unpublish" glyph-name="unpublish" d="M586.039 394.981l67.882 67.882c12.497 12.497 12.497 32.758 0 45.255l-45.255 45.255c-12.497 12.497-32.758 12.497-45.255 0l-67.882-67.882-67.882 67.882c-12.497 12.497-32.758 12.497-45.255 0l-45.255-45.255c-12.497-12.497-12.497-32.758 0-45.255l67.882-67.882-67.882-67.882c-12.497-12.497-12.497-32.758 0-45.255l45.255-45.255c12.497-12.497 32.758-12.497 45.255 0l67.882 67.882 67.882-67.882c12.497-12.497 32.758-12.497 45.255 0l45.255 45.255c12.497 12.497 12.497 32.758 0 45.255l-67.882 67.882zM707.353 621.728c87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-134.486 0-249.174 105.007-249.172 233.746 0.964 124.682 104.79 225.987 234.954 231.337 13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 204.508-156.092 18.238 6.353 37.93 9.82 58.468 9.82z" />
|
||||
<glyph unicode="unlock" glyph-name="unlock" d="M221.825 512v85.31c0 164.261 132.864 301.343 295.141 298.651 150.243-2.915 272.552-120.417 284.016-270.063 0.038-0.516 0.059-1.038 0.059-1.563 0-10.935-8.797-19.808-19.673-19.86h-125.449c-10.016 0.159-18.236 7.747-19.534 18.306-8.903 61.174-61.339 108.148-124.694 108.148-4.209 0-8.368-0.206-12.559-0.63-63.697-7.605-113.093-62.063-113.093-128.111 0-0.509 0.003-1.018 0.009-1.447v-88.741h445.952c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h29.825z" />
|
||||
<glyph unicode="unlink" glyph-name="unlink" horiz-adv-x="1025" d="M129.536 783.36l109.397-110.080c5.875-5.875 13.99-9.508 22.955-9.508 17.929 0 32.463 14.534 32.463 32.463 0 8.964-3.634 17.080-9.508 22.955l-108.885 109.568c-5.652 4.91-13.084 7.903-21.215 7.903-17.909 0-32.427-14.518-32.427-32.427 0-8.131 2.993-15.563 7.936-21.254zM318.635 826.88l39.765-150.357c3.88-13.945 16.466-24.008 31.403-24.008 17.972 0 32.541 14.569 32.541 32.541 0 3.036-0.416 5.974-1.193 8.762l-39.711 149.275c-3.878 13.899-16.427 23.926-31.317 23.926-17.927 0-32.459-14.532-32.459-32.459 0-3.036 0.417-5.975 1.196-8.762zM127.829 567.467v0l149.845-40.107c2.559-0.725 5.497-1.142 8.533-1.142 17.927 0 32.459 14.532 32.459 32.459 0 14.891-10.027 27.439-23.697 31.263l-149.562 40.332c-2.559 0.725-5.497 1.142-8.533 1.142-17.927 0-32.459-14.532-32.459-32.459 0-14.891 10.027-27.439 23.697-31.263zM895.147 112.64l-110.080 110.080c-5.875 5.875-13.99 9.508-22.955 9.508-17.929 0-32.463-14.534-32.463-32.463 0-8.964 3.634-17.080 9.508-22.955l109.568-109.568c5.771-5.373 13.536-8.671 22.072-8.671 17.909 0 32.427 14.518 32.427 32.427 0 8.493-3.265 16.224-8.609 22.005zM706.048 69.12l-40.448 150.357c-3.88 13.945-16.466 24.008-31.403 24.008-17.972 0-32.541-14.569-32.541-32.541 0-3.036 0.416-5.974 1.193-8.762l40.052-149.616c3.878-13.899 16.427-23.926 31.317-23.926 17.927 0 32.459 14.532 32.459 32.459 0 3.036-0.417 5.975-1.196 8.762zM896.853 328.533v0l-149.845 40.107c-2.559 0.725-5.497 1.142-8.533 1.142-17.927 0-32.459-14.532-32.459-32.459 0-14.891 10.027-27.439 23.697-31.263l150.074-40.161c2.559-0.725 5.497-1.142 8.533-1.142 17.927 0 32.459 14.532 32.459 32.459 0 14.891-10.027 27.439-23.697 31.263zM492.032 428.203c-40.919 40.905-97.441 66.205-159.872 66.205-58.335 0-111.51-22.088-151.619-58.358l0.196 0.174-114.347-114.347c-38.111-40.385-61.537-94.988-61.537-155.062 0-124.89 101.243-226.133 226.133-226.133 60.074 0 114.677 23.425 155.173 61.64l114.236 114.243c36.095 39.914 58.183 93.089 58.183 151.424 0 62.431-25.3 118.953-66.206 159.873zM417.963 192l-109.397-109.397c-20.662-20.514-49.128-33.193-80.555-33.193-63.151 0-114.345 51.194-114.345 114.345 0 31.724 12.919 60.43 33.783 81.145l109.404 109.404c19.827 17.113 45.846 27.537 74.3 27.537 62.963 0 114.005-51.042 114.005-114.005 0-28.453-10.424-54.472-27.661-74.446zM958.464 893.781c-40.919 40.905-97.441 66.205-159.872 66.205-58.335 0-111.51-22.088-151.619-58.358l0.196 0.174-114.347-114.347c-37.354-40.216-60.276-94.288-60.276-153.712 0-124.89 101.243-226.133 226.133-226.133 59.467 0 113.573 22.954 153.941 60.486l114.207 114.218c36.095 39.914 58.183 93.089 58.183 151.424 0 62.431-25.3 118.953-66.206 159.873zM884.224 658.091l-109.397-109.397c-19.918-17.349-46.131-27.926-74.814-27.926-63.058 0-114.176 51.118-114.176 114.176 0 29.023 10.829 55.518 28.668 75.662l-0.104-0.12 109.397 109.397c19.827 17.113 45.846 27.537 74.3 27.537 62.963 0 114.005-51.042 114.005-114.005 0-28.453-10.424-54.472-27.661-74.446z" />
|
||||
<glyph unicode="undo" glyph-name="undo" d="M322.35 672.58c1.28 1.166 2.571 2.322 3.872 3.467 69.009 60.732 161.584 87.586 253.821 71.323 165.344-29.155 275.747-186.827 246.593-352.171s-186.827-275.747-352.171-246.593c-77.947 13.744-145.751 56.436-191.797 118.844-26.232 35.553-76.318 43.109-111.871 16.877s-43.109-76.318-16.877-111.871c70.189-95.128 173.971-160.472 292.762-181.418 252.367-44.499 493.024 124.011 537.524 376.378s-124.011 493.024-376.378 537.524c-140.63 24.797-282.185-16.266-387.309-108.781-5.96-5.245-11.78-10.637-17.455-16.171l-48.279 43.47c-11.75 10.579-26.999 16.435-42.81 16.439-35.346 0.008-64.006-28.639-64.014-63.986l-0.048-215.702c0-2.244 0.117-4.487 0.352-6.718 3.703-35.152 35.2-60.646 70.352-56.944l214.515 22.595c15.724 1.656 30.278 9.074 40.857 20.824 23.651 26.267 21.53 66.734-4.737 90.386l-46.901 42.23z" />
|
||||
<glyph unicode="trash" glyph-name="trash" d="M864 704l-59.11-709.315c-2.764-33.171-30.493-58.685-63.779-58.685h-458.223c-33.286 0-61.015 25.514-63.779 58.685l-59.11 709.315h-32c-35.346 0-64 28.654-64 64s28.654 64 64 64h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-32zM352 960h320c17.673 0 32-14.327 32-32v-64h-384v64c0 17.673 14.327 32 32 32zM319.883 575.376c-26.445-1.849-46.384-24.786-44.535-51.231l29.019-414.987c1.849-26.445 24.786-46.384 51.231-44.535s46.384 24.786 44.535 51.231l-29.019 414.987c-1.849 26.445-24.786 46.384-51.231 44.535zM512 576c-26.51 0-48-21.49-48-48v-416c0-26.51 21.49-48 48-48s48 21.49 48 48v416c0 26.51-21.49 48-48 48zM707.598 575.376c-26.445 1.849-49.382-18.090-51.231-44.535l-29.019-414.987c-1.849-26.445 18.090-49.382 44.535-51.231s49.382 18.090 51.231 44.535l29.019 414.987c1.849 26.445-18.090 49.382-44.535 51.231z" />
|
||||
<glyph unicode="tracking_disabled" glyph-name="tracking-disabled" d="M750.246 672.721l-58.326 44.618c-6.704 4.526-12.068 10.023-16.090 16.489s-6.704 13.579-8.045 21.339c-3.352 16.813 0.168 32.17 10.559 46.073s24.303 22.471 41.734 25.704l213.193 35.888c1.341 0.647 2.514 0.97 3.52 0.97h3.52c17.431 1.293 32.85-3.718 46.259-15.034s20.783-25.38 22.124-42.193l15.084-208.539c0.67-7.76-0.168-15.358-2.514-22.794s-5.866-14.064-10.559-19.884c-11.397-13.579-25.811-21.339-43.242-23.279s-33.186 2.263-47.264 12.609l-57.321 43.648-282.581-305.535c-13.408-14.873-30.169-22.632-50.281-23.279s-37.543 5.82-52.293 19.399l-137.771 130.943-217.216-227.939c-13.408-13.579-29.834-20.854-49.276-21.824s-36.203 5.011-50.281 17.944c-14.749 12.933-22.459 28.775-23.129 47.528s5.698 35.241 19.107 49.468l266.491 279.346c13.408 14.226 30.169 21.501 50.281 21.824s37.208-6.305 51.287-19.884l136.765-129.003 226.266 245.398zM916.449 193.215l64.249-64.249c11.828-11.828 11.828-31.005 0-42.832l-42.832-42.832c-11.828-11.828-31.005-11.828-42.832 0l-64.249 64.249-64.249-64.249c-11.828-11.828-31.005-11.828-42.832 0l-42.832 42.832c-11.828 11.828-11.828 31.005 0 42.832l64.249 64.249-64.249 64.249c-11.828 11.828-11.828 31.005 0 42.832l42.832 42.832c11.828 11.828 31.005 11.828 42.832 0l64.249-64.249 64.249 64.249c11.828 11.828 31.005 11.828 42.832 0l42.832-42.832c11.828-11.828 11.828-31.005 0-42.832l-64.249-64.249z" />
|
||||
<glyph unicode="thumbnails" glyph-name="thumbnails" d="M239.765 896h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM584.128 896h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 0 0 0 0 0 0 17.32-14.040 31.36-31.36 31.36-0.052 0-0.105 0-0.158 0zM960 864.64c0 17.32-14.040 31.36-31.36 31.36h-144.405c-17.32 0-31.36-14.040-31.36-31.36v0-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256zM239.765 551.488h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM584.128 551.488h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.405c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.405c0 17.32-14.040 31.36-31.36 31.36zM928.64 551.488h-144.405c-17.32 0-31.36-14.040-31.36-31.36v0-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM239.765 206.976h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM584.128 206.976h-144.256c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36zM928.64 206.976h-144.405c-17.32 0-31.36-14.040-31.36-31.36v-144.256c0-17.32 14.040-31.36 31.36-31.36h144.405c17.32 0 31.36 14.040 31.36 31.36v144.256c0 17.32-14.040 31.36-31.36 31.36z" />
|
||||
<glyph unicode="target" glyph-name="target" d="M198.338 511.69c32.371-3.182 57.662-30.483 57.662-63.69s-25.291-60.508-57.662-63.69c25.373-125.635 124.337-224.599 249.972-249.972 3.182 32.371 30.483 57.662 63.69 57.662s60.508-25.291 63.69-57.662c125.635 25.373 224.599 124.337 249.972 249.972-32.371 3.182-57.662 30.483-57.662 63.69s25.291 60.508 57.662 63.69c-25.373 125.635-124.337 224.599-249.972 249.972-3.182-32.371-30.483-57.662-63.69-57.662s-60.508 25.291-63.69 57.662c-125.635-25.373-224.599-124.337-249.972-249.972zM68.537 384h-4.537c-35.346 0-64 28.654-64 64s28.654 64 64 64h4.537c28.065 196.204 183.259 351.398 379.463 379.463v4.537c0 35.346 28.654 64 64 64s64-28.654 64-64v-4.537c196.204-28.065 351.398-183.259 379.463-379.463h4.537c35.346 0 64-28.654 64-64s-28.654-64-64-64h-4.537c-28.065-196.204-183.259-351.398-379.463-379.463v-4.537c0-35.346-28.654-64-64-64s-64 28.654-64 64v4.537c-196.204 28.065-351.398 183.259-379.463 379.463zM512 512c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64s-28.654 64-64 64zM512 640c106.039 0 192-85.961 192-192s-85.961-192-192-192c-106.039 0-192 85.961-192 192s85.961 192 192 192z" />
|
||||
<glyph unicode="tablet_portrait" glyph-name="tablet-portrait" d="M847.787 959.998h-673.963c-19.099-1.203-34.134-16.988-34.134-36.284 0-0.084 0-0.168 0.001-0.251v-950.942c0-0.071-0.001-0.155-0.001-0.238 0-19.296 15.035-35.081 34.029-36.279l674.068-0.005c20.171 0 36.523 16.352 36.523 36.523v950.955c0 20.171-16.352 36.523-36.523 36.523zM510.55-33.965c-16.495 0-29.867 13.372-29.867 29.867s13.372 29.867 29.867 29.867c16.495 0 29.867-13.372 29.867-29.867s-13.372-29.867-29.867-29.867zM764.502 55.465h-505.344v785.067h505.173v-785.067z" />
|
||||
<glyph unicode="style_type" glyph-name="style-type" d="M600.183 22.811c0-0.042 0-0.092 0-0.143 0-15.931-7.276-30.162-18.685-39.552-11.343-10.55-26.453-17.019-43.073-17.137-0.026 0-0.030 0-0.033 0-11.14 0-21.521 3.244-30.253 8.839-9.496 6.164-17 15.152-21.316 25.776l-44.678 99.359h-283.307l-44.373-98.645c-4.412-10.932-11.786-19.9-21.129-26.154-8.647-5.591-18.965-8.837-30.041-8.837-0.251 0-0.501 0.002-0.75 0.005-16.766 0.139-32.034 6.598-43.532 17.111-11.636 9.226-19.065 23.426-19.065 39.361 0 0.006 0 0.013 0 0.019 0.497 9.522 2.9 18.373 6.832 26.334l225.616 474.401c5.839 13.038 15.402 23.536 27.33 30.381 11.701 6.853 25.389 10.801 39.998 10.801s28.297-3.948 40.055-10.835c11.808-6.995 21.526-17.206 27.932-29.427l225.816-475.714c3.869-7.822 6.285-16.984 6.652-26.671zM203.041 199.11h194.731l-96.939 217.429zM980.428 346.736q43.52-43.861 43.52-134.144v-188.928c0.067-1.036 0.105-2.247 0.105-3.466 0-15.424-6.089-29.425-15.995-39.732-10.73-9.683-25.041-15.619-40.738-15.619-1.273 0-2.536 0.039-3.789 0.116-0.367-0.026-1-0.037-1.635-0.037-16.095 0-30.664 6.534-41.2 17.094-10.549 10.354-17.086 24.76-17.086 40.694 0 0.514 0.007 1.026 0.020 1.537l-0.002 5.727c-7.996-20.951-22.288-37.999-40.536-49.25-18.994-11.008-41.281-17.361-65.052-17.361-1.28 0-2.555 0.018-3.826 0.055-0.297-0.009-0.87-0.012-1.443-0.012-26.924 0-52.375 6.304-74.959 17.516-20.968 10.24-38.97 26.053-51.962 45.498-12.607 18.963-19.936 41.675-19.936 66.099 0 0.451 0.003 0.902 0.007 1.353-0.104 1.659-0.163 3.679-0.163 5.713 0 24.818 8.756 47.591 23.347 65.398 19.243 18.899 44.285 32.287 72.24 37.242 38.061 7.624 80.858 11.917 124.658 11.917 5.548 0 11.080-0.069 16.595-0.206l20.858 0.016v15.019c0.19 1.951 0.299 4.218 0.299 6.51 0 16.996-5.972 32.597-15.932 44.819-11.911 9.935-27.533 16.048-44.582 16.048-2.294 0-4.563-0.111-6.8-0.327-37.555-3.095-72.498-12.15-104.744-26.231-7.318-4.335-18.437-7.661-30.26-8.382-0.641-0.028-1.133-0.038-1.627-0.038-11.135 0-21.095 5.030-27.732 12.942-6.891 8.683-11.027 19.729-11.027 31.74 0 0.861 0.021 1.718 0.063 2.569-0.029 0.454-0.044 1.126-0.044 1.802 0 9.556 2.815 18.454 7.661 25.911 6.169 8.019 14.031 14.681 23.056 19.429 21.018 11.107 44.941 19.783 70.137 24.97 26.728 6.037 55.41 9.331 84.859 9.347q90.294 0 133.814-43.861zM880.929 75.035c14.043 15.93 22.615 36.976 22.615 60.024 0 1.398-0.032 2.789-0.094 4.172l0.007 13.969h-14.165c-4.533 0.256-9.837 0.403-15.176 0.403-28.403 0-55.84-4.137-81.741-11.842-13.531-4.937-24.486-19.494-24.486-36.61 0-0.748 0.021-1.491 0.062-2.228-0.023-0.401-0.033-0.993-0.033-1.586 0-13.9 5.691-26.471 14.87-35.51 9.691-9.115 22.769-14.712 37.154-14.712 0.62 0 1.238 0.010 1.853 0.031 0.789-0.038 1.821-0.059 2.857-0.059 22.309 0 42.392 9.534 56.396 24.749zM571.852 565.36l19.797 53.589c19.302 51.135 58.945 90.778 108.798 109.654l55.042 19.882-53.589 19.797c-51.135 19.302-90.778 58.945-109.654 108.798l-20.394 55.554-19.797-53.76c-19.302-51.135-58.945-90.778-108.798-109.654l-55.042-20.735 53.589-19.797c51.122-19.322 90.758-58.958 109.653-108.798zM889.633 473.2l13.483 36.352c13.184 34.97 40.294 62.080 74.388 74.973l37.569 13.773-36.693 13.653c-34.97 13.184-62.080 40.294-74.973 74.388l-13.773 37.569-13.483-36.693c-13.221-35-40.396-62.12-74.557-74.974l-37.571-13.772 36.693-13.483c35-13.221 62.12-40.396 74.974-74.557z" />
|
||||
<glyph unicode="storage_server_data" glyph-name="storage-server-data" d="M973.995 832h-923.989c-27.758-0.668-50.005-23.329-50.005-51.186 0-0.005 0-0.010 0-0.015v-238.933c0-0.004 0-0.009 0-0.014 0-27.857 22.247-50.518 49.943-51.185l924.051-0.001c27.758 0.668 50.005 23.329 50.005 51.186 0 0.005 0 0.010 0 0.015v238.933c0 0.004 0 0.009 0 0.014 0 27.857-22.247 50.518-49.943 51.185zM137.728 612.864c-26.1 0.853-46.933 22.216-46.933 48.445 0 26.769 21.7 48.469 48.469 48.469 26.76 0 48.455-21.687 48.469-48.444 0-26.77-21.7-48.471-48.469-48.471zM973.995 405.333h-923.989c-27.758-0.668-50.005-23.329-50.005-51.186 0-0.005 0-0.010 0-0.015v-238.933c0-0.004 0-0.009 0-0.014 0-27.857 22.247-50.518 49.943-51.185l924.051-0.001c27.758 0.668 50.005 23.329 50.005 51.186 0 0.005 0 0.010 0 0.015v238.933c0 0.004 0 0.009 0 0.014 0 27.857-22.247 50.518-49.943 51.185zM137.728 186.197c-26.1 0.853-46.933 22.216-46.933 48.445 0 26.769 21.7 48.469 48.469 48.469 26.76 0 48.455-21.687 48.469-48.444 0-26.77-21.7-48.471-48.469-48.471z" />
|
||||
<glyph unicode="stopwatch" glyph-name="stopwatch" d="M1004.63 797.657l-99.726 100.512c-12.377 14.769-30.829 24.092-51.462 24.092-37.008 0-67.008-30-67.008-67.008 0-20.631 9.324-39.085 23.988-51.378l99.83-100.755c12.106-12.011 28.781-19.434 47.189-19.434s35.083 7.422 47.194 19.439c11.97 12.12 19.366 28.788 19.366 47.184s-7.396 35.066-19.377 47.196zM116.059 898.171l-100.512-99.726c-9.673-11.536-15.546-26.539-15.546-42.916 0-37.008 30-67.008 67.008-67.008 16.375 0 31.38 5.875 43.020 15.632l100.567 99.799c14.769 12.377 24.092 30.829 24.092 51.462 0 37.008-30 67.008-67.008 67.008-20.631 0-39.085-9.324-51.378-23.988zM507.886 697.775c0.094 0 0.204 0 0.316 0 165.059 0 298.863-133.806 298.863-298.863s-133.806-298.863-298.863-298.863c-165.059 0-298.863 133.806-298.863 298.863 0 82.645 33.546 157.456 87.765 211.558 53.635 53.931 127.883 87.306 209.925 87.306 0.302 0 0.602 0 0.904-0.001zM507.886 825.498c-235.095-0.207-425.595-190.836-425.595-425.96 0-235.251 190.709-425.96 425.96-425.96s425.96 190.709 425.96 425.96c0 117.871-47.878 224.562-125.246 301.684-76.901 77.071-183.215 124.748-300.664 124.748-0.145 0-0.289 0-0.436 0zM633.566 430.369v2.674c-1.409 5.069-2.804 9.151-4.394 13.131 0.304 0.867-0.64 2.599-1.427 4.171v0c-13.481 30.382-37.255 54.158-66.805 67.307l-0.834 0.332h-1.574v125.837h-99.254v-125.837h-0.943c-16.521-6.724-30.636-16.144-42.483-27.853-23.224-23.43-37.582-55.705-37.582-91.334 0-0.126 0-0.253 0.001-0.378v0.020s0 0 0-0.786c0.037-6.525 0.55-12.899 1.506-19.125l-0.092 0.721c1.638-11.347 4.497-21.575 8.493-31.212l-31.773-30.607-12.899-12.899 68.896-68.896 44.358 44.358 2.202-1.102h1.102c13.995-5.58 30.214-8.814 47.189-8.814s33.193 3.237 48.073 9.124l1.631-0.308c47.547 20.067 80.376 66.17 80.693 119.976-0.062 11.245-1.549 22.076-4.292 32.396zM542.335 365.563c-8.852-8.843-21.075-14.314-34.578-14.314-27.018 0-48.918 21.903-48.918 48.918s21.903 48.918 48.918 48.918c13.501 0 25.726-5.47 34.578-14.314 8.899-8.836 14.407-21.077 14.407-34.605s-5.508-25.769-14.404-34.603z" />
|
||||
<glyph unicode="star" glyph-name="star" d="M1022.693 572.936c-3.255 9.924-12.398 16.98-23.2 17.067h-346.293l-117.931 333.312c-3.443 9.687-12.531 16.499-23.211 16.499s-19.767-6.811-23.157-16.327l-117.984-334.166h-346.283c-13.554-0.025-24.532-11.018-24.532-24.576 0-7.796 3.63-14.744 9.292-19.247l270.386-214.055-121.003-342.357c-0.92-2.477-1.453-5.339-1.453-8.325 0-13.573 11.003-24.576 24.576-24.576 4.699 0 9.091 1.319 12.824 3.607l317.333 190.403 317.44-190.293c3.626-2.227 8.017-3.546 12.717-3.546 13.573 0 24.576 11.003 24.576 24.576 0 2.986-0.533 5.848-1.508 8.495l-120.948 342.016 270.336 214.016c5.646 4.542 9.228 11.45 9.228 19.194 0 2.907-0.505 5.696-1.431 8.284z" />
|
||||
<glyph unicode="speed_optimize" glyph-name="speed-optimize" d="M475.793 894.803c-266.855-19.796-475.793-238.971-475.793-506.45 0-152.123 67.582-288.622 174.648-381.687 5.027-4.328 10.882-6.666 17.288-6.666 9.379 0 17.575 5.012 22.004 12.477l43.671 74.793c2.042 3.51 3.246 7.719 3.246 12.207 0 6.912-2.858 13.164-7.468 17.66-73.006 68.243-118.449 164.703-118.449 271.671 0 206.208 168.886 373.374 377.217 373.374s377.217-167.165 377.217-373.374c0-106.966-45.444-203.427-118.265-271.499-4.794-4.668-7.653-10.919-7.653-17.832 0-4.487 1.204-8.697 3.311-12.327l43.692-74.554c4.47-7.53 12.613-12.505 21.929-12.505 6.339 0 12.134 2.303 16.579 6.11 107.517 93.526 175.031 229.964 175.031 382.010 0 280.443-229.684 507.789-513.015 507.789-12.383 0-24.663-0.434-36.826-1.288l1.635 0.091zM462.364 299.645l-58.544 66.013c-5.285 5.937-8.51 13.778-8.51 22.366 0 11.288 5.573 21.288 14.146 27.45l289.953 206.469c5.48 3.846 12.303 6.148 19.67 6.148 10.164 0 19.294-4.382 25.566-11.341l13.156-14.968c5.081-5.878 8.173-13.571 8.173-21.978 0-8.805-3.391-16.825-8.951-22.853l-244.413-258.348c-6.261-6.571-15.116-10.663-24.938-10.663-10.251 0-19.45 4.458-25.727 11.521l0.42 0.186z" />
|
||||
<glyph unicode="social_youtube" glyph-name="social-youtube" d="M1014.113 648.12c0 0-9.729 68.939-41.116 99.375-26.137 25.868-62.396 42.035-102.554 42.459-143.364 10.046-358.365 10.046-358.365 10.046s-215 0-358.439-10.044c-40.234-0.442-76.491-16.603-102.611-42.436-31.41-30.459-40.669-99.4-40.669-99.4-6.069-48.054-9.817-104.254-10.352-161.198l-0.006-76.817c0.482-57.604 4.175-113.815 10.915-169.122s9.33-61.741 39.932-92.177c38.92-39.873 90.080-38.655 112.993-42.762 81.92-7.61 348.239-10.044 348.239-10.044s215.158 0 358.595 10.501c40.103 0.467 76.235 16.564 102.301 42.286 31.408 30.457 40.824 99.396 40.824 99.396 6.032 48.161 9.725 104.427 10.196 161.437l0.006 76.731c-0.476 57.648-4.169 113.913-10.915 169.273l1.028-7.505zM405.206 309.206v281.997l272.125-138.183-272.125-143.814z" />
|
||||
<glyph unicode="social_twitter" glyph-name="social-twitter" d="M778.4 864h141.2l-308.4-352.4 362.8-479.6h-284l-222.6 290.8-254.4-290.8h-141.4l329.8 377-347.8 455h291.2l201-265.8 232.6 265.8zM728.8 116.4h78.2l-504.8 667.6h-84l510.6-667.6z" />
|
||||
<glyph unicode="social_linkedin" glyph-name="social-linkedin" d="M264.704 0.001h-185.621v598.528h185.621zM171.82 680.364c-0.045 0-0.097 0-0.149 0-59.547 0-107.819 48.272-107.819 107.819s48.272 107.819 107.819 107.819c59.547 0 107.819-48.272 107.819-107.819 0-0.045 0-0.097 0-0.149 0-59.465-48.206-107.669-107.669-107.669zM960.149 0.001h-185.472v291.051c0 69.44-1.344 158.741-96.469 158.741s-111.403-75.563-111.403-153.664v-296.128h-185.621v598.528h178.155v-81.835h2.539c24.939 47.040 84.672 96.768 175.616 96.768 188.011 0 222.656-123.947 222.656-284.928v-328.533z" />
|
||||
<glyph unicode="social_google_plus" glyph-name="social-google-plus" d="M0.859 463.671c-10.682-134.785 79.418-267.513 206.439-314.614s288.992-15.32 369.92 96.716c53.411 70.766 64.905 161.88 58.635 247.392-103.683 0.229-207.136 0.229-310.705 0.229 0-36.354 0-72.709 0-109.177 61.885-1.943 124.003-1.029 185.772-1.943-27.285-135.243-214.219-179.143-313.491-90.772-100.897 77.625-96.137 247.621 9.637 319.528 73.845 58.076 178.923 43.67 252.883-6.516 28.893 26.616 55.809 54.024 81.285 82.701-60.385 49.568-135.854 83.978-216.085 80.549-167.427 5.258-321.386-139.244-324.289-304.096l-0.001 0.003zM837.879 584.853c0-30.409-0.581-60.82-0.812-91.456l-92.885-0.572v-91.456l92.885-0.915c0-30.41 0-60.819 0.581-91.458h92.885c0 30.41 0 60.819 0.581 91.458l92.885 0.801v92.144l-92.885 0.572c0 30.409 0 60.933-0.581 91.456l-92.654-0.573z" />
|
||||
<glyph unicode="social_github" glyph-name="social-github" d="M512 934.741c-0.11 0-0.241 0-0.371 0-282.77 0-512-229.23-512-512 0-225.030 145.173-416.153 346.974-484.823 29.205-5.844 37.739 10.028 37.739 23.51s0 44.373 0 87.040c-142.507-30.891-172.544 68.267-172.544 68.267-23.211 59.733-56.661 75.264-56.661 75.264-46.421 31.744 3.584 31.061 3.584 31.061 33.642-4.794 61.856-24.567 78.061-52.229 46.013-78.673 119.741-56.145 149.267-43.003 2.518 26.917 14.443 50.654 32.408 68.248-113.645 12.989-233.112 57.192-233.112 253.458-0.013 0.842-0.020 1.835-0.020 2.83 0 52.018 20.062 99.35 52.871 134.681-6.822 18.19-10.702 39.335-10.702 61.387 0 26.775 5.72 52.215 16.004 75.163s42.541 12.658 140.333-53.731c38.377 10.941 82.454 17.232 128 17.232s89.623-6.291 131.409-18.052c94.383 67.038 137.221 53.385 137.221 53.385 9.885-21.837 15.644-47.349 15.644-74.205 0-21.975-3.856-43.050-10.929-62.584 32.998-33.856 52.995-81.074 52.995-132.964 0-1.105-0.009-2.208-0.027-3.309 0.002-196.442-119.465-239.791-233.811-252.421 18.432-15.872 34.133-47.104 34.133-94.891 0-68.267 0-123.563 0-140.459 0-13.653 9.216-29.696 35.157-24.576 205.138 69.887 350.066 260.877 350.066 485.717 0 282.66-229.052 511.822-511.67 512z" />
|
||||
<glyph unicode="social_facebook" glyph-name="social-facebook" d="M374.272-64v512h-109.739v176.469h109.739v105.984c0 144.213 62.123 229.547 238.080 229.547h147.115v-176.469h-91.989c-68.267 0-73.216-24.747-73.216-70.656v-88.235h165.205l-18.773-176.64h-146.603v-512z" />
|
||||
<glyph unicode="social_dropbox" glyph-name="social-dropbox" d="M301.227 888.491l-301.227-196.779 208.213-166.741 303.787 187.563-210.773 175.957zM0 358.229v0l301.227-196.779 210.773 175.957-303.787 187.563-208.213-166.741zM512 337.408l210.773-175.957 301.227 196.779-208.213 166.741-303.787-187.563zM722.773 888.491l-210.773-175.957 303.787-187.563 208.213 166.741-301.227 196.779zM301.227 124.245l-90.453 59.051v-66.219l301.909-181.077 301.739 181.077v66.219l-90.453-59.051-211.285 175.275-211.456-175.275z" />
|
||||
<glyph unicode="social_drive" glyph-name="social-drive" d="M383.488 316.075l-177.664-305.323h640.512l177.664 305.323h-640.512zM329.216 889.344l320.341-554.667 353.28-1.024-320.171 554.667-353.451 1.024zM0 313.173l175.787-306.517 320.171 554.667-175.616 306.517-320.341-554.667z" />
|
||||
<glyph unicode="snapshot" glyph-name="snapshot" horiz-adv-x="939" d="M819.938 747.646h64.259v46.734h-181.092v-186.934h46.734v81.784c58.417-64.259 93.467-146.042 93.467-233.668 5.842-93.467-29.208-186.934-87.625-257.034s-146.042-116.834-239.509-128.517c-93.467-11.683-186.934 11.683-262.876 70.1-75.942 52.575-128.517 134.359-146.042 227.826s0 186.934 46.734 268.718 128.517 140.201 216.143 163.567c93.467 23.367 192.776 11.683 274.559-29.208l40.892 81.784c-52.575 29.208-110.992 46.734-175.251 58.417-58.417 5.842-122.675 0-181.092-17.525s-110.992-46.734-163.567-87.625c-46.734-40.892-81.784-87.625-110.992-146.042s-46.734-116.834-52.575-175.251c-5.842-64.259 0-122.675 23.367-181.092s52.575-110.992 93.467-157.726c40.892-46.734 87.625-81.784 146.042-110.992v0c99.309-52.575 210.301-64.259 315.451-40.892s204.459 87.625 268.718 175.251c64.259 87.625 99.309 198.617 87.625 309.61-5.842 99.309-46.734 192.776-116.834 268.718zM662.212 595.762l-52.575-70.1-128.517 204.459-75.942-52.575 40.892-70.1h-210.301v-93.467h81.784l-116.834-169.409 75.942-52.575 157.726 221.984h70.1l46.734-70.1-46.734-70.1h-75.942l-46.734 70.1-52.575-81.784 128.517-204.459 75.942 52.575-46.734 70.1h216.143v93.467h-81.784l116.834 169.409z" />
|
||||
<glyph unicode="smush" glyph-name="smush" d="M512 960c-277.943 0-512-234.057-512-512s234.057-512 512-512 512 226.743 512 512-226.743 512-512 512zM512 38.4c-80.457 0-153.6 73.143-153.6 153.6s73.143 153.6 153.6 153.6 153.6-73.143 153.6-153.6-73.143-153.6-153.6-153.6zM789.943 265.143c-7.314-21.943-7.314-43.886-21.943-58.514-7.314 65.829-29.257 124.343-80.457 168.229-43.886 43.886-109.714 73.143-175.543 73.143-51.2 0-102.4-14.629-146.286-43.886-36.571-21.943-73.143-65.829-87.771-109.714-7.314-29.257-21.943-58.514-21.943-95.086-14.629 36.571-21.943 73.143-21.943 117.029 0 80.457 29.257 146.286 80.457 197.486s117.029 87.771 197.486 87.771c58.514 0 109.714-14.629 160.914-43.886 43.886-29.257 80.457-73.143 102.4-124.343 21.943-58.514 21.943-117.029 14.629-168.229zM892.343 301.714c0 7.314 0 7.314 0 14.629 0 102.4-43.886 197.486-109.714 270.629s-168.229 117.029-270.629 117.029c-80.457 0-146.286-21.943-212.114-65.829s-117.029-102.4-146.286-175.543c-21.943-51.2-29.257-109.714-29.257-160.914-14.629 51.2-21.943 95.086-21.943 146.286 0 109.714 43.886 212.114 117.029 292.571s182.857 117.029 292.571 117.029c80.457 0 160.914-21.943 226.743-65.829s117.029-109.714 146.286-182.857c36.571-80.457 43.886-160.914 29.257-241.371-7.314-21.943-14.629-43.886-21.943-65.829z" />
|
||||
<glyph unicode="smart_crawl" glyph-name="smart-crawl" d="M739.562 788.568c-67.358 45.008-146.549 69.032-227.562 69.032-108.632 0-212.816-43.154-289.631-119.969s-119.969-180.999-119.969-289.631c0-53.765 10.583-106.731 30.857-155.962l411.967 411.962h-84.424v51.2h204.801v-204.8h-51.2v85.202l-431.481-431.482c31.394-42.365 70.593-78.16 115.343-105.53l247.014 247.010h-84.477v51.2h204.801v-204.8h-51.2v85.153l-221.158-221.162c64.219-19.456 132.454-22.894 198.665-9.721 79.456 15.806 152.438 54.814 209.723 112.098s96.293 130.267 112.098 209.723c15.799 79.453 7.695 161.81-23.303 236.655-31.006 74.845-83.507 138.815-150.864 183.822zM227.547 873.713c84.198 56.259 183.189 86.287 284.453 86.287 135.793 0 266.021-53.944 362.035-149.962 96.022-96.018 149.965-226.246 149.965-362.038 0-101.263-30.032-200.25-86.287-284.453-56.262-84.194-136.222-149.818-229.778-188.577-93.555-38.744-196.504-48.889-295.822-29.133s-190.546 68.52-262.151 140.127c-71.605 71.607-120.369 162.831-140.125 262.149s-9.615 202.265 29.137 295.821c38.752 93.555 104.374 173.519 188.573 229.778z" />
|
||||
<glyph unicode="slide_in" glyph-name="slide-in" d="M1024 704h-576c-35.346 0-64-28.654-64-64v-384c0-35.346 28.654-64 64-64h576v-192c0-35.346-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64h896c35.346 0 64-28.654 64-64v-192zM896 640c35.346 0 64-28.654 64-64s-28.654-64-64-64c-35.346 0-64 28.654-64 64s28.654 64 64 64z" />
|
||||
<glyph unicode="sitemap" glyph-name="sitemap" d="M425.472 625.835h173.056c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933h-173.056c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933zM598.528 270.165h-173.056c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.056c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM977.067 270.165h-173.227c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.227c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM220.16 270.165h-173.227c-25.921 0-46.933-21.013-46.933-46.933v-173.227c0-25.921 21.013-46.933 46.933-46.933h173.227c25.921 0 46.933 21.013 46.933 46.933v173.227c0 25.921-21.013 46.933-46.933 46.933zM178.005 445.099h290.133v-85.333h89.088v85.333h290.133v-85.333h89.088v85.333c0 49.202-39.886 89.088-89.088 89.088h-669.355c-49.129-0.097-88.917-39.946-88.917-89.088 0 0 0 0 0 0v-85.333h89.088z" />
|
||||
<glyph unicode="site_health" glyph-name="site-health" d="M640.39 472.324l-99.392-198.788c-11.999-24.198-46.797-23.398-57.796 1.203l-113.794 252.582-59.996-143.392h-188.189l364.979-372.979c14.199-14.598 37.197-14.598 51.397 0l365.179 372.979h-218.189l-44.198 88.395zM947.373 812.105l-4.8 5c-102.989 105.194-271.584 105.194-374.776 0l-55.796-57.197-55.796 56.996c-102.995 105.394-271.784 105.394-374.778 0l-4.8-4.799c-97.394-99.594-101.594-258.185-14.599-364.179h204.788l71.796 172.39c10.799 25.798 47.197 26.398 58.797 0.8l116.393-258.585 97.994 195.788c11.8 23.599 45.396 23.599 57.198 0l55.194-110.394h237.786c86.995 105.994 82.797 264.585-14.598 364.179z" />
|
||||
<glyph unicode="shipper_anchor" glyph-name="shipper-anchor" d="M358.478 960h307.167v-139.637h153.578c56.313 0 102.393-41.891 102.393-93.091v-215.040l65.529-19.549c13.305-3.723 24.569-12.102 30.713-23.273s7.168-24.203 3.072-36.306l-96.753-310.92h-2.56c-81.913 0-154.609 40.96-204.778 93.089-50.169-52.129-122.866-93.089-204.777-93.089s-154.607 40.96-204.777 93.089c-50.17-52.129-122.865-93.089-204.776-93.089h-2.56l-97.269 310.92c-4.608 12.102-3.072 25.135 3.071 36.306s17.406 19.549 30.717 23.273l66.041 19.549v215.040c0 51.2 46.074 93.091 102.387 93.091h153.583v139.637zM563.254 866.909h-102.387v-46.545h102.387v46.545zM512.059 535.971l-275.424-81.455-122.865-36.771 57.849-184.317c27.645 13.963 48.122 32.578 58.361 43.286l77.303 80.057 77.303-80.057c17.406-18.622 65.528-61.44 127.473-61.44s110.066 42.818 127.473 61.44l77.304 80.057 77.305-80.526c10.233-10.701 30.713-29.791 58.361-43.754l57.337 184.789-122.353 36.305-275.425 82.386zM204.895 542.487l307.165 91.694 307.162-91.694v184.785h-614.327v-184.785zM512.059 30.954c71.159 0 142.319 20.011 204.777 59.575 62.457-39.563 133.617-61.44 204.778-61.44h102.385v-93.089h-102.385c-70.649 0-140.273 15.829-204.778 46.080-64.505-30.251-134.641-45.151-204.777-45.151s-140.272 15.36-204.777 45.151c-64.505-29.791-134.128-46.080-204.776-46.080h-102.389v93.089h102.389c71.159 0 142.319 21.877 204.776 61.44 62.457-39.563 133.617-59.575 204.777-59.575z" />
|
||||
<glyph unicode="share" glyph-name="share" d="M801.445 594.226c-18.787-0.030-36.732-3.598-53.217-10.072l-378.911 219.821c0 3.243 0 6.485 0 9.728-0.286 80.75-65.812 146.1-146.602 146.1-80.966 0-146.603-65.636-146.603-146.603s65.636-146.603 146.603-146.603c32.171 0 61.921 10.362 86.096 27.931l352.858-203.215c-4.21-13.064-6.637-28.094-6.637-43.691s2.427-30.627 6.924-44.733l-352.543-202.393c-23.762 17.425-53.583 27.883-85.845 27.883-80.684 0-146.091-65.407-146.091-146.091s65.407-146.091 146.091-146.091c80.684 0 146.091 65.407 146.091 146.091 0 0.037 0 0.075 0 0.112 0 3.066 0 5.968 0 8.869l380.416 220.16c15.309-5.943 33.028-9.386 51.552-9.386 80.778 0 146.261 65.483 146.261 146.261s-65.483 146.261-146.261 146.261c-0.124 0-0.247 0-0.371 0z" />
|
||||
<glyph unicode="settings_slider_control" glyph-name="settings-slider-control" horiz-adv-x="978" d="M768 256h129.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-129.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-513.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h513.906v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906zM448 768v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906h321.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-321.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-321.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h321.906zM256 512v1.906c0 34.293 27.8 62.094 62.094 62.094h3.813c34.293 0 62.094-27.8 62.094-62.094v-1.906h513.906c34.293 0 62.094-27.8 62.094-62.094v-3.813c0-34.293-27.8-62.094-62.094-62.094h-513.906v-1.906c0-34.293-27.8-62.094-62.094-62.094h-3.813c-34.293 0-62.094 27.8-62.094 62.094v1.906h-129.906c-34.293 0-62.094 27.8-62.094 62.094v3.813c0 34.293 27.8 62.094 62.094 62.094h129.906z" />
|
||||
<glyph unicode="send" glyph-name="send" d="M1023.402 916.159l-147.45-837.616c-5.008-28.45-32.131-47.453-60.581-42.445-2.635 0.464-5.23 1.129-7.763 1.99l-207.048 70.371c-14.31 4.864-30.141 0.626-40.108-10.735l-130.758-149.054c-13.607-15.511-37.212-17.055-52.723-3.447-8.086 7.094-12.723 17.328-12.723 28.085v200.199c0 8.707 3.041 17.14 8.597 23.843l466.486 562.749-580.279-485.010c-10.358-8.657-24.581-11.054-37.204-6.268l-197.428 74.848c-19.294 7.314-29.005 28.885-21.69 48.178 3.067 8.090 8.847 14.865 16.352 19.168l948.942 544.034c17.901 10.262 40.731 4.071 50.994-13.83 4.347-7.583 5.898-16.45 4.383-25.059z" />
|
||||
<glyph unicode="save" glyph-name="save" d="M256 896v-192c0-35.346 28.654-64 64-64h320c35.346 0 64 28.654 64 64v192h37.49c16.974 0 33.253-6.743 45.255-18.745l154.51-154.51c12.002-12.002 18.745-28.281 18.745-45.255v-613.49c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h128zM512 896h128v-160c0-17.673-14.327-32-32-32h-64c-17.673 0-32 14.327-32 32v160zM256 448c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v192c0 35.346-28.654 64-64 64h-512zM288 384h448c17.673 0 32-14.327 32-32s-14.327-32-32-32h-448c-17.673 0-32 14.327-32 32s14.327 32 32 32zM288 256h448c17.673 0 32-14.327 32-32s-14.327-32-32-32h-448c-17.673 0-32 14.327-32 32s14.327 32 32 32z" />
|
||||
<glyph unicode="reply" glyph-name="reply" d="M1018.197 2.048c-94.208 337.749-356.693 426.667-516.779 448.683l-84.309 11.605v-223.573l-417.109 327.509 417.109 327.339v-175.957l62.293-10.069c203.264-33.28 352.939-115.2 442.197-243.883 82.773-119.467 115.712-279.723 96.256-461.653z" />
|
||||
<glyph unicode="refresh2" glyph-name="refresh2" d="M995.157 353.621l-65.365 113.152-8.192 15.36-102.741-59.733-14.677-8.363 8.533-14.677 65.365-113.152c7.865-13.361 12.511-29.434 12.511-46.592 0-51.37-41.643-93.013-93.013-93.013-0.078 0-0.157 0-0.235 0h-240.116v-135.509h239.957c0.035 0 0.075 0 0.116 0 126.21 0 228.523 102.313 228.523 228.523 0 42.105-11.387 81.55-31.249 115.424l0.584-1.077zM593.749 778.069l103.253-179.029 9.557-17.067 15.189 11.264 82.091 61.099 12.117 8.875-7.509 12.971-97.451 169.472c-40.252 68.771-113.761 114.229-197.888 114.229s-157.636-45.458-197.304-113.151l-0.584-1.078-65.365-113.323-8.533-14.677 14.677-8.363 102.571-59.563 8.533 14.507 65.365 113.323c16.425 27.992 46.373 46.489 80.64 46.489s64.215-18.497 80.402-46.051l0.238-0.438zM228.864 146.261c-0.015 0-0.034 0-0.052 0-51.37 0-93.013 41.643-93.013 93.013 0 17.158 4.646 33.231 12.748 47.029l-0.237-0.437 110.251 190.976 9.557 17.067-17.067 7.509-94.379 40.107-13.653 5.973-7.509-12.971-104.448-180.907c-19.279-32.797-30.666-72.242-30.666-114.347 0-126.191 102.282-228.492 228.465-228.523h147.629v135.509h-147.627zM397.995 78.336l246.613-142.336v284.843l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507zM289.28 665.429l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507 246.613-142.336v284.843zM851.968 466.091v284.843l-246.613-142.507 246.613-142.336v284.843l-246.613-142.507 246.613-142.336z" />
|
||||
<glyph unicode="refresh" glyph-name="refresh" d="M716.894 672.58c-1.28 1.166-2.571 2.322-3.872 3.467-69.009 60.732-161.584 87.586-253.821 71.323-165.344-29.155-275.747-186.827-246.593-352.171s186.827-275.747 352.171-246.593c77.947 13.744 145.751 56.436 191.797 118.844 26.232 35.553 76.318 43.109 111.871 16.877s43.109-76.318 16.877-111.871c-70.189-95.128-173.971-160.472-292.762-181.418-252.367-44.499-493.024 124.011-537.524 376.378s124.011 493.024 376.378 537.524c140.63 24.797 282.185-16.266 387.309-108.781 5.96-5.245 11.78-10.637 17.455-16.171l48.279 43.47c11.75 10.579 26.999 16.435 42.81 16.439 35.346 0.008 64.006-28.639 64.014-63.986l0.048-215.702c0-2.244-0.117-4.487-0.352-6.718-3.703-35.152-35.2-60.646-70.352-56.944l-214.515 22.595c-15.724 1.656-30.278 9.074-40.857 20.824-23.651 26.267-21.53 66.734 4.737 90.386l46.901 42.23z" />
|
||||
<glyph unicode="recaptcha" glyph-name="recaptcha" d="M114.335 124.187c-38.041-38.154-75.279-75.503-113.445-113.782v7.172c0 130.93 0.028 261.861-0.040 392.791-0.007 14.057-1.071 28.124-0.808 42.171 2.28 121.833 41.967 229.877 119.48 323.798 19.492 23.619 41.184 45.108 64.736 64.685 0.938 0.779 1.846 1.601 2.712 2.459 0.304 0.301 0.441 0.772 0.8 1.433-37.48 37.561-74.974 75.135-112.467 112.709 0.162 0.473 0.324 0.945 0.486 1.418h5.583c130.729 0 261.457-0.032 392.187 0.044 14.935 0.008 29.878 1.111 44.804 0.885 118.38-1.799 223.831-39.896 316.319-113.972 26.184-20.971 49.824-44.586 71.313-70.366 1.057-1.268 2.177-2.484 3.544-4.039 37.904 38.044 75.565 75.844 113.225 113.646 0.413-0.171 0.824-0.34 1.236-0.51v-435.802h-434.84c-0.515 0.627-1.032 1.254-1.546 1.88 1.607 0.878 3.531 1.437 4.776 2.681 41.474 41.477 82.844 83.060 124.384 124.469 3.17 3.16 3.269 5.171 0.79 8.74-42.557 61.26-100.337 97.799-174.249 108.273-9.338 1.323-18.663 2.781-28.036 3.77-6.083 0.642-6.14 0.313-6.132-5.734 0.066-54.452 0.14-108.904 0.211-163.356 0.003-1.757 0-3.512 0-5.269l-2.322-1.681c-0.946 1.753-1.543 3.855-2.89 5.209-41.035 41.268-82.179 82.427-123.169 123.742-3.057 3.081-5.071 3.514-8.748 0.971-57.225-39.573-93.054-93.281-106.403-161.784-2.449-12.569-3.991-25.32-5.808-38.007-0.971-6.785-0.603-7.092 6.098-7.086 54.153 0.054 108.305 0.117 162.457 0.177 1.663 0.002 3.325 0.001 6.305 0.001-1.874-1.993-2.994-3.246-4.178-4.434-41.092-41.212-82.137-82.471-123.375-123.535-3.613-3.598-3.642-5.929-0.847-9.944 41.284-59.287 97.11-95.568 168.433-107.409 10.496-1.743 21.026-3.747 31.614-4.383 22.49-1.348 44.651 1.572 66.59 6.665 38.584 8.955 71.277 28.858 101.054 54.209 22.663 19.296 41.229 42.027 55.808 68.022 0.29 0.518 0.675 0.982 1.395 2.017 1.328-1.186 2.569-2.178 3.678-3.299 47.473-48.004 94.944-96.009 142.393-144.039 12.558-12.713 24.964-25.578 37.617-38.196 2.631-2.624 2.641-4.311 0.394-7.201-32.139-41.306-69.537-77.049-112.435-106.946-56.715-39.528-118.882-66.473-186.51-80.653-25.087-5.259-50.414-8.57-76.035-9.951-25.784-1.389-51.524-1.133-77.195 1.293-55.054 5.206-107.949 18.945-158.537 41.439-34.715 15.435-66.629 35.527-97.999 56.924-34.407 23.469-62.862 52.803-89.716 84.102-0.788 0.919-1.461 1.938-2.691 3.585z" />
|
||||
<glyph unicode="quote_2" glyph-name="quote-2" d="M214.449 82.518c-117.589 0-219.477 101.888-214.357 237.568 8.021 222.037 243.029 386.56 426.667 493.568l54.955-46.933c-131.413-78.336-259.755-199.168-267.264-339.456-5.12-141.141 167.083-206.165 167.083-211.627-2.56-73.045-75.776-133.291-167.083-133.291zM757.681 82.347c-117.419 0-219.307 102.4-214.187 237.568 7.851 221.867 242.859 386.389 425.643 493.568l54.955-46.763c-130.731-78.336-258.56-199.168-266.411-339.456-5.12-141.141 167.083-206.165 167.083-211.627-2.56-73.045-75.776-133.291-167.083-133.291z" />
|
||||
<glyph unicode="question" glyph-name="question" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM552.789 170.667c-11.513-10.623-26.956-17.137-43.921-17.137-1.059 0-2.113 0.025-3.16 0.076-0.751-0.050-1.805-0.076-2.864-0.076-16.965 0-32.408 6.514-43.966 17.177-11.108 11.186-18 26.656-18 43.736s6.893 32.549 18.048 43.779c12.419 10.757 28.738 17.313 46.589 17.313s34.17-6.556 46.681-17.392c11.062-11.151 17.955-26.621 17.955-43.7s-6.893-32.549-18.048-43.779zM676.352 527.531c-14.593-25.881-32.311-48.004-53.036-66.882l-32.638-31.081c-18.585-17.435-31.085-41.162-34.087-67.765l-1.582-24.907h-102.4c-0.104 2.643-0.163 5.746-0.163 8.863 0 28.82 5.063 56.457 14.347 82.072 11.385 24.359 28.247 46.249 49.016 63.625 18.67 15.401 34.551 32.639 47.867 51.794 8.039 12.997 12.482 27.729 12.496 43.498q0 68.271-62.464 68.271c-0.543 0.017-1.181 0.026-1.822 0.026-17.84 0-33.952-7.398-45.435-19.293-11.575-12.699-18.652-29.637-18.652-48.228 0-0.751 0.012-1.5 0.035-2.246l-116.056 0.109c-0.089 1.957-0.14 4.251-0.14 6.558 0 44.597 19.006 84.754 49.36 112.815 32.988 27.163 75.53 43.576 121.907 43.576 3.801 0 7.575-0.11 11.321-0.328q84.816 0.024 131.067-40.936c28.949-26.748 47.016-64.908 47.016-107.288 0-3.024-0.092-6.026-0.273-9.004 0.020 0.268 0.021 0.101 0.021-0.066 0-23.235-5.614-45.158-15.561-64.488z" />
|
||||
<glyph unicode="profile_male" glyph-name="profile-male" d="M921.991 173.375c-37.632 62.123-126.037 74.667-170.24 89.6s-129.173 76.907-129.173 76.907v44.8c17.386 16.117 32.259 34.602 44.19 55.017l0.61 1.132c1.792 3.136 3.285 6.123 4.779 8.96v1.195c1.195 2.688 2.24 5.077 3.136 7.467v1.643c0.825 2.114 1.645 4.757 2.298 7.466 1.567 7.063 2.834 15.217 3.613 23.513 7.977 2.92 12.009-1.41 22.165 24.723 11.499 29.867 30.912 96.171 18.219 110.208-2.949 3.455-7.309 5.633-12.176 5.633-3.373 0-6.503-1.045-9.081-2.83 6.241 25.947 9.791 55.696 9.791 86.275 0 7.749-0.228 15.445-0.678 23.080-5.775 93.026-97.764 146.937-182.884 155.298-94.379 9.259-91.989-7.317-102.144-40.917-68.992 1.045-98.261-62.421-98.261-62.421-16.725-38.229-17.771-88.107-3.136-159.787-2.527 1.75-5.655 2.795-9.028 2.795-4.867 0-9.228-2.177-12.159-5.61-12.712-14.060 6.701-80.812 18.2-110.229s14.933-21.205 23.595-24.341c0-3.883 1.195-19.413 2.091-23.445 11.669-33.197 30.989-61.224 55.92-82.983l0.231-46.192s-85.12-62.123-129.323-76.907-132.459-27.776-170.091-89.6-36.437-173.824-36.437-173.824h891.968s1.643 111.253-35.989 173.376z" />
|
||||
<glyph unicode="power_on_off" glyph-name="power-on-off" d="M916.651 761.003c-12.235 15.422-30.974 25.224-52.003 25.224-15.397 0-29.566-5.255-40.813-14.069l0.144 0.109c-15.645-12.197-25.611-31.046-25.611-52.223 0-15.306 5.207-29.396 13.945-40.596l-0.11 0.147c49.588-63.037 79.531-143.561 79.531-231.079 0-0.181 0-0.363 0-0.544v0.028c0-209.721-170.012-379.733-379.733-379.733s-379.733 170.012-379.733 379.733v0c-0.001 0.37-0.002 0.807-0.002 1.245 0 87.421 29.877 167.864 79.977 231.675l-0.615-0.813c8.478 10.994 13.589 24.965 13.589 40.129 0 21.067-9.863 39.83-25.223 51.924l-0.141 0.107c-11.057 8.587-25.133 13.767-40.419 13.767-21.171 0-40.022-9.936-52.144-25.398l-0.109-0.144c-66.83-85.078-107.179-193.714-107.179-311.774 0-0.252 0-0.504 0.001-0.756v0.040c0-282.77 229.23-512 512-512s512 229.23 512 512v0c0.002 0.53 0.003 1.158 0.003 1.785 0 117.964-40.283 226.52-107.844 312.661l0.833-1.103zM512 382.123c36.271 0.193 65.61 29.593 65.707 65.868v445.961c0 36.477-29.571 66.048-66.048 66.048s-66.048-29.571-66.048-66.048v0-445.952c0.097-36.404 29.63-65.878 66.048-65.878 0.12 0 0.24 0 0.36 0.001h-0.018z" />
|
||||
<glyph unicode="post_pin" glyph-name="post-pin" d="M536.811 853.105l109.038 106.895 378.152-376.456-109.038-109.219c-32.479 20.14-67.665 28.66-105.558 25.562s-69.985-18.59-96.278-46.476l-46.399-44.152c-26.293-27.886-41.372-60.806-45.239-98.762s4.253-73.2 24.359-105.733l-106.718-106.895-143.837 144.076-167.036-167.314c-10.826-10.844-31.706-27.886-62.639-51.124-38.666-27.886-71.918-49.574-99.758-65.066-34.026-20.14-54.905-26.724-62.639-19.752s-1.547 28.273 18.56 63.905c15.466 27.886 37.119 60.419 64.959 97.6 23.2 32.533 40.212 54.222 51.039 65.066l167.036 164.99-143.837 144.076 109.038 109.219c30.933-20.14 65.345-28.66 103.238-25.562s70.758 18.59 98.598 46.476l44.079 44.152c27.84 27.886 43.692 60.806 47.559 98.762s-5.026 73.2-26.679 105.733z" />
|
||||
<glyph unicode="popup" glyph-name="popup" d="M64 960h896c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64zM256 704c-35.346 0-64-28.654-64-64v-384c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v384c0 35.346-28.654 64-64 64h-512zM704 640c35.346 0 64-28.654 64-64s-28.654-64-64-64c-35.346 0-64 28.654-64 64s28.654 64 64 64z" />
|
||||
<glyph unicode="plus_circle" glyph-name="plus-circle" d="M576 512v128c0 35.346-28.654 64-64 64s-64-28.654-64-64v-128h-128c-35.346 0-64-28.654-64-64s28.654-64 64-64h128v-128c0-35.346 28.654-64 64-64s64 28.654 64 64v128h128c35.346 0 64 28.654 64 64s-28.654 64-64 64h-128zM512-64c-282.77 0-512 229.23-512 512s229.23 512 512 512c282.77 0 512-229.23 512-512s-229.23-512-512-512z" />
|
||||
<glyph unicode="plus" glyph-name="plus" d="M592 528h224c44.183 0 80-35.817 80-80s-35.817-80-80-80h-224v-224c0-44.183-35.817-80-80-80s-80 35.817-80 80v224h-224c-44.183 0-80 35.817-80 80s35.817 80 80 80h224v224c0 44.183 35.817 80 80 80s80-35.817 80-80v-224z" />
|
||||
<glyph unicode="plugin_2" glyph-name="plugin-2" d="M757.93 655.274l2.731 274.603c0.001 0.101 0.002 0.221 0.002 0.341 0 16.212-13.143 29.355-29.355 29.355-0.001 0-0.001 0-0.002 0h-87.040c-16.055-0.093-29.068-12.987-29.354-28.986l-2.731-275.312h-200.021l2.731 274.432c0.003 0.152 0.004 0.332 0.004 0.512 0 16.154-13.048 29.26-29.179 29.354h-87.049c-0.001 0-0.003 0-0.004 0-16.126 0-29.233-12.929-29.521-28.986l-2.731-275.312h-76.971v-168.96c0.699-144.669 96.73-266.722 228.462-306.607l5.010-214.268c0.049-8.233 3.581-15.631 9.196-20.803 5.313-5.089 12.508-8.21 20.432-8.21 0.024 0 0.048 0 0.072 0h-0.004c29.355 0 45.568 0.853 61.781 1.536s31.573 1.365 59.904 1.536c0.001 0 0.001 0 0.002 0 16.281 0 29.501 13.101 29.694 29.336v209.597c133.939 40.538 229.895 162.573 230.57 307.121v169.039z" />
|
||||
<glyph unicode="plug_disconnected" glyph-name="plug-disconnected" d="M609.963 390.827c-3.917 3.892-9.315 6.297-15.275 6.297s-11.358-2.405-15.276-6.298l0.001 0.001-130.048-130.56-125.099 125.099 130.048 130.048c3.892 3.917 6.297 9.315 6.297 15.275s-2.405 11.358-6.298 15.276l-30.548 30.548c-3.917 3.892-9.315 6.297-15.275 6.297s-11.358-2.405-15.276-6.298l-130.047-130.047-32.597 32.597c-3.101 3.17-7.422 5.135-12.203 5.135s-9.101-1.965-12.2-5.132l-83.63-83.63c-37.202-37.444-60.196-89.045-60.196-146.015 0-45.244 14.502-87.1 39.111-121.175l-0.419 0.609-82.091-82.091c-11.749-11.749-19.016-27.981-19.016-45.909 0-35.857 29.068-64.926 64.926-64.926 17.929 0 34.16 7.267 45.909 19.016l82.091 82.091c33.426-24.103 75.209-38.549 120.366-38.549 57.155 0 108.904 23.143 146.389 60.568l-0.003-0.003 83.456 83.627c3.17 3.101 5.135 7.422 5.135 12.203s-1.965 9.101-5.132 12.2l-32.6 32.6 130.048 130.048c3.892 3.917 6.297 9.315 6.297 15.275s-2.405 11.358-6.298 15.276l0.001-0.001zM1005.056 941.056c-11.741 11.767-27.975 19.046-45.909 19.046s-34.168-7.28-45.908-19.045l-84.481-84.481c-33.426 24.103-75.209 38.549-120.366 38.549-57.155 0-108.904-23.143-146.389-60.568l0.003 0.003-84.139-83.627c-3.17-3.101-5.135-7.422-5.135-12.203s1.965-9.101 5.132-12.2l312.664-312.664c3.101-3.17 7.422-5.135 12.203-5.135s9.101 1.965 12.2 5.132l83.63 83.63c37.423 37.482 60.565 89.231 60.565 146.386 0 45.157-14.446 86.94-38.97 120.98l0.42-0.613 84.48 84.48c11.767 11.741 19.046 27.975 19.046 45.909s-7.28 34.168-19.045 45.908l-0.001 0.001z" />
|
||||
<glyph unicode="plug_connected" glyph-name="plug-connected" d="M354.645 573.269c-2.821 2.878-6.749 4.661-11.093 4.661s-8.272-1.784-11.091-4.659l-0.002-0.003-119.467-119.467c-33.906-33.962-54.873-80.85-54.873-132.635 0-40.902 13.080-78.749 35.286-109.586l-0.381 0.556-175.957-175.787c-10.657-10.657-17.249-25.38-17.249-41.643 0-32.525 26.367-58.892 58.892-58.892 16.262 0 30.985 6.592 41.643 17.249v0l175.787 176.128c30.28-21.825 68.127-34.905 109.029-34.905 51.785 0 98.673 20.967 132.637 54.876l119.465 119.465c2.836 2.84 4.59 6.762 4.59 11.093s-1.754 8.253-4.59 11.094v0zM1006.933 942.933c-10.629 10.65-25.324 17.239-41.557 17.239s-30.929-6.589-41.556-17.238l-176.129-175.958c-30.26 21.781-68.071 34.834-108.93 34.834-51.75 0-98.609-20.939-132.568-54.806l-119.463-119.463c-2.836-2.84-4.59-6.762-4.59-11.093s1.754-8.253 4.59-11.094v0l282.624-282.624c2.821-2.878 6.749-4.661 11.093-4.661s8.272 1.784 11.091 4.659l0.002 0.003 119.467 119.467c33.906 33.962 54.873 80.85 54.873 132.635 0 40.902-13.080 78.749-35.286 109.586l0.381-0.556 175.957 175.787c10.701 10.637 17.325 25.366 17.325 41.643s-6.623 31.006-17.322 41.64l-0.003 0.003z" />
|
||||
<glyph unicode="play" glyph-name="play" d="M293.643 886.078l531.188-386.319c28.586-20.79 34.906-60.816 14.116-89.402-3.938-5.415-8.701-10.178-14.116-14.116l-531.188-386.319c-28.586-20.79-68.612-14.47-89.402 14.116-7.956 10.939-12.241 24.117-12.241 37.643v772.637c0 35.346 28.654 64 64 64 13.526 0 26.704-4.285 37.643-12.241z" />
|
||||
<glyph unicode="pin" glyph-name="pin" d="M297.155 870.486c125.418 101.021 304.273 101.021 429.691 0 123.952-99.841 157.486-274.697 79.264-413.31l-294.109-521.176-294.109 521.176c-78.222 138.613-44.689 313.469 79.264 413.31zM512 486.4c70.692 0 128 57.308 128 128s-57.308 128-128 128c-70.692 0-128-57.308-128-128s57.308-128 128-128z" />
|
||||
<glyph unicode="photo_picture" glyph-name="photo-picture" d="M128 831.909h768c70.692 0 128-57.308 128-128v-512c0-70.692-57.308-128-128-128h-768c-70.692 0-128 57.308-128 128v512c0 70.692 57.308 128 128 128zM864 192c17.673 0 32 14.327 32 32v448c0 17.673-14.327 32-32 32h-704c-17.673 0-32-14.327-32-32v-277.114c0-10.479 5.131-20.294 13.735-26.275 14.511-10.087 34.453-6.501 44.54 8.011l5.468 7.866c3.088 5.029 9.354 8.471 16.582 8.471s13.494-3.441 16.631-8.559l42.74-61.863 174.711 252.92c5.545 10.301 17.931 17.472 32.319 17.472 14.004 0 26.108-6.793 31.951-16.825l262.042-379.694c0.826-1.341 1.457-2.78 1.886-4.41h93.395zM736 640c53.019 0 96-42.981 96-96s-42.981-96-96-96c-53.019 0-96 42.981-96 96s42.981 96 96 96z" />
|
||||
<glyph unicode="phone" glyph-name="phone" d="M96 644.091c0.383 6.356 0.719 12.715 1.158 19.067 2.407 34.835 9.752 68.393 22.669 100.482 10.283 25.546 23.75 49 40.315 70.389 11.371 14.684 24.127 27.819 37.886 39.915 11.775 10.351 23.209 21.152 34.745 31.815 7.805 7.214 16.098 13.568 25.71 17.741 16.771 7.281 32.938 5.537 48.531-3.861 15.58-9.389 27.495-23.14 38.498-37.917 14.867-19.967 26.85-42.028 39.684-63.47 9.421-15.74 18.561-31.656 26.011-48.611 7.548-17.177 13.557-34.88 15.397-53.95 2.536-26.278-3.773-49.817-20.485-69.211-9.59-11.13-20.792-20.641-31.103-31.069-10.013-10.126-21.434-18.212-32.501-26.842-13.34-10.402-23.591-23.417-27.874-41.004-3.58-14.703-2.625-29.374 0.561-43.979 4.338-19.88 12.228-38.199 21.467-55.904 16.31-31.257 36.336-59.679 57.602-87.145 20.172-26.052 41.282-51.184 64.197-74.492 19.154-19.485 39.281-37.668 62.295-51.801 13.611-8.358 27.832-14.956 43.525-17.296 20.317-3.030 38.018 3.112 53.341 17.542 3.092 2.911 6.23 5.854 8.874 9.211 11.704 14.855 25.651 27.129 39.36 39.64 7.778 7.098 15.694 14.267 24.381 19.919 21.681 14.106 44.907 15.397 68.798 7.237 19.479-6.653 36.955-17.52 52.816-31.050 19.334-16.493 38.017-33.873 56.871-51.008 13.325-12.112 25.947-25.026 36.91-39.689 9.418-12.596 17.396-26.049 20.847-42.074 0.578-2.685 1.014-5.405 1.515-8.109v-9.888c-0.282-1.5-0.581-2.997-0.845-4.501-2.861-16.304-11.322-29.058-22.392-39.964-10.796-10.635-22.351-20.414-32.79-31.428-23.2-24.478-49.419-44.015-79.015-58.372-29.561-14.341-60.527-22.693-92.863-25.201-5.43-0.421-10.862-0.81-16.293-1.214h-12.641c-1.228 0.156-2.453 0.36-3.685 0.46-8.106 0.661-16.235 1.068-24.315 1.989-29.335 3.343-57.659 11.278-85.211 22.44-43.679 17.696-83.615 42.727-121.293 72.116-32.133 25.064-62.033 52.964-90.438 82.743-33.21 34.815-64.16 71.844-93.455 110.497-28.62 37.762-55.164 77.111-78.554 118.856-27.723 49.479-50.598 101.29-64.649 157.281-6.417 25.57-10.826 51.513-12.438 77.972-0.368 6.048-0.749 12.095-1.123 18.143v13.596z" />
|
||||
<glyph unicode="performance" glyph-name="performance" d="M417.792 403.456c1.004 1.77 1.595 3.888 1.595 6.144 0 6.975-5.654 12.629-12.629 12.629-0.021 0-0.042 0-0.063 0h-143.698c-2.535 0.013-4.584 2.071-4.584 4.608 0 1.352 0.582 2.567 1.509 3.41l0.004 0.003 508.075 460.629c-72.482 41.722-159.387 66.332-252.040 66.332-282.77 0-512-229.23-512-512 0-168.707 81.597-318.357 207.479-411.636l1.383-0.979zM789.675 878.080l-186.88-329.045c-0.991-1.775-1.574-3.894-1.574-6.15 0-7.069 5.731-12.8 12.8-12.8 0.133 0 0.266 0.002 0.399 0.006h143.341c2.531-0.018 4.577-2.074 4.577-4.608 0-1.265-0.51-2.41-1.334-3.243v0l-527.36-503.808c80.343-54.904 179.602-87.673 286.514-87.673 282.77 0 512 229.23 512 512 0 182.975-95.982 343.532-240.344 434.070l-2.138 1.251z" />
|
||||
<glyph unicode="pencil" glyph-name="pencil" d="M0-34.987c-0.395-1.591-0.622-3.418-0.622-5.298 0-6.68 2.864-12.692 7.432-16.873 4.214-4.6 10.225-7.464 16.906-7.464 1.88 0 3.707 0.227 5.455 0.655l312.163 95.029 674.133 674.133c4.857 4.876 7.86 11.602 7.86 19.029s-3.003 14.153-7.861 19.030l-208.212 208.895c-4.849 4.847-11.546 7.845-18.944 7.845s-14.095-2.998-18.944-7.845l-674.304-674.816zM88.235 24.917l60.757 199.168 139.093-139.093z" />
|
||||
<glyph unicode="pause" glyph-name="pause" d="M320 832h64c35.346 0 64-28.654 64-64v-640c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64zM640 832h64c35.346 0 64-28.654 64-64v-640c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="paperclip" glyph-name="paperclip" d="M248.822-63.976c-51.495 1.136-97.52 23.616-129.751 58.91-61.91 61.751-69.59 121.313-65.321 160.396 7.914 52.328 33.104 97.701 69.471 131.097l392.695 392.679c109.568 109.568 182.443 69.462 216.235 35.84 40.789-40.789 68.267-111.275-36.693-215.381l-361.301-361.472-70.315 70.998 361.131 360.448c55.636 55.636 42.839 68.267 36.693 74.752s-19.797 19.797-75.435-35.84l-392.534-392.534c-20.474-18.438-35.098-43.015-40.978-70.817-3.054-26.463 8.893-52.063 36.37-79.711 34.133-34.133 59.904-30.549 68.267-29.355 30.677 7.419 56.812 23.685 76.316 45.914l465.551 465.744c32.165 29.338 56.871 66.31 71.298 108.071 14.547 53.038-2.178 100.313-50.648 148.782-51.2 51.2-133.291 104.448-257.536-19.968l-428.715-429.739c-9.043-9.107-21.57-14.742-35.413-14.742-27.56 0-49.901 22.344-49.901 49.901 0 13.716 5.534 26.14 14.491 35.16l429.224 429.736c133.291 132.779 278.528 140.117 398.678 19.797 93.184-93.184 93.184-183.979 76.627-243.712-19.472-60.91-53.065-112.682-97.048-153.387l-465.811-465.621c-34.177-37.539-79.859-64.066-131.449-74-8.080-1.219-15.674-1.778-23.4-1.778-0.281 0-0.562 0.001-0.843 0.002z" />
|
||||
<glyph unicode="paint_bucket" glyph-name="paint-bucket" d="M907.435 459.947v0l-383.488 383.488c-5.437 5.441-12.949 8.806-21.248 8.806s-15.811-3.365-21.248-8.806l-62.806-62.806-134.485 134.315c-10.895 11.861-26.477 19.268-43.789 19.268-32.801 0-59.392-26.591-59.392-59.392 0-17.609 7.664-33.429 19.837-44.305l133.86-133.853-325.803-325.803c-5.39-5.428-8.721-12.906-8.721-21.163s3.331-15.735 8.723-21.164l383.657-383.657c5.437-5.441 12.949-8.806 21.248-8.806s15.811 3.365 21.248 8.806l472.406 472.576c5.4 5.455 8.736 12.962 8.736 21.248s-3.336 15.793-8.739 21.251zM671.915 349.696h-515.584l346.453 346.453 257.877-257.707zM1002.667 151.040l-71.339 123.563-1.195 2.731c-3.657 4.662-9.29 7.629-15.616 7.629s-11.959-2.967-15.584-7.586l-0.032-0.043v-1.195c-0.98-1.283-1.837-2.743-2.509-4.303l-69.683-120.796c-13.484-18.059-21.589-40.821-21.589-65.475 0-60.796 49.284-110.080 110.080-110.080s110.080 49.284 110.080 110.080c0 24.655-8.105 47.416-21.796 65.766z" />
|
||||
<glyph unicode="page_pdf" glyph-name="page-pdf" d="M407.040 307.541h-58.368v-109.227h33.109v34.133h25.259c0.757-0.054 1.64-0.085 2.53-0.085 20.736 0 37.547 16.81 37.547 37.547s-16.81 37.547-37.547 37.547c-0.89 0-1.773-0.031-2.648-0.092zM402.773 261.291h-20.992v17.067h20.992c5.632 0 9.899-2.731 9.899-8.704s-4.437-8.533-9.899-8.533zM512 307.541h-48.469v-109.227h48.469c34.133 0 59.733 19.797 59.733 54.784s-25.6 54.443-59.733 54.443zM512 227.157h-15.36v51.2h15.36c0.742 0.082 1.602 0.128 2.474 0.128 13.196 0 23.893-10.697 23.893-23.893 0-0.706-0.031-1.405-0.091-2.095 0.007 0.033 0.007-0.035 0.007-0.102 0-13.95-11.309-25.259-25.259-25.259-0.36 0-0.719 0.008-1.076 0.022zM592.384 198.315h33.109v40.789h48.64v28.843h-48.64v10.752h49.835v28.843h-82.944v-109.227zM870.4 891.733v0 47.787c0 11.311-9.169 20.48-20.48 20.48h-389.12l-307.2-307.2v-696.32c0-11.311 9.169-20.48 20.48-20.48h675.84c11.311 0 20.48 9.169 20.48 20.48v29.013zM271.531 53.931v557.909h209.749c11.311 0 20.48 9.169 20.48 20.48v209.749h250.88v-788.139z" />
|
||||
<glyph unicode="page_multiple" glyph-name="page-multiple" d="M911.531 741.206h-38.059v-733.867c0-9.426-7.641-17.067-17.067-17.067h-542.208v-37.205c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067v771.584c0 9.426-7.641 17.067-17.067 17.067zM818.688 61.953v772.096c0 9.426-7.641 17.067-17.067 17.067h-37.547v-733.867c0-9.426-7.641-17.067-17.067-17.067h-542.208v-38.059c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067zM709.803 171.35v771.584c0 9.426-7.641 17.067-17.067 17.067h-580.267c-9.426 0-17.067-7.641-17.067-17.067v-771.584c0-9.426 7.641-17.067 17.067-17.067h580.267c9.426 0 17.067 7.641 17.067 17.067z" />
|
||||
<glyph unicode="page" glyph-name="page" d="M870.4 891.733v0 47.787c0 11.311-9.169 20.48-20.48 20.48h-389.12l-307.2-307.2v-696.32c0-11.311 9.169-20.48 20.48-20.48h675.84c11.311 0 20.48 9.169 20.48 20.48v29.013zM271.531 53.931v557.909h209.749c11.311 0 20.48 9.169 20.48 20.48v209.749h250.88v-788.139z" />
|
||||
<glyph unicode="open_new_window" glyph-name="open-new-window" d="M840.532 896h-238.933v-119.467h154.411l-468.011-467.563c-0.527-0.539-0.854-1.277-0.854-2.091s0.326-1.552 0.854-2.092l80.788-80.788c0.539-0.527 1.277-0.854 2.091-0.854s1.552 0.326 2.092 0.854l467.562 468.010v-154.411h119.467v358.4zM840.532 149.333c0-16.495-13.372-29.867-29.867-29.867v0h-597.333c-16.495 0-29.867 13.372-29.867 29.867v0 597.333c0 16.495 13.372 29.867 29.867 29.867v0h194.133v119.467h-224c-65.979 0-119.467-53.487-119.467-119.467v0-657.067c0-65.979 53.487-119.467 119.467-119.467v0h657.067c65.979 0 119.467 53.487 119.467 119.467v0 224h-119.467z" />
|
||||
<glyph unicode="movefooter" glyph-name="movefooter" d="M128 896h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 384h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="more" glyph-name="more" d="M236.715 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272zM630.272 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272zM1024 448c0-65.32-52.952-118.272-118.272-118.272s-118.272 52.952-118.272 118.272c0 65.32 52.952 118.272 118.272 118.272s118.272-52.952 118.272-118.272z" />
|
||||
<glyph unicode="monitor" glyph-name="monitor" d="M961.194 860.245h-898.389c-34.686 0-62.805-28.119-62.805-62.805v-548.011c0-34.686 28.119-62.805 62.805-62.805h338.261v-95.232h-104.789c-9.897 0-17.92-8.023-17.92-17.92v-19.456c-0.002-0.102-0.003-0.221-0.003-0.341 0-9.897 8.023-17.92 17.92-17.92 0.001 0 0.002 0 0.003 0h422.229c9.897 0 17.92 8.023 17.92 17.92v19.627c0 9.897-8.023 17.92-17.92 17.92h-95.573v95.232h338.261c0 0 0 0 0 0 34.686 0 62.805 28.119 62.805 62.805 0 0.060 0 0.12 0 0.18v548.001c0 34.686-28.119 62.805-62.805 62.805zM111.956 749.311h800.085v-451.755h-800.085z" />
|
||||
<glyph unicode="mail" glyph-name="mail" d="M0 576l512-192 512 192v-384c0-70.692-57.308-128-128-128h-768c-70.692 0-128 57.308-128 128v384zM128 832h768c70.692 0 128-57.308 128-128v-32l-512-192-512 192v32c0 70.692 57.308 128 128 128z" />
|
||||
<glyph unicode="magnifying_glass_search" glyph-name="magnifying-glass-search" d="M1024 39.595l-226.816 226.816c50.818 70.758 81.267 159.126 81.267 254.605 0 242.711-196.756 439.467-439.467 439.467s-439.467-196.756-439.467-439.467c0-242.711 196.756-439.467 439.467-439.467 95.479 0 183.847 30.449 255.922 82.165l225.67-227.715zM146.432 520.704c0 0.051 0 0.111 0 0.171 0 161.744 131.12 292.864 292.864 292.864s292.864-131.12 292.864-292.864c0-161.744-131.12-292.864-292.864-292.864-161.606 0.194-292.573 131.101-292.864 292.665z" />
|
||||
<glyph unicode="logout" glyph-name="logout" d="M640 384h-256c-35.346 0-64 28.654-64 64s28.654 64 64 64h256v80.297c0 15.811 5.852 31.062 16.429 42.814 23.645 26.273 64.112 28.402 90.385 4.757l160.33-144.297c1.668-1.501 3.256-3.089 4.757-4.757 23.645-26.273 21.516-66.739-4.757-90.385l-160.33-144.297c-11.752-10.577-27.003-16.429-42.814-16.429-35.346 0-64 28.654-64 64v80.297zM192 64h320c35.346 0 64-28.654 64-64s-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v896c0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64s-28.654-64-64-64h-320v-768z" />
|
||||
<glyph unicode="lock" glyph-name="lock" d="M222.575 512l0.016 102.193c7.191 156.872 134.178 281.807 289.779 281.807s282.589-124.933 289.803-282.466v-101.534h29.827c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h30.575zM386.045 512h251.758v101.532c0 70.902-56.355 128.377-125.878 128.377s-125.88-57.478-125.88-128.377v-101.532z" />
|
||||
<glyph unicode="loader" glyph-name="loader" d="M512 960c-34.404 0-62.293-27.89-62.293-62.293v-151.723c0-34.404 27.89-62.293 62.293-62.293s62.293 27.89 62.293 62.293v151.723c0 34.404-27.89 62.293-62.293 62.293zM512 212.309c-34.404 0-62.293-27.89-62.293-62.293v-151.723c0-34.404 27.89-62.293 62.293-62.293s62.293 27.89 62.293 62.293v151.723c0 34.404-27.89 62.293-62.293 62.293zM722.603 596.309c0.033 0 0.071 0 0.11 0 17.165 0 32.7 6.981 43.92 18.259l107.352 107.352c11.99 11.377 19.45 27.428 19.45 45.221 0 34.404-27.89 62.293-62.293 62.293-17.793 0-33.843-7.46-45.195-19.422l-107.375-107.377c-11.263-11.271-18.229-26.838-18.229-44.032 0-34.392 27.871-62.275 62.26-62.293zM301.397 299.691c-0.033 0-0.071 0-0.11 0-17.165 0-32.7-6.981-43.92-18.259l-107.352-107.352c-11.99-11.377-19.45-27.428-19.45-45.221 0-34.404 27.89-62.293 62.293-62.293 17.793 0 33.843 7.46 45.195 19.422l107.375 107.377c11.263 11.271 18.229 26.838 18.229 44.032 0 34.392-27.871 62.275-62.26 62.293zM961.707 510.293h-151.723c-34.404 0-62.293-27.89-62.293-62.293s27.89-62.293 62.293-62.293h151.723c34.404 0 62.293 27.89 62.293 62.293s-27.89 62.293-62.293 62.293zM276.309 448c0 34.404-27.89 62.293-62.293 62.293h-151.723c-34.404 0-62.293-27.89-62.293-62.293s27.89-62.293 62.293-62.293h151.723c34.404 0 62.293 27.89 62.293 62.293zM766.635 281.429c-11.377 11.99-27.428 19.45-45.221 19.45-34.404 0-62.293-27.89-62.293-62.293 0-17.793 7.46-33.843 19.422-45.195l107.377-107.375c11.377-11.99 27.428-19.45 45.221-19.45 34.404 0 62.293 27.89 62.293 62.293 0 17.793-7.46 33.843-19.422 45.195zM238.080 809.984c-11.14 10.571-26.233 17.073-42.843 17.073-34.404 0-62.293-27.89-62.293-62.293 0-16.611 6.502-31.703 17.099-42.871l107.323-107.322c11.377-11.99 27.428-19.45 45.221-19.45 34.404 0 62.293 27.89 62.293 62.293 0 17.793-7.46 33.843-19.422 45.195z" />
|
||||
<glyph unicode="list_number" glyph-name="list-number" d="M384 832h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 512h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 192h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM85.76 687.36v108.16c-4.8-2.24-9.92-3.52-15.040-3.52-18.56 0-32.32 13.44-32.32 32 0 21.44 14.4 30.4 16.64 29.44 6.4-4.16 12.48-6.4 20.16-6.4 13.76 0 25.28 8.64 28.8 23.36h16.64c18.24 0 28.16-9.92 28.16-29.76v-153.28c0-19.52-9.92-29.76-28.16-29.76h-8c-17.6 0-26.88 10.24-26.88 29.76zM25.6 369.6v12.16c0 36.16 35.52 56.64 63.36 69.12 24 11.2 42.56 16.64 42.56 29.44 0 13.12-8.64 19.84-26.56 19.84-21.44 0-34.24-16-37.44-32.32 0-0.64-41.28-2.24-41.28 28.48s29.76 54.080 82.88 54.080c54.72 0 84.48-24.96 84.48-66.88 0-39.68-27.2-52.48-56.64-63.36-24.96-9.6-43.52-16.64-51.2-30.4h79.36c22.080 0 30.080-8.32 30.080-23.36v-2.56c0-16-7.68-24.96-30.080-24.96h-101.12c-29.76 0-38.4 4.16-38.4 30.72zM22.4 62.72c0 32 37.12 31.36 37.76 29.12 5.44-19.52 21.76-29.44 44.8-29.44 20.16 0 32.32 8.32 32.32 21.44s-7.68 18.88-24.32 18.88h-6.4c-20.8 0-29.44 6.72-29.44 20.8v3.2c0 14.080 9.6 21.12 28.8 21.12h11.2c11.2 0 18.24 6.080 18.24 15.68 0 11.52-11.84 18.88-31.36 18.88-27.2 0-37.44-15.040-40.96-27.52-0.32-2.56-36.8-3.52-36.8 28.8 0 26.56 30.4 46.72 79.040 46.72 57.92 0 89.28-20.16 89.28-57.92 0-20.48-13.44-34.88-37.76-41.92 26.56-8.64 40.96-26.56 40.96-51.84 0-40.96-33.28-64.32-92.16-64.32-51.52 0-83.2 22.080-83.2 48.32z" />
|
||||
<glyph unicode="list_bullet" glyph-name="list-bullet" d="M384 832h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 512h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM384 192h576c35.346 0 64-28.654 64-64s-28.654-64-64-64h-576c-35.346 0-64 28.654-64 64s28.654 64 64 64zM64 864h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM64 544h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM64 224h64c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="list" glyph-name="list" d="M128 544h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM128 864h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM128 224h768c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="link" glyph-name="link" d="M937.837 873.837c-53.702 53.791-127.937 87.068-209.944 87.068-76.601 0-146.422-29.035-199.058-76.699l0.252 0.225-150.034-150.034c-25.673-25.71-46.631-56.139-61.458-89.87-31.665-15.309-58.252-32.532-81.502-53.399l0.273 0.241-150.205-149.693c-52.709-53.514-85.256-127.017-85.256-208.121 0-163.835 132.815-296.651 296.651-296.651 81.104 0 154.606 32.547 208.158 85.293l149.997 149.998c20.623 22.976 37.846 49.563 50.526 78.588 36.363 17.467 66.791 38.424 92.506 64.102l149.86 150.202c47.293 52.346 76.23 122.061 76.23 198.535 0 81.887-33.179 156.025-86.826 209.703zM404.516 128.793v0c-27.092-27.092-64.52-43.849-105.861-43.849-82.683 0-149.711 67.027-149.711 149.711 0 41.341 16.757 78.769 43.849 105.861v0l109.365 109.365c27.541-103.91 107.782-184.094 209.666-211.089zM485.855 421.684c-24.798 24.767-40.912 58.225-43.38 95.415 74.752-4.514 134.187-63.89 139.22-138.191-37.617 2.019-71.081 18.136-95.838 42.944zM840.435 564.883l-118.763-118.763c-27.478 103.889-107.663 184.074-209.496 211.088l107.479 110 9.228 9.228c26.164 22.926 60.662 36.91 98.428 36.91 82.673 0 149.693-67.019 149.693-149.693 0-37.766-13.985-72.264-37.059-98.6z" />
|
||||
<glyph unicode="like" glyph-name="like" d="M66.821 114.541c-0.050 0.711-0.079 1.54-0.079 2.375s0.029 1.664 0.086 2.486l-0.007 368.828c0 19.18 15.548 34.728 34.728 34.728h68.118c18.63-0.575 33.532-15.737 33.688-34.415v-376.966c-1.836-17.264-16.143-30.648-33.651-31.017l-0.036-0.001h-68.118c-0.003 0-0.006 0-0.007 0-18.918 0-34.303 15.127-34.718 33.946zM272.364 56.662v500.131c0 19.18 15.548 34.728 34.728 34.728h138.018c2.18 3.226 4.679 6.007 7.51 8.41l135.406 234.531c13.649 24.095 39.075 40.115 68.252 40.219 43.398-0.502 78.374-35.789 78.374-79.244 0-0.158-0.001-0.316-0.002-0.474l0.741 0.024v-203.466h188.031c18.793-0.498 33.836-15.849 33.836-34.715 0-0.005 0-0.007 0-0.012v0.001-385.857c-0.020-4.751-1.943-9.047-5.047-12.17l-133.565-133.565c-2.904-2.418-6.674-3.885-10.786-3.885-0.855 0-1.694 0.063-2.514 0.185l-498.256-0.011c-0.011 0-0.025 0-0.038 0-18.523 0-33.645 14.565-34.537 32.866l-0.004 0.080v1.039s0 0 0 0 0 0 0 0zM916.448 169.748v0 0z" />
|
||||
<glyph unicode="lightbulb" glyph-name="lightbulb" d="M858.453 613.355c0 0.114 0 0.249 0 0.384 0 191.341-155.112 346.453-346.453 346.453s-346.453-155.112-346.453-346.453c0-103.281 45.193-196.007 116.883-259.48 16.89-14.701 27.326-35.713 27.501-59.166v-44.063c0-0.051 0-0.111 0-0.171 0-23.187 18.797-41.984 41.984-41.984 0 0 0 0 0 0h320.171c23.187 0 41.984 18.797 41.984 41.984v44.203c0.203 23.426 10.635 44.375 27.040 58.628 72.14 63.639 117.344 156.172 117.344 259.263 0 0.142 0 0.283 0 0.425zM695.978 74.389h-367.957c-9.991 0-18.091 8.099-18.091 18.091v39.424c0 9.991 8.099 18.091 18.091 18.091h367.957c9.991 0 18.091-8.099 18.091-18.091v-39.424c0-9.991-8.099-18.091-18.091-18.091zM631.125-64.192h-238.933c-9.991 0-18.091 8.099-18.091 18.091v39.253c0 9.991 8.099 18.091 18.091 18.091h238.933c9.991 0 18.091-8.099 18.091-18.091v-39.424c-0.097-9.918-8.159-17.92-18.090-17.92 0 0-0.001 0-0.001 0z" />
|
||||
<glyph unicode="layout_grid" glyph-name="layout-grid" d="M464 512h96c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64zM128 896h96c35.346 0 64-28.654 64-64v-416c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v416c0 35.346 28.654 64 64 64zM128 256h96c35.346 0 64-28.654 64-64v-128c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v128c0 35.346 28.654 64 64 64zM800 896h96c35.346 0 64-28.654 64-64v-320c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v320c0 35.346 28.654 64 64 64zM800 352h96c35.346 0 64-28.654 64-64v-224c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v224c0 35.346 28.654 64 64 64zM464 896h96c35.346 0 64-28.654 64-64v-160c0-35.346-28.654-64-64-64h-96c-35.346 0-64 28.654-64 64v160c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="layout" glyph-name="layout" d="M958.507 723.968h-893.163v116.928c0 30.433 24.671 55.104 55.104 55.104h782.955c30.433 0 55.104-24.671 55.104-55.104zM272.171 0h-151.723c-30.433 0-55.104 24.671-55.104 55.104v610.624h206.827zM327.424 665.728h631.232v-331.072h-631.232v331.072zM903.403 0h-575.979v275.968h631.083v-220.864c0-30.433-24.671-55.104-55.104-55.104z" />
|
||||
<glyph unicode="layers" glyph-name="layers" d="M1011.883 558.080l-447.829-260.267c-14.438-8.497-31.806-13.517-50.347-13.517s-35.908 5.019-50.819 13.773l-450.77 260.181c-7.29 4.311-12.102 12.132-12.102 21.077s4.812 16.766 11.989 21.015l435.655 253.161c17.935 10.569 39.513 16.813 62.549 16.813s44.615-6.244 63.135-17.131l438.54-253.122c7.29-4.311 12.102-12.132 12.102-21.077s-4.812-16.766-11.989-21.015zM1011.883 251.904l-182.784 105.643-264.875-153.6c-14.438-8.497-31.806-13.517-50.347-13.517s-35.908 5.019-50.819 13.773l-268.157 154.197-182.784-106.325c-7.29-4.311-12.102-12.132-12.102-21.077s4.812-16.766 11.989-21.015l451.356-260.499c14.438-8.497 31.806-13.517 50.347-13.517s35.908 5.019 50.819 13.773l447.357 259.327c7.29 4.311 12.102 12.132 12.102 21.077s-4.812 16.766-11.989 21.015z" />
|
||||
<glyph unicode="laptop" glyph-name="laptop" d="M125.27 257.806h773.803c29.523 0.097 53.419 24.053 53.419 53.589 0 0 0 0 0 0v473.941c0 29.502-23.916 53.419-53.419 53.419h-773.803c-29.502 0-53.419-23.916-53.419-53.419v-474.112c0 0 0 0 0 0 0-29.537 23.896-53.492 53.409-53.589zM178.688 731.748h666.795v-367.275h-666.624zM999.595 204.217h-974.677c-13.667 0-24.747-11.079-24.747-24.747v-59.733c-0.002-0.108-0.003-0.235-0.003-0.363 0-6.447 2.465-12.318 6.505-16.722l34.117-37.87c4.505-4.65 10.806-7.537 17.782-7.537 0.409 0 0.815 0.010 1.219 0.029l902.258-0.002c6.688 0.147 12.7 2.925 17.065 7.337l37.549 37.89c4.351 4.388 7.070 10.401 7.168 17.048v59.752c-0.096 13.534-11.042 24.48-24.567 24.576zM605.184 118.542c0.019-0.161 0.029-0.347 0.029-0.536 0-2.563-1.949-4.672-4.446-4.924l-177.344-0.002c-2.518 0.254-4.466 2.362-4.466 4.926 0 0.189 0.011 0.375 0.031 0.558l-0.002 24.041c-0.019 0.161-0.029 0.347-0.029 0.536 0 2.563 1.949 4.672 4.446 4.924l177.514 0.002c2.518-0.254 4.466-2.362 4.466-4.926 0-0.189-0.011-0.375-0.031-0.558z" />
|
||||
<glyph unicode="key" glyph-name="key" d="M910.161 573.61h-441.344c-44.245 75.622-125.067 125.611-217.564 125.611-138.746 0-251.221-112.476-251.221-251.221s112.476-251.221 251.221-251.221c92.497 0 173.319 49.989 216.922 124.425l48.087 1.186c0.015 0 0.032 0 0.050 0 2.386 0 4.544 0.98 6.093 2.559l88.236 88.919c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l62.123-62.123c1.547-1.559 3.69-2.524 6.059-2.524s4.512 0.965 6.058 2.524l39.254 39.254c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l45.057-45.398c1.547-1.559 3.69-2.524 6.059-2.524s4.512 0.965 6.058 2.524l44.886 45.057c1.547 1.559 3.69 2.524 6.059 2.524s4.512-0.965 6.058-2.524l36.353-36.353c1.538-1.508 3.647-2.439 5.973-2.439s4.435 0.931 5.975 2.441l110.42 103.593c1.664 1.561 2.701 3.774 2.701 6.229s-1.037 4.668-2.697 6.225l-105.306 101.38c-1.553 1.476-3.657 2.385-5.972 2.389zM136.529 390.826c-31.355 0.29-56.661 25.775-56.661 57.171 0 31.576 25.597 57.173 57.173 57.173s57.172-25.596 57.173-57.171c0-0.001 0-0.002 0-0.002 0-31.576-25.597-57.173-57.173-57.173-0.18 0-0.36 0.001-0.539 0.002z" />
|
||||
<glyph unicode="instagram" glyph-name="instagram" d="M931.8 447.688c-0.522 0.007-1.044 0.014-1.563 0.020 0 43.786 1.017 87.6-0.287 131.348-1.304 43.68-0.492 87.542-8.619 130.867-15.025 80.104-67.485 132.495-147.681 147.449-43.892 8.189-88.323 7.806-132.57 8.547-76.752 1.287-153.542 1.362-230.298 0.495-46.572-0.522-93.31-1.731-139.622-6.212-94.406-9.144-155.559-64.7-168.54-154.863-6.048-42.022-7.724-84.879-8.499-127.409-1.41-77.315-1.386-154.675-0.539-232.001 0.505-46.001 1.809-92.157 6.127-137.923 8.926-94.522 64.177-156.45 155.778-169.585 40.912-5.868 82.644-8.076 124.017-8.243 110.292-0.444 220.6 0.768 330.889 2.188 22.040 0.283 44.377 2.7 65.987 7.062 75.008 15.148 124.105 59.129 141.708 134.571 5.516 23.631 8.564 48.213 9.424 72.479 2.369 67.038 2.983 134.134 4.291 201.209zM713.388-64.001h-402.773c-6.168 0.853-12.326 1.802-18.504 2.546-20.292 2.451-40.902 3.335-60.836 7.482-115.746 24.081-190.16 92.631-218.092 208.268-7.264 30.078-8.94 61.508-13.182 92.317v402.773c2.106 19.657 3.649 39.393 6.427 58.952 7.98 56.221 27.020 107.803 64.556 151.562 47.599 55.491 109.35 83.613 180.412 93.648 19.651 2.775 39.475 4.335 59.218 6.451h402.773c6.164-0.853 12.322-1.799 18.5-2.546 20.292-2.451 40.905-3.331 60.839-7.479 115.75-24.078 190.15-92.641 218.088-208.268 7.267-30.078 8.943-61.508 13.186-92.32v-402.773c-2.109-19.654-3.656-39.39-6.434-58.948-8.069-56.825-27.436-108.861-65.669-152.852-47.52-54.685-108.865-82.412-179.296-92.355-19.647-2.778-39.472-4.338-59.215-6.458zM511.43 278.487c-92.986 0.222-169.127 76.636-169.052 169.656 0.075 92.955 76.373 169.325 169.322 169.479 93.699 0.157 170.209-76.708 169.817-170.605-0.389-92.969-76.875-168.755-170.086-168.53zM775.95 446.692c0.949 145.681-115.575 263.745-261.789 265.243-146.295 1.502-265.178-115.828-266.11-262.629-0.925-145.712 115.572-263.745 261.789-265.243 146.275-1.502 265.151 115.821 266.11 262.629zM847.602 719.86c0.594 35.386-26.279 63.328-61.31 63.747-34.577 0.413-62.454-26.003-63.358-60.044-0.945-35.345 25.757-63.874 60.512-64.659 35.308-0.795 63.573 26.054 64.157 60.955z" />
|
||||
<glyph unicode="inlinecss" glyph-name="inlinecss" d="M128 896h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 128h768c35.346 0 64-28.654 64-64s-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64s28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="info" glyph-name="info" d="M512 960c70.667 0 137-13.333 199-40 62.667-26.667 117.166-63.166 163.5-109.5s82.833-100.833 109.5-163.5c26.667-62 40-128.333 40-199s-13.333-137-40-199c-26.667-62.667-63.166-117.166-109.5-163.5s-100.833-82.833-163.5-109.5c-62-26.667-128.333-40-199-40s-137 13.333-199 40c-62.667 26.667-117.166 63.166-163.5 109.5s-82.833 100.833-109.5 163.5c-26.667 62-40 128.333-40 199s13.333 137 40 199c26.667 62.667 63.166 117.166 109.5 163.5s100.833 82.833 163.5 109.5c62 26.667 128.333 40 199 40zM512 512c-35.346 0-64-28.654-64-64v-192c0-35.346 28.654-64 64-64s64 28.654 64 64v192c0 35.346-28.654 64-64 64zM512 576c35.346 0 64 28.654 64 64s-28.654 64-64 64c-35.346 0-64-28.654-64-64s28.654-64 64-64z" />
|
||||
<glyph unicode="indent_more" glyph-name="indent-more" d="M910.421 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM910.421 127.979h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM954.325 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM954.325 594.795c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.469c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM71.317 347.2c2.052 0.012 3.903 0.868 5.225 2.237l159.639 92.141c2.235 1.239 3.726 3.58 3.733 6.271 0 0.013 0 0.027 0 0.041 0 2.96-1.757 5.509-4.285 6.661l-0.046 0.019-159.189 92.139c-1.314 1.268-3.105 2.051-5.079 2.051-3.974 0-7.209-3.17-7.315-7.119v-187.124c0-4.041 3.276-7.317 7.317-7.317z" />
|
||||
<glyph unicode="indent_less" glyph-name="indent-less" d="M910.047 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM910.047 127.979h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM953.951 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM953.951 594.795c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.469c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32zM63.625 448c0-0.012 0-0.026 0-0.040 0-2.96 1.757-5.509 4.285-6.661l0.046-0.019 159.040-91.84c1.295-1.292 3.085-2.091 5.061-2.091 0.007 0 0.012 0 0.019 0-0.001 0 0 0 0.001 0 3.989 0 7.231 3.191 7.315 7.161v186.974c0 4.041-3.276 7.317-7.317 7.317-0.007 0-0.014 0-0.021 0-2.049 0-3.897-0.86-5.201-2.236l-159.64-92.141c-2.16-1.262-3.588-3.569-3.588-6.209 0-0.075 0.001-0.148 0.004-0.222z" />
|
||||
<glyph unicode="import_export" glyph-name="import-export" d="M611.556 652.8h-149.334v-307.2h-248.889v307.2h-149.333l273.778 307.2 273.778-307.2zM686.221-64l273.779 307.2h-149.331v307.2h-248.891v-307.2h-149.334l273.777-307.2z" />
|
||||
<glyph unicode="hustle" glyph-name="hustle" d="M441.6 435.2l172.8 115.2v-89.6l204.8 89.6-262.4-204.8v89.6l-115.2-89.6v89.6zM921.6 960c25.6-6.4 44.8-19.2 64-32 12.8-12.8 19.2-25.6 25.6-38.4 6.4-25.6 12.8-38.4 12.8-57.6v-768c0-32-12.8-64-38.4-89.6s-57.6-38.4-89.6-38.4c-32 0-64 12.8-89.6 38.4s-38.4 57.6-38.4 89.6c0 102.4-134.4 121.6-307.2 128v-102.4c0-19.2 0-38.4-12.8-57.6-6.4-19.2-19.2-38.4-32-51.2s-32-25.6-51.2-32c-19.2-12.8-38.4-12.8-57.6-12.8s-38.4 0-57.6 12.8c-19.2 6.4-38.4 19.2-51.2 32s-25.6 32-32 51.2c-6.4 19.2-12.8 38.4-12.8 57.6v115.2c-32 12.8-51.2 32-70.4 57.6-19.2 19.2-32 51.2-32 83.2v32c-12.8 6.4-25.6 12.8-38.4 25.6-6.4 12.8-12.8 32-12.8 44.8s6.4 32 12.8 44.8c12.8 12.8 25.6 19.2 38.4 25.6v32c0 38.4 19.2 76.8 44.8 108.8 32 25.6 70.4 44.8 108.8 44.8h153.6c224 0 409.6 6.4 409.6 128 0 25.6 6.4 51.2 19.2 70.4s32 38.4 57.6 44.8c25.6 12.8 51.2 12.8 76.8 12.8zM320 38.4c12.8 0 19.2 6.4 25.6 12.8v0c6.4 6.4 6.4 12.8 12.8 19.2 0 6.4 6.4 12.8 6.4 19.2v102.4h-108.8v-102.4c0-12.8 0-19.2 6.4-32 6.4-6.4 12.8-12.8 25.6-19.2 6.4 0 19.2 0 32 0zM915.2 44.8c6.4 6.4 6.4 12.8 6.4 19.2v768c0 6.4 0 12.8-6.4 19.2s-12.8 6.4-19.2 6.4c-6.4 0-12.8 0-19.2-6.4s-6.4-12.8-6.4-19.2c0-230.4-307.2-230.4-512-230.4h-153.6c-12.8 0-25.6-6.4-32-19.2-12.8-6.4-19.2-19.2-19.2-32v-204.8c0-12.8 6.4-25.6 19.2-32 6.4-6.4 19.2-12.8 32-19.2h153.6c204.8 0 512 0 512-230.4 0-6.4 0-12.8 6.4-19.2s12.8-6.4 19.2-6.4c6.4 0 12.8 0 19.2 6.4z" />
|
||||
<glyph unicode="hummingbird" glyph-name="hummingbird" d="M659.2 799.087l61.016-43.886-34.56-319.048-125.443-172.033-3.841-19.749-22.185-113.225-98.986 43.886 114.345 147.017 3.839 22.383 75.095 454.655h30.721zM557.653 886.858l-85.334-526.629-170.666-219.429 298.666-131.657 42.667 219.429 127.998 175.543 42.672 394.971-125.016 87.771h-130.987zM321.282 611.691l190.529-14.698 14.093 87.145-505.848 39.023 457.256-332.305 15.663 96.421-171.693 124.415zM1024 799.087h-210.447l-8.162-76.008 218.609 32.122v43.886zM469.334 886.858h-128v-43.886h128v43.886zM298.666 886.858h-42.666v-43.886h42.666v43.886zM298.666 491.887h-213.333v-43.886h213.333v43.886zM42.666 491.887h-42.666v-43.886h42.666v43.886zM341.334 272.458h-85.334v-43.886h85.334v43.886zM213.334 272.458h-42.667v-43.886h42.667v43.886z" />
|
||||
<glyph unicode="hub" glyph-name="hub" d="M36.571 760.889c0 109.966 87.647 199.111 195.765 199.111s195.765-89.145 195.765-199.111v-113.778c0-31.418-25.042-56.889-55.933-56.889s-55.933 25.471-55.933 56.889v113.778c0 47.128-37.563 85.333-83.899 85.333s-83.899-38.205-83.899-85.333v-625.779c0-47.126 37.563-85.328 83.899-85.328s83.899 38.202 83.899 85.328v85.336c0 31.415 25.042 56.89 55.933 56.89s55.933-25.475 55.933-56.89v-85.336c0-109.963-87.647-199.11-195.765-199.11s-195.765 89.146-195.765 199.11v625.779zM987.429 760.889c0 109.966-87.647 199.111-195.767 199.111-108.112 0-195.762-89.145-195.762-199.111v-113.778c0-31.418 25.042-56.889 55.933-56.889s55.935 25.471 55.935 56.889v113.778c0 47.128 37.559 85.333 83.895 85.333s83.902-38.205 83.902-85.333v-625.779c0-47.126-37.566-85.328-83.902-85.328s-83.895 38.202-83.895 85.328v85.336c0 157.094-125.211 284.443-279.666 284.443h-111.865c-30.891 0-55.933-25.471-55.933-56.889s25.042-56.889 55.933-56.889h111.865c92.673 0 167.799-76.41 167.799-170.665v-85.336c0-109.963 87.65-199.11 195.762-199.11 108.12 0 195.767 89.146 195.767 199.11v625.779z" />
|
||||
<glyph unicode="home" glyph-name="home" d="M936.881 602.057l-412.161 319.201c-5.37 4.22-12.228 6.767-19.68 6.767s-14.31-2.547-19.748-6.819l-398.972-319.469c-7.236-5.902-11.824-14.814-11.84-24.797v-576.965c0-17.673 14.327-32 32-32h236.959c17.673 0 32 14.327 32 32v353.281h273.121v-353.281c0-17.673 14.327-32 32-32h236.959c17.673 0 32 14.327 32 32v576.962c-0.037 10.179-4.821 19.232-12.251 25.068z" />
|
||||
<glyph unicode="help_support" glyph-name="help-support" d="M989.867 631.637c-7.098 18.287-24.554 31.016-44.983 31.016-6.033 0-11.807-1.11-17.128-3.137l-14.006-5.18c-44.074 84.36-111.225 151.511-193.089 194.394l2.796 15.526c1.895 4.965 2.992 10.707 2.992 16.706 0 20.352-12.633 37.754-30.485 44.791-54.809 21.677-117.927 34.179-183.964 34.179s-129.155-12.502-187.114-35.269c-14.81-5.894-27.539-23.351-27.539-43.78 0-6.033 1.11-11.807 3.137-17.128l5.18-14.006c-84.36-44.074-151.511-111.225-194.394-193.089l-15.526 2.796c-4.965 1.895-10.707 2.992-16.706 2.992-20.352 0-37.754-12.633-44.791-30.485-21.677-54.809-34.179-117.927-34.179-183.964s12.502-129.155 35.269-187.114c5.894-14.81 23.351-27.539 43.78-27.539 6.033 0 11.807 1.11 17.128 3.137l14.006 5.18c44.083-84.353 111.231-151.501 193.089-194.393l-2.795-15.527c-1.895-4.965-2.992-10.707-2.992-16.706 0-20.352 12.633-37.754 30.485-44.791 54.785-21.656 117.873-34.146 183.878-34.146s129.093 12.49 187.029 35.235c14.81 5.895 27.539 23.351 27.539 43.781 0 6.033-1.11 11.807-3.137 17.128l-5.18 14.006c84.422 44.057 151.629 111.21 194.564 193.091l15.527-2.797c4.965-1.895 10.707-2.992 16.706-2.992 20.352 0 37.754 12.633 44.791 30.485 21.656 54.785 34.146 117.873 34.146 183.878s-12.49 129.093-35.235 187.029zM305.152 365.397l-226.133-83.627c-19.522 49.344-30.84 106.508-30.84 166.315s11.318 116.97 31.93 169.465l10.174-7.246 214.869-79.531c-10.091-24.452-15.95-52.843-15.95-82.603s5.859-58.15 16.487-84.082zM512 911.872c0.020 0 0.044 0 0.068 0 59.758 0 116.869-11.337 169.297-31.979l-7.232-10.176-79.531-214.869c-24.452 10.091-52.843 15.95-82.603 15.95s-58.15-5.859-84.082-16.487l-82.147 226.67c49.292 19.553 106.403 30.891 166.161 30.891 0.024 0 0.048 0 0.072 0zM512-15.701c-0.020 0-0.044 0-0.068 0-59.758 0-116.869 11.337-169.297 31.979l86.763 225.045c24.452-10.091 52.843-15.95 82.603-15.95s58.15 5.859 84.082 16.487l82.147-226.67c-49.301-19.615-106.427-31.011-166.209-31.061zM674.133 513.195c7.926-19.144 12.529-41.376 12.529-64.683s-4.603-45.539-12.949-65.836c-1.787-4.171-3.069-10.354-3.069-16.837 0-20.603 12.946-38.182 31.147-45.047l5.793-2.158c-17.663-26.282-39.596-48.214-65.032-65.341l-2.893 4.925c-6.974 18.532-24.553 31.478-45.156 31.478-6.483 0-12.666-1.282-18.311-3.606-18.824-7.81-41.056-12.413-64.362-12.413s-45.539 4.603-65.836 12.949c-4.13 1.75-10.262 3.009-16.689 3.009-20.58 0-38.144-12.918-45.024-31.088l-2.158-5.792c-26.211 17.68-48.086 39.609-65.169 65.027l4.923 2.898c18.532 6.974 31.478 24.553 31.478 45.156 0 6.483-1.282 12.666-3.606 18.311-7.81 18.824-12.413 41.056-12.413 64.362s4.603 45.539 12.949 65.836c1.75 4.13 3.009 10.262 3.009 16.689 0 20.58-12.918 38.144-31.088 45.024l-5.792 2.158c17.637 26.198 39.509 48.070 64.864 65.171l2.891-4.926c6.974-18.532 24.553-31.478 45.156-31.478 6.483 0 12.666 1.282 18.311 3.606 18.823 7.818 41.054 12.426 64.362 12.426s45.54-4.608 65.834-12.962c4.173-1.787 10.356-3.069 16.839-3.069 20.603 0 38.182 12.946 45.047 31.147l2.158 5.793c26.269-17.621 48.198-39.496 65.343-64.868l-4.927-2.886c-18.501-6.99-31.419-24.554-31.419-45.134 0-6.426 1.26-12.559 3.545-18.163zM944.981 281.771l-11.264 4.096-214.869 79.531c10.091 24.452 15.95 52.843 15.95 82.603s-5.859 58.15-16.487 84.082l226.67 82.147c19.522-49.344 30.84-106.508 30.84-166.315s-11.318-116.97-31.93-169.465z" />
|
||||
<glyph unicode="heart" glyph-name="heart" d="M984.615 578.511c0 2.507 0 5.162 0 7.67s0 5.604 0 8.554c0 2.95 0 9.586 0 14.748 0 2.065 0 3.981 0 5.899 0 6.047-0.759 12.093-1.519 18.139 0 0.885 0 1.771 0 2.507-6.367 48.931-29.099 91.815-62.608 124.154-46.486 44.413-110.252 71.819-180.597 71.819s-134.113-27.408-180.624-71.843c-35.29-35.503-39.688-47.3-46.966-47.3s-11.978 11.354-47.458 46.452c-45.645 44.199-108.596 71.522-178.109 71.522-0.231 0-0.463 0-0.693-0.002-0.924 0.014-2.059 0.019-3.195 0.019-69.737 0-132.896-27.384-178.73-71.7-33.584-32.102-56.491-74.702-63.092-122.331-0.125-1.975-0.125-2.859-0.125-3.596 0-6.047-1.212-11.945-1.519-18.139 0-1.966 0-3.932 0-5.899 0-4.72 0-9.586 0-14.748s0-5.604 0-8.407c0-2.803 0-5.309 0-7.817 7.231-60.554 28.069-115.236 59.461-162.689l-0.933 1.507c2.121-3.244 3.639-6.636 5.913-9.88 85.517-129.476 333.726-343.153 408.175-343.153 74.599 0 322.657 214.27 408.477 343.745 2.123 3.244 3.792 6.636 5.913 9.88 30.401 46.27 51.058 101.344 57.763 160.506l0.461 0.382z" />
|
||||
<glyph unicode="graph_line" glyph-name="graph-line" d="M0 60.27v30.507c0 18.872 8.329 36.782 22.761 48.942l277.261 233.626c54.49 45.914 129.926 57.876 195.947 31.070l54.621-22.177c74.466-30.235 159.884-10.889 214.057 48.479l203.715 223.251c11.913 13.055 32.153 13.981 45.208 2.068 6.645-6.063 10.43-14.643 10.43-23.638v-504.398c0-70.692-57.308-128-128-128h-835.73c-33.286 0-60.27 26.984-60.27 60.27zM322.145 508.556l-218.165-174.532c-27.601-22.081-67.875-17.606-89.956 9.995s-17.606 67.875 9.995 89.956l261.785 209.428c58.993 47.194 140.179 55.407 207.428 20.983l74.82-38.3c25.85-13.232 57.37-7.401 76.775 14.203l263.093 292.909c20.545 28.762 60.516 35.424 89.278 14.88s35.424-60.516 14.88-89.278l-275.116-316.685c-55.434-63.809-146.777-82.504-222.822-45.603l-56.154 27.249c-44.423 21.557-97.285 15.639-135.842-15.207z" />
|
||||
<glyph unicode="graph_bar_2" glyph-name="graph-bar-2" d="M569.856 960c-10.085 0-18.261-8.176-18.261-18.261-0.035-0.409-0.055-0.885-0.055-1.365s0.020-0.956 0.059-1.427l-0.004 0.062v-433.493c0-10.085 8.176-18.261 18.261-18.261h433.152c0.409-0.035 0.885-0.055 1.365-0.055s0.956 0.020 1.427 0.059c10.024-0.004 18.2 8.172 18.2 18.257-2.666 249.806-204.366 451.626-453.872 454.483zM918.357 400.213c0 10.085-8.176 18.261-18.261 18.261h-398.336c-10.085 0-18.261 8.176-18.261 18.261v397.141c0.028 0.408 0.044 0.885 0.044 1.365s-0.016 0.957-0.048 1.429c0.003 10.021-8.172 18.197-18.258 18.197h-6.144c-0.051 0-0.111 0-0.171 0-253.739 0-459.435-205.696-459.435-459.435s205.696-459.435 459.435-459.435c253.739 0 459.435 205.696 459.435 459.435 0 1.536 0 2.901 0 4.437s0 0 0 0z" />
|
||||
<glyph unicode="graph_bar" glyph-name="graph-bar" d="M463.533 359.569h-173.396c-10.274 0-18.604-8.039-18.604-17.957v-259.65c0-9.918 8.33-17.959 18.604-17.959h173.396c10.274 0 18.604 8.039 18.604 17.957v259.812c0 9.918-8.33 17.957-18.604 17.957v-0.16zM733.867 896h-173.396c-10.274 0-18.602-8.041-18.602-17.959v-796.080c0-9.918 8.328-17.957 18.602-17.957h173.396c10.274 0 18.602 8.039 18.602 17.957v796.080c0 9.918-8.328 17.959-18.602 17.959zM1005.398 654.145h-173.226c-10.274 0-18.602-8.041-18.602-17.959v-554.226c0-9.918 8.328-17.959 18.602-17.959h173.226c10.274 0 18.602 8.039 18.602 17.957v554.226c0 9.918-8.328 17.959-18.602 17.959v0.002zM191.832 654.145h-173.228c-10.274 0-18.604-8.041-18.604-17.959v-554.226c0-9.918 8.33-17.959 18.604-17.959h173.228c10.274 0 18.604 8.039 18.604 17.957v554.226c0 9.918-8.33 17.959-18.604 17.959v0.002z" />
|
||||
<glyph unicode="gdpr" glyph-name="gdpr" d="M512-64c-341.333 213.333-512 469.333-512 768 170.667 0 341.333 85.333 512 256 170.667-170.667 341.333-256 512-256 0-298.667-170.667-554.667-512-768zM762.5 598.5l-34 34c-2.333 2.333-4.917 4.167-7.75 5.5s-5.917 2-9.25 2c-3.333 0-6.5-0.667-9.5-2s-5.667-3.167-8-5.5l-251.5-252.5-111 111c-2 2.333-4.5 4.083-7.5 5.25s-6.167 1.75-9.5 1.75c-3.333 0-6.417-0.583-9.25-1.75s-5.417-2.917-7.75-5.25l-34-34c-2.333-2.333-4.167-4.917-5.5-7.75s-2-5.917-2-9.25c0-3.333 0.667-6.5 2-9.5s3.167-5.667 5.5-8l145.5-144c4.333-4.333 9.333-7.75 15-10.25s11.833-3.75 18.5-3.75c6.667 0 12.917 1.25 18.75 3.75s10.917 5.917 15.25 10.25l286 286c2.333 2.333 4.083 5 5.25 8s1.75 6.167 1.75 9.5c0 3.333-0.583 6.417-1.75 9.25s-2.917 5.417-5.25 7.75v-0.5z" />
|
||||
<glyph unicode="forminator" glyph-name="forminator" d="M626.592 867.905h169.853c21.555 0 42.225-9.819 57.469-27.296 15.235-17.477 23.801-41.178 23.801-65.895v-745.522c0-24.715-8.565-48.414-23.801-65.895-15.243-17.474-35.913-27.297-57.469-27.297h-568.89c-21.554 0-42.224 9.823-57.465 27.297-15.241 17.481-23.805 41.179-23.805 65.895v745.522c0 24.715 8.563 48.417 23.805 65.895s35.912 27.296 57.465 27.296h169.854c8.542 26.985 24.121 50.302 44.623 66.778s44.931 25.317 69.968 25.317c25.038 0 49.467-8.84 69.966-25.317 20.503-16.477 36.082-39.793 44.626-66.778zM534.574 860.054c-6.683 5.12-14.537 7.851-22.574 7.851-10.777 0-21.112-4.91-28.733-13.648s-11.903-20.59-11.903-32.947c0-9.216 2.383-18.223 6.848-25.886s10.811-13.637 18.237-17.163c7.425-3.527 15.597-4.448 23.478-2.65s15.121 6.235 20.805 12.752c5.682 6.517 9.554 14.819 11.122 23.858s0.763 18.407-2.313 26.921c-3.072 8.514-8.283 15.792-14.967 20.912zM227.555 774.715v-745.522h568.89v745.522h-121.907v-93.19h-325.079v93.19h-121.904zM349.459 401.987h325.079c10.782 0 21.117-4.91 28.738-13.65 7.622-8.735 11.901-20.587 11.901-32.942 0-12.36-4.279-24.213-11.901-32.947-7.622-8.739-17.957-13.65-28.738-13.65h-325.079c-10.777 0-21.112 4.91-28.731 13.65-7.621 8.735-11.903 20.587-11.903 32.947 0 12.354 4.282 24.207 11.903 32.942 7.621 8.739 17.955 13.65 28.731 13.65zM674.538 541.775h-325.079c-10.777 0-21.112-4.91-28.731-13.648s-11.903-20.59-11.903-32.947c0-12.358 4.282-24.209 11.903-32.946s17.955-13.648 28.731-13.648h325.079c10.782 0 21.117 4.91 28.738 13.648s11.901 20.589 11.901 32.946c0 12.358-4.279 24.209-11.901 32.947s-17.957 13.648-28.738 13.648zM512 262.203h162.538c10.782 0 21.117-4.915 28.738-13.648 7.622-8.741 11.901-20.59 11.901-32.944 0-12.361-4.279-24.217-11.901-32.951-7.622-8.741-17.957-13.648-28.738-13.648h-162.538c-10.777 0-21.112 4.907-28.733 13.648-7.621 8.734-11.903 20.59-11.903 32.951 0 12.354 4.282 24.203 11.903 32.944 7.621 8.734 17.955 13.648 28.733 13.648z" />
|
||||
<glyph unicode="folder_open" glyph-name="folder-open" d="M0 768.157c0 35.259 28.862 63.843 63.41 63.843h257.18c35.020 0 76.361-25.903 92.040-57.261l35.369-70.739h-191.688c-70.865 0-144.008-54.934-163.628-123.604l-92.685-324.396v512.157zM155.208 517.359c20.32 67.733 93.979 122.641 164.969 122.641h575.647c70.79 0 111.807-54.566 91.384-122.641l-118.415-394.718c-20.32-67.733-93.979-122.641-164.969-122.641h-575.647c-70.79 0-111.807 54.566-91.384 122.641l118.415 394.718z" />
|
||||
<glyph unicode="folder" glyph-name="folder" d="M0 768c0 35.346 28.862 64 63.41 64h257.18c35.020 0 76.361-25.903 92.040-57.261l35.369-70.739h-448v64zM0 640h767.625c70.9 0 128.375-56.796 128.375-127.975v-384.049c0-70.679-57.412-127.975-128.375-127.975h-639.25c-70.9 0-128.375 56.796-128.375 127.975v512.025z" />
|
||||
<glyph unicode="flag" glyph-name="flag" d="M910.404 754.49c-0.036 0-0.077 0-0.118 0-2.422 0-4.731-0.494-6.837-1.39l0.119 0.044c-37.374-20.496-81.739-32.542-128.846-32.556-0.155 0-0.334-0.002-0.511-0.002-85.841 0-162.626 39.821-213.792 102.454-46.563 45.349-109.104 72.959-177.923 72.959-66.249 0-126.68-25.587-172.432-67.66-9.486 21.49-30.172 35.949-54.147 35.949-33.091 0-59.916-27.549-59.916-61.529 0-0.222 0.002-0.445 0.003-0.665v-740.415c0-34.065 26.89-61.68 60.061-61.68s60.061 27.615 60.061 61.68v333.487c36.633 19.388 79.944 30.753 125.841 30.753 85.965 0 162.863-39.873 214.109-102.593 46.514-45.22 108.949-72.744 177.645-72.744 74.257 0 141.198 32.162 188.336 83.661 3.695 3.474 5.927 8.257 5.943 13.578v388.298c0 0.002 0 0.002 0 0.002 0 10.040-7.845 18.198-17.583 18.368h-0.014z" />
|
||||
<glyph unicode="finger_point" glyph-name="finger-point" d="M839.23 548.523c-0.010 0-0.021 0-0.032 0-20.666 0-39.617-7.347-54.382-19.571-7.65 39.865-42.209 69.443-83.676 69.443-21.062 0-40.342-7.631-55.226-20.278-6.564 41.133-41.748 72.072-84.159 72.072-19.772 0-37.974-6.725-52.443-18.012l0.19 242.489c0 47.128-38.205 85.333-85.333 85.333s-85.333-38.205-85.333-85.333v-440.661l-100.352 95.403c-14.507 11.766-33.194 18.891-53.546 18.891-47.128 0-85.333-38.205-85.333-85.333 0-21.842 8.206-41.767 21.704-56.861l110.008-104.536c40.896-39.332 75.123-85.219 101.064-136.040l32.568-64.493c32.768-75.264 102.059-165.035 251.051-165.035 246.784 0 308.395 171.861 308.395 288.085v238.933c0 47.128-38.205 85.333-85.333 85.333z" />
|
||||
<glyph unicode="filter" glyph-name="filter" d="M986.647 776.462c-0.058 41.498-32.921 75.301-74.044 76.87l-797.997 0.005c-0.067 0-0.145 0-0.225 0-42.544 0-77.032-34.489-77.032-77.032 0-24.244 11.2-45.872 28.708-59.994l357.79-358.074v-221.45c0.616-14.21 8.524-26.445 20.054-33.115l0.194-0.103 95.855-55.362c5.842-3.483 12.883-5.541 20.405-5.541 22.276 0 40.336 18.059 40.336 40.336 0 0.058 0 0.115 0 0.173 0 1.098 0 2.047 0 3.155v0 271.91l361.281 361.124c15.197 14.060 24.68 34.107 24.68 56.37 0 0.258-0.001 0.514-0.004 0.772zM301.573 699.271v0z" />
|
||||
<glyph unicode="eye_hide" glyph-name="eye-hide" d="M201.216 838.997c-2.596 2.605-6.187 4.217-10.155 4.217s-7.559-1.612-10.154-4.216l-61.44-60.928c-2.605-2.596-4.217-6.187-4.217-10.155s1.612-7.559 4.216-10.154l701.27-700.758c2.596-2.605 6.187-4.217 10.155-4.217s7.559 1.612 10.154 4.216l60.928 60.928c2.605 2.596 4.217 6.187 4.217 10.155s-1.612 7.559-4.216 10.154zM665.6 456.533c-4.372 78.297-66.77 140.695-144.666 145.049zM358.4 437.419c5.285-76.768 66.251-137.734 142.541-142.992zM512 671.915c0.243 0.001 0.531 0.002 0.818 0.002 123.288 0 223.232-99.944 223.232-223.232 0-19.895-2.603-39.181-7.486-57.539l150.881-148.97c60.159 57.039 108.919 125.422 142.957 201.809s-134.935 356.101-510.402 356.101c-0.695 0.003-1.517 0.005-2.339 0.005-58.177 0-114.196-9.241-166.669-26.335l113.712-108.838c16.592 4.431 35.643 6.983 55.287 6.997zM512 223.915c-0.228-0.001-0.498-0.001-0.768-0.001-123.288 0-223.232 99.944-223.232 223.232 0 19.337 2.459 38.1 7.081 55.993l-151.38 149.661c-59.739-56.808-108.2-124.836-142.102-200.79s134.934-355.925 510.401-355.925c0.727-0.004 1.587-0.006 2.447-0.006 57.572 0 113.029 9.053 165.026 25.812l-113.884 109.020c-16.056-4.238-34.509-6.722-53.525-6.826z" />
|
||||
<glyph unicode="eye" glyph-name="eye" d="M512 223.915c123.759 0 224.085 100.326 224.085 224.085s-100.326 224.085-224.085 224.085c-123.759 0-224.085-100.326-224.085-224.085s100.326-224.085 224.085-224.085zM0 448s136.533 352.085 512 352.085 512-352.085 512-352.085-136.533-352.085-512-352.085-512 352.085-512 352.085zM512 352.085c52.972 0 95.915 42.942 95.915 95.915s-42.942 95.915-95.915 95.915c-52.972 0-95.915-42.942-95.915-95.915s42.942-95.915 95.915-95.915z" />
|
||||
<glyph unicode="embed" glyph-name="embed" d="M128 128h768c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v0c0 35.346 28.654 64 64 64zM128 640h768c35.346 0 64-28.654 64-64v-256c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v256c0 35.346 28.654 64 64 64zM832 576c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64s-28.654 64-64 64zM128 896h768c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v0c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="element_select" glyph-name="element-select" d="M256 960h512c141.385 0 256-114.615 256-256v-512c0-141.385-114.615-256-256-256h-512c-141.385 0-256 114.615-256 256v512c0 141.385 114.615 256 256 256zM512 256l256 320h-512l256-320z" />
|
||||
<glyph unicode="element_radio" glyph-name="element-radio" d="M512 960c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512zM512 192c141.385 0 256 114.615 256 256s-114.615 256-256 256c-141.385 0-256-114.615-256-256s114.615-256 256-256z" />
|
||||
<glyph unicode="element_number" glyph-name="element-number" d="M832 192l192 192h-384zM832 704l192-192h-384zM249.96 128c-109.648 0-192.348 33.932-249.96 91.429l87.347 113.108c42.744-39.588 101.285-61.267 160.755-61.267 67.833 0 101.285 33.932 101.285 72.577 0 42.415-32.523 72.577-96.639 72.577-49.249 0-88.276-14.138-122.657-47.128l-110.577 27.334v371.37h449.742v-141.384h-289.917v-121.591c29.735 29.219 78.054 49.956 132.878 49.956 105.002 0 199.782-78.233 199.782-204.536 0-135.729-101.285-222.445-262.040-222.445z" />
|
||||
<glyph unicode="element_checkbox" glyph-name="element-checkbox" d="M256 960h512c141.385 0 256-114.615 256-256v-512c0-141.385-114.615-256-256-256h-512c-141.385 0-256 114.615-256 256v512c0 141.385 114.615 256 256 256zM757 535c3.333 3.333 6 7.333 8 12s3 9.667 3 15c0 5.333-1 10.333-3 15s-4.667 8.667-8 12l-30 30c-3.333 3.333-7.333 6-12 8s-9.667 3-15 3c-5.333 0-10.333-1-15-3s-8.667-4.667-12-8l-209-210-85 85c-4 3.333-8.167 6-12.5 8s-9.167 3-14.5 3c-5.333 0-10.333-1-15-3s-8.667-4.667-12-8l-30-30c-3.333-3.333-6-7.333-8-12s-3-9.667-3-15c0-4.667 1-9.333 3-14s4.667-8.667 8-12l127-127c5.333-5.333 11.5-9.667 18.5-13s14.833-5 23.5-5c8 0 15.5 1.667 22.5 5s13.167 7.667 18.5 13l252 251z" />
|
||||
<glyph unicode="drag" glyph-name="drag" d="M352 704c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 704c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM352 352c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 352c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM352 0c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96zM672 0c-53.019 0-96 42.981-96 96s42.981 96 96 96c53.019 0 96-42.981 96-96s-42.981-96-96-96z" />
|
||||
<glyph unicode="download_cloud" glyph-name="download-cloud" d="M384 759.638v-247.638h-80.297c-35.346 0-64-28.654-64-64 0-15.811 5.852-31.062 16.429-42.814l144.297-160.33c23.645-26.273 64.112-28.402 90.385-4.757 1.668 1.501 3.256 3.089 4.757 4.757l144.297 160.33c23.645 26.273 21.516 66.739-4.757 90.385-11.752 10.577-27.003 16.429-42.814 16.429h-80.297v245.413c68.105-22.058 120.518-76.658 136.885-145.505 18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-134.486 0-249.174 105.007-249.172 233.746 0.964 124.682 104.79 225.987 234.954 231.337 11.086 79.407 70.491 144.216 149.044 166.555z" />
|
||||
<glyph unicode="download" glyph-name="download" d="M930.718 452.783h-212.388c-0.006 0-0.012 0-0.019 0-26.382 0-48.763-17.131-56.625-40.877-21.036-64.253-80.072-109.543-149.686-109.543s-128.649 45.29-149.248 108.012c-8.298 25.277-30.679 42.408-57.061 42.408-0.007 0-0.013 0-0.021 0h-212.387c0 0 0 0 0 0-32.935 0-59.634-26.699-59.634-59.634 0-0.056 0-0.112 0-0.168v-340.258c0-32.935 26.699-59.634 59.634-59.634h837.433c32.935 0 59.634 26.699 59.634 59.634v340.267c0 32.935-26.699 59.634-59.634 59.634zM499.404 420.893c2.927-4.074 7.652-6.697 12.989-6.697 0.030 0 0.060 0 0.091 0h-0.005c0.025 0 0.055 0 0.086 0 5.338 0 10.062 2.623 12.957 6.649l165.064 232.208c2.068 2.663 3.315 6.052 3.315 9.732 0 8.807-7.139 15.945-15.945 15.945-0.156 0-0.312-0.002-0.468-0.007l-77.629 0.001v208.243c0 8.807-7.139 15.945-15.945 15.945h-143.505c-8.807 0-15.945-7.139-15.945-15.945v-208.243h-77.971c-0.060 0.001-0.131 0.001-0.202 0.001-8.807 0-15.945-7.139-15.945-15.945 0-3.538 1.153-6.807 3.103-9.453z" />
|
||||
<glyph unicode="dislike" glyph-name="dislike" d="M957.15 638.747v0c-0.020 4.749-1.943 9.046-5.046 12.168l-133.543 133.543c-2.922 2.413-6.705 3.876-10.829 3.876-0.839 0-1.663-0.060-2.47-0.178l-497.289 0.011c-0.011 0-0.025 0-0.038 0-18.519 0-33.639-14.563-34.531-32.861l-0.004-0.080v-1.187s0 0 0 0 0 0 0 0v-500.497c-0.007-0.265-0.011-0.578-0.011-0.89 0-19.129 15.468-34.644 34.578-34.722h137.707c2.083-3.341 4.489-6.219 7.238-8.726l1.516-2.551v-1.485h0.89l133.544-230.142c13.782-23.498 38.917-39.026 67.678-39.026 0.1 0 0.197 0 0.296 0.001 43.409 0.335 78.482 35.615 78.482 79.087 0 0.209-0.001 0.42-0.003 0.628l0.742-0.033v203.137h187.259c18.789 0.498 33.832 15.847 33.832 34.711 0 0.005 0 0.007 0 0.012v-0.001 385.795zM202.917 692.758v0c-0.251 18.984-15.699 34.276-34.719 34.276-0.001 0-0.002 0-0.003 0h-67.514c-18.672-0.413-33.67-15.566-33.832-34.26v-376.761c1.7-17.439 16.134-30.998 33.8-31.308h67.991c0 0 0.001 0 0.001 0 19.072 0 34.553 15.376 34.72 34.408 0.054 0.726 0.085 1.554 0.085 2.391s-0.031 1.664-0.090 2.484z" />
|
||||
<glyph unicode="defer" glyph-name="defer" d="M214.488 616.412h-122.529c-6.398 0-12.602 2.194-17.578 6.217-12.007 9.708-13.871 27.311-4.164 39.319l178.422 220.684c1.237 1.531 2.633 2.926 4.164 4.164 12.007 9.708 29.611 7.844 39.319-4.164l178.422-220.684c4.022-4.975 6.217-11.18 6.217-17.578 0-15.441-12.517-27.958-27.958-27.958h-122.482v-559.177c0-30.882-25.034-55.916-55.916-55.916s-55.916 25.034-55.916 55.916v559.177zM773.649 280.907h122.482c15.441 0 27.958-12.517 27.958-27.958 0-6.398-2.194-12.602-6.217-17.578l-178.422-220.684c-9.708-12.007-27.311-13.871-39.319-4.164-1.531 1.237-2.926 2.633-4.164 4.164l-178.422 220.684c-9.708 12.007-7.844 29.611 4.164 39.319 4.975 4.022 11.18 6.217 17.578 6.217h122.529v559.177c0 30.882 25.035 55.916 55.916 55.916s55.916-25.034 55.916-55.916v-559.177z" />
|
||||
<glyph unicode="defender" glyph-name="defender" d="M512 960l-475.429-138.24v-424.96c0-209.92 235.213-460.8 475.429-460.8s475.429 250.88 475.429 460.8v424.96l-475.429 138.24zM882.337 396.8c0-148.48-185.168-358.4-370.337-358.4v409.6h-370.334v296.96l370.334 107.52v-404.48h370.337v-51.2z" />
|
||||
<glyph unicode="cross_close" glyph-name="cross-close" d="M1024 448c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512zM680.107 235.349c-5.961-5.964-14.198-9.652-23.296-9.652s-17.335 3.689-23.296 9.652l-121.515 121.515-121.515-121.515c-5.961-5.964-14.198-9.652-23.296-9.652s-17.335 3.689-23.296 9.652l-49.835 49.835c-5.964 5.961-9.652 14.198-9.652 23.296s3.689 17.335 9.652 23.296l121.515 121.515-121.515 121.515c-5.964 5.961-9.652 14.198-9.652 23.296s3.689 17.335 9.652 23.296l49.835 49.835c5.961 5.964 14.198 9.652 23.296 9.652s17.335-3.689 23.296-9.652l121.515-120.832 121.515 121.515c5.961 5.964 14.198 9.652 23.296 9.652s17.335-3.689 23.296-9.652l49.835-49.835c5.964-5.961 9.652-14.198 9.652-23.296s-3.689-17.335-9.652-23.296l-121.515-121.515 121.515-121.515c5.964-5.961 9.652-14.198 9.652-23.296s-3.689-17.335-9.652-23.296z" />
|
||||
<glyph unicode="crop" glyph-name="crop" d="M993.343 183.651h-90.771v591.382c0 0.856 0 1.713 0 2.569 0 33.106-26.837 59.943-59.943 59.943h-592.581v88.202c0 18.918-15.336 34.253-34.253 34.253h-57.032c-18.918 0-34.253-15.336-34.253-34.253v0-88.373h-90.257c-18.918 0-34.253-15.336-34.253-34.253v-57.374c0-18.918 15.336-34.253 34.253-34.253h90.771v-590.697c0-0.856 0-1.713 0-2.569 0-33.106 26.837-59.943 59.943-59.943h592.581v-88.716c0-18.918 15.336-34.253 34.253-34.253h57.374c18.918 0 34.253 15.336 34.253 34.253v89.058h89.915c18.918 0 34.253 15.336 34.253 34.253v56.86c0 18.918-15.336 34.253-34.253 34.253zM249.535 183.993v528.527h528.013v-528.87h-527.5z" />
|
||||
<glyph unicode="copy" glyph-name="copy" d="M736 64c0-70.692-57.308-128-128-128h-384c-70.692 0-128 57.308-128 128v576c0 70.692 57.308 128 128 128v-576c0-70.692 57.308-128 128-128h384zM416 960h192v-256c0-35.346 28.654-64 64-64h256v-384c0-70.692-57.308-128-128-128h-416c-53.019 0-96 42.981-96 96v608c0 70.692 57.308 128 128 128zM672 960l256-256h-224c-17.673 0-32 14.327-32 32v224z" />
|
||||
<glyph unicode="community_people" glyph-name="community-people" d="M1007.275 365.996l-174.251 82.773c41.455 28.313 68.313 75.348 68.313 128.655 0 1.33-0.017 2.656-0.050 3.978 0.004 82.919-57.852 150.162-129.191 150.162-25.188-0.030-48.474-8.152-67.404-21.904 11.888-28.284 18.593-61.357 18.593-95.996 0-0.070 0-0.141 0-0.211 0-0.031 0-0.081 0-0.131 0-51.921-15.274-100.275-41.573-140.813 9.235-8.759 19.124-17.128 30.090-23.927l0.561-0.324 111.787-53.248c30.676-16.277 51.214-48.016 51.214-84.552 0-0.575-0.005-1.148-0.015-1.721l0.001-144.981h119.467c16.264 1.302 28.97 14.821 28.97 31.308 0 0.995-0.046 1.978-0.137 2.949l0.009 136.409c0.025 0.492 0.040 1.069 0.040 1.649 0 12.584-6.809 23.577-16.945 29.496zM314.881 449.11c9.565 6.404 17.855 13.609 25.152 21.725-26.524 40.018-42.391 89.074-42.391 141.835 0 0.278 0 0.557 0.001 0.835 0-0.022 0 0.003 0 0.028 0 35.404 7.023 69.167 19.751 99.973-18.433 10.702-40.452 18.255-64.218 18.569-71.416 0.001-129.272-67.242-129.272-150.357-0.034-1.201-0.053-2.615-0.053-4.033 0-53.923 27.603-101.4 69.45-129.070l-174.869-82.619c-10.863-5.857-18.121-17.153-18.121-30.144 0-0.503 0.011-1.003 0.032-1.5l-0.002-138.169c-0.081-0.847-0.127-1.83-0.127-2.825 0-16.487 12.706-30.007 28.859-31.301l115.823-0.007v145.067c-0.006 0.392-0.009 0.856-0.009 1.32 0 37.149 21.309 69.32 52.37 84.959zM800.939 346.71l-214.699 102.229c28.689 18.918 51.133 45.202 64.919 76.188 12.279 26.534 19.194 56.282 19.22 87.643-0.152 18.264-2.571 35.885-6.988 52.696-18.612 76.678-79.711 135.046-153.268 135.046s-131.584-56.491-151.381-132.949c-4.769-16.314-7.621-35.084-7.849-54.485-0.002-0.29-0.002-0.481-0.002-0.673 0-32.828 7.622-63.876 21.193-91.47 14.181-29.538 36.602-54.589 64.276-72.084l-60.551-29.096-155.648-72.533c-13.416-7.233-22.379-21.184-22.379-37.228 0-0.472 0.008-0.942 0.023-1.411l-0.002-170.598c-0.112-1.107-0.176-2.392-0.176-3.692 0-20.471 15.808-37.25 35.883-38.796l553.946-0.008c20.092 1.681 35.762 18.402 35.762 38.784 0 0.946-0.034 1.884-0.1 2.812l0.007 170.542c0.016 0.427 0.024 0.929 0.024 1.432 0 15.977-8.889 29.878-21.99 37.028z" />
|
||||
<glyph unicode="combine" glyph-name="combine" d="M725.143 384.331h-256.115l-359.096-359.096c-24.83-24.83-65.088-24.83-89.918 0l-0.124 0.124c-24.83 24.83-24.83 65.088 0 89.918l332.723 332.723-332.723 332.723c-24.83 24.83-24.83 65.088 0 89.918l0.124 0.124c24.83 24.83 65.088 24.83 89.918 0l359.096-359.096h256.115v131.106c0 17.557 14.233 31.791 31.791 31.791 7.373 0 14.516-2.562 20.208-7.25l236.543-194.776c13.554-11.161 15.494-31.196 4.333-44.75-1.302-1.581-2.753-3.032-4.333-4.333l-236.543-194.776c-13.554-11.161-33.589-9.22-44.75 4.333-4.686 5.692-7.25 12.835-7.25 20.208v131.108z" />
|
||||
<glyph unicode="color_pick_eyedropper" glyph-name="color-pick-eyedropper" d="M646.997 791.552l45.056-45.227-304.299-304.469c0.395-4.001 0.62-8.648 0.62-13.348 0-37.29-14.17-71.27-37.419-96.85l22.634-22.41 22.528-22.528c25.415 23.141 59.352 37.311 96.598 37.311 4.687 0 9.321-0.224 13.893-0.663l303.887 304.514 45.056-45.227 51.2 51.2-208.896 208.384zM506.197 385.365c-6.949-6.006-16.072-9.665-26.049-9.665-22.056 0-39.936 17.88-39.936 39.936 0 9.977 3.659 19.1 9.708 26.1l273.024 273.016 56.32-56.491zM999.424 935.424v0c-15.17 15.196-36.14 24.597-59.307 24.597s-44.137-9.401-59.306-24.596l-118.273-118.444 118.613-119.467 118.272 118.443c15.411 15.23 24.955 36.367 24.955 59.733s-9.544 44.503-24.947 59.725zM486.571 51.2h-370.688v371.029h156.331c5.090 0 9.216 4.126 9.216 9.216v96.768c0 5.090-4.126 9.216-9.216 9.216h-262.997c-5.090 0-9.216-4.126-9.216-9.216v-582.997c0-0.008 0-0.016 0-0.025 0-5.090 4.126-9.216 9.216-9.216 0.24 0 0.478 0.009 0.714 0.027l583.819-0.002c5.090 0 9.216 4.126 9.216 9.216v262.485c0 5.090-4.126 9.216-9.216 9.216h-97.451c-5.090 0-9.216-4.126-9.216-9.216z" />
|
||||
<glyph unicode="code" glyph-name="code" d="M137.076 447.767c22.144-13.682 39.454-28.996 51.93-45.943s21.209-38.558 26.199-64.833c4.99-26.275 7.485-59.935 7.485-100.981 0-30.784 0.702-53.483 2.105-68.098s4.211-25.731 8.421-33.349c4.211-7.618 9.279-12.593 15.205-14.926s16.062-4.586 30.409-6.763c11.852-1.555 21.676-7.307 29.474-17.258s11.696-23.010 11.696-39.18c0-37.625-22.924-56.437-68.772-56.437-28.382 0-53.723 5.908-76.023 17.724s-39.532 28.529-51.696 50.141c-12.164 21.611-18.402 46.409-18.713 74.395-0.936 47.265-1.871 85.2-2.807 113.807s-2.339 47.109-4.211 55.504c-4.678 20.834-11.618 36.536-20.819 47.109s-21.209 20.445-36.023 29.618c-14.815 9.173-25.341 17.413-31.579 24.72s-9.357 18.89-9.357 34.749c0 23.010 9.045 40.268 27.135 51.773 22.456 13.993 38.44 25.886 47.953 35.681s16.218 22.388 20.117 37.78c3.899 15.392 6.16 32.183 6.784 50.374s1.559 61.956 2.807 131.298c0.936 42.911 14.581 77.193 40.936 102.846s61.52 38.48 105.497 38.48c45.848 0 68.772-18.501 68.772-55.504 0-16.791-3.821-30.007-11.462-39.646s-17.544-15.237-29.708-16.791c-18.090-2.488-30.721-6.219-37.895-11.194s-11.852-14.615-14.035-28.918c-2.183-14.304-3.587-41.978-4.211-83.023-0.624-40.113-3.041-72.995-7.251-98.649s-12.476-47.497-24.795-65.533c-12.32-18.035-30.175-34.36-53.567-48.974zM886.924 447.767c-22.144-13.682-39.454-28.996-51.93-45.943s-21.209-38.558-26.199-64.833c-4.99-26.275-7.485-59.935-7.485-100.981 0-30.784-0.702-53.483-2.105-68.098s-4.211-25.731-8.421-33.349c-4.211-7.618-9.279-12.593-15.205-14.926s-16.062-4.586-30.409-6.763c-11.852-1.555-21.676-7.307-29.474-17.258s-11.696-23.010-11.696-39.18c0-37.625 22.924-56.437 68.772-56.437 28.382 0 53.723 5.908 76.023 17.724s39.532 28.529 51.696 50.141c12.164 21.611 18.402 46.409 18.713 74.395 0.936 47.265 1.871 85.2 2.807 113.807s2.339 47.109 4.211 55.504c4.678 20.834 11.618 36.536 20.819 47.109s21.209 20.445 36.023 29.618c14.815 9.173 25.341 17.413 31.579 24.72s9.357 18.89 9.357 34.749c0 23.010-9.045 40.268-27.135 51.773-22.456 13.993-38.44 25.886-47.953 35.681s-16.218 22.388-20.117 37.78c-3.899 15.392-6.16 32.183-6.784 50.374s-1.559 61.956-2.807 131.298c-0.936 42.911-14.581 77.193-40.936 102.846s-61.52 38.48-105.497 38.48c-45.848 0-68.772-18.501-68.772-55.504 0-16.791 3.821-30.007 11.462-39.646s17.544-15.237 29.708-16.791c18.090-2.488 30.721-6.219 37.895-11.194s11.852-14.615 14.035-28.918c2.183-14.304 3.587-41.978 4.211-83.023 0.624-40.113 3.041-72.995 7.251-98.649s12.476-47.497 24.795-65.533c12.32-18.035 30.175-34.36 53.567-48.974z" />
|
||||
<glyph unicode="cloudflare" glyph-name="cloudflare" d="M699.311 230.329l4.865 17.484c2.331 6.169 3.68 13.292 3.68 20.721 0 12.481-3.807 24.103-10.36 33.831-10.141 13.064-26.265 21.658-44.475 21.957l-369.356 4.589c-2.423 0.020-4.562 1.181-5.874 2.956-0.776 1.144-1.227 2.518-1.227 3.996 0 0.886 0.162 1.737 0.462 2.523 1.302 3.466 4.592 5.987 8.528 6.272l372.667 4.467c49.36 5.311 90.168 36.077 108.48 78.264l21.576 54.666c0.338 1.058 0.531 2.274 0.531 3.534s-0.195 2.476-0.555 3.623c-25.625 105.442-122.001 182.789-237.024 182.789-105.653 0-195.57-65.257-229.144-156.432-18.511 11.439-41.211 19.308-65.81 19.308-60.376 0-109.319-47.412-109.319-105.899 0-9.204 1.212-18.135 3.491-26.649-83.733-1.883-150.447-68.135-150.447-149.482 0-8.034 0.651-15.924 1.905-23.618 0.347-2.592 3.356-5.226 6.998-5.226 0.020 0 0.041 0 0.060 0h682.414c3.98 0.062 7.324 2.627 8.432 6.138l-0.497 0.187zM810.55 477.714c-2.091-0.689-3.635-2.431-3.965-4.557l-14.341-48.393c-2.331-6.169-3.68-13.292-3.68-20.721 0-12.481 3.807-24.103 10.358-33.831 10.37-12.792 26.603-21.091 44.835-21.091 0.048 0 26.357-1.53 78.927-4.589 2.331-0.083 4.368-1.231 5.618-2.954 0.776-1.145 1.227-2.52 1.227-3.998 0-0.886-0.164-1.737-0.462-2.523-1.301-3.466-4.593-5.987-8.527-6.272l-81.703-4.467c-49.568-5.316-90.522-36.306-108.74-78.757l-6.213-15.858c-0.179-0.443-0.282-0.958-0.282-1.494 0-2.249 1.82-4.088 4.112-4.21h281.63c3.461 0 6.332 2.17 7.283 5.156 4.685 15.738 7.372 33.755 7.372 52.38 0 107.959-90.254 195.497-201.656 195.676l-11.792 0.501z" />
|
||||
<glyph unicode="cloud_migration" glyph-name="cloud-migration" d="M4.084 320h379.916v128h-365.939c35.286 82.255 118.578 141.042 216.896 145.083 13.786 98.746 102.292 174.917 209.42 174.917 99.562 0 183.040-65.792 204.508-156.092 18.238 6.353 37.93 9.82 58.468 9.82 87.884 0 160.254-63.463 170.904-145.972 83.204-16.805 145.664-87.332 145.738-172.055-2.662-97.469-86.2-175.7-189.092-175.7h-585.729c-119.608 0-223.556 83.058-245.090 192zM384 528.297v-288.594c0-35.346 28.654-64 64-64 15.811 0 31.062 5.852 42.814 16.429l160.33 144.297c26.273 23.645 28.402 64.112 4.757 90.385-1.501 1.668-3.089 3.256-4.757 4.757l-160.33 144.297c-26.273 23.645-66.739 21.516-90.385-4.757-10.577-11.752-16.429-27.003-16.429-42.814z" />
|
||||
<glyph unicode="cloud" glyph-name="cloud" d="M707.353 621.728c-20.538 0-40.23-3.466-58.468-9.82-21.468 90.3-104.946 156.092-204.508 156.092-107.128 0-195.634-76.172-209.42-174.917-130.164-5.35-233.99-106.654-234.954-231.337-0.002-128.739 114.686-233.746 249.172-233.746h585.729c102.892 0 186.43 78.231 189.092 175.7-0.074 84.722-62.534 155.249-145.738 172.055-10.65 82.51-83.020 145.972-170.904 145.972z" />
|
||||
<glyph unicode="close" glyph-name="close" d="M620.102 448.032l234.834 234.834c7.407 7.444 11.987 17.708 11.987 29.041s-4.579 21.597-11.988 29.042l-50.879 50.097c-7.444 7.407-17.708 11.987-29.041 11.987s-21.597-4.579-29.042-11.988l-234.832-234.832-234.834 234.834c-7.377 7.168-17.458 11.588-28.572 11.588s-21.195-4.42-28.581-11.598l-50.558-50.401c-7.315-7.428-11.832-17.628-11.832-28.885s4.517-21.457 11.836-28.89l234.828-234.828-234.834-234.834c-7.407-7.444-11.987-17.708-11.987-29.041s4.579-21.597 11.988-29.042l50.566-50.097c7.427-7.445 17.696-12.051 29.041-12.051s21.615 4.606 29.041 12.050l234.835 234.835 234.834-234.834c7.444-7.407 17.708-11.987 29.041-11.987s21.597 4.579 29.042 11.988l50.409 50.409c7.407 7.444 11.987 17.708 11.987 29.041s-4.579 21.597-11.988 29.042z" />
|
||||
<glyph unicode="clock" glyph-name="clock" d="M512 823.467c207.365 0 375.467-168.102 375.467-375.467s-168.102-375.467-375.467-375.467c-207.365 0-375.467 168.102-375.467 375.467 0.677 207.091 168.375 374.79 375.401 375.466zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512s-229.23 512-512 512zM774.144 638.293l-53.248 53.248c-4.962 4.662-11.661 7.527-19.029 7.527s-14.067-2.864-19.044-7.54l-170.652-170.653-93.696 93.696c-4.946 4.7-11.65 7.591-19.029 7.591s-14.083-2.891-19.041-7.602l-53.065-53.066c-4.951-4.865-8.020-11.631-8.021-19.114 0-0.020 0-0.043 0-0.066 0-7.378 3.001-14.055 7.85-18.877l165.719-165.719c4.849-4.851 11.549-7.851 18.95-7.851 0.058 0 0.116 0 0.174 0.001h1.015c7.274 0.098 13.834 3.079 18.603 7.851l242.347 242.347c4.857 4.876 7.86 11.602 7.86 19.029s-3.003 14.153-7.861 19.030z" />
|
||||
<glyph unicode="clipboard_notes" glyph-name="clipboard-notes" d="M877.227 836.778v0s0 1.195 0 1.707c0 34.404-27.89 62.293-62.293 62.293h-174.251v40.107c0 0.051 0.001 0.111 0.001 0.171 0 10.462-8.482 18.944-18.944 18.944 0 0-0.001 0-0.001 0h-218.965c-10.462 0-18.944-8.482-18.944-18.944v-40.448h-174.763c-34.404 0-62.293-27.89-62.293-62.293s0-1.024 0-1.707v0-837.803c-0.001-0.152-0.002-0.332-0.002-0.512 0-34.404 27.89-62.293 62.293-62.293 0.001 0 0.002 0 0.002 0h605.696c0 0 0 0 0 0 34.344 0 62.196 27.792 62.293 62.113s0 0.009 0 0.009v0 838.656zM759.126 53.93h-494.933v728.747h59.392v-36.352s0 0 0-1.195c0-11.876 9.628-21.504 21.504-21.504h333.312c11.876 0 21.504 9.628 21.504 21.504s0 0 0 0v37.547h59.221zM383.147 553.471c-0.094 7.751-6.4 13.999-14.164 13.999-0.12 0-0.24-0.002-0.36-0.004h-30.702c-7.823 0-14.165-6.342-14.165-14.165v-30.891c0-7.823 6.342-14.165 14.165-14.165h30.72c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 31.061zM699.905 553.471c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.823 0-14.165-6.342-14.165-14.165v-30.891c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891zM383.147 435.028c0 7.823-6.342 14.165-14.165 14.165h-30.72c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h30.379c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 30.891zM699.905 435.028c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891zM383.147 316.586c0 7.823-6.342 14.165-14.165 14.165h-30.72c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h30.379c0.051-0.001 0.111-0.001 0.171-0.001 7.823 0 14.165 6.342 14.165 14.165 0 0 0 0.001 0 0.001v0 30.891zM699.905 316.586c0 7.823-6.342 14.165-14.165 14.165h-229.035c-7.785-0.095-14.070-6.381-14.165-14.156v-30.9c0-7.823 6.342-14.165 14.165-14.165h229.035c7.823 0 14.165 6.342 14.165 14.165v0 30.891z" />
|
||||
<glyph unicode="chevron_up" glyph-name="chevron-up" d="M102.581 212.996c-4.926 5.536-9.099 11.895-12.264 18.811-3.343 7.338-5.179 15.366-5.179 23.822 0 8.746 1.964 17.033 5.474 24.444 3.18 6.706 7.231 12.776 12.035 18.159l366.185 365.664c5.619 4.975 12.097 9.157 19.152 12.272 7.482 3.354 15.667 5.199 24.283 5.199s16.801-1.845 24.181-5.162c7.155-3.158 13.632-7.339 19.333-12.378l366-367.035c5.397-5.383 9.775-11.785 12.822-18.894 2.75-6.785 4.259-14.202 4.259-21.972 0-0.453-0.005-0.905-0.015-1.356 0.002-0.015 0.002-0.111 0.002-0.208 0-8.455-1.694-16.514-4.76-23.857-2.613-7.223-6.867-13.729-12.297-19.037l-42.506-43.359c-5.537-4.924-11.896-9.096-18.811-12.264-7.346-3.363-15.385-5.211-23.856-5.211s-16.51 1.848-23.736 5.162c-6.969 3.225-13.27 7.396-18.832 12.376l-281.869 281.025-280.576-279.723c-10.714-10.555-25.431-17.072-41.671-17.072-0.29 0-0.58 0.002-0.869 0.006 0.011-0.001-0.027-0.001-0.066-0.001-8.512 0-16.628 1.693-24.030 4.761-6.981 2.849-13.251 7.256-18.323 12.78l-44.066 41.509z" />
|
||||
<glyph unicode="chevron_right" glyph-name="chevron-right" d="M308.816 857.398c5.489 4.917 11.79 9.088 18.646 12.264 7.34 3.363 15.379 5.211 23.85 5.211s16.51-1.848 23.736-5.162c7.036-3.211 13.395-7.384 19.006-12.379l364.98-367.037c5.487-5.503 9.971-12.010 13.152-19.22 3.337-7.412 5.188-15.597 5.188-24.214s-1.851-16.803-5.178-24.179c-3.217-7.176-7.697-13.623-13.162-19.084l-365.91-365.398c-10.689-10.554-25.384-17.073-41.602-17.073-0.314 0-0.628 0.002-0.941 0.007 0.015-0.001-0.024-0.001-0.062-0.001-8.512 0-16.628 1.693-24.030 4.761-7.018 2.679-13.345 6.922-18.512 12.289l-43.877 43.024c-4.912 5.491-9.082 11.792-12.263 18.645-3.364 7.341-5.212 15.381-5.212 23.851s1.848 16.51 5.162 23.736c3.219 7.034 7.392 13.392 12.381 19.008l281.020 281.351-279.723 280.576c-5.394 5.385-9.771 11.787-12.821 18.893-3.381 7.189-5.369 15.135-5.609 23.519-0.003 0.196-0.003 0.329-0.003 0.462 0 8.478 1.694 16.561 4.761 23.928 2.85 6.986 7.257 13.255 12.781 18.327l43.387 43.895z" />
|
||||
<glyph unicode="chevron_left" glyph-name="chevron-left" d="M716.62 38.236c-5.492-4.91-11.792-9.080-18.644-12.262-7.344-3.354-15.383-5.196-23.852-5.196s-16.508 1.841-23.738 5.146c-7.031 3.224-13.388 7.396-19.008 12.382l-366.854 367.035c-5.463 5.454-9.854 11.98-12.829 19.236-3.048 7.438-4.735 15.621-4.735 24.198s1.687 16.76 4.748 24.235c2.991 7.15 7.377 13.616 12.814 19.027l367.789 365.4c10.89 10.984 25.984 17.784 42.667 17.784s31.777-6.8 42.662-17.78l41.818-43.012c5.397-5.383 9.775-11.785 12.822-18.894 3.056-7.305 4.744-15.342 4.744-23.773s-1.689-16.467-4.746-23.789c-3.067-7.024-7.441-13.367-12.816-18.703l-279.044-281.433 279.040-280.576c5.394-5.385 9.771-11.787 12.821-18.893 3.065-7.145 4.76-15.008 4.76-23.266 0-0.178-0.001-0.357-0.002-0.535 0-0.035 0.001-0.108 0.001-0.182 0-8.477-1.693-16.559-4.76-23.926-2.85-6.986-7.257-13.255-12.781-18.327l-42.021-43.895z" />
|
||||
<glyph unicode="chevron_down" glyph-name="chevron-down" d="M921.583 588.559c5.562-5.106 9.969-11.375 12.847-18.431 2.739-6.961 4.255-14.629 4.255-22.65 0-0.738-0.013-1.472-0.038-2.204 0.004-0.035 0.005-0.201 0.005-0.368 0-8.27-1.695-16.144-4.757-23.293-2.949-6.896-7.151-13.123-12.321-18.397l-366.241-367.094c-5.618-4.978-12.096-9.16-19.153-12.272-7.479-3.363-15.665-5.215-24.282-5.215s-16.803 1.851-24.179 5.178c-7.157 3.155-13.635 7.336-19.334 12.377l-366.001 367.035c-5.157 5.267-9.359 11.493-12.31 18.382-3.064 7.134-4.76 14.985-4.76 23.232 0 0.19 0.001 0.38 0.003 0.57-0.001 0.053-0.001 0.149-0.001 0.246 0 8.455 1.694 16.514 4.76 23.857 2.613 7.223 6.867 13.729 12.297 19.037l42.506 43.359c5.538 4.921 11.896 9.094 18.81 12.263 7.349 3.353 15.388 5.195 23.857 5.195s16.508-1.841 23.738-5.146c7.034-3.211 13.393-7.384 19.004-12.379l281.695-281.021 280.576 279.723c10.689 10.554 25.384 17.073 41.602 17.073 0.314 0 0.628-0.002 0.941-0.007 0.026 0.001 0.112 0.001 0.198 0.001 8.523 0 16.651-1.693 24.065-4.762 6.98-2.849 13.25-7.256 18.322-12.78l43.895-41.509z" />
|
||||
<glyph unicode="check_tick" glyph-name="check-tick" d="M874.008 810.069c-92.651 92.636-220.639 149.931-362.008 149.931-282.77 0-512-229.23-512-512s229.23-512 512-512c141.37 0 269.358 57.295 362.009 149.932 92.671 92.656 149.991 220.668 149.991 362.068s-57.32 269.412-149.991 362.068zM724.675 535.125l-251.392-251.392c-10.683-10.67-25.435-17.268-41.728-17.268s-31.045 6.599-41.729 17.269l-126.805 126.805c-6.868 6.884-11.116 16.386-11.116 26.88s4.247 19.996 11.116 26.881l29.695 29.695c6.893 6.919 16.429 11.201 26.965 11.201s20.073-4.282 26.964-11.2l85.335-85.335 209.067 210.091c6.884 6.868 16.386 11.116 26.88 11.116s19.996-4.247 26.881-11.116l29.695-29.695c6.868-6.884 11.116-16.386 11.116-26.88s-4.247-19.996-11.116-26.881z" />
|
||||
<glyph unicode="check" glyph-name="check" d="M968.539 715.568l-62.444 62.444c-7.94 8.099-18.995 13.119-31.221 13.119s-23.282-5.021-31.215-13.112l-460.37-462.087-202.941 202.941c-7.94 8.099-18.995 13.119-31.221 13.119s-23.282-5.021-31.215-13.112l-62.45-62.45c-8.099-7.94-13.119-18.995-13.119-31.221s5.021-23.282 13.112-31.215l266.016-263.518c15.821-15.822 37.676-25.608 61.819-25.608s45.998 9.786 61.819 25.608l523.431 523.275c8.099 7.94 13.119 18.995 13.119 31.221s-5.021 23.282-13.112 31.215z" />
|
||||
<glyph unicode="camera" glyph-name="camera" d="M512.001 527.104c65.98 0 119.467-53.487 119.467-119.467s-53.487-119.467-119.467-119.467c-65.98 0-119.467 53.487-119.467 119.467s53.487 119.467 119.467 119.467zM976.897 774.058v0h-210.603v35.84c0 26.015-21.089 47.104-47.104 47.104h-414.379c-26.015 0-47.104-21.089-47.104-47.104v-35.328h-210.603c0 0-0.001 0-0.001 0-26.015 0-47.104-21.089-47.104-47.104 0-0.12 0-0.24 0.001-0.36v-640.664c-0.001-0.101-0.001-0.221-0.001-0.341 0-26.015 21.089-47.104 47.104-47.104 0 0 0.001 0 0.001 0h929.792c0 0 0.001 0 0.001 0 26.015 0 47.104 21.089 47.104 47.104 0 0.12 0 0.24-0.001 0.36v640.664c0 26.015-21.089 47.104-47.104 47.104zM515.073 162.901c-134.693 0-243.883 109.19-243.883 243.883s109.19 243.883 243.883 243.883c134.693 0 243.883-109.19 243.883-243.883s-109.19-243.883-243.883-243.883zM961.025 585.13h-186.368v125.952h186.368v-125.952z" />
|
||||
<glyph unicode="calendar" glyph-name="calendar" d="M947.712 597.675h-871.424c0 0-0.001 0-0.001 0-9.931 0-17.993-8.002-18.090-17.911v-625.673c0-9.991 8.099-18.091 18.091-18.091h871.424c0.051-0.001 0.111-0.001 0.171-0.001 9.897 0 17.92 8.023 17.92 17.92 0 0.060 0 0.121-0.001 0.181v625.655c0.001 0.051 0.001 0.111 0.001 0.171 0 9.897-8.023 17.92-17.92 17.92-0.060 0-0.121 0-0.181-0.001zM360.618 68.779c-31.96 0.064-62.513 6.006-90.661 16.801-1.627 0.778-3.962 4.026-3.962 7.818 0 0.406 0.027 0.805 0.079 1.197l8.358 61.223c0.395 2.762 1.989 5.086 4.227 6.463 1.187 0.588 2.537 0.919 3.965 0.919s2.778-0.331 3.979-0.92c23.432-9.491 50.672-15.011 79.201-15.011 0.937 0 1.873 0.006 2.807 0.018 31.261-0.001 53.106 14.847 53.106 36.009 0 26.283-12.629 40.448-82.091 44.373-4.77 0.279-8.533 4.215-8.533 9.031 0 0.005 0 0.010 0 0.015v60.927c0 0.008 0 0.017 0 0.026 0 4.755 3.67 8.654 8.332 9.018 60.106 4.781 66.591 21.847 66.591 36.013 0 9.045 0 24.405-40.448 24.405-24.992-0.457-48.421-6.714-69.134-17.477-0.327-0.196-1.737-0.55-3.229-0.55s-2.902 0.355-4.149 0.984c-2.488 1.281-4.294 3.707-4.72 6.583l-8.369 61.147c-0.051 0.36-0.080 0.776-0.080 1.199 0 3.599 2.102 6.707 5.145 8.164 28.28 12.188 61.139 19.262 95.651 19.262 2.753 0 5.495-0.045 8.226-0.134 72.818 0.010 121.97-34.123 121.97-85.323 0-37.888-19.627-65.877-59.904-85.333 34.133-13.312 69.803-37.547 69.803-88.576 0-73.045-61.269-119.467-156.331-119.467zM740.864 82.432c0-4.996-4.050-9.045-9.045-9.045h-74.069c-4.996 0-9.045 4.050-9.045 9.045v246.101l-48.981-18.603c-1.147-0.565-2.498-0.896-3.925-0.896s-2.778 0.331-3.979 0.92c-2.26 1.339-3.87 3.682-4.209 6.419l-8.367 61.312c-0.053 0.365-0.084 0.787-0.084 1.216 0 3.504 2.031 6.534 4.981 7.977l106.719 52.759c1.19 0.626 2.597 1.003 4.089 1.024h37.212c4.858-0.175 8.73-4.155 8.73-9.040 0-0.242-0.010-0.482-0.028-0.72l0.002-348.47zM947.712 879.445h-92.843v-43.52c0-46.080-26.283-95.232-100.181-95.232s-100.181 48.64-100.181 95.232v43.52h-283.819v-43.52c0-46.080-26.283-95.232-100.181-95.232s-100.352 48.64-100.352 95.232v43.52h-93.867c-0.051 0.001-0.111 0.001-0.171 0.001-9.897 0-17.92-8.023-17.92-17.92 0-0.060 0-0.121 0.001-0.181v-183.116c0-9.991 8.099-18.091 18.091-18.091h871.424c0.051-0.001 0.111-0.001 0.171-0.001 9.897 0 17.92 8.023 17.92 17.92 0 0.060 0 0.121-0.001 0.181v183.116c0.001 0.051 0.001 0.111 0.001 0.171 0 9.897-8.023 17.92-17.92 17.92-0.060 0-0.121 0-0.181-0.001zM270.506 798.891c29.867 0 41.984 10.752 41.984 37.035v86.869c0 26.453-12.117 37.205-41.984 37.205s-41.643-10.752-41.643-37.205v-86.869c0-26.453 12.117-37.035 41.984-37.035zM754.688 798.891c29.867 0 41.984 10.752 41.984 37.035v86.869c0 26.453-12.288 37.205-41.984 37.205s-41.984-10.752-41.984-37.205v-86.869c0-26.453 12.117-37.035 41.984-37.035z" />
|
||||
<glyph unicode="calculator" glyph-name="calculator" d="M192 960h640c70.692 0 128-57.308 128-128v-768c0-70.692-57.308-128-128-128h-640c-70.692 0-128 57.308-128 128v768c0 70.692 57.308 128 128 128zM256 832c-35.346 0-64-28.654-64-64v-32c0-35.346 28.654-64 64-64h512c35.346 0 64 28.654 64 64v32c0 35.346-28.654 64-64 64h-512zM224 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM224 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM224 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM464 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 576c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 384c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM704 192c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96z" />
|
||||
<glyph unicode="brush" glyph-name="brush" d="M160.069 366.080c-0.042-1.090-0.069-2.366-0.069-3.65 0-54.576 44.719-98.816 99.886-98.816 1.298 0 2.592 0.024 3.876 0.072l82.621-0.006c0.954 0.054 2.068 0.086 3.192 0.086 32.585 0 59-26.132 59-58.368 0-1.11-0.032-2.214-0.093-3.31l0.008-219.496c0.099-25.692 21.124-46.496 47.086-46.592h112.661c25.97 0.096 47 20.9 47.097 46.582v219.486c-0.061 0.998-0.097 2.164-0.097 3.338 0 32.236 26.415 58.368 59 58.368 1.187 0 2.367-0.034 3.536-0.102l82.645 0.008c1.154-0.048 2.509-0.074 3.869-0.074 55.070 0 99.712 44.164 99.712 98.644 0 1.346-0.028 2.688-0.081 4.020l0.006 102.21h-703.861l0.004-102.4zM420.565 960l-74.183-73.388-74.183 73.388h-112.135v-450.56h703.861v450.56h-443.36z" />
|
||||
<glyph unicode="branda" glyph-name="branda" d="M882.176 547.328l-310.272 310.272h-469.504v-465.92l351.231-312.32 428.545 467.968zM0 960h614.4l409.6-409.6-563.2-614.4-460.8 409.6v614.4zM187.733 793.456c12.63 8.439 27.479 12.944 42.669 12.944 20.369 0 39.904-8.091 54.306-22.494s22.494-33.938 22.494-54.306c0-15.19-4.505-30.039-12.944-42.669s-20.432-22.472-34.465-28.285c-14.033-5.813-29.478-7.336-44.375-4.371s-28.582 10.278-39.321 21.018c-10.741 10.741-18.055 24.424-21.019 39.322s-1.44 30.341 4.373 44.375c5.813 14.032 15.655 26.026 28.285 34.465z" />
|
||||
<glyph unicode="bookmark" glyph-name="bookmark" d="M256 960v-1024l256 256 256-256v1024h-512z" />
|
||||
<glyph unicode="book" glyph-name="book" d="M892.798 776.531v0c0 10.721-8.691 19.413-19.413 19.413h-40.32v-716.8c-0.075-10.484-8.385-19.003-18.779-19.411l-604.389-0.001c-9.345 0.103-17.108 6.741-18.943 15.553l-0.021 42.836h562.987c10.74 0.085 19.413 8.811 19.413 19.563 0 0 0 0 0 0.001v0 738.752c0 0 0 0 0 0.001 0 10.752-8.673 19.478-19.405 19.563h-603.166c-10.804 0-19.563-8.758-19.563-19.563s0 0 0-0.747v-855.381s0 0 0 0 0 0 0 0v-0.896c0.085-10.74 8.811-19.413 19.563-19.413 0 0 0 0 0.001 0h722.624c10.74 0.085 19.413 8.811 19.413 19.563 0 0 0 0 0 0.001v0z" />
|
||||
<glyph unicode="bold" glyph-name="bold" d="M684.799 460.033c72.576 14.976 132.48 80.64 132.48 176.127 0 102.528-74.88 195.84-221.184 195.84h-368.767c-19.512 0-35.328-15.816-35.328-35.328v-697.344c0-19.511 15.816-35.328 35.328-35.328h381.439c147.456 0 223.233 92.16 223.233 208.384 0 95.616-63.999 175.616-147.201 187.649zM355.455 688h204.801c55.296 0 89.599-33.408 89.599-80.64 0-49.536-34.56-80.64-89.599-80.64h-204.801v161.28zM567.294 207.871h-211.839v175.104h211.968c63.36 0 97.92-39.168 97.92-87.552 0-55.296-36.864-87.552-97.92-87.552h-0.129z" />
|
||||
<glyph unicode="blog" glyph-name="blog" d="M64 896v-119.467h59.733s0 74.667 74.667 74.667v-283.733s0-14.933-29.867-14.933h-14.933v-44.8h194.133v44.8h-14.933c-29.867 0-29.867 14.933-29.867 14.933v283.733c74.667 0 74.667-74.667 74.667-74.667h59.733v119.467zM930.133 761.6h-388.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h388.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 0h-836.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h836.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 253.867h-836.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h836.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0zM930.133 507.733h-388.267c-16.495 0-29.867 13.372-29.867 29.867v0 74.667c0 16.495 13.372 29.867 29.867 29.867v0h388.267c16.495 0 29.867-13.372 29.867-29.867v0-74.667c0-16.495-13.372-29.867-29.867-29.867v0z" />
|
||||
<glyph unicode="beehive" glyph-name="beehive" d="M749.721 494.543h-95.087v-232.728h95.087v232.728zM512 853.874l380.343-204.798v-402.154l-380.343-204.8-380.343 204.8v402.154l380.343 204.798zM512 960l-475.429-256v-512l475.429-256 475.429 256v512l-475.429 256zM369.373 354.906h-95.086v-93.091h95.086v93.091zM559.546 634.179h-95.086v-372.365h95.086v372.365z" />
|
||||
<glyph unicode="automate" glyph-name="automate" d="M931.584 741.355c94.454-135.064 118.112-307.338 63.563-462.862s-180.634-275.28-338.763-321.757c37.684 56.421 72.377 114.782 103.936 174.843 120.064 222.842 171.264 468.98 171.264 609.776zM195.456 696.428c-59.991-31.612-118.309-66.303-174.72-103.933 44.483 151.22 156.145 273.521 302.706 331.549s311.682 45.313 447.63-34.469c11.648-6.4 22.528-14.208 34.048-22.015-141.056 0.64-386.816-51.583-609.664-171.131zM529.024-64h-17.024c-282.77 0-512 229.224-512 511.986 0 5.76 0 11.392 0 17.152 181.888 56.447 569.216 193.531 646.016 116.605s-60.416-464.116-116.992-645.743z" />
|
||||
<glyph unicode="async" glyph-name="async" d="M479.996 768h128c8.487 0 16.626 3.372 22.627 9.373s9.373 14.14 9.373 22.627v64c0 8.487-3.372 16.627-9.373 22.627s-14.14 9.373-22.627 9.373h-128c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.487 3.372-16.627 9.372-22.627s14.141-9.373 22.628-9.373zM479.996 512h255.998c8.486 0 16.627 3.372 22.63 9.373 5.997 6.001 9.37 14.14 9.37 22.627v64c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-255.998c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.487 3.372-16.627 9.372-22.627s14.141-9.373 22.628-9.373zM991.994 128h-511.998c-8.487 0-16.627-3.373-22.628-9.37-6.001-6.003-9.372-14.144-9.372-22.63v-64c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37h511.998c8.486 0 16.627 3.373 22.63 9.37 5.997 6.003 9.37 14.144 9.37 22.63v64c0 8.486-3.373 16.627-9.37 22.63-6.003 5.997-14.144 9.37-22.63 9.37zM479.996 256h383.998c8.486 0 16.627 3.373 22.63 9.37 5.997 6.003 9.37 14.144 9.37 22.63v64c0 8.487-3.373 16.627-9.37 22.627-6.003 6.001-14.144 9.373-22.63 9.373h-383.998c-8.487 0-16.627-3.372-22.628-9.373s-9.372-14.14-9.372-22.627v-64c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37zM31.995 640h96v-608c0-8.486 3.372-16.627 9.372-22.63 6.001-5.997 14.141-9.37 22.628-9.37h64c8.487 0 16.626 3.373 22.627 9.37 6.001 6.003 9.373 14.144 9.373 22.63v608h96c28.42 0 42.78 34.48 22.62 54.62l-160 192c-6 5.996-14.136 9.365-22.62 9.365s-16.62-3.369-22.62-9.365l-160-192c-20.080-20.1-5.82-54.62 22.62-54.62z" />
|
||||
<glyph unicode="arrows_out" glyph-name="arrows-out" d="M106.101 270.054l-42.263-253.425c-0.101-0.652-0.159-1.406-0.159-2.171 0-4.032 1.598-7.691 4.194-10.378l-0.005 0.005c2.682-2.593 6.341-4.191 10.373-4.191 0.765 0 1.519 0.058 2.253 0.169l252.15 42.701c6.673 1.588 11.559 7.498 11.559 14.547 0 3.826-1.438 7.317-3.804 9.959l-49.418 49.416 132.612 132.612c2.511 2.666 4.054 6.267 4.054 10.229s-1.543 7.564-4.061 10.237l-90.94 91.239c-2.666 2.511-6.267 4.054-10.229 4.054s-7.564-1.543-10.237-4.061l-132.306-132.605-49.431 49.431c-2.628 2.354-6.118 3.792-9.944 3.792-7.051 0-12.96-4.886-14.528-11.457zM917.601 625.778l42.263 253.425c0.101 0.652 0.159 1.406 0.159 2.171 0 4.032-1.598 7.691-4.194 10.378l0.005-0.005c-2.701 2.694-6.429 4.36-10.545 4.36-0.811 0-1.607-0.064-2.384-0.189l-251.847-42.848c-6.673-1.588-11.559-7.498-11.559-14.547 0-3.826 1.438-7.317 3.804-9.959l49.418-49.416-133.359-132.612c-2.511-2.666-4.054-6.267-4.054-10.229s1.543-7.564 4.061-10.237l91.687-91.387c2.666-2.511 6.267-4.054 10.229-4.054s7.564 1.543 10.237 4.061l132.605 132.605 49.431-49.431c2.625-2.338 6.103-3.767 9.916-3.767 7.095 0 13.034 4.949 14.556 11.582zM689.712 42.165l253.873-41.963c0.652-0.101 1.406-0.159 2.171-0.159 4.032 0 7.691 1.598 10.378 4.194l-0.005-0.005c2.593 2.682 4.191 6.341 4.191 10.373 0 0.765-0.058 1.519-0.169 2.253l-43.149 251.85c-1.588 6.673-7.498 11.559-14.547 11.559-3.826 0-7.317-1.438-9.959-3.804l-49.416-49.418-132.612 133.359c-2.666 2.511-6.267 4.054-10.229 4.054s-7.564-1.543-10.237-4.061l-91.387-91.687c-2.511-2.666-4.054-6.267-4.054-10.229s1.543-7.564 4.061-10.237l132.605-132.605-49.431-49.431c-2.338-2.625-3.767-6.103-3.767-9.916 0-7.095 4.949-13.034 11.582-14.556zM333.99 853.667l-253.425 42.263c-0.612 0.090-1.319 0.14-2.037 0.14-4.097 0-7.809-1.65-10.509-4.322l0.001 0.001c-2.682-2.698-4.34-6.419-4.34-10.525 0-0.764 0.058-1.517 0.169-2.25l42.85-251.85c1.588-6.673 7.498-11.559 14.547-11.559 3.826 0 7.317 1.438 9.959 3.804l49.416 49.418 132.612-132.612c2.666-2.511 6.267-4.054 10.229-4.054s7.564 1.543 10.237 4.061l91.387 90.94c2.511 2.666 4.054 6.267 4.054 10.229s-1.543 7.564-4.061 10.237l-132.755 132.306 49.431 49.431c2.338 2.625 3.767 6.103 3.767 9.916 0 7.095-4.949 13.034-11.582 14.556z" />
|
||||
<glyph unicode="arrows_in" glyph-name="arrows-in" d="M377.603 70.087l44.959 271.996c0.108 0.699 0.17 1.506 0.17 2.326 0 4.32-1.712 8.241-4.494 11.12l0.005-0.005c-2.874 2.778-6.794 4.49-11.114 4.49-0.82 0-1.628-0.062-2.414-0.181l-270.627-46.228c-6.921-1.864-11.931-8.084-11.931-15.474 0-3.855 1.363-7.391 3.634-10.154l52.937-52.931-142.238-142.718c-2.69-2.856-4.343-6.715-4.343-10.96s1.653-8.104 4.351-10.968l97.911-97.91c2.856-2.69 6.715-4.343 10.96-4.343s8.104 1.653 10.968 4.351l142.069 142.070 53.599-52.799c2.811-2.505 6.539-4.036 10.625-4.036 7.602 0 13.965 5.3 15.595 12.408zM646.398 825.913l-44.959-271.996c-0.108-0.699-0.17-1.506-0.17-2.326 0-4.32 1.712-8.241 4.494-11.12l-0.005 0.005c2.874-2.778 6.794-4.49 11.114-4.49 0.82 0 1.628 0.062 2.414 0.181l270.627 45.748c7.090 1.744 12.266 8.046 12.266 15.557 0 4.037-1.495 7.725-3.962 10.54l-52.943 52.942 142.077 142.077c2.69 2.856 4.343 6.715 4.343 10.96s-1.653 8.104-4.351 10.968l-97.75 98.55c-2.856 2.69-6.715 4.343-10.96 4.343s-8.104-1.653-10.968-4.351l-142.069-142.070-53.599 52.799c-2.811 2.505-6.539 4.036-10.625 4.036-7.602 0-13.965-5.3-15.595-12.408zM889.914 313.603l-271.996 44.959c-0.699 0.108-1.506 0.17-2.326 0.17-4.32 0-8.241-1.712-11.12-4.494l0.005 0.005c-2.778-2.874-4.49-6.794-4.49-11.114 0-0.82 0.062-1.628 0.181-2.414l46.228-270.627c1.701-7.148 8.032-12.383 15.586-12.383 4.099 0 7.838 1.541 10.67 4.076l52.943 52.945 142.077-142.077c2.856-2.69 6.715-4.343 10.96-4.343s8.104 1.653 10.968 4.351l97.91 97.911c2.69 2.856 4.343 6.715 4.343 10.96s-1.653 8.104-4.351 10.968l-142.070 142.069 52.799 53.439c2.505 2.811 4.036 6.539 4.036 10.625 0 7.602-5.3 13.965-12.408 15.595zM134.088 582.397l271.996-44.959c0.699-0.108 1.506-0.17 2.326-0.17 4.32 0 8.241 1.712 11.12 4.494l-0.005-0.005c2.778 2.874 4.49 6.794 4.49 11.114 0 0.82-0.062 1.628-0.181 2.414l-46.228 270.627c-1.864 6.921-8.084 11.931-15.474 11.931-3.855 0-7.391-1.363-10.154-3.634l-53.572-52.937-142.077 142.238c-2.856 2.69-6.715 4.343-10.96 4.343s-8.104-1.653-10.968-4.351l-97.91-97.911c-2.69-2.856-4.343-6.715-4.343-10.96s1.653-8.104 4.351-10.968l142.070-142.069-52.799-53.599c-2.505-2.811-4.036-6.539-4.036-10.625 0-7.602 5.3-13.965 12.408-15.595z" />
|
||||
<glyph unicode="arrows_expand" glyph-name="arrows-expand" d="M109.982 293.839l-45.997-275.685c-0.147-0.806-0.231-1.734-0.231-2.682 0-4.315 1.744-8.223 4.562-11.058l-0.001 0.001c2.724-2.85 6.557-4.623 10.803-4.623 1.040 0 2.053 0.105 3.032 0.308l274.843 46.428c7.493 1.27 13.129 7.712 13.129 15.471 0 4.342-1.764 8.271-4.615 11.111l-53.764 53.764 144.264 144.264c2.861 2.841 4.63 6.777 4.63 11.127s-1.771 8.285-4.629 11.126l-99.463 99.463c-2.841 2.861-6.777 4.63-11.127 4.63s-8.285-1.771-11.126-4.629l-143.966-144.265-53.764 53.764c-2.839 2.851-6.77 4.615-11.112 4.615-7.759 0-14.201-5.636-15.458-13.035zM914.040 602.081l45.997 275.685c0.133 0.768 0.209 1.652 0.209 2.555 0 4.305-1.734 8.202-4.542 11.037l0.001-0.001c-2.884 2.991-6.926 4.851-11.404 4.851-0.931 0-1.842-0.080-2.729-0.234l-274.843-46.731c-7.493-1.27-13.129-7.712-13.129-15.471 0-4.342 1.764-8.271 4.615-11.111l53.764-53.764-144.264-144.414c-2.861-2.841-4.63-6.777-4.63-11.127s1.771-8.285 4.629-11.126l99.463-99.463c2.841-2.861 6.777-4.63 11.127-4.63s8.285 1.771 11.126 4.629l144.414 144.414 53.764-53.764c2.839-2.851 6.77-4.615 11.112-4.615 7.759 0 14.201 5.636 15.458 13.035z" />
|
||||
<glyph unicode="arrows_compress" glyph-name="arrows-compress" d="M408.042 79.040l48.96 295.36c0.182 0.906 0.286 1.946 0.286 3.011 0 4.537-1.888 8.632-4.921 11.543l-0.006 0.006c-3.037 3.021-7.223 4.887-11.846 4.887-1.015 0-2.010-0.090-2.976-0.263l-294.458-49.585c-8.028-1.361-14.065-8.263-14.065-16.576 0-4.652 1.89-8.861 4.944-11.903l57.601-57.601-154.56-154.56c-2.923-3.019-4.724-7.139-4.724-11.68s1.802-8.661 4.729-11.684l107.035-107.035c3.044-3.065 7.261-4.961 11.92-4.961s8.876 1.897 11.919 4.96l154.081 155.041 57.6-57.6c3.042-3.055 7.253-4.945 11.904-4.945 8.313 0 15.215 6.038 16.562 13.966zM616.041 816.96l-49.12-295.36c-0.143-0.823-0.224-1.77-0.224-2.737 0-4.612 1.858-8.788 4.866-11.825l-0.001 0.001c3.060-3.015 7.263-4.876 11.901-4.876 0.996 0 1.972 0.086 2.921 0.25l294.619 49.585c8.028 1.361 14.065 8.263 14.065 16.576 0 4.652-1.89 8.861-4.944 11.903l-58.081 57.601 154.72 154.72c3.065 3.044 4.961 7.261 4.961 11.92s-1.897 8.876-4.96 11.919l-106.721 106.401c-3.044 3.065-7.261 4.961-11.92 4.961s-8.876-1.897-11.919-4.96l-154.081-155.041-57.6 57.6c-3.042 3.055-7.253 4.945-11.904 4.945-8.313 0-15.215-6.038-16.562-13.966z" />
|
||||
<glyph unicode="arrow_up" glyph-name="arrow-up" d="M491.007 899.925l-388.949-388.949c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l62.463-62.463c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l230.399 230.228v-621.568c-0.001-0.102-0.002-0.222-0.002-0.342 0-14.645 11.824-26.528 26.446-26.623h95.412c14.704 0 26.624 11.92 26.624 26.624v621.909l230.4-230.4c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l62.463 62.463c5.46 5.491 8.836 13.061 8.836 21.419s-3.375 15.927-8.837 21.42l-388.948 389.119c-5.401 5.38-12.851 8.706-21.077 8.706s-15.677-3.326-21.078-8.707z" />
|
||||
<glyph unicode="arrow_skip_start" glyph-name="arrow-skip-start" d="M794.729 99.707c-4.704-4.25-10.109-7.845-16-10.573l-0.397-0.165c-5.848-2.66-12.683-4.209-19.879-4.209s-14.031 1.549-20.188 4.334l0.309-0.125c-6.234 2.89-11.594 6.486-16.301 10.782l0.050-0.044-312.112 312.112c-4.671 4.572-8.409 10.079-10.913 16.22l-0.116 0.322c-2.207 5.658-3.485 12.207-3.485 19.054 0 0.187 0.001 0.376 0.003 0.562v-0.028c0 0.078-0.001 0.17-0.001 0.262 0 7.179 1.44 14.021 4.047 20.254l-0.129-0.346c2.401 6.771 6.010 12.577 10.613 17.434l-0.020-0.022 312.837 310.661c4.498 4.64 9.904 8.372 15.934 10.909l0.317 0.119c5.872 2.541 12.708 4.020 19.891 4.020 14.167 0 26.989-5.751 36.262-15.046l0.001-0.001 35.549-36.566c9.237-9.35 14.944-22.209 14.944-36.398 0-7.126-1.439-13.917-4.043-20.097l0.128 0.341c-2.696-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-237.24-239.271 237.24-238.546c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.324c2.479-5.769 3.919-12.482 3.919-19.533 0-0.121-0.001-0.244-0.002-0.364v0.018c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.403l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-35.549-37.291zM294.13 99.707h-87.060c-16.027 0-29.019 12.992-29.019 29.019v0 638.444c0 16.027 12.992 29.019 29.019 29.019v0h87.060c16.027 0 29.019-12.992 29.019-29.019v0-638.444c0-16.027-12.992-29.019-29.019-29.019v0z" />
|
||||
<glyph unicode="arrow_skip_forward" glyph-name="arrow-skip-forward" d="M526.871 99.768c4.641-4.289 10.005-7.889 15.872-10.582l0.379-0.155c5.848-2.66 12.683-4.209 19.878-4.209s14.031 1.549 20.186 4.334l-0.309-0.125c6.287 2.892 11.694 6.487 16.451 10.788l-0.056-0.051 311.959 312.104c4.671 4.572 8.409 10.079 10.912 16.22l0.116 0.322c2.207 5.658 3.485 12.206 3.485 19.054 0 0.187-0.001 0.376-0.003 0.562v-0.028c0 0.078 0.001 0.17 0.001 0.262 0 7.178-1.44 14.021-4.046 20.253l0.129-0.346c-2.4 6.77-6.009 12.577-10.613 17.434l0.020-0.022-312.685 310.653c-9.35 9.237-22.207 14.942-36.397 14.942-7.126 0-13.917-1.439-20.095-4.043l0.341 0.128c-6.333-2.695-11.732-6.42-16.244-11.019l-0.007-0.007-35.694-36.564c-9.237-9.35-14.942-22.207-14.942-36.397 0-7.126 1.439-13.917 4.043-20.095l-0.128 0.341c2.695-6.333 6.42-11.732 11.019-16.244l0.007-0.007 237.234-239.265-237.234-238.54c-4.607-4.519-8.332-9.917-10.904-15.928l-0.123-0.323c-2.479-5.769-3.919-12.482-3.919-19.533 0-0.121 0.001-0.244 0.002-0.364v0.018c0-0.079-0.001-0.172-0.001-0.266 0-7.227 1.439-14.118 4.047-20.401l-0.131 0.353c2.552-6.29 6.299-11.62 10.995-15.931l0.031-0.028 35.694-37.289zM150.488 99.768c4.704-4.25 10.109-7.845 15.999-10.572l0.397-0.165c5.509-2.395 11.923-3.787 18.665-3.787 0.426 0 0.852 0.006 1.276 0.017l-0.062-0.002c0.047 0 0.102 0 0.156 0 7.143 0 13.923 1.549 20.025 4.331l-0.302-0.123c6.219 2.8 11.574 6.251 16.334 10.372l-0.083-0.070 311.089 312.104c4.671 4.572 8.409 10.079 10.912 16.22l0.116 0.322c2.479 5.965 3.918 12.896 3.918 20.161 0 0.053 0 0.108 0 0.162v-0.008c0 0.078 0.001 0.17 0.001 0.262 0 7.178-1.44 14.021-4.046 20.253l0.129-0.346c-2.617 6.512-6.355 12.067-11.023 16.681l-0.005 0.005-311.815 310.653c-4.54 4.573-9.933 8.291-15.92 10.9l-0.331 0.129c-5.488 2.22-11.854 3.509-18.522 3.509-0.579 0-1.155-0.009-1.731-0.028l0.084 0.003c-0.233 0.005-0.509 0.006-0.786 0.006-13.826 0-26.358-5.541-35.495-14.522l0.007 0.006-36.275-36.564c-9.237-9.35-14.942-22.207-14.942-36.397 0-7.126 1.439-13.917 4.043-20.095l-0.128 0.341c2.695-6.333 6.42-11.732 11.019-16.244l0.007-0.007 238.25-239.265-238.25-238.54c-4.607-4.519-8.332-9.917-10.904-15.928l-0.123-0.323c-2.216-5.484-3.501-11.843-3.501-18.502 0-0.483 0.006-0.967 0.020-1.447l-0.002 0.071c0-0.079-0.001-0.172-0.001-0.266 0-7.227 1.439-14.118 4.047-20.401l-0.131 0.353c2.426-6.264 6.031-11.593 10.576-15.946l0.017-0.016 36.564-37.289z" />
|
||||
<glyph unicode="arrow_skip_end" glyph-name="arrow-skip-end" d="M229.76 99.83c4.702-4.248 10.107-7.843 15.997-10.569l0.397-0.164c5.507-2.395 11.921-3.787 18.662-3.787 0.426 0 0.852 0.006 1.275 0.017l-0.062-0.002c0.047 0 0.102 0 0.156 0 7.141 0 13.921 1.549 20.021 4.331l-0.302-0.123c6.217 2.8 11.572 6.251 16.33 10.37l-0.083-0.070 311.025 311.897c4.641 4.638 8.371 10.184 10.905 16.35l0.12 0.333c2.477 5.93 3.917 12.819 3.917 20.044 0 0.094 0 0.187-0.001 0.279v-0.015c0 0.078 0.001 0.17 0.001 0.262 0 7.177-1.44 14.017-4.046 20.248l0.129-0.346c-2.617 6.511-6.353 12.065-11.021 16.678l-0.005 0.005-311.751 310.591c-4.539 4.573-9.931 8.291-15.918 10.898l-0.331 0.129c-5.488 2.22-11.852 3.508-18.518 3.508-0.579 0-1.155-0.009-1.729-0.028l0.084 0.003c-0.233 0.005-0.509 0.006-0.786 0.006-13.822 0-26.352-5.539-35.489-14.52l0.007 0.006-36.267-36.558c-4.407-4.602-7.985-10.041-10.465-16.049l-0.126-0.345c-2.647-5.948-4.187-12.889-4.187-20.189 0-13.973 5.645-26.63 14.778-35.81l-0.003 0.003 238.203-239.217-238.203-238.492c-4.607-4.517-8.33-9.915-10.902-15.924l-0.123-0.323c-2.215-5.506-3.497-11.891-3.497-18.575 0-0.458 0.006-0.912 0.017-1.366l-0.002 0.067c0-0.079-0.001-0.172-0.001-0.266 0-7.226 1.439-14.116 4.047-20.397l-0.13 0.353c2.373-6.284 5.984-11.622 10.569-15.938l0.021-0.019 36.558-37.283zM730.244 99.83h87.040c16.023 0 29.013 12.99 29.013 29.013v0 638.299c0 16.023-12.99 29.013-29.013 29.013v0h-87.040c-16.023 0-29.013-12.99-29.013-29.013v0-638.299c0-16.023 12.99-29.013 29.013-29.013v0z" />
|
||||
<glyph unicode="arrow_skip_back" glyph-name="arrow-skip-back" d="M497.129 99.768c-4.641-4.289-10.005-7.889-15.872-10.582l-0.379-0.155c-5.848-2.66-12.683-4.209-19.878-4.209s-14.031 1.549-20.186 4.334l0.309-0.125c-6.287 2.892-11.694 6.487-16.451 10.788l0.056-0.051-311.959 312.104c-4.671 4.572-8.409 10.079-10.912 16.22l-0.116 0.322c-2.207 5.658-3.485 12.206-3.485 19.054 0 0.187 0.001 0.376 0.003 0.562v-0.028c0 0.078-0.001 0.17-0.001 0.262 0 7.178 1.44 14.021 4.046 20.253l-0.129-0.346c2.4 6.77 6.009 12.577 10.613 17.434l-0.020-0.022 312.685 310.653c9.35 9.237 22.207 14.942 36.397 14.942 7.126 0 13.917-1.439 20.095-4.043l-0.341 0.128c6.333-2.695 11.732-6.42 16.244-11.019l0.007-0.007 35.694-36.564c9.237-9.35 14.942-22.207 14.942-36.397 0-7.126-1.439-13.917-4.043-20.095l0.128 0.341c-2.695-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-237.234-239.265 237.234-238.54c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.323c2.479-5.769 3.919-12.482 3.919-19.533 0-0.121-0.001-0.244-0.002-0.364v0.018c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.401l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-35.694-37.289zM873.512 99.768c-4.704-4.25-10.109-7.845-15.999-10.572l-0.397-0.165c-5.77-2.659-12.518-4.208-19.629-4.208-0.087 0-0.176 0-0.263 0.001h0.014c-0.047 0-0.102 0-0.156 0-7.143 0-13.923 1.549-20.025 4.331l0.302-0.123c-6.224 2.933-11.578 6.522-16.309 10.788l0.059-0.051-311.089 312.104c-4.671 4.572-8.409 10.079-10.912 16.22l-0.116 0.322c-2.479 5.965-3.918 12.896-3.918 20.161 0 0.053 0 0.108 0 0.162v-0.008c0 0.078-0.001 0.17-0.001 0.262 0 7.178 1.44 14.021 4.046 20.253l-0.129-0.346c2.617 6.512 6.355 12.067 11.023 16.681l0.005 0.005 311.815 310.653c4.54 4.573 9.933 8.291 15.92 10.9l0.331 0.129c5.488 2.22 11.854 3.509 18.522 3.509 0.579 0 1.155-0.009 1.731-0.028l-0.084 0.003c0.233 0.005 0.509 0.006 0.786 0.006 13.826 0 26.358-5.541 35.495-14.522l-0.007 0.006 36.275-36.564c9.237-9.35 14.942-22.207 14.942-36.397 0-7.126-1.439-13.917-4.043-20.095l0.128 0.341c-2.695-6.333-6.42-11.732-11.019-16.244l-0.007-0.007-238.25-239.265 238.25-238.54c4.607-4.519 8.332-9.917 10.904-15.928l0.123-0.323c2.216-5.484 3.501-11.843 3.501-18.502 0-0.483-0.006-0.967-0.020-1.447l0.002 0.071c0-0.079 0.001-0.172 0.001-0.266 0-7.227-1.439-14.118-4.047-20.401l0.131 0.353c-2.552-6.29-6.299-11.62-10.995-15.931l-0.031-0.028-36.13-37.289z" />
|
||||
<glyph unicode="arrow_right" glyph-name="arrow-right" d="M963.754 468.992l-388.949 388.608c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-62.463-62.121c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l230.569-230.399h-621.909c0 0 0 0-0.001 0-14.644 0-26.527-11.823-26.623-26.444v-95.583c0-14.704 11.92-26.624 26.624-26.624h621.909l-230.4-230.4c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l62.292-61.951c5.491-5.46 13.061-8.836 21.419-8.836s15.927 3.375 21.42 8.837l388.948 388.607c5.38 5.401 8.706 12.851 8.706 21.077s-3.326 15.677-8.707 21.078z" />
|
||||
<glyph unicode="arrow_left" glyph-name="arrow-left" d="M59.905 468.992l388.949 388.608c5.491 5.46 13.061 8.836 21.419 8.836s15.927-3.375 21.42-8.837l62.463-62.463c5.46-5.491 8.836-13.061 8.836-21.419s-3.375-15.927-8.837-21.42l-229.887-230.057h621.227c0.203 0.006 0.443 0.009 0.683 0.009 14.647 0 26.532-11.828 26.623-26.453v-95.582c0-14.704-11.92-26.624-26.624-26.624h-621.909l230.4-230.4c5.46-5.491 8.836-13.061 8.836-21.419s-3.375-15.927-8.837-21.42l-62.975-61.951c-5.491-5.46-13.061-8.836-21.419-8.836s-15.927 3.375-21.42 8.837l-388.948 388.607c-5.38 5.401-8.706 12.851-8.706 21.077s3.326 15.677 8.707 21.078z" />
|
||||
<glyph unicode="arrow_down" glyph-name="arrow-down" d="M532.993-3.924l388.949 388.949c5.46 5.491 8.836 13.061 8.836 21.419s-3.375 15.927-8.837 21.42l-62.463 62.463c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-230.399-230.228v621.568c0.001 0.101 0.002 0.221 0.002 0.341 0 14.704-11.92 26.624-26.624 26.624-0.001 0-0.002 0-0.002 0h-95.403c-14.704 0-26.624-11.92-26.624-26.624v-621.909l-230.4 230.229c-5.491 5.46-13.061 8.836-21.419 8.836s-15.927-3.375-21.42-8.837l-62.292-62.463c-5.46-5.491-8.836-13.061-8.836-21.419s3.375-15.927 8.837-21.42l388.948-388.948c5.401-5.38 12.851-8.706 21.077-8.706s15.677 3.326 21.078 8.707z" />
|
||||
<glyph unicode="archive" glyph-name="archive" d="M96 640h832c17.673 0 32-14.327 32-32v-544c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v544c0 17.673 14.327 32 32 32zM96 896h832c35.346 0 64-28.654 64-64v-96c0-17.673-14.327-32-32-32h-896c-17.673 0-32 14.327-32 32v96c0 35.346 28.654 64 64 64zM384 512c-35.346 0-64-28.654-64-64s28.654-64 64-64h256c35.346 0 64 28.654 64 64s-28.654 64-64 64h-256z" />
|
||||
<glyph unicode="animation_video" glyph-name="animation-video" d="M952.182 832l0.031-0.002c39.701-0.323 71.788-33.5 71.788-74.38 0 0 0 0 0-0.002v-619.234c0-0.002 0-0.003 0-0.003 0-40.88-32.087-74.058-71.818-74.38h-879.809c-39.971 0-72.373 33.303-72.373 74.383v619.234c0 41.082 32.403 74.383 72.373 74.383h879.809zM128 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM352 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM576 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM800 736c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM128 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM352 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM576 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96zM800 288c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h96c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32h-96z" />
|
||||
<glyph unicode="align_y_top" glyph-name="align-y-top" d="M64 832h896c35.346 0 64-28.654 64-64s-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64s28.654 64 64 64zM320 576h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="align_y_center" glyph-name="align-y-center" d="M256 512v128c0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64v-128h192c35.346 0 64-28.654 64-64s-28.654-64-64-64h-192v-128c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v128h-192c-35.346 0-64 28.654-64 64s28.654 64 64 64h192z" />
|
||||
<glyph unicode="align_y_bottom" glyph-name="align-y-bottom" d="M64 192h896c35.346 0 64-28.654 64-64s-28.654-64-64-64h-896c-35.346 0-64 28.654-64 64s28.654 64 64 64zM320 832h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="align_x_right" glyph-name="align-x-right" d="M832 960c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64s-64 28.654-64 64v896c0 35.346 28.654 64 64 64zM192 704h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="align_x_left" glyph-name="align-x-left" d="M448 704h384c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-384c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64zM192 960c35.346 0 64-28.654 64-64v-896c0-35.346-28.654-64-64-64s-64 28.654-64 64v896c0 35.346 28.654 64 64 64z" />
|
||||
<glyph unicode="align_x_center" glyph-name="align-x-center" d="M576 704h128c35.346 0 64-28.654 64-64v-384c0-35.346-28.654-64-64-64h-128v-192c0-35.346-28.654-64-64-64s-64 28.654-64 64v192h-128c-35.346 0-64 28.654-64 64v384c0 35.346 28.654 64 64 64h128v192c0 35.346 28.654 64 64 64s64-28.654 64-64v-192z" />
|
||||
<glyph unicode="align_right" glyph-name="align-right" d="M913.259 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM913.259 640.043h-586.432c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755zM913.108 127.979h-714.859c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h714.859c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755zM957.163 340.181c0 24.165-19.59 43.755-43.755 43.755h-498.923c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755h498.773c24.165 0 43.755 19.59 43.755 43.755v0 40.32z" />
|
||||
<glyph unicode="align_left" glyph-name="align-left" d="M913.333 896h-802.667c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755zM110.667 512.213h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-586.432c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-24.165 19.59-43.755 43.755-43.755zM825.675 127.979h-715.008c-24.165 0-43.755-19.59-43.755-43.755v-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0h715.008c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755zM110.667 255.957h498.923c24.165 0 43.755 19.59 43.755 43.755v0 40.32c0 24.165-19.59 43.755-43.755 43.755h-498.923c0 0 0 0 0 0-24.113 0-43.67-19.505-43.755-43.597v-40.327c0-24.165 19.59-43.755 43.755-43.755z" />
|
||||
<glyph unicode="align_justify" glyph-name="align-justify" d="M915.2 896h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v40.619c0 24.743-20.057 44.8-44.8 44.8zM915.2 639.744h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v41.365c0 24.743-20.057 44.8-44.8 44.8zM915.2 384.235h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-40.619c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v41.365c0 24.743-20.057 44.8-44.8 44.8zM915.2 128.725h-806.4c-24.743 0-44.8-20.057-44.8-44.8v-39.125c0-24.743 20.057-44.8 44.8-44.8h806.4c24.743 0 44.8 20.057 44.8 44.8v39.872c0 24.743-20.057 44.8-44.8 44.8z" />
|
||||
<glyph unicode="align_center" glyph-name="align-center" d="M110.667 0h802.667c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-802.667c0 0 0 0 0 0-24.113 0-43.67-19.505-43.755-43.597v-40.327c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0 0 0 0 0 0zM175.029 340.181v0-40.32c0-24.165 19.59-43.755 43.755-43.755h586.432c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-586.432c-24.165 0-43.755-19.59-43.755-43.755zM154.72 768.021h714.859c24.165 0 43.755 19.59 43.755 43.755v40.469c0 24.165-19.59 43.755-43.755 43.755h-714.859c-0.045 0-0.097 0-0.149 0-24.165 0-43.755-19.59-43.755-43.755 0 0 0 0 0 0v0-40.32c0-0.045 0-0.097 0-0.149 0-24.165 19.59-43.755 43.755-43.755 0.052 0 0.105 0 0.158 0zM218.784 555.819c0-24.165 19.59-43.755 43.755-43.755h498.923c24.165 0 43.755 19.59 43.755 43.755v40.32c0 24.165-19.59 43.755-43.755 43.755h-498.773c-24.165 0-43.755-19.59-43.755-43.755v0-40.32z" />
|
||||
<glyph unicode="add_playlist" glyph-name="add-playlist" horiz-adv-x="964" d="M783.059 329.412c33.267 0 60.235-26.968 60.235-60.235v-60.235h60.235c33.267 0 60.235-26.968 60.235-60.235s-26.968-60.235-60.235-60.235h-60.235v-60.235c0-33.267-26.968-60.235-60.235-60.235s-60.235 26.968-60.235 60.235v60.235h-60.235c-33.267 0-60.235 26.968-60.235 60.235s26.968 60.235 60.235 60.235h60.235v60.235c0 33.267 26.968 60.235 60.235 60.235zM481.882 269.176c33.25 0 60.235-26.925 60.235-60.235s-26.985-60.235-60.235-60.235h-421.647c-33.25 0-60.235 26.925-60.235 60.235s26.985 60.235 60.235 60.235h421.647zM722.824 510.118c33.31 0 60.235-26.985 60.235-60.235s-26.925-60.235-60.235-60.235h-662.588c-33.25 0-60.235 26.985-60.235 60.235s26.985 60.235 60.235 60.235h662.588zM722.824 751.059c33.31 0 60.235-26.985 60.235-60.235s-26.925-60.235-60.235-60.235h-662.588c-33.25 0-60.235 26.985-60.235 60.235s26.985 60.235 60.235 60.235h662.588z" />
|
||||
<glyph unicode="academy" glyph-name="academy" d="M487.166 82.894c-66.404 0-348.164 62.974-348.164 189.082v141.312l337.148-136.549c3.235-1.348 6.993-2.133 10.938-2.133s7.704 0.783 11.127 2.201l333.233 134.943 3.724-1.843v-138.239c0-126.104-281.604-189.082-348.010-189.082l0.004 0.308zM1023.687 64l-65.319 78.49-65.474-78.49v363.569c0 3.379 0 16.742 0 16.742l-183.391 92.159 314.497-69.12-0.313-403.351zM949.057 520.96l-358.248 69.58c-4.658 0.072-7.647-2.885-7.647-6.532 0-2.16 1.045-4.075 2.665-5.281l193.028-126.732-291.689-118.119-439.014 177.883c-39.341 15.941-58.311 60.755-42.371 100.097 7.812 19.28 23.105 34.569 42.386 42.377l438.999 177.767 461.854-187.022c34.251-13.869 50.773-52.879 36.904-87.129-6.793-16.777-20.094-30.085-36.867-36.889z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 342 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 1H34C38.9706 1 43 5.02944 43 10V34C43 38.9706 38.9706 43 34 43H10C5.02944 43 1 38.9706 1 34V10C1 5.02944 5.02944 1 10 1Z" stroke="#666666" stroke-width="2"/>
|
||||
<path d="M31.8438 19.1562L29.1094 16.5312L32.5 13.1406L30.8594 11.5L27.4688 14.8906L24.8438 12.1562V19.1562H31.8438ZM14.8906 27.4688L12.1562 24.8438H19.1562V31.8438L16.5312 29.1094L13.1406 32.5L11.5 30.8594L14.8906 27.4688ZM27.4688 29.1094L24.8438 31.8438V24.8438H31.8438L29.1094 27.4688L32.5 30.8594L30.8594 32.5L27.4688 29.1094ZM16.5312 14.8906L19.1562 12.1562V19.1562H12.1562L14.8906 16.5312L11.5 13.1406L13.1406 11.5L16.5312 14.8906Z" fill="#666666"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 730 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="45" height="44" viewBox="0 0 45 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.5 1H34.5C39.4706 1 43.5 5.02944 43.5 10V34C43.5 38.9706 39.4706 43 34.5 43H10.5C5.52944 43 1.5 38.9706 1.5 34V10C1.5 5.02944 5.52944 1 10.5 1Z" stroke="#666666" stroke-width="2"/>
|
||||
<path d="M14.2969 11.5H30.7031C31.2865 11.5 31.7969 11.7552 32.2344 12.2656C32.7448 12.7031 33 13.2135 33 13.7969V30.2031C33 30.7865 32.7448 31.3333 32.2344 31.8438C31.7969 32.2812 31.2865 32.5 30.7031 32.5H14.2969C13.6406 32.5 13.0938 32.2812 12.6562 31.8438C12.2188 31.3333 12 30.7865 12 30.2031V13.7969C12 13.2135 12.2188 12.7031 12.6562 12.2656C13.0938 11.7552 13.6406 11.5 14.2969 11.5ZM20.8594 19.7031V23.2031H24.1406V19.7031H27.2031L22.5 15L17.7969 19.7031H20.8594ZM30.7031 30.2031V26.7031H26.5469C26.1094 27.3594 25.526 27.9062 24.7969 28.3438C24.1406 28.7812 23.375 29 22.5 29C21.625 29 20.8229 28.7812 20.0938 28.3438C19.4375 27.9062 18.8906 27.3594 18.4531 26.7031H14.2969V30.2031H30.7031ZM24.7969 24.2969H30.7031V13.7969H14.2969V24.2969H20.2031C20.2031 24.9531 20.4219 25.5365 20.8594 26.0469C21.2969 26.4844 21.8438 26.7031 22.5 26.7031C23.1562 26.7031 23.7031 26.4844 24.1406 26.0469C24.5781 25.5365 24.7969 24.9531 24.7969 24.2969Z" fill="#666666"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 1H34C38.9706 1 43 5.02944 43 10V34C43 38.9706 38.9706 43 34 43H10C5.02944 43 1 38.9706 1 34V10C1 5.02944 5.02944 1 10 1Z" stroke="#666666" stroke-width="2"/>
|
||||
<path d="M22.0547 15H31.3516C32.0078 15 32.5547 15.2552 32.9922 15.7656C33.4297 16.2031 33.6484 16.7135 33.6484 17.2969V29C33.6484 29.6562 33.4297 30.2031 32.9922 30.6406C32.5547 31.0781 32.0078 31.2969 31.3516 31.2969H12.6484C12.0651 31.2969 11.5182 31.0781 11.0078 30.6406C10.5703 30.2031 10.3516 29.6562 10.3516 29V15C10.3516 14.3438 10.5703 13.7969 11.0078 13.3594C11.5182 12.9219 12.0651 12.7031 12.6484 12.7031H19.6484L22.0547 15ZM12.6484 17.2969V29H31.3516V17.2969H12.6484Z" fill="#666666"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 773 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.6 KiB |