@dotss/tictoccroc 0.12.1 → 0.13.1

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
@@ -27,6 +27,7 @@ function l() {
27
27
  /* @__PURE__ */ i(s, {
28
28
  justifyContent: "space-between",
29
29
  gap: 3,
30
+ flexWrap: "wrap",
30
31
  children: [/* @__PURE__ */ i(s, {
31
32
  flexDirection: "column",
32
33
  gap: 2,
@@ -67,26 +68,23 @@ function l() {
67
68
  borderRadius: 4
68
69
  })]
69
70
  }),
70
- /* @__PURE__ */ i(s, {
71
+ /* @__PURE__ */ r(s, {
71
72
  flexDirection: "column",
72
73
  gap: 1,
73
- children: [/* @__PURE__ */ r(c, {
74
- textHeight: "b4M",
75
- inlineCSS: { width: "100%" }
76
- }), /* @__PURE__ */ r(c, {
74
+ children: /* @__PURE__ */ r(c, {
77
75
  textHeight: "b4M",
78
- inlineCSS: { width: "72%" }
79
- })]
76
+ inlineCSS: { width: "80%" }
77
+ })
80
78
  }),
81
79
  /* @__PURE__ */ i(s, {
82
80
  flexDirection: "column",
83
81
  gap: 1,
84
82
  children: [/* @__PURE__ */ r(c, {
85
83
  textHeight: "b5R",
86
- inlineCSS: { width: "68%" }
84
+ inlineCSS: { width: "65%" }
87
85
  }), /* @__PURE__ */ r(c, {
88
86
  textHeight: "b5R",
89
- inlineCSS: { width: "84%" }
87
+ inlineCSS: { width: "75%" }
90
88
  })]
91
89
  })
92
90
  ]
@@ -103,8 +101,10 @@ function l() {
103
101
  }
104
102
  }),
105
103
  /* @__PURE__ */ i(s, {
104
+ gap: 1,
106
105
  alignItems: "center",
107
106
  justifyContent: "space-between",
107
+ flexWrap: "wrap",
108
108
  children: [/* @__PURE__ */ r(c, {
109
109
  width: 148,
110
110
  textHeight: "h5B"
@@ -113,13 +113,6 @@ function l() {
113
113
  height: 24,
114
114
  borderRadius: 6
115
115
  })]
116
- }),
117
- /* @__PURE__ */ r(s, {
118
- mt: 1,
119
- children: /* @__PURE__ */ r(c, {
120
- textHeight: "c4R",
121
- inlineCSS: { width: "78%" }
122
- })
123
116
  })
124
117
  ]
125
118
  })] });
@@ -37,6 +37,7 @@ function p({ idx: p, name: m, adornmentUrl: h, picture: g, introduction: _, sele
37
37
  /* @__PURE__ */ a(u, {
38
38
  justifyContent: "space-between",
39
39
  gap: 3,
40
+ flexWrap: "wrap",
40
41
  children: [/* @__PURE__ */ a(u, {
41
42
  flexDirection: "column",
42
43
  gap: 2,
@@ -86,6 +87,7 @@ function p({ idx: p, name: m, adornmentUrl: h, picture: g, introduction: _, sele
86
87
  }), /* @__PURE__ */ a(u, {
87
88
  flexDirection: "column",
88
89
  gap: 2,
90
+ flex: 1,
89
91
  children: [
90
92
  /* @__PURE__ */ a(u, {
91
93
  gap: 2,
@@ -156,6 +158,7 @@ function p({ idx: p, name: m, adornmentUrl: h, picture: g, introduction: _, sele
156
158
  alignItems: "center",
157
159
  gap: 1,
158
160
  justifyContent: "space-between",
161
+ flexWrap: "wrap",
159
162
  children: [/* @__PURE__ */ i(u, {
160
163
  gap: 1,
161
164
  children: E && /* @__PURE__ */ i(f, {
@@ -166,6 +169,7 @@ function p({ idx: p, name: m, adornmentUrl: h, picture: g, introduction: _, sele
166
169
  gap: k.content(1),
167
170
  alignItems: "center",
168
171
  flexGrow: 1,
172
+ flexWrap: "wrap",
169
173
  "& *": { color: b ? A.grey[50] : void 0 }
170
174
  },
171
175
  color: b ? "grey.50" : void 0,
@@ -6,10 +6,10 @@ export declare function getCareActivityLabel({ numChildren, totalHours }: {
6
6
  totalHours: number;
7
7
  }): import("@emotion/react/jsx-runtime").JSX.Element;
8
8
  export declare function getStrengthLabel({ careers, certificates, educations, categories }: {
9
- certificates: string[];
10
- careers: string[];
11
- educations: string[];
12
- categories: string[];
9
+ certificates?: string[];
10
+ careers?: string[];
11
+ educations?: string[];
12
+ categories?: string[];
13
13
  }): import("@emotion/react/jsx-runtime").JSX.Element | null;
14
14
  export declare function getChargeLabel(charge: number): import("@emotion/react/jsx-runtime").JSX.Element;
15
15
  export declare function getNote(note: string): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -25,7 +25,10 @@ function u({ numChildren: e, totalHours: r }) {
25
25
  name: "KidsLine",
26
26
  size: "xSmall",
27
27
  color: "grey.70",
28
- inlineCSS: { transform: "translateY(0.5px)" }
28
+ inlineCSS: {
29
+ transform: "translateY(0.5px)",
30
+ flexShrink: 0
31
+ }
29
32
  }), /* @__PURE__ */ s(i, {
30
33
  tag: "p",
31
34
  variant: "b5R",
@@ -43,7 +46,10 @@ function u({ numChildren: e, totalHours: r }) {
43
46
  name: "TimeLine",
44
47
  size: "xSmall",
45
48
  color: "grey.70",
46
- inlineCSS: { transform: "translateY(0.5px)" }
49
+ inlineCSS: {
50
+ transform: "translateY(0.5px)",
51
+ flexShrink: 0
52
+ }
47
53
  }), /* @__PURE__ */ s(i, {
48
54
  tag: "p",
49
55
  variant: "b5R",
@@ -162,7 +168,10 @@ function p(e) {
162
168
  name: "InformationLine",
163
169
  size: "xSmall",
164
170
  color: "etc.orange",
165
- inlineCSS: { transform: "translateY(-0.5px)" }
171
+ inlineCSS: {
172
+ transform: "translateY(-0.5px)",
173
+ flexShrink: 0
174
+ }
166
175
  }), /* @__PURE__ */ o(i, {
167
176
  tag: "p",
168
177
  variant: "c4R",
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.1",
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 };