@uniai-fe/uds-primitives 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -316,6 +316,7 @@
316
316
  /* Layout presets */
317
317
  --input-width: 100%;
318
318
  --input-flex: 0 1 auto;
319
+ --input-layout-gap: var(--spacing-gap-3);
319
320
  /* Input sizing tokens; Button 변수 규칙과 동일한 prefix 패턴을 맞춘다. */
320
321
  --input-default-height-small: var(--theme-size-medium-1);
321
322
  --input-default-height-medium: var(--theme-size-medium-2);
@@ -323,10 +324,16 @@
323
324
  --input-tertiary-height-base: calc(var(--theme-size-medium-2) + 24px);
324
325
  --input-default-padding-inline: var(--spacing-padding-6);
325
326
  --input-default-padding-block: var(--spacing-padding-4);
327
+ --input-secondary-padding-block: var(--spacing-padding-4);
326
328
  --input-default-gap: var(--spacing-gap-4);
329
+ --input-affix-gap: var(--spacing-gap-3);
330
+ --input-utility-gap: var(--spacing-gap-2);
331
+ --input-tertiary-row-gap: var(--spacing-gap-1);
332
+ --input-tertiary-control-row-gap: var(--spacing-gap-1);
327
333
  --input-default-radius-base: var(--theme-radius-large-1);
328
334
  --input-tertiary-radius-base: var(--theme-radius-large-2);
329
335
  --input-table-radius-base: 0;
336
+ --input-tertiary-element-min-height: var(--theme-size-medium-2);
330
337
  --input-table-text-small-size: var(--font-body-xxsmall-size);
331
338
  --input-table-text-small-line-height: var(--font-body-xxsmall-line-height);
332
339
  --input-table-text-small-weight: var(--font-body-xxsmall-weight);
@@ -340,13 +347,26 @@
340
347
  --input-label-color: var(--color-label-standard);
341
348
  --input-label-accent-color: var(--color-primary-default);
342
349
  --input-label-error-color: var(--color-error);
350
+ --input-label-font-size: var(--font-label-small-size);
351
+ --input-label-line-height: var(--font-label-small-line-height);
352
+ --input-label-font-weight: var(--font-label-small-weight);
343
353
  --input-helper-color: var(--color-label-neutral);
344
354
  --input-helper-success-color: var(--color-success);
345
355
  --input-helper-error-color: var(--color-error);
346
356
  --input-helper-disabled-color: var(--color-label-disabled);
357
+ --input-helper-font-size: var(--font-label-small-size);
358
+ --input-helper-line-height: var(--font-label-small-line-height);
347
359
  /* Text & placeholder colors */
348
360
  --input-text-color: var(--color-label-strong);
361
+ --input-text-readonly-color: var(--color-label-strong);
362
+ --input-text-disabled-color: var(--color-label-disabled);
349
363
  --input-placeholder-color: var(--color-label-alternative);
364
+ --input-placeholder-disabled-color: var(--color-label-disabled);
365
+ --input-placeholder-readonly-color: var(--input-placeholder-disabled-color);
366
+ --input-font-size: var(--font-body-medium-size);
367
+ --input-line-height: var(--font-body-medium-line-height);
368
+ --input-font-weight: 400;
369
+ --input-letter-spacing: 0px;
350
370
  /* Border tokens */
351
371
  --input-border-color: var(--color-border-standard-cool-gray);
352
372
  --input-border-width-default: 1px;
@@ -354,6 +374,8 @@
354
374
  --input-border-active-color: var(--color-blue-80);
355
375
  --input-border-success-color: var(--color-blue-80);
356
376
  --input-border-table-default-color: transparent;
377
+ --input-border-table-disabled-color: var(--input-border-table-default-color);
378
+ --input-border-table-readonly-color: var(--input-border-table-disabled-color);
357
379
  /* error는 Figma 44% alpha */
358
380
  --input-border-error-color: rgba(218, 29, 11, 0.44);
359
381
  --input-border-disabled-color: var(--color-border-standard-cool-gray);
@@ -362,6 +384,15 @@
362
384
  --input-surface-color: var(--color-common-100);
363
385
  --input-surface-muted-color: var(--color-neutral-99);
364
386
  --input-surface-disabled-color: var(--color-neutral-95);
