@dotss/tictoccroc 0.12.1 → 0.13.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.
@@ -0,0 +1,128 @@
1
+ import { formatTimeLabel as e, getEndTimeColumn as t, getStartTimeColumn as n, isNextDayTime as r, shouldResetEndTime as i } from "./shared/components/TimePicker/TimePicker.utils.mjs";
2
+ import { forwardRef as a, useCallback as o, useEffect as s, useRef as c, useState as l } from "react";
3
+ import { ChainPicker as u, Flexbox as d, Label as f, Typography as p } from "@dotss/ui";
4
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
5
+ import g from "@emotion/styled";
6
+ //#region shared/components/TimePicker/TimePicker.styles.ts
7
+ var _ = g.div`
8
+ position: relative;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ gap: ${({ theme: { spacing: e } }) => e.content(7)}px;
13
+ width: 100%;
14
+ padding: ${({ theme: { spacing: e } }) => e.content(2)}px 0;
15
+ `, v = g.div`
16
+ position: absolute;
17
+ width: 100%;
18
+ height: 54px;
19
+ background: ${({ theme: e }) => e.palette.background.primary};
20
+ border-radius: 12px;
21
+ `;
22
+ //#endregion
23
+ //#region shared/components/TimePicker/TimePicker.tsx
24
+ function y(t, n, i) {
25
+ let a = i && r(t.value), { period: o, time: s, ariaText: c } = e(t.label, a);
26
+ return /* @__PURE__ */ h(d, {
27
+ gap: 1,
28
+ alignItems: "center",
29
+ justifyContent: "center",
30
+ "aria-label": c,
31
+ inlineCSS: i ? { width: "117px" } : { width: "82px" },
32
+ children: [
33
+ a && /* @__PURE__ */ m(f, {
34
+ size: "xSmall",
35
+ variant: n ? "solid" : "outlined",
36
+ color: "yellow",
37
+ "aria-hidden": !0,
38
+ children: "다음 날"
39
+ }),
40
+ /* @__PURE__ */ m(p, {
41
+ tag: "span",
42
+ variant: n ? "h5M" : "b5M",
43
+ children: o
44
+ }),
45
+ /* @__PURE__ */ m(p, {
46
+ tag: "span",
47
+ variant: n ? "h2M" : "h4M",
48
+ children: s
49
+ })
50
+ ]
51
+ });
52
+ }
53
+ var b = a(function({ onChange: e, onChangeStartTime: r, onChangeEndTime: a, startTime: d = 9, endTime: f = 12, range: g = [0, 24], step: b = 1, maxDuration: x, startTimeChainPickerProps: S, endTimeChainPickerProps: C, timePickerHighlightProps: w, renderStartTimeLabel: T, renderEndTimeLabel: E, inlineCSS: D, ...O }, k) {
54
+ let [A, j] = l(d), [M, N] = l(f), P = c(n(g, b, x)), F = c(t(d, g, b, x)), I = o((e, t) => y(e, t, !1), []), L = o((e, t) => y(e, t, x !== void 0), [x]), R = (e) => {
55
+ j(e), F.current = t(e, g, b, x), i(e, f, b, x) && N(F.current[0].value);
56
+ }, z = (e) => {
57
+ N(e);
58
+ };
59
+ return s(() => {
60
+ F.current = t(d, g, b, x);
61
+ }, [
62
+ d,
63
+ f,
64
+ g,
65
+ b,
66
+ x
67
+ ]), s(() => {
68
+ j(d);
69
+ }, [d]), s(() => {
70
+ i(d, f, b, x) ? N(F.current[0].value) : N(f);
71
+ }, [
72
+ d,
73
+ f,
74
+ b,
75
+ x
76
+ ]), s(() => {
77
+ e(A, M);
78
+ }, [A, M]), s(() => {
79
+ r?.(A);
80
+ }, [A]), s(() => {
81
+ a?.(M);
82
+ }, [M]), /* @__PURE__ */ h(_, {
83
+ ref: k,
84
+ css: D,
85
+ role: "group",
86
+ "aria-label": "시간 선택",
87
+ ...O,
88
+ children: [
89
+ /* @__PURE__ */ m(v, {
90
+ ...w,
91
+ "aria-hidden": !0
92
+ }),
93
+ /* @__PURE__ */ m(u, {
94
+ column: P.current,
95
+ value: d,
96
+ onChange: R,
97
+ renderLabel: T || I,
98
+ "aria-label": "시작 시간 선택",
99
+ inlineCSS: {
100
+ "& > li": { padding: 0 },
101
+ ...S?.inlineCSS
102
+ },
103
+ ...S
104
+ }),
105
+ /* @__PURE__ */ m(p, {
106
+ variant: "h5M",
107
+ color: "grey.50",
108
+ "aria-hidden": !0,
109
+ inlineCSS: { zIndex: 1 },
110
+ children: "부터"
111
+ }),
112
+ /* @__PURE__ */ m(u, {
113
+ column: F.current,
114
+ value: f,
115
+ onChange: z,
116
+ renderLabel: E || L,
117
+ "aria-label": "종료 시간 선택",
118
+ inlineCSS: {
119
+ "& > li": { padding: 0 },
120
+ ...C?.inlineCSS
121
+ },
122
+ ...C
123
+ })
124
+ ]
125
+ });
126
+ });
127
+ //#endregion
128
+ export { b as t };
@@ -1,10 +1,7 @@
1
1
  import { HTMLAttributes, ReactNode } from 'react';
2
- import { ChainPicker } from '@dotss/ui';
2
+ import { ChainPickerItem, ChainPicker } from '@dotss/ui';
3
3
  import { FlexboxProps } from 'node_modules/@dotss/ui/Flexbox/Flexbox';
4
- export interface TimePickerItem {
5
- label: string;
6
- value: number;
7
- }
4
+ export type TimePickerItem = ChainPickerItem;
8
5
  export interface TimePickerProps extends Omit<FlexboxProps, 'onChange'> {
9
6
  onChange: (startTime: number, endTime: number) => void;
10
7
  onChangeStartTime?: (startTime: number) => void;
@@ -13,6 +10,22 @@ export interface TimePickerProps extends Omit<FlexboxProps, 'onChange'> {
13
10
  endTime?: number;
14
11
  step?: number;
15
12
  range?: [number, number];
13
+ /**
14
+ * 시작부터 종료까지 고를 수 있는 최대 시간(시간 단위)이다.
15
+ * 이 값을 지정하면 종료가 자정을 넘을 수 있다.
16
+ * 종료 열은 `start + step`부터 `start + maxDuration`까지이고 `range[1]`은 쓰지 않는다.
17
+ * 시작 열은 `range[1] - 0.5`까지다.
18
+ *
19
+ * 24 이상인 종료 값은 다음 날 시각이고(28은 다음 날 04:00), `onChange`와
20
+ * `onChangeEndTime`에도 그대로 넘어간다.
21
+ *
22
+ * `step` 이상 24 이하여야 한다. `step`보다 작으면 종료 열이 비어 오류가 나고,
23
+ * 24보다 크면 같은 시각이 두 번 나올 수 있다.
24
+ *
25
+ * 시작 열은 마운트할 때 한 번만 만든다. 마운트 뒤 `maxDuration`, `range`, `step`이
26
+ * 바뀔 수 있으면 `key`로 다시 마운트한다.
27
+ */
28
+ maxDuration?: number;
16
29
  startTimeChainPickerProps?: Omit<Parameters<typeof ChainPicker>[0], 'column' | 'value' | 'onChange' | 'renderLabel'>;
17
30
  endTimeChainPickerProps?: Omit<Parameters<typeof ChainPicker>[0], 'column' | 'value' | 'onChange' | 'renderLabel'>;
18
31
  timePickerHighlightProps?: HTMLAttributes<HTMLDivElement>;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../TimePicker-BwACyeBR.js";
1
+ import { t as e } from "../../../TimePicker-eObMuz3A.js";
2
2
  export { e as default };
@@ -0,0 +1,11 @@
1
+ import { ChainPickerItem } from '@dotss/ui';
2
+ export declare const NEXT_DAY_LABEL = "\uB2E4\uC74C \uB0A0";
3
+ export declare function getStartTimeColumn(range: [number, number], step: number, maxDuration?: number): ChainPickerItem[];
4
+ export declare function getEndTimeColumn(startTime: number, range: [number, number], step: number, maxDuration?: number): ChainPickerItem[];
5
+ export declare function shouldResetEndTime(startTime: number, endTime: number, step: number, maxDuration?: number): boolean;
6
+ export declare function isNextDayTime(value: number): boolean;
7
+ export declare function formatTimeLabel(label: string, isNextDay: boolean): {
8
+ period: string;
9
+ time: string;
10
+ ariaText: string;
11
+ };
@@ -0,0 +1,38 @@
1
+ import e from "../../utils/getTimeRange/index.mjs";
2
+ //#region shared/components/TimePicker/TimePicker.utils.ts
3
+ var t = .5, n = 24, r = "다음 날";
4
+ function i(r, i, a) {
5
+ let o = a === void 0 ? r[1] - i : r[1] - t;
6
+ return e(0, n, {
7
+ minTime: r[0],
8
+ maxTime: o
9
+ });
10
+ }
11
+ function a(t, r, i, a) {
12
+ return a === void 0 ? e(0, n, {
13
+ minTime: t + i > r[1] ? r[1] : t + i,
14
+ maxTime: r[1]
15
+ }) : e(0, n * 2, {
16
+ minTime: t + i,
17
+ maxTime: t + a
18
+ }).map((e) => ({
19
+ ...e,
20
+ ariaValueText: c(e.label, s(e.value)).ariaText
21
+ }));
22
+ }
23
+ function o(e, n, r, i) {
24
+ return i === void 0 ? e >= n - t : n < e + r || n > e + i;
25
+ }
26
+ function s(e) {
27
+ return e >= n;
28
+ }
29
+ function c(e, t) {
30
+ let [n, i] = e.split(":").map(Number), a = n >= 12 ? "오후" : "오전", o = n % 12 || 12;
31
+ return {
32
+ period: a,
33
+ time: `${o}:${i.toString().padStart(2, "0")}`,
34
+ ariaText: `${t ? `${r} ` : ""}${a} ${o}시 ${i}분`
35
+ };
36
+ }
37
+ //#endregion
38
+ export { r as NEXT_DAY_LABEL, c as formatTimeLabel, a as getEndTimeColumn, i as getStartTimeColumn, s as isNextDayTime, o as shouldResetEndTime };
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../../TimePicker-BwACyeBR.js";
1
+ import { t as e } from "../../../TimePicker-eObMuz3A.js";
2
2
  //#region shared/components/TimePicker/index.ts
3
3
  var t = e;
4
4
  //#endregion
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dotss/tictoccroc",
3
3
  "type": "module",
4
- "version": "0.12.1",
4
+ "version": "0.13.0",
5
5
  "description": "Tictoccroc shared components, hooks, utils, and APIs for Dotss",
6
6
  "main": "./dist/index.mjs",
7
7
  "module": "./dist/index.mjs",
@@ -1,120 +0,0 @@
1
- import e from "./shared/utils/getTimeRange/index.mjs";
2
- import { forwardRef as t, useCallback as n, useEffect as r, useRef as i, useState as a } from "react";
3
- import { ChainPicker as o, Flexbox as s, Typography as c } from "@dotss/ui";
4
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
- import d from "@emotion/styled";
6
- //#region shared/components/TimePicker/TimePicker.styles.ts
7
- var f = d.div`
8
- position: relative;
9
- display: flex;
10
- align-items: center;
11
- justify-content: center;
12
- gap: ${({ theme: { spacing: e } }) => e.content(7)}px;
13
- width: 100%;
14
- padding: ${({ theme: { spacing: e } }) => e.content(2)}px 0;
15
- `, p = d.div`
16
- position: absolute;
17
- width: 100%;
18
- height: 54px;
19
- background: ${({ theme: e }) => e.palette.background.primary};
20
- border-radius: 12px;
21
- `, m = t(function({ onChange: t, onChangeStartTime: d, onChangeEndTime: m, startTime: h = 9, endTime: g = 12, range: _ = [0, 24], step: v = 1, startTimeChainPickerProps: y, endTimeChainPickerProps: b, timePickerHighlightProps: x, renderStartTimeLabel: S, renderEndTimeLabel: C, inlineCSS: w, ...T }, E) {
22
- let [D, O] = a(h), [k, A] = a(g), j = i(e(0, 24, {
23
- minTime: _[0],
24
- maxTime: _[1] - v
25
- })), M = i(e(0, 24, {
26
- minTime: h + v,
27
- maxTime: _[1]
28
- })), N = n((e, t) => {
29
- let [n, r] = e.label.split(":").map(Number), i = n >= 12, a = n % 12 || 12, o = i ? "오후" : "오전";
30
- return /* @__PURE__ */ u(s, {
31
- gap: 1,
32
- alignItems: "center",
33
- justifyContent: "center",
34
- "aria-label": `${o} ${a}시 ${r}분`,
35
- inlineCSS: { width: "82px" },
36
- children: [/* @__PURE__ */ l(c, {
37
- tag: "span",
38
- variant: t ? "h5M" : "b5M",
39
- children: o
40
- }), /* @__PURE__ */ l(c, {
41
- tag: "span",
42
- variant: t ? "h2M" : "h4M",
43
- children: `${a}:${r.toString().padStart(2, "0")}`
44
- })]
45
- });
46
- }, []), P = (t) => {
47
- O(t), M.current = e(0, 24, {
48
- minTime: t + v > _[1] ? _[1] : t + v,
49
- maxTime: _[1]
50
- }), t >= g - .5 && A(M.current[0].value);
51
- }, F = (e) => {
52
- A(e);
53
- };
54
- return r(() => {
55
- M.current = e(0, 24, {
56
- minTime: h + v > _[1] ? _[1] : h + v,
57
- maxTime: _[1]
58
- });
59
- }, [
60
- h,
61
- g,
62
- _,
63
- v
64
- ]), r(() => {
65
- O(h);
66
- }, [h]), r(() => {
67
- h >= g - .5 ? A(M.current[0].value) : A(g);
68
- }, [h, g]), r(() => {
69
- t(D, k);
70
- }, [D, k]), r(() => {
71
- d?.(D);
72
- }, [D]), r(() => {
73
- m?.(k);
74
- }, [k]), /* @__PURE__ */ u(f, {
75
- ref: E,
76
- css: w,
77
- role: "group",
78
- "aria-label": "시간 선택",
79
- ...T,
80
- children: [
81
- /* @__PURE__ */ l(p, {
82
- ...x,
83
- "aria-hidden": !0
84
- }),
85
- /* @__PURE__ */ l(o, {
86
- column: j.current,
87
- value: h,
88
- onChange: P,
89
- renderLabel: S || N,
90
- "aria-label": "시작 시간 선택",
91
- inlineCSS: {
92
- "& > li": { padding: 0 },
93
- ...y?.inlineCSS
94
- },
95
- ...y
96
- }),
97
- /* @__PURE__ */ l(c, {
98
- variant: "h5M",
99
- color: "grey.50",
100
- "aria-hidden": !0,
101
- inlineCSS: { zIndex: 1 },
102
- children: "부터"
103
- }),
104
- /* @__PURE__ */ l(o, {
105
- column: M.current,
106
- value: g,
107
- onChange: F,
108
- renderLabel: C || N,
109
- "aria-label": "종료 시간 선택",
110
- inlineCSS: {
111
- "& > li": { padding: 0 },
112
- ...b?.inlineCSS
113
- },
114
- ...b
115
- })
116
- ]
117
- });
118
- });
119
- //#endregion
120
- export { m as t };