@tipp/ui 2.0.2 → 2.0.4

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.
Files changed (152) hide show
  1. package/dist/app/index.cjs +2 -7
  2. package/dist/app/index.cjs.map +1 -1
  3. package/dist/app/index.js +7 -7
  4. package/dist/app/platform/edit-coaching-time.cjs +2 -7
  5. package/dist/app/platform/edit-coaching-time.cjs.map +1 -1
  6. package/dist/app/platform/edit-coaching-time.js +4 -4
  7. package/dist/app/platform/edit-service-type.cjs +2 -7
  8. package/dist/app/platform/edit-service-type.cjs.map +1 -1
  9. package/dist/app/platform/edit-service-type.js +3 -3
  10. package/dist/app/platform/goal-manage-card-edit.cjs +2 -7
  11. package/dist/app/platform/goal-manage-card-edit.cjs.map +1 -1
  12. package/dist/app/platform/goal-manage-card-edit.js +4 -4
  13. package/dist/app/platform/on-offline-radio-card.cjs +2 -7
  14. package/dist/app/platform/on-offline-radio-card.cjs.map +1 -1
  15. package/dist/app/platform/on-offline-radio-card.js +3 -3
  16. package/dist/app/platform/reservation-card.cjs +2 -7
  17. package/dist/app/platform/reservation-card.cjs.map +1 -1
  18. package/dist/app/platform/reservation-card.js +4 -4
  19. package/dist/app/platform/session-card.cjs +2 -7
  20. package/dist/app/platform/session-card.cjs.map +1 -1
  21. package/dist/app/platform/session-card.js +5 -5
  22. package/dist/{chunk-VTWZCX6H.js → chunk-A2NYBAVH.js} +11 -11
  23. package/dist/{chunk-ESHEHOVH.js → chunk-GLRDUHQR.js} +2 -2
  24. package/dist/{chunk-CQSOA3HY.js → chunk-JPZNEPCW.js} +5 -5
  25. package/dist/{chunk-L44AC52S.js → chunk-KDEUSAQW.js} +2 -2
  26. package/dist/{chunk-GSU262TZ.js → chunk-QOUGBWAQ.js} +2 -7
  27. package/dist/chunk-QOUGBWAQ.js.map +1 -0
  28. package/dist/{chunk-UVACR5CC.js → chunk-TF3Q4TQM.js} +2 -2
  29. package/dist/index.cjs +2 -7
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +9 -9
  32. package/dist/molecules/date-picker/date-picker-button.cjs +2 -7
  33. package/dist/molecules/date-picker/date-picker-button.cjs.map +1 -1
  34. package/dist/molecules/date-picker/date-picker-button.js +2 -2
  35. package/dist/molecules/date-picker/index.cjs +2 -7
  36. package/dist/molecules/date-picker/index.cjs.map +1 -1
  37. package/dist/molecules/date-picker/index.d.cts +2 -3
  38. package/dist/molecules/date-picker/index.d.ts +2 -3
  39. package/dist/molecules/date-picker/index.js +1 -1
  40. package/dist/molecules/index.cjs +2 -7
  41. package/dist/molecules/index.cjs.map +1 -1
  42. package/dist/molecules/index.js +5 -5
  43. package/package.json +12 -16
  44. package/src/molecules/date-picker/index.tsx +1 -10
  45. package/dist/chunk-2K4GU6TT.js +0 -174
  46. package/dist/chunk-3CVQG5IO.js +0 -54
  47. package/dist/chunk-3CVQG5IO.js.map +0 -1
  48. package/dist/chunk-3FEMWCWV.js +0 -23
  49. package/dist/chunk-3FEMWCWV.js.map +0 -1
  50. package/dist/chunk-3UJOUGH3.js +0 -169
  51. package/dist/chunk-3UJOUGH3.js.map +0 -1
  52. package/dist/chunk-4LYUNBCH.js +0 -174
  53. package/dist/chunk-4LYUNBCH.js.map +0 -1
  54. package/dist/chunk-4NBRGUIC.js +0 -144
  55. package/dist/chunk-4YKESXWQ.js +0 -68
  56. package/dist/chunk-4YKESXWQ.js.map +0 -1
  57. package/dist/chunk-54C63CWN.js +0 -74
  58. package/dist/chunk-54C63CWN.js.map +0 -1
  59. package/dist/chunk-5DTCJF6D.js +0 -144
  60. package/dist/chunk-5DTCJF6D.js.map +0 -1
  61. package/dist/chunk-6OQQUSCX.js +0 -281
  62. package/dist/chunk-75ENC5RS.js +0 -30
  63. package/dist/chunk-75ENC5RS.js.map +0 -1
  64. package/dist/chunk-7IX5IEPU.js +0 -63
  65. package/dist/chunk-7IX5IEPU.js.map +0 -1
  66. package/dist/chunk-7VJB7OZ3.js +0 -145
  67. package/dist/chunk-ACG3G2CH.js +0 -31
  68. package/dist/chunk-ACG3G2CH.js.map +0 -1
  69. package/dist/chunk-AEPCBZF7.js +0 -30
  70. package/dist/chunk-AEPCBZF7.js.map +0 -1
  71. package/dist/chunk-AJU5NJ2C.js +0 -97
  72. package/dist/chunk-AJU5NJ2C.js.map +0 -1
  73. package/dist/chunk-BFLGQQJZ.js +0 -30
  74. package/dist/chunk-BFLGQQJZ.js.map +0 -1
  75. package/dist/chunk-BZVP23R4.js +0 -145
  76. package/dist/chunk-BZVP23R4.js.map +0 -1
  77. package/dist/chunk-CQSOA3HY.js.map +0 -1
  78. package/dist/chunk-D6WG5BHL.js +0 -39
  79. package/dist/chunk-D6WG5BHL.js.map +0 -1
  80. package/dist/chunk-DFXO2GOC.js +0 -144
  81. package/dist/chunk-DFXO2GOC.js.map +0 -1
  82. package/dist/chunk-DQGB3JQA.js +0 -63
  83. package/dist/chunk-DQGB3JQA.js.map +0 -1
  84. package/dist/chunk-E3T66HOA.js +0 -106
  85. package/dist/chunk-E3T66HOA.js.map +0 -1
  86. package/dist/chunk-EJ3JNXLY.js +0 -99
  87. package/dist/chunk-EJ3JNXLY.js.map +0 -1
  88. package/dist/chunk-F5MKSWHL.js +0 -163
  89. package/dist/chunk-F5MKSWHL.js.map +0 -1
  90. package/dist/chunk-FV26PAOO.js +0 -352
  91. package/dist/chunk-FV26PAOO.js.map +0 -1
  92. package/dist/chunk-GSU262TZ.js.map +0 -1
  93. package/dist/chunk-HOKENHFD.js +0 -281
  94. package/dist/chunk-HOKENHFD.js.map +0 -1
  95. package/dist/chunk-IIN3YNMK.js +0 -281
  96. package/dist/chunk-IIN3YNMK.js.map +0 -1
  97. package/dist/chunk-JDE7356R.js +0 -64
  98. package/dist/chunk-JDE7356R.js.map +0 -1
  99. package/dist/chunk-JKNCADEB.js +0 -74
  100. package/dist/chunk-JKNCADEB.js.map +0 -1
  101. package/dist/chunk-JLT3GUBP.js +0 -144
  102. package/dist/chunk-JLT3GUBP.js.map +0 -1
  103. package/dist/chunk-JMS4TRIK.js +0 -64
  104. package/dist/chunk-JMS4TRIK.js.map +0 -1
  105. package/dist/chunk-KXEHA6WD.js +0 -63
  106. package/dist/chunk-KXEHA6WD.js.map +0 -1
  107. package/dist/chunk-L44AC52S.js.map +0 -1
  108. package/dist/chunk-LFZ22PRA.js +0 -281
  109. package/dist/chunk-LFZ22PRA.js.map +0 -1
  110. package/dist/chunk-NBPRKG6W.js +0 -106
  111. package/dist/chunk-NBPRKG6W.js.map +0 -1
  112. package/dist/chunk-NJ4N3VCI.js +0 -174
  113. package/dist/chunk-NJ4N3VCI.js.map +0 -1
  114. package/dist/chunk-NNPT6BV4.js +0 -117
  115. package/dist/chunk-NNPT6BV4.js.map +0 -1
  116. package/dist/chunk-NVIBNWII.js +0 -57
  117. package/dist/chunk-NVIBNWII.js.map +0 -1
  118. package/dist/chunk-OHIU6IRT.js +0 -174
  119. package/dist/chunk-OHIU6IRT.js.map +0 -1
  120. package/dist/chunk-PE4V3SCZ.js +0 -145
  121. package/dist/chunk-PE4V3SCZ.js.map +0 -1
  122. package/dist/chunk-PEIOKCXD.js +0 -144
  123. package/dist/chunk-PEIOKCXD.js.map +0 -1
  124. package/dist/chunk-PLAQRGID.js +0 -281
  125. package/dist/chunk-PLAQRGID.js.map +0 -1
  126. package/dist/chunk-PWXFETED.js +0 -146
  127. package/dist/chunk-PWXFETED.js.map +0 -1
  128. package/dist/chunk-QMT5IFKD.js +0 -64
  129. package/dist/chunk-QMT5IFKD.js.map +0 -1
  130. package/dist/chunk-RIGG6NNZ.js +0 -74
  131. package/dist/chunk-RIGG6NNZ.js.map +0 -1
  132. package/dist/chunk-S52LOF3I.js +0 -354
  133. package/dist/chunk-S52LOF3I.js.map +0 -1
  134. package/dist/chunk-S6DQEDBV.js +0 -145
  135. package/dist/chunk-S6DQEDBV.js.map +0 -1
  136. package/dist/chunk-UVACR5CC.js.map +0 -1
  137. package/dist/chunk-VTWZCX6H.js.map +0 -1
  138. package/dist/chunk-X2Q6QPMS.js +0 -165
  139. package/dist/chunk-X2Q6QPMS.js.map +0 -1
  140. package/dist/chunk-YAKVZPPI.js +0 -39
  141. package/dist/chunk-YAKVZPPI.js.map +0 -1
  142. package/dist/chunk-ZEAJABLA.js +0 -146
  143. package/dist/chunk-ZEAJABLA.js.map +0 -1
  144. package/dist/chunk-ZJTONHYI.js +0 -144
  145. package/dist/chunk-ZJTONHYI.js.map +0 -1
  146. package/dist/chunk-ZN52UBYA.js +0 -39
  147. package/dist/chunk-ZN52UBYA.js.map +0 -1
  148. /package/dist/{chunk-6OQQUSCX.js.map → chunk-A2NYBAVH.js.map} +0 -0
  149. /package/dist/{chunk-ESHEHOVH.js.map → chunk-GLRDUHQR.js.map} +0 -0
  150. /package/dist/{chunk-4NBRGUIC.js.map → chunk-JPZNEPCW.js.map} +0 -0
  151. /package/dist/{chunk-7VJB7OZ3.js.map → chunk-KDEUSAQW.js.map} +0 -0
  152. /package/dist/{chunk-2K4GU6TT.js.map → chunk-TF3Q4TQM.js.map} +0 -0
