@lanaco/lnc-react-ui 4.0.140 → 4.0.141

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.
@@ -1,15 +1,15 @@
1
- import { jsxs as n, jsx as e, Fragment as S } from "react/jsx-runtime";
2
- import { forwardRef as z, useState as R, useRef as q, useEffect as de, Suspense as me } from "react";
3
- import { p as pe, t as U, o as y, l as ge, q as Y, G as A, k as ue } from "./utils-BdsZgOUE.js";
4
- import { s as k } from "./emotion-styled.browser.esm-BNN1dTl3.js";
5
- import { P as he } from "./index-CF3HhgvN.js";
1
+ import { jsxs as n, jsx as e, Fragment as C } from "react/jsx-runtime";
2
+ import { forwardRef as B, useState as A, useRef as Y, useEffect as ve, cloneElement as we, Suspense as be } from "react";
3
+ import { p as ke, t as K, o as b, l as H, q as Z, G as J, k as ye } from "./utils-BdsZgOUE.js";
4
+ import { s as P } from "./emotion-styled.browser.esm-BNN1dTl3.js";
5
+ import { P as _e } from "./index-CF3HhgvN.js";
6
6
  import N from "./Badge.js";
7
- import fe from "./Popover.js";
8
- import ve from "./PopoverTrigger.js";
9
- import we from "./PopoverContent.js";
10
- import { u as be } from "./useDetectMobile-Bkvj0VMa.js";
11
- import { M as K } from "./consts-BuFChS64.js";
12
- const L = k.div`
7
+ import Ne from "./Popover.js";
8
+ import Ce from "./PopoverTrigger.js";
9
+ import Pe from "./PopoverContent.js";
10
+ import { u as $e } from "./useDetectMobile-Bkvj0VMa.js";
11
+ import { M as Q } from "./consts-BuFChS64.js";
12
+ const x = P.div`
13
13
  display: flex;
14
14
  flex-direction: column;
15
15
  gap: 0.5rem;
@@ -74,13 +74,13 @@ const L = k.div`
74
74
  & .card-title {
75
75
  font-size: 0.875rem;
76
76
  font-weight: 600;
77
- ${pe(2)}
77
+ ${ke(2)}
78
78
  }
79
79
 
80
80
  & .price-text {
81
81
  font-size: 1rem;
82
82
  font-weight: 600;
83
- ${U()}
83
+ ${K()}
84
84
  display: flex;
85
85
  align-items: end;
86
86
  gap: 0.5rem;
@@ -103,7 +103,7 @@ const L = k.div`
103
103
  font-size: 0.75rem;
104
104
  font-weight: 400;
105
105
  color: var(--gray-600, #676e79);
106
- ${U()}
106
+ ${K()}
107
107
  }
108
108
 
109
109
  & .tags-wrapper {
@@ -112,31 +112,31 @@ const L = k.div`
112
112
  }
113
113
 
114
114
  & .skeleton-img {
115
- background-color: ${y("-90deg")};
115
+ background-color: ${b("-90deg")};
116
116
  border-radius: 0.75rem;
117
117
  border: 1px solid white;
118
118
  }
119
119
 
120
120
  & .skeleton-title {
121
- background-color: ${y("-90deg")};
121
+ background-color: ${b("-90deg")};
122
122
  width: 100%;
123
123
  height: 2.5rem;
124
124
  }
125
125
 
126
126
  & .skeleton-tags {
127
- background-color: ${y("-90deg")};
127
+ background-color: ${b("-90deg")};
128
128
  width: 80%;
129
129
  height: 1.5rem;
130
130
  }
131
131
 
132
132
  & .skeleton-price {
133
- background-color: ${y("-90deg")};
133
+ background-color: ${b("-90deg")};
134
134
  width: 50%;
135
135
  height: 2.5rem;
136
136
  }
137
137
 
138
138
  & .skeleton-sponsored {
139
- background-color: ${y("-90deg")};
139
+ background-color: ${b("-90deg")};
140
140
  width: 50%;
141
141
  height: 1rem;
142
142
  }
@@ -146,7 +146,7 @@ const L = k.div`
146
146
  gap: 0.25rem;
147
147
  }
148
148
 