387
+ --input-table-surface-color: transparent;
388
+ --input-table-surface-disabled-color: var(--input-table-surface-color);
389
+ --input-table-surface-readonly-color: var(
390
+ --input-table-surface-disabled-color
391
+ );
392
+ --input-secondary-surface-color: transparent;
393
+ /* Status/affix colors */
394
+ --input-status-error-color: var(--color-error);
395
+ --input-status-success-color: var(--color-primary-default);
365
396
  --theme-navigation-height: 86px;
366
397
  --theme-navigation-padding-inline: 32px;
367
398
  --theme-navigation-padding-block-start: 8px;
@@ -405,6 +436,8 @@
405
436
  /* layout presets */
406
437
  --select-width: 100%;
407
438
  --select-flex: 0 1 auto;
439
+ --select-layout-gap: var(--spacing-gap-2);
440
+ --select-value-gap: var(--spacing-gap-2);
408
441
  --select-primary-height-small: var(--input-default-height-small);
409
442
  --select-primary-height-medium: var(--input-default-height-medium);
410
443
  --select-primary-height-large: var(--input-default-height-large);
@@ -426,9 +459,16 @@
426
459
  --select-table-border-default-color: var(--input-border-table-default-color);
427
460
  --select-table-border-focus-color: var(--input-border-active-color);
428
461
  --select-table-border-disabled-color: var(--input-border-disabled-color);
462
+ --select-table-border-readonly-color: var(
463
+ --select-table-border-disabled-color
464
+ );
429
465
  --select-table-surface-color: transparent;
430
466
  --select-table-surface-disabled-color: var(--input-surface-disabled-color);
467
+ --select-table-surface-readonly-color: var(
468
+ --select-table-surface-disabled-color
469
+ );
431
470
  --select-table-color-text: var(--input-text-color);
471
+ --select-table-color-text-readonly: var(--select-primary-color-text-readonly);
432
472
  --select-table-color-placeholder: var(--input-placeholder-color);
433
473
  --select-table-icon-color-default: var(--select-icon-color-default);
434
474
  --select-table-icon-color-focused: var(--select-icon-color-focused);
@@ -464,9 +504,11 @@
464
504
  --select-icon-size-medium: 2rem;
465
505
  --select-icon-size-large: 2rem;
466
506
  --select-primary-color-placeholder: var(--input-placeholder-color);
507
+ --select-primary-color-surface: var(--input-surface-color);
467
508
  --select-primary-color-text: var(--color-label-alternative);
468
509
  --select-primary-color-text-focused: var(--color-label-strong);
469
510
  --select-primary-color-text-disabled: var(--color-label-disabled);
511
+ --select-primary-color-text-readonly: var(--color-label-strong);
470
512
  --select-primary-color-border: var(--input-border-color);
471
513
  --select-primary-color-border-focused: var(--input-border-active-color);
472
514
  --select-primary-color-border-disabled: var(--input-border-disabled-color);
@@ -478,7 +520,15 @@
478
520
  );
479
521
  --select-primary-color-surface-disabled: var(--input-surface-disabled-color);
480
522
  --select-secondary-color-text: var(--color-label-standard);
523
+ --select-secondary-color-text-disabled: var(--color-label-disabled);
524
+ --select-secondary-color-text-readonly: var(
525
+ --select-primary-color-text-readonly
526
+ );
481
527
  --select-secondary-color-placeholder: var(--color-label-alternative);
528
+ --select-secondary-color-placeholder-disabled: var(--color-label-disabled);
529
+ --select-secondary-color-placeholder-readonly: var(
530
+ --select-secondary-color-placeholder-disabled
531
+ );
482
532
  --select-color-surface-secondary: transparent;
483
533
  --select-color-surface-secondary-hover: var(--color-surface-static-cool-gray);
484
534
  --select-color-surface-secondary-active: var(--color-surface-standard);
@@ -488,8 +538,10 @@
488
538
  --select-icon-color-disabled: var(--color-cool-gray-85);
489
539
  /* Multi select chip */
490
540
  --select-multiple-chip-gap: var(--spacing-gap-2);
541
+ --select-multiple-tag-label-gap: var(--spacing-gap-1);
491
542
  --select-multiple-chip-padding-inline: var(--spacing-padding-4);
492
543
  --select-multiple-chip-padding-block: 0px;
544
+ --select-multiple-chip-removable-padding-right: var(--spacing-padding-2);
493
545
  --select-multiple-chip-radius: var(--theme-radius-medium-2);
