@tesouro/embedded-components-react 0.2.322 → 0.2.324

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 (17) hide show
  1. package/dist/index.css +125 -0
  2. package/dist/index.d.ts +19 -0
  3. package/dist/lib/CardDetailsWidget.d.ts +19 -0
  4. package/dist/lib/CardsWidget.d.ts +19 -0
  5. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/index.js +1 -1
  6. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardCredentialRow.js +29 -0
  7. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardCredentialsFace.js +38 -0
  8. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardDetailsHeader.js +5 -5
  9. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardDetailsPanel.js +111 -76
  10. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFace.js +20 -21
  11. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFaceFlip.js +27 -0
  12. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFaceGlow.js +10 -0
  13. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/cardFaceSurface.js +4 -0
  14. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/labels.js +18 -1
  15. package/dist/libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/testIds.js +2 -0
  16. package/dist/libs/tesouro-embedded-components-react/shared/feature/dist/lib/analytics/build-info.js +1 -1
  17. package/package.json +2 -1
package/dist/index.css CHANGED
@@ -94,6 +94,7 @@
94
94
  --ttw-color-neutral-200: oklch(92.2% 0 none);
95
95
  --ttw-color-neutral-400: oklch(70.8% 0 none);
96
96
  --ttw-color-neutral-700: oklch(37.1% 0 none);
97
+ --ttw-color-stone-200: oklch(92.3% 0.003 48.717);
97
98
  --ttw-color-black: #000;
98
99
  --ttw-color-white: #fff;
99
100
  --ttw-spacing: 0.25rem;
@@ -570,6 +571,12 @@
570
571
  .ttw\:field-sizing-content {
571
572
  field-sizing: content;
572
573
  }
574
+ .ttw\:aspect-\[2\.4\/1\] {
575
+ aspect-ratio: 2.4/1;
576
+ }
577
+ .ttw\:aspect-\[4\/3\] {
578
+ aspect-ratio: 4/3;
579
+ }
573
580
  .ttw\:aspect-square {
574
581
  aspect-ratio: 1 / 1;
575
582
  }
@@ -824,6 +831,9 @@
824
831
  .ttw\:h-\[min\(70vh\,44rem\)\] {
825
832
  height: min(70vh, 44rem);
826
833
  }
834
+ .ttw\:h-\[min\(390px\,90vh\)\] {
835
+ height: min(390px, 90vh);
836
+ }
827
837
  .ttw\:h-\[min\(720px\,90vh\)\] {
828
838
  height: min(720px, 90vh);
829
839
  }
@@ -1199,6 +1209,9 @@
1199
1209
  .ttw\:w-\[60\%\] {
1200
1210
  width: 60%;
1201
1211
  }
1212
+ .ttw\:w-\[82\%\] {
1213
+ width: 82%;
1214
+ }
1202
1215
  .ttw\:w-\[83\%\] {
1203
1216
  width: 83%;
1204
1217
  }
@@ -1253,6 +1266,9 @@
1253
1266
  .ttw\:w-\[min\(390px\,100\%\)\] {
1254
1267
  width: min(390px, 100%);
1255
1268
  }
1269
+ .ttw\:w-\[min\(720px\,100\%\)\] {
1270
+ width: min(720px, 100%);
1271
+ }
1256
1272
  .ttw\:w-\[var\(--radix-popover-trigger-width\)\] {
1257
1273
  width: var(--radix-popover-trigger-width);
1258
1274
  }
@@ -1286,6 +1302,9 @@
1286
1302
  .ttw\:max-w-2xl {
1287
1303
  max-width: var(--ttw-container-2xl);
1288
1304
  }
1305
+ .ttw\:max-w-3xl {
1306
+ max-width: var(--ttw-container-3xl);
1307
+ }
1289
1308
  .ttw\:max-w-29 {
1290
1309
  max-width: calc(var(--ttw-spacing) * 29);
1291
1310
  }
@@ -1583,6 +1602,10 @@
1583
1602
  .ttw\:rotate-45 {
1584
1603
  rotate: 45deg;
1585
1604
  }
1605
+ .ttw\:rotate-y-180 {
1606
+ --tw-rotate-y: rotateY(180deg);
1607
+ transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
1608
+ }
1586
1609
  .ttw\:\[transform\:translateZ\(0\)\] {
1587
1610
  transform: translateZ(0);
1588
1611
  }
@@ -2066,10 +2089,18 @@
2066
2089
  border-top-style: var(--tw-border-style);
2067
2090
  border-top-width: 1px;
2068
2091
  }
2092
+ .ttw\:border-t-2 {
2093
+ border-top-style: var(--tw-border-style);
2094
+ border-top-width: 2px;
2095
+ }
2069
2096
  .ttw\:border-r {
2070
2097
  border-right-style: var(--tw-border-style);
2071
2098
  border-right-width: 1px;
2072
2099
  }
2100
+ .ttw\:border-r-2 {
2101
+ border-right-style: var(--tw-border-style);
2102
+ border-right-width: 2px;
2103
+ }
2073
2104
  .ttw\:border-b {
2074
2105
  border-bottom-style: var(--tw-border-style);
2075
2106
  border-bottom-width: 1px;
@@ -2086,6 +2117,10 @@
2086
2117
  border-left-style: var(--tw-border-style);
2087
2118
  border-left-width: 1px;
2088
2119
  }
2120
+ .ttw\:border-l-2 {
2121
+ border-left-style: var(--tw-border-style);
2122
+ border-left-width: 2px;
2123
+ }
2089
2124
  .ttw\:\!border-none {
2090
2125
  --tw-border-style: none !important;
2091
2126
  border-style: none !important;
@@ -2544,6 +2579,9 @@
2544
2579
  .ttw\:bg-sidebar-border {
2545
2580
  background-color: var(--ttw-sidebar-border);
2546
2581
  }
2582
+ .ttw\:bg-stone-200 {
2583
+ background-color: var(--ttw-color-stone-200);
2584
+ }
2547
2585
  .ttw\:bg-surface-subtle {
2548
2586
  background-color: var(--ttw-surface-subtle);
2549
2587
  }
@@ -2565,6 +2603,12 @@
2565
2603
  background-color: color-mix(in oklab, var(--ttw-color-white) 70%, transparent);
2566
2604
  }
