maru_design2 3.3.0 → 3.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.3.1](https://github.com/42maru-ai/maru-design2/compare/v3.3.0...v3.3.1) (2026-09-21)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * add date range picker for independent endpoint editing ([7a66969](https://github.com/42maru-ai/maru-design2/commit/7a66969235f2df328e71a93a8dda8232d51eabc7))
9
+ * align calendar design and time selection ([f218135](https://github.com/42maru-ai/maru-design2/commit/f2181352aeb68c9fa85eeaff662e03584dab9c58))
10
+ * correct calendar header class names ([46f6b4f](https://github.com/42maru-ai/maru-design2/commit/46f6b4ff9cf09f9a40944c036c2719da67295bf0))
11
+ * preserve calendar compatibility defaults ([d42e9ee](https://github.com/42maru-ai/maru-design2/commit/d42e9ee5ec0b9687db24a134efd8cbf8ae6c7577))
12
+ * refine textarea styles and copy feedback ([f6b7092](https://github.com/42maru-ai/maru-design2/commit/f6b7092484753ae8383a6c6a4ef792b6122457d4))
13
+ * show cancel button in calendar date bounds story ([cb049b9](https://github.com/42maru-ai/maru-design2/commit/cb049b9f8dc43ea4bc0940949d4570e8d98d2a13))
14
+
3
15
  ## [3.3.0](https://github.com/42maru-ai/maru-design2/compare/v3.2.1...v3.3.0) (2026-09-16)
4
16
 
5
17
 
@@ -3,6 +3,7 @@ import 'highlight.js/styles/a11y-light.css';
3
3
  import './code.scss';
4
4
  export interface CodeProps {
5
5
  value: string;
6
+ /** 현재 코드 복사 버튼 표시. 복사 성공 시 1.5초 동안 체크 아이콘 표시 */
6
7
  copyable?: boolean;
7
8
  }
8
9
  export declare function Code({ value, copyable }: CodeProps): React.JSX.Element;
@@ -21,11 +21,11 @@ export interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTex
21
21
  */
22
22
  wrapperRef?: React.RefObject<HTMLDivElement>;
23
23
  /**
24
- * 현재 입력값 복사 버튼 표시
24
+ * 현재 입력값 복사 버튼 표시. 복사 성공 시 1.5초 동안 체크 아이콘 표시
25
25
  */
26
26
  copyable?: boolean;
27
27
  /**
28
- * 컴포넌트 끝점에 위치시킬 추가 노드
28
+ * 우측 상단에 표시할 추가 버튼 등의 요소
29
29
  */
30
30
  endNode?: React.ReactNode;
31
31
  className?: string;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { CalendarHeaderProps } from './types';
3
+ interface Props extends CalendarHeaderProps {
4
+ showMonthYearDropdown?: boolean;
5
+ }
6
+ export default function CalendarHeader({ month: monthDate, monthIndex, monthsToShow, previousDisabled, nextDisabled, onPrevious, onNext, onMonthChange, disabled, showMonthYearDropdown, minDate, maxDate, }: Props): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { CalendarPanelProps } from './types';
3
+ import 'react-datepicker/dist/react-datepicker.css';
4
+ import './date-picker.scss';
5
+ export declare function CalendarPanel({ selected, startDate, endDate, onSelect, minDate, maxDate, monthsToShow, viewDate, onViewDateChange, selectionTarget, fixedHeight, appearance, showMonthYearDropdown, className, }: CalendarPanelProps): React.JSX.Element;
6
+ export type { CalendarHeaderProps, CalendarPanelProps } from './types';
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export default function TimeColumn({ label, values, value, onSelect, }: {
3
+ label: string;
4
+ values: number[];
5
+ value: number | null;
6
+ onSelect: (nextValue: number) => void;
7
+ }): React.JSX.Element;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { TimeParts } from './date-picker-utils';
3
+ interface Props {
4
+ label: string;
5
+ value: TimeParts;
6
+ onChange: (value: TimeParts) => void;
7
+ minuteStep: number;
8
+ amLabel: string;
9
+ pmLabel: string;
10
+ disabled?: boolean;
11
+ }
12
+ export default function TimeDropdown({ label, value, onChange, minuteStep, amLabel, pmLabel, disabled, }: Props): React.JSX.Element;
13
+ export {};
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { TimeParts } from './date-picker-utils';
3
+ import './date-picker.scss';
4
+ interface Props {
5
+ value: TimeParts;
6
+ minuteStep: number;
7
+ amLabel: string;
8
+ pmLabel: string;
9
+ onChange: (value: TimeParts) => void;
10
+ }
11
+ export default function TimePanel({ value, minuteStep, amLabel, pmLabel, onChange, }: Props): React.JSX.Element;
12
+ export {};
@@ -0,0 +1,11 @@
1
+ export declare const validDay: (date?: Date | null) => Date | null;
2
+ export declare const clampMonth: (date: Date, min: Date | null, max: Date | null) => Date;
3
+ export interface TimeParts {
4
+ period: 'am' | 'pm' | null;
5
+ hour: number | null;
6
+ minute: number | null;
7
+ }
8
+ export declare const parseTime: (time?: string) => TimeParts;
9
+ export declare const formatTime: ({ period, hour, minute }: TimeParts) => string | undefined;
10
+ export declare const minuteOptions: (step: number, current: number | null) => number[];
11
+ export declare const timeText: (time: TimeParts, amLabel?: string, pmLabel?: string) => string;
@@ -0,0 +1,54 @@
1
+ export interface CalendarHeaderProps {
2
+ /** 이 헤더가 표시하는 월 */
3
+ month: Date;
4
+ /** 첫 달은 0, 두 번째 달은 1 */
5
+ monthIndex: number;
6
+ /** 동시에 표시하는 월 수 */
7
+ monthsToShow: 1 | 2;
8
+ /** 선택 가능한 첫 날짜 */
9
+ minDate: Date | null;
10
+ /** 선택 가능한 마지막 날짜 */
11
+ maxDate: Date | null;
12
+ /** 날짜 제한이 유효하지 않아 이동과 선택을 할 수 없는 상태 */
13
+ disabled: boolean;
14
+ /** 이전 달 이동 불가 여부 */
15
+ previousDisabled: boolean;
16
+ /** 다음 달 이동 불가 여부 */
17
+ nextDisabled: boolean;
18
+ /** 이전 달로 이동 */
19
+ onPrevious: () => void;
20
+ /** 다음 달로 이동 */
21
+ onNext: () => void;
22
+ /** 이 헤더의 표시 월을 변경합니다. 두 번째 달의 offset과 날짜 제한을 반영합니다. */
23
+ onMonthChange: (month: Date) => void;
24
+ }
25
+ export interface CalendarPanelProps {
26
+ /** 선택한 날짜. 선택 상태는 호출부에서 보관합니다. */
27
+ selected?: Date | null;
28
+ /** 강조할 기간의 시작 날짜 */
29
+ startDate?: Date | null;
30
+ /** 강조할 기간의 종료 날짜 */
31
+ endDate?: Date | null;
32
+ /** 날짜를 선택할 때 호출합니다. 이미 선택한 날짜를 눌러도 호출합니다. */
33
+ onSelect: (date: Date) => void;
34
+ /** 선택 가능한 첫 날짜. 시간은 무시하고 경계를 포함합니다. */
35
+ minDate?: Date | null;
36
+ /** 선택 가능한 마지막 날짜. 시간은 무시하고 경계를 포함합니다. */
37
+ maxDate?: Date | null;
38
+ /** 동시에 표시할 월 수. 기본값 1 */
39
+ monthsToShow?: 1 | 2;
40
+ /** 표시 월을 외부에서 지정합니다. 생략하면 달력 내부에서 관리합니다. */
41
+ viewDate?: Date;
42
+ /** 표시 월 변경. viewDate를 지정하면 이 콜백에서 해당 값을 갱신합니다. */
43
+ onViewDateChange?: (date: Date) => void;
44
+ /** 기간 선택 중 hover 미리보기 대상. 생략하면 확정된 기간만 강조합니다. */
45
+ selectionTarget?: 'start' | 'end';
46
+ /** 매월 6주를 표시합니다. 기본값 false */
47
+ fixedHeight?: boolean;
48
+ /** 채운 선택 표시 또는 테두리 선택 표시. 기본값 solid */
49
+ appearance?: 'solid' | 'outline';
50
+ /** 연·월 드롭다운 표시 여부. 기본값 true */
51
+ showMonthYearDropdown?: boolean;
52
+ /** 루트에 추가할 클래스 */
53
+ className?: string;
54
+ }
@@ -1,65 +1,5 @@
1
1
  import React from 'react';
2
+ import type { CalendarProps } from './types';
2
3
  import './calendar.scss';
3
- export type CalendarMode = 'range' | 'single';
4
- export interface CalendarTimeValue {
5
- /** 시간 설정이 켜져 있으면 HH:mm, 꺼져 있으면 undefined */
6
- startTime?: string;
7
- /** 기간 선택의 종료 시간 (HH:mm) */
8
- endTime?: string;
9
- }
10
- export interface CalendarProps {
11
- /**
12
- * Maru Datepicker를 띄울 대상이 되는 컴포넌트. setOpen을 변수로 전달해서 외부에서 datepicker를 띄울 수 있도록 설정
13
- * @param setOpen 토글형태로 동작. children의 onClick 메서드에서 실행 필요
14
- * @param open 캘린더 오픈 여부 리턴
15
- */
16
- children: ({ setOpen, open, }: {
17
- setOpen: () => void;
18
- open: boolean;
19
- }) => React.ReactNode;
20
- /**
21
- * 최소 시작일
22
- * @example minStartDate를 오늘 날짜로 지정하면 시작일 지정은 오늘 날짜부터 가능
23
- */
24
- minStartDate?: Date | null;
25
- /**
26
- * 날짜 선택 방식
27
- * @default 'range'
28
- */
29
- mode?: CalendarMode;
30
- /** 선택 가능한 마지막 날짜. 날짜 단위로 제한합니다. */
31
- maxDate?: Date | null;
32
- /** 동시에 표시할 월 수. 기본값 1 */
33
- monthsToShow?: 1 | 2;
34
- /** 연·월 선택 드롭다운 표시. 기본값 false */
35
- showMonthYearDropdown?: boolean;
36
- /** 시간 설정 토글과 시간 선택 표시. 기본값 false */
37
- showTime?: boolean;
38
- /** 시간 선택을 필수로 설정합니다. true이면 showTime과 무관하게 시간 UI를 표시하고 끌 수 없게 합니다. 기본값 false */
39
- timeRequired?: boolean;
40
- /** 확인 시 실행하는 동기 검증. 오류 문구를 반환하면 표시하고 저장을 막으며, undefined 또는 빈 문자열이면 허용합니다. */
41
- validate?: (startDate?: string, endDate?: string, time?: CalendarTimeValue) => string | undefined;
42
- /** 오늘·최근 7/30/90일·이전 3개 연도 프리셋 표시. range에서만 적용됩니다. */
43
- showPresets?: boolean;
44
- /** 하단 날짜 직접 입력 표시. 기본값 true */
45
- showDateInputs?: boolean;
46
- /** 취소 버튼 표시. 기본값 false */
47
- showCancelButton?: boolean;
48
- /** 취소 버튼 문구. 기본값 취소 */
49
- cancelButtonContent?: string;
50
- /** 열 때 선택할 시작 날짜. 저장한 값을 넘기면 다시 열 때 복원됩니다. */
51
- startDate?: Date | null;
52
- /** 열 때 선택할 종료 날짜. single에서는 무시합니다. */
53
- endDate?: Date | null;
54
- /** 열 때 복원할 시간. showTime과 함께 사용합니다. */
55
- timeValue?: CalendarTimeValue;
56
- saveButtonContent: string;
57
- /**
58
- * 캘린더 하단 버튼을 누르면 동작할 함수, 선택한 startDate와 endDate를 전달
59
- * @param startDate 시작일
60
- * @param endDate 마지막일
61
- */
62
- onSaveClick: (startDate?: string, endDate?: string, time?: CalendarTimeValue) => void;
63
- className?: string;
64
- }
65
- export declare function Calendar({ children, minStartDate, mode, saveButtonContent, onSaveClick, className, ...options }: CalendarProps): React.JSX.Element;
4
+ export declare function Calendar(props: CalendarProps): React.JSX.Element;
5
+ export type { CalendarMode, CalendarProps, CalendarTimeValue } from './types';
@@ -1,8 +1,7 @@
1
1
  import React from 'react';
2
- import type { CalendarProps } from './Calendar';
3
- import 'react-datepicker/dist/react-datepicker.css';
2
+ import type { CalendarProps } from './types';
4
3
  type Props = Omit<CalendarProps, 'children' | 'className'> & {
5
4
  setOpen: (open: boolean) => void;
6
5
  };
7
- declare function DatePickerWrapper({ minStartDate, maxDate, mode, monthsToShow, showMonthYearDropdown, showTime, timeRequired, validate, showPresets, showDateInputs, showCancelButton, cancelButtonContent, startDate: initialStart, endDate: initialEnd, timeValue, saveButtonContent, onSaveClick, setOpen, }: Props): React.JSX.Element;
6
+ declare function DatePickerWrapper({ minStartDate, maxDate, mode, monthsToShow, showMonthYearDropdown, showTime, timeRequired, minuteStep, amLabel, pmLabel, validate, showPresets, showDateInputs, showCancelButton, cancelButtonContent, startDate: initialStart, endDate: initialEnd, timeValue, saveButtonContent, onSaveClick, setOpen, }: Props): React.JSX.Element;
8
7
  export default DatePickerWrapper;
@@ -1,6 +1,5 @@
1
1
  export declare const DATE_FORMAT = "yyyy-MM-dd";
2
2
  export declare const formatDate: (date: Date | null) => string;
3
- export declare function validDay(date?: Date | null): Date | null;
4
3
  export declare function clampDate(date: Date, min: Date | null, max: Date | null): Date;
5
4
  export declare function parseDate(text: string, min: Date | null, max: Date | null): Date | null;
6
5
  export declare const validTime: (time?: string) => boolean;
@@ -0,0 +1,69 @@
1
+ import type React from 'react';
2
+ export type CalendarMode = 'range' | 'single';
3
+ export interface CalendarTimeValue {
4
+ /** 시간 설정이 켜져 있으면 HH:mm, 꺼져 있으면 undefined */
5
+ startTime?: string;
6
+ /** 기간 선택의 종료 시간 (HH:mm) */
7
+ endTime?: string;
8
+ }
9
+ export interface CalendarProps {
10
+ /**
11
+ * Maru Datepicker를 띄울 대상이 되는 컴포넌트. setOpen을 변수로 전달해서 외부에서 datepicker를 띄울 수 있도록 설정
12
+ * @param setOpen 토글형태로 동작. children의 onClick 메서드에서 실행 필요
13
+ * @param open 캘린더 오픈 여부 리턴
14
+ */
15
+ children: ({ setOpen, open, }: {
16
+ setOpen: () => void;
17
+ open: boolean;
18
+ }) => React.ReactNode;
19
+ /**
20
+ * 최소 시작일
21
+ * @example minStartDate를 오늘 날짜로 지정하면 시작일 지정은 오늘 날짜부터 가능
22
+ */
23
+ minStartDate?: Date | null;
24
+ /**
25
+ * 날짜 선택 방식
26
+ * @default 'range'
27
+ */
28
+ mode?: CalendarMode;
29
+ /** 선택 가능한 마지막 날짜. 날짜 단위로 제한합니다. */
30
+ maxDate?: Date | null;
31
+ /** 동시에 표시할 월 수. 기본값 1 */
32
+ monthsToShow?: 1 | 2;
33
+ /** 연·월 선택 드롭다운 표시. 기본값 false */
34
+ showMonthYearDropdown?: boolean;
35
+ /** 시간 설정 토글과 시간 선택 표시. 기본값 false */
36
+ showTime?: boolean;
37
+ /** 시간 선택을 필수로 설정합니다. true이면 showTime과 무관하게 시간 UI를 표시하고 끌 수 없게 합니다. 기본값 false */
38
+ timeRequired?: boolean;
39
+ /** 확인 시 실행하는 동기 검증. 오류 문구를 반환하면 표시하고 저장을 막으며, undefined 또는 빈 문자열이면 허용합니다. */
40
+ validate?: (startDate?: string, endDate?: string, time?: CalendarTimeValue) => string | undefined;
41
+ /** 오늘·최근 7/30/90일·이전 3개 연도 프리셋 표시. range에서만 적용됩니다. */
42
+ showPresets?: boolean;
43
+ /** 하단 날짜 직접 입력 표시. 기본값 true */
44
+ showDateInputs?: boolean;
45
+ /** 취소 버튼 표시. 기본값 false */
46
+ showCancelButton?: boolean;
47
+ /** 취소 버튼 문구. 기본값 취소 */
48
+ cancelButtonContent?: string;
49
+ /** 열 때 선택할 시작 날짜. 저장한 값을 넘기면 다시 열 때 복원됩니다. */
50
+ startDate?: Date | null;
51
+ /** 열 때 선택할 종료 날짜. single에서는 무시합니다. */
52
+ endDate?: Date | null;
53
+ /** 열 때 복원할 시간. showTime과 함께 사용합니다. */
54
+ timeValue?: CalendarTimeValue;
55
+ /** 시간 드롭다운의 분 간격(양의 정수). 기본값 5, 유효하지 않은 값도 5로 처리합니다. */
56
+ minuteStep?: number;
57
+ /** 시간 드롭다운의 오전 표시 문구. 기본값 오전 */
58
+ amLabel?: string;
59
+ /** 시간 드롭다운의 오후 표시 문구. 기본값 오후 */
60
+ pmLabel?: string;
61
+ saveButtonContent: string;
62
+ /**
63
+ * 캘린더 하단 버튼을 누르면 동작할 함수, 선택한 startDate와 endDate를 전달
64
+ * @param startDate 시작일
65
+ * @param endDate 마지막일
66
+ */
67
+ onSaveClick: (startDate?: string, endDate?: string, time?: CalendarTimeValue) => void;
68
+ className?: string;
69
+ }
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { DateRangePickerProps } from './types';
3
+ export default function DateRangeContent({ startDate, endDate, timeValue, minStartDate, maxDate, showTime, minuteStep, startLabel, endLabel, amLabel, pmLabel, cancelButtonContent, saveButtonContent, validate, onSaveClick, onClose, }: Omit<DateRangePickerProps, 'children' | 'className'> & {
4
+ onClose: () => void;
5
+ }): React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { DateRangePickerProps } from './types';
3
+ import './date-range-picker.scss';
4
+ export declare function DateRangePicker(props: DateRangePickerProps): React.JSX.Element;
5
+ export type { DateRangePickerProps, DateRangeTimeValue } from './types';
@@ -0,0 +1 @@
1
+ export * from './DateRangePicker';
@@ -0,0 +1,46 @@
1
+ import type React from 'react';
2
+ export interface DateRangeTimeValue {
3
+ /** 시작 시간 (HH:mm) */
4
+ startTime?: string;
5
+ /** 종료 시간 (HH:mm) */
6
+ endTime?: string;
7
+ }
8
+ export interface DateRangePickerProps {
9
+ /** 팝업 트리거. setOpen은 열림 상태를 토글합니다. */
10
+ children: ({ setOpen, open, }: {
11
+ setOpen: () => void;
12
+ open: boolean;
13
+ }) => React.ReactNode;
14
+ /** 선택 가능한 첫 날짜. 날짜 단위로 제한합니다. */
15
+ minStartDate?: Date | null;
16
+ /** 선택 가능한 마지막 날짜. 날짜 단위로 제한합니다. */
17
+ maxDate?: Date | null;
18
+ /** 시간 선택 표시. 기본값 true. 표시하면 시작·종료 시간이 모두 있어야 저장합니다. */
19
+ showTime?: boolean;
20
+ /** 확인 시 동기 검증. 오류 문자열이면 저장을 막습니다. 오류 문구는 자동으로 표시하지 않습니다. */
21
+ validate?: (startDate: string, endDate: string, time?: DateRangeTimeValue) => string | undefined;
22
+ /** 취소 버튼 문구. 기본값 취소 */
23
+ cancelButtonContent?: string;
24
+ /** 열 때 복원할 시작 날짜. 열린 중 변경은 다음 열기에 반영합니다. */
25
+ startDate?: Date | null;
26
+ /** 열 때 복원할 종료 날짜. 열린 중 변경은 다음 열기에 반영합니다. */
27
+ endDate?: Date | null;
28
+ /** 열 때 복원할 시작·종료 시간. 열린 중 변경은 다음 열기에 반영합니다. */
29
+ timeValue?: DateRangeTimeValue;
30
+ /** 분 간격(양의 정수). 기본값 5, 유효하지 않은 값도 5로 처리합니다. */
31
+ minuteStep?: number;
32
+ /** 시작 행 문구. 기본값 시작일 */
33
+ startLabel?: string;
34
+ /** 종료 행 문구. 기본값 종료일 */
35
+ endLabel?: string;
36
+ /** 오전 표시 문구. 기본값 오전 */
37
+ amLabel?: string;
38
+ /** 오후 표시 문구. 기본값 오후 */
39
+ pmLabel?: string;
40
+ /** 확인 버튼 문구 */
41
+ saveButtonContent: string;
42
+ /** 완성된 범위를 확인할 때 호출합니다. 날짜는 yyyy-MM-dd, 시간은 HH:mm이며 날짜 전용이면 시간 인자를 생략합니다. */
43
+ onSaveClick: (startDate: string, endDate: string, time?: DateRangeTimeValue) => void;
44
+ /** 루트에 추가할 클래스 */
45
+ className?: string;
46
+ }
package/dist/index.d.ts CHANGED
@@ -20,6 +20,7 @@ export * from './components/atoms/toggle';
20
20
  export * from './components/atoms/tooltip';
21
21
  export * from './components/molecules/buttonGroup';
22
22
  export * from './components/molecules/calendar';
23
+ export * from './components/molecules/dateRangePicker';
23
24
  export * from './components/molecules/dropdown';
24
25
  export * from './components/molecules/inputWithAction';
25
26
  export * from './components/molecules/modal';