494
546
  --select-multiple-chip-font-size: var(--font-body-small-size);
495
547
  --select-multiple-chip-line-height: var(--font-body-small-line-height);
@@ -501,6 +553,7 @@
501
553
  --select-multiple-chip-border-color: transparent;
502
554
  --select-multiple-chip-remove-color: var(--color-label-strong);
503
555
  --select-multiple-chip-remove-hover-color: var(--color-label-strong);
556
+ --select-multiple-chip-remove-focus-outline-color: var(--color-border-strong);
504
557
  --select-multiple-chip-summary-color: var(--color-label-standard);
505
558
  --select-multiple-chip-summary-surface: var(--color-surface-standard);
506
559
  --select-multiple-chip-summary-border-color: transparent;
@@ -512,6 +565,8 @@
512
565
  --font-body-medium-line-height
513
566
  );
514
567
  --select-multiple-chip-summary-font-weight: 400;
568
+ /* Typography tokens */
569
+ --select-text-font-family: var(--font-body-medium-family);
515
570
  --table-border-color: var(--color-border-standard-cool-gray);
516
571
  --table-line-head-background-color: var(--color-surface-static-cool-gray);
517
572
  --table-grid-head-background-color: var(
@@ -522,6 +577,7 @@
522
577
  );
523
578
  --table-grid-row-highlight-background-color: rgba(229, 238, 255, 0.52);
524
579
  --table-cell-background-color: var(--color-surface-static-white);
580
+ --table-cell-content-gap: var(--spacing-gap-2);
525
581
  --table-line-cell-height-head: 44px;
526
582
  --table-line-cell-height-body: 56px;
527
583
  --table-grid-cell-height: 48px;
@@ -2317,7 +2373,7 @@ figure.chip {
2317
2373
  .input {
2318
2374
  display: flex;
2319
2375
  flex-direction: column;
2320
- gap: var(--spacing-gap-3);
2376
+ gap: var(--input-layout-gap);
2321
2377
  width: var(--input-width);
2322
2378
  flex: var(--input-flex);
2323
2379
  min-width: 0;
@@ -2347,9 +2403,9 @@ figure.chip {
2347
2403
 
2348
2404
  .input-label {
2349
2405
  color: var(--input-label-color);
2350
- font-size: var(--font-label-small-size);
2351
- line-height: var(--font-label-small-line-height);
2352
- font-weight: var(--font-label-small-weight);
2406
+ font-size: var(--input-label-font-size);
2407
+ line-height: var(--input-label-line-height);
2408
+ font-weight: var(--input-label-font-weight);
2353
2409
  }
2354
2410
 
2355
2411
  .input-label--visually-hidden {
@@ -2395,8 +2451,8 @@ figure.chip {
2395
2451
  border-bottom: var(--input-border-width-default) solid var(--input-border-color);
2396
2452
  border-radius: 0;
2397
2453
  padding-inline: 0;
2398
- padding-block: var(--spacing-padding-4);
2399
- background-color: transparent;
2454
+ padding-block: var(--input-secondary-padding-block);
2455
+ background-color: var(--input-secondary-surface-color);
2400
2456
  }
2401
2457
  .input-field[data-priority=secondary][data-state=active], .input-field[data-priority=secondary][data-state=focused] {
2402
2458
  border-bottom-color: var(--input-border-active-color);
@@ -2418,7 +2474,7 @@ figure.chip {
2418
2474
  border-radius: var(--input-tertiary-radius-base);
2419
2475
  background-color: var(--input-surface-color);
2420
2476
  min-height: var(--input-tertiary-height-base);
2421
- row-gap: var(--spacing-gap-1);
2477
+ row-gap: var(--input-tertiary-row-gap);
2422
2478
  column-gap: var(--input-default-gap);
2423
2479
  flex-wrap: wrap;
2424
2480
  align-items: center;
@@ -2427,7 +2483,7 @@ figure.chip {
2427
2483
  display: grid;
2428
2484
  grid-template-columns: auto minmax(0, 1fr);
2429
2485
  column-gap: var(--input-default-gap);
2430
- row-gap: var(--spacing-gap-1);
2486
+ row-gap: var(--input-tertiary-control-row-gap);
2431
2487
  align-items: center;
2432
2488
  flex: 1 1 auto;
2433
2489
  min-width: 0;
@@ -2438,7 +2494,7 @@ figure.chip {
2438
2494
  align-self: flex-start;
2439
2495
  }
2440
2496
  .input-field[data-priority=tertiary] .input-element {
2441
- min-height: var(--theme-size-medium-2);
2497
+ min-height: var(--input-tertiary-element-min-height);
2442
2498
  width: auto;
2443
2499
  flex: 1 1 auto;
2444
2500
  }
@@ -2449,7 +2505,15 @@ figure.chip {
2449
2505
  .input-field[data-priority=table] {
2450
2506
  border-radius: var(--input-table-radius-base);
2451
2507
  border-color: var(--input-border-table-default-color);
2452
- background-color: transparent;
2508
+ background-color: var(--input-table-surface-color);
2509
+ }
2510
+ .input-field[data-priority=table][data-state=disabled] {
2511
+ border-color: var(--input-border-table-disabled-color);
2512
+ background-color: var(--input-table-surface-disabled-color);
2513
+ }
2514
+ .input-field[data-priority=table][data-readonly=true] {
2515
+ border-color: var(--input-border-table-readonly-color);
2516
+ background-color: var(--input-table-surface-readonly-color);
2453
2517
  }
2454
2518
  .input-field:not([data-priority=secondary])[data-state=active], .input-field:not([data-priority=secondary])[data-state=focused] {
2455
2519
  border-color: var(--input-border-active-color);
@@ -2468,6 +2532,11 @@ figure.chip {
2468
2532
  border-width: var(--input-border-width-default);
2469
2533
  background-color: var(--input-surface-disabled-color); /* disabled 배경 토큰 */
2470
2534
  }
2535
+ .input-field:not([data-priority=secondary])[data-readonly=true] {
2536
+ border-color: var(--input-border-disabled-color);
2537
+ border-width: var(--input-border-width-default);
2538
+ background-color: var(--input-surface-disabled-color);
2539
+ }
2471
2540
 
2472
2541
  .input-element {
2473
2542
  flex: 1 1 auto;
@@ -2476,10 +2545,10 @@ figure.chip {
2476
2545
  background: transparent;
2477
2546
  color: var(--input-text-color);
2478
2547
  caret-color: var(--input-text-color);
2479
- font-size: var(--font-body-medium-size);
2480
- line-height: var(--font-body-medium-line-height);
2481
- font-weight: 400;
2482
- letter-spacing: 0px;
2548
+ font-size: var(--input-font-size);
2549
+ line-height: var(--input-line-height);
2550
+ font-weight: var(--input-font-weight);
2551
+ letter-spacing: var(--input-letter-spacing);
2483
2552
  outline: none;
2484
2553
  box-shadow: none;
2485
2554
  min-width: 0;
@@ -2487,11 +2556,18 @@ figure.chip {
2487
2556
  .input-element::placeholder {
2488
2557
  color: var(--input-placeholder-color);
2489
2558
  }
2559
+ .input-element:read-only {
2560
+ color: var(--input-text-readonly-color);
2561
+ caret-color: var(--input-text-readonly-color);
2562
+ }
2563
+ .input-element:read-only::placeholder {
2564
+ color: var(--input-placeholder-readonly-color);
2565
+ }
2490
2566
  .input-element:disabled {
2491
- color: var(--color-label-disabled);
2567
+ color: var(--input-text-disabled-color);
2492
2568
  }
2493
2569
  .input-element:disabled::placeholder {
2494
- color: var(--color-label-disabled);
2570
+ color: var(--input-placeholder-disabled-color);
2495
2571
  }
2496
2572
  .input-element:focus, .input-element:focus-visible, .input-element:focus-within {
2497
2573
  outline: none;
@@ -2509,9 +2585,9 @@ figure.chip {
2509
2585
  .input-field-utilities {
2510
2586
  display: flex;
2511
2587
  align-items: center;
2512
- gap: var(--spacing-gap-2);
2588
+ gap: var(--input-utility-gap);
2513
2589
  flex-shrink: 0;
2514
- margin-left: var(--spacing-gap-3);
2590
+ margin-left: var(--input-affix-gap);
2515
2591
  }
2516
2592
  .input-field-utilities .input-affix {
2517
2593
  margin-left: 0;
@@ -2520,8 +2596,8 @@ figure.chip {
2520
2596
  .input-inline-label {
2521
2597
  order: -2;
2522
2598
  flex-basis: 100%;
2523
- font-size: var(--font-label-small-size);
2524
- line-height: var(--font-label-small-line-height);
2599
+ font-size: var(--input-label-font-size);
2600
+ line-height: var(--input-label-line-height);
2525
2601
  color: var(--input-label-color);
2526
2602
  }
2527
2603
 
@@ -2530,7 +2606,7 @@ figure.chip {
2530
2606
  }
2531
2607
 
2532
2608
  .input-field[data-priority=tertiary] .input-element {
2533
- min-height: var(--theme-size-medium-2);
2609
+ min-height: var(--input-tertiary-element-min-height);
2534
2610
  }
2535
2611
 
2536
2612
  .input-field[data-priority=table][data-size=small] .input-element {
@@ -2553,8 +2629,8 @@ figure.chip {
2553
2629
 
2554
2630
  .input-helper-text {
2555
2631
  color: var(--input-helper-color);
2556
- font-size: var(--font-label-small-size);
2557
- line-height: var(--font-label-small-line-height);
2632
+ font-size: var(--input-helper-font-size);
2633
+ line-height: var(--input-helper-line-height);
2558
2634
  }
2559
2635
  [data-state=error] .input-helper-text {
2560
2636
  color: var(--input-border-error-color);
@@ -2572,19 +2648,19 @@ figure.chip {
2572
2648
  }
2573
2649
  .input-affix-left {
2574
2650
  order: -1;
2575
- margin-right: var(--spacing-gap-3);
2651
+ margin-right: var(--input-affix-gap);
2576
2652
  }
2577
2653
  .input-affix-right, .input-affix-clear, .input-affix-status {
2578
- margin-left: var(--spacing-gap-3);
2654
+ margin-left: var(--input-affix-gap);
2579
2655
  }
2580
2656
  .input-affix-clear, .input-affix-status {
2581
2657
  color: var(--input-text-color);
2582
2658
  }
2583
2659
  .input-affix-status[data-state=error] {
2584
- color: var(--color-error);
2660
+ color: var(--input-status-error-color);
2585
2661
  }
2586
2662
  .input-affix-status[data-state=success] {
2587
- color: var(--color-primary-default);
2663
+ color: var(--input-status-success-color);
2588
2664
  }
2589
2665
 
2590
2666
  .input-field[data-priority=secondary] {
@@ -2606,6 +2682,10 @@ figure.chip {
2606
2682
  border-bottom-color: var(--input-border-underline-disabled-color);
2607
2683
  border-bottom-width: var(--input-border-width-default);
2608
2684
  }
2685
+ .input-field[data-priority=secondary][data-readonly=true] {
2686
+ border-bottom-color: var(--input-border-underline-disabled-color);
2687
+ border-bottom-width: var(--input-border-width-default);
2688
+ }
2609
2689
 
2610
2690
  .input[data-state=active] .input-label,
2611
2691
  .input[data-state=active] .input-inline-label,
@@ -2635,11 +2715,16 @@ figure.chip {
2635
2715
  background-color: var(--input-surface-disabled-color);
2636
2716
  }
2637
2717
  .input[data-state=disabled] .input-field[data-priority=secondary] {
2638
- background-color: transparent;
2718
+ background-color: var(--input-secondary-surface-color);
2639
2719
  }
2640
2720
  .input[data-state=disabled] .input-field[data-priority=table] {
2641
- background-color: transparent;
2642
- border-color: var(--input-border-table-default-color);
2721
+ background-color: var(--input-table-surface-disabled-color);
2722
+ border-color: var(--input-border-table-disabled-color);
2723
+ }
2724
+
2725
+ .input[data-readonly=true] .input-field[data-priority=table] {
2726
+ background-color: var(--input-table-surface-readonly-color);
2727
+ border-color: var(--input-border-table-readonly-color);
2643
2728
  }
2644
2729
 
2645
2730
  .input-side {
@@ -3496,7 +3581,7 @@ figure.chip {
3496
3581
  width: var(--select-width);
3497
3582
  flex: var(--select-flex);
3498
3583
  flex-direction: column;
3499
- gap: var(--spacing-gap-2);
3584
+ gap: var(--select-layout-gap);
3500
3585
  min-width: 0;
3501
3586
  }
3502
3587
 
@@ -3535,7 +3620,7 @@ figure.chip {
3535
3620
  padding: var(--select-primary-padding-block) var(--select-primary-padding-inline);
3536
3621
  border: var(--select-primary-border-width-default) solid var(--select-primary-color-border);
3537
3622
  border-radius: var(--select-primary-radius-medium);
3538
- background-color: var(--input-surface-color);
3623
+ background-color: var(--select-primary-color-surface);
3539
3624
  cursor: pointer;
3540
3625
  transition: border-color 150ms ease, background-color 150ms ease, color 150ms ease;
3541
3626
  text-align: left;
@@ -3580,7 +3665,7 @@ figure.chip {
3580
3665
  background-color: var(--select-color-border-secondary-focused);
3581
3666
  }
3582
3667
  .select-button[data-priority=secondary][data-state=disabled], .select-button[data-priority=secondary]:disabled {
3583
- color: var(--color-label-disabled);
3668
+ color: var(--select-secondary-color-text-disabled);
3584
3669
  cursor: not-allowed;
3585
3670
  }
3586
3671
  .select-button[data-priority=table] {
@@ -3599,6 +3684,27 @@ figure.chip {
3599
3684
  border-width: var(--select-primary-border-width-focus);
3600
3685
  --select-icon-fill: var(--select-table-icon-color-focused);
3601
3686
  }
3687
+ .select-button:not([data-priority=secondary])[data-readonly=true] {
3688
+ border-color: var(--select-primary-color-border-disabled);
3689
+ background-color: var(--select-primary-color-surface-disabled);
3690
+ cursor: default;
3691
+ --select-icon-fill: var(--select-icon-color-disabled);
3692
+ }
3693
+ .select-button[data-priority=secondary][data-readonly=true] {
3694
+ border-color: transparent;
3695
+ background-color: var(--select-color-surface-secondary-disabled);
3696
+ cursor: default;
3697
+ }
3698
+ .select-button[data-priority=secondary][data-readonly=true]::after {
3699
+ background-color: var(--select-color-border-secondary-disabled);
3700
+ height: var(--select-secondary-underline-width-default);
3701
+ }
3702
+ .select-button[data-priority=table][data-readonly=true] {
3703
+ border-color: var(--select-table-border-readonly-color);
3704
+ background-color: var(--select-table-surface-readonly-color);
3705
+ cursor: not-allowed;
3706
+ --select-icon-fill: var(--select-table-icon-color-disabled);
3707
+ }
3602
3708
  .select-button:not([data-priority=secondary])[data-state=disabled], .select-button:not([data-priority=secondary]):disabled {
3603
3709
  border-color: var(--select-primary-color-border-disabled);
3604
3710
  background-color: var(--select-primary-color-surface-disabled);
@@ -3625,13 +3731,13 @@ figure.chip {
3625
3731
  min-width: 0;
3626
3732
  display: flex;
3627
3733
  flex-direction: column;
3628
- gap: var(--spacing-gap-2);
3734
+ gap: var(--select-value-gap);
3629
3735
  }
3630
3736
 
3631
3737
  .select-label {
3632
3738
  flex: 1 1 auto;
3633
3739
  min-width: 0;
3634
- font-family: var(--font-body-medium-family);
3740
+ font-family: var(--select-text-font-family);
3635
3741
  font-size: var(--select-text-medium-size);
3636
3742
  font-weight: var(--select-text-medium-weight);
3637
3743
  line-height: var(--select-text-medium-line-height);
@@ -3647,14 +3753,23 @@ figure.chip {
3647
3753
  .select-button[data-priority=table] .select-label {
3648
3754
  color: var(--select-table-color-text);
3649
3755
  }
3756
+ .select-button[data-priority=table][data-readonly=true] .select-label {
3757
+ color: var(--select-table-color-text-readonly);
3758
+ }
3650
3759
  .select-button[data-state=focused] .select-label, .select-button[data-open=true] .select-label {
3651
3760
  color: var(--select-primary-color-text-focused);
3652
3761
  }
3653
3762
  .select-button[data-state=disabled] .select-label {
3654
3763
  color: var(--select-primary-color-text-disabled);
3655
3764
  }
3765
+ .select-button[data-readonly=true] .select-label {
3766
+ color: var(--select-primary-color-text-readonly);
3767
+ }
3656
3768
  .select-button[data-priority=secondary][data-state=disabled] .select-label {
3657
- color: var(--color-label-disabled);
3769
+ color: var(--select-secondary-color-text-disabled);
3770
+ }
3771
+ .select-button[data-priority=secondary][data-readonly=true] .select-label {
3772
+ color: var(--select-secondary-color-text-readonly);
3658
3773
  }
3659
3774
 
3660
3775
  .select-label-placeholder {
@@ -3666,6 +3781,12 @@ figure.chip {
3666
3781
  .select-button[data-priority=table] .select-label-placeholder {
3667
3782
  color: var(--select-table-color-placeholder);
3668
3783
  }
3784
+ .select-button[data-state=disabled] .select-label-placeholder, .select-button[data-readonly=true] .select-label-placeholder {
3785
+ color: var(--select-primary-color-text-disabled);
3786
+ }
3787
+ .select-button[data-priority=secondary][data-state=disabled] .select-label-placeholder, .select-button[data-priority=secondary][data-readonly=true] .select-label-placeholder {
3788
+ color: var(--select-secondary-color-placeholder-disabled);
3789
+ }
3669
3790
 
3670
3791
  .select-button[data-size=small] .select-label {
3671
3792
  font-size: var(--select-text-small-size);
@@ -3718,7 +3839,7 @@ figure.chip {
3718
3839
  gap: var(--select-multiple-chip-gap);
3719
3840
  padding: var(--select-multiple-chip-padding-block) var(--select-multiple-chip-padding-inline);
3720
3841
  border-radius: var(--select-multiple-chip-radius);
3721
- border: 1px solid var(--select-multiple-chip-border-color, var(--color-border-standard-cool-gray));
3842
+ border: 1px solid var(--select-multiple-chip-border-color);
3722
3843
  background-color: var(--select-multiple-chip-surface);
3723
3844
  color: var(--select-multiple-chip-color);
3724
3845
  font-size: var(--select-multiple-chip-font-size);
@@ -3731,7 +3852,7 @@ figure.chip {
3731
3852
  border-color: var(--select-color-border-secondary-focused);
3732
3853
  }
3733
3854
  .select-tag[data-removable=true] {
3734
- padding-right: var(--spacing-padding-2);
3855
+ padding-right: var(--select-multiple-chip-removable-padding-right);
3735
3856
  }
3736
3857
 
3737
3858
  .select-tag[data-kind=summary],
@@ -3750,7 +3871,7 @@ figure.chip {
3750
3871
  .select-tag-label {
3751
3872
  display: flex;
3752
3873
  align-items: center;
3753
- gap: var(--spacing-gap-1);
3874
+ gap: var(--select-multiple-tag-label-gap);
3754
3875
  min-width: 0;
3755
3876
  }
3756
3877
 
@@ -3776,7 +3897,7 @@ figure.chip {
3776
3897
  transition: color 150ms ease;
3777
3898
  }
3778
3899
  .select-tag-remove:focus-visible {
3779
- outline: 0.2rem solid var(--color-border-strong);
3900
+ outline: 0.2rem solid var(--select-multiple-chip-remove-focus-outline-color);
3780
3901
  outline-offset: 0.1rem;
3781
3902
  }
3782
3903
  .select-tag-remove:hover {
@@ -4094,6 +4215,7 @@ figure.chip {
4094
4215
  height: 100%;
4095
4216
  justify-content: flex-start;
4096
4217
  box-sizing: border-box;
4218
+ gap: var(--table-cell-content-gap);
4097
4219
  padding-inline: var(--table-cell-padding-inline);
4098
4220
  padding-block: var(--table-cell-padding-block);
4099
4221
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-primitives",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "UNIAI Design System; Primitives Components Package",
5
5
  "type": "module",
6
6
  "private": false,
@@ -53,7 +53,8 @@
53
53
  "module:typecheck": "pnpm typecheck",
54
54
  "module:build": "pnpm build",
55
55
  "design-primitives:build": "pnpm run build",
56
- "design-primitives:dev": "pnpm run dev"
56
+ "design-primitives:dev": "pnpm run dev",
57
+ "publish:public": "bash ../../../scripts/npm-publish.sh"
57
58
  },
58
59
  "peerDependencies": {
59
60
  "@mantine/core": "^8",
@@ -52,6 +52,8 @@ export default function AddressFieldTemplate({
52
52
  }: AddressTemplateProps) {
53
53
  const formContext = useFormContext<FieldValues>();
54
54
  const inputSize = inputStyle?.size ?? "medium";
55
+ // 변경: 템플릿 루트 disabled가 선언되면 하위 컨트롤에 우선 적용한다.
56
+ const isRootDisabled = disabled === true;
55
57
 
56
58
  const resolvedAddressFieldName = addressFieldName
57
59
  ? (addressFieldName as Path<FieldValues>)
@@ -84,6 +86,11 @@ export default function AddressFieldTemplate({
84
86
  : detailInput?.register;
85
87
  const detailName =
86
88
  detailInput?.name ?? detailFieldName ?? resolvedDetailFieldName;
89
+ const isAddressFieldDisabled =
90
+ isRootDisabled || Boolean(addressInput?.disabled);
91
+ const isDetailFieldDisabled =
92
+ isRootDisabled || Boolean(detailInput?.disabled);
93
+ const isFindButtonDisabled = isRootDisabled || Boolean(buttonProps?.disabled);
87
94
 
88
95
  return (
89
96
  <div className={clsx("input-address-container", className)}>
@@ -95,7 +102,7 @@ export default function AddressFieldTemplate({
95
102
  value={resolvedAddress.text}
96
103
  width="fill"
97
104
  readOnly
98
- disabled
105
+ disabled={isAddressFieldDisabled}
99
106
  className="input-address-field input-address-field-base"
100
107
  />
101
108
  <AddressFindButton
@@ -115,7 +122,7 @@ export default function AddressFieldTemplate({
115
122
  ? "large"
116
123
  : "medium")
117
124
  }
118
- disabled={disabled ?? buttonProps?.disabled}
125
+ disabled={isFindButtonDisabled}
119
126
  />
120
127
  </div>
121
128
  {detailInput && (
@@ -126,6 +133,8 @@ export default function AddressFieldTemplate({
126
133
  register={detailRegister}
127
134
  name={detailName}
128
135
  width="full"
136
+ // 변경: 루트 disabled가 선언되면 상세 주소 입력도 비활성화한다.
137
+ disabled={isDetailFieldDisabled}
129
138
  className="input-address-field input-address-field-detail"
130
139
  />
131
140
  </div>
@@ -86,6 +86,7 @@ const InputBase = forwardRef<HTMLInputElement, InputProps>(
86
86
  },
87
87
  ref,
88
88
  ) => {
89
+ const isReadOnly = restProps.readOnly === true;
89
90
  // table priority는 width 지정이 없으면 셀 가로폭을 기본으로 채운다.
90
91
  const isTablePriority = priority === "table";
91
92
  const resolvedBlock = block || (isTablePriority && width === undefined);
@@ -104,8 +105,9 @@ const InputBase = forwardRef<HTMLInputElement, InputProps>(
104
105
  : false;
105
106
  });
106
107
  useEffect(() => {
107
- if (disabled || stateProp === "disabled") setIsFocused(false);
108
- }, [disabled, stateProp]);
108
+ if (disabled || stateProp === "disabled" || isReadOnly)
109
+ setIsFocused(false);
110
+ }, [disabled, isReadOnly, stateProp]);
109
111
 
110
112
  useEffect(() => {
111
113
  if (value !== undefined && value !== null)
@@ -129,6 +131,10 @@ const InputBase = forwardRef<HTMLInputElement, InputProps>(
129
131
  );
130
132
 
131
133
  const handleFocus = (event: FocusEvent<HTMLInputElement>) => {
134
+ if (isReadOnly) {
135
+ onFocus?.(event);
136
+ return;
137
+ }
132
138
  setIsFocused(true);
133
139
  onFocus?.(event);
134
140
  };
@@ -203,6 +209,7 @@ const InputBase = forwardRef<HTMLInputElement, InputProps>(
203
209
  data-priority={priority}
204
210
  data-size={size}
205
211
  data-state={visualState}
212
+ data-readonly={isReadOnly ? "true" : undefined}
206
213
  data-block={resolvedBlock ? "true" : undefined}
207
214
  {...(simulatedState ? { "data-simulated-state": simulatedState } : {})}
208
215
  data-width={widthAttr}
@@ -224,6 +231,7 @@ const InputBase = forwardRef<HTMLInputElement, InputProps>(
224
231
  data-state={visualState}
225
232
  data-priority={priority}
226
233
  data-size={size}
234
+ data-readonly={isReadOnly ? "true" : undefined}
227
235
  data-block={resolvedBlock ? "true" : undefined}
228
236
  >
229
237
  {/* 필드 컨트롤 wrapper; 슬롯과 input 정렬 */}