@pylerai/design-system 2.4.0 → 2.5.0
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/README.md +2 -1
- package/dist/components/ui/badge.d.ts +3 -0
- package/dist/components/ui/badge.js +28 -20
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.js +38 -25
- package/dist/components/ui/dropdown.js +89 -86
- package/dist/components/ui/input.js +30 -30
- package/dist/components/ui/label.d.ts +1 -1
- package/dist/components/ui/label.js +11 -10
- package/dist/components/ui/media-slider.d.ts +20 -0
- package/dist/components/ui/media-slider.js +90 -0
- package/dist/components/ui/progress-bar.d.ts +21 -0
- package/dist/components/ui/progress-bar.js +45 -0
- package/dist/components/ui/search-field.js +45 -43
- package/dist/components/ui/table.js +33 -33
- package/dist/components/ui/tabs.js +24 -24
- package/dist/components/ui/timeline-tracks.d.ts +66 -0
- package/dist/components/ui/timeline-tracks.js +80 -0
- package/dist/components/ui/timeline.d.ts +31 -0
- package/dist/components/ui/timeline.js +119 -0
- package/dist/components/ui/toast.js +5 -5
- package/dist/components/ui/video-player.d.ts +29 -0
- package/dist/components/ui/video-player.js +174 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.js +38 -32
- package/dist/lib/field-box.d.ts +13 -0
- package/dist/lib/field-box.js +11 -0
- package/dist/lib/format-time.d.ts +5 -0
- package/dist/lib/format-time.js +8 -0
- package/dist/lib/icons.d.ts +6 -0
- package/dist/lib/icons.js +68 -44
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +14 -7
- package/dist/style.css +1 -1
- package/dist/tokens/pyler-light.d.ts +12 -0
- package/dist/tokens/pyler-light.js +27 -23
- package/dist/tokens/shadow-radius.d.ts +3 -3
- package/dist/tokens/shadow-radius.js +3 -3
- package/dist/tokens/typography.d.ts +8 -2
- package/dist/tokens/typography.js +6 -0
- package/package.json +1 -1
- package/pyler-tailwind-colors.cjs +4 -0
- package/pyler-typography.cjs +7 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/** 컨트롤 접근성 라벨 — 기본은 한국어. en·ja 화면에서는 소비 앱이 번역을 넘긴다. */
|
|
3
|
+
export interface VideoPlayerLabels {
|
|
4
|
+
play: string;
|
|
5
|
+
pause: string;
|
|
6
|
+
seek: string;
|
|
7
|
+
volume: string;
|
|
8
|
+
mute: string;
|
|
9
|
+
unmute: string;
|
|
10
|
+
enterFullscreen: string;
|
|
11
|
+
exitFullscreen: string;
|
|
12
|
+
}
|
|
13
|
+
export interface VideoPlayerProps extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, "controls" | "className"> {
|
|
14
|
+
/** 바깥 컨테이너 클래스 — 크기·비율은 여기서 정한다 (기본 16:9, 너비 100%). */
|
|
15
|
+
className?: string;
|
|
16
|
+
/** `<video>` 요소 클래스 (기본 `object-contain`) */
|
|
17
|
+
videoClassName?: string;
|
|
18
|
+
/** 마지막 조작 후 컨트롤을 숨기기까지의 시간(ms). 일시정지 중에는 항상 보인다. 기본 2500 */
|
|
19
|
+
hideControlsAfter?: number;
|
|
20
|
+
/** 컨트롤 aria-label 덮어쓰기 (일부만 넘겨도 된다) */
|
|
21
|
+
labels?: Partial<VideoPlayerLabels>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Figma Player Controller. 영상 위에 마우스를 올리거나 터치하면 dim(검정 50%)과 함께
|
|
25
|
+
* 가운데 재생/일시정지, 하단 현재 시간 · 시크바 · 전체 길이 · 볼륨(세로 슬라이더) · 전체화면 버튼이 뜬다.
|
|
26
|
+
* ref 는 내부 `<video>` 요소를 가리킨다 — 외부(예: Timeline `onSeek`)에서 `currentTime` 을 바꿀 때 쓴다.
|
|
27
|
+
*/
|
|
28
|
+
declare const VideoPlayer: React.ForwardRefExoticComponent<VideoPlayerProps & React.RefAttributes<HTMLVideoElement>>;
|
|
29
|
+
export { VideoPlayer };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as c, jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { MediaSlider as C } from "./media-slider.js";
|
|
4
|
+
import { formatTime as g } from "../../lib/format-time.js";
|
|
5
|
+
import { PauseIcon as _, PlayArrowIcon as G, VolumeUpIcon as J, VolumeOffIcon as K, FullscreenExitIcon as Q, FullscreenIcon as W } from "../../lib/icons.js";
|
|
6
|
+
import { cn as l } from "../../lib/utils.js";
|
|
7
|
+
import * as n from "react";
|
|
8
|
+
const X = {
|
|
9
|
+
play: "재생",
|
|
10
|
+
pause: "일시정지",
|
|
11
|
+
seek: "재생 위치",
|
|
12
|
+
volume: "볼륨",
|
|
13
|
+
mute: "음소거",
|
|
14
|
+
unmute: "음소거 해제",
|
|
15
|
+
enterFullscreen: "전체화면",
|
|
16
|
+
exitFullscreen: "전체화면 종료"
|
|
17
|
+
}, Y = n.forwardRef(
|
|
18
|
+
({ className: L, videoClassName: S, hideControlsAfter: I = 2500, labels: R, muted: u, ...j }, V) => {
|
|
19
|
+
const o = { ...X, ...R }, d = n.useRef(null), i = n.useRef(null);
|
|
20
|
+
n.useImperativeHandle(V, () => i.current);
|
|
21
|
+
const [m, M] = n.useState(!1), [v, x] = n.useState(0), [r, P] = n.useState(0), [N, A] = n.useState(1), [k, D] = n.useState(!!u), [w, q] = n.useState(!1), [B, p] = n.useState(!1), f = n.useRef();
|
|
22
|
+
n.useEffect(() => {
|
|
23
|
+
const e = i.current;
|
|
24
|
+
if (!e) return;
|
|
25
|
+
const s = () => {
|
|
26
|
+
M(!e.paused && !e.ended), x(e.currentTime), P(Number.isFinite(e.duration) ? e.duration : 0), A(e.volume), D(e.muted);
|
|
27
|
+
}, z = ["play", "pause", "ended", "timeupdate", "durationchange", "loadedmetadata", "volumechange", "seeked"];
|
|
28
|
+
return z.forEach((y) => e.addEventListener(y, s)), s(), () => z.forEach((y) => e.removeEventListener(y, s));
|
|
29
|
+
}, []), n.useEffect(() => {
|
|
30
|
+
i.current && u !== void 0 && (i.current.muted = u);
|
|
31
|
+
}, [u]), n.useEffect(() => {
|
|
32
|
+
const e = () => q(document.fullscreenElement === d.current);
|
|
33
|
+
return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
|
|
34
|
+
}, []), n.useEffect(() => () => clearTimeout(f.current), []);
|
|
35
|
+
const a = () => {
|
|
36
|
+
p(!0), clearTimeout(f.current), f.current = setTimeout(() => p(!1), I);
|
|
37
|
+
}, E = () => {
|
|
38
|
+
const e = i.current;
|
|
39
|
+
e && (e.paused || e.ended ? e.play()?.catch(() => {
|
|
40
|
+
}) : e.pause(), a());
|
|
41
|
+
}, U = (e) => {
|
|
42
|
+
const s = i.current;
|
|
43
|
+
!s || !r || (s.currentTime = e * r, x(s.currentTime), a());
|
|
44
|
+
}, $ = (e) => {
|
|
45
|
+
const s = i.current;
|
|
46
|
+
s && (s.volume = e, s.muted = e === 0, a());
|
|
47
|
+
}, H = () => {
|
|
48
|
+
const e = i.current;
|
|
49
|
+
e && (e.muted = !e.muted, !e.muted && e.volume === 0 && (e.volume = 1), a());
|
|
50
|
+
}, O = () => {
|
|
51
|
+
const e = d.current;
|
|
52
|
+
e && (document.fullscreenElement === e ? document.exitFullscreen().catch(() => {
|
|
53
|
+
}) : e.requestFullscreen ? e.requestFullscreen().catch(() => {
|
|
54
|
+
}) : i.current?.webkitEnterFullscreen?.(), a());
|
|
55
|
+
}, F = !m || B, T = r ? g(r) : "--:--", h = !k && N > 0, b = "inline-flex shrink-0 items-center justify-center text-ds-primitive-white outline-none focus-visible:ring-2 focus-visible:ring-ds-primitive-white rounded-full";
|
|
56
|
+
return /* @__PURE__ */ c(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
ref: d,
|
|
60
|
+
className: l("group/player relative aspect-video w-full overflow-hidden rounded-ds-lg bg-ds-primitive-black", L),
|
|
61
|
+
onPointerMove: a,
|
|
62
|
+
onPointerDown: a,
|
|
63
|
+
onPointerLeave: (e) => e.pointerType === "mouse" && p(!1),
|
|
64
|
+
onFocus: a,
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ t(
|
|
67
|
+
"video",
|
|
68
|
+
{
|
|
69
|
+
ref: i,
|
|
70
|
+
playsInline: !0,
|
|
71
|
+
muted: u,
|
|
72
|
+
className: l("size-full object-contain", S),
|
|
73
|
+
...j
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ c(
|
|
77
|
+
"div",
|
|
78
|
+
{
|
|
79
|
+
"data-state": F ? "visible" : "hidden",
|
|
80
|
+
className: l(
|
|
81
|
+
"absolute inset-0 transition-opacity duration-200",
|
|
82
|
+
F ? "opacity-100" : (
|
|
83
|
+
// 키보드 포커스가 컨트롤 안에 있으면 숨기지 않는다 (WCAG 2.4.7 — 포커스 링이 사라지면 안 됨)
|
|
84
|
+
"pointer-events-none opacity-0 has-[:focus-visible]:pointer-events-auto has-[:focus-visible]:opacity-100"
|
|
85
|
+
)
|
|
86
|
+
),
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ t("div", { "aria-hidden": !0, className: "absolute inset-0 bg-ds-primitive-black opacity-50", onClick: E }),
|
|
89
|
+
/* @__PURE__ */ t(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
type: "button",
|
|
93
|
+
"aria-label": m ? o.pause : o.play,
|
|
94
|
+
onClick: E,
|
|
95
|
+
className: l(b, "absolute left-1/2 top-1/2 size-[60px] -translate-x-1/2 -translate-y-1/2"),
|
|
96
|
+
children: m ? /* @__PURE__ */ t(_, { className: "size-[60px]" }) : /* @__PURE__ */ t(G, { className: "size-[60px]" })
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ c("div", { className: "absolute inset-x-0 bottom-0 flex h-6 items-center gap-4 pb-3 pl-4 pr-5 box-content", children: [
|
|
100
|
+
/* @__PURE__ */ t("span", { className: "shrink-0 text-body-3-r tabular-nums text-ds-primitive-white", children: g(v) }),
|
|
101
|
+
/* @__PURE__ */ t(
|
|
102
|
+
C,
|
|
103
|
+
{
|
|
104
|
+
"aria-label": o.seek,
|
|
105
|
+
"aria-valuetext": `${g(v)} / ${T}`,
|
|
106
|
+
value: r ? v / r : 0,
|
|
107
|
+
onChange: U,
|
|
108
|
+
showThumb: !0,
|
|
109
|
+
step: r ? Math.min(1, 5 / r) : 0.05,
|
|
110
|
+
className: "flex-1"
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
/* @__PURE__ */ t("span", { className: "shrink-0 text-body-3-r tabular-nums text-ds-primitive-white", children: T }),
|
|
114
|
+
/* @__PURE__ */ c("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
115
|
+
/* @__PURE__ */ c("div", { className: "group/volume relative flex w-8 justify-center", children: [
|
|
116
|
+
/* @__PURE__ */ t(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: l(
|
|
120
|
+
"absolute bottom-full pb-1.5",
|
|
121
|
+
"pointer-events-none opacity-0 transition-opacity",
|
|
122
|
+
"group-hover/volume:pointer-events-auto group-hover/volume:opacity-100",
|
|
123
|
+
"group-focus-within/volume:pointer-events-auto group-focus-within/volume:opacity-100"
|
|
124
|
+
),
|
|
125
|
+
children: /* @__PURE__ */ c("div", { className: "relative flex h-[103px] w-8 justify-center pb-[11px] pt-3", children: [
|
|
126
|
+
/* @__PURE__ */ t("div", { "aria-hidden": !0, className: "absolute inset-0 rounded-full bg-ds-primitive-black opacity-50" }),
|
|
127
|
+
/* @__PURE__ */ t(
|
|
128
|
+
C,
|
|
129
|
+
{
|
|
130
|
+
"aria-label": o.volume,
|
|
131
|
+
orientation: "vertical",
|
|
132
|
+
value: k ? 0 : N,
|
|
133
|
+
onChange: $,
|
|
134
|
+
className: l(!h && "opacity-50")
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
] })
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
/* @__PURE__ */ t(
|
|
141
|
+
"button",
|
|
142
|
+
{
|
|
143
|
+
type: "button",
|
|
144
|
+
"aria-label": h ? o.mute : o.unmute,
|
|
145
|
+
onClick: H,
|
|
146
|
+
className: l(b, "size-6"),
|
|
147
|
+
children: h ? /* @__PURE__ */ t(J, { className: "size-6" }) : /* @__PURE__ */ t(K, { className: "size-6" })
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
] }),
|
|
151
|
+
/* @__PURE__ */ t(
|
|
152
|
+
"button",
|
|
153
|
+
{
|
|
154
|
+
type: "button",
|
|
155
|
+
"aria-label": w ? o.exitFullscreen : o.enterFullscreen,
|
|
156
|
+
onClick: O,
|
|
157
|
+
className: l(b, "size-6"),
|
|
158
|
+
children: w ? /* @__PURE__ */ t(Q, { className: "size-6" }) : /* @__PURE__ */ t(W, { className: "size-6" })
|
|
159
|
+
}
|
|
160
|
+
)
|
|
161
|
+
] })
|
|
162
|
+
] })
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
Y.displayName = "VideoPlayer";
|
|
172
|
+
export {
|
|
173
|
+
Y as VideoPlayer
|
|
174
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export type { TabsProps, TabsListProps, TabsTriggerProps, TabsContentProps } fro
|
|
|
28
28
|
export { Pagination } from './components/ui/pagination';
|
|
29
29
|
export type { PaginationProps } from './components/ui/pagination';
|
|
30
30
|
export { Badge } from './components/ui/badge';
|
|
31
|
-
export type { BadgeProps, BadgeColor, BadgeSize } from './components/ui/badge';
|
|
31
|
+
export type { BadgeProps, BadgeColor, BadgeSize, BadgeVariant } from './components/ui/badge';
|
|
32
32
|
export { Tag } from './components/ui/tag';
|
|
33
33
|
export type { TagProps, TagSize } from './components/ui/tag';
|
|
34
34
|
export { Chip } from './components/ui/chip';
|
|
@@ -48,3 +48,9 @@ export { Label, labelVariants } from './components/ui/label';
|
|
|
48
48
|
export type { LabelProps } from './components/ui/label';
|
|
49
49
|
export { Calendar } from './components/ui/calendar';
|
|
50
50
|
export type { CalendarProps, DateRange } from './components/ui/calendar';
|
|
51
|
+
export { ProgressBar } from './components/ui/progress-bar';
|
|
52
|
+
export type { ProgressBarProps, ProgressBarVariant, ProgressBarSize } from './components/ui/progress-bar';
|
|
53
|
+
export { VideoPlayer } from './components/ui/video-player';
|
|
54
|
+
export type { VideoPlayerProps, VideoPlayerLabels } from './components/ui/video-player';
|
|
55
|
+
export { Timeline } from './components/ui/timeline';
|
|
56
|
+
export type { TimelineProps, TimelineTrack, TimelineHeatmapTrack, TimelineLineTrack, TimelineEventsTrack, } from './components/ui/timeline';
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import { PYLER_LIGHT_COLOR_TOKENS as t, PYLER_LIGHT_GROUP_ORDER as a, flatPylerLightTokens as l, formatPylerPathForDisplay as p, getDsCssVar as
|
|
3
|
+
import { PYLER_LIGHT_COLOR_TOKENS as t, PYLER_LIGHT_GROUP_ORDER as a, flatPylerLightTokens as l, formatPylerPathForDisplay as p, getDsCssVar as m, getPylerCssVar as f } from "./tokens/pyler-light.js";
|
|
4
4
|
import { PYLER_TYPOGRAPHY_STYLE as x } from "./tokens/typography.js";
|
|
5
|
-
import { DS_RADIUS as
|
|
6
|
-
import { Button as b, ButtonIndicator as P, buttonVariants as
|
|
5
|
+
import { DS_RADIUS as s, DS_SHADOW as T } from "./tokens/shadow-radius.js";
|
|
6
|
+
import { Button as b, ButtonIndicator as P, buttonVariants as g } from "./components/ui/button.js";
|
|
7
7
|
import { InputField as C, TextField as L } from "./components/ui/input.js";
|
|
8
|
-
import { SearchField as
|
|
9
|
-
import { Dropdown as
|
|
10
|
-
import { Checkbox as
|
|
11
|
-
import { Radio as
|
|
12
|
-
import { Toggle as
|
|
13
|
-
import { Table as
|
|
8
|
+
import { SearchField as y } from "./components/ui/search-field.js";
|
|
9
|
+
import { Dropdown as S } from "./components/ui/dropdown.js";
|
|
10
|
+
import { Checkbox as B } from "./components/ui/checkbox.js";
|
|
11
|
+
import { Radio as O } from "./components/ui/radio.js";
|
|
12
|
+
import { Toggle as h } from "./components/ui/toggle.js";
|
|
13
|
+
import { Table as E, TableBody as I, TableCell as Y, TableHead as M, TableHeaderCell as k, TableRoot as A, TableRow as F } from "./components/ui/table.js";
|
|
14
14
|
import { LoadingBar as w } from "./components/ui/loading-bar.js";
|
|
15
15
|
import { Tabs as v, TabsContent as K, TabsList as N, TabsTrigger as W } from "./components/ui/tabs.js";
|
|
16
16
|
import { Pagination as q } from "./components/ui/pagination.js";
|
|
@@ -19,40 +19,44 @@ import { Tag as X } from "./components/ui/tag.js";
|
|
|
19
19
|
import { Chip as $ } from "./components/ui/chip.js";
|
|
20
20
|
import { SnackbarContent as ro, Toaster as eo, snackbar as to, toast as ao } from "./components/ui/toast.js";
|
|
21
21
|
import { Tips as po } from "./components/ui/tips.js";
|
|
22
|
-
import { ActionModal as fo, ContentModal as
|
|
23
|
-
import { ModalProvider as
|
|
24
|
-
import { Headline as Po, headlineVariants as
|
|
22
|
+
import { ActionModal as fo, ContentModal as no, InformationModal as xo } from "./components/ui/modal.js";
|
|
23
|
+
import { ModalProvider as so, useModal as To } from "./components/ui/use-modal.js";
|
|
24
|
+
import { Headline as Po, headlineVariants as go } from "./components/ui/headline.js";
|
|
25
25
|
import { Body as Co, bodyVariants as Lo } from "./components/ui/body.js";
|
|
26
|
-
import { Label as
|
|
27
|
-
import { Calendar as
|
|
26
|
+
import { Label as yo, labelVariants as Do } from "./components/ui/label.js";
|
|
27
|
+
import { Calendar as co } from "./components/ui/calendar.js";
|
|
28
|
+
import { ProgressBar as Ho } from "./components/ui/progress-bar.js";
|
|
29
|
+
import { VideoPlayer as Vo } from "./components/ui/video-player.js";
|
|
30
|
+
import { Timeline as uo } from "./components/ui/timeline.js";
|
|
28
31
|
export {
|
|
29
32
|
fo as ActionModal,
|
|
30
33
|
J as Badge,
|
|
31
34
|
Co as Body,
|
|
32
35
|
b as Button,
|
|
33
36
|
P as ButtonIndicator,
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
co as Calendar,
|
|
38
|
+
B as Checkbox,
|
|
36
39
|
$ as Chip,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
no as ContentModal,
|
|
41
|
+
s as DS_RADIUS,
|
|
42
|
+
T as DS_SHADOW,
|
|
43
|
+
S as Dropdown,
|
|
41
44
|
Po as Headline,
|
|
42
45
|
xo as InformationModal,
|
|
43
46
|
C as InputField,
|
|
44
|
-
|
|
47
|
+
yo as Label,
|
|
45
48
|
w as LoadingBar,
|
|
46
|
-
|
|
49
|
+
so as ModalProvider,
|
|
47
50
|
t as PYLER_LIGHT_COLOR_TOKENS,
|
|
48
51
|
a as PYLER_LIGHT_GROUP_ORDER,
|
|
49
52
|
x as PYLER_TYPOGRAPHY_STYLE,
|
|
50
53
|
q as Pagination,
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
Ho as ProgressBar,
|
|
55
|
+
O as Radio,
|
|
56
|
+
y as SearchField,
|
|
53
57
|
ro as SnackbarContent,
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
E as Table,
|
|
59
|
+
I as TableBody,
|
|
56
60
|
Y as TableCell,
|
|
57
61
|
M as TableHead,
|
|
58
62
|
k as TableHeaderCell,
|
|
@@ -64,18 +68,20 @@ export {
|
|
|
64
68
|
W as TabsTrigger,
|
|
65
69
|
X as Tag,
|
|
66
70
|
L as TextField,
|
|
71
|
+
uo as Timeline,
|
|
67
72
|
po as Tips,
|
|
68
73
|
eo as Toaster,
|
|
69
|
-
|
|
74
|
+
h as Toggle,
|
|
75
|
+
Vo as VideoPlayer,
|
|
70
76
|
Lo as bodyVariants,
|
|
71
|
-
|
|
77
|
+
g as buttonVariants,
|
|
72
78
|
l as flatPylerLightTokens,
|
|
73
79
|
p as formatPylerPathForDisplay,
|
|
74
|
-
|
|
80
|
+
m as getDsCssVar,
|
|
75
81
|
f as getPylerCssVar,
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
go as headlineVariants,
|
|
83
|
+
Do as labelVariants,
|
|
78
84
|
to as snackbar,
|
|
79
85
|
ao as toast,
|
|
80
|
-
|
|
86
|
+
To as useModal
|
|
81
87
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchField · InputField 입력 상자 공통 스타일 (Figma 2026-11).
|
|
3
|
+
*
|
|
4
|
+
* - 배경: disabled·readOnly = surface.strong / error = 흰 바탕 / 평소 = surface.normal, focus 때 흰 바탕
|
|
5
|
+
* - 테두리: error = 빨강(disabled·readOnly 여도 유지 — 에러를 숨기지 않는다) / disabled = 없음 /
|
|
6
|
+
* 그 외(readOnly 포함) = 투명, focus 때 파랑. readOnly 도 Tab 으로 포커스되므로 표시가 있어야 한다
|
|
7
|
+
* - 테두리 자리는 늘 1px 투명으로 남겨 focus 때 크기가 변하지 않는다. hover 는 바꾸지 않는다
|
|
8
|
+
*/
|
|
9
|
+
export declare function fieldBoxClasses({ disabled, readOnly, error, }: {
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
error?: boolean;
|
|
13
|
+
}): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
function d({
|
|
3
|
+
disabled: r,
|
|
4
|
+
readOnly: n,
|
|
5
|
+
error: e
|
|
6
|
+
}) {
|
|
7
|
+
return `${r || n ? "bg-ds-surface-strong" : e ? "bg-ds-background-default" : "bg-ds-surface-normal focus-within:bg-ds-background-default"} ${e ? "border-ds-primary-red-normal" : r ? "border-transparent" : "border-transparent focus-within:border-ds-primary-blue-normal"}`;
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
d as fieldBoxClasses
|
|
11
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
function c(t) {
|
|
3
|
+
const o = Number.isFinite(t) && t > 0 ? Math.floor(t) : 0, r = Math.floor(o / 3600), i = Math.floor(o % 3600 / 60), s = o % 60, n = String(i).padStart(2, "0"), a = String(s).padStart(2, "0");
|
|
4
|
+
return r > 0 ? `${r}:${n}:${a}` : `${n}:${a}`;
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
c as formatTime
|
|
8
|
+
};
|
package/dist/lib/icons.d.ts
CHANGED
|
@@ -45,4 +45,10 @@ export declare function GoogleAdsIcon({ className }: IconProps): import("react/j
|
|
|
45
45
|
export declare function DV360Icon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
46
46
|
export declare function MetaIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
47
47
|
export declare function TikTokIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
export declare function PlayArrowIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
49
|
+
export declare function PauseIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
export declare function VolumeUpIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
export declare function VolumeOffIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
52
|
+
export declare function FullscreenIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export declare function FullscreenExitIcon({ className }: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
48
54
|
export {};
|