149
- @media (max-width: ${K + "px"}) {
149
+ @media (max-width: ${Q + "px"}) {
150
150
  overflow: visible;
151
151
 
152
152
  & .tags-popover__trigger {
@@ -166,7 +166,7 @@ const L = k.div`
166
166
  &:hover .product-image-wrapper img {
167
167
  transform: scale(1.1);
168
168
  }
169
- `, ye = k.div`
169
+ `, Te = P.div`
170
170
  position: relative;
171
171
  overflow: hidden;
172
172
  border-radius: 0.75rem;
@@ -174,6 +174,21 @@ const L = k.div`
174
174
  aspect-ratio: 1 / 1;
175
175
  border: 1px solid #0c15201f;
176
176
 
177
+ & .bookmarking-btn {
178
+ position: absolute;
179
+ right: 0.5rem;
180
+ top: 0.5rem;
181
+ z-index: 1;
182
+
183
+ display: none;
184
+ }
185
+
186
+ &:hover {
187
+ & .bookmarking-btn {
188
+ display: flex;
189
+ }
190
+ }
191
+
177
192
  & img {
178
193
  display: block;
179
194
  width: 100%;
@@ -183,7 +198,7 @@ const L = k.div`
183
198
  transition: var(--transition, all 0.3s ease);
184
199
  }
185
200
 
186
- @media (max-width: ${K + "px"}) {
201
+ @media (max-width: ${Q + "px"}) {
187
202
  & img {
188
203
  width: 8.875rem;
189
204
  height: 8.875rem;
@@ -191,8 +206,12 @@ const L = k.div`
191
206
  min-height: 8.875rem;
192
207
  object-fit: cover;
193
208
  }
209
+
210
+ & .bookmarking-btn {
211
+ display: flex;
212
+ }
194
213
  }
195
- `, _e = k.div`
214
+ `, Ee = P.div`
196
215
  background: var(--white, #fff);
197
216
  z-index: 1;
198
217
 
@@ -242,7 +261,7 @@ const L = k.div`
242
261
  color: var(--gray-950, #14161a);
243
262
  }
244
263
  }
245
- `, Ne = k.div`
264
+ `, Ve = P.div`
246
265
  display: flex;
247
266
  align-items: center;
248
267
  gap: 0.25rem;
@@ -254,10 +273,10 @@ const L = k.div`
254
273
  font-size: 1rem;
255
274
  color: var(--warning-500, #F59E0B);
256
275
  }
257
- `, ke = z(({ sponsoredText: d = "Sponsored" }, f) => /* @__PURE__ */ n(Ne, { ref: f, className: "sponsored-line", children: [
276
+ `, Oe = B(({ sponsoredText: d = "Sponsored" }, v) => /* @__PURE__ */ n(Ve, { ref: v, className: "sponsored-line", children: [
258
277
  /* @__PURE__ */ e("i", { className: "mng-lnc-paw2" }),
259
278
  /* @__PURE__ */ e("span", { children: d })
260
- ] })), Ce = "Vehicles_Cars", Pe = "Vehicles_Motorcycles", $e = "Vehicles_Trucks", Te = "Vehicles_AgriculturalMachines_Tractors", Ve = "Vehicles_ConstructionMachines", Ee = "Vehicles_Bus", Oe = "Vehicles_Campers", Se = "RealEstates_", i = {
279
+ ] })), Se = "Vehicles_Cars", ze = "Vehicles_Motorcycles", Be = "Vehicles_Trucks", Me = "Vehicles_AgriculturalMachines_Tractors", We = "Vehicles_ConstructionMachines", Fe = "Vehicles_Bus", De = "Vehicles_Campers", Ie = "RealEstates_", i = {
261
280
  Mileage: {
262
281
  icon: "mng-lnc-road",
263
282
  measure: "km"
@@ -358,152 +377,168 @@ const L = k.div`
358
377
  icon: " mng-lnc-clock--filled",
359
378
  measure: ""
360
379
  }
361
- }, Ae = z((d, f) => {
380
+ }, xe = B((d, v) => {
362
381
  const {
363
- title: v,
364
- price: w = 0,
365
- sellingPrice: m,
382
+ uuid: m,
383
+ title: k,
384
+ price: g = 0,
385
+ sellingPrice: y,
366
386
  currency: _,
367
- isNegotiable: C,
368
- isFree: P,
369
- imageUrl: H,
370
- location: Z,
387
+ isNegotiable: $,
388
+ isFree: T,
389
+ imageUrl: ee,
390
+ location: re,
371
391
  sponsored: M,
372
392
  imageComponent: W,
373
- onSelectCard: J = () => {
393
+ onSelectCard: oe = () => {
374
394
  },
375
- freeText: Q = "Free",
376
- negotiableText: x = "Negotiable",
395
+ freeText: ne = "Free",
396
+ negotiableText: te = "Negotiable",
377
397
  tags: t = [],
378
- categoryCode: $,
379
- condition: T,
380
- quantity: V,
381
- trade: E,
382
- sponsoredText: ee
383
- } = d, O = be(), B = [
384
- Ce,
385
- Pe,
386
- $e,
387
- Te,
388
- Ve,
389
- Ee,
390
- Oe,
391
- Se
398
+ categoryCode: E,
399
+ condition: V,
400
+ quantity: O,
401
+ trade: S,
402
+ sponsoredText: ae,
403
+ onBookmark: F = () => {
404
+ },
405
+ bookmarkComponent: D,
406
+ bookmarked: I,
407
+ bookmarkLists: ie
408
+ } = d, z = $e(), se = () => H(D) ? we(D, {
409
+ key: `bookmark_pr__${I}`,
410
+ bookmarked: I,
411
+ productUuid: m,
412
+ onAddToBookmark: () => F(!0, m),
413
+ onRemoveFromBookmark: () => F(!1, m),
414
+ bookmarkedUuidList: ie
415
+ }) : /* @__PURE__ */ e(C, {}), j = [
416
+ Se,
417
+ ze,
418
+ Be,
419
+ Me,
420
+ We,
421
+ Fe,
422
+ De,
423
+ Ie
392
424
  ].some(
393
- (r) => $ == null ? void 0 : $.includes(r)
394
- ), [re, F] = R(!1), oe = () => {
395
- F(!0);
396
- }, ne = () => {
397
- F(!1);
398
- }, s = q(null), g = q([]), [D, te] = R(t == null ? void 0 : t.length), ae = () => {
399
- var u, c, b;
400
- if (!(s != null && s.current) || ((u = g == null ? void 0 : g.current) == null ? void 0 : u.length) === 0) return;
425
+ (r) => E == null ? void 0 : E.includes(r)
426
+ ), [ce, G] = A(!1), le = () => {
427
+ G(!0);
428
+ }, de = () => {
429
+ G(!1);
430
+ }, s = Y(null), u = Y([]), [R, me] = A(t == null ? void 0 : t.length), pe = () => {
431
+ var h, c, w;
432
+ if (!(s != null && s.current) || ((h = u == null ? void 0 : u.current) == null ? void 0 : h.length) === 0) return;
401
433
  const r = (c = s == null ? void 0 : s.current) == null ? void 0 : c.offsetWidth;
402
434
  let o = 0, a = 0;
403
435
  for (let l = 0; l < (t == null ? void 0 : t.length); l++) {
404
- const h = ((b = g == null ? void 0 : g.current[l]) == null ? void 0 : b.offsetWidth) || 0, p = o + h + 4;
436
+ const f = ((w = u == null ? void 0 : u.current[l]) == null ? void 0 : w.offsetWidth) || 0, p = o + f + 4;
405
437
  if (p <= r)
406
438
  o += p, a++;
407
439
  else
408
440
  break;
409
441
  }
410
- te(a);
442
+ me(a);
411
443
  };
412
- de(() => {
444
+ ve(() => {
413
445
  const r = s == null ? void 0 : s.current;
414
446
  if (!r) return;
415
447
  const o = new ResizeObserver(() => {
416
- ae();
448
+ pe();
417
449
  });
418
450
  return o.observe(r), () => {
419
451
  o.disconnect();
420
452
  };
421
453
  }, [t]);
422
- const ie = () => {
454
+ const ge = () => {
423
455
  var r;
424
- return /* @__PURE__ */ e("div", { className: "tags-popover__trigger", children: (r = t == null ? void 0 : t.slice(0, D)) == null ? void 0 : r.map((o, a) => {
425
- var h, p, j, G, X;
426
- const u = ((h = i == null ? void 0 : i[o == null ? void 0 : o.code]) == null ? void 0 : h.icon) ?? ((p = i == null ? void 0 : i.default) == null ? void 0 : p.icon) ?? "", c = ((j = o == null ? void 0 : o.measurementUnit) == null ? void 0 : j.symbol) ?? ((G = i == null ? void 0 : i[o == null ? void 0 : o.code]) == null ? void 0 : G.measure) ?? "", l = [(o == null ? void 0 : o.value) ?? ((X = o == null ? void 0 : o.multiOptions) == null ? void 0 : X[0]) ?? "", c].filter(Boolean).join(" ");
427
- return O ? /* @__PURE__ */ n("div", { className: "tag-mobile", children: [
456
+ return /* @__PURE__ */ e("div", { className: "tags-popover__trigger", children: (r = t == null ? void 0 : t.slice(0, R)) == null ? void 0 : r.map((o, a) => {
457
+ var f, p, X, L, q;
458
+ const h = ((f = i == null ? void 0 : i[o == null ? void 0 : o.code]) == null ? void 0 : f.icon) ?? ((p = i == null ? void 0 : i.default) == null ? void 0 : p.icon) ?? "", c = ((X = o == null ? void 0 : o.measurementUnit) == null ? void 0 : X.symbol) ?? ((L = i == null ? void 0 : i[o == null ? void 0 : o.code]) == null ? void 0 : L.measure) ?? "", l = [(o == null ? void 0 : o.value) ?? ((q = o == null ? void 0 : o.multiOptions) == null ? void 0 : q[0]) ?? "", c].filter(Boolean).join(" ");
459
+ return z ? /* @__PURE__ */ n("div", { className: "tag-mobile", children: [
428
460
  l,
429
- a < D - 1 ? " · " : ""
461
+ a < R - 1 ? " · " : ""
430
462
  ] }) : /* @__PURE__ */ n(
431
463
  N,
432
464
  {
433
- ref: (le) => g.current[a] = le,
465
+ ref: (fe) => u.current[a] = fe,
434
466
  className: `tag ${M ? "tag-sponsored" : ""}`,
435
467
  children: [
436
- /* @__PURE__ */ e("i", { className: u }),
468
+ /* @__PURE__ */ e("i", { className: h }),
437
469
  l
438
470
  ]
439
471
  },
440
472
  `detailed-products-section-tag__${a + 1}`
441
473
  );
442
474
  }) });
443
- }, se = () => /* @__PURE__ */ e("div", { className: "tags-popover__content", children: t == null ? void 0 : t.map((r, o) => {
444
- var l, h, p;
445
- const a = ((l = r == null ? void 0 : r.measurementUnit) == null ? void 0 : l.symbol) ?? ((h = i == null ? void 0 : i[r == null ? void 0 : r.code]) == null ? void 0 : h.measure) ?? "", c = [(r == null ? void 0 : r.value) ?? ((p = r == null ? void 0 : r.multiOptions) == null ? void 0 : p[0]) ?? "", a].filter(Boolean).join(" "), b = r == null ? void 0 : r.name;
475
+ }, ue = () => /* @__PURE__ */ e("div", { className: "tags-popover__content", children: t == null ? void 0 : t.map((r, o) => {
476
+ var l, f, p;
477
+ const a = ((l = r == null ? void 0 : r.measurementUnit) == null ? void 0 : l.symbol) ?? ((f = i == null ? void 0 : i[r == null ? void 0 : r.code]) == null ? void 0 : f.measure) ?? "", c = [(r == null ? void 0 : r.value) ?? ((p = r == null ? void 0 : r.multiOptions) == null ? void 0 : p[0]) ?? "", a].filter(Boolean).join(" "), w = r == null ? void 0 : r.name;
446
478
  return /* @__PURE__ */ n("div", { children: [
447
- /* @__PURE__ */ e("span", { className: "tags-popover__name", children: `${b}: ` }),
479
+ /* @__PURE__ */ e("span", { className: "tags-popover__name", children: `${w}: ` }),
448
480
  /* @__PURE__ */ e("span", { className: "tags-popover__value", children: c })
449
481
  ] }, `detailed-products-section-tag-dropdown__${o + 1}`);
450
- }) }), ce = () => {
482
+ }) }), he = () => {
451
483
  var r;
452
- if (O) {
453
- const o = [T, V, E];
454
- return (r = o == null ? void 0 : o.filter((a) => ue(a))) == null ? void 0 : r.map((a, u, c) => /* @__PURE__ */ n("div", { className: "tag-mobile", children: [
484
+ if (z) {
485
+ const o = [V, O, S];
486
+ return (r = o == null ? void 0 : o.filter((a) => ye(a))) == null ? void 0 : r.map((a, h, c) => /* @__PURE__ */ n("div", { className: "tag-mobile", children: [
455
487
  a,
456
- u < (c == null ? void 0 : c.length) - 1 ? " · " : ""
488
+ h < (c == null ? void 0 : c.length) - 1 ? " · " : ""
457
489
  ] }));
458
490
  }
459
- return /* @__PURE__ */ n(S, { children: [
460
- T && /* @__PURE__ */ e(N, { className: "tag", children: T }, "detailed-products-section-tag__condition"),
461
- V && /* @__PURE__ */ e(N, { className: "tag", children: V }, "detailed-products-section-tag__quantity"),
462
- E && /* @__PURE__ */ e(N, { className: "tag", children: E }, "detailed-products-section-tag__trade")
491
+ return /* @__PURE__ */ n(C, { children: [
492
+ V && /* @__PURE__ */ e(N, { className: "tag", children: V }, "detailed-products-section-tag__condition"),
493
+ O && /* @__PURE__ */ e(N, { className: "tag", children: O }, "detailed-products-section-tag__quantity"),
494
+ S && /* @__PURE__ */ e(N, { className: "tag", children: S }, "detailed-products-section-tag__trade")
463
495
  ] });
464
- }, I = w > 0 && _ && C !== !0 && P !== !0 && w !== m;
496
+ }, U = g > 0 && _ && $ !== !0 && T !== !0 && g !== y;
465
497
  return (
466
498
  // <LandingPageProductCardSkeleton />
467
499
  /* @__PURE__ */ n(
468
- L,
500
+ x,
469
501
  {
470
502
  ref: s,
471
503
  className: "product-card",
472
- onClick: J,
504
+ onClick: oe,
473
505
  children: [
474
- /* @__PURE__ */ e(ye, { className: "product-image-wrapper", children: ge(W) ? W : /* @__PURE__ */ e(he, { src: H }) }),
475
- /* @__PURE__ */ e("div", { className: "wrapper-card-1", children: /* @__PURE__ */ e("div", { className: "card-title", children: v }) }),
506
+ /* @__PURE__ */ n(Te, { className: "product-image-wrapper", children: [
507
+ /* @__PURE__ */ e(se, {}),
508
+ H(W) ? W : /* @__PURE__ */ e(_e, { src: ee })
509
+ ] }),
510
+ /* @__PURE__ */ e("div", { className: "wrapper-card-1", children: /* @__PURE__ */ e("div", { className: "card-title", children: k }) }),
476
511
  /* @__PURE__ */ n("div", { className: "wrapper-card-3", children: [
477
- B && /* @__PURE__ */ e(
512
+ j && /* @__PURE__ */ e(
478
513
  "div",
479
514
  {
480
- ...O ? {} : {
481
- onMouseEnter: oe,
482
- onMouseLeave: ne
515
+ ...z ? {} : {
516
+ onMouseEnter: le,
517
+ onMouseLeave: de
483
518
  },
484
- children: /* @__PURE__ */ n(fe, { placement: "bottom", open: re, children: [
485
- /* @__PURE__ */ e(ve, { children: ie() }),
486
- /* @__PURE__ */ e(we, { style: { all: "unset" }, children: /* @__PURE__ */ e(_e, { children: se() }) })
519
+ children: /* @__PURE__ */ n(Ne, { placement: "bottom", open: ce, children: [
520
+ /* @__PURE__ */ e(Ce, { children: ge() }),
521
+ /* @__PURE__ */ e(Pe, { style: { all: "unset" }, children: /* @__PURE__ */ e(Ee, { children: ue() }) })
487
522
  ] })
488
523
  }
489
524
  ),
490
- !B && ce()
525
+ !j && he()
491
526
  ] }),
492
527
  /* @__PURE__ */ n("div", { className: "wrapper-card-2", children: [
493
- /* @__PURE__ */ n("div", { className: `price-text ${I ? "new-price" : ""}`, children: [
494
- m > 0 && _ && C !== !0 && P !== !0 && /* @__PURE__ */ e("div", { children: `${Y(m)} ${A(_)}` }),
495
- I && /* @__PURE__ */ e("div", { className: `${m > 0 ? "full-price" : ""}`, children: `${Y(w)} ${A(_)}` }),
496
- C && x,
497
- P && Q
528
+ /* @__PURE__ */ n("div", { className: `price-text ${U ? "new-price" : ""}`, children: [
529
+ y > 0 && _ && $ !== !0 && T !== !0 && /* @__PURE__ */ e("div", { children: `${Z(y)} ${J(_)}` }),
530
+ U && /* @__PURE__ */ e("div", { className: `${y > 0 ? "full-price" : ""}`, children: `${Z(g)} ${J(_)}` }),
531
+ $ && te,
532
+ T && ne
498
533
  ] }),
499
- /* @__PURE__ */ e("div", { className: "location-text", children: Z })
534
+ /* @__PURE__ */ e("div", { className: "location-text", children: re })
500
535
  ] }),
501
- M === !0 && /* @__PURE__ */ e(ke, { sponsoredText: ee })
536
+ M === !0 && /* @__PURE__ */ e(Oe, { sponsoredText: ae })
502
537
  ]
503
538
  }
504
539
  )
505
540
  );
506
- }), ze = z(({}, d) => /* @__PURE__ */ n(L, { className: "product-card", children: [
541
+ }), je = B(({}, d) => /* @__PURE__ */ n(x, { className: "product-card", children: [
507
542
  /* @__PURE__ */ e("img", { className: "skeleton-img" }),
508
543
  /* @__PURE__ */ n("div", { className: "wrapper-card-1", children: [
509
544
  /* @__PURE__ */ e("div", { className: "skeleton-title" }),
@@ -513,27 +548,27 @@ const L = k.div`
513
548
  /* @__PURE__ */ e("div", { className: "skeleton-price" }),
514
549
  /* @__PURE__ */ e("div", { className: "skeleton-sponsored" })
515
550
  ] })