2567
2605
  }
2606
+ .ttw\:bg-white\/90 {
2607
+ background-color: var(--ttw-color-white);
2608
+ @supports (color: color-mix(in lab, red, red)) {
2609
+ background-color: color-mix(in oklab, var(--ttw-color-white) 90%, transparent);
2610
+ }
2611
+ }
2568
2612
  .ttw\:bg-yellow-50 {
2569
2613
  background-color: var(--ttw-color-yellow-50);
2570
2614
  }
@@ -2589,6 +2633,9 @@
2589
2633
  .ttw\:bg-zinc-700 {
2590
2634
  background-color: var(--ttw-color-zinc-700);
2591
2635
  }
2636
+ .ttw\:bg-zinc-900 {
2637
+ background-color: var(--ttw-color-zinc-900);
2638
+ }
2592
2639
  .ttw\:bg-gradient-to-b {
2593
2640
  --tw-gradient-position: to bottom in oklab;
2594
2641
  background-image: linear-gradient(var(--tw-gradient-stops));
@@ -2925,6 +2972,9 @@
2925
2972
  .ttw\:pr-16 {
2926
2973
  padding-right: calc(var(--ttw-spacing) * 16);
2927
2974
  }
2975
+ .ttw\:pr-24 {
2976
+ padding-right: calc(var(--ttw-spacing) * 24);
2977
+ }
2928
2978
  .ttw\:pb-0 {
2929
2979
  padding-bottom: 0px;
2930
2980
  }
@@ -3180,6 +3230,10 @@
3180
3230
  --tw-tracking: -0.75px;
3181
3231
  letter-spacing: -0.75px;
3182
3232
  }
