@khipu/design-system 0.1.0-alpha.45 → 0.1.0-alpha.47

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.
@@ -11,7 +11,7 @@
11
11
  *
12
12
  * AUTO-GENERATED FILE - DO NOT EDIT MANUALLY
13
13
  * Source: design-system/src/tokens/tokens.json
14
- * Generated: 2026-04-22T00:56:39.305Z
14
+ * Generated: 2026-04-23T20:14:51.318Z
15
15
  *
16
16
  * To regenerate:
17
17
  * cd design-system && npm run tokens:generate
@@ -191,9 +191,12 @@
191
191
  --kds-spacing-11: 88px;
192
192
  --kds-spacing-12: 96px;
193
193
  --kds-spacing-20: 160px;
194
+ --kds-spacing-0-25: 2px;
194
195
  --kds-spacing-0-5: 4px;
195
196
  --kds-spacing-0-75: 6px;
197
+ --kds-spacing-1-25: 10px;
196
198
  --kds-spacing-1-5: 12px;
199
+ --kds-spacing-1-75: 14px;
197
200
  --kds-spacing-2-5: 20px;
198
201
  --kds-spacing-3-5: 28px;
199
202
  --kds-spacing-4-5: 36px;
@@ -247,7 +250,7 @@
247
250
  /* Component-specific radii */
248
251
  --kds-radius-button: 4px;
249
252
  --kds-radius-input: 4px;
250
- --kds-radius-card: 20px;
253
+ --kds-radius-card: 14px;
251
254
  --kds-radius-modal: 20px;
252
255
  --kds-radius-chip: 16px;
253
256
  --kds-radius-iconContainer: 10px;
@@ -625,6 +628,38 @@ body.dark {
625
628
 
626
629
  /* Snackbar */
627
630
  --kds-snackbar-max-width: 560px;
631
+
632
+ /* ========================================
633
+ PAYMENT FLOW TOKENS
634
+ New tokens for payment flow components
635
+ ======================================== */
636
+
637
+ /* Extended primary colors */
638
+ --kds-color-primary-deep: #5B3DB5; /* Darker purple for merchant tile */
639
+ --kds-color-primary-faint: #F0F0FA; /* Ultra-subtle background */
640
+
641
+ /* Extended semantic colors */
642
+ --kds-color-info-soft: #EFF6FF; /* Alias for info backgrounds */
643
+ --kds-color-success-soft: #ECFDF5; /* Success mark and borders */
644
+
645
+ /* Layout colors */
646
+ --kds-color-shell: #F5F5F5; /* Neutral page background */
647
+
648
+ /* Card specific */
649
+ --kds-radius-card: 14px; /* Payment card radius (between lg and xl) */
650
+ --kds-shadow-card: 0 1px 2px rgba(16,24,40,.04), 0 1px 3px rgba(16,24,40,.06); /* Subtle card shadow */
651
+
652
+ /* Extended semantic soft backgrounds */
653
+ --kds-color-warning-soft: var(--kds-alert-warning-bg); /* #FFFBEB */
654
+ --kds-color-danger-soft: var(--kds-alert-error-bg); /* #FEF2F2 */
655
+
656
+ /* Bottom Sheet */
657
+ --kds-bottom-sheet-max-width: 480px;
658
+ --kds-bottom-sheet-shadow: 0 -8px var(--kds-spacing-3-5) rgba(0, 0, 0, 0.18);
659
+
660
+ /* Status Block */
661
+ --kds-status-icon-size: var(--kds-spacing-8); /* 64px */
662
+ --kds-status-icon-size-sm: var(--kds-spacing-5); /* 40px */
628
663
  }
629
664
 