516
- ] })), Me = ({ limit: d = 5, isLoading: f = !1, keyPrefix: v }) => /* @__PURE__ */ e(S, { children: Array.from({ length: d }, (w, m) => /* @__PURE__ */ e(
517
- ze,
551
+ ] })), Ge = ({ limit: d = 5, isLoading: v = !1, keyPrefix: m }) => /* @__PURE__ */ e(C, { children: Array.from({ length: d }, (k, g) => /* @__PURE__ */ e(
552
+ je,
518
553
  {
519
- isLoading: f
554
+ isLoading: v
520
555
  },
521
- `${v}-skeleton-product-card-${m}`
522
- )) }), Ke = ({
556
+ `${m}-skeleton-product-card-${g}`
557
+ )) }), er = ({
523
558
  children: d,
524
- fallbackComponent: f = /* @__PURE__ */ e(S, {}),
525
- isLoading: v = !1,
526
- limit: w,
527
- keyPrefix: m
528
- }) => /* @__PURE__ */ e(me, { fallbackComponent: f, children: v === !0 ? /* @__PURE__ */ e(
529
- Me,
559
+ fallbackComponent: v = /* @__PURE__ */ e(C, {}),
560
+ isLoading: m = !1,
561
+ limit: k,
562
+ keyPrefix: g
563
+ }) => /* @__PURE__ */ e(be, { fallbackComponent: v, children: m === !0 ? /* @__PURE__ */ e(
564
+ Ge,
530
565
  {
531
- isLoading: v,
532
- limit: w,
533
- keyPrefix: m
566
+ isLoading: m,
567
+ limit: k,
568
+ keyPrefix: g
534
569
  }
535
570
  ) : d });
536
571
  export {
537
- Ae as D,
538
- Ke as S
572
+ xe as D,
573
+ er as S
539
574
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lanaco/lnc-react-ui",
3
- "version": "4.0.140",
3
+ "version": "4.0.141",
4
4
  "description": "React component library",
5
5
  "type": "module",
6
6
  "keywords": [