slicejs-web-framework 2.3.5 → 2.4.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 (84) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +24 -5
  3. package/Slice/Components/Structural/Controller/Controller.js +156 -154
  4. package/Slice/Components/Structural/Debugger/Debugger.css +619 -619
  5. package/Slice/Components/Structural/Debugger/Debugger.html +72 -72
  6. package/Slice/Components/Structural/Logger/Log.js +10 -10
  7. package/Slice/Components/Structural/StylesManager/StylesManager.js +6 -3
  8. package/Slice/Slice.js +111 -51
  9. package/api/index.js +261 -233
  10. package/api/middleware/securityMiddleware.js +252 -252
  11. package/package.json +37 -37
  12. package/sliceConfig.schema.json +4 -0
  13. package/src/App/index.html +22 -22
  14. package/src/App/index.js +23 -23
  15. package/src/App/style.css +40 -40
  16. package/src/Components/AppComponents/HomePage/HomePage.css +204 -204
  17. package/src/Components/AppComponents/HomePage/HomePage.html +48 -48
  18. package/src/Components/AppComponents/HomePage/HomePage.js +195 -195
  19. package/src/Components/AppComponents/Playground/Playground.css +11 -11
  20. package/src/Components/AppComponents/Playground/Playground.js +111 -111
  21. package/src/Components/Service/FetchManager/FetchManager.js +133 -133
  22. package/src/Components/Service/IndexedDbManager/IndexedDbManager.js +141 -141
  23. package/src/Components/Service/LocalStorageManager/LocalStorageManager.js +45 -45
  24. package/src/Components/Visual/Button/Button.css +47 -47
  25. package/src/Components/Visual/Button/Button.html +5 -5
  26. package/src/Components/Visual/Button/Button.js +92 -92
  27. package/src/Components/Visual/Card/Card.css +68 -68
  28. package/src/Components/Visual/Card/Card.html +7 -7
  29. package/src/Components/Visual/Card/Card.js +107 -107
  30. package/src/Components/Visual/Checkbox/Checkbox.css +87 -87
  31. package/src/Components/Visual/Checkbox/Checkbox.html +8 -8
  32. package/src/Components/Visual/Checkbox/Checkbox.js +86 -86
  33. package/src/Components/Visual/CodeVisualizer/CodeVisualizer.css +129 -129
  34. package/src/Components/Visual/CodeVisualizer/CodeVisualizer.html +3 -3
  35. package/src/Components/Visual/CodeVisualizer/CodeVisualizer.js +259 -259
  36. package/src/Components/Visual/Details/Details.css +70 -70
  37. package/src/Components/Visual/Details/Details.html +9 -9
  38. package/src/Components/Visual/Details/Details.js +76 -76
  39. package/src/Components/Visual/DropDown/DropDown.css +60 -60
  40. package/src/Components/Visual/DropDown/DropDown.html +5 -5
  41. package/src/Components/Visual/DropDown/DropDown.js +63 -63
  42. package/src/Components/Visual/Grid/Grid.css +7 -7
  43. package/src/Components/Visual/Grid/Grid.html +1 -1
  44. package/src/Components/Visual/Grid/Grid.js +57 -57
  45. package/src/Components/Visual/Icon/Icon.css +510 -510
  46. package/src/Components/Visual/Icon/Icon.js +89 -89
  47. package/src/Components/Visual/Icon/slc.json +554 -554
  48. package/src/Components/Visual/Icon/slc.styl +507 -507
  49. package/src/Components/Visual/Icon/slc.svg +1485 -1485
  50. package/src/Components/Visual/Icon/slc.symbol.svg +1058 -1058
  51. package/src/Components/Visual/Input/Input.css +91 -91
  52. package/src/Components/Visual/Input/Input.html +4 -4
  53. package/src/Components/Visual/Input/Input.js +215 -215
  54. package/src/Components/Visual/Layout/Layout.js +49 -49
  55. package/src/Components/Visual/Loading/Loading.css +56 -56
  56. package/src/Components/Visual/Loading/Loading.html +83 -83
  57. package/src/Components/Visual/Loading/Loading.js +38 -38
  58. package/src/Components/Visual/MultiRoute/MultiRoute.js +93 -93
  59. package/src/Components/Visual/Navbar/Navbar.css +115 -115
  60. package/src/Components/Visual/Navbar/Navbar.html +44 -44
  61. package/src/Components/Visual/Navbar/Navbar.js +141 -141
  62. package/src/Components/Visual/NotFound/NotFound.css +116 -116
  63. package/src/Components/Visual/NotFound/NotFound.html +23 -23
  64. package/src/Components/Visual/NotFound/NotFound.js +16 -16
  65. package/src/Components/Visual/Route/Route.js +93 -93
  66. package/src/Components/Visual/Select/Select.css +84 -84
  67. package/src/Components/Visual/Select/Select.html +8 -8
  68. package/src/Components/Visual/Select/Select.js +195 -195
  69. package/src/Components/Visual/Switch/Switch.css +76 -76
  70. package/src/Components/Visual/Switch/Switch.html +8 -8
  71. package/src/Components/Visual/Switch/Switch.js +102 -102
  72. package/src/Components/Visual/TreeItem/TreeItem.css +36 -36
  73. package/src/Components/Visual/TreeItem/TreeItem.html +1 -1
  74. package/src/Components/Visual/TreeItem/TreeItem.js +126 -126
  75. package/src/Components/Visual/TreeView/TreeView.css +8 -8
  76. package/src/Components/Visual/TreeView/TreeView.html +1 -1
  77. package/src/Components/Visual/TreeView/TreeView.js +48 -48
  78. package/src/Styles/sliceStyles.css +34 -34
  79. package/src/Themes/Dark.css +42 -42
  80. package/src/Themes/Light.css +31 -31
  81. package/src/Themes/Slice.css +47 -47
  82. package/src/routes.js +15 -15
  83. package/src/sliceConfig.json +8 -3
  84. package/src/testing.js +887 -887
