@x-plat/design-system 0.3.0 → 0.3.2

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.
@@ -1,229 +1,70 @@
1
- /* ../../node_modules/swiper/swiper.css */
2
- :root {
3
- --swiper-theme-color: #007aff;
4
- }
5
- :host {
1
+ /* src/components/Swiper/swiper.scss */
2
+ .lib-xplat-swiper {
3
+ width: 100%;
6
4
  position: relative;
7
- display: block;
8
- margin-left: auto;
9
- margin-right: auto;
10
- z-index: 1;
11
5
  }
12
- .swiper {
13
- margin-left: auto;
14
- margin-right: auto;
15
- position: relative;
6
+ .lib-xplat-swiper__viewport {
16
7
  overflow: hidden;
17
- list-style: none;
18
- padding: 0;
19
- z-index: 1;
20
- display: block;
8
+ cursor: grab;
9
+ user-select: none;
21
10
  }
22
- .swiper-vertical > .swiper-wrapper {
23
- flex-direction: column;
11
+ .lib-xplat-swiper__viewport:active {
12
+ cursor: grabbing;
24
13
  }
25
- .swiper-wrapper {
26
- position: relative;
27
- width: 100%;
28
- height: 100%;
29
- z-index: 1;
14
+ .lib-xplat-swiper__track {
30
15
  display: flex;
31
- transition-property: transform;
32
- transition-timing-function: var(--swiper-wrapper-transition-timing-function, initial);
33
- box-sizing: content-box;
16
+ will-change: transform;
34
17
  }
35
- .swiper-android .swiper-slide,
36
- .swiper-ios .swiper-slide,
37
- .swiper-wrapper {
38
- transform: translate3d(0px, 0, 0);
39
- }
40
- .swiper-horizontal {
41
- touch-action: pan-y;
42
- }
43
- .swiper-vertical {
44
- touch-action: pan-x;
45
- }
46
- .swiper-slide {
47
- flex-shrink: 0;
48
- width: 100%;
49
- height: 100%;
50
- position: relative;
18
+ .lib-xplat-swiper__track.transitioning {
51
19
  transition-property: transform;
52
- display: block;
53
- }
54
- .swiper-slide-invisible-blank {
55
- visibility: hidden;
20
+ transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
56
21
  }
57
- .swiper-autoheight,
58
- .swiper-autoheight .swiper-slide {
59
- height: auto;
60
- }
61
- .swiper-autoheight .swiper-wrapper {
62
- align-items: flex-start;
63
- transition-property: transform, height;
64
- }
65
- .swiper-backface-hidden .swiper-slide {
66
- transform: translateZ(0);
67
- backface-visibility: hidden;
68
- }
69
- .swiper-3d.swiper-css-mode .swiper-wrapper {
70
- perspective: 1200px;
71
- }
72
- .swiper-3d .swiper-wrapper {
73
- transform-style: preserve-3d;
74
- }
75
- .swiper-3d {
76
- perspective: 1200px;
77
- .swiper-slide,
78
- .swiper-cube-shadow {
79
- transform-style: preserve-3d;
80
- }
22
+ .lib-xplat-swiper__slide {
23
+ flex-shrink: 0;
24
+ overflow: hidden;
81
25
  }
82
- .swiper-css-mode {
83
- > .swiper-wrapper {
84
- overflow: auto;
85
- scrollbar-width: none;
86
- -ms-overflow-style: none;
87
- &::-webkit-scrollbar {
88
- display: none;
89
- }
90
- }
91
- > .swiper-wrapper > .swiper-slide {
92
- scroll-snap-align: start start;
93
- }
94
- &.swiper-horizontal {
95
- > .swiper-wrapper {
96
- scroll-snap-type: x mandatory;
97
- }
98
- }
99
- &.swiper-vertical {
100
- > .swiper-wrapper {
101
- scroll-snap-type: y mandatory;
102
- }
103
- }
104
- &.swiper-free-mode {
105
- > .swiper-wrapper {
106
- scroll-snap-type: none;
107
- }
108
- > .swiper-wrapper > .swiper-slide {
109
- scroll-snap-align: none;
110
- }
111
- }
112
- &.swiper-centered {
113
- > .swiper-wrapper::before {
114
- content: "";
115
- flex-shrink: 0;
116
- order: 9999;
117
- }
118
- > .swiper-wrapper > .swiper-slide {
119
- scroll-snap-align: center center;
120
- scroll-snap-stop: always;
121
- }
122
- }
123
- &.swiper-centered.swiper-horizontal {
124
- > .swiper-wrapper > .swiper-slide:first-child {
125
- margin-inline-start: var(--swiper-centered-offset-before);
126
- }
127
- > .swiper-wrapper::before {
128
- height: 100%;
129
- min-height: 1px;
130
- width: var(--swiper-centered-offset-after);
131
- }
132
- }
133
- &.swiper-centered.swiper-vertical {
134
- > .swiper-wrapper > .swiper-slide:first-child {
135
- margin-block-start: var(--swiper-centered-offset-before);
136
- }
137
- > .swiper-wrapper::before {
138
- width: 100%;
139
- min-width: 1px;
140
- height: var(--swiper-centered-offset-after);
141
- }
142
- }
26
+ .lib-xplat-swiper__progress {
27
+ margin-top: 1rem;
28
+ display: flex;
29
+ justify-content: center;
143
30
  }
144
- .swiper-3d {
145
- .swiper-slide-shadow,
146
- .swiper-slide-shadow-left,
147
- .swiper-slide-shadow-right,
148
- .swiper-slide-shadow-top,
149
- .swiper-slide-shadow-bottom,
150
- .swiper-slide-shadow,
151
- .swiper-slide-shadow-left,
152
- .swiper-slide-shadow-right,
153
- .swiper-slide-shadow-top,
154
- .swiper-slide-shadow-bottom {
155
- position: absolute;
156
- left: 0;
157
- top: 0;
158
- width: 100%;
159
- height: 100%;
160
- pointer-events: none;
161
- z-index: 10;
162
- }
163
- .swiper-slide-shadow {
164
- background: rgba(0, 0, 0, 0.15);
165
- }
166
- .swiper-slide-shadow-left {
167
- background-image:
168
- linear-gradient(
169
- to left,
170
- rgba(0, 0, 0, 0.5),
171
- rgba(0, 0, 0, 0));
172
- }
173
- .swiper-slide-shadow-right {
174
- background-image:
175
- linear-gradient(
176
- to right,
177
- rgba(0, 0, 0, 0.5),
178
- rgba(0, 0, 0, 0));
179
- }
180
- .swiper-slide-shadow-top {
181
- background-image:
182
- linear-gradient(
183
- to top,
184
- rgba(0, 0, 0, 0.5),
185
- rgba(0, 0, 0, 0));
186
- }
187
- .swiper-slide-shadow-bottom {
188
- background-image:
189
- linear-gradient(
190
- to bottom,
191
- rgba(0, 0, 0, 0.5),
192
- rgba(0, 0, 0, 0));
193
- }
31
+ .lib-xplat-swiper__progress-track {
32
+ position: relative;
33
+ width: 100%;
34
+ max-width: 580px;
35
+ height: 2px;
36
+ background-color: var(--xplat-neutral-200);
37
+ border-radius: 1px;
194
38
  }
195
- .swiper-lazy-preloader {
196
- width: 42px;
197
- height: 42px;
39
+ .lib-xplat-swiper__progress-fill {
198
40
  position: absolute;
199
- left: 50%;
200
- top: 50%;
201
- margin-left: -21px;
202
- margin-top: -21px;
203
- z-index: 10;
204
- transform-origin: 50%;
205
- box-sizing: border-box;
206
- border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color));
207
- border-radius: 50%;
208
- border-top-color: transparent;
41
+ top: 0;
42
+ left: 0;
43
+ height: 100%;
44
+ background-color: var(--xplat-neutral-500);
45
+ border-radius: 1px;
46
+ transition-property: width;
47
+ transition-timing-function: ease;
209
48
  }
210
- .swiper:not(.swiper-watch-progress),
211
- .swiper-watch-progress .swiper-slide-visible {
212
- .swiper-lazy-preloader {
213
- animation: swiper-preloader-spin 1s infinite linear;
214
- }
49
+ .lib-xplat-swiper__dots {
50
+ display: flex;
51
+ justify-content: center;
52
+ gap: 6px;
53
+ margin-top: 1rem;
215
54
  }
216
- .swiper-lazy-preloader-white {
217
- --swiper-preloader-color: #fff;
55
+ .lib-xplat-swiper__dot {
56
+ width: 8px;
57
+ height: 8px;
58
+ border-radius: 50%;
59
+ border: none;
60
+ padding: 0;
61
+ cursor: pointer;
62
+ background-color: var(--xplat-neutral-300);
63
+ transition: background-color 0.2s;
218
64
  }
219
- .swiper-lazy-preloader-black {
220
- --swiper-preloader-color: #000;
65
+ .lib-xplat-swiper__dot.active {
66
+ background-color: var(--xplat-neutral-700);
221
67
  }
222
- @keyframes swiper-preloader-spin {
223
- 0% {
224
- transform: rotate(0deg);
225
- }
226
- 100% {
227
- transform: rotate(360deg);
228
- }
68
+ .lib-xplat-swiper__dot:hover:not(.active) {
69
+ background-color: var(--xplat-neutral-400);
229
70
  }
@@ -1,24 +1,43 @@
1
- import React, { MutableRefObject, ReactNode } from 'react';
2
- import { SwiperClass } from 'swiper/react';
3
- import { SwiperOptions } from 'swiper/types';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
4
3
 
5
- interface SwiperComponentProps {
4
+ interface SwiperHandle {
5
+ slidePrev: () => void;
6
+ slideNext: () => void;
7
+ slideTo: (index: number) => void;
8
+ }
9
+ interface SwiperProps {
10
+ /** 자동 슬라이딩 */
6
11
  auto?: boolean;
7
- swiperRef?: MutableRefObject<SwiperClass | null>;
8
- renderItems?: Array<ReactNode>;
9
- viewItemCount?: number | "auto";
12
+ /** 외부에서 제어할 ref */
13
+ swiperRef?: React.RefObject<SwiperHandle | null>;
14
+ /** 슬라이드 아이템 */
15
+ renderItems?: React.ReactNode[];
16
+ /** 한 번에 보이는 아이템 수 */
17
+ viewItemCount?: number;
18
+ /** 최대 아이템 수 */
10
19
  maxItems?: number;
11
- freeMode?: boolean;
12
- options?: SwiperOptions;
20
+ /** 루프 */
13
21
  loop?: boolean;
22
+ /** 슬라이드 간격 (px) */
14
23
  spaceBetween?: number;
15
- centeredSlides?: boolean;
16
- loopSlides?: number;
17
- isProgress?: boolean;
18
- totalItemCount?: number;
19
- showAutoplayProgress?: boolean;
24
+ /** 진행바 표시 */
25
+ showProgress?: boolean;
26
+ /** 오토플레이 딜레이 (ms) */
20
27
  autoplayDelay?: number;
28
+ /** 슬라이드 전환 속도 (ms) */
29
+ speed?: number;
30
+ /** 한 번에 이동할 슬라이드 수 (기본: 1) */
31
+ slideBy?: number;
32
+ /** 현재 슬라이드 인덱스 (controlled) */
33
+ index?: number;
34
+ /** 슬라이드 변경 콜백 */
35
+ onChange?: (index: number) => void;
36
+ className?: string;
21
37
  }
22
- declare const SwiperContentComponent: React.FC<SwiperComponentProps>;
38
+ declare const Swiper: {
39
+ (props: SwiperProps): react_jsx_runtime.JSX.Element;
40
+ displayName: string;
41
+ };
23
42
 
24
- export { SwiperContentComponent as default };
43
+ export { Swiper, type SwiperHandle, type SwiperProps };
@@ -1,24 +1,43 @@
1
- import React, { MutableRefObject, ReactNode } from 'react';
2
- import { SwiperClass } from 'swiper/react';
3
- import { SwiperOptions } from 'swiper/types';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
4
3
 
5
- interface SwiperComponentProps {
4
+ interface SwiperHandle {
5
+ slidePrev: () => void;
6
+ slideNext: () => void;
7
+ slideTo: (index: number) => void;
8
+ }
9
+ interface SwiperProps {
10
+ /** 자동 슬라이딩 */
6
11
  auto?: boolean;
7
- swiperRef?: MutableRefObject<SwiperClass | null>;
8
- renderItems?: Array<ReactNode>;
9
- viewItemCount?: number | "auto";
12
+ /** 외부에서 제어할 ref */
13
+ swiperRef?: React.RefObject<SwiperHandle | null>;
14
+ /** 슬라이드 아이템 */
15
+ renderItems?: React.ReactNode[];
16
+ /** 한 번에 보이는 아이템 수 */
17
+ viewItemCount?: number;
18
+ /** 최대 아이템 수 */
10
19
  maxItems?: number;
11
- freeMode?: boolean;
12
- options?: SwiperOptions;
20
+ /** 루프 */
13
21
  loop?: boolean;
22
+ /** 슬라이드 간격 (px) */
14
23
  spaceBetween?: number;
15
- centeredSlides?: boolean;
16
- loopSlides?: number;
17
- isProgress?: boolean;
18
- totalItemCount?: number;
19
- showAutoplayProgress?: boolean;
24
+ /** 진행바 표시 */
25
+ showProgress?: boolean;
26
+ /** 오토플레이 딜레이 (ms) */
20
27
  autoplayDelay?: number;
28
+ /** 슬라이드 전환 속도 (ms) */
29
+ speed?: number;
30
+ /** 한 번에 이동할 슬라이드 수 (기본: 1) */
31
+ slideBy?: number;
32
+ /** 현재 슬라이드 인덱스 (controlled) */
33
+ index?: number;
34
+ /** 슬라이드 변경 콜백 */
35
+ onChange?: (index: number) => void;
36
+ className?: string;
21
37
  }
22
- declare const SwiperContentComponent: React.FC<SwiperComponentProps>;
38
+ declare const Swiper: {
39
+ (props: SwiperProps): react_jsx_runtime.JSX.Element;
40
+ displayName: string;
41
+ };
23
42
 
24
- export { SwiperContentComponent as default };
43
+ export { Swiper, type SwiperHandle, type SwiperProps };