@ckeditor/ckeditor5-table 0.0.0-nightly-20250305.0 → 0.0.0-nightly-next-20250305.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE.md +1 -1
  2. package/build/table.js +1 -1
  3. package/ckeditor5-metadata.json +6 -6
  4. package/dist/index-editor.css +81 -16
  5. package/dist/index.css +108 -23
  6. package/dist/index.css.map +1 -1
  7. package/dist/index.js +74 -91
  8. package/dist/index.js.map +1 -1
  9. package/package.json +10 -9
  10. package/src/commands/insertcolumncommand.js +4 -0
  11. package/src/commands/insertrowcommand.js +4 -0
  12. package/src/commands/mergecellcommand.js +8 -0
  13. package/src/commands/splitcellcommand.js +4 -0
  14. package/src/tablecaption/tablecaptionediting.js +7 -0
  15. package/src/tablecaption/tablecaptionui.js +3 -2
  16. package/src/tablecellproperties/commands/tablecellpropertycommand.js +8 -0
  17. package/src/tablecellproperties/tablecellpropertiesui.js +25 -3
  18. package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +2 -1
  19. package/src/tablecellproperties/ui/tablecellpropertiesview.js +82 -13
  20. package/src/tablecolumnresize/constants.d.ts +4 -0
  21. package/src/tablecolumnresize/constants.js +4 -0
  22. package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +8 -0
  23. package/src/tablecolumnresize/tablecolumnresizeediting.js +48 -7
  24. package/src/tableediting.js +4 -0
  25. package/src/tablemouse/mouseeventsobserver.js +3 -6
  26. package/src/tableproperties/commands/tablepropertycommand.js +8 -0
  27. package/src/tableproperties/tablepropertiesui.d.ts +1 -1
  28. package/src/tableproperties/tablepropertiesui.js +25 -7
  29. package/src/tableproperties/ui/tablepropertiesview.d.ts +2 -1
  30. package/src/tableproperties/ui/tablepropertiesview.js +70 -9
  31. package/src/tableselection.js +19 -1
  32. package/src/tableui.js +7 -9
  33. package/src/tablewalker.js +99 -4
  34. package/src/ui/colorinputview.js +34 -0
  35. package/src/ui/inserttableview.js +12 -0
  36. package/src/utils/table-properties.js +1 -1
  37. package/theme/formrow.css +0 -10
  38. package/theme/tableform.css +6 -0
  39. package/src/ui/formrowview.d.ts +0 -61
  40. package/src/ui/formrowview.js +0 -57
  41. package/theme/form.css +0 -11
  42. package/theme/icons/table-cell-properties.svg +0 -1
  43. package/theme/icons/table-column.svg +0 -1
  44. package/theme/icons/table-merge-cell.svg +0 -1
  45. package/theme/icons/table-properties.svg +0 -1
  46. package/theme/icons/table-row.svg +0 -1
@@ -5,12 +5,13 @@
5
5
  /**
6
6
  * @module table/tableproperties/ui/tablepropertiesview
7
7
  */
8
- import { addListToDropdown, ButtonView, createLabeledDropdown, createLabeledInputText, FocusCycler, FormHeaderView, LabeledFieldView, LabelView, submitHandler, ToolbarView, View, ViewCollection } from 'ckeditor5/src/ui.js';
8
+ import { addListToDropdown, ButtonView, createLabeledDropdown, createLabeledInputText, FocusCycler, FormRowView, FormHeaderView, LabeledFieldView, LabelView, submitHandler, ToolbarView, View, ViewCollection } from 'ckeditor5/src/ui.js';
9
9
  import { FocusTracker, KeystrokeHandler } from 'ckeditor5/src/utils.js';
10
- import { icons } from 'ckeditor5/src/core.js';
10
+ import { IconCancel, IconCheck, IconObjectCenter, IconObjectInlineLeft, IconObjectInlineRight } from 'ckeditor5/src/icons.js';
11
11
  import { fillToolbar, getBorderStyleDefinitions, getBorderStyleLabels, getLabeledColorInputCreator } from '../../utils/ui/table-properties.js';