@@ -1,47 +1,47 @@
1
- .slice_button_container {
2
- padding: 10px;
3
- }
4
- .slice_button_value {
5
- user-select: none;
6
- cursor: pointer;
7
- }
8
- .slice_button {
9
- display: flex;
10
- align-items: center;
11
- justify-content: center;
12
- cursor: pointer;
13
- overflow: hidden;
14
- position: relative;
15
- max-width: fit-content;
16
- background-color: var(--primary-color);
17
- color: var(--primary-color-contrast);
18
- border-radius: var(--border-radius-slice);
19
- border: var(--slice-border) solid var(--primary-color);
20
- font-weight: 800;
21
- min-width: 100%;
22
- padding: 10px;
23
- -webkit-transition-duration: 0.4s; /* Safari */
24
- transition-duration: 0.4s;
25
- }
26
- .slice_button:after {
27
- content: "";
28
- width: 100%;
29
- height: 100%;
30
- border-radius: 100%;
31
- background: #ffffff50;
32
- position: absolute;
33
- display: block;
34
- opacity: 0;
35
- scale: 10;
36
- transition: all 1s;
37
- }
38
- .slice_button:active {
39
- transform: translateY(5px);
40
- }
41
- .slice_button:active:after {
42
- scale: 0;
43
- padding: 0;
44
- margin: 0;
45
- opacity: 1;
46
- transition: 0s;
47
- }
1
+ .slice_button_container {
2
+ padding: 10px;
3
+ }
4
+ .slice_button_value {
5
+ user-select: none;
6
+ cursor: pointer;
7
+ }
8
+ .slice_button {
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ cursor: pointer;
13
+ overflow: hidden;
14
+ position: relative;
15
+ max-width: fit-content;
16
+ background-color: var(--primary-color);
17
+ color: var(--primary-color-contrast);
18
+ border-radius: var(--border-radius-slice);
19
+ border: var(--slice-border) solid var(--primary-color);
20
+ font-weight: 800;
21
+ min-width: 100%;
22
+ padding: 10px;
23
+ -webkit-transition-duration: 0.4s; /* Safari */
24
+ transition-duration: 0.4s;
25
+ }
26
+ .slice_button:after {
27
+ content: "";
28
+ width: 100%;
29
+ height: 100%;
30
+ border-radius: 100%;
31
+ background: #ffffff50;
32
+ position: absolute;
33
+ display: block;
34
+ opacity: 0;
35
+ scale: 10;
36
+ transition: all 1s;
37
+ }
38
+ .slice_button:active {
39
+ transform: translateY(5px);
40
+ }
41
+ .slice_button:active:after {
42
+ scale: 0;
43
+ padding: 0;
44
+ margin: 0;
45
+ opacity: 1;
46
+ transition: 0s;
47
+ }
@@ -1,5 +1,5 @@
1
- <div class="slice_button_container">
2
- <button class="slice_button">
3
- <label class="slice_button_value"></label>
4
- </button>
5
- </div>
1
+ <div class="slice_button_container">
2
+ <button class="slice_button">
3
+ <label class="slice_button_value"></label>
4
+ </button>
5
+ </div>
@@ -1,93 +1,93 @@
1
- export default class Button extends HTMLElement {
2
-
3
- static props = {
4
- value: {
5
- type: 'string',
6
- default: 'Button',
7
- required: false
8
- },
9
- onClickCallback: {
10
- type: 'function',
11
- default: null
12
- },
13
- customColor: {
14
- type: 'object',
15
- default: null
16
- },
17
- icon: {
18
- type: 'object',
19
- default: null
20
- }
21
- };
22
-
23
- constructor(props) {
24
- super();
25
- slice.attachTemplate(this);
26
- this.$value = this.querySelector('.slice_button_value');
27
- this.$button = this.querySelector('.slice_button');
28
- this.$container = this.querySelector('.slice_button_container');
29
-
30
- if (props.onClickCallback) {
31
- this.onClickCallback = props.onClickCallback;
32
- this.$container.addEventListener('click', async () => await this.onClickCallback());
33
- }
34
-
35
- slice.controller.setComponentProps(this, props);
36
- }
37
-
38
- async init() {
39
- if (this.icon) {
40
- this.$icon = await slice.build('Icon', {
41
- name: this.icon,
42
- size: '20px',
43
- color: 'currentColor',
44
- });
45
- this.$button.insertBefore(this.$icon, this.$value);
46
- }
47
- }
48
-
49
- get icon() {
50
- return this._icon;
51
- }
52
-
53
- set icon(value) {
54
- this._icon = value;
55
- if (!this.$icon) return;
56
- this.$icon.name = value.name;
57
- this.$icon.iconStyle = value.iconStyle;
58
- }
59
-
60
- get value() {
61
- return this._value;
62
- }
63
-
64
- set value(value) {
65
- this._value = value;
66
- this.$value.textContent = value;
67
- }
68
-
69
- get customColor() {
70
- return this._customColor;
71
- }
72
-
73
- set customColor(value) {
74
- this._customColor = value;
75
- if (!value) return;
76
-
77
- // Mantener la misma API: { button: 'color', label: 'color' }
78
- if (value.button) {
79
- this.$button.style.backgroundColor = value.button;
80
- this.$button.style.borderColor = value.button;
81
- }
82
- if (value.label) {
83
- this.$button.style.color = value.label;
84
- this.$value.style.color = value.label;
85
- // También aplicar al icono si existe
86
- if (this.$icon) {
87
- this.$icon.style.color = value.label;
88
- }
89
- }
90
- }
91
- }
92
-
1
+ export default class Button extends HTMLElement {
2
+
3
+ static props = {
4
+ value: {
5
+ type: 'string',
6
+ default: 'Button',
7
+ required: false
8
+ },
9
+ onClickCallback: {
10
+ type: 'function',
11
+ default: null
12
+ },
13
+ customColor: {
14
+ type: 'object',
15
+ default: null
16
+ },
17
+ icon: {
18
+ type: 'object',
19
+ default: null
20
+ }
21
+ };
22
+
23
+ constructor(props) {
24
+ super();
25
+ slice.attachTemplate(this);
26
+ this.$value = this.querySelector('.slice_button_value');
27
+ this.$button = this.querySelector('.slice_button');
28
+ this.$container = this.querySelector('.slice_button_container');
29
+
30
+ if (props.onClickCallback) {
31
+ this.onClickCallback = props.onClickCallback;
32
+ this.$container.addEventListener('click', async () => await this.onClickCallback());
33
+ }
34
+
35
+ slice.controller.setComponentProps(this, props);
36
+ }
37
+
38
+ async init() {
39
+ if (this.icon) {
40
+ this.$icon = await slice.build('Icon', {
41
+ name: this.icon,
42
+ size: '20px',
43
+ color: 'currentColor',
44
+ });
45
+ this.$button.insertBefore(this.$icon, this.$value);
46
+ }
47
+ }
48
+
49
+ get icon() {
50
+ return this._icon;
51
+ }
52
+
53
+ set icon(value) {
54
+ this._icon = value;
55
+ if (!this.$icon) return;
56
+ this.$icon.name = value.name;
57
+ this.$icon.iconStyle = value.iconStyle;
58
+ }
59
+
60
+ get value() {
61
+ return this._value;
62
+ }
63
+
64
+ set value(value) {
65
+ this._value = value;
66
+ this.$value.textContent = value;
67
+ }
68
+
69
+ get customColor() {
70
+ return this._customColor;
71
+ }
72
+
73
+ set customColor(value) {
74
+ this._customColor = value;
75
+ if (!value) return;
76
+
77
+ // Mantener la misma API: { button: 'color', label: 'color' }
78
+ if (value.button) {
79
+ this.$button.style.backgroundColor = value.button;
80
+ this.$button.style.borderColor = value.button;
81
+ }
82
+ if (value.label) {
83
+ this.$button.style.color = value.label;
84
+ this.$value.style.color = value.label;
85
+ // También aplicar al icono si existe
86
+ if (this.$icon) {
87
+ this.$icon.style.color = value.label;
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
93
  customElements.define('slice-button', Button);
@@ -1,68 +1,68 @@
1
- .title {
2
- font-size: 20px;
3
- font-weight: bold;
4
- color: var(--font-primary-color);
5
- text-align: center;
6
- }
7
-
8
- .slice-card {
9
- height: 220px;
10
- position: relative;
11
- font-family: var(--font-family);
12
- background-color: var(--seconday-background-color);
13
- border-radius: var(--border-radius-slice);
14
- transition: all 300ms;
15
- }
16
-
17
- .slice-card:hover {
18
- .card_cover {
19
- height: auto;
20
- transform: translateY(-70%);
21
- box-shadow: 0px 10px 10px #00000050;
22
- }
23
- .card_info {
24
- height: 100%;
25
- transform: translateY(20%);
26
- box-shadow: 0px -10px 10px #00000050;
27
- }
28
- }
29
- .card_cover {
30
- width: 100%;
31
- height: 90%;
32
- background: var(--primary-color);
33
- display: flex;
34
- justify-content: center;
35
- align-items: center;
36
- position: absolute;
37
- z-index: 1;
38
- transition: all 400ms ease;
39
- border-radius: var(--border-radius-slice);
40
- }
41
-
42
- .card_info {
43
- width: 100%;
44
- height: 200px;
45
- bottom: 0;
46
- color: var(--font-secondary-color);
47
- background: var(--secondary-background-color);
48
- position: absolute;
49
- font-size: 20px;
50
- transition: all 400ms cubic-bezier(0.5, 0, 0, 1);
51
- border-radius: var(--border-radius-slice);
52
- }
53
-
54
- .card_info p {
55
- text-align: center;
56
- color: var(--font-secondary-color);
57
- padding: 0px 20px 20px 20px;
58
- font-size: 15px;
59
- display: -webkit-box;
60
- display: -moz-box;
61
- display: box;
62
- -webkit-box-orient: vertical;
63
- -moz-box-orient: vertical;
64
- box-orient: vertical;
65
- -webkit-line-clamp: 5;
66
- line-clamp: 5;
67
- overflow: hidden;
68
- }
1
+ .title {
2
+ font-size: 20px;
3
+ font-weight: bold;
4
+ color: var(--font-primary-color);
5
+ text-align: center;
6
+ }
7
+
8
+ .slice-card {
9
+ height: 220px;
10
+ position: relative;
11
+ font-family: var(--font-family);
12
+ background-color: var(--seconday-background-color);
13
+ border-radius: var(--border-radius-slice);
14
+ transition: all 300ms;
15
+ }
16
+
17
+ .slice-card:hover {
18
+ .card_cover {
19
+ height: auto;
20
+ transform: translateY(-70%);
21
+ box-shadow: 0px 10px 10px #00000050;
22
+ }
23
+ .card_info {
24
+ height: 100%;
25
+ transform: translateY(20%);
26
+ box-shadow: 0px -10px 10px #00000050;
27
+ }
28
+ }
29
+ .card_cover {
30
+ width: 100%;
31
+ height: 90%;
32
+ background: var(--primary-color);
33
+ display: flex;
34
+ justify-content: center;
35
+ align-items: center;
36
+ position: absolute;
37
+ z-index: 1;
38
+ transition: all 400ms ease;
39
+ border-radius: var(--border-radius-slice);
40
+ }
41
+
42
+ .card_info {
43
+ width: 100%;
44
+ height: 200px;
45
+ bottom: 0;
46
+ color: var(--font-secondary-color);
47
+ background: var(--secondary-background-color);
48
+ position: absolute;
49
+ font-size: 20px;
50
+ transition: all 400ms cubic-bezier(0.5, 0, 0, 1);
51
+ border-radius: var(--border-radius-slice);
52
+ }
53
+
54
+ .card_info p {
55
+ text-align: center;
56
+ color: var(--font-secondary-color);
57
+ padding: 0px 20px 20px 20px;
58
+ font-size: 15px;
59
+ display: -webkit-box;
60
+ display: -moz-box;
61
+ display: box;
62
+ -webkit-box-orient: vertical;
63
+ -moz-box-orient: vertical;
64
+ box-orient: vertical;
65
+ -webkit-line-clamp: 5;
66
+ line-clamp: 5;
67
+ overflow: hidden;
68
+ }
@@ -1,7 +1,7 @@
1
- <div class="slice-card">
2
- <div class="card_cover"></div>
3
- <div class="card_info">
4
- <h1 class="title">Slice Card Title</h1>
5
- <p class="text">Slice Card text</p>
6
- </div>
7
- </div>
1
+ <div class="slice-card">
2
+ <div class="card_cover"></div>
3
+ <div class="card_info">
4
+ <h1 class="title">Slice Card Title</h1>
5
+ <p class="text">Slice Card text</p>
6
+ </div>
7
+ </div>
@@ -1,107 +1,107 @@
1
- export default class Card extends HTMLElement {
2
- constructor(props) {
3
- super();
4
- slice.attachTemplate(this);
5
- this.$card = this.querySelector('.slice-card');
6
- this.$title = this.querySelector('.title');
7
- this.$text = this.querySelector('.text');
8
- this.$cover = this.querySelector('.card_cover');
9
- slice.controller.setComponentProps(this, props);
10
-
11
- this.$cover.addEventListener('click', () => {
12
- this.isOpen = !this.isOpen;
13
- });
14
-
15
- this.$card.addEventListener('mouseover', () => {
16
- this.$cover.style.backgroundColor = this.$color.icon;
17
- this.$icon.color = this.$color.card;
18
- });
19
- this.$card.addEventListener('mouseout', () => {
20
- this.$cover.style.backgroundColor = this.$color.card;
21
- this.$icon.color = this.$color.icon;
22
- });
23
-
24
- this.debuggerProps = ['title', 'text', 'icon', 'customColor', 'isOpen'];
25
- }
26
-
27
- async init() {
28
- if (this.isOpen === undefined) {
29
- this.isOpen = false;
30
- }
31
-
32
- if (!this.customColor) {
33
- this.$color = {
34
- icon: 'var(--primary-color-contrast)',
35
- card: 'var(--primary-color)',
36
- };
37
- }
38
-
39
- if (!this._icon) {
40
- this.icon = { name: 'sliceJs', iconStyle: 'filled' };
41
- }
42
-
43
- this.$icon = await slice.build('Icon', {
44
- name: this.icon.name,
45
- size: '150px',
46
- color: this.$color.icon,
47
- iconStyle: this._icon.iconStyle,
48
- });
49
- this.$cover.appendChild(this.$icon);
50
- }
51
-
52
- get title() {
53
- return this._title;
54
- }
55
-
56
- set title(value) {
57
- this._title = value;
58
- this.$title.textContent = value;
59
- }
60
-
61
- get text() {
62
- return this._text;
63
- }
64
-
65
- set text(value) {
66
- this._text = value;
67
- this.$text.textContent = value;
68
- }
69
-
70
- get icon() {
71
- return this._icon;
72
- }
73
-
74
- set icon(value) {
75
- this._icon = value;
76
- if (!this.$icon) return;
77
- this.$icon.name = value.name;
78
- this.$icon.iconStyle = value.iconStyle;
79
- }
80
-
81
- get isOpen() {
82
- return this._isOpen;
83
- }
84
-
85
- set isOpen(boolean) {
86
- this._isOpen = boolean;
87
- if (boolean) {
88
- this.$cover.style.zIndex = 0;
89
- } else {
90
- this.$cover.style.zIndex = 1;
91
- }
92
- }
93
-
94
- get customColor() {
95
- return this._customColor;
96
- }
97
-
98
- set customColor(value) {
99
- this._customColor = value;
100
- this.$color = value;
101
- if (value.card) {
102
- this.$cover.style.backgroundColor = value.card;
103
- }
104
- }
105
- }
106
-
107
- customElements.define('slice-card', Card);
1
+ export default class Card extends HTMLElement {
2
+ constructor(props) {
3
+ super();
4
+ slice.attachTemplate(this);
5
+ this.$card = this.querySelector('.slice-card');
6
+ this.$title = this.querySelector('.title');
7
+ this.$text = this.querySelector('.text');
8
+ this.$cover = this.querySelector('.card_cover');
9
+ slice.controller.setComponentProps(this, props);
10
+
11
+ this.$cover.addEventListener('click', () => {
12
+ this.isOpen = !this.isOpen;
13
+ });
14
+
15
+ this.$card.addEventListener('mouseover', () => {
16
+ this.$cover.style.backgroundColor = this.$color.icon;
17
+ this.$icon.color = this.$color.card;
18
+ });
19
+ this.$card.addEventListener('mouseout', () => {
20
+ this.$cover.style.backgroundColor = this.$color.card;
21
+ this.$icon.color = this.$color.icon;
22
+ });
23
+
24
+ this.debuggerProps = ['title', 'text', 'icon', 'customColor', 'isOpen'];
25
+ }
26
+
27
+ async init() {
28
+ if (this.isOpen === undefined) {
29
+ this.isOpen = false;
30
+ }
31
+
32
+ if (!this.customColor) {
33
+ this.$color = {
34
+ icon: 'var(--primary-color-contrast)',
35
+ card: 'var(--primary-color)',
36
+ };
37
+ }
38
+
39
+ if (!this._icon) {
40
+ this.icon = { name: 'sliceJs', iconStyle: 'filled' };
41
+ }
42
+
43
+ this.$icon = await slice.build('Icon', {
44
+ name: this.icon.name,
45
+ size: '150px',
46
+ color: this.$color.icon,
47
+ iconStyle: this._icon.iconStyle,
48
+ });
49
+ this.$cover.appendChild(this.$icon);
50
+ }
51
+
52
+ get title() {
53
+ return this._title;
54
+ }
55
+
56
+ set title(value) {
57
+ this._title = value;
58
+ this.$title.textContent = value;
59
+ }
60
+
61
+ get text() {
62
+ return this._text;
63
+ }
64
+
65
+ set text(value) {
66
+ this._text = value;
67
+ this.$text.textContent = value;
68
+ }
69
+
70
+ get icon() {
71
+ return this._icon;
72
+ }
73
+
74
+ set icon(value) {
75
+ this._icon = value;
76
+ if (!this.$icon) return;
77
+ this.$icon.name = value.name;
78
+ this.$icon.iconStyle = value.iconStyle;
79
+ }
80
+
81
+ get isOpen() {
82
+ return this._isOpen;
83
+ }
84
+
85
+ set isOpen(boolean) {
86
+ this._isOpen = boolean;
87
+ if (boolean) {
88
+ this.$cover.style.zIndex = 0;
89
+ } else {
90
+ this.$cover.style.zIndex = 1;
91
+ }
92
+ }
93
+
94
+ get customColor() {
95
+ return this._customColor;
96
+ }
97
+
98
+ set customColor(value) {
99
+ this._customColor = value;
100
+ this.$color = value;
101
+ if (value.card) {
102
+ this.$cover.style.backgroundColor = value.card;
103
+ }
104
+ }
105
+ }
106
+
107
+ customElements.define('slice-card', Card);