
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
// 포커스 효과를 위한 믹스인
@mixin focus($offset: -.4rem, $color: $primary, $alpha: .8) {
// 포커스 아웃라인 색상 및 투명도 설정
outline-offset: $offset;
$transparent: 1 - $alpha;
$focus-color: transparentize($color, $transparent);
outline: 2px solid $focus-color;
}
// Flexbox 요소의 확대 및 축소 비율 설정
@mixin flex-size($shrink, $grow) {
flex-shrink: $shrink;
flex-grow: $grow;
}
// 버튼 스타일 초기화 믹스인
@mixin btn-reset {
color: inherit;
border: 0;
background-color: inherit;
&:hover,
&:active {
background-color: inherit;
}
}
/* **** 영역 관련 믹스인 **** */
// 컬럼 설정 믹스인 (현재 비어 있음)
@mixin columns($total, $num, $gutter) {}
// 간격(Spacing) 설정 믹스인
@mixin spacer($num) {
@for $i from 1 through $num {
$key: $i;
$value: (
$i * 4 * 0.1) + rem;
// 기본 spacer 값 설정
$spacers: map-merge(($key: $value,
),
$spacers) !global;
}
}
// 테두리 둥근 정도(border-radius) 설정 믹스인
@mixin radius($num) {
$border-radius: map-merge($num : ($num * 0.1) + rem,
),
$border-radius
}
// 위치(position) 설정 믹스인
@mixin position($p: absolute,
$t: null,
$b: null,
$l: null,
$r: null) {
position: $p;
top: $t;
bottom: $b;
left: $l;
right: $r;
}
// 가로와 세로 크기를 동일하게 설정하는 믹스인
@mixin foursquare($size) {
width: $size;
height: $size;
}
// 가상 요소(pseudo-element) 생성 시 사용
@mixin pseudo($c: null) {
content: "#{$c}";
}
// Flexbox 레이아웃 설정 믹스인
@mixin flex-layout($d: flex, $ai: flex-start, $jc: flex-start, $fd: row) {
display: $d;
align-items: $ai;
justify-content: $jc;
flex-direction: $fd;
}
// 그룹 요소를 감싸는 컨테이너 믹스인
@mixin group-wrap() {
display: flex;
flex-wrap: wrap;
align-items: stretch;
position: relative;
width: 100%;
}
// 그룹 내 개별 요소 설정 믹스인
@mixin group() {
flex: 1 1 auto;
position: relative;
width: 1%;
min-width: 0;
}
// Flexbox 아이템이 동일한 너비를 갖도록 설정하는 믹스인
@mixin equal-width() {
flex: 1 1 0px;
min-width: 0;
}
// 요소를 중앙 정렬하는 믹스인
@mixin position-center($type) {
@each $type in $position-type {
// 좌우 중앙 정렬
@if ($type =='x') {
left: 50%;
transform: translateX(-50%)
}
// 상하 중앙 정렬
@else if ($type =='y') {
top: 50%;
transform: translateY(-50%
);
}
// 상하좌우 중앙 정렬
@else if ($type =='both') {
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%);
}
}
}
// transform 기준점을 중앙으로 설정하는 믹스인
@mixin transform-origin($x: 50%, $y: 50%) {
transform-origin: $x $y;
}
/* **** 텍스트 속성 ****/
// 텍스트 말줄임표 설정 (지정된 줄 수 만큼 텍스트를 줄여 표시)
@mixin ellipsis($line) {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: $line;
}
// 스크린 리더 전용 스타일 (화면에서 숨기고 접근성 유지)
@mixin sr-only {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
}
// 팝오버/툴팁 등의 텍스트 스타일 초기화
@mixin reset-text {
font-family: var(--#{$prefix}-fz-body-md);
font-style: normal;
font-weight: map-get($fws, normal);
line-height: $line-height-base;
text-align: left;
text-decoration: none;
text-shadow: none;
text-transform: none;
letter-spacing: normal;
white-space: normal;
word-spacing: normal;
line-break: auto;
}
// CSS 애니메이션 가시성 설정 (hidden 또는 visible 값 사용)
@mixin visibility($v) {
@if ($v ==hidden) {
visibility: hidden;
z-index: -1;
opacity: 0;
}
@else if ($v ==visible) {
visibility: visible;
z-index: auto;
opacity: 1;
}
}
/* **** 스크롤바 스타일 ****/
// 스크롤바 커스텀 스타일
@mixin scrollbar {
&::-webkit-scrollbar {
width: .8rem;
}
&::-webkit-scrollbar-thumb {
background-color: var(--#{$prefix}gray-40);
border-radius: .8rem;
}
&::-webkit-scrollbar-track {
background-color: var(--#{$prefix}gray-30);
}
}
/* **** 폰트 크기 설정 ****/
// 전역 폰트 크기 설정 (CSS 변수로 지정)
@mixin fz() {
@each $type, $size in map-get($font-size, 'sizes') {
@each $key, $value in $size {
--#{$prefix}fz-#{$type}-#{$key}: #{$value};
}
}
}
/* **** 버튼 스타일 ****/
// 버튼 크기 및 스타일 설정
@mixin btn() {
@each $type, $size in map-get($btns, 'setting') {
@each $key, $value in $size {
--#{$prefix}btn-#{$type}-#{$key}: #{$value};
// 높이별 버튼 클래스 추가
@if ($type =='h') {
@at-root .btn.#{$key} {
height: #{$value};
padding: 0 var(--#{$prefix}btn-px-#{$key});
border-radius: var(--#{$prefix}btn-rd-#{$key});
font-size: var(--#{$prefix}btn-fz-#{$key});
}
}
}
}
}
/* **** 칩 버튼 스타일 ****/
// 칩 버튼 (outline 또는 fill 스타일 선택)
@mixin btn-chip($name, $default) {
// 아웃라인 스타일 칩 버튼 설정
@if ($name =='outline') {
@each $type, $size in map-get($btnChipOutline, 'setting') {
@each $key, $value in $size {
--#{$prefix}btnChipOutline-#{$type}-#{$key}: #{$value};
// 높이별 칩 버튼 스타일 적용
@if ($type =='h') {
@at-root .btn-chip-outline.#{$key} {
height: var(--#{$prefix}btnChipOutline-h-#{$key});
padding: var(--#{$prefix}btnChipOutline-pd-#{$key});
border-radius: var(--#{$prefix}btnChipOutline-rd-#{$key});
font-size: var(--#{$prefix}btnChipOutline-fz-#{$key});
.btn-del {
width: var(--#{$prefix}btnChipOutline-size-#{$key});
height: var(--#{$prefix}btnChipOutline-size-#{$key});
background: url(#{$url}/component/common/ico_chip_del.svg) no-repeat 0 0;
background-size: contain;
}
}
}
// 기본 크기 설정
@if ($default) {
@at-root .btn-chip-outline {
height: var(--#{$prefix}btnChipOutline-h-#{$default});
padding: var(--#{$prefix}btnChipOutline-pd-#{$default});
border-radius: var(--#{$prefix}btnChipOutline-rd-#{$default});
font-size: var(--#{$prefix}btnChipOutline-fz-#{$default});
.btn-del {
width: var(--#{$prefix}btnChipOutline-size-#{$default});
height: var(--#{$prefix}btnChipOutline-size-#{$default});
background: url(#{$url}/component/common/ico_chip_del.svg) no-repeat 0 0;
background-size: contain;
// 포커스 스타일 추가
&:focus {
@include focus($offset: .4rem);
}
}
}
}
}
}
}
// 채워진 스타일 칩 버튼 설정
@else if ($name =='fill') {
@each $type, $size in map-get($btnChipFill, 'setting') {
@each $key, $value in $size {
--#{$prefix}btnChipFill-#{$type}-#{$key}: #{$value};
// 높이별 칩 버튼 스타일 적용
@if ($type =='h') {
@at-root .btn-chip-fill.#{$key} {
height: var(--#{$prefix}btnChipFill-h-#{$key});
padding: var(--#{$prefix}btnChipFill-pd-#{$key});
border-radius: var(--#{$prefix}btnChipFill-rd-#{$key});
font-size: var(--#{$prefix}btnChipFill-fz-#{$key});
}
}
// 기본 크기 설정
@if ($default) {
@at-root .btn-chip-fill {
height: var(--#{$prefix}btnChipFill-h-#{$default});
padding: var(--#{$prefix}btnChipFill-pd-#{$default});
border-radius: var(--#{$prefix}btnChipFill-rd-#{$default});
font-size: var(--#{$prefix}btnChipFill-fz-#{$default});
// 포커스 스타일 추가
&:focus {
@include focus($offset: .4rem);
}
}
}
}
}
}
}
/* **** form mixin ****/
// input 믹스인: 폼의 텍스트 입력 필드 스타일을 설정
@mixin input() {
@each $type, $size in map-get($inputs, 'setting') {
@each $key, $value in $size {
--#{$prefix}input-#{$type}-#{$key}: #{$value};
@if ($type =='h') {
//높이별 class값 추가
@at-root .form-control.#{$key} {
height: #{$value};
padding: 0 var(--#{$prefix}input-px-#{$key});
border-radius: var(--#{$prefix}input-rd-#{$key});
font-size: var(--#{$prefix}input-fz-#{$key});
}
}
}
}
}
// radio 믹스인: 라디오 버튼 스타일 설정
@mixin radio() {
@each $type, $size in map-get($radios, 'setting') {
@each $key, $value in $size {
--#{$prefix}rdo-#{$type}-#{$key}: #{$value};
@if ($type =='size') {
@at-root .form-check.#{$key} {
>[type=radio] {
~label {
font-size: var(--krds-rdo-fz-#{$key});
line-height: var(--krds-rdo-#{$type}-#{$key});
min-height: var(--krds-rdo-#{$type}-#{$key});
padding-left: calc(var(--krds-rdo-#{$type}-#{$key}) + var(--krds-spacer-2));
&::before {
width: var(--#{$prefix}rdo-#{$type}-#{$key});
height: var(--#{$prefix}rdo-#{$type}-#{$key});
}
&::after {
top: calc((var(--#{$prefix}rdo-size-#{$key}) - var(--#{$prefix}rdo-chk-#{$key})) / 2);
left: calc((var(--#{$prefix}rdo-size-#{$key}) - var(--#{$prefix}rdo-chk-#{$key})) / 2);
width: var(--#{$prefix}rdo-chk-#{$key});
height: var(--#{$prefix}rdo-chk-#{$key});
}
}
}
}
}
}
}
}
// checkbox 믹스인: 체크박스 스타일 설정
@mixin chk() {
@each $type, $size in map-get($checkboxes, 'setting') {
@each $key, $value in $size {
--#{$prefix}chk-#{$type}-#{$key}: #{$value};
@if ($type =='size') {
@at-root .form-check.#{$key} {
>[type=checkbox] {
~label {
font-size: var(--krds-chk-fz-#{$key});
line-height: var(--krds-chk-#{$type}-#{$key});
min-height: var(--krds-chk-#{$type}-#{$key});
padding-left: calc(var(--krds-chk-#{$type}-#{$key}) + var(--krds-spacer-2));
&::before {
width: var(--#{$prefix}chk-#{$type}-#{$key});
height: var(--#{$prefix}chk-#{$type}-#{$key});
}
&::after {
width: var(--#{$prefix}chk-primary-chk-#{$key});
height: var(--#{$prefix}chk-primary-chk-#{$key});
}
}
}
&.ico-only {
>[type=checkbox] {
~label {
padding-left: var(--krds-chk-#{$type}-#{$key});
}
}
}
}
}
}
}
}
// select 믹스인: 셀렉트 박스 스타일 설정
@mixin select() {
@each $type, $size in map-get($select, 'setting') {
@each $key, $value in $size {
--#{$prefix}select-#{$type}-#{$key}: #{$value};
@if ($type =='h') {
//높이별 class값 추가
@at-root .form-select.#{$key} {
height: #{$value};
padding: var(--#{$prefix}select-pd-#{$key});
border-radius: var(--#{$prefix}select-rd-#{$key});
font-size: var(--#{$prefix}select-fz-#{$key});
background-size: var(--#{$prefix}select-bgs-#{$key});
}
}
}
}
}
// switch 믹스인: 스위치 컴포넌트 스타일 설정
@mixin switch() {
@each $type, $size in map-get($switch, 'setting') {
@each $key, $value in $size {
--#{$prefix}switch-#{$type}-#{$key}: #{$value};
@if ($type =='w') {
@at-root .form-switch.#{$key} {
[type=checkbox] {
~i {
&::before {
width: var(--#{$prefix}switch-b-#{$key});
height: var(--#{$prefix}switch-b-#{$key});
border-radius: var(--#{$prefix}switch-rd-#{$key});
}
&::after {
width: var(--#{$prefix}switch-w-#{$key});
height: var(--#{$prefix}switch-h-#{$key});
}
}
~label {
$labelValue : var(--#{$prefix}switch-w-#{$key});
$pdValue : var(--#{$prefix}switch-pd-#{$key});
padding-left: calc($labelValue + $pdValue);
margin-left: calc($labelValue * -1);
font-size: var(--#{$prefix}switch-fz-#{$key});
}
&:checked {
~i {
&::before {
$posL : calc(var(--#{$prefix}switch-w-#{$key}) - var(--#{$prefix}switch-b-#{$key}) - var(--#{$prefix}switch-br-#{$key}));
@include position($l: $posL);
}
}
}
}
}
}
}
}
}
// form-chip 믹스인: 칩 형태의 선택 가능한 컴포넌트 스타일 설정
@mixin form-chip($name, $default) {
@if ($name =='radio') {
@each $type, $size in map-get($rdoChipOutline, 'setting') {
@each $key, $value in $size {
--#{$prefix}rdoChipOutline-#{$type}-#{$key}: #{$value};
@if ($type =='h') {
@at-root .form-chip.#{$key} {
.radio {
~.form-chip-outline {
gap:var(--#{$prefix}chkChipOutline-gap-#{$key});
height: var(--#{$prefix}rdoChipOutline-h-#{$key});
padding: var(--#{$prefix}rdoChipOutline-pd-#{$key});
border-radius: var(--#{$prefix}rdoChipOutline-rd-#{$key});
font-size: var(--#{$prefix}rdoChipOutline-fz-#{$key});
&::before {
width:var(--#{$prefix}chkChipOutline-ico-#{$key});
height:var(--#{$prefix}chkChipOutline-ico-#{$key});
background: url(#{$url}/component/common/ico_check_chip.svg) no-repeat 0 0;
background-size: contain;
}
}
&:checked {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_checked.svg);
}
}
}
&:disabled {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_disabled.svg);
}
}
}
}
}
}
@if ($default) {
@at-root .form-chip {
.radio {
~.form-chip-outline {
gap:var(--#{$prefix}chkChipOutline-gap-#{$key});
height: var(--#{$prefix}rdoChipOutline-h-#{$key});
padding: var(--#{$prefix}rdoChipOutline-pd-#{$key});
border-radius: var(--#{$prefix}rdoChipOutline-rd-#{$key});
font-size: var(--#{$prefix}rdoChipOutline-fz-#{$key});
&::before {
width:var(--#{$prefix}chkChipOutline-ico-#{$key});
height:var(--#{$prefix}chkChipOutline-ico-#{$key});
background: url(#{$url}/component/common/ico_check_chip.svg) no-repeat 0 0;
background-size: contain;
}
}
&:checked {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_checked.svg);
}
}
}
&:disabled {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_disabled.svg);
}
}
}
}
}
}
}
}
}
@else if ($name =='checkbox') {
@each $type, $size in map-get($chkChipOutline, 'setting') {
@each $key, $value in $size {
--#{$prefix}chkChipOutline-#{$type}-#{$key}: #{$value};
@if ($type =='h') {
@at-root .form-chip.#{$key} {
.checkbox {
~.form-chip-outline {
gap:var(--#{$prefix}chkChipOutline-gap-#{$key});
height: var(--#{$prefix}chkChipOutline-h-#{$key});
padding: var(--#{$prefix}chkChipOutline-pd-#{$key});
border-radius: var(--#{$prefix}chkChipOutline-rd-#{$key});
font-size: var(--#{$prefix}chkChipOutline-fz-#{$key});
&::before {
width:var(--#{$prefix}chkChipOutline-ico-#{$key});
height:var(--#{$prefix}chkChipOutline-ico-#{$key});
background: url(#{$url}/component/common/ico_check_chip.svg) no-repeat 0 0;
background-size: contain;
}
}
&:checked {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_checked.svg);
}
}
}
&:disabled {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_disabled.svg);
}
}
}
}
}
}
@if ($default) {
@at-root .form-chip {
.checkbox {
~.form-chip-outline {
gap:var(--#{$prefix}chkChipOutline-gap-#{$key});
height: var(--#{$prefix}chkChipOutline-h-#{$key});
padding: var(--#{$prefix}chkChipOutline-pd-#{$key});
border-radius: var(--#{$prefix}chkChipOutline-rd-#{$key});
font-size: var(--#{$prefix}chkChipOutline-fz-#{$key});
&::before {
width:var(--#{$prefix}chkChipOutline-ico-#{$key});
height:var(--#{$prefix}chkChipOutline-ico-#{$key});
background: url(#{$url}/component/common/ico_check_chip.svg) no-repeat 0 0;
background-size: contain;
}
}
&:checked {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_checked.svg);
}
}
}
&:disabled {
~.form-chip-outline {
&::before {
background-image: url(#{$url}/component/common/ico_check_chip_disabled.svg);
}
}
}
}
}
}
}
}
}
}
//tab setting
@mixin tabs() {
@each $type, $size in map-get($tabs, 'setting') {
@each $key, $value in $size {
--#{$prefix}tab-#{$type}-#{$key}: #{$value};
}
}
}