630
665
  /* ========================================
@@ -2236,8 +2271,8 @@ body.dark {
2236
2271
  'wght' 400,
2237
2272
  'GRAD' 0,
2238
2273
  'opsz' 24;
2239
- min-width: 24px;
2240
- min-height: 24px;
2274
+ min-width: 30px;
2275
+ min-height: 30px;
2241
2276
  display: inline-flex;
2242
2277
  align-items: center;
2243
2278
  justify-content: center;
@@ -4260,3 +4295,1201 @@ dialog#surveyModal button.circle {
4260
4295
  .secondary-nav-border {
4261
4296
  border-bottom: var(--kds-border-width-sm) solid var(--kds-color-divider);
4262
4297
  }
4298
+
4299
+ /* ========================================
4300
+ PAYMENT FLOW COMPONENTS
4301
+ Components for mobile payment flows
4302
+ Source: Beer CSS Proposal.md
4303
+ ======================================== */
4304
+
4305
+ /* ========================================
4306
+ 01 - MERCHANT TILE (.kds-merchant)
4307
+ Identifies merchant in payment confirmation
4308
+ ======================================== */
4309
+
4310
+ .kds-merchant {
4311
+ display: flex;
4312
+ align-items: center;
4313
+ gap: var(--kds-spacing-1-75);
4314
+ }
4315
+
4316
+ .kds-merchant-tile {
4317
+ width: 56px;
4318
+ height: 56px;
4319
+ border-radius: var(--kds-radius-card);
4320
+ background: var(--kds-color-primary-deep);
4321
+ color: #fff;
4322
+ display: grid;
4323
+ place-items: center;
4324
+ font-weight: 700;
4325
+ font-size: var(--kds-font-size-xl); /* 1.25rem = 20px */
4326
+ letter-spacing: 0.02em;
4327
+ flex-shrink: 0;
4328
+ }
4329
+
4330
+ /* Merchant tile with logo variant */
4331
+ .kds-merchant-tile.logo {
4332
+ padding: var(--kds-spacing-0-5);
4333
+ }
4334
+
4335
+ .kds-merchant-tile.logo img {
4336
+ width: 100%;
4337
+ height: 100%;
4338
+ object-fit: cover;
4339
+ border-radius: var(--kds-radius-md);
4340
+ }
4341
+
4342
+ .kds-merchant-meta {
4343
+ display: flex;
4344
+ flex-direction: column;
4345
+ }
4346
+
4347
+ .kds-merchant-label {
4348
+ font-size: var(--kds-font-size-xs);
4349
+ color: var(--kds-color-text-secondary);
4350
+ text-transform: uppercase;
4351
+ letter-spacing: 0.04em;
4352
+ margin-bottom: var(--kds-spacing-0-25);
4353
+ }
4354
+
4355
+ .kds-merchant-meta strong {
4356
+ font-size: 15px;
4357
+ font-weight: 600;
4358
+ color: var(--kds-color-text-primary);
4359
+ }
4360
+
4361
+ /* Compact variant for secondary headers */
4362
+ .kds-merchant.compact .kds-merchant-tile {
4363
+ width: 40px;
4364
+ height: 40px;
4365
+ font-size: var(--kds-font-size-base);
4366
+ }
4367
+
4368
+ .kds-merchant.compact .kds-merchant-label {
4369
+ display: none;
4370
+ }
4371
+
4372
+ /* ========================================
4373
+ 02 - AMOUNT DISPLAY (.kds-amount)
4374
+ Large amount with secondary currency symbol
4375
+ ======================================== */
4376
+
4377
+ .kds-amount {
4378
+ text-align: center;
4379
+ }
4380
+
4381
+ .kds-amount-label {
4382
+ display: block;
4383
+ font-size: var(--kds-font-size-xs);
4384
+ color: var(--kds-color-text-secondary);
4385
+ text-transform: uppercase;
4386
+ letter-spacing: 0.04em;
4387
+ margin-bottom: var(--kds-spacing-1);
4388
+ }
4389
+
4390
+ .kds-amount-value {
4391
+ font-size: var(--kds-font-size-4xl); /* 2.25rem = 36px */
4392
+ font-weight: 700;
4393
+ letter-spacing: -0.02em;
4394
+ color: var(--kds-color-text-primary);
4395
+ }
4396
+
4397
+ .kds-amount-value small {
4398
+ font-size: 18px;
4399
+ font-weight: 500;
4400
+ color: var(--kds-color-text-secondary);
4401
+ margin-right: var(--kds-spacing-0-5);
4402
+ }
4403
+
4404
+ /* Brand color variant (for success screens) */
4405
+ .kds-amount.brand .kds-amount-value {
4406
+ color: var(--kds-color-primary-main);
4407
+ }
4408
+
4409
+ /* Inline variant (left-aligned) */
4410
+ .kds-amount.inline {
4411
+ text-align: left;
4412
+ }
4413
+
4414
+ /* ========================================
4415
+ 03 - DETAIL ROWS (.kds-details)
4416
+ Key-value list for transaction summaries
4417
+ ======================================== */
4418
+
4419
+ .kds-details {
4420
+ margin: 0;
4421
+ padding: 0 var(--kds-spacing-4);
4422
+ }
4423
+
4424
+ .kds-details-row {
4425
+ display: flex;
4426
+ justify-content: space-between;
4427
+ align-items: center;
4428
+ padding: var(--kds-spacing-3) 0;
4429
+ border-bottom: 1px solid var(--kds-color-divider);
4430
+ font-size: var(--kds-font-size-sm);
4431
+ }
4432
+
4433
+ .kds-details-row:last-child {
4434
+ border-bottom: none;
4435
+ }
4436
+
4437
+ .kds-details-row dt {
4438
+ color: var(--kds-color-text-secondary);
4439
+ font-weight: 400;
4440
+ }
4441
+
4442
+ .kds-details-row dd {
4443
+ margin: 0;
4444
+ font-weight: 500;
4445
+ color: var(--kds-color-text-primary);
4446
+ }
4447
+
4448
+ .kds-details-row.total dd {
4449
+ color: var(--kds-color-primary-main);
4450
+ font-weight: 700;
4451
+ font-size: var(--kds-font-size-base);
4452
+ }
4453
+
4454
+ /* ========================================
4455
+ 04 - DOT STEPPER (.kds-stepper.dots)
4456
+ Compact stepper variant for mobile flows
4457
+ ======================================== */
4458
+
4459
+ .kds-stepper.dots {
4460
+ display: flex;
4461
+ gap: var(--kds-spacing-0-75);
4462
+ justify-content: center;
4463
+ padding: var(--kds-spacing-4) 0;
4464
+ }
4465
+
4466
+ .kds-stepper.dots .kds-step {
4467
+ width: var(--kds-spacing-1);
4468
+ height: var(--kds-spacing-1);
4469
+ border-radius: var(--kds-radius-full);
4470
+ background: var(--kds-color-divider);
4471
+ transition: width 0.25s, background 0.25s;
4472
+ }
4473
+
4474
+ .kds-stepper.dots .kds-step.completed {
4475
+ background: var(--kds-color-primary-main);
4476
+ }
4477
+
4478
+ .kds-stepper.dots .kds-step.current {
4479
+ width: var(--kds-spacing-3);
4480
+ background: var(--kds-color-primary-main);
4481
+ }
4482
+
4483
+ /* ========================================
4484
+ 05 - LOCKED FIELD (.field.locked)
4485
+ Read-only field with lock icon
4486
+ ======================================== */
4487
+
4488
+ .field.locked {
4489
+ position: relative;
4490
+ }
4491
+
4492
+ .field.locked > input,
4493
+ .field.locked > textarea {
4494
+ background: var(--kds-color-shell);
4495
+ color: var(--kds-color-text-primary);
4496
+ cursor: default;
4497
+ }
4498
+
4499
+ .field.locked > i {
4500
+ position: absolute;
4501
+ right: 12px;
4502
+ top: 50%;
4503
+ transform: translateY(-50%);
4504
+ color: var(--kds-color-text-disabled);
4505
+ pointer-events: none;
4506
+ }
4507
+
4508
+ /* Verified variant (green check) */
4509
+ .field.locked.verified > i {
4510
+ color: var(--kds-color-success-main);
4511
+ }
4512
+
4513
+ /* ========================================
4514
+ 06 - OTP INPUT (.kds-otp)
4515
+ Segmented input for verification codes
4516
+ ======================================== */
4517
+
4518
+ .kds-otp {
4519
+ display: flex;
4520
+ gap: var(--kds-spacing-1-25);
4521
+ justify-content: center;
4522
+ margin: var(--kds-spacing-4) 0;
4523
+ }
4524
+
4525
+ .kds-otp input {
4526
+ width: 48px;
4527
+ height: 56px;
4528
+ border: 1.5px solid var(--kds-color-input-border);
4529
+ border-radius: var(--kds-radius-md);
4530
+ text-align: center;
4531
+ font-size: var(--kds-font-size-xl);
4532
+ font-weight: 600;
4533
+ transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;
4534
+ background: var(--kds-color-background-paper);
4535
+ }
4536
+
4537
+ .kds-otp input:not(:placeholder-shown) {
4538
+ border-color: var(--kds-color-primary-main);
4539
+ background: var(--kds-color-primary-faint);
4540
+ }
4541
+
4542
+ .kds-otp input:focus {
4543
+ outline: none;
4544
+ border-color: var(--kds-color-primary-main);
4545
+ box-shadow: 0 0 0 3px rgba(131,71,173,.12);
4546
+ }
4547
+
4548
+ /* Invalid state with shake animation */
4549
+ .kds-otp.invalid input {
4550
+ border-color: var(--kds-color-error-main);
4551
+ animation: kds-shake 0.35s;
4552
+ }
4553
+
4554
+ @keyframes kds-shake {
4555
+ 0%, 100% { transform: translateX(0); }
4556
+ 25% { transform: translateX(-8px); }
4557
+ 75% { transform: translateX(8px); }
4558
+ }
4559
+
4560
+ /* ========================================
4561
+ 07 - BANK ROW (.kds-bank-row)
4562
+ Clickable bank selector row
4563
+ ======================================== */
4564
+
4565
+ .kds-bank-row {
4566
+ display: flex;
4567
+ align-items: center;
4568
+ gap: var(--kds-spacing-1-5);
4569
+ width: 100%;
4570
+ padding: var(--kds-spacing-1-75);
4571
+ background: var(--kds-color-surface);
4572
+ color: var(--kds-color-text-primary);
4573
+ border: 1px solid var(--kds-color-divider);
4574
+ border-radius: var(--kds-radius-lg);
4575
+ text-align: left;
4576
+ cursor: pointer;
4577
+ transition: border-color 0.2s, background 0.2s;
4578
+ min-height: fit-content;
4579
+ }
4580
+
4581
+ .kds-bank-row:hover {
4582
+ border-color: var(--kds-color-primary-main);
4583
+ background: var(--kds-color-primary-faint);
4584
+ }
4585
+
4586
+ .kds-bank-row-logo {
4587
+ width: 40px;
4588
+ height: 40px;
4589
+ border-radius: var(--kds-radius-md);
4590
+ display: grid;
4591
+ place-items: center;
4592
+ overflow: hidden;
4593
+ flex-shrink: 0;
4594
+ }
4595
+
4596
+ .kds-bank-row-logo img {
4597
+ width: 100%;
4598
+ height: 100%;
4599
+ object-fit: contain;
4600
+ }
4601
+
4602
+ .kds-bank-row-name {
4603
+ flex: 1;
4604
+ font-weight: 500;
4605
+ font-size: var(--kds-font-size-base);
4606
+ color: var(--kds-color-text-primary);
4607
+ }
4608
+
4609
+ .kds-bank-row > i {
4610
+ color: var(--kds-color-text-secondary);
4611
+ flex-shrink: 0;
4612
+ }
4613
+
4614
+ /* Selected state */
4615
+ .kds-bank-row.selected {
4616
+ border-color: var(--kds-color-primary-main);
4617
+ background: var(--kds-color-primary-faint);
4618
+ }
4619
+
4620
+ .kds-bank-row.selected > i {
4621
+ color: var(--kds-color-primary-main);
4622
+ }
4623
+
4624
+ /* Disabled state */
4625
+ .kds-bank-row:disabled,
4626
+ .kds-bank-row.disabled {
4627
+ opacity: 0.5;
4628
+ cursor: not-allowed;
4629
+ pointer-events: none;
4630
+ }
4631
+
4632
+ /* ========================================
4633
+ 08 - STICKY CTA BAR (.kds-cta-bar)
4634
+ Fixed bottom action bar with primary button
4635
+ ======================================== */
4636
+
4637
+ .kds-cta-bar {
4638
+ position: sticky;
4639
+ bottom: 0;
4640
+ display: flex;
4641
+ gap: var(--kds-spacing-1-25);
4642
+ padding: var(--kds-spacing-2);
4643
+ background: #FFFFFF;
4644
+ border-top: 1px solid var(--kds-color-divider);
4645
+ padding-bottom: calc(var(--kds-spacing-2) + env(safe-area-inset-bottom));
4646
+ z-index: 100;
4647
+ }
4648
+
4649
+ .kds-cta-bar > button {
4650
+ flex: 1;
4651
+ min-height: 48px;
4652
+ }
4653
+
4654
+ .kds-cta-bar > button.primary,
4655
+ .kds-cta-bar > button.kds-btn-primary {
4656
+ flex: 1;
4657
+ }
4658
+
4659
+ /* Floating variant (no border, with shadow) */
4660
+ .kds-cta-bar.floating {
4661
+ border-top: none;
4662
+ box-shadow: 0 -4px 16px rgba(16,24,40,.08);
4663
+ }
4664
+
4665
+ /* ========================================
4666
+ 09 - SUCCESS MARK (.kds-success-mark)
4667
+ Large success icon for completion screens
4668
+ ======================================== */
4669
+
4670
+ .kds-success-mark {
4671
+ width: 64px;
4672
+ height: 64px;
4673
+ border-radius: var(--kds-radius-full);
4674
+ background: var(--kds-color-success-soft);
4675
+ border: 2px solid var(--kds-color-success-main);
4676
+ display: grid;
4677
+ place-items: center;
4678
+ color: var(--kds-color-success-main);
4679
+ animation: kds-pop 0.45s ease-out;
4680
+ margin: 0 auto;
4681
+ }
4682
+
4683
+ .kds-success-mark i {
4684
+ font-size: 32px;
4685
+ font-weight: 700;
4686
+ }
4687
+
4688
+ /* Error variant */
4689
+ .kds-success-mark.error {
4690
+ background: rgba(211, 47, 47, 0.08);
4691
+ border-color: var(--kds-color-error-main);
4692
+ color: var(--kds-color-error-main);
4693
+ }
4694
+
4695
+ /* Warning variant */
4696
+ .kds-success-mark.warning {
4697
+ background: rgba(237, 108, 2, 0.08);
4698
+ border-color: var(--kds-color-warning-main);
4699
+ color: var(--kds-color-warning-main);
4700
+ }
4701
+
4702
+ @keyframes kds-pop {
4703
+ 0% {
4704
+ transform: scale(0.6);
4705
+ opacity: 0;
4706
+ }
4707
+ 60% {
4708
+ transform: scale(1.08);
4709
+ opacity: 1;
4710
+ }
4711
+ 100% {
4712
+ transform: scale(1);
4713
+ }
4714
+ }
4715
+
4716
+ /* ========================================
4717
+ RESET: Disable BeerCSS ripple ::after on kds-* buttons
4718
+ ======================================== */
4719
+
4720
+ .kds-expand-toggle::after,
4721
+ .kds-copy-row::after,
4722
+ .kds-copy-all::after,
4723
+ .kds-segmented-tabs button::after,
4724
+ .kds-bottom-sheet-actions button::after {
4725
+ display: none;
4726
+ }
4727
+
4728
+ /* ========================================
4729
+ 10 - SECURE FOOTER (.kds-secure-footer)
4730
+ Trust badge footer for payment flows
4731
+ ======================================== */
4732
+
4733
+ .kds-secure-footer {
4734
+ display: flex;
4735
+ align-items: center;
4736
+ justify-content: center;
4737
+ gap: var(--kds-spacing-1);
4738
+ color: var(--kds-color-text-disabled);
4739
+ font-size: var(--kds-font-size-xs);
4740
+ padding: var(--kds-spacing-1) 0;
4741
+ }
4742
+
4743
+ .kds-secure-footer i {
4744
+ font-size: var(--kds-font-size-sm);
4745
+ }
4746
+
4747
+ .kds-secure-footer-code {
4748
+ color: var(--kds-color-text-hint);
4749
+ }
4750
+
4751
+ /* ========================================
4752
+ 11 - EXPAND TOGGLE (.kds-expand-toggle + .kds-expand-panel)
4753
+ Collapsible detail section
4754
+ ======================================== */
4755
+
4756
+ .kds-expand-toggle {
4757
+ background: none;
4758
+ border: 0;
4759
+ padding: var(--kds-spacing-0-5) 0;
4760
+ color: var(--kds-color-primary-main);
4761
+ font-weight: var(--kds-font-weight-medium);
4762
+ font-size: var(--kds-font-size-sm);
4763
+ cursor: pointer;
4764
+ display: inline-flex;
4765
+ align-items: center;
4766
+ gap: var(--kds-spacing-0-75);
4767
+ }
4768
+
4769
+ .kds-expand-toggle:hover {
4770
+ background: transparent;
4771
+ }
4772
+
4773
+ .kds-expand-toggle:hover span {
4774
+ text-decoration: underline;
4775
+ }
4776
+
4777
+ .kds-expand-toggle i {
4778
+ font-size: var(--kds-font-size-base);
4779
+ transition: transform var(--kds-transition-shorter, 0.2s);
4780
+ }
4781
+
4782
+ .kds-expand-toggle[aria-expanded="true"] i {
4783
+ transform: rotate(180deg);
4784
+ }
4785
+
4786
+ .kds-expand-panel {
4787
+ overflow: hidden;
4788
+ transition: max-height 0.28s ease, margin-top 0.28s ease;
4789
+ max-height: 0;
4790
+ }
4791
+
4792
+ .kds-expand-panel[hidden] {
4793
+ display: block;
4794
+ max-height: 0;
4795
+ }
4796
+
4797
+ .kds-expand-panel.open {
4798
+ max-height: 800px;
4799
+ margin-top: var(--kds-spacing-1);
4800
+ }
4801
+
4802
+ /* ========================================
4803
+ 12 - COPY ROW (.kds-copy-row + .kds-copy-list + .kds-copy-all)
4804
+ Clipboard-copyable data rows with visual feedback
4805
+ ======================================== */
4806
+
4807
+ .kds-copy-header {
4808
+ display: flex;
4809
+ align-items: center;
4810
+ justify-content: space-between;
4811
+ margin-bottom: var(--kds-spacing-1-25);
4812
+ }
4813
+
4814
+ .kds-copy-all {
4815
+ display: inline-flex;
4816
+ align-items: center;
4817
+ gap: var(--kds-spacing-0-5);
4818
+ color: var(--kds-color-primary-main);
4819
+ font-weight: var(--kds-font-weight-semibold);
4820
+ font-size: var(--kds-font-size-xs);
4821
+ background: none;
4822
+ border: 0;
4823
+ cursor: pointer;
4824
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-0-75);
4825
+ border-radius: var(--kds-radius-sm);
4826
+ }
4827
+
4828
+ .kds-copy-all:hover {
4829
+ background: var(--kds-color-action-hover);
4830
+ }
4831
+
4832
+ .kds-copy-all i {
4833
+ font-size: var(--kds-font-size-base);
4834
+ }
4835
+
4836
+ .kds-copy-list {
4837
+ display: flex;
4838
+ flex-direction: column;
4839
+ gap: var(--kds-spacing-1);
4840
+ }
4841
+
4842
+ .kds-copy-row {
4843
+ display: flex;
4844
+ align-items: center;
4845
+ justify-content: flex-start;
4846
+ gap: var(--kds-spacing-1-25);
4847
+ padding: var(--kds-spacing-1-5) var(--kds-spacing-1-75);
4848
+ border: var(--kds-border-width-sm) solid var(--kds-color-divider);
4849
+ border-radius: var(--kds-radius-md);
4850
+ background: var(--kds-color-surface, var(--kds-color-background-paper));
4851
+ cursor: pointer;
4852
+ text-align: left;
4853
+ position: relative;
4854
+ transition: background 0.15s, border-color 0.15s;
4855
+ font-size: var(--kds-font-size-sm);
4856
+ color: var(--kds-color-text-primary);
4857
+ min-height: fit-content;
4858
+ }
4859
+
4860
+ .kds-copy-row:hover {
4861
+ background: var(--kds-color-background-muted);
4862
+ border-color: var(--kds-border-light);
4863
+ }
4864
+
4865
+ .kds-copy-row > i {
4866
+ color: var(--kds-color-text-secondary);
4867
+ font-size: var(--kds-font-size-lg);
4868
+ flex-shrink: 0;
4869
+ }
4870
+
4871
+ .kds-copy-row-label {
4872
+ font-size: var(--kds-font-size-caption);
4873
+ color: var(--kds-color-text-secondary);
4874
+ text-transform: uppercase;
4875
+ letter-spacing: 0.03em;
4876
+ display: block;
4877
+ margin-bottom: var(--kds-spacing-0-25);
4878
+ }
4879
+
4880
+ .kds-copy-row-value {
4881
+ font-weight: var(--kds-font-weight-medium);
4882
+ }
4883
+
4884
+ .kds-copy-row.copied {
4885
+ background: var(--kds-color-success-soft);
4886
+ border-color: var(--kds-color-success-main);
4887
+ }
4888
+
4889
+ .kds-copy-toast {
4890
+ position: absolute;
4891
+ right: var(--kds-spacing-1-5);
4892
+ top: 50%;
4893
+ transform: translateY(-50%);
4894
+ color: var(--kds-color-success-main);
4895
+ display: flex;
4896
+ align-items: center;
4897
+ gap: var(--kds-spacing-0-5);
4898
+ font-size: var(--kds-font-size-xs);
4899
+ font-weight: var(--kds-font-weight-semibold);
4900
+ pointer-events: none;
4901
+ opacity: 0;
4902
+ transition: opacity 0.2s;
4903
+ }
4904
+
4905
+ .kds-copy-row.copied .kds-copy-toast {
4906
+ opacity: 1;
4907
+ }
4908
+
4909
+ /* ========================================
4910
+ 13 - STATUS BLOCK (.kds-status-block)
4911
+ Status header with icon + title for result screens
4912
+ ======================================== */
4913
+
4914
+ .kds-status-block {
4915
+ text-align: center;
4916
+ padding: var(--kds-spacing-6) 0;
4917
+ }
4918
+
4919
+ .kds-status-block-icon {
4920
+ width: var(--kds-status-icon-size);
4921
+ height: var(--kds-status-icon-size);
4922
+ margin: 0 auto var(--kds-spacing-3);
4923
+ border-radius: var(--kds-radius-full);
4924
+ display: grid;
4925
+ place-items: center;
4926
+ }
4927
+
4928
+ .kds-status-block-icon i {
4929
+ font-size: var(--kds-font-size-4xl);
4930
+ font-weight: var(--kds-font-weight-bold);
4931
+ }
4932
+
4933
+ .kds-status-block-title {
4934
+ font-size: var(--kds-font-size-xl);
4935
+ font-weight: var(--kds-font-weight-bold);
4936
+ color: var(--kds-color-text-primary);
4937
+ margin: 0 0 var(--kds-spacing-1);
4938
+ }
4939
+
4940
+ .kds-status-block-description {
4941
+ font-size: var(--kds-font-size-sm);
4942
+ color: var(--kds-color-text-secondary);
4943
+ margin: 0;
4944
+ }
4945
+
4946
+ /* Variant: success */
4947
+ .kds-status-block[data-status="success"] .kds-status-block-icon {
4948
+ background: var(--kds-color-success-soft);
4949
+ border: var(--kds-border-width-md) solid var(--kds-color-success-main);
4950
+ color: var(--kds-color-success-main);
4951
+ }
4952
+
4953
+ /* Variant: pending (animated spinner) */
4954
+ .kds-status-block[data-status="pending"] .kds-status-block-icon {
4955
+ background: transparent;
4956
+ border: 3px solid var(--kds-color-divider);
4957
+ border-top-color: var(--kds-color-primary-main);
4958
+ animation: kds-spin 1s linear infinite;
4959
+ }
4960
+
4961
+ /* Variant: warn */
4962
+ .kds-status-block[data-status="warn"] .kds-status-block-icon {
4963
+ background: var(--kds-color-warning-soft);
4964
+ border: var(--kds-border-width-md) solid var(--kds-color-warning-main);
4965
+ color: var(--kds-color-warning-main);
4966
+ }
4967
+
4968
+ /* Variant: error */
4969
+ .kds-status-block[data-status="error"] .kds-status-block-icon {
4970
+ background: var(--kds-color-danger-soft);
4971
+ border: var(--kds-border-width-md) solid var(--kds-color-error-main);
4972
+ color: var(--kds-color-error-main);
4973
+ }
4974
+
4975
+ /* Inline variant: icon left + text right */
4976
+ .kds-status-block.inline {
4977
+ text-align: left;
4978
+ display: flex;
4979
+ align-items: center;
4980
+ gap: var(--kds-spacing-3);
4981
+ padding: var(--kds-spacing-1) 0;
4982
+ }
4983
+
4984
+ .kds-status-block.inline .kds-status-block-icon {
4985
+ width: var(--kds-status-icon-size-sm);
4986
+ height: var(--kds-status-icon-size-sm);
4987
+ margin: 0;
4988
+ flex-shrink: 0;
4989
+ }
4990
+
4991
+ .kds-status-block.inline .kds-status-block-icon i {
4992
+ font-size: var(--kds-font-size-xl);
4993
+ }
4994
+
4995
+ @keyframes kds-spin {
4996
+ to { transform: rotate(360deg); }
4997
+ }
4998
+
4999
+ /* ========================================
5000
+ 14 - BOTTOM SHEET (.kds-bottom-sheet)
5001
+ Modal bottom sheet for mobile confirmations
5002
+ ======================================== */
5003
+
5004
+ .kds-bottom-sheet-scrim {
5005
+ position: fixed;
5006
+ inset: 0;
5007
+ background: var(--kds-modal-backdrop);
5008
+ display: none;
5009
+ align-items: flex-end;
5010
+ justify-content: center;
5011
+ z-index: var(--kds-z-index-modal, 50);
5012
+ animation: kds-fade 0.2s ease both;
5013
+ }
5014
+
5015
+ .kds-bottom-sheet-scrim.open {
5016
+ display: flex;
5017
+ }
5018
+
5019
+ .kds-bottom-sheet {
5020
+ width: 100%;
5021
+ max-width: var(--kds-bottom-sheet-max-width);
5022
+ background: var(--kds-color-background-paper);
5023
+ border-radius: var(--kds-radius-2xl) var(--kds-radius-2xl) 0 0;
5024
+ padding: var(--kds-spacing-3-5) var(--kds-spacing-3) var(--kds-spacing-3);
5025
+ box-shadow: var(--kds-bottom-sheet-shadow);
5026
+ animation: kds-rise 0.28s cubic-bezier(0.2, 0.8, 0.2, 1) both;
5027
+ text-align: center;
5028
+ position: relative;
5029
+ }
5030
+
5031
+ .kds-bottom-sheet-grabber {
5032
+ position: absolute;
5033
+ left: 50%;
5034
+ top: var(--kds-spacing-1-25);
5035
+ transform: translateX(-50%);
5036
+ width: var(--kds-spacing-6);
5037
+ height: var(--kds-spacing-0-5);
5038
+ border-radius: var(--kds-radius-full);
5039
+ background: var(--kds-color-divider);
5040
+ }
5041
+
5042
+ .kds-bottom-sheet-icon {
5043
+ font-size: var(--kds-font-size-4xl);
5044
+ }
5045
+
5046
+ .kds-bottom-sheet-title {
5047
+ font-size: var(--kds-font-size-xl);
5048
+ margin: var(--kds-spacing-1-5) 0 var(--kds-spacing-0-5);
5049
+ }
5050
+
5051
+ .kds-bottom-sheet-description {
5052
+ font-size: var(--kds-font-size-sm);
5053
+ color: var(--kds-color-text-secondary);
5054
+ margin: 0;
5055
+ }
5056
+
5057
+ .kds-bottom-sheet-actions {
5058
+ margin-top: var(--kds-spacing-3);
5059
+ display: flex;
5060
+ flex-direction: column;
5061
+ gap: var(--kds-spacing-1-25);
5062
+ }
5063
+
5064
+ .kds-bottom-sheet-actions button {
5065
+ padding: var(--kds-spacing-1-5);
5066
+ border: 0;
5067
+ border-radius: var(--kds-radius-btn, var(--kds-radius-md));
5068
+ font-weight: var(--kds-font-weight-semibold);
5069
+ cursor: pointer;
5070
+ }
5071
+
5072
+ .kds-bottom-sheet-actions .kds-btn-danger {
5073
+ background: var(--kds-color-error-main);
5074
+ color: var(--kds-color-primary-contrast);
5075
+ }
5076
+
5077
+ .kds-bottom-sheet-actions .kds-btn-ghost {
5078
+ background: transparent;
5079
+ color: var(--kds-color-text-secondary);
5080
+ font-weight: var(--kds-font-weight-medium);
5081
+ }
5082
+
5083
+ @keyframes kds-fade {
5084
+ from { opacity: 0; }
5085
+ to { opacity: 1; }
5086
+ }
5087
+
5088
+ @keyframes kds-rise {
5089
+ from { transform: translateY(var(--kds-spacing-2-5)); opacity: 0.4; }
5090
+ to { transform: none; opacity: 1; }
5091
+ }
5092
+
5093
+ /* ========================================
5094
+ 15 - COUNTDOWN (.kds-countdown)
5095
+ Timer with HH:MM:SS for deadline-based flows
5096
+ ======================================== */
5097
+
5098
+ .kds-countdown {
5099
+ text-align: center;
5100
+ padding: var(--kds-spacing-1) 0;
5101
+ }
5102
+
5103
+ .kds-countdown-label {
5104
+ display: block;
5105
+ font-size: var(--kds-font-size-xs);
5106
+ color: var(--kds-color-text-secondary);
5107
+ text-transform: uppercase;
5108
+ letter-spacing: 0.04em;
5109
+ margin-bottom: var(--kds-spacing-1);
5110
+ }
5111
+
5112
+ .kds-countdown-value {
5113
+ font-size: var(--kds-font-size-2xl);
5114
+ font-weight: var(--kds-font-weight-bold);
5115
+ font-variant-numeric: tabular-nums;
5116
+ color: var(--kds-color-text-primary);
5117
+ }
5118
+
5119
+ .kds-countdown.urgent .kds-countdown-value {
5120
+ color: var(--kds-color-error-main);
5121
+ }
5122
+
5123
+ /* ========================================
5124
+ 16 - SEGMENTED TABS (.kds-segmented-tabs)
5125
+ Pill-group toggle for tab switching
5126
+ ======================================== */
5127
+
5128
+ .kds-segmented-tabs {
5129
+ height: var(--kds-spacing-5);
5130
+ background: var(--kds-color-background-elevated);
5131
+ border-radius: var(--kds-radius-lg);
5132
+ padding: var(--kds-spacing-0-25);
5133
+ display: flex;
5134
+ }
5135
+
5136
+ .kds-segmented-tabs.kds-segmented-tabs button {
5137
+ flex: 1;
5138
+ border: 0;
5139
+ background: transparent;
5140
+ border-radius: calc(var(--kds-radius-lg) - var(--kds-spacing-0-25));
5141
+ font-weight: var(--kds-font-weight-medium);
5142
+ font-size: var(--kds-font-size-sm);
5143
+ color: var(--kds-color-text-secondary);
5144
+ cursor: pointer;
5145
+ transition: background 0.2s, color 0.2s, box-shadow 0.2s;
5146
+ }
5147
+
5148
+ .kds-segmented-tabs.kds-segmented-tabs button.active,
5149
+ .kds-segmented-tabs.kds-segmented-tabs button[aria-selected="true"] {
5150
+ background: var(--kds-color-primary-main);
5151
+ color: var(--kds-color-primary-contrast);
5152
+ box-shadow: var(--kds-shadow-card);
5153
+ }
5154
+
5155
+
5156
+ /* ========================================
5157
+ PAYMENT FLOW — DOMAIN COMPONENTS
5158
+ Invoice header, KV grid, dividers,
5159
+ amount summary, recap, success button
5160
+ ======================================== */
5161
+
5162
+ /* -- Invoice Header (amount + merchant tile) -- */
5163
+ .kds-invoice-header {
5164
+ display: flex;
5165
+ align-items: flex-start;
5166
+ justify-content: space-between;
5167
+ gap: var(--kds-spacing-2);
5168
+ }
5169
+
5170
+ .kds-invoice-amount {
5171
+ font-weight: 700;
5172
+ font-size: 30px;
5173
+ line-height: 1.25;
5174
+ letter-spacing: 0.4px;
5175
+ color: var(--kds-color-text-primary);
5176
+ margin: 0;
5177
+ }
5178
+
5179
+ .kds-invoice-amount.success {
5180
+ color: var(--kds-color-success-main);
5181
+ }
5182
+
5183
+ .kds-invoice-code {
5184
+ font-size: var(--kds-font-size-xs);
5185
+ color: var(--kds-color-text-hint);
5186
+ margin-top: var(--kds-spacing-0-5);
5187
+ }
5188
+
5189
+ .kds-invoice-merchant {
5190
+ width: 64px;
5191
+ height: 64px;
5192
+ border-radius: var(--kds-radius-md);
5193
+ background: var(--kds-color-primary-deep);
5194
+ display: grid;
5195
+ place-items: center;
5196
+ color: #fff;
5197
+ flex-shrink: 0;
5198
+ }
5199
+
5200
+ .kds-invoice-merchant i {
5201
+ font-size: 30px;
5202
+ }
5203
+
5204
+ /* -- Card Title -- */
5205
+ .kds-card-title {
5206
+ font-weight: 700;
5207
+ font-size: var(--kds-font-size-base);
5208
+ line-height: 1.5;
5209
+ letter-spacing: -0.31px;
5210
+ color: var(--kds-color-text-primary);
5211
+ margin: 0 0 var(--kds-spacing-2);
5212
+ }
5213
+
5214
+ /* -- Key-Value Grid -- */
5215
+ .kds-kv {
5216
+ display: grid;
5217
+ grid-template-columns: auto 1fr;
5218
+ row-gap: var(--kds-spacing-1);
5219
+ column-gap: var(--kds-spacing-1-5);
5220
+ align-items: baseline;
5221
+ }
5222
+
5223
+ .kds-kv dt {
5224
+ font-size: var(--kds-font-size-xs);
5225
+ letter-spacing: 0.2px;
5226
+ color: var(--kds-color-text-hint);
5227
+ text-transform: uppercase;
5228
+ margin: 0;
5229
+ }
5230
+
5231
+ .kds-kv dd {
5232
+ margin: 0;
5233
+ font-size: var(--kds-font-size-sm);
5234
+ font-weight: 600;
5235
+ color: var(--kds-color-text-primary);
5236
+ }
5237
+
5238
+ /* -- Dividers -- */
5239
+ .kds-hr {
5240
+ height: 1px;
5241
+ background: var(--kds-color-divider);
5242
+ margin: var(--kds-spacing-2) 0;
5243
+ border: 0;
5244
+ }
5245
+
5246
+ .kds-hr-dashed {
5247
+ height: 0;
5248
+ border: 0;
5249
+ border-top: 1px dashed var(--kds-color-divider);
5250
+ margin: var(--kds-spacing-2) 0;
5251
+ }
5252
+
5253
+ /* -- Detail List + Group (dt/dd in expand panels) -- */
5254
+ .kds-detail-list {
5255
+ display: flex;
5256
+ flex-direction: column;
5257
+ gap: var(--kds-spacing-1-75);
5258
+ margin: var(--kds-spacing-1-75) 0 0;
5259
+ padding: 0;
5260
+ }
5261
+
5262
+ .kds-detail-group {
5263
+ margin-bottom: var(--kds-spacing-1-75);
5264
+ }
5265
+
5266
+ .kds-detail-group:last-child {
5267
+ margin-bottom: 0;
5268
+ }
5269
+
5270
+ .kds-detail-group dt {
5271
+ font-size: var(--kds-font-size-xs);
5272
+ letter-spacing: 0.2px;
5273
+ color: var(--kds-color-text-hint);
5274
+ text-transform: uppercase;
5275
+ margin: 0 0 var(--kds-spacing-0-5);
5276
+ }
5277
+
5278
+ .kds-detail-group dd {
5279
+ margin: 0;
5280
+ font-size: var(--kds-font-size-sm);
5281
+ line-height: 1.45;
5282
+ color: var(--kds-color-text-primary);
5283
+ }
5284
+
5285
+ /* -- Amount Summary Row -- */
5286
+ .kds-amount-row {
5287
+ display: flex;
5288
+ justify-content: space-between;
5289
+ align-items: flex-start;
5290
+ padding: var(--kds-spacing-1-75) 0 var(--kds-spacing-1);
5291
+ border-top: 1px dashed var(--kds-color-divider);
5292
+ margin-top: var(--kds-spacing-1-75);
5293
+ }
5294
+
5295
+ .kds-amount-row-title {
5296
+ font-weight: 700;
5297
+ font-size: var(--kds-font-size-base);
5298
+ color: var(--kds-color-text-primary);
5299
+ }
5300
+
5301
+ .kds-amount-row-subtitle {
5302
+ font-size: var(--kds-font-size-xs);
5303
+ color: var(--kds-color-text-hint);
5304
+ margin-top: var(--kds-spacing-0-5);
5305
+ }
5306
+
5307
+ .kds-amount-row-value {
5308
+ font-weight: 700;
5309
+ font-size: 24px;
5310
+ color: var(--kds-color-text-primary);
5311
+ }
5312
+
5313
+ /* -- Recap Section -- */
5314
+ .kds-recap-header {
5315
+ display: flex;
5316
+ align-items: center;
5317
+ gap: var(--kds-spacing-0-75);
5318
+ font-weight: 700;
5319
+ font-size: var(--kds-font-size-sm);
5320
+ color: var(--kds-color-text-primary);
5321
+ }
5322
+
5323
+ .kds-recap-header i {
5324
+ font-size: var(--kds-font-size-base);
5325
+ color: var(--kds-color-primary-main);
5326
+ }
5327
+
5328
+ .kds-recap-list {
5329
+ margin: var(--kds-spacing-1-25) 0 0;
5330
+ padding: 0;
5331
+ list-style: none;
5332
+ display: flex;
5333
+ flex-direction: column;
5334
+ gap: var(--kds-spacing-0-75);
5335
+ }
5336
+
5337
+ .kds-recap-list li {
5338
+ display: flex;
5339
+ justify-content: space-between;
5340
+ align-items: center;
5341
+ font-size: var(--kds-font-size-sm);
5342
+ }
5343
+
5344
+ .kds-recap-list .k {
5345
+ color: var(--kds-color-text-secondary);
5346
+ }
5347
+
5348
+ .kds-recap-list .v {
5349
+ color: var(--kds-color-text-primary);
5350
+ font-weight: 500;
5351
+ }
5352
+
5353
+ .kds-recap-list .v.placeholder {
5354
+ color: var(--kds-color-text-hint);
5355
+ }
5356
+
5357
+ /* -- Button Success (green CTA) -- */
5358
+ button.kds-btn-success,
5359
+ a.kds-btn-success {
5360
+ background: var(--kds-color-success-main);
5361
+ color: #fff;
5362
+ border: none;
5363
+ box-shadow: 0px 3px 1px -2px rgba(0,0,0,.2),
5364
+ 0px 2px 2px 0px rgba(0,0,0,.14),
5365
+ 0px 1px 5px 0px rgba(0,0,0,.12);
5366
+ }
5367
+
5368
+ button.kds-btn-success:hover:not(:disabled),
5369
+ a.kds-btn-success:hover:not(:disabled) {
5370
+ background: var(--kds-color-success-dark);
5371
+ }
5372
+
5373
+ button.kds-btn-success:disabled,
5374
+ a.kds-btn-success:disabled {
5375
+ background-color: var(--kds-color-action-disabled-bg);
5376
+ color: var(--kds-color-action-disabled);
5377
+ box-shadow: none;
5378
+ }
5379
+
5380
+ /* -- Field Helper Text -- */
5381
+ .kds-field-helper {
5382
+ font-size: var(--kds-font-size-xs);
5383
+ color: var(--kds-color-text-secondary);
5384
+ margin: var(--kds-spacing-0-75) var(--kds-spacing-1-75) 0;
5385
+ }
5386
+
5387
+ /* -- Bank Row Avatar with initials -- */
5388
+ .kds-bank-row-logo.initials {
5389
+ border-radius: var(--kds-radius-full);
5390
+ color: #fff;
5391
+ font-weight: 700;
5392
+ font-size: 11px;
5393
+ width: 32px;
5394
+ height: 32px;
5395
+ }
5396
+
5397
+ .kds-bank-row-logo.neutral {
5398
+ background: var(--kds-color-divider);
5399
+ color: var(--kds-color-text-secondary);
5400
+ }
5401
+
5402
+ .kds-bank-row-logo.neutral i {
5403
+ font-size: 18px;
5404
+ }
5405
+
5406
+ /* Reset ripple on additional interactive elements */
5407
+ .kds-bank-row::after,
5408
+ button.kds-btn-success::after {
5409
+ display: none;
5410
+ }
5411
+
5412
+ /* -- Expand Section (border-top separator before expand toggle) -- */
5413
+ .kds-expand-section {
5414
+ margin-top: var(--kds-spacing-2);
5415
+ border-top: 1px solid var(--kds-color-divider);
5416
+ padding-top: var(--kds-spacing-1-5);
5417
+ }
5418
+
5419
+ /* -- Alert inline (borderless, used inside cards) -- */
5420
+ .kds-alert-inline {
5421
+ border: none;
5422
+ }
5423
+
5424
+ /* -- Card dimmed (behind overlays) -- */
5425
+ .kds-card-dimmed {
5426
+ opacity: 0.45;
5427
+ pointer-events: none;
5428
+ }
5429
+
5430
+ /* -- Button stack (vertical button group) -- */
5431
+ .kds-btn-stack {
5432
+ display: flex;
5433
+ flex-direction: column;
5434
+ gap: var(--kds-spacing-1-25);
5435
+ margin-top: var(--kds-spacing-2);
5436
+ }
5437
+
5438
+ /* -- Bank list (bank row container) -- */
5439
+ .kds-bank-list {
5440
+ display: flex;
5441
+ flex-direction: column;
5442
+ gap: var(--kds-spacing-1);
5443
+ margin-top: var(--kds-spacing-1);
5444
+ }
5445
+
5446
+ /* -- Field group spacing -- */
5447
+ .kds-field-group {
5448
+ margin-top: var(--kds-spacing-1-75);
5449
+ }
5450
+
5451
+ /* -- Color utilities -- */
5452
+ .kds-color-primary { color: var(--kds-color-primary-main); }
5453
+ .kds-color-success { color: var(--kds-color-success-main); }
5454
+ .kds-color-warning { color: var(--kds-color-warning-main); }
5455
+ .kds-color-error { color: var(--kds-color-error-main); }
5456
+ .kds-color-info { color: var(--kds-color-info-main); }
5457
+
5458
+ /* -- Text utilities -- */
5459
+ .kds-text-secondary {
5460
+ color: var(--kds-color-text-secondary);
5461
+ font-size: var(--kds-font-size-sm);
5462
+ }
5463
+
5464
+ .kds-link {
5465
+ color: var(--kds-color-primary-main);
5466
+ text-decoration: none;
5467
+ }
5468
+ .kds-link:hover { text-decoration: underline; }
5469
+
5470
+ /* -- Field helper (centered) -- */
5471
+ .kds-field-helper-center {
5472
+ text-align: center;
5473
+ margin-top: var(--kds-spacing-1-25);
5474
+ }
5475
+
5476
+ /* -- Bottom sheet illustration -- */
5477
+ .kds-bottom-sheet-illustration {
5478
+ margin: var(--kds-spacing-1) auto var(--kds-spacing-1-75);
5479
+ display: grid;
5480
+ place-items: center;
5481
+ }
5482
+ .kds-bottom-sheet-illustration svg {
5483
+ fill: none;
5484
+ }
5485
+
5486
+ /* -- Bottom sheet description (subtle / smaller) -- */
5487
+ .kds-bottom-sheet-description-subtle {
5488
+ color: var(--kds-color-text-secondary);
5489
+ font-size: var(--kds-font-size-sm);
5490
+ }
5491
+
5492
+ /* -- Copy header with top spacing -- */
5493
+ .kds-copy-header.spaced {
5494
+ margin-top: var(--kds-spacing-2-5);
5495
+ }