12
- import FormRowView from '../../ui/formrowview.js';
13
- import '../../../theme/form.css';
12
+ // eslint-disable-next-line ckeditor5-rules/ckeditor-imports
13
+ import '@ckeditor/ckeditor5-ui/theme/components/form/form.css';
14
+ import '../../../theme/formrow.css';
14
15
  import '../../../theme/tableform.css';
15
16
  import '../../../theme/tableproperties.css';
16
17
  /**
@@ -18,6 +19,66 @@ import '../../../theme/tableproperties.css';
18
19
  * certain style aspects of a table, for instance, border, background color, alignment, etc..
19
20
  */
20
21
  export default class TablePropertiesView extends View {
22
+ /**
23
+ * Options passed to the view. See {@link #constructor} to learn more.
24
+ */
25
+ options;
26
+ /**
27
+ * Tracks information about the DOM focus in the form.
28
+ */
29
+ focusTracker;
30
+ /**
31
+ * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
32
+ */
33
+ keystrokes;
34
+ /**
35
+ * A collection of child views in the form.
36
+ */
37
+ children;
38
+ /**
39
+ * A dropdown that allows selecting the style of the table border.
40
+ */
41
+ borderStyleDropdown;
42
+ /**
43
+ * An input that allows specifying the width of the table border.
44
+ */
45
+ borderWidthInput;
46
+ /**
47
+ * An input that allows specifying the color of the table border.
48
+ */
49
+ borderColorInput;
50
+ /**
51
+ * An input that allows specifying the table background color.
52
+ */
53
+ backgroundInput;
54
+ /**
55
+ * An input that allows specifying the table width.
56
+ */
57
+ widthInput;
58
+ /**
59
+ * An input that allows specifying the table height.
60
+ */
61
+ heightInput;
62
+ /**
63
+ * A toolbar with buttons that allow changing the alignment of an entire table.
64
+ */
65
+ alignmentToolbar;
66
+ /**
67
+ * The "Save" button view.
68
+ */
69
+ saveButtonView;
70
+ /**
71
+ * The "Cancel" button view.
72
+ */
73
+ cancelButtonView;
74
+ /**
75
+ * A collection of views that can be focused in the form.
76
+ */
77
+ _focusables;
78
+ /**
79
+ * Helps cycling over {@link #_focusables} in the form.
80
+ */
81
+ _focusCycler;
21
82
  /**
22
83
  * @param locale The {@link module:core/editor/editor~Editor#locale} instance.
23
84
  * @param options Additional configuration of the view.
@@ -383,9 +444,9 @@ export default class TablePropertiesView extends View {
383
444
  fillToolbar({
384
445
  view: this,
385
446
  icons: {
386
- left: icons.objectLeft,
387
- center: icons.objectCenter,
388
- right: icons.objectRight
447
+ left: IconObjectInlineLeft,
448
+ center: IconObjectCenter,
449
+ right: IconObjectInlineRight
389
450
  },
390
451
  toolbar: alignmentToolbar,
391
452
  labels: this._alignmentLabels,
@@ -417,7 +478,7 @@ export default class TablePropertiesView extends View {
417
478
  ];
418
479
  saveButtonView.set({
419
480
  label: t('Save'),
420
- icon: icons.check,
481
+ icon: IconCheck,
421
482
  class: 'ck-button-save',
422
483
  type: 'submit',
423
484
  withText: true
@@ -427,7 +488,7 @@ export default class TablePropertiesView extends View {
427
488
  });
428
489
  cancelButtonView.set({
429
490
  label: t('Cancel'),
430
- icon: icons.cancel,
491
+ icon: IconCancel,
431
492
  class: 'ck-button-cancel',
432
493
  withText: true
433
494
  });
@@ -275,7 +275,25 @@ export default class TableSelection extends Plugin {
275
275
  const startRow = Math.min(startLocation.row, endLocation.row);
276
276
  const endRow = Math.max(startLocation.row, endLocation.row);
277
277
  const startColumn = Math.min(startLocation.column, endLocation.column);
278
- const endColumn = Math.max(startLocation.column, endLocation.column);
278
+ // Adjust the selection to include the entire row if a cell with colspan is selected.
279
+ // This ensures that the selection covers the full width of the colspan cell.
280
+ //
281
+ // Example:
282
+ // +---+---+---+---+
283
+ // | A | B | C | D |
284
+ // +---+---+---+---+
285
+ // | E |
286
+ // +---+---+---+---+
287
+ //
288
+ // If the selection starts at `B` and ends at `E`, the entire first row should be selected.
289
+ //
290
+ // In other words, the selection will represent the following cells:
291
+ // * Without this adjustment, only `B`, `A` and `E` would be selected.
292
+ // * With this adjustment, `A`, `B`, `C`, `D`, and `E` are selected.
293
+ //
294
+ // See: https://github.com/ckeditor/ckeditor5/issues/17538
295
+ const endColumnExtraColspan = (parseInt(targetCell.getAttribute('colspan') || '1') - 1);
296
+ const endColumn = Math.max(startLocation.column, endLocation.column + endColumnExtraColspan);
279
297
  // 2-dimensional array of the selected cells to ease flipping the order of cells for backward selections.
280
298
  const selectionMap = new Array(endRow - startRow + 1).fill(null).map(() => []);
281
299
  const walkerOptions = {
package/src/tableui.js CHANGED
@@ -5,13 +5,11 @@
5
5
  /**
6
6
  * @module table/tableui
7
7
  */
8
- import { icons, Plugin } from 'ckeditor5/src/core.js';
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { IconTable, IconTableColumn, IconTableRow, IconTableMergeCell } from 'ckeditor5/src/icons.js';
9
10
  import { addListToDropdown, createDropdown, ViewModel, SplitButtonView, SwitchButtonView, MenuBarMenuView } from 'ckeditor5/src/ui.js';
10
11
  import { Collection } from 'ckeditor5/src/utils.js';
11
12
  import InsertTableView from './ui/inserttableview.js';
12
- import tableColumnIcon from './../theme/icons/table-column.svg';
13
- import tableRowIcon from './../theme/icons/table-row.svg';
14
- import tableMergeCellIcon from './../theme/icons/table-merge-cell.svg';
15
13
  /**
16
14
  * The table UI plugin. It introduces:
17
15
  *
@@ -50,7 +48,7 @@ export default class TableUI extends Plugin {
50
48
  dropdownView.bind('isEnabled').to(command);
51
49
  // Decorate dropdown's button.
52
50
  dropdownView.buttonView.set({
53
- icon: icons.table,
51
+ icon: IconTable,
54
52
  label: t('Insert table'),
55
53
  tooltip: true
56
54
  });
@@ -86,7 +84,7 @@ export default class TableUI extends Plugin {
86
84
  });
87
85
  menuView.buttonView.set({
88
86
  label: t('Table'),
89
- icon: icons.table
87
+ icon: IconTable
90
88
  });
91
89
  menuView.panelView.children.add(insertTableView);
92
90
  menuView.bind('isEnabled').to(command);
@@ -132,7 +130,7 @@ export default class TableUI extends Plugin {
132
130
  }
133
131
  }
134
132
  ];
135
- return this._prepareDropdown(t('Column'), tableColumnIcon, options, locale);
133
+ return this._prepareDropdown(t('Column'), IconTableColumn, options, locale);
136
134
  });
137
135
  editor.ui.componentFactory.add('tableRow', locale => {
138
136
  const options = [
@@ -174,7 +172,7 @@ export default class TableUI extends Plugin {
174
172
  }
175
173
  }
176
174
  ];
177
- return this._prepareDropdown(t('Row'), tableRowIcon, options, locale);
175
+ return this._prepareDropdown(t('Row'), IconTableRow, options, locale);
178
176
  });
179
177
  editor.ui.componentFactory.add('mergeTableCells', locale => {
180
178
  const options = [
@@ -222,7 +220,7 @@ export default class TableUI extends Plugin {
222
220
  }
223
221
  }
224
222
  ];
225
- return this._prepareMergeSplitButtonDropdown(t('Merge cells'), tableMergeCellIcon, options, locale);
223
+ return this._prepareMergeSplitButtonDropdown(t('Merge cells'), IconTableMergeCell, options, locale);
226
224
  });
227
225
  }
228
226
  /**
@@ -7,6 +7,73 @@
7
7
  * {@link module:table/tablewalker~TableSlot} with proper table cell attributes.
8
8
  */
9
9
  export default class TableWalker {
10
+ /**
11
+ * The walker's table element.
12
+ *
13
+ * @internal
14
+ */
15
+ _table;
16
+ /**
17
+ * A row index from which this iterator will start.
18
+ */
19
+ _startRow;
20
+ /**
21
+ * A row index at which this iterator will end.
22
+ */
23
+ _endRow;
24
+ /**
25
+ * If set, the table walker will only output cells from a given column and following ones or cells that overlap them.
26
+ */
27
+ _startColumn;
28
+ /**
29
+ * If set, the table walker will only output cells up to a given column.
30
+ */
31
+ _endColumn;
32
+ /**
33
+ * Enables output of spanned cells that are normally not yielded.
34
+ */
35
+ _includeAllSlots;
36
+ /**
37
+ * Row indexes to skip from the iteration.
38
+ */
39
+ _skipRows;
40
+ /**
41
+ * The current row index.
42
+ *
43
+ * @internal
44
+ */
45
+ _row;
46
+ /**
47
+ * The index of the current row element in the table.
48
+ *
49
+ * @internal
50
+ */
51
+ _rowIndex;
52
+ /**
53
+ * The current column index.
54
+ *
55
+ * @internal
56
+ */
57
+ _column;
58
+ /**
59
+ * The cell index in a parent row. For spanned cells when {@link #_includeAllSlots} is set to `true`,
60
+ * this represents the index of the next table cell.
61
+ *
62
+ * @internal
63
+ */
64
+ _cellIndex;
65
+ /**
66
+ * Holds a map of spanned cells in a table.
67
+ */
68
+ _spannedCells;
69
+ /**
70
+ * Index of the next column where a cell is anchored.
71
+ */
72
+ _nextCellAtColumn;
73
+ /**
74
+ * Indicates whether the iterator jumped to (or close to) the start row, ignoring rows that don't need to be traversed.
75
+ */
76
+ _jumpedToStartRow = false;
10
77
  /**
11
78
  * Creates an instance of the table walker.
12
79
  *
@@ -84,10 +151,6 @@ export default class TableWalker {
84
151
  * @param options.includeAllSlots Also return values for spanned cells. Default value is "false".
85
152
  */
86
153
  constructor(table, options = {}) {
87
- /**
88
- * Indicates whether the iterator jumped to (or close to) the start row, ignoring rows that don't need to be traversed.
89
- */
90
- this._jumpedToStartRow = false;
91
154
  this._table = table;
92
155
  this._startRow = options.row !== undefined ? options.row : options.startRow || 0;
93
156
  this._endRow = options.row !== undefined ? options.row : options.endRow;
@@ -324,6 +387,38 @@ export default class TableWalker {
324
387
  * An object returned by {@link module:table/tablewalker~TableWalker} when traversing table cells.
325
388
  */
326
389
  class TableSlot {
390
+ /**
391
+ * The current table cell.
392
+ */
393
+ cell;
394
+ /**
395
+ * The row index of a table slot.
396
+ */
397
+ row;
398
+ /**
399
+ * The column index of a table slot.
400
+ */
401
+ column;
402
+ /**
403
+ * The row index of a cell anchor slot.
404
+ */
405
+ cellAnchorRow;
406
+ /**
407
+ * The column index of a cell anchor slot.
408
+ */
409
+ cellAnchorColumn;
410
+ /**
411
+ * The index of the current cell in the parent row.
412
+ */
413
+ _cellIndex;
414
+ /**
415
+ * The index of the current row element in the table.
416
+ */
417
+ _rowIndex;
418
+ /**
419
+ * The table element.
420
+ */
421
+ _table;
327
422
  /**
328
423
  * Creates an instance of the table walker value.
329
424
  *
@@ -15,6 +15,40 @@ import '../../theme/colorinput.css';
15
15
  * @internal
16
16
  */
17
17
  export default class ColorInputView extends View {
18
+ /**
19
+ * A cached reference to the options passed to the constructor.
20
+ */
21
+ options;
22
+ /**
23
+ * Tracks information about the DOM focus in the view.
24
+ */
25
+ focusTracker;
26
+ /**
27
+ * Helps cycling over focusable children in the input view.
28
+ */
29
+ focusCycler;
30
+ /**
31
+ * A collection of views that can be focused in the view.
32
+ */
33
+ _focusables;
34
+ /**
35
+ * An instance of the dropdown allowing to select a color from a grid.
36
+ */
37
+ dropdownView;
38
+ /**
39
+ * An instance of the input allowing the user to type a color value.
40
+ */
41
+ inputView;
42
+ /**
43
+ * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
44
+ */
45
+ keystrokes;
46
+ /**
47
+ * The flag that indicates whether the user is still typing.
48
+ * If set to true, it means that the text input field ({@link #inputView}) still has the focus.
49
+ * So, we should interrupt the user by replacing the input's value.
50
+ */
51
+ _stillTyping;
18
52
  /**
19
53
  * Creates an instance of the color input view.
20
54
  *
@@ -14,6 +14,18 @@ import './../../theme/inserttable.css';
14
14
  * It renders a 10x10 grid to choose the inserted table size.
15
15
  */
16
16
  export default class InsertTableView extends View {
17
+ /**
18
+ * A collection of table size box items.
19
+ */
20
+ items;
21
+ /**
22
+ * Listen to `keydown` events fired in this view's main element.
23
+ */
24
+ keystrokes;
25
+ /**
26
+ * Tracks information about the DOM focus in the grid.
27
+ */
28
+ focusTracker;
17
29
  /**
18
30
  * @inheritDoc
19
31
  */
@@ -2,7 +2,7 @@
2
2
  * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
3
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
4
  */
5
- import { isObject } from 'lodash-es';
5
+ import { isObject } from 'es-toolkit/compat';
6
6
  /**
7
7
  * Returns a string if all four values of box sides are equal.
8
8
  *
package/theme/formrow.css CHANGED
@@ -4,16 +4,6 @@
4
4
  */
5
5
 
6
6
  .ck.ck-form__row {
7
- display: flex;
8
- flex-direction: row;
9
- flex-wrap: nowrap;
10
- justify-content: space-between;
11
-
12
- /* Ignore labels that work as fieldset legends */
13
- & > *:not(.ck-label) {
14
- flex-grow: 1;
15
- }
16
-
17
7
  &.ck-table-form__action-row {
18
8
  & .ck-button-save,
19
9
  & .ck-button-cancel {
@@ -31,6 +31,12 @@
31
31
  flex-grow: 0;
32
32
  }
33
33
  }
34
+
35
+ /* Ignore labels that work as fieldset legends */
36
+ /* Fallback for table dimension operator */
37
+ & > *:not(.ck-label, .ck-table-form__dimension-operator) {
38
+ flex-grow: 1;
39
+ }
34
40
  }
35
41
 
36
42
  & .ck.ck-labeled-field-view {
@@ -1,61 +0,0 @@
1
- /**
2
- * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
- /**
6
- * @module table/ui/formrowview
7
- */
8
- import { View, type LabelView, type ViewCollection } from 'ckeditor5/src/ui.js';
9
- import type { Locale } from 'ckeditor5/src/utils.js';
10
- import '../../theme/formrow.css';
11
- /**
12
- * The class representing a single row in a complex form,
13
- * used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}.
14
- *
15
- * **Note**: For now this class is private. When more use cases arrive (beyond ckeditor5-table),
16
- * it will become a component in ckeditor5-ui.
17
- *
18
- * @internal
19
- */
20
- export default class FormRowView extends View {
21
- /**
22
- * An additional CSS class added to the {@link #element}.
23
- *
24
- * @observable
25
- */
26
- class: string | null;
27
- /**
28
- * A collection of row items (buttons, dropdowns, etc.).
29
- */
30
- readonly children: ViewCollection;
31
- /**
32
- * The role property reflected by the `role` DOM attribute of the {@link #element}.
33
- *
34
- * **Note**: Used only when a `labelView` is passed to constructor `options`.
35
- *
36
- * @observable
37
- * @internal
38
- */
39
- _role: string | null;
40
- /**
41
- * The ARIA property reflected by the `aria-labelledby` DOM attribute of the {@link #element}.
42
- *
43
- * **Note**: Used only when a `labelView` is passed to constructor `options`.
44
- *
45
- * @observable
46
- * @internal
47
- */
48
- _ariaLabelledBy: string | null;
49
- /**
50
- * Creates an instance of the form row class.
51
- *
52
- * @param locale The locale instance.
53
- * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`
54
- * DOM attributes and gets described by the label.
55
- */
56
- constructor(locale: Locale, options?: {
57
- children?: Array<View>;
58
- class?: string;
59
- labelView?: LabelView;
60
- });
61
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
- /**
6
- * @module table/ui/formrowview
7
- */
8
- import { View } from 'ckeditor5/src/ui.js';
9
- import '../../theme/formrow.css';
10
- /**
11
- * The class representing a single row in a complex form,
12
- * used by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView}.
13
- *
14
- * **Note**: For now this class is private. When more use cases arrive (beyond ckeditor5-table),
15
- * it will become a component in ckeditor5-ui.
16
- *
17
- * @internal
18
- */
19
- export default class FormRowView extends View {
20
- /**
21
- * Creates an instance of the form row class.
22
- *
23
- * @param locale The locale instance.
24
- * @param options.labelView When passed, the row gets the `group` and `aria-labelledby`
25
- * DOM attributes and gets described by the label.
26
- */
27
- constructor(locale, options = {}) {
28
- super(locale);
29
- const bind = this.bindTemplate;
30
- this.set('class', options.class || null);
31
- this.children = this.createCollection();
32
- if (options.children) {
33
- options.children.forEach(child => this.children.add(child));
34
- }
35
- this.set('_role', null);
36
- this.set('_ariaLabelledBy', null);
37
- if (options.labelView) {
38
- this.set({
39
- _role: 'group',
40
- _ariaLabelledBy: options.labelView.id
41
- });
42
- }
43
- this.setTemplate({
44
- tag: 'div',
45
- attributes: {
46
- class: [
47
- 'ck',
48
- 'ck-form__row',
49
- bind.to('class')
50
- ],
51
- role: bind.to('_role'),
52
- 'aria-labelledby': bind.to('_ariaLabelledBy')
53
- },
54
- children: this.children
55
- });
56
- }
57
- }
package/theme/form.css DELETED
@@ -1,11 +0,0 @@
1
- /*
2
- * Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
4
- */
5
-
6
- /*
7
- * Note: This file should contain the wireframe styles only. But since there are no such styles,
8
- * it acts as a message to the builder telling that it should look for the corresponding styles
9
- * **in the theme** when compiling the editor.
10
- */
11
-
@@ -1 +0,0 @@
1
- <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5h3.105zM2 12h5V8H2v4zm10-4H8v4h4V8zM2 2v5h5V2H2zm0 16h5v-5H2v5zM13 7h5V2h-5v5zM8 2v5h4V2H8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM13 6a1 1 0 0 1 1 1v3.172a2.047 2.047 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.976 1.976 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm-1 2H8v4h4V8z"/></svg>
@@ -1 +0,0 @@
1
- <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M18 7v1H2V7h16zm0 5v1H2v-1h16z" opacity=".6"/><path d="M14 1v18a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1zm-2 1H8v4h4V2zm0 6H8v4h4V8zm0 6H8v4h4v-4z"/></svg>
@@ -1 +0,0 @@
1
- <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v7h-1V2zm6 5v1H2V7h16zM8 12v1H2v-1h6z" opacity=".6"/><path d="M7 7h12a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1zm1 2v9h10V9H8z"/></svg>
@@ -1 +0,0 @@
1
- <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z" opacity=".6"/><path d="m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z"/></svg>
@@ -1 +0,0 @@
1
- <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 1h15A1.5 1.5 0 0 1 19 2.5v15a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1zM2 2v16h16V2H2z" opacity=".6"/><path d="M7 2h1v16H7V2zm5 0h1v16h-1V2z" opacity=".6"/><path d="M1 6h18a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm1 2v4h4V8H2zm6 0v4h4V8H8zm6 0v4h4V8h-4z"/></svg>