3233
+ .ttw\:tracking-\[0\.2em\] {
3234
+ --tw-tracking: 0.2em;
3235
+ letter-spacing: 0.2em;
3236
+ }
3183
3237
  .ttw\:tracking-\[0\.125rem\] {
3184
3238
  --tw-tracking: 0.125rem;
3185
3239
  letter-spacing: 0.125rem;
@@ -3413,6 +3467,12 @@
3413
3467
  .ttw\:text-white {
3414
3468
  color: var(--ttw-color-white);
3415
3469
  }
3470
+ .ttw\:text-white\/70 {
3471
+ color: var(--ttw-color-white);
3472
+ @supports (color: color-mix(in lab, red, red)) {
3473
+ color: color-mix(in oklab, var(--ttw-color-white) 70%, transparent);
3474
+ }
3475
+ }
3416
3476
  .ttw\:text-white\/90 {
3417
3477
  color: var(--ttw-color-white);
3418
3478
  @supports (color: color-mix(in lab, red, red)) {
@@ -3449,6 +3509,9 @@
3449
3509
  .ttw\:normal-case {
3450
3510
  text-transform: none;
3451
3511
  }
3512
+ .ttw\:uppercase {
3513
+ text-transform: uppercase;
3514
+ }
3452
3515
  .ttw\:not-italic {
3453
3516
  font-style: normal;
3454
3517
  }
@@ -3738,6 +3801,15 @@
3738
3801
  .ttw\:\[--cell-size\:--spacing\(8\)\] {
3739
3802
  --cell-size: calc(var(--ttw-spacing) * 8);
3740
3803
  }
3804
+ .ttw\:backface-hidden {
3805
+ backface-visibility: hidden;
3806
+ }
3807
+ .ttw\:perspective-\[1000px\] {
3808
+ perspective: 1000px;
3809
+ }
3810
+ .ttw\:transform-3d {
3811
+ transform-style: preserve-3d;
3812
+ }
3741
3813
  .ttw\:group-focus-within\/menu-item\:opacity-100:is(:where(.ttw\:group\/menu-item):focus-within *) {
3742
3814
  opacity: 100%;
3743
3815
  }
@@ -4334,6 +4406,14 @@
4334
4406
  .ttw\:hover\:bg-transparent:hover {
4335
4407
  background-color: transparent;
4336
4408
  }
4409
+ .ttw\:hover\:bg-white\/10:hover {
4410
+ background-color: var(--ttw-color-white);
4411
+ }
4412
+ @supports (color: color-mix(in lab, red, red)) {
4413
+ .ttw\:hover\:bg-white\/10:hover {
4414
+ background-color: color-mix(in oklab, var(--ttw-color-white) 10%, transparent);
4415
+ }
4416
+ }
4337
4417
  .ttw\:hover\:bg-zinc-50:hover {
4338
4418
  background-color: var(--ttw-color-zinc-50);
4339
4419
  }
@@ -4511,6 +4591,15 @@
4511
4591
  --tw-ring-color: color-mix(in oklab, var(--ttw-ring) 50%, transparent);
4512
4592
  }
4513
4593
  }
4594
+ .ttw\:focus-visible\:ring-white:focus-visible {
4595
+ --tw-ring-color: var(--ttw-color-white);
4596
+ }
4597
+ .ttw\:focus-visible\:ring-white\/70:focus-visible {
4598
+ --tw-ring-color: var(--ttw-color-white);
4599
+ @supports (color: color-mix(in lab, red, red)) {
4600
+ --tw-ring-color: color-mix(in oklab, var(--ttw-color-white) 70%, transparent);
4601
+ }
4602
+ }
4514
4603
  .ttw\:focus-visible\:ring-zinc-400\/50:focus-visible {
4515
4604
  --tw-ring-color: var(--ttw-color-zinc-400);
4516
4605
  @supports (color: color-mix(in lab, red, red)) {
@@ -5379,6 +5468,17 @@
5379
5468
  .ttw\:nth-last-2\:-mt-1:nth-last-child(2) {
5380
5469
  margin-top: calc(var(--ttw-spacing) * -1);
5381
5470
  }
5471
+ @media (prefers-reduced-motion: no-preference) {
5472
+ .ttw\:motion-safe\:transition-transform {
5473
+ transition-property: transform, translate, scale, rotate;
5474
+ transition-timing-function: var(--tw-ease, var(--ttw-default-transition-timing-function));
5475
+ transition-duration: var(--tw-duration, var(--ttw-default-transition-duration));
5476
+ }
5477
+ .ttw\:motion-safe\:duration-500 {
5478
+ --tw-duration: 500ms;
5479
+ transition-duration: 500ms;
5480
+ }
5481
+ }
5382
5482
  @media (width >= 40rem) {
5383
5483
  .ttw\:sm\:flex {
5384
5484
  display: flex;
@@ -6365,6 +6465,26 @@
6365
6465
  inherits: false;
6366
6466
  initial-value: 0;
6367
6467
  }
6468
+ @property --tw-rotate-x {
6469
+ syntax: "*";
6470
+ inherits: false;
6471
+ }
6472
+ @property --tw-rotate-y {
6473
+ syntax: "*";
6474
+ inherits: false;
6475
+ }
6476
+ @property --tw-rotate-z {
6477
+ syntax: "*";
6478
+ inherits: false;
6479
+ }
6480
+ @property --tw-skew-x {
6481
+ syntax: "*";
6482
+ inherits: false;
6483
+ }
6484
+ @property --tw-skew-y {
6485
+ syntax: "*";
6486
+ inherits: false;
6487
+ }
6368
6488
  @property --tw-space-y-reverse {
6369
6489
  syntax: "*";
6370
6490
  inherits: false;
@@ -6641,6 +6761,11 @@
6641
6761
  --tw-translate-x: 0;
6642
6762
  --tw-translate-y: 0;
6643
6763
  --tw-translate-z: 0;
6764
+ --tw-rotate-x: initial;
6765
+ --tw-rotate-y: initial;
6766
+ --tw-rotate-z: initial;
6767
+ --tw-skew-x: initial;
6768
+ --tw-skew-y: initial;
6644
6769
  --tw-space-y-reverse: 0;
6645
6770
  --tw-space-x-reverse: 0;
6646
6771
  --tw-divide-y-reverse: 0;
package/dist/index.d.ts CHANGED
@@ -2067,6 +2067,24 @@ interface CardDetailsFieldLabels {
2067
2067
  interface CardDetailsActionLabels {
2068
2068
  /** Primary control that opens the Activate Card form. */
2069
2069
  activateCard: string;
2070
+ /** Secondary control that asks the owner to reveal the card's credentials. */
2071
+ viewCard: string;
2072
+ /** The same control, once the credentials are on screen. */
2073
+ hideCard: string;
2074
+ }
2075
+ /**
2076
+ * Copy for the revealed card credentials. The values themselves never have a
2077
+ * default here — the panel is handed them or renders the field blank.
2078
+ */
2079
+ interface CardDetailsCredentialsLabels {
2080
+ cardNumber: string;
2081
+ expirationDate: string;
2082
+ securityCode: string;
2083
+ copyCardNumberAriaLabel: string;
2084
+ copyExpirationDateAriaLabel: string;
2085
+ copySecurityCodeAriaLabel: string;
2086
+ /** Shown next to the control when the reveal failed. */
2087
+ errorDescription: string;
2070
2088
  }
2071
2089
  /** Copy for the three non-loaded screens. */
2072
2090
  interface CardDetailsStatusScreenLabels {
@@ -2083,6 +2101,7 @@ interface CardDetailsPanelLabels {
2083
2101
  cardFace: CardDetailsCardFaceLabels;
2084
2102
  fields: CardDetailsFieldLabels;
2085
2103
  actions: CardDetailsActionLabels;
2104
+ credentials: CardDetailsCredentialsLabels;
2086
2105
  status: CardDetailsStatusScreenLabels;
2087
2106
  }
2088
2107
 
@@ -32,6 +32,24 @@ interface CardDetailsFieldLabels {
32
32
  interface CardDetailsActionLabels {
33
33
  /** Primary control that opens the Activate Card form. */
34
34
  activateCard: string;
35
+ /** Secondary control that asks the owner to reveal the card's credentials. */
36
+ viewCard: string;
37
+ /** The same control, once the credentials are on screen. */
38
+ hideCard: string;
39
+ }
40
+ /**
41
+ * Copy for the revealed card credentials. The values themselves never have a
42
+ * default here — the panel is handed them or renders the field blank.
43
+ */
44
+ interface CardDetailsCredentialsLabels {
45
+ cardNumber: string;
46
+ expirationDate: string;
47
+ securityCode: string;
48
+ copyCardNumberAriaLabel: string;
49
+ copyExpirationDateAriaLabel: string;
50
+ copySecurityCodeAriaLabel: string;
51
+ /** Shown next to the control when the reveal failed. */
52
+ errorDescription: string;
35
53
  }
36
54
  /** Copy for the three non-loaded screens. */
37
55
  interface CardDetailsStatusScreenLabels {
@@ -48,6 +66,7 @@ interface CardDetailsPanelLabels {
48
66
  cardFace: CardDetailsCardFaceLabels;
49
67
  fields: CardDetailsFieldLabels;
50
68
  actions: CardDetailsActionLabels;
69
+ credentials: CardDetailsCredentialsLabels;
51
70
  status: CardDetailsStatusScreenLabels;
52
71
  }
53
72
 
@@ -758,6 +758,24 @@ interface CardDetailsFieldLabels {
758
758
  interface CardDetailsActionLabels {
759
759
  /** Primary control that opens the Activate Card form. */
760
760
  activateCard: string;
761
+ /** Secondary control that asks the owner to reveal the card's credentials. */
762
+ viewCard: string;
763
+ /** The same control, once the credentials are on screen. */
764
+ hideCard: string;
765
+ }
766
+ /**
767
+ * Copy for the revealed card credentials. The values themselves never have a
768
+ * default here — the panel is handed them or renders the field blank.
769
+ */
770
+ interface CardDetailsCredentialsLabels {
771
+ cardNumber: string;
772
+ expirationDate: string;
773
+ securityCode: string;
774
+ copyCardNumberAriaLabel: string;
775
+ copyExpirationDateAriaLabel: string;
776
+ copySecurityCodeAriaLabel: string;
777
+ /** Shown next to the control when the reveal failed. */
778
+ errorDescription: string;
761
779
  }
762
780
  /** Copy for the three non-loaded screens. */
763
781
  interface CardDetailsStatusScreenLabels {
@@ -774,6 +792,7 @@ interface CardDetailsPanelLabels {
774
792
  cardFace: CardDetailsCardFaceLabels;
775
793
  fields: CardDetailsFieldLabels;
776
794
  actions: CardDetailsActionLabels;
795
+ credentials: CardDetailsCredentialsLabels;
777
796
  status: CardDetailsStatusScreenLabels;
778
797
  }
779
798
 
@@ -1,5 +1,5 @@
1
- import "./lib/CardDetailsPanel/statusBadge.js";
2
1
  import "./lib/CardDetailsPanel/testIds.js";
2
+ import "./lib/CardDetailsPanel/statusBadge.js";
3
3
  import "./lib/CardDetailsPanel/CardDetailsHeader.js";
4
4
  import "./lib/CardDetailsPanel/CardFace.js";
5
5
  import "./lib/CardDetailsPanel/DetailCopyRow.js";
@@ -0,0 +1,29 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ import { CopyIcon as n } from "lucide-react";
3
+ //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardCredentialRow.js
4
+ function r({ label: r, value: i, copyAriaLabel: a, onCopy: o }) {
5
+ return /* @__PURE__ */ t("div", {
6
+ className: "ttw:relative ttw:flex ttw:min-w-0 ttw:items-end ttw:justify-between ttw:gap-2",
7
+ children: [/* @__PURE__ */ t("div", {
8
+ className: "ttw:min-w-0",
9
+ children: [/* @__PURE__ */ e("p", {
10
+ className: "ttw:text-[10px] ttw:font-medium ttw:tracking-wide ttw:text-white/70 ttw:uppercase",
11
+ children: r
12
+ }), /* @__PURE__ */ e("p", {
13
+ className: "ttw:mt-0.5 ttw:truncate ttw:text-base ttw:tracking-wide ttw:text-white",
14
+ children: i
15
+ })]
16
+ }), i && o ? /* @__PURE__ */ e("button", {
17
+ type: "button",
18
+ "aria-label": a,
19
+ onClick: () => o(i),
20
+ className: "ttw:inline-flex ttw:size-7 ttw:shrink-0 ttw:cursor-pointer ttw:items-center ttw:justify-center ttw:rounded-md ttw:text-white/70 ttw:transition-colors ttw:hover:bg-white/10 ttw:hover:text-white ttw:focus-visible:ring-2 ttw:focus-visible:ring-white/70 ttw:focus-visible:outline-none",
21
+ children: /* @__PURE__ */ e(n, {
22
+ className: "ttw:size-3.5",
23
+ "aria-hidden": "true"
24
+ })
25
+ }) : null]
26
+ });
27
+ }
28
+ //#endregion
29
+ export { r as CardCredentialRow };
@@ -0,0 +1,38 @@
1
+ import { cn as e } from "../../../../../../../packages/shared-ui-shadcn/dist/index.js";
2
+ import { cardDetailsWidgetUiTestIds as t } from "./testIds.js";
3
+ import { CARD_FACE_SURFACE_CLASS_NAME as n } from "./cardFaceSurface.js";
4
+ import { CardFaceGlow as r } from "./CardFaceGlow.js";
5
+ import { CardCredentialRow as i } from "./CardCredentialRow.js";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardCredentialsFace.js
8
+ function s({ labels: s, cardNumber: c, expirationDate: l, securityCode: u, onCopy: d, className: f }) {
9
+ return /* @__PURE__ */ o("div", {
10
+ "data-testid": t.credentialsFace,
11
+ className: e(n, "ttw:justify-center ttw:gap-4", f),
12
+ children: [
13
+ /* @__PURE__ */ a(r, {}),
14
+ /* @__PURE__ */ a(i, {
15
+ label: s.cardNumber,
16
+ value: c,
17
+ copyAriaLabel: s.copyCardNumberAriaLabel,
18
+ onCopy: d
19
+ }),
20
+ /* @__PURE__ */ o("div", {
21
+ className: "ttw:relative ttw:grid ttw:grid-cols-2 ttw:gap-3",
22
+ children: [/* @__PURE__ */ a(i, {
23
+ label: s.expirationDate,
24
+ value: l,
25
+ copyAriaLabel: s.copyExpirationDateAriaLabel,
26
+ onCopy: d
27
+ }), /* @__PURE__ */ a(i, {
28
+ label: s.securityCode,
29
+ value: u,
30
+ copyAriaLabel: s.copySecurityCodeAriaLabel,
31
+ onCopy: d
32
+ })]
33
+ })
34
+ ]
35
+ });
36
+ }
37
+ //#endregion
38
+ export { s as CardCredentialsFace };
@@ -1,6 +1,6 @@
1
1
  import { Badge as e, Button as t, DropdownMenu as n, DropdownMenuContent as r, DropdownMenuTrigger as i, Skeleton as a } from "../../../../../../../packages/shared-ui-shadcn/dist/index.js";
2
- import { cardStatusToneClassName as o } from "./statusBadge.js";
3
- import { cardDetailsWidgetUiTestIds as s } from "./testIds.js";
2
+ import { cardDetailsWidgetUiTestIds as o } from "./testIds.js";
3
+ import { cardStatusToneClassName as s } from "./statusBadge.js";
4
4
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
5
  import { EllipsisVerticalIcon as u, XIcon as d } from "lucide-react";
6
6
  //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardDetailsHeader.js
@@ -16,7 +16,7 @@ function f({ labels: f, title: p, isTitlePending: m, statusLabel: h, statusTone:
16
16
  className: "ttw:truncate ttw:text-2xl ttw:font-semibold ttw:tracking-[-0.6px] ttw:text-foreground",
17
17
  children: p
18
18
  }) : null, h ? /* @__PURE__ */ c(e, {
19
- className: o(g ?? "neutral"),
19
+ className: s(g ?? "neutral"),
20
20
  children: h
21
21
  }) : null]
22
22
  }), _ ? /* @__PURE__ */ c("p", {
@@ -32,7 +32,7 @@ function f({ labels: f, title: p, isTitlePending: m, statusLabel: h, statusTone:
32
32
  size: "icon",
33
33
  className: "ttw:size-8 ttw:shrink-0 ttw:bg-muted",
34
34
  "aria-label": f.menuTriggerAriaLabel,
35
- "data-testid": s.menuTrigger,
35
+ "data-testid": o.menuTrigger,
36
36
  children: /* @__PURE__ */ c(u, { className: "ttw:size-4" })
37
37
  })
38
38
  }), /* @__PURE__ */ c(r, {
@@ -45,7 +45,7 @@ function f({ labels: f, title: p, isTitlePending: m, statusLabel: h, statusTone:
45
45
  size: "icon",
46
46
  className: "ttw:size-8 ttw:shrink-0",
47
47
  "aria-label": f.closeAriaLabel,
48
- "data-testid": s.closeButton,
48
+ "data-testid": o.closeButton,
49
49
  onClick: y,
50
50
  children: /* @__PURE__ */ c(d, { className: "ttw:size-4" })
51
51
  }) : null
@@ -5,97 +5,132 @@
5
5
  import { Badge as e, Button as t, Skeleton as n, cn as r } from "../../../../../../../packages/shared-ui-shadcn/dist/index.js";
6
6
  import { EmptyState as i } from "../../../../../shared/ui/dist/lib/EmptyState/EmptyState.js";
7
7
  import { ErrorState as a } from "../../../../../shared/ui/dist/lib/ErrorState/ErrorState.js";
8
+ import { InlineErrorAlert as o } from "../../../../../shared/ui/dist/lib/InlineErrorAlert/InlineErrorAlert.js";
8
9
  import "../../../../../shared/ui/dist/index.js";
9
- import { cardDetailsWidgetUiTestIds as o } from "./testIds.js";
10
- import { CardDetailsHeader as s } from "./CardDetailsHeader.js";
11
- import { CardFace as c } from "./CardFace.js";
12
- import { DetailCopyRow as l } from "./DetailCopyRow.js";
13
- import { resolveCardDetailsPanelLabels as u } from "./labels.js";
14
- import { useMemo as d } from "react";
15
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
16
- import { CreditCardIcon as m, PowerIcon as h } from "lucide-react";
10
+ import { cardDetailsWidgetUiTestIds as s } from "./testIds.js";
11
+ import { CardDetailsHeader as c } from "./CardDetailsHeader.js";
12
+ import { CARD_FACE_WIDTH_CLASS_NAME as l } from "./cardFaceSurface.js";
13
+ import { CardFace as u } from "./CardFace.js";
14
+ import { DetailCopyRow as d } from "./DetailCopyRow.js";
15
+ import { resolveCardDetailsPanelLabels as f } from "./labels.js";
16
+ import { CardCredentialsFace as p } from "./CardCredentialsFace.js";
17
+ import { CardFaceFlip as m } from "./CardFaceFlip.js";
18
+ import { useMemo as h } from "react";
19
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
20
+ import { CreditCardIcon as v, EyeIcon as y, EyeOffIcon as b, PowerIcon as x } from "lucide-react";
17
21
  //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardDetailsPanel.js
18
- function g({ labels: g, state: _, nickname: v, statusLabel: y, statusTone: b, formFactorLabel: x, cardMenu: S, onClose: C, bankLogoSrc: w, bankLogoAlt: T, cardholderName: E, maskedCardNumber: D, programLabel: O, billingAddress: k, allowedCategories: A, onCopy: j, onActivate: M, onRetry: N, className: P }) {
19
- let F = d(() => u(g), [g]), I = !!A?.length;
20
- return /* @__PURE__ */ p("div", {
21
- "data-testid": o.panel,
22
- className: r("ttw:flex ttw:w-full ttw:flex-col", P),
23
- children: [/* @__PURE__ */ f(s, {
24
- labels: F.header,
25
- title: _ === "loaded" ? v ?? F.header.untitledCard : void 0,
26
- isTitlePending: _ === "loading",
27
- statusLabel: _ === "loaded" ? y : void 0,
28
- statusTone: b,
29
- formFactorLabel: _ === "loaded" ? x : void 0,
30
- cardMenu: _ === "loaded" ? S : void 0,
31
- onClose: C
32
- }), /* @__PURE__ */ f("div", {
22
+ function S({ labels: S, state: C, nickname: w, statusLabel: T, statusTone: E, formFactorLabel: D, cardMenu: O, onClose: k, bankLogoSrc: A, bankLogoAlt: j, cardholderName: M, maskedCardNumber: N, programLabel: P, billingAddress: F, allowedCategories: I, onCopy: L, onActivate: R, onViewCard: z, onHideCard: B, isViewCardDisabled: V, revealState: H = "hidden", revealedCardNumber: U, revealedExpirationDate: W, revealedSecurityCode: G, onRetry: K, className: q }) {
23
+ let J = h(() => f(S), [S]), Y = !!I?.length, X = H === "revealed", Z = X ? B : z, Q = /* @__PURE__ */ g(u, {
24
+ bankLogoSrc: A,
25
+ bankLogoAlt: j ?? J.cardFace.bankLogoAlt,
26
+ cardholderName: M ?? "",
27
+ maskedCardNumber: N ?? "",
28
+ programLabel: P ?? ""
29
+ });
30
+ return /* @__PURE__ */ _("div", {
31
+ "data-testid": s.panel,
32
+ className: r("ttw:flex ttw:w-full ttw:flex-col", q),
33
+ children: [/* @__PURE__ */ g(c, {
34
+ labels: J.header,
35
+ title: C === "loaded" ? w ?? J.header.untitledCard : void 0,
36
+ isTitlePending: C === "loading",
37
+ statusLabel: C === "loaded" ? T : void 0,
38
+ statusTone: E,
39
+ formFactorLabel: C === "loaded" ? D : void 0,
40
+ cardMenu: C === "loaded" ? O : void 0,
41
+ onClose: k
42
+ }), /* @__PURE__ */ g("div", {
33
43
  className: "ttw:px-4 ttw:pb-4",
34
- children: _ === "loading" ? /* @__PURE__ */ p("div", {
35
- "data-testid": o.loading,
44
+ children: C === "loading" ? /* @__PURE__ */ _("div", {
45
+ "data-testid": s.loading,
36
46
  role: "status",
37
- "aria-label": F.status.loadingAriaLabel,
47
+ "aria-label": J.status.loadingAriaLabel,
38
48
  className: "ttw:space-y-4",
39
- children: [/* @__PURE__ */ f(n, { className: "ttw:h-8 ttw:w-56" }), /* @__PURE__ */ f(n, { className: "ttw:h-64 ttw:w-full ttw:rounded-xl" })]
40
- }) : _ === "error" ? /* @__PURE__ */ f(a, {
41
- title: F.status.errorTitle,
42
- description: F.status.errorDescription,
43
- retryLabel: F.status.errorRetry,
44
- onRetry: N
45
- }) : _ === "notFound" ? /* @__PURE__ */ f(i, {
46
- icon: /* @__PURE__ */ f(m, { className: "ttw:size-6 ttw:text-muted-foreground" }),
47
- title: F.status.notFoundTitle,
48
- description: F.status.notFoundDescription
49
- }) : /* @__PURE__ */ p("div", {
49
+ children: [/* @__PURE__ */ g(n, { className: "ttw:h-8 ttw:w-56" }), /* @__PURE__ */ g(n, { className: "ttw:h-64 ttw:w-full ttw:rounded-xl" })]
50
+ }) : C === "error" ? /* @__PURE__ */ g(a, {
51
+ title: J.status.errorTitle,
52
+ description: J.status.errorDescription,
53
+ retryLabel: J.status.errorRetry,
54
+ onRetry: K
55
+ }) : C === "notFound" ? /* @__PURE__ */ g(i, {
56
+ icon: /* @__PURE__ */ g(v, { className: "ttw:size-6 ttw:text-muted-foreground" }),
57
+ title: J.status.notFoundTitle,
58
+ description: J.status.notFoundDescription
59
+ }) : /* @__PURE__ */ _("div", {
50
60
  className: "ttw:flex ttw:flex-col ttw:overflow-hidden ttw:rounded-xl ttw:border ttw:border-border ttw:sm:flex-row",
51
- children: [/* @__PURE__ */ f("div", {
61
+ children: [/* @__PURE__ */ g("div", {
52
62
  className: "ttw:flex ttw:items-center ttw:justify-center ttw:bg-muted ttw:px-4 ttw:py-5",
53
- children: /* @__PURE__ */ p("div", {
54
- className: "ttw:flex ttw:flex-col ttw:gap-4",
55
- children: [/* @__PURE__ */ f(c, {
56
- bankLogoSrc: w,
57
- bankLogoAlt: T ?? F.cardFace.bankLogoAlt,
58
- cardholderName: E ?? "",
59
- maskedCardNumber: D ?? "",
60
- programLabel: O ?? ""
61
- }), M ? /* @__PURE__ */ p(t, {
62
- type: "button",
63
- onClick: M,
64
- children: [/* @__PURE__ */ f(h, {
65
- className: "ttw:size-4",
66
- "aria-hidden": "true"
67
- }), F.actions.activateCard]
63
+ children: /* @__PURE__ */ _("div", {
64
+ className: r("ttw:flex ttw:flex-col ttw:gap-4", l),
65
+ children: [z ? /* @__PURE__ */ g(m, {
66
+ isFlipped: X,
67
+ front: Q,
68
+ back: /* @__PURE__ */ g(p, {
69
+ labels: J.credentials,
70
+ cardNumber: U,
71
+ expirationDate: W,
72
+ securityCode: G,
73
+ onCopy: L
74
+ })
75
+ }) : Q, R || z ? /* @__PURE__ */ _("div", {
76
+ className: "ttw:flex ttw:flex-col ttw:gap-2",
77
+ children: [
78
+ R ? /* @__PURE__ */ _(t, {
79
+ type: "button",
80
+ onClick: R,
81
+ children: [/* @__PURE__ */ g(x, {
82
+ className: "ttw:size-4",
83
+ "aria-hidden": "true"
84
+ }), J.actions.activateCard]
85
+ }) : null,
86
+ z ? /* @__PURE__ */ g("div", {
87
+ className: "ttw:flex ttw:gap-2",
88
+ children: /* @__PURE__ */ _(t, {
89
+ type: "button",
90
+ variant: "outline",
91
+ className: "ttw:flex-1",
92
+ disabled: V || !Z,
93
+ loading: H === "revealing",
94
+ onClick: Z,
95
+ children: [g(X ? b : y, {
96
+ className: "ttw:size-4",
97
+ "aria-hidden": "true"
98
+ }), X ? J.actions.hideCard : J.actions.viewCard]
99
+ })
100
+ }) : null,
101
+ H === "errored" ? /* @__PURE__ */ g(o, { children: J.credentials.errorDescription }) : null
102
+ ]
68
103
  }) : null]
69
104
  })
70
- }), /* @__PURE__ */ p("div", {
105
+ }), /* @__PURE__ */ _("div", {
71
106
  className: "ttw:flex ttw:min-w-0 ttw:flex-1 ttw:flex-col ttw:border-t ttw:border-border ttw:sm:border-t-0 ttw:sm:border-l",
72
107
  children: [
73
- /* @__PURE__ */ f(l, {
74
- label: F.fields.cardholder,
75
- copyAriaLabel: E && j ? F.fields.copyCardholderAriaLabel : void 0,
76
- onCopy: E && j ? () => j(E) : void 0,
77
- children: E ?? F.fields.emptyValue
108
+ /* @__PURE__ */ g(d, {
109
+ label: J.fields.cardholder,
110
+ copyAriaLabel: M && L ? J.fields.copyCardholderAriaLabel : void 0,
111
+ onCopy: M && L ? () => L(M) : void 0,
112
+ children: M ?? J.fields.emptyValue
78
113
  }),
79
- /* @__PURE__ */ f(l, {
80
- label: F.fields.nickname,
81
- copyAriaLabel: v && j ? F.fields.copyNicknameAriaLabel : void 0,
82
- onCopy: v && j ? () => j(v) : void 0,
83
- isLast: !k && !I,
84
- children: v ?? F.fields.emptyValue
114
+ /* @__PURE__ */ g(d, {
115
+ label: J.fields.nickname,
116
+ copyAriaLabel: w && L ? J.fields.copyNicknameAriaLabel : void 0,
117
+ onCopy: w && L ? () => L(w) : void 0,
118
+ isLast: !F && !Y,
119
+ children: w ?? J.fields.emptyValue
85
120
  }),
86
- k ? /* @__PURE__ */ f(l, {
87
- label: F.fields.billingAddress,
88
- copyAriaLabel: j ? F.fields.copyBillingAddressAriaLabel : void 0,
89
- onCopy: j ? () => j(k) : void 0,
90
- isLast: !I,
91
- children: k
121
+ F ? /* @__PURE__ */ g(d, {
122
+ label: J.fields.billingAddress,
123
+ copyAriaLabel: L ? J.fields.copyBillingAddressAriaLabel : void 0,
124
+ onCopy: L ? () => L(F) : void 0,
125
+ isLast: !Y,
126
+ children: F
92
127
  }) : null,
93
- I ? /* @__PURE__ */ f(l, {
94
- label: F.fields.allowedCategories,
128
+ Y ? /* @__PURE__ */ g(d, {
129
+ label: J.fields.allowedCategories,
95
130
  isLast: !0,
96
- children: /* @__PURE__ */ f("div", {
131
+ children: /* @__PURE__ */ g("div", {
97
132
  className: "ttw:flex ttw:flex-wrap ttw:gap-2",
98
- children: A?.map((t) => /* @__PURE__ */ f(e, {
133
+ children: I?.map((t) => /* @__PURE__ */ g(e, {
99
134
  variant: "secondary",
100
135
  children: t
101
136
  }, t))
@@ -108,4 +143,4 @@ function g({ labels: g, state: _, nickname: v, statusLabel: y, statusTone: b, fo
108
143
  });
109
144
  }
110
145
  //#endregion
111
- export { g as CardDetailsPanel };
146
+ export { S as CardDetailsPanel };
@@ -1,39 +1,38 @@
1
1
  import { cn as e } from "../../../../../../../packages/shared-ui-shadcn/dist/index.js";
2
2
  import { cardDetailsWidgetUiTestIds as t } from "./testIds.js";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ import { CARD_FACE_SURFACE_CLASS_NAME as n } from "./cardFaceSurface.js";
4
+ import { CardFaceGlow as r } from "./CardFaceGlow.js";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
6
  //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFace.js
5
- function i({ bankLogoSrc: i, bankLogoAlt: a, cardholderName: o, maskedCardNumber: s, programLabel: c, className: l }) {
6
- return /* @__PURE__ */ r("div", {
7
+ function o({ bankLogoSrc: o, bankLogoAlt: s, cardholderName: c, maskedCardNumber: l, programLabel: u, className: d }) {
8
+ return /* @__PURE__ */ a("div", {
7
9
  "data-testid": t.cardFace,
8
- className: e("ttw:relative ttw:flex ttw:h-[190px] ttw:w-[300px] ttw:flex-col ttw:justify-between ttw:overflow-hidden ttw:rounded-xl ttw:bg-[#101317] ttw:p-4", l),
10
+ className: e(n, "ttw:justify-between", d),
9
11
  children: [
10
- /* @__PURE__ */ n("div", {
11
- "aria-hidden": "true",
12
- className: "ttw:pointer-events-none ttw:absolute ttw:inset-0 ttw:bg-[radial-gradient(120%_120%_at_85%_100%,rgba(45,212,191,0.22)_0%,transparent_55%)]"
13
- }),
14
- i ? /* @__PURE__ */ n("img", {
15
- src: i,
16
- alt: a,
12
+ /* @__PURE__ */ i(r, {}),
13
+ o ? /* @__PURE__ */ i("img", {
14
+ src: o,
15
+ alt: s,
17
16
  className: "ttw:relative ttw:h-8 ttw:w-auto ttw:max-w-[60%] ttw:object-contain ttw:object-left"
18
- }) : /* @__PURE__ */ n("span", { className: "ttw:relative ttw:h-8" }),
19
- /* @__PURE__ */ r("div", {
17
+ }) : /* @__PURE__ */ i("span", { className: "ttw:relative ttw:h-8" }),
18
+ /* @__PURE__ */ a("div", {
20
19
  className: "ttw:relative ttw:flex ttw:items-end ttw:justify-between ttw:gap-3",
21
- children: [/* @__PURE__ */ r("div", {
20
+ children: [/* @__PURE__ */ a("div", {
22
21
  className: "ttw:min-w-0",
23
- children: [/* @__PURE__ */ n("p", {
22
+ children: [/* @__PURE__ */ i("p", {
24
23
  className: "ttw:truncate ttw:text-base ttw:font-medium ttw:text-white",
25
- children: o
26
- }), /* @__PURE__ */ n("p", {
24
+ children: c
25
+ }), /* @__PURE__ */ i("p", {
27
26
  className: "ttw:mt-1 ttw:truncate ttw:text-lg ttw:tracking-wide ttw:text-white/90",
28
- children: s
27
+ children: l
29
28
  })]
30
- }), /* @__PURE__ */ n("p", {
29
+ }), /* @__PURE__ */ i("p", {
31
30
  className: "ttw:shrink-0 ttw:text-[10px] ttw:font-medium ttw:text-white/90",
32
- children: c
31
+ children: u
33
32
  })]
34
33
  })
35
34
  ]
36
35
  });
37
36
  }
38
37
  //#endregion
39
- export { i as CardFace };
38
+ export { o as CardFace };
@@ -0,0 +1,27 @@
1
+ import { cn as e } from "../../../../../../../packages/shared-ui-shadcn/dist/index.js";
2
+ import { cardDetailsWidgetUiTestIds as t } from "./testIds.js";
3
+ import { CARD_FACE_HEIGHT_CLASS_NAME as n, CARD_FACE_WIDTH_CLASS_NAME as r } from "./cardFaceSurface.js";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFaceFlip.js
6
+ function o({ isFlipped: o, front: s, back: c, className: l }) {
7
+ return /* @__PURE__ */ i("div", {
8
+ className: e("ttw:perspective-[1000px]", l),
9
+ children: /* @__PURE__ */ a("div", {
10
+ "data-testid": t.cardFaceFlip,
11
+ className: e("ttw:relative ttw:transform-3d", n, r, "ttw:motion-safe:transition-transform ttw:motion-safe:duration-500", o && "ttw:rotate-y-180"),
12
+ children: [/* @__PURE__ */ i("div", {
13
+ className: "ttw:absolute ttw:inset-0 ttw:backface-hidden",
14
+ "aria-hidden": o || void 0,
15
+ inert: o || void 0,
16
+ children: s
17
+ }), /* @__PURE__ */ i("div", {
18
+ className: "ttw:absolute ttw:inset-0 ttw:rotate-y-180 ttw:backface-hidden",
19
+ "aria-hidden": !o || void 0,
20
+ inert: !o || void 0,
21
+ children: c
22
+ })]
23
+ })
24
+ });
25
+ }
26
+ //#endregion
27
+ export { o as CardFaceFlip };
@@ -0,0 +1,10 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/CardFaceGlow.js
3
+ function t() {
4
+ return /* @__PURE__ */ e("div", {
5
+ "aria-hidden": "true",
6
+ className: "ttw:pointer-events-none ttw:absolute ttw:inset-0 ttw:bg-[radial-gradient(120%_120%_at_85%_100%,rgba(45,212,191,0.22)_0%,transparent_55%)]"
7
+ });
8
+ }
9
+ //#endregion
10
+ export { t as CardFaceGlow };
@@ -0,0 +1,4 @@
1
+ //#region ../../libs/tesouro-embedded-components-react/card-details-widget/ui/dist/lib/CardDetailsPanel/cardFaceSurface.js
2
+ var e = "ttw:w-[300px]", t = "ttw:h-[190px]", n = `ttw:relative ttw:flex ${t} ${e} ttw:flex-col ttw:overflow-hidden ttw:rounded-xl ttw:bg-[#101317] ttw:p-4`;
3
+ //#endregion
4
+ export { t as CARD_FACE_HEIGHT_CLASS_NAME, n as CARD_FACE_SURFACE_CLASS_NAME, e as CARD_FACE_WIDTH_CLASS_NAME };
@@ -16,7 +16,20 @@ var e = {
16
16
  copyNicknameAriaLabel: "Copy nickname",
17
17
  copyBillingAddressAriaLabel: "Copy billing address"
18
18
  },
19
- actions: { activateCard: "Activate Card" },
19
+ actions: {
20
+ activateCard: "Activate card",
21
+ viewCard: "View card",
22
+ hideCard: "Hide card"
23
+ },
24
+ credentials: {
25
+ cardNumber: "Card number",
26
+ expirationDate: "Expiration date",
27
+ securityCode: "Security code",
28
+ copyCardNumberAriaLabel: "Copy card number",
29
+ copyExpirationDateAriaLabel: "Copy expiration date",
30
+ copySecurityCodeAriaLabel: "Copy security code",
31
+ errorDescription: "We couldn't show this card's details. Please try again."
32
+ },
20
33
  status: {
21
34
  loadingAriaLabel: "Loading card details",
22
35
  errorTitle: "We couldn't load this card",
@@ -44,6 +57,10 @@ function t(t) {
44
57
  ...e.actions,
45
58
  ...t?.actions
46
59
  },
60
+ credentials: {
61
+ ...e.credentials,
62
+ ...t?.credentials
63
+ },
47
64
  status: {
48
65
  ...e.status,
49
66
  ...t?.status
@@ -2,6 +2,8 @@
2
2
  var e = {
3
3
  panel: "card-details-widget-panel",
4
4
  cardFace: "card-details-widget-card-face",
5
+ cardFaceFlip: "card-details-widget-card-face-flip",
6
+ credentialsFace: "card-details-widget-credentials-face",
5
7
  loading: "card-details-widget-loading",
6
8
  menuTrigger: "card-details-widget-menu-trigger",
7
9
  closeButton: "card-details-widget-close-button",
@@ -1,5 +1,5 @@
1
1
  //#region ../../libs/tesouro-embedded-components-react/shared/feature/dist/lib/analytics/build-info.js
2
- var e = "@tesouro/embedded-components-react", t = "0.2.322", n = "6dad5d75bafa73fa765f485045c9ea1663c1445a", r = Object.freeze({
2
+ var e = "@tesouro/embedded-components-react", t = "0.2.324", n = "076fb2bf27301b056855ab69627a2d0ce4d36c99", r = Object.freeze({
3
3
  library_name: e,
4
4
  library_version: t,
5
5
  library_sha: n
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tesouro/embedded-components-react",
3
- "version": "0.2.322",
3
+ "version": "0.2.324",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "packageDepSync": {
@@ -185,6 +185,7 @@
185
185
  "react-pdf": "^10.4.1",
186
186
  "react-script-hook": "^1.7.2",
187
187
  "react-use": "^17.6.1",
188
+ "react-webcam": "^7.2.0",
188
189
  "sonner": "^2.0.8",
189
190
  "tailwind-merge": "^3.6.0",
190
191
  "tailwind-variants": "^3.3.1",