sales-frontend-components 0.0.59 → 0.0.61

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.
@@ -0,0 +1,708 @@
1
+ @use 'sales-frontend-design-system/design-system-context' as *;
2
+
3
+ /* ============================
4
+ 동의서 컨텐츠 공통 스타일
5
+ ============================ */
6
+
7
+ .consent-content-wrapper {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: margin(textfield-vertical);
11
+ }
12
+
13
+ /* ============================
14
+ 스티키 알림 영역
15
+ ============================ */
16
+
17
+ .sticky-notification {
18
+ position: sticky;
19
+ top: 0;
20
+ z-index: 10;
21
+ padding: margin(card-around-medium);
22
+ margin-bottom: margin(textfield-vertical);
23
+ background-color: colors(surface-neutral);
24
+ border-radius: radius-basic(medium);
25
+ box-shadow: shadow(elevation-2);
26
+
27
+ // 스티키 전환 시 부드러운 애니메이션
28
+ transition: box-shadow 0.2s ease-in-out;
29
+
30
+ // 스크롤 시 더 강한 그림자 효과 (브라우저에서 지원하는 경우)
31
+ &:has(+ *) {
32
+ box-shadow: shadow(elevation-3);
33
+ }
34
+ }
35
+
36
+ /* ============================
37
+ 조합형 동의서 래퍼
38
+ ============================ */
39
+
40
+ .combined-consent-wrapper {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 0.625rem; // 10px gap for multiple consents
44
+ }
45
+
46
+ .consent-item {
47
+ // 각 동의서 컴포넌트의 스티키 알림 숨김 (상위에서 관리)
48
+ .sticky-notification {
49
+ display: none;
50
+ }
51
+ }
52
+
53
+ .consent-content {
54
+ display: flex;
55
+ flex-direction: column;
56
+ padding: margin(card-around-large);
57
+ background-color: colors(surface-neutral);
58
+ // border: none;
59
+ // border-radius: radius-basic(xlarge); // 모바일일 경우 레디어스 X
60
+
61
+ @include media(tablet) {
62
+ border: 1px solid colors(border-neutral_2);
63
+ border-radius: radius-basic(xlarge);
64
+ }
65
+ }
66
+
67
+ // 타이틀/디스크립션/내용 카드 간 간격 스택
68
+ .consent-stack {
69
+ display: flex;
70
+ flex-direction: column;
71
+ background-color: transparent;
72
+ // background-color: colors(surface-neutral_1);
73
+ }
74
+
75
+ // 섹션 모음(섹션 카드들 사이 갭 전용 래퍼)
76
+ .sections-stack {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: margin(card);
80
+ // tablet: description-card 아래와의 간격
81
+ @include media(tablet) {
82
+ margin-top: margin(card);
83
+ }
84
+ }
85
+
86
+ // tablet: 타이틀-디스크립션 간격
87
+ .tablet-title-gap-medium {
88
+ @include media(tablet) {
89
+ margin-bottom: margin(title-medium);
90
+ }
91
+ }
92
+
93
+ // tablet: 상단 여백 title-medium
94
+ .tablet-top-gap-title-medium {
95
+ @include media(tablet) {
96
+ margin-top: margin(title-medium);
97
+ }
98
+ }
99
+
100
+ // 모바일에서 카드 간 갭 제거 (특정 화면에서만 적용 가능)
101
+ .consent-stack.mobile-tight {
102
+ gap: 0;
103
+
104
+ @include media(tablet) {
105
+ gap: margin(card);
106
+ }
107
+ }
108
+
109
+ // 헤더(타이틀+디스크립션) 영역: 좌우 패딩만, 상단 패딩 없음
110
+ .consent-header {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: margin(title-xlarge);
114
+ padding: padding(zero) grid-value(margin-sub);
115
+ }
116
+
117
+ /* ============================
118
+ 카드 타이틀 영역
119
+ ============================ */
120
+
121
+ // 카드 타이틀 래퍼
122
+ .card-title-wrapper {
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: space-between;
126
+ width: 100%;
127
+ }
128
+
129
+ .divider {
130
+ width: 100%;
131
+ height: 1px;
132
+ margin: margin(divider-large) 0;
133
+ background-color: colors(border-neutral_2);
134
+ }
135
+
136
+ // 타이틀 텍스트 영역
137
+ .title-text {
138
+ color: colors(text-body);
139
+
140
+ // 기본(title3)로 적용
141
+ @include apply-typography(title3);
142
+ }
143
+
144
+ // 타이틀과 오른쪽 컨텐츠가 함께 있는 영역
145
+ .title-with-button {
146
+ // Mobile: stack vertically
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: padding(xsmall);
150
+ align-items: flex-start;
151
+
152
+ // Tablet and up: row with space between
153
+ @include media(tablet) {
154
+ flex-direction: row;
155
+ gap: padding(medium);
156
+ align-items: center;
157
+ justify-content: space-between;
158
+ }
159
+ }
160
+
161
+ // 타이틀 오른쪽 컨텐츠 영역
162
+ .title-right-contents {
163
+ flex-shrink: 0;
164
+ }
165
+
166
+ // 필수 마크
167
+ .required-mark {
168
+ color: colors(text-primary);
169
+ }
170
+
171
+ // 선택 마크
172
+ .optional-mark {
173
+ color: colors(text-body_3);
174
+ }
175
+
176
+ /* ============================
177
+ 텍스트 스타일
178
+ ============================ */
179
+
180
+ // 기본 설명 텍스트
181
+ .description {
182
+ // 모바일: 더 옅은 본문 컬러로
183
+ color: colors(text-body_3);
184
+
185
+ @include apply-typography(body2);
186
+
187
+ // 태블릿부터 기존 컬러 유지
188
+ @include media(tablet) {
189
+ color: colors(text-body_2);
190
+ }
191
+ }
192
+
193
+ // 섹션
194
+ .section {
195
+ display: flex;
196
+ flex-direction: column;
197
+ }
198
+
199
+ // 섹션 제목
200
+ .section-title {
201
+ margin-bottom: margin(title-medium);
202
+ color: colors(text-body);
203
+
204
+ @include apply-typography(title5);
205
+ }
206
+
207
+ // 섹션 설명
208
+ .section-description {
209
+ color: colors(text-body_3);
210
+
211
+ @include apply-typography(body2);
212
+ }
213
+
214
+ // 서브 섹션
215
+ .sub-section {
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: margin(title-small);
219
+ }
220
+
221
+ // 서브 제목
222
+ .sub-title {
223
+ margin: 0;
224
+ color: colors(text-body);
225
+
226
+ @include apply-typography(subtitle3);
227
+ }
228
+
229
+ // 서브 설명
230
+ .sub-description {
231
+ margin: 0;
232
+ line-height: 1.6;
233
+ color: colors(text-body_3);
234
+
235
+ @include apply-typography(body2);
236
+ }
237
+
238
+ // 강조 텍스트
239
+ .highlight {
240
+ color: colors(text-primary);
241
+ }
242
+
243
+ .highlight-bold-typo {
244
+ @include apply-typography(subtitle3);
245
+ }
246
+
247
+ // 캡션 텍스트
248
+ .caption {
249
+ color: colors(text-neutral_1);
250
+
251
+ @include apply-typography(body3);
252
+ }
253
+
254
+ // 푸터 캡션 묶음: 문단 간 여백 제거
255
+ .footer-caption {
256
+ .section-description {
257
+ margin: 0;
258
+ }
259
+ }
260
+
261
+ /* ============================
262
+ 스크롤 안내 툴팁 (카드 내부용)
263
+ ============================ */
264
+ .scroll-guide-tooltip {
265
+ position: fixed;
266
+ bottom: calc(var(--bottom-bar-height, 0px) + 20px);
267
+ left: 50%;
268
+ z-index: 1000;
269
+ display: flex;
270
+ gap: padding(xsmall);
271
+ align-items: center;
272
+ padding: padding(medium);
273
+ background-color: colors(surface-secondary);
274
+ border: 1px solid colors(border-neutral_6);
275
+ border-radius: radius-basic(medium);
276
+ transform: translateX(-50%);
277
+ }
278
+
279
+ .tooltip-icon {
280
+ flex-shrink: 0;
281
+ color: colors(additional-semantic_3);
282
+ }
283
+
284
+ .tooltip-text {
285
+ color: colors(text-body_0);
286
+ white-space: nowrap;
287
+
288
+ @include apply-typography(body2);
289
+ }
290
+
291
+ /* ============================
292
+ Wrapper 스타일
293
+ ============================ */
294
+
295
+ .info-bar-wrapper1 {
296
+ display: flex;
297
+ flex-direction: column;
298
+ gap: padding(small);
299
+ align-items: flex-start;
300
+ justify-content: space-between;
301
+ margin-bottom: padding(xlarge);
302
+
303
+ @include media(tablet) {
304
+ flex-direction: row;
305
+ gap: padding(medium);
306
+ align-items: center;
307
+ }
308
+ }
309
+
310
+ .info-bar-wrapper2 {
311
+ padding-top: padding(xlarge);
312
+ padding-bottom: padding(xlarge);
313
+ }
314
+
315
+ // 반응형 가시성
316
+ .tablet-only {
317
+ display: none;
318
+
319
+ @include media(tablet) {
320
+ display: block;
321
+ }
322
+ }
323
+
324
+ .mobile-only {
325
+ display: block;
326
+
327
+ @include media(tablet) {
328
+ display: none;
329
+ }
330
+ }
331
+
332
+ /* ============================
333
+ 리스트 스타일
334
+ ============================ */
335
+
336
+ // 기본 리스트 스타일
337
+ .content-list {
338
+ padding-left: 0;
339
+ margin: 0;
340
+ list-style: none;
341
+
342
+ li {
343
+ position: relative;
344
+ padding: padding(xxxsmall) 0 padding(xxxsmall) 12px;
345
+ color: colors(text-body_3);
346
+
347
+ @include apply-typography(body2);
348
+ }
349
+
350
+ // Dot 스타일 (기본)
351
+ &.list-dot li::before {
352
+ position: absolute;
353
+ left: 0;
354
+ width: 0.25rem;
355
+ height: 0.25rem;
356
+ margin: padding(small) padding(xsmall) padding(small) 0;
357
+ content: '';
358
+ background-color: colors(text-body_3);
359
+ border-radius: 50%;
360
+ }
361
+
362
+ // 숫자 리스트 스타일
363
+ &.list-numbered {
364
+ counter-reset: list-counter;
365
+
366
+ li {
367
+ counter-increment: list-counter;
368
+
369
+ &::before {
370
+ position: absolute;
371
+ top: 0;
372
+ left: 0;
373
+ color: colors(text-body_3);
374
+ content: counter(list-counter) '.';
375
+
376
+ @include apply-typography(body2);
377
+ }
378
+ }
379
+ }
380
+
381
+ // 알파벳 리스트 스타일
382
+ &.list-alpha {
383
+ counter-reset: list-counter;
384
+
385
+ li {
386
+ counter-increment: list-counter;
387
+
388
+ &::before {
389
+ position: absolute;
390
+ top: 0;
391
+ left: 0;
392
+ color: colors(text-body_3);
393
+ content: counter(list-counter, lower-alpha) ')';
394
+
395
+ @include apply-typography(body2);
396
+ }
397
+ }
398
+ }
399
+
400
+ // 로마숫자 리스트 스타일
401
+ &.list-roman {
402
+ counter-reset: list-counter;
403
+
404
+ li {
405
+ counter-increment: list-counter;
406
+
407
+ &::before {
408
+ position: absolute;
409
+ top: 0;
410
+ left: 0;
411
+ color: colors(text-body_3);
412
+ content: counter(list-counter, lower-roman) '.';
413
+
414
+ @include apply-typography(body2);
415
+ }
416
+ }
417
+ }
418
+
419
+ // 대시(-) 스타일
420
+ &.list-dash li::before {
421
+ position: absolute;
422
+ top: 0;
423
+ left: 0;
424
+ color: colors(text-body_3);
425
+ content: '−'; // em dash 사용
426
+
427
+ @include apply-typography(body2);
428
+ }
429
+
430
+ // 체크 마크 스타일
431
+ &.list-check li::before {
432
+ position: absolute;
433
+ top: 0;
434
+ left: 0;
435
+ color: colors(text-primary);
436
+ content: '✓';
437
+
438
+ @include apply-typography(body2);
439
+ }
440
+
441
+ // 마커 없는 리스트 (단순 나열)
442
+ &.list-none li {
443
+ padding-left: 0; // 들여쓰기 제거
444
+
445
+ &::before {
446
+ display: none; // 마커 숨김
447
+ }
448
+ }
449
+
450
+ // 최소 들여쓰기 리스트 (마커 없이 약간의 들여쓰기만)
451
+ &.list-indent li {
452
+ padding-left: padding(small); // 최소한의 들여쓰기
453
+
454
+ &::before {
455
+ display: none; // 마커 숨김
456
+ }
457
+ }
458
+ }
459
+
460
+ /* ============================
461
+ 단순 텍스트 블록 (리스트가 아닌 경우)
462
+ ============================ */
463
+
464
+ // 단순 텍스트 블록들
465
+ .text-block {
466
+ color: colors(text-body_3);
467
+
468
+ @include apply-typography(body2);
469
+
470
+ // 블록 간 간격
471
+ &:not(:last-child) {
472
+ margin-bottom: padding(small);
473
+ }
474
+
475
+ // 강조 텍스트
476
+ &.text-emphasis {
477
+ font-weight: font-weight(medium);
478
+ color: colors(text-body);
479
+ }
480
+
481
+ // 작은 텍스트
482
+ &.text-small {
483
+ @include apply-typography(body3);
484
+ }
485
+
486
+ // 들여쓰기 있는 텍스트
487
+ &.text-indent {
488
+ padding-left: padding(medium);
489
+ }
490
+
491
+ // 깊은 들여쓰기
492
+ &.text-indent-deep {
493
+ padding-left: padding(large);
494
+ }
495
+ }
496
+
497
+ // 텍스트 블록 컨테이너
498
+ .text-blocks {
499
+ display: flex;
500
+ flex-direction: column;
501
+ gap: padding(small);
502
+ }
503
+
504
+ /* ============================
505
+ 체크박스 및 동의 영역
506
+ ============================ */
507
+
508
+ // 동의 체크박스 영역
509
+ .agreement-section {
510
+ display: flex;
511
+ flex-direction: column;
512
+ gap: padding(small);
513
+ align-items: flex-start;
514
+ justify-content: space-between;
515
+
516
+ @include media(tablet) {
517
+ flex-direction: row;
518
+ gap: 0.875rem;
519
+ align-items: flex-end;
520
+ }
521
+ }
522
+
523
+ // 동의 섹션 텍스트 영역
524
+ .agreement-text {
525
+ display: flex;
526
+ flex-direction: column;
527
+ align-items: flex-start;
528
+ }
529
+
530
+ // 동의 항목과 리스트 요소 사이 간격
531
+ .agreement-text .content-list {
532
+ margin-top: margin(textarea-xsmall);
533
+ }
534
+
535
+ /* ============================
536
+ 모달 스타일
537
+ ============================ */
538
+
539
+ .modal-footer {
540
+ display: flex;
541
+ gap: padding(small);
542
+ justify-content: flex-end;
543
+ }
544
+
545
+ .info-modal-content {
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: margin(card-around-medium);
549
+ }
550
+
551
+ .info-section {
552
+ display: flex;
553
+ flex-direction: column;
554
+ gap: padding(small);
555
+ }
556
+
557
+ .info-title {
558
+ margin: 0;
559
+ font-weight: 600;
560
+ color: colors(text-body_1);
561
+
562
+ @include apply-typography(subtitle2);
563
+ }
564
+
565
+ .info-list {
566
+ display: flex;
567
+ flex-direction: column;
568
+ gap: margin(textarea-xsmall);
569
+ padding-left: 0;
570
+ margin: 0;
571
+ list-style: none;
572
+
573
+ .info-list-item {
574
+ display: block;
575
+ color: colors(text-body_2);
576
+
577
+ @include apply-typography(body2);
578
+ }
579
+ }
580
+
581
+ // 동의 섹션 체크박스 영역
582
+ .agreement-checkbox {
583
+ flex-shrink: 0;
584
+ align-self: flex-start;
585
+
586
+ @include media(tablet) {
587
+ align-self: auto;
588
+ }
589
+ }
590
+
591
+ // 체크박스 그룹
592
+ .checkbox-group {
593
+ // mobile: grid 3 columns for clean vertical alignment
594
+ display: grid;
595
+ grid-template-columns: repeat(3, 1fr);
596
+ gap: padding(xsmall) padding(zero);
597
+ margin-top: margin(textarea-medium);
598
+
599
+ @include media(tablet) {
600
+ // tablet: horizontal layout with larger gaps
601
+ display: flex;
602
+ flex-wrap: nowrap;
603
+ gap: margin(button-large);
604
+ }
605
+ }
606
+
607
+ // 라디오 그룹(단일 선택 전용)
608
+ .radio-group {
609
+ margin-top: margin(textarea-medium);
610
+
611
+ // 모바일일 때만 체크박스 그룹처럼 그리드 적용
612
+ @include media(tablet, max) {
613
+ [role='radiogroup'] {
614
+ display: grid;
615
+ grid-template-columns: repeat(3, 1fr);
616
+ gap: padding(xsmall) padding(zero);
617
+
618
+ > label {
619
+ display: flex;
620
+ gap: padding(xxxsmall);
621
+ align-items: center;
622
+ width: 100%;
623
+ }
624
+ }
625
+ }
626
+ }
627
+
628
+ // 모바일: 타이틀 아래 간격
629
+ .mobile-title-gap {
630
+ margin-bottom: margin(title-xlarge);
631
+
632
+ @include media(tablet) {
633
+ margin-bottom: 0;
634
+ }
635
+ }
636
+
637
+ // 모바일: 좌우 패딩만 적용하는 래퍼(카드 배경/보더 없음)
638
+ .mobile-side-padding {
639
+ padding: padding(zero) grid-value(margin-sub);
640
+
641
+ @include media(tablet) {
642
+ padding: 0;
643
+ }
644
+ }
645
+
646
+ // 모바일: 푸터 캡션 영역 배경 흰색 적용
647
+ .mobile-footer-bg {
648
+ background-color: colors(surface-neutral);
649
+
650
+ @include media(tablet) {
651
+ background-color: transparent;
652
+ }
653
+ }
654
+
655
+ /* ============================
656
+ QR 코드
657
+ ============================ */
658
+
659
+ // QR 코드
660
+ .qr-code {
661
+ display: flex;
662
+ flex-shrink: 0;
663
+ align-items: center;
664
+ justify-content: center;
665
+ width: 3.875rem;
666
+ height: 3.875rem;
667
+ margin-top: padding(small);
668
+
669
+ @include media(tablet) {
670
+ margin-top: 0;
671
+ }
672
+ }
673
+
674
+ /* ============================
675
+ Responsive (mobile-first adjustments)
676
+ ============================ */
677
+
678
+ // 모바일: 디스크립션 카드를 좌우 패딩만 적용
679
+ .consent-content.mobile-side-only {
680
+ padding: padding(zero) grid-value(margin-sub);
681
+
682
+ @include media(tablet) {
683
+ padding: margin(card-around-large);
684
+ }
685
+ }
686
+
687
+ // 모바일: 첫 카드 상단 패딩 제거(옵션)
688
+ .consent-content.no-top-padding {
689
+ padding-top: 0;
690
+
691
+ @include media(tablet) {
692
+ padding-top: margin(card-around-large);
693
+ }
694
+ }
695
+
696
+ // 모바일: 마지막 카드 하단 패딩 제거(옵션)
697
+ .consent-content.no-bottom-padding {
698
+ padding-bottom: 0;
699
+
700
+ @include media(tablet) {
701
+ padding-bottom: margin(card-around-large);
702
+ }
703
+ }
704
+
705
+ // 모바일: 타이틀-디스크립션 사이 내부 여백(카드 내부에서 흰 배경 유지)
706
+ .title-gap-large {
707
+ margin-bottom: margin(title-xlarge);
708
+ }