@@ -1,352 +0,0 @@
1
- import {
2
- Popover
3
- } from "./chunk-5AVBYDPB.js";
4
- import {
5
- ScrollArea
6
- } from "./chunk-MUPK4L3U.js";
7
- import {
8
- Grid
9
- } from "./chunk-EGEQY3KT.js";
10
- import {
11
- AutoSizingInput
12
- } from "./chunk-XTHDFSN3.js";
13
- import {
14
- Badge
15
- } from "./chunk-FCIHNIOH.js";
16
- import {
17
- Typo
18
- } from "./chunk-LH57PIY2.js";
19
- import {
20
- Flex
21
- } from "./chunk-25HMMI7R.js";
22
- import {
23
- Button
24
- } from "./chunk-AFPH32MF.js";
25
- import {
26
- CheckIcon
27
- } from "./chunk-HLFG5ZTU.js";
28
-
29
- // src/molecules/tag-selector.tsx
30
- import {
31
- useCallback,
32
- useEffect,
33
- useMemo,
34
- useRef,
35
- useState
36
- } from "react";
37
- import {
38
- ChevronRightIcon,
39
- Cross1Icon,
40
- MagnifyingGlassIcon
41
- } from "@radix-ui/react-icons";
42
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
43
- var OPTION_HEIGHT = 32;
44
- var DefaultDropdownContainer = (props) => {
45
- return props.children;
46
- };
47
- function TagSelector(props) {
48
- const {
49
- options = [],
50
- tagRender,
51
- placeholder,
52
- maxCount = 0,
53
- DropdownContainer = DefaultDropdownContainer,
54
- size = "medium",
55
- readOnly,
56
- error,
57
- open: propsOpen,
58
- dropdownItemRender
59
- } = props;
60
- const [_selected, _setSelected] = useState(props.selected || []);
61
- const selected = props.selected || _selected;
62
- const setSelected = props.onChange || _setSelected;
63
- const [value, setValue] = useState("");
64
- const [focusIndex, setFocusIndex] = useState(null);
65
- const [open, setOpen] = useState(false);
66
- const [focus, setFocus] = useState(false);
67
- const fieldRef = useRef(null);
68
- const scrollRef = useRef(null);
69
- const closeRef = useRef();
70
- const onFocus = useCallback(() => {
71
- clearTimeout(closeRef.current);
72
- setFocus(true);
73
- setOpen(true);
74
- }, []);
75
- const onBlur = useCallback(() => {
76
- closeRef.current = setTimeout(() => {
77
- setFocus(false);
78
- setOpen(false);
79
- setTimeout(() => {
80
- setValue("");
81
- }, 100);
82
- }, 300);
83
- }, []);
84
- const onChangeValue = useCallback(
85
- (e) => {
86
- setValue(e.target.value);
87
- },
88
- []
89
- );
90
- const filteredOptions = useMemo(() => {
91
- return options.filter((option) => {
92
- return option.name.includes(value);
93
- });
94
- }, [options, value]);
95
- const selectedItem = useMemo(() => {
96
- const result = [];
97
- selected.forEach((id) => {
98
- const maybeItem = options.find((option) => option.id === id);
99
- if (maybeItem) result.push(maybeItem);
100
- });
101
- return result;
102
- }, [options, selected]);
103
- const onDelete = useCallback(
104
- (id) => {
105
- setSelected(selected.filter((el) => el !== id));
106
- },
107
- [selected, setSelected]
108
- );
109
- const onSelect = useCallback(
110
- (id) => {
111
- if (maxCount && selected.length + 1 > maxCount) return;
112
- setSelected([...selected, id]);
113
- },
114
- [maxCount, selected, setSelected]
115
- );
116
- const toggleItem = useCallback(
117
- (id) => {
118
- if (selected.includes(id)) {
119
- onDelete(id);
120
- } else {
121
- onSelect(id);
122
- }
123
- },
124
- [onDelete, onSelect, selected]
125
- );
126
- const setScroll = useCallback((index) => {
127
- if (scrollRef.current) {
128
- const scrollTop = scrollRef.current.scrollTop;
129
- const clientHeight = scrollRef.current.clientHeight;
130
- const focusTop = index * OPTION_HEIGHT;
131
- if (focusTop < scrollTop) {
132
- scrollRef.current.scrollTop = focusTop;
133
- } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {
134
- scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;
135
- }
136
- }
137
- }, []);
138
- const handleKeyDown = useCallback(
139
- (e) => {
140
- var _a;
141
- const key = e.key;
142
- switch (key) {
143
- case "ArrowDown": {
144
- e.preventDefault();
145
- let newFocus = 0;
146
- if (typeof focusIndex === "number") {
147
- newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;
148
- }
149
- setFocusIndex(newFocus);
150
- setScroll(newFocus);
151
- break;
152
- }
153
- case "ArrowUp": {
154
- e.preventDefault();
155
- let newFocus = 0;
156
- if (typeof focusIndex === "number") {
157
- newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;
158
- }
159
- setFocusIndex(newFocus);
160
- setScroll(newFocus);
161
- break;
162
- }
163
- case "Enter":
164
- setValue("");
165
- if (focusIndex !== null) {
166
- toggleItem((_a = filteredOptions[focusIndex]) == null ? void 0 : _a.id);
167
- }
168
- break;
169
- case "Backspace":
170
- if (value.length === 0) {
171
- setSelected(selected.slice(0, -1));
172
- }
173
- break;
174
- case "Escape":
175
- setOpen(false);
176
- break;
177
- }
178
- },
179
- [
180
- focusIndex,
181
- value.length,
182
- setScroll,
183
- options.length,
184
- toggleItem,
185
- filteredOptions,
186
- setSelected,
187
- selected
188
- ]
189
- );
190
- const placeholderVisible = useMemo(() => {
191
- if (selectedItem.length) return false;
192
- if (value) return false;
193
- if (focus) return false;
194
- return true;
195
- }, [focus, selectedItem.length, value]);
196
- useEffect(() => {
197
- setFocusIndex(null);
198
- }, [open]);
199
- useEffect(() => {
200
- setFocusIndex(0);
201
- }, [filteredOptions]);
202
- const badgeSize = useMemo(() => {
203
- switch (size) {
204
- case "large":
205
- return "large";
206
- case "medium":
207
- case "small":
208
- default:
209
- return "small";
210
- }
211
- }, [size]);
212
- const placeholderVariant = useMemo(() => {
213
- switch (size) {
214
- case "large":
215
- return "subtitle";
216
- case "medium":
217
- default:
218
- return "body";
219
- }
220
- }, [size]);
221
- const focusClassName = focus ? " focused" : "";
222
- const readOnlyClassName = readOnly ? " read-only" : "";
223
- const errorClassName = error ? " error" : "";
224
- const readonlyContent = /* @__PURE__ */ jsx(Flex, { gap: "1", children: selectedItem.map((item) => {
225
- return tagRender ? tagRender(item) : /* @__PURE__ */ jsx(Badge, { size: badgeSize, children: item.name }, item.id);
226
- }) });
227
- const editContent = /* @__PURE__ */ jsxs(Fragment, { children: [
228
- /* @__PURE__ */ jsxs(
229
- Flex,
230
- {
231
- align: "center",
232
- gap: "1",
233
- maxWidth: "100%",
234
- overflow: "hidden",
235
- wrap: "wrap",
236
- children: [
237
- selectedItem.map((item) => {
238
- return tagRender ? tagRender(item, () => {
239
- onDelete(item.id);
240
- }) : /* @__PURE__ */ jsxs(Badge, { size: badgeSize, children: [
241
- item.name,
242
- /* @__PURE__ */ jsx(
243
- Button,
244
- {
245
- onClick: () => {
246
- onDelete(item.id);
247
- },
248
- variant: "transparent",
249
- children: /* @__PURE__ */ jsx(Cross1Icon, {})
250
- }
251
- )
252
- ] }, item.id);
253
- }),
254
- placeholderVisible ? /* @__PURE__ */ jsx(Typo, { color: "gray", variant: placeholderVariant, children: placeholder }) : null,
255
- /* @__PURE__ */ jsx(
256
- AutoSizingInput,
257
- {
258
- onBlur,
259
- onChange: onChangeValue,
260
- onFocus,
261
- onKeyDown: handleKeyDown,
262
- ref: fieldRef,
263
- value
264
- }
265
- )
266
- ]
267
- }
268
- ),
269
- focus ? /* @__PURE__ */ jsx(MagnifyingGlassIcon, {}) : /* @__PURE__ */ jsx(ChevronRightIcon, {})
270
- ] });
271
- return /* @__PURE__ */ jsxs(Popover.Root, { open: Boolean(filteredOptions.length) && propsOpen || open, children: [
272
- /* @__PURE__ */ jsx(Popover.Trigger, { style: { position: "relative" }, children: /* @__PURE__ */ jsx(
273
- Grid,
274
- {
275
- align: "center",
276
- className: `tag-selector ${size} ${focusClassName}${readOnlyClassName}${errorClassName}`,
277
- columns: "1fr auto",
278
- gap: "1",
279
- onClick: () => {
280
- var _a;
281
- return !readOnly && ((_a = fieldRef.current) == null ? void 0 : _a.focus());
282
- },
283
- children: readOnly ? readonlyContent : editContent
284
- }
285
- ) }),
286
- /* @__PURE__ */ jsx(
287
- Popover.Content,
288
- {
289
- onOpenAutoFocus: preventDefault,
290
- onTouchMove: stopPropagationTouch,
291
- onWheel: stopPropagationWheel,
292
- sticky: "always",
293
- children: /* @__PURE__ */ jsx(
294
- DropdownContainer,
295
- {
296
- currentItem: filteredOptions[focusIndex || 0],
297
- items: filteredOptions,
298
- children: /* @__PURE__ */ jsx(
299
- ScrollArea,
300
- {
301
- ref: scrollRef,
302
- scrollbars: "vertical",
303
- style: { height: OPTION_HEIGHT * 8 },
304
- type: "auto",
305
- children: /* @__PURE__ */ jsx(Flex, { direction: "column", children: filteredOptions.map((item, i) => {
306
- const isSelected = Boolean(
307
- selected.find((el) => el === item.id)
308
- );
309
- const isFocus = i === focusIndex;
310
- return /* @__PURE__ */ jsx(
311
- Button,
312
- {
313
- className: `tag-selector-button ${isFocus ? "focused" : ""}`,
314
- onClick: () => {
315
- var _a;
316
- toggleItem(item.id);
317
- (_a = fieldRef.current) == null ? void 0 : _a.focus();
318
- },
319
- onMouseEnter: () => {
320
- setFocusIndex(i);
321
- },
322
- variant: isSelected ? "soft" : "outline",
323
- children: /* @__PURE__ */ jsxs(Flex, { justify: "between", width: "100%", children: [
324
- dropdownItemRender ? dropdownItemRender(item) : item.name,
325
- isSelected ? /* @__PURE__ */ jsx(CheckIcon, {}) : null
326
- ] })
327
- },
328
- item.id
329
- );
330
- }) })
331
- }
332
- )
333
- }
334
- )
335
- }
336
- )
337
- ] });
338
- }
339
- var stopPropagationTouch = (e) => {
340
- e.stopPropagation();
341
- };
342
- var stopPropagationWheel = (e) => {
343
- e.stopPropagation();
344
- };
345
- var preventDefault = (e) => {
346
- e.preventDefault();
347
- };
348
-
349
- export {
350
- TagSelector
351
- };
352
- //# sourceMappingURL=chunk-FV26PAOO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/molecules/tag-selector.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ChevronRightIcon,\n Cross1Icon,\n MagnifyingGlassIcon,\n} from '@radix-ui/react-icons';\nimport { Popover } from '../atoms/popover';\nimport { Flex } from '../atoms/flex';\nimport { Button } from '../atoms/button';\nimport type { BadgeProps } from '../atoms/badge';\nimport { Badge } from '../atoms/badge';\nimport { CheckIcon } from '../icon';\nimport { ScrollArea } from '../atoms/scroll-area';\nimport { Grid } from '../atoms/grid';\nimport type { TypoProps } from '../atoms';\nimport { AutoSizingInput, Typo } from '../atoms';\n\ntype ID = string;\ninterface Item {\n name: string;\n id: ID;\n}\n\nconst OPTION_HEIGHT = 32;\n\nexport interface TagSelectorProps<T extends Item> {\n options?: T[];\n selected?: ID[];\n placeholder?: string;\n disabled?: boolean;\n maxCount?: number;\n style?: React.CSSProperties;\n size?: 'large' | 'medium' | 'small';\n readOnly?: boolean;\n error?: boolean;\n\n onChange?: (selected: ID[]) => void;\n tagRender?: (item: T, onClickDelete?: () => void) => React.ReactNode;\n DropdownContainer?: DropdownContainer<T>;\n open?: boolean;\n dropdownItemRender?: (item: T) => React.ReactNode;\n}\ntype DropdownContainer<T> = (props: {\n items: T[];\n children: React.ReactNode;\n currentItem?: T;\n}) => React.ReactNode;\n\nconst DefaultDropdownContainer = (props: {\n children: React.ReactNode;\n}): React.ReactNode => {\n return props.children;\n};\n\nexport function TagSelector<T extends Item>(\n props: TagSelectorProps<T>\n): React.ReactNode {\n const {\n options = [],\n tagRender,\n placeholder,\n maxCount = 0,\n DropdownContainer = DefaultDropdownContainer,\n size = 'medium',\n readOnly,\n error,\n open: propsOpen,\n dropdownItemRender,\n } = props;\n // eslint-disable-next-line react/hook-use-state -- props에 따라 미사용 상태가 될 수 있음\n const [_selected, _setSelected] = useState<string[]>(props.selected || []);\n const selected = props.selected || _selected;\n const setSelected: (v: ID[]) => void = props.onChange || _setSelected;\n const [value, setValue] = useState<string>('');\n const [focusIndex, setFocusIndex] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const [focus, setFocus] = useState(false);\n const fieldRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const closeRef = useRef<ReturnType<typeof setTimeout>>();\n\n const onFocus = useCallback(() => {\n clearTimeout(closeRef.current);\n setFocus(true);\n setOpen(true);\n }, []);\n\n const onBlur = useCallback(() => {\n closeRef.current = setTimeout(() => {\n setFocus(false);\n setOpen(false);\n setTimeout(() => {\n setValue('');\n }, 100);\n }, 300);\n }, []);\n\n const onChangeValue = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setValue(e.target.value);\n },\n []\n );\n\n const filteredOptions = useMemo<T[]>(() => {\n return options.filter((option) => {\n return option.name.includes(value);\n });\n }, [options, value]);\n\n const selectedItem = useMemo<T[]>(() => {\n const result = [] as T[];\n selected.forEach((id) => {\n const maybeItem = options.find((option) => option.id === id);\n if (maybeItem) result.push(maybeItem);\n });\n return result;\n }, [options, selected]);\n\n const onDelete = useCallback(\n (id: string) => {\n setSelected(selected.filter((el) => el !== id));\n },\n [selected, setSelected]\n );\n\n const onSelect = useCallback(\n (id: string) => {\n if (maxCount && selected.length + 1 > maxCount) return;\n setSelected([...selected, id]);\n },\n [maxCount, selected, setSelected]\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n if (selected.includes(id)) {\n onDelete(id);\n } else {\n onSelect(id);\n }\n },\n [onDelete, onSelect, selected]\n );\n\n const setScroll = useCallback((index: number): void => {\n if (scrollRef.current) {\n const scrollTop = scrollRef.current.scrollTop;\n const clientHeight = scrollRef.current.clientHeight;\n const focusTop = index * OPTION_HEIGHT;\n if (focusTop < scrollTop) {\n scrollRef.current.scrollTop = focusTop;\n } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {\n scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;\n }\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const key = e.key;\n\n switch (key) {\n case 'ArrowDown': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'ArrowUp': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'Enter':\n setValue('');\n if (focusIndex !== null) {\n toggleItem(filteredOptions[focusIndex]?.id);\n }\n break;\n\n case 'Backspace':\n if (value.length === 0) {\n setSelected(selected.slice(0, -1));\n }\n break;\n\n case 'Escape':\n setOpen(false);\n break;\n }\n },\n [\n focusIndex,\n value.length,\n setScroll,\n options.length,\n toggleItem,\n filteredOptions,\n setSelected,\n selected,\n ]\n );\n\n const placeholderVisible = useMemo(() => {\n if (selectedItem.length) return false;\n if (value) return false;\n if (focus) return false;\n return true;\n }, [focus, selectedItem.length, value]);\n\n useEffect(() => {\n setFocusIndex(null);\n }, [open]);\n\n useEffect(() => {\n setFocusIndex(0);\n }, [filteredOptions]);\n\n const badgeSize = useMemo<BadgeProps['size']>(() => {\n switch (size) {\n case 'large':\n return 'large';\n case 'medium':\n case 'small':\n default:\n return 'small';\n }\n }, [size]);\n\n const placeholderVariant = useMemo<TypoProps['variant']>(() => {\n switch (size) {\n case 'large':\n return 'subtitle';\n case 'medium':\n default:\n return 'body';\n }\n }, [size]);\n\n const focusClassName = focus ? ' focused' : '';\n const readOnlyClassName = readOnly ? ' read-only' : '';\n const errorClassName = error ? ' error' : '';\n\n const readonlyContent = (\n <Flex gap=\"1\">\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item)\n ) : (\n <Badge key={item.id} size={badgeSize}>\n {item.name}\n </Badge>\n );\n })}\n </Flex>\n );\n\n const editContent = (\n <>\n <Flex\n align=\"center\"\n gap=\"1\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n wrap=\"wrap\"\n >\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item, () => {\n onDelete(item.id);\n })\n ) : (\n <Badge key={item.id} size={badgeSize}>\n {item.name}\n <Button\n onClick={() => {\n onDelete(item.id);\n }}\n variant=\"transparent\"\n >\n <Cross1Icon />\n </Button>\n </Badge>\n );\n })}\n {placeholderVisible ? (\n <Typo color=\"gray\" variant={placeholderVariant}>\n {placeholder}\n </Typo>\n ) : null}\n <AutoSizingInput\n onBlur={onBlur}\n onChange={onChangeValue}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n ref={fieldRef}\n value={value}\n />\n </Flex>\n {focus ? <MagnifyingGlassIcon /> : <ChevronRightIcon />}\n </>\n );\n return (\n <Popover.Root open={(Boolean(filteredOptions.length) && propsOpen) || open}>\n <Popover.Trigger style={{ position: 'relative' }}>\n <Grid\n align=\"center\"\n className={`tag-selector ${size} ${focusClassName}${readOnlyClassName}${errorClassName}`}\n columns=\"1fr auto\"\n gap=\"1\"\n onClick={() => !readOnly && fieldRef.current?.focus()}\n >\n {readOnly ? readonlyContent : editContent}\n </Grid>\n </Popover.Trigger>\n\n <Popover.Content\n onOpenAutoFocus={preventDefault}\n onTouchMove={stopPropagationTouch}\n onWheel={stopPropagationWheel}\n sticky=\"always\"\n >\n <DropdownContainer\n currentItem={filteredOptions[focusIndex || 0]}\n items={filteredOptions}\n >\n <ScrollArea\n ref={scrollRef}\n scrollbars=\"vertical\"\n style={{ height: OPTION_HEIGHT * 8 }}\n type=\"auto\"\n >\n <Flex direction=\"column\">\n {filteredOptions.map((item, i) => {\n const isSelected = Boolean(\n selected.find((el) => el === item.id)\n );\n const isFocus = i === focusIndex;\n\n return (\n <Button\n className={`tag-selector-button ${isFocus ? 'focused' : ''}`}\n key={item.id}\n onClick={() => {\n toggleItem(item.id);\n fieldRef.current?.focus();\n }}\n onMouseEnter={() => {\n setFocusIndex(i);\n }}\n variant={isSelected ? 'soft' : 'outline'}\n >\n <Flex justify=\"between\" width=\"100%\">\n {dropdownItemRender\n ? dropdownItemRender(item)\n : item.name}\n {isSelected ? <CheckIcon /> : null}\n </Flex>\n </Button>\n );\n })}\n </Flex>\n </ScrollArea>\n </DropdownContainer>\n </Popover.Content>\n </Popover.Root>\n );\n}\n\nconst stopPropagationTouch: React.TouchEventHandler<HTMLDivElement> = (\n e\n): void => {\n e.stopPropagation();\n};\n\nconst stopPropagationWheel: React.WheelEventHandler<HTMLDivElement> = (\n e\n): void => {\n e.stopPropagation();\n};\n\nconst preventDefault = (e: Event): void => {\n e.preventDefault();\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/molecules/date-picker/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- ReactPicker의 렌더러가 object를 return함 버그를 해결하기 위해 강제 assertion 사용 */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access -- ReactPicker의 렌더러가 object를 return함 버그를 해결하기 위해 강제 assertion 사용 */\nimport type { ElementRef } from 'react';\nimport React, { forwardRef } from 'react';\nimport type { DatePickerProps as ReactDatePickerProps } from 'react-datepicker';\nimport * as RDP from 'react-datepicker';\nimport { registerLocale, setDefaultLocale } from 'react-datepicker';\nimport { ko as fnKo } from 'date-fns/locale';\nimport { IconButton } from '../../atoms/icon-button';\nimport { Flex } from '../../atoms/flex';\nimport { ChevronLeftIcon, ChevronRightIcon } from '../../icon';\nimport { Heading } from '../../atoms/heading';\n\nregisterLocale('ko', fnKo);\nsetDefaultLocale('ko');\n\nexport type DatePickerProps = ReactDatePickerProps & {\n fullWidth?: boolean;\n};\ntype DatePickerRef = ElementRef<typeof ReactDatePicker>;\n\nconst ReactDatePicker = ((RDP.default as any).default ||\n (RDP.default as any) ||\n (RDP as any)) as typeof RDP.default;\n\nexport const DatePicker = forwardRef<DatePickerRef, DatePickerProps>(\n (props, ref): React.ReactNode => {\n const { fullWidth, ...rest } = props;\n const fullWidthClassName = fullWidth ? 'full-width' : '';\n return (\n <Flex p=\"0\" width=\"100%\">\n <ReactDatePicker\n dateFormat=\"YYYY/MM/dd\"\n nextMonthButtonLabel=\"다음 달\"\n placeholderText=\"YYYY/mm/dd\"\n popperProps={{ strategy: 'fixed' }}\n previousMonthButtonLabel=\"이전 달\"\n ref={ref}\n renderCustomHeader={renderCustomHeader}\n showPopperArrow={false}\n timeIntervals={10}\n {...rest}\n calendarClassName={`tipp_datePicker_calendar ${rest.calendarClassName || ''}`}\n timeCaption=\"시간\"\n wrapperClassName={`tipp_datePicker ${fullWidthClassName} ${rest.wrapperClassName || ''}`}\n />\n </Flex>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\nconst renderCustomHeader: ReactDatePickerProps['renderCustomHeader'] = (\n props\n) => {\n const {\n date,\n decreaseMonth,\n increaseMonth,\n prevMonthButtonDisabled,\n nextMonthButtonDisabled,\n } = props;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- date가 undefined일 수 있음\n const year = date ? new Date(date).getFullYear() : '-';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- date가 undefined일 수 있음\n const month = date ? new Date(date).getMonth() + 1 : '-';\n\n return (\n <Flex align=\"center\" justify=\"between\" pb=\"2\" pl=\"2\" pr=\"2\">\n <IconButton\n disabled={prevMonthButtonDisabled}\n onClick={decreaseMonth}\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronLeftIcon />\n </IconButton>\n <Flex gap=\"3\">\n <Heading variant=\"heading4\" weight=\"regular\">\n {year}년\n </Heading>\n <Heading variant=\"heading4\" weight=\"regular\">\n {month}월\n </Heading>\n </Flex>\n\n <IconButton\n disabled={nextMonthButtonDisabled}\n onClick={increaseMonth}\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronRightIcon />\n </IconButton>\n </Flex>\n );\n};\n\n// DatePicker.displayName = 'DatePicker';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGA,SAAgB,kBAAkB;AAElC,YAAY,SAAS;AACrB,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,MAAM,YAAY;AAwBnB,cAiDA,YAjDA;AAlBR,eAAe,MAAM,IAAI;AACzB,iBAAiB,IAAI;AAOrB,IAAM,kBAAwB,YAAgB,WACvC,eACJ;AAEI,IAAM,aAAa;AAAA,EACxB,CAAC,OAAO,QAAyB;AAC/B,UAA+B,YAAvB,YA3BZ,IA2BmC,IAAT,iBAAS,IAAT,CAAd;AACR,UAAM,qBAAqB,YAAY,eAAe;AACtD,WACE,oBAAC,QAAK,GAAE,KAAI,OAAM,QAChB;AAAA,MAAC;AAAA;AAAA,QACC,YAAW;AAAA,QACX,sBAAqB;AAAA,QACrB,iBAAgB;AAAA,QAChB,aAAa,EAAE,UAAU,QAAQ;AAAA,QACjC,0BAAyB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,eAAe;AAAA,SACX,OAVL;AAAA,QAWC,mBAAmB,4BAA4B,KAAK,qBAAqB,EAAE;AAAA,QAC3E,aAAY;AAAA,QACZ,kBAAkB,mBAAmB,kBAAkB,IAAI,KAAK,oBAAoB,EAAE;AAAA;AAAA,IACxF,GACF;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAEzB,IAAM,qBAAiE,CACrE,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,OAAO,OAAO,IAAI,KAAK,IAAI,EAAE,YAAY,IAAI;AAEnD,QAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,EAAE,SAAS,IAAI,IAAI;AAErD,SACE,qBAAC,QAAK,OAAM,UAAS,SAAQ,WAAU,IAAG,KAAI,IAAG,KAAI,IAAG,KACtD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,8BAAC,mBAAgB;AAAA;AAAA,IACnB;AAAA,IACA,qBAAC,QAAK,KAAI,KACR;AAAA,2BAAC,WAAQ,SAAQ,YAAW,QAAO,WAChC;AAAA;AAAA,QAAK;AAAA,SACR;AAAA,MACA,qBAAC,WAAQ,SAAQ,YAAW,QAAO,WAChC;AAAA;AAAA,QAAM;AAAA,SACT;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAK;AAAA,QACL,SAAQ;AAAA,QAER,8BAAC,oBAAiB;AAAA;AAAA,IACpB;AAAA,KACF;AAEJ;","names":[]}
@@ -1,281 +0,0 @@
1
- import {
2
- OnOfflineRadioCard
3
- } from "./chunk-4QWYV2QX.js";
4
- import {
5
- DatePickerButton
6
- } from "./chunk-ESHEHOVH.js";
7
- import {
8
- TimeSelect
9
- } from "./chunk-5VWEW4M2.js";
10
- import {
11
- getTimeOption,
12
- parseTimeOption
13
- } from "./chunk-NWJSLIQ3.js";
14
- import {
15
- Form
16
- } from "./chunk-PWXFETED.js";
17
- import {
18
- toast
19
- } from "./chunk-IFRA465K.js";
20
- import {
21
- Inset
22
- } from "./chunk-XQOL7UBI.js";
23
- import {
24
- Grid
25
- } from "./chunk-EGEQY3KT.js";
26
- import {
27
- Heading
28
- } from "./chunk-3IT3NVK6.js";
29
- import {
30
- Box
31
- } from "./chunk-4Y5BEXVN.js";
32
- import {
33
- BulletText
34
- } from "./chunk-LMWTEDYS.js";
35
- import {
36
- Typo
37
- } from "./chunk-LH57PIY2.js";
38
- import {
39
- Flex
40
- } from "./chunk-25HMMI7R.js";
41
- import {
42
- Button
43
- } from "./chunk-AFPH32MF.js";
44
- import {
45
- Card
46
- } from "./chunk-HEDMSFPW.js";
47
- import {
48
- ArrowRightIcon,
49
- Cross1Icon
50
- } from "./chunk-HLFG5ZTU.js";
51
- import {
52
- Badge
53
- } from "./chunk-FCIHNIOH.js";
54
- import {
55
- __spreadProps,
56
- __spreadValues
57
- } from "./chunk-2NMEKWO5.js";
58
-
59
- // src/app/platform/reservation-card.tsx
60
- import { useCallback, useEffect, useMemo, useState } from "react";
61
- import { setHours, setMinutes } from "date-fns";
62
- import { jsx, jsxs } from "react/jsx-runtime";
63
- function ReservationCard(props) {
64
- const {
65
- sessionNumber,
66
- customerName,
67
- readonly,
68
- defaultTime,
69
- defaultType,
70
- error,
71
- minTime,
72
- maxTime,
73
- onClickReserve,
74
- onClickCancel,
75
- onClickCompleteSession
76
- } = props;
77
- const [editValues, setEditValues] = useState({
78
- date: props.defaultTime,
79
- type: props.defaultType
80
- });
81
- const date = readonly ? defaultTime : editValues.date;
82
- const type = readonly ? defaultType : editValues.type;
83
- const time = date && getTimeOption(date);
84
- const onClickSave = useCallback(() => {
85
- var _a;
86
- (_a = props.onClickSave) == null ? void 0 : _a.call(props, editValues);
87
- }, [editValues, props]);
88
- const onClickReset = useCallback(() => {
89
- setEditValues({
90
- date: defaultTime,
91
- type: defaultType
92
- });
93
- }, [defaultTime, defaultType]);
94
- const ActionButtons = useMemo(() => {
95
- if (readonly) {
96
- return /* @__PURE__ */ jsx(Button, { onClick: onClickReserve, size: "small", variant: "surface", children: defaultTime && defaultType ? "\uC608\uC57D \uC218\uC815\uD558\uAE30" : "\uC608\uC57D\uD558\uAE30" });
97
- }
98
- return /* @__PURE__ */ jsx(Button, { color: "gray", onClick: onClickCancel, variant: "transparent", children: /* @__PURE__ */ jsx(Cross1Icon, {}) });
99
- }, [defaultTime, defaultType, onClickCancel, onClickReserve, readonly]);
100
- const onChangeDate = useCallback(
101
- (newDate) => {
102
- if (!newDate) return;
103
- const { hour = 0, minute = 0 } = time ? parseTimeOption(time) : {};
104
- setEditValues((prev) => {
105
- return __spreadProps(__spreadValues({}, prev), {
106
- date: setMinutes(setHours(newDate, hour), minute)
107
- });
108
- });
109
- },
110
- [time]
111
- );
112
- const onChangeType = useCallback((newType) => {
113
- setEditValues((prev) => {
114
- return __spreadProps(__spreadValues({}, prev), {
115
- type: newType
116
- });
117
- });
118
- }, []);
119
- const onChangeTime = useCallback(
120
- (v) => {
121
- const { hour, minute } = parseTimeOption(v);
122
- if (typeof v === "undefined") {
123
- setEditValues((prev) => {
124
- return __spreadProps(__spreadValues({}, prev), {
125
- date: v
126
- });
127
- });
128
- }
129
- setEditValues((prev) => {
130
- return __spreadProps(__spreadValues({}, prev), {
131
- date: setMinutes(setHours(date || /* @__PURE__ */ new Date(), hour), minute)
132
- });
133
- });
134
- },
135
- [date]
136
- );
137
- useEffect(() => {
138
- if (!minTime || !editValues.date || readonly) return;
139
- if (editValues.date < minTime) {
140
- toast.warn("\uC120\uD0DD \uAC00\uB2A5\uD55C \uC2DC\uAC04\uB300\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
141
- setEditValues((prev) => {
142
- return __spreadProps(__spreadValues({}, prev), {
143
- date: minTime
144
- });
145
- });
146
- }
147
- }, [editValues, minTime, readonly]);
148
- useEffect(() => {
149
- if (!maxTime || !editValues.date || readonly) return;
150
- if (editValues.date > maxTime) {
151
- toast.warn("\uC120\uD0DD \uAC00\uB2A5\uD55C \uC2DC\uAC04\uB300\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
152
- setEditValues((prev) => {
153
- return __spreadProps(__spreadValues({}, prev), {
154
- date: maxTime
155
- });
156
- });
157
- }
158
- }, [editValues, maxTime, readonly]);
159
- return /* @__PURE__ */ jsxs(
160
- Card,
161
- {
162
- error: Boolean(error),
163
- size: "3",
164
- style: { overflow: "visible", contain: "initial" },
165
- children: [
166
- /* @__PURE__ */ jsxs(Flex, { gap: "3", justify: "between", mb: "5", children: [
167
- /* @__PURE__ */ jsxs(
168
- Grid,
169
- {
170
- align: "center",
171
- columns: { initial: "1", xs: "auto 1fr" },
172
- gapY: "2",
173
- children: [
174
- /* @__PURE__ */ jsxs(Flex, { align: "center", children: [
175
- /* @__PURE__ */ jsxs(Heading, { variant: "heading4", children: [
176
- customerName || "-",
177
- "\uB2D8 ",
178
- sessionNumber || "-",
179
- "\uD68C\uCC28 \uC138\uC158"
180
- ] }),
181
- /* @__PURE__ */ jsx(Badge, { ml: "2", children: "\uB2E4\uC74C \uC138\uC158" })
182
- ] }),
183
- error ? /* @__PURE__ */ jsx(BulletText, { color: "red", variant: "caption", children: error }) : null
184
- ]
185
- }
186
- ),
187
- /* @__PURE__ */ jsx(Flex, { children: ActionButtons })
188
- ] }),
189
- /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
190
- Form.Root,
191
- {
192
- onSubmit: (e) => {
193
- e.preventDefault();
194
- },
195
- children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "5", children: [
196
- /* @__PURE__ */ jsx(Form.Field, { name: "date", children: /* @__PURE__ */ jsxs(Form.Label, { asChild: true, children: [
197
- /* @__PURE__ */ jsx(Heading, { mb: "2", variant: "heading5", weight: "regular", children: "\uC138\uC158 \uC77C\uC790\uC640 \uC2DC\uAC01" }),
198
- /* @__PURE__ */ jsxs(Grid, { columns: "1fr auto", gap: "4", children: [
199
- /* @__PURE__ */ jsx(
200
- DatePickerButton,
201
- {
202
- disabled: readonly,
203
- maxDate: maxTime,
204
- minDate: minTime,
205
- onChange: onChangeDate,
206
- placeholder: "\uC77C\uC790\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",
207
- selected: date,
208
- size: "large"
209
- }
210
- ),
211
- /* @__PURE__ */ jsx(
212
- TimeSelect,
213
- {
214
- disabled: readonly,
215
- maxTime,
216
- minTime,
217
- onValueChange: onChangeTime,
218
- size: "3",
219
- time: date,
220
- value: time
221
- }
222
- )
223
- ] })
224
- ] }) }),
225
- /* @__PURE__ */ jsxs(Form.Field, { name: "type", children: [
226
- /* @__PURE__ */ jsx(Form.Label, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { mb: "2", variant: "heading5", weight: "regular", children: "\uC628/\uC624\uD504\uB77C\uC778 \uC9C4\uD589 \uC5EC\uBD80" }) }),
227
- /* @__PURE__ */ jsx(Form.Control, { asChild: true, children: /* @__PURE__ */ jsx(
228
- OnOfflineRadioCard,
229
- {
230
- disabled: readonly,
231
- onValueChange: onChangeType,
232
- size: "1",
233
- value: type
234
- }
235
- ) })
236
- ] }),
237
- readonly ? null : /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "3", justify: "end", children: [
238
- /* @__PURE__ */ jsx(
239
- Button,
240
- {
241
- color: "gray",
242
- onClick: onClickReset,
243
- size: "small",
244
- variant: "transparent",
245
- children: "\uCD08\uAE30\uD654\uD558\uAE30"
246
- }
247
- ),
248
- /* @__PURE__ */ jsx(Button, { onClick: onClickSave, size: "small", children: "\uC800\uC7A5\uD558\uAE30" })
249
- ] })
250
- ] })
251
- }
252
- ) }),
253
- readonly ? /* @__PURE__ */ jsx(Inset, { clip: "border-box", side: "bottom", children: /* @__PURE__ */ jsx(
254
- Box,
255
- {
256
- mt: "5",
257
- px: "5",
258
- py: "4",
259
- style: { backgroundColor: "var(--accent-a3)" },
260
- width: "100%",
261
- children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "4", justify: "center", children: [
262
- /* @__PURE__ */ jsxs(Typo, { children: [
263
- sessionNumber || "-",
264
- "\uD68C\uCC28 \uC138\uC158\uC744 \uC644\uB8CC\uD558\uC168\uB098\uC694?"
265
- ] }),
266
- /* @__PURE__ */ jsxs(Button, { onClick: onClickCompleteSession, size: "small", children: [
267
- "\uC138\uC158 \uC885\uB8CC\uD558\uAE30",
268
- /* @__PURE__ */ jsx(ArrowRightIcon, {})
269
- ] })
270
- ] })
271
- }
272
- ) }) : null
273
- ]
274
- }
275
- );
276
- }
277
-
278
- export {
279
- ReservationCard
280
- };
281
- //# sourceMappingURL=chunk-HOKENHFD.js.map