contentoh-components-library 21.6.50 → 21.6.52
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.
- package/.env.test +0 -1
- package/dist/components/atoms/IconFile/index.js +2 -85
- package/dist/components/atoms/IconFile/styles.js +1 -1
- package/dist/components/atoms/ProductImage/ProductImage.stories.js +2 -70
- package/dist/components/atoms/ProductImage/index.js +27 -100
- package/dist/components/atoms/ProductImage/styles.js +1 -3
- package/dist/components/molecules/EditionActiveImage/index.js +2 -4
- package/dist/components/molecules/GalleryElement/index.js +4 -13
- package/dist/components/molecules/GalleryHeader/index.js +24 -96
- package/dist/components/molecules/GalleryHeader/styles.js +1 -4
- package/dist/components/molecules/ImageSelector/index.js +0 -1
- package/dist/components/organisms/ImagePreviewer/index.js +0 -1
- package/dist/components/organisms/ProductImageModal/index.js +2 -3
- package/dist/components/organisms/PropagateChangesModal/index.js +6 -1
- package/dist/components/pages/ProviderProductEdition/context/provider-product-edition.context.js +10 -8
- package/dist/components/pages/ProviderProductEdition/index.js +189 -72
- package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +25 -338
- package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +2 -12
- package/dist/components/pages/RetailerProductEdition/index.js +579 -631
- package/dist/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +0 -1
- package/dist/components/pages/RetailerProductEdition/stories/TextEditor.stories.js +145 -45
- package/dist/global-files/data.js +3 -16
- package/dist/index.js +90 -142
- package/package.json +1 -1
- package/src/components/atoms/IconFile/index.js +1 -28
- package/src/components/atoms/IconFile/styles.js +0 -8
- package/src/components/atoms/ProductImage/ProductImage.stories.js +0 -38
- package/src/components/atoms/ProductImage/index.js +20 -95
- package/src/components/atoms/ProductImage/styles.js +7 -92
- package/src/components/molecules/EditionActiveImage/index.js +2 -2
- package/src/components/molecules/GalleryElement/index.js +0 -9
- package/src/components/molecules/GalleryHeader/index.js +13 -65
- package/src/components/molecules/GalleryHeader/styles.js +1 -2
- package/src/components/molecules/ImageSelector/index.js +0 -1
- package/src/components/organisms/ImagePreviewer/index.js +0 -1
- package/src/components/organisms/ProductImageModal/index.js +0 -1
- package/src/components/organisms/PropagateChangesModal/index.js +10 -3
- package/src/components/pages/ProviderProductEdition/context/provider-product-edition.context.jsx +2 -1
- package/src/components/pages/ProviderProductEdition/index.js +111 -6
- package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +2 -202
- package/src/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +0 -12
- package/src/components/pages/RetailerProductEdition/index.js +258 -363
- package/src/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +0 -1
- package/src/components/pages/RetailerProductEdition/stories/TextEditor.stories.js +104 -51
- package/src/global-files/data.js +2 -17
- package/src/index.js +0 -4
- package/.claude/launch.json +0 -14
- package/dist/ai/prompts/attribute.prompt.js +0 -28
- package/dist/ai/prompts/description.prompt.js +0 -33
- package/dist/ai/schemas/attribute.schema.js +0 -35
- package/dist/ai/schemas/description.schema.js +0 -27
- package/dist/components/atoms/AssetPreview/AssetPreview.stories.js +0 -118
- package/dist/components/atoms/AssetPreview/index.js +0 -150
- package/dist/components/atoms/AssetPreview/styles.js +0 -28
- package/dist/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +0 -147
- package/dist/components/molecules/GalleryAssetElement/index.js +0 -178
- package/dist/components/molecules/GalleryAssetElement/styles.js +0 -26
- package/dist/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +0 -56
- package/dist/components/molecules/GalleryTrayTabs/index.js +0 -60
- package/dist/components/molecules/GalleryTrayTabs/styles.js +0 -20
- package/dist/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +0 -171
- package/dist/components/organisms/DigitalAssetsTray/index.js +0 -211
- package/dist/components/organisms/DigitalAssetsTray/styles.js +0 -22
- package/dist/global-files/digital-assets/assetTypes.js +0 -480
- package/dist/global-files/digital-assets/assets.actions.js +0 -64
- package/dist/global-files/digital-assets/assets.adapter.js +0 -304
- package/dist/global-files/digital-assets/assets.mock.js +0 -136
- package/dist/global-files/digital-assets/assets.reducer.js +0 -220
- package/dist/global-files/digital-assets/uploadAssets.js +0 -179
- package/dist/global-files/digital-assets/useDigitalAssets.js +0 -522
- package/docs/activos-digitales.md +0 -273
- package/src/components/atoms/AssetPreview/AssetPreview.stories.js +0 -78
- package/src/components/atoms/AssetPreview/index.js +0 -119
- package/src/components/atoms/AssetPreview/styles.js +0 -190
- package/src/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +0 -102
- package/src/components/molecules/GalleryAssetElement/index.js +0 -162
- package/src/components/molecules/GalleryAssetElement/styles.js +0 -159
- package/src/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +0 -32
- package/src/components/molecules/GalleryTrayTabs/index.js +0 -41
- package/src/components/molecules/GalleryTrayTabs/styles.js +0 -52
- package/src/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +0 -101
- package/src/components/organisms/DigitalAssetsTray/index.js +0 -189
- package/src/components/organisms/DigitalAssetsTray/styles.js +0 -183
- package/src/global-files/digital-assets/assetTypes.js +0 -419
- package/src/global-files/digital-assets/assets.actions.js +0 -50
- package/src/global-files/digital-assets/assets.adapter.js +0 -229
- package/src/global-files/digital-assets/assets.mock.js +0 -122
- package/src/global-files/digital-assets/assets.reducer.js +0 -197
- package/src/global-files/digital-assets/uploadAssets.js +0 -109
- package/src/global-files/digital-assets/useDigitalAssets.js +0 -329
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
import { useDropzone } from "react-dropzone";
|
|
2
|
-
|
|
3
|
-
import { Container } from "./styles";
|
|
4
|
-
import { GalleryAssetElement } from "../../molecules/GalleryAssetElement";
|
|
5
|
-
import { GalleryHeader } from "../../molecules/GalleryHeader";
|
|
6
|
-
import { ButtonV2 } from "../../atoms/ButtonV2";
|
|
7
|
-
import {
|
|
8
|
-
MAX_ASSETS_PER_PRODUCT,
|
|
9
|
-
acceptedFormatsLabel,
|
|
10
|
-
buildDropzoneAccept,
|
|
11
|
-
} from "../../../global-files/digital-assets/assetTypes";
|
|
12
|
-
|
|
13
|
-
const CHECK_ALL_ID = "check-all-assets";
|
|
14
|
-
const ITEM_SELECTOR = "[id^='gallery-asset-']";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Bandeja de activos digitales: soltar archivos, verlos, reetiquetarlos y
|
|
18
|
-
* quitarlos.
|
|
19
|
-
*
|
|
20
|
-
* Tiene su propio dropzone en vez de compartir el de las imágenes porque los
|
|
21
|
-
* formatos aceptados son distintos: mezclarlos dejaría soltar un PDF sobre la
|
|
22
|
-
* bandeja de fotos y un JPG sobre la de activos.
|
|
23
|
-
*
|
|
24
|
-
* No guarda ni sube nada. Recibe el estado ya armado por `useDigitalAssets`,
|
|
25
|
-
* así que cuando se defina el contrato del backend solo hay que conectarle las
|
|
26
|
-
* llamadas; la interfaz no cambia.
|
|
27
|
-
*/
|
|
28
|
-
export const DigitalAssetsTray = ({
|
|
29
|
-
assets = [],
|
|
30
|
-
notices = [],
|
|
31
|
-
unsaved = { nuevos: 0, modificados: 0, borrados: 0, total: 0 },
|
|
32
|
-
remaining = MAX_ASSETS_PER_PRODUCT,
|
|
33
|
-
addFiles,
|
|
34
|
-
removeAsset,
|
|
35
|
-
changeAssetType,
|
|
36
|
-
clearNotices,
|
|
37
|
-
selectedAssets = [],
|
|
38
|
-
setSelectedAssets,
|
|
39
|
-
setCheckAll,
|
|
40
|
-
gridLayout = false,
|
|
41
|
-
readOnly = false,
|
|
42
|
-
emptyMessage = "Este producto no tiene activos digitales",
|
|
43
|
-
}) => {
|
|
44
|
-
const { getRootProps, getInputProps, isDragActive, open } = useDropzone({
|
|
45
|
-
accept: buildDropzoneAccept(),
|
|
46
|
-
noKeyboard: true,
|
|
47
|
-
multiple: true,
|
|
48
|
-
noClick: true,
|
|
49
|
-
disabled: readOnly,
|
|
50
|
-
onDrop: (acceptedFiles) => addFiles?.(acceptedFiles),
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const noticesBy = (level) => notices.filter((item) => item.level === level);
|
|
54
|
-
|
|
55
|
-
/*
|
|
56
|
-
Se desglosa en vez de mostrar solo el número: "3 cambios sin guardar" no le
|
|
57
|
-
dice al usuario qué perdería si se va, y no es lo mismo dejar sin guardar un
|
|
58
|
-
borrado que un archivo nuevo.
|
|
59
|
-
*/
|
|
60
|
-
const detalleSinGuardar = [
|
|
61
|
-
unsaved.nuevos && `${unsaved.nuevos} nuevo${unsaved.nuevos > 1 ? "s" : ""}`,
|
|
62
|
-
unsaved.modificados && `${unsaved.modificados} modificado${unsaved.modificados > 1 ? "s" : ""}`,
|
|
63
|
-
unsaved.borrados && `${unsaved.borrados} por borrar`,
|
|
64
|
-
].filter(Boolean).join(" · ");
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<Container>
|
|
68
|
-
<div className="tray-toolbar">
|
|
69
|
-
{/* La lista completa son 27 formatos: no cabe en una línea, así que va
|
|
70
|
-
en el title y en el texto solo las familias. */}
|
|
71
|
-
<p className="tray-hint" title={`Formatos permitidos: ${acceptedFormatsLabel()}`}>
|
|
72
|
-
Arrastra aquí videos, 360, GIF, documentos, hojas de cálculo o archivos
|
|
73
|
-
editables. Quedan {remaining} de {MAX_ASSETS_PER_PRODUCT}.
|
|
74
|
-
</p>
|
|
75
|
-
{!readOnly && (
|
|
76
|
-
<ButtonV2
|
|
77
|
-
label={"Agregar activos"}
|
|
78
|
-
type={"pink"}
|
|
79
|
-
size={12}
|
|
80
|
-
onClick={open}
|
|
81
|
-
/>
|
|
82
|
-
)}
|
|
83
|
-
</div>
|
|
84
|
-
|
|
85
|
-
{/*
|
|
86
|
-
Rechazos y advertencias se separan en dos paneles.
|
|
87
|
-
|
|
88
|
-
Mezclarlos en rojo haría creer que un archivo que sí entró tampoco
|
|
89
|
-
sirvió: un .mov se guarda y se descarga bien, solo que el navegador no
|
|
90
|
-
lo reproduce. Son mensajes distintos y merecen colores distintos.
|
|
91
|
-
*/}
|
|
92
|
-
{unsaved.total > 0 && (
|
|
93
|
-
<div className="tray-unsaved" role="status">
|
|
94
|
-
<span className="tray-unsaved-dot" />
|
|
95
|
-
<p>
|
|
96
|
-
<strong>
|
|
97
|
-
{unsaved.total} cambio{unsaved.total > 1 ? "s" : ""} sin guardar
|
|
98
|
-
</strong>
|
|
99
|
-
{detalleSinGuardar && <span className="tray-unsaved-detail"> — {detalleSinGuardar}</span>}
|
|
100
|
-
</p>
|
|
101
|
-
</div>
|
|
102
|
-
)}
|
|
103
|
-
|
|
104
|
-
{noticesBy("error").length > 0 && (
|
|
105
|
-
<div className="tray-notice tray-notice-error">
|
|
106
|
-
<div className="tray-notice-head">
|
|
107
|
-
<p>No se pudieron agregar {noticesBy("error").length} archivo(s):</p>
|
|
108
|
-
<button type="button" onClick={clearNotices} title="Cerrar">
|
|
109
|
-
×
|
|
110
|
-
</button>
|
|
111
|
-
</div>
|
|
112
|
-
<ul>
|
|
113
|
-
{noticesBy("error").map((item, index) => (
|
|
114
|
-
<li key={`err-${item.name}-${index}`}>{item.message}</li>
|
|
115
|
-
))}
|
|
116
|
-
</ul>
|
|
117
|
-
</div>
|
|
118
|
-
)}
|
|
119
|
-
|
|
120
|
-
{noticesBy("warning").length > 0 && (
|
|
121
|
-
<div className="tray-notice tray-notice-warning">
|
|
122
|
-
<div className="tray-notice-head">
|
|
123
|
-
<p>Se agregaron, pero ten en cuenta:</p>
|
|
124
|
-
<button type="button" onClick={clearNotices} title="Cerrar">
|
|
125
|
-
×
|
|
126
|
-
</button>
|
|
127
|
-
</div>
|
|
128
|
-
<ul>
|
|
129
|
-
{noticesBy("warning").map((item, index) => (
|
|
130
|
-
<li key={`warn-${item.name}-${index}`}>{item.message}</li>
|
|
131
|
-
))}
|
|
132
|
-
</ul>
|
|
133
|
-
</div>
|
|
134
|
-
)}
|
|
135
|
-
|
|
136
|
-
{!gridLayout && assets.length > 0 && (
|
|
137
|
-
<GalleryHeader
|
|
138
|
-
variant="asset"
|
|
139
|
-
checkAllId={CHECK_ALL_ID}
|
|
140
|
-
itemSelector={ITEM_SELECTOR}
|
|
141
|
-
setCheckAll={setCheckAll}
|
|
142
|
-
setSelectedImages={setSelectedAssets}
|
|
143
|
-
/>
|
|
144
|
-
)}
|
|
145
|
-
|
|
146
|
-
<div
|
|
147
|
-
{...getRootProps({
|
|
148
|
-
className: `dropzone ${isDragActive ? "drag-active" : ""}`.trim(),
|
|
149
|
-
})}
|
|
150
|
-
>
|
|
151
|
-
<input {...getInputProps()} />
|
|
152
|
-
{isDragActive && (
|
|
153
|
-
<div className="drag-overlay">
|
|
154
|
-
<p>Suelta los activos aquí</p>
|
|
155
|
-
</div>
|
|
156
|
-
)}
|
|
157
|
-
<aside className={gridLayout ? "tray-grid" : "tray-rows"}>
|
|
158
|
-
{assets.map((asset, index) => (
|
|
159
|
-
<GalleryAssetElement
|
|
160
|
-
key={asset.id ?? asset.tempId}
|
|
161
|
-
asset={asset}
|
|
162
|
-
index={index}
|
|
163
|
-
gridLayout={gridLayout}
|
|
164
|
-
checkAllId={CHECK_ALL_ID}
|
|
165
|
-
itemSelector={ITEM_SELECTOR}
|
|
166
|
-
selectedAssets={selectedAssets}
|
|
167
|
-
setSelectedAssets={setSelectedAssets}
|
|
168
|
-
setCheckAll={setCheckAll}
|
|
169
|
-
changeAsset={({ value }) => changeAssetType?.(index, value)}
|
|
170
|
-
onRemove={removeAsset}
|
|
171
|
-
readOnly={readOnly}
|
|
172
|
-
/>
|
|
173
|
-
))}
|
|
174
|
-
</aside>
|
|
175
|
-
|
|
176
|
-
{assets.length === 0 && (
|
|
177
|
-
<div className="tray-empty">
|
|
178
|
-
<p>{emptyMessage}</p>
|
|
179
|
-
{!readOnly && (
|
|
180
|
-
<p className="tray-empty-hint">
|
|
181
|
-
Arrástralos aquí o usa «Agregar activos».
|
|
182
|
-
</p>
|
|
183
|
-
)}
|
|
184
|
-
</div>
|
|
185
|
-
)}
|
|
186
|
-
</div>
|
|
187
|
-
</Container>
|
|
188
|
-
);
|
|
189
|
-
};
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import styled from "styled-components";
|
|
2
|
-
import { FontFamily, GlobalColors } from "../../../global-files/variables";
|
|
3
|
-
|
|
4
|
-
/* El dropzone replica el de la bandeja de imágenes para que arrastrar se sienta
|
|
5
|
-
igual en las dos. */
|
|
6
|
-
export const Container = styled.div`
|
|
7
|
-
width: 100%;
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-direction: column;
|
|
10
|
-
gap: 8px;
|
|
11
|
-
|
|
12
|
-
.tray-toolbar {
|
|
13
|
-
display: flex;
|
|
14
|
-
align-items: center;
|
|
15
|
-
justify-content: space-between;
|
|
16
|
-
gap: 12px;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.tray-hint {
|
|
20
|
-
margin: 0;
|
|
21
|
-
font-family: ${FontFamily.Lato};
|
|
22
|
-
font-size: 12px;
|
|
23
|
-
line-height: 18px;
|
|
24
|
-
color: ${GlobalColors.s4};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/*
|
|
28
|
-
Aviso de cambios sin guardar. Va arriba del listado y no junto al botón de
|
|
29
|
-
guardar, que vive en otra barra: el usuario mira la bandeja, no el menú.
|
|
30
|
-
*/
|
|
31
|
-
.tray-unsaved {
|
|
32
|
-
display: flex;
|
|
33
|
-
align-items: center;
|
|
34
|
-
gap: 8px;
|
|
35
|
-
padding: 6px 12px;
|
|
36
|
-
border-radius: 6px;
|
|
37
|
-
border: 1px solid ${GlobalColors.in_progress};
|
|
38
|
-
background: rgba(237, 154, 77, 0.08);
|
|
39
|
-
|
|
40
|
-
p {
|
|
41
|
-
margin: 0;
|
|
42
|
-
font-family: ${FontFamily.Lato};
|
|
43
|
-
font-size: 12px;
|
|
44
|
-
line-height: 18px;
|
|
45
|
-
color: ${GlobalColors.s5};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
strong {
|
|
49
|
-
font-family: ${FontFamily.Raleway_600};
|
|
50
|
-
color: ${GlobalColors.in_progress};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.tray-unsaved-dot {
|
|
55
|
-
width: 8px;
|
|
56
|
-
height: 8px;
|
|
57
|
-
border-radius: 50%;
|
|
58
|
-
background: ${GlobalColors.in_progress};
|
|
59
|
-
flex-shrink: 0;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.tray-unsaved-detail {
|
|
63
|
-
color: ${GlobalColors.s4};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.tray-notice {
|
|
67
|
-
border-radius: 6px;
|
|
68
|
-
padding: 8px 12px;
|
|
69
|
-
border: 1px solid;
|
|
70
|
-
|
|
71
|
-
.tray-notice-head {
|
|
72
|
-
display: flex;
|
|
73
|
-
align-items: center;
|
|
74
|
-
justify-content: space-between;
|
|
75
|
-
|
|
76
|
-
p {
|
|
77
|
-
margin: 0;
|
|
78
|
-
font-family: ${FontFamily.Raleway_600};
|
|
79
|
-
font-size: 12px;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
button {
|
|
83
|
-
border: none;
|
|
84
|
-
background: none;
|
|
85
|
-
cursor: pointer;
|
|
86
|
-
font-size: 16px;
|
|
87
|
-
line-height: 1;
|
|
88
|
-
color: inherit;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
ul {
|
|
93
|
-
margin: 4px 0 0;
|
|
94
|
-
padding-left: 18px;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
li {
|
|
98
|
-
font-family: ${FontFamily.Lato};
|
|
99
|
-
font-size: 12px;
|
|
100
|
-
line-height: 18px;
|
|
101
|
-
color: ${GlobalColors.s5};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/* Rojo = no entró. Ámbar = entró, pero hay algo que saber. */
|
|
106
|
-
.tray-notice-error {
|
|
107
|
-
border-color: ${GlobalColors.secondary_magenta};
|
|
108
|
-
background: rgba(${GlobalColors.rgb_color_pink}, 0.05);
|
|
109
|
-
color: ${GlobalColors.secondary_magenta};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
.tray-notice-warning {
|
|
113
|
-
border-color: ${GlobalColors.in_progress};
|
|
114
|
-
background: rgba(237, 154, 77, 0.08);
|
|
115
|
-
color: ${GlobalColors.in_progress};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.dropzone {
|
|
119
|
-
position: relative;
|
|
120
|
-
width: 100%;
|
|
121
|
-
min-height: 160px;
|
|
122
|
-
transition: all 0.5s ease;
|
|
123
|
-
|
|
124
|
-
&.drag-active {
|
|
125
|
-
background-color: rgba(${GlobalColors.rgb_color_pink}, 0.05);
|
|
126
|
-
border: 2px dashed ${GlobalColors.color_pink};
|
|
127
|
-
border-radius: 8px;
|
|
128
|
-
|
|
129
|
-
aside {
|
|
130
|
-
opacity: 0.3;
|
|
131
|
-
pointer-events: none;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
.drag-overlay {
|
|
136
|
-
position: absolute;
|
|
137
|
-
inset: 0;
|
|
138
|
-
display: flex;
|
|
139
|
-
align-items: center;
|
|
140
|
-
justify-content: center;
|
|
141
|
-
z-index: 1;
|
|
142
|
-
|
|
143
|
-
p {
|
|
144
|
-
font-family: ${FontFamily.AvenirNext};
|
|
145
|
-
font-size: 16px;
|
|
146
|
-
color: ${GlobalColors.color_pink};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.tray-rows {
|
|
152
|
-
display: flex;
|
|
153
|
-
flex-direction: column;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
.tray-grid {
|
|
157
|
-
display: flex;
|
|
158
|
-
flex-wrap: wrap;
|
|
159
|
-
gap: 12px;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.tray-empty {
|
|
163
|
-
position: absolute;
|
|
164
|
-
top: 50%;
|
|
165
|
-
left: 50%;
|
|
166
|
-
transform: translate(-50%, -50%);
|
|
167
|
-
text-align: center;
|
|
168
|
-
width: 80%;
|
|
169
|
-
|
|
170
|
-
p {
|
|
171
|
-
margin: 0;
|
|
172
|
-
font-family: ${FontFamily.Lato};
|
|
173
|
-
font-size: 16px;
|
|
174
|
-
color: ${GlobalColors.gray};
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
.tray-empty-hint {
|
|
178
|
-
margin-top: 6px;
|
|
179
|
-
font-size: 13px;
|
|
180
|
-
color: ${GlobalColors.s4};
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
`;
|