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

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-23T17:10:43.679Z
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,857 @@ 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
+ border: 1px solid var(--kds-color-divider);
4573
+ border-radius: var(--kds-radius-lg);
4574
+ text-align: left;
4575
+ cursor: pointer;
4576
+ transition: border-color 0.2s, background 0.2s;
4577
+ margin-bottom: var(--kds-spacing-2);
4578
+ }
4579
+
4580
+ .kds-bank-row:hover {
4581
+ border-color: var(--kds-color-primary-main);
4582
+ background: var(--kds-color-primary-faint);
4583
+ }
4584
+
4585
+ .kds-bank-row-logo {
4586
+ width: 40px;
4587
+ height: 40px;
4588
+ border-radius: var(--kds-radius-md);
4589
+ display: grid;
4590
+ place-items: center;
4591
+ overflow: hidden;
4592
+ flex-shrink: 0;
4593
+ }
4594
+
4595
+ .kds-bank-row-logo img {
4596
+ width: 100%;
4597
+ height: 100%;
4598
+ object-fit: contain;
4599
+ }
4600
+
4601
+ .kds-bank-row-name {
4602
+ flex: 1;
4603
+ font-weight: 500;
4604
+ font-size: var(--kds-font-size-base);
4605
+ color: var(--kds-color-text-primary);
4606
+ }
4607
+
4608
+ .kds-bank-row > i {
4609
+ color: var(--kds-color-text-secondary);
4610
+ flex-shrink: 0;
4611
+ }
4612
+
4613
+ /* Selected state */
4614
+ .kds-bank-row.selected {
4615
+ border-color: var(--kds-color-primary-main);
4616
+ background: var(--kds-color-primary-faint);
4617
+ }
4618
+
4619
+ .kds-bank-row.selected > i {
4620
+ color: var(--kds-color-primary-main);
4621
+ }
4622
+
4623
+ /* Disabled state */
4624
+ .kds-bank-row:disabled,
4625
+ .kds-bank-row.disabled {
4626
+ opacity: 0.5;
4627
+ cursor: not-allowed;
4628
+ pointer-events: none;
4629
+ }
4630
+
4631
+ /* ========================================
4632
+ 08 - STICKY CTA BAR (.kds-cta-bar)
4633
+ Fixed bottom action bar with primary button
4634
+ ======================================== */
4635
+
4636
+ .kds-cta-bar {
4637
+ position: sticky;
4638
+ bottom: 0;
4639
+ display: flex;
4640
+ gap: var(--kds-spacing-1-25);
4641
+ padding: var(--kds-spacing-2);
4642
+ background: #FFFFFF;
4643
+ border-top: 1px solid var(--kds-color-divider);
4644
+ padding-bottom: calc(var(--kds-spacing-2) + env(safe-area-inset-bottom));
4645
+ z-index: 100;
4646
+ }
4647
+
4648
+ .kds-cta-bar > button {
4649
+ flex: 1;
4650
+ min-height: 48px;
4651
+ }
4652
+
4653
+ .kds-cta-bar > button.primary,
4654
+ .kds-cta-bar > button.kds-btn-primary {
4655
+ flex: 1;
4656
+ }
4657
+
4658
+ /* Floating variant (no border, with shadow) */
4659
+ .kds-cta-bar.floating {
4660
+ border-top: none;
4661
+ box-shadow: 0 -4px 16px rgba(16,24,40,.08);
4662
+ }
4663
+
4664
+ /* ========================================
4665
+ 09 - SUCCESS MARK (.kds-success-mark)
4666
+ Large success icon for completion screens
4667
+ ======================================== */
4668
+
4669
+ .kds-success-mark {
4670
+ width: 64px;
4671
+ height: 64px;
4672
+ border-radius: var(--kds-radius-full);
4673
+ background: var(--kds-color-success-soft);
4674
+ border: 2px solid var(--kds-color-success-main);
4675
+ display: grid;
4676
+ place-items: center;
4677
+ color: var(--kds-color-success-main);
4678
+ animation: kds-pop 0.45s ease-out;
4679
+ margin: 0 auto;
4680
+ }
4681
+
4682
+ .kds-success-mark i {
4683
+ font-size: 32px;
4684
+ font-weight: 700;
4685
+ }
4686
+
4687
+ /* Error variant */
4688
+ .kds-success-mark.error {
4689
+ background: rgba(211, 47, 47, 0.08);
4690
+ border-color: var(--kds-color-error-main);
4691
+ color: var(--kds-color-error-main);
4692
+ }
4693
+
4694
+ /* Warning variant */
4695
+ .kds-success-mark.warning {
4696
+ background: rgba(237, 108, 2, 0.08);
4697
+ border-color: var(--kds-color-warning-main);
4698
+ color: var(--kds-color-warning-main);
4699
+ }
4700
+
4701
+ @keyframes kds-pop {
4702
+ 0% {
4703
+ transform: scale(0.6);
4704
+ opacity: 0;
4705
+ }
4706
+ 60% {
4707
+ transform: scale(1.08);
4708
+ opacity: 1;
4709
+ }
4710
+ 100% {
4711
+ transform: scale(1);
4712
+ }
4713
+ }
4714
+
4715
+ /* ========================================
4716
+ RESET: Disable BeerCSS ripple ::after on kds-* buttons
4717
+ ======================================== */
4718
+
4719
+ .kds-expand-toggle::after,
4720
+ .kds-copy-row::after,
4721
+ .kds-copy-all::after,
4722
+ .kds-segmented-tabs button::after,
4723
+ .kds-bottom-sheet-actions button::after {
4724
+ display: none;
4725
+ }
4726
+
4727
+ /* ========================================
4728
+ 10 - SECURE FOOTER (.kds-secure-footer)
4729
+ Trust badge footer for payment flows
4730
+ ======================================== */
4731
+
4732
+ .kds-secure-footer {
4733
+ display: flex;
4734
+ align-items: center;
4735
+ justify-content: center;
4736
+ gap: var(--kds-spacing-1);
4737
+ color: var(--kds-color-text-disabled);
4738
+ font-size: var(--kds-font-size-xs);
4739
+ padding: var(--kds-spacing-1) 0;
4740
+ }
4741
+
4742
+ .kds-secure-footer i {
4743
+ font-size: var(--kds-font-size-sm);
4744
+ }
4745
+
4746
+ .kds-secure-footer-code {
4747
+ color: var(--kds-color-text-hint);
4748
+ }
4749
+
4750
+ /* ========================================
4751
+ 11 - EXPAND TOGGLE (.kds-expand-toggle + .kds-expand-panel)
4752
+ Collapsible detail section
4753
+ ======================================== */
4754
+
4755
+ .kds-expand-toggle {
4756
+ background: none;
4757
+ border: 0;
4758
+ padding: var(--kds-spacing-0-5) 0;
4759
+ color: var(--kds-color-primary-main);
4760
+ font-weight: var(--kds-font-weight-medium);
4761
+ font-size: var(--kds-font-size-sm);
4762
+ cursor: pointer;
4763
+ display: inline-flex;
4764
+ align-items: center;
4765
+ gap: var(--kds-spacing-0-75);
4766
+ }
4767
+
4768
+ .kds-expand-toggle:hover {
4769
+ background: transparent;
4770
+ }
4771
+
4772
+ .kds-expand-toggle:hover span {
4773
+ text-decoration: underline;
4774
+ }
4775
+
4776
+ .kds-expand-toggle i {
4777
+ font-size: var(--kds-font-size-base);
4778
+ transition: transform var(--kds-transition-shorter, 0.2s);
4779
+ }
4780
+
4781
+ .kds-expand-toggle[aria-expanded="true"] i {
4782
+ transform: rotate(180deg);
4783
+ }
4784
+
4785
+ .kds-expand-panel {
4786
+ overflow: hidden;
4787
+ transition: max-height 0.28s ease, margin-top 0.28s ease;
4788
+ max-height: 0;
4789
+ }
4790
+
4791
+ .kds-expand-panel[hidden] {
4792
+ display: block;
4793
+ max-height: 0;
4794
+ }
4795
+
4796
+ .kds-expand-panel.open {
4797
+ max-height: 800px;
4798
+ margin-top: var(--kds-spacing-1);
4799
+ }
4800
+
4801
+ /* ========================================
4802
+ 12 - COPY ROW (.kds-copy-row + .kds-copy-list + .kds-copy-all)
4803
+ Clipboard-copyable data rows with visual feedback
4804
+ ======================================== */
4805
+
4806
+ .kds-copy-header {
4807
+ display: flex;
4808
+ align-items: center;
4809
+ justify-content: space-between;
4810
+ margin-bottom: var(--kds-spacing-1-25);
4811
+ }
4812
+
4813
+ .kds-copy-all {
4814
+ display: inline-flex;
4815
+ align-items: center;
4816
+ gap: var(--kds-spacing-0-5);
4817
+ color: var(--kds-color-primary-main);
4818
+ font-weight: var(--kds-font-weight-semibold);
4819
+ font-size: var(--kds-font-size-xs);
4820
+ background: none;
4821
+ border: 0;
4822
+ cursor: pointer;
4823
+ padding: var(--kds-spacing-0-5) var(--kds-spacing-0-75);
4824
+ border-radius: var(--kds-radius-sm);
4825
+ }
4826
+
4827
+ .kds-copy-all:hover {
4828
+ background: var(--kds-color-action-hover);
4829
+ }
4830
+
4831
+ .kds-copy-all i {
4832
+ font-size: var(--kds-font-size-base);
4833
+ }
4834
+
4835
+ .kds-copy-list {
4836
+ display: flex;
4837
+ flex-direction: column;
4838
+ gap: var(--kds-spacing-1);
4839
+ }
4840
+
4841
+ .kds-copy-row {
4842
+ display: flex;
4843
+ align-items: center;
4844
+ justify-content: flex-start;
4845
+ gap: var(--kds-spacing-1-25);
4846
+ padding: var(--kds-spacing-1-5) var(--kds-spacing-1-75);
4847
+ border: var(--kds-border-width-sm) solid var(--kds-color-divider);
4848
+ border-radius: var(--kds-radius-md);
4849
+ background: var(--kds-color-surface, var(--kds-color-background-paper));
4850
+ cursor: pointer;
4851
+ text-align: left;
4852
+ position: relative;
4853
+ transition: background 0.15s, border-color 0.15s;
4854
+ font-size: var(--kds-font-size-sm);
4855
+ color: var(--kds-color-text-primary);
4856
+ }
4857
+
4858
+ .kds-copy-row:hover {
4859
+ background: var(--kds-color-background-muted);
4860
+ border-color: var(--kds-border-light);
4861
+ }
4862
+
4863
+ .kds-copy-row > i {
4864
+ color: var(--kds-color-text-secondary);
4865
+ font-size: var(--kds-font-size-lg);
4866
+ flex-shrink: 0;
4867
+ }
4868
+
4869
+ .kds-copy-row-label {
4870
+ font-size: var(--kds-font-size-caption);
4871
+ color: var(--kds-color-text-secondary);
4872
+ text-transform: uppercase;
4873
+ letter-spacing: 0.03em;
4874
+ display: block;
4875
+ margin-bottom: var(--kds-spacing-0-25);
4876
+ }
4877
+
4878
+ .kds-copy-row-value {
4879
+ font-weight: var(--kds-font-weight-medium);
4880
+ }
4881
+
4882
+ .kds-copy-row.copied {
4883
+ background: var(--kds-color-success-soft);
4884
+ border-color: var(--kds-color-success-main);
4885
+ }
4886
+
4887
+ .kds-copy-toast {
4888
+ position: absolute;
4889
+ right: var(--kds-spacing-1-5);
4890
+ top: 50%;
4891
+ transform: translateY(-50%);
4892
+ color: var(--kds-color-success-main);
4893
+ display: flex;
4894
+ align-items: center;
4895
+ gap: var(--kds-spacing-0-5);
4896
+ font-size: var(--kds-font-size-xs);
4897
+ font-weight: var(--kds-font-weight-semibold);
4898
+ pointer-events: none;
4899
+ opacity: 0;
4900
+ transition: opacity 0.2s;
4901
+ }
4902
+
4903
+ .kds-copy-row.copied .kds-copy-toast {
4904
+ opacity: 1;
4905
+ }
4906
+
4907
+ /* ========================================
4908
+ 13 - STATUS BLOCK (.kds-status-block)
4909
+ Status header with icon + title for result screens
4910
+ ======================================== */
4911
+
4912
+ .kds-status-block {
4913
+ text-align: center;
4914
+ padding: var(--kds-spacing-6) 0;
4915
+ }
4916
+
4917
+ .kds-status-block-icon {
4918
+ width: var(--kds-status-icon-size);
4919
+ height: var(--kds-status-icon-size);
4920
+ margin: 0 auto var(--kds-spacing-3);
4921
+ border-radius: var(--kds-radius-full);
4922
+ display: grid;
4923
+ place-items: center;
4924
+ }
4925
+
4926
+ .kds-status-block-icon i {
4927
+ font-size: var(--kds-font-size-4xl);
4928
+ font-weight: var(--kds-font-weight-bold);
4929
+ }
4930
+
4931
+ .kds-status-block-title {
4932
+ font-size: var(--kds-font-size-xl);
4933
+ font-weight: var(--kds-font-weight-bold);
4934
+ color: var(--kds-color-text-primary);
4935
+ margin: 0 0 var(--kds-spacing-1);
4936
+ }
4937
+
4938
+ .kds-status-block-description {
4939
+ font-size: var(--kds-font-size-sm);
4940
+ color: var(--kds-color-text-secondary);
4941
+ margin: 0;
4942
+ }
4943
+
4944
+ /* Variant: success */
4945
+ .kds-status-block[data-status="success"] .kds-status-block-icon {
4946
+ background: var(--kds-color-success-soft);
4947
+ border: var(--kds-border-width-md) solid var(--kds-color-success-main);
4948
+ color: var(--kds-color-success-main);
4949
+ }
4950
+
4951
+ /* Variant: pending (animated spinner) */
4952
+ .kds-status-block[data-status="pending"] .kds-status-block-icon {
4953
+ background: transparent;
4954
+ border: 3px solid var(--kds-color-divider);
4955
+ border-top-color: var(--kds-color-primary-main);
4956
+ animation: kds-spin 1s linear infinite;
4957
+ }
4958
+
4959
+ /* Variant: warn */
4960
+ .kds-status-block[data-status="warn"] .kds-status-block-icon {
4961
+ background: var(--kds-color-warning-soft);
4962
+ border: var(--kds-border-width-md) solid var(--kds-color-warning-main);
4963
+ color: var(--kds-color-warning-main);
4964
+ }
4965
+
4966
+ /* Variant: error */
4967
+ .kds-status-block[data-status="error"] .kds-status-block-icon {
4968
+ background: var(--kds-color-danger-soft);
4969
+ border: var(--kds-border-width-md) solid var(--kds-color-error-main);
4970
+ color: var(--kds-color-error-main);
4971
+ }
4972
+
4973
+ /* Inline variant: icon left + text right */
4974
+ .kds-status-block.inline {
4975
+ text-align: left;
4976
+ display: flex;
4977
+ align-items: center;
4978
+ gap: var(--kds-spacing-3);
4979
+ padding: var(--kds-spacing-1) 0;
4980
+ }
4981
+
4982
+ .kds-status-block.inline .kds-status-block-icon {
4983
+ width: var(--kds-status-icon-size-sm);
4984
+ height: var(--kds-status-icon-size-sm);
4985
+ margin: 0;
4986
+ flex-shrink: 0;
4987
+ }
4988
+
4989
+ .kds-status-block.inline .kds-status-block-icon i {
4990
+ font-size: var(--kds-font-size-xl);
4991
+ }
4992
+
4993
+ @keyframes kds-spin {
4994
+ to { transform: rotate(360deg); }
4995
+ }
4996
+
4997
+ /* ========================================
4998
+ 14 - BOTTOM SHEET (.kds-bottom-sheet)
4999
+ Modal bottom sheet for mobile confirmations
5000
+ ======================================== */
5001
+
5002
+ .kds-bottom-sheet-scrim {
5003
+ position: fixed;
5004
+ inset: 0;
5005
+ background: var(--kds-modal-backdrop);
5006
+ display: none;
5007
+ align-items: flex-end;
5008
+ justify-content: center;
5009
+ z-index: var(--kds-z-index-modal, 50);
5010
+ animation: kds-fade 0.2s ease both;
5011
+ }
5012
+
5013
+ .kds-bottom-sheet-scrim.open {
5014
+ display: flex;
5015
+ }
5016
+
5017
+ .kds-bottom-sheet {
5018
+ width: 100%;
5019
+ max-width: var(--kds-bottom-sheet-max-width);
5020
+ background: var(--kds-color-background-paper);
5021
+ border-radius: var(--kds-radius-2xl) var(--kds-radius-2xl) 0 0;
5022
+ padding: var(--kds-spacing-3-5) var(--kds-spacing-3) var(--kds-spacing-3);
5023
+ box-shadow: var(--kds-bottom-sheet-shadow);
5024
+ animation: kds-rise 0.28s cubic-bezier(0.2, 0.8, 0.2, 1) both;
5025
+ text-align: center;
5026
+ position: relative;
5027
+ }
5028
+
5029
+ .kds-bottom-sheet-grabber {
5030
+ position: absolute;
5031
+ left: 50%;
5032
+ top: var(--kds-spacing-1-25);
5033
+ transform: translateX(-50%);
5034
+ width: var(--kds-spacing-6);
5035
+ height: var(--kds-spacing-0-5);
5036
+ border-radius: var(--kds-radius-full);
5037
+ background: var(--kds-color-divider);
5038
+ }
5039
+
5040
+ .kds-bottom-sheet-icon {
5041
+ font-size: var(--kds-font-size-4xl);
5042
+ }
5043
+
5044
+ .kds-bottom-sheet-title {
5045
+ font-size: var(--kds-font-size-xl);
5046
+ margin: var(--kds-spacing-1-5) 0 var(--kds-spacing-0-5);
5047
+ }
5048
+
5049
+ .kds-bottom-sheet-description {
5050
+ font-size: var(--kds-font-size-sm);
5051
+ color: var(--kds-color-text-secondary);
5052
+ margin: 0;
5053
+ }
5054
+
5055
+ .kds-bottom-sheet-actions {
5056
+ margin-top: var(--kds-spacing-3);
5057
+ display: flex;
5058
+ flex-direction: column;
5059
+ gap: var(--kds-spacing-1-25);
5060
+ }
5061
+
5062
+ .kds-bottom-sheet-actions button {
5063
+ padding: var(--kds-spacing-1-5);
5064
+ border: 0;
5065
+ border-radius: var(--kds-radius-btn, var(--kds-radius-md));
5066
+ font-weight: var(--kds-font-weight-semibold);
5067
+ cursor: pointer;
5068
+ }
5069
+
5070
+ .kds-bottom-sheet-actions .kds-btn-danger {
5071
+ background: var(--kds-color-error-main);
5072
+ color: var(--kds-color-primary-contrast);
5073
+ }
5074
+
5075
+ .kds-bottom-sheet-actions .kds-btn-ghost {
5076
+ background: transparent;
5077
+ color: var(--kds-color-text-secondary);
5078
+ font-weight: var(--kds-font-weight-medium);
5079
+ }
5080
+
5081
+ @keyframes kds-fade {
5082
+ from { opacity: 0; }
5083
+ to { opacity: 1; }
5084
+ }
5085
+
5086
+ @keyframes kds-rise {
5087
+ from { transform: translateY(var(--kds-spacing-2-5)); opacity: 0.4; }
5088
+ to { transform: none; opacity: 1; }
5089
+ }
5090
+
5091
+ /* ========================================
5092
+ 15 - COUNTDOWN (.kds-countdown)
5093
+ Timer with HH:MM:SS for deadline-based flows
5094
+ ======================================== */
5095
+
5096
+ .kds-countdown {
5097
+ text-align: center;
5098
+ padding: var(--kds-spacing-1) 0;
5099
+ }
5100
+
5101
+ .kds-countdown-label {
5102
+ display: block;
5103
+ font-size: var(--kds-font-size-xs);
5104
+ color: var(--kds-color-text-secondary);
5105
+ text-transform: uppercase;
5106
+ letter-spacing: 0.04em;
5107
+ margin-bottom: var(--kds-spacing-1);
5108
+ }
5109
+
5110
+ .kds-countdown-value {
5111
+ font-size: var(--kds-font-size-2xl);
5112
+ font-weight: var(--kds-font-weight-bold);
5113
+ font-variant-numeric: tabular-nums;
5114
+ color: var(--kds-color-text-primary);
5115
+ }
5116
+
5117
+ .kds-countdown.urgent .kds-countdown-value {
5118
+ color: var(--kds-color-error-main);
5119
+ }
5120
+
5121
+ /* ========================================
5122
+ 16 - SEGMENTED TABS (.kds-segmented-tabs)
5123
+ Pill-group toggle for tab switching
5124
+ ======================================== */
5125
+
5126
+ .kds-segmented-tabs {
5127
+ height: var(--kds-spacing-5);
5128
+ background: var(--kds-color-background-elevated);
5129
+ border-radius: var(--kds-radius-lg);
5130
+ padding: var(--kds-spacing-0-25);
5131
+ display: flex;
5132
+ }
5133
+
5134
+ .kds-segmented-tabs.kds-segmented-tabs button {
5135
+ flex: 1;
5136
+ border: 0;
5137
+ background: transparent;
5138
+ border-radius: calc(var(--kds-radius-lg) - var(--kds-spacing-0-25));
5139
+ font-weight: var(--kds-font-weight-medium);
5140
+ font-size: var(--kds-font-size-sm);
5141
+ color: var(--kds-color-text-secondary);
5142
+ cursor: pointer;
5143
+ transition: background 0.2s, color 0.2s, box-shadow 0.2s;
5144
+ }
5145
+
5146
+ .kds-segmented-tabs.kds-segmented-tabs button.active,
5147
+ .kds-segmented-tabs.kds-segmented-tabs button[aria-selected="true"] {
5148
+ background: var(--kds-color-primary-main);
5149
+ color: var(--kds-color-primary-contrast);
5150
+ box-shadow: var(--kds-shadow-card);
5151
+ }