DayFlowCalendar ์ปดํฌ๋„ŒํŠธ

DayFlowCalendar๋Š” ํ˜„์žฌ ์„ ํƒ๋œ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์‚ฌ์ด๋“œ๋ฐ”๋‚˜ ์ด๋ฒคํŠธ ์ƒ์„ธ ๋Œ€ํ™”์ƒ์ž ๊ฐ™์€ ์„ ํƒ์  UI๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. useCalendarApp ๋ฐ ๋ทฐ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ์ ์€ ์ฝ”๋“œ๋กœ ์™„์ „ํžˆ ๋™์ž‘ํ•˜๋Š” ์บ˜๋ฆฐ๋”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

import {
  DayFlowCalendar,
  useCalendarApp,
  createWeekView,
  ViewType,
} from '@dayflow/react';
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
import '@dayflow/core/dist/styles.css';

export function CalendarDemo() {
  const calendar = useCalendarApp({
    views: [createWeekView()],
    defaultView: ViewType.WEEK,
    initialDate: new Date(),
    events: [],
    plugins: [createSidebarPlugin()],
  });

  return <DayFlowCalendar calendar={calendar} />;
}
<template>
  <DayFlowCalendar :calendar="calendar" />
</template>

<script setup>
import { DayFlowCalendar, useCalendarApp } from '@dayflow/vue';
import { createWeekView, ViewType } from '@dayflow/core';
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
import '@dayflow/core/dist/styles.css';

const calendar = useCalendarApp({
  views: [createWeekView()],
  defaultView: ViewType.WEEK,
  initialDate: new Date(),
  events: [],
  plugins: [createSidebarPlugin()],
});
</script>
import { Component } from '@angular/core';
import { createWeekView, ViewType } from '@dayflow/core';
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
import { DayFlowCalendarModule } from '@dayflow/angular';
import '@dayflow/core/dist/styles.css';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [DayFlowCalendarModule],
  template: `
    <dayflow-calendar [calendar]="calendar"></dayflow-calendar>
  `
})
export class AppComponent {
  calendar = {
    views: [createWeekView()],
    defaultView: ViewType.WEEK,
    initialDate: new Date(),
    events: [],
    plugins: [createSidebarPlugin()],
  };
}
<script>
  import { DayFlowCalendar, useCalendarApp } from '@dayflow/svelte';
  import { createWeekView, ViewType } from '@dayflow/core';
  import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
  import '@dayflow/core/dist/styles.css';

  const calendar = useCalendarApp({
    views: [createWeekView()],
    defaultView: ViewType.WEEK,
    initialDate: new Date(),
    events: [],
    plugins: [createSidebarPlugin()],
  });
</script>

<DayFlowCalendar {calendar} />

์ด ์ปดํฌ๋„ŒํŠธ๋Š” useCalendarApp์ด ๋ฐ˜ํ™˜ํ•œ calendar ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ํ™œ์„ฑ ๋ทฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ๋ทฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ํˆด๋ฐ”๋‚˜ ์ง์ ‘ ๋งŒ๋“  UI๋ฅผ DayFlowCalendar ์˜†์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค์Œ ๊ธฐ๋Šฅ์€ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์„ ํƒ์  ์บ˜๋ฆฐ๋” ์‚ฌ์ด๋“œ๋ฐ”(createSidebarPlugin์œผ๋กœ ์ถ”๊ฐ€)
  • ์ด๋ฒคํŠธ ์ƒ์„ธ ๋Œ€ํ™”์ƒ์ž ์ง€์›(useEventDetailDialog ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ Œ๋”๋Ÿฌ๋กœ ์ œ์–ด)
  • ์บ˜๋ฆฐ๋”๋ฅผ ์ผœ๊ณ  ๋„๊ฑฐ๋‚˜ ๋ทฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋ ˆ์ด์•„์›ƒ ์ž๋™ ๊ฐฑ์‹ 

Props

Propํƒ€์ž…ํ•„์ˆ˜ ์—ฌ๋ถ€์„ค๋ช…
calendarUseCalendarAppReturnํ•„์ˆ˜useCalendarApp์˜ ๋ฐ˜ํ™˜๊ฐ’์ž…๋‹ˆ๋‹ค. ์ƒํƒœ, ๋“ฑ๋ก๋œ ๋ทฐ, ์‚ฌ์ด๋“œ๋ฐ” ์„ค์ •, ์บ˜๋ฆฐ๋” ๋™์ž‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
collapsedSafeAreaLeftnumber์„ ํƒ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์ ‘ํ˜”์„ ๋•Œ์˜ ์™ผ์ชฝ ์—ฌ๋ฐฑ(px)์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด macOS ์ฐฝ ๋ฒ„ํŠผ ์˜์—ญ์„ ํ”ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
searchCalendarSearchProps์„ ํƒ๋‚ด์žฅ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.

์Šฌ๋กฏ ๊ธฐ๋ฐ˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•(์ด๋ฒคํŠธ ์ฝ˜ํ…์ธ , ์ƒ์„ธ ํŒจ๋„ ์ฝ˜ํ…์ธ , ์ƒ์„ธ ๋Œ€ํ™”์ƒ์ž, ์ƒ‰์ƒ ์„ ํƒ๊ธฐ ๋“ฑ)์€ props๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์Šฌ๋กฏ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์€ Content Slots๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ฒ€์ƒ‰ ์„ค์ •

search prop์œผ๋กœ ๋‚ด์žฅ ๊ฒ€์ƒ‰์˜ ๋™์ž‘์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ด๋ฒคํŠธ์˜ ์ œ๋ชฉ๊ณผ ์„ค๋ช…์„ ๋กœ์ปฌ์—์„œ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

<DayFlowCalendar
  calendar={calendar}
  search={{
    debounceDelay: 500,
    emptyText: 'No events found',
    onSearch: async keyword => {
      // Custom async search (e.g., from an API)
      return fetch(`/api/search?q=${keyword}`).then(res => res.json());
    },
  }}
/>
<template>
  <DayFlowCalendar
    :calendar="calendar"
    :search="{
      debounceDelay: 500,
      emptyText: 'No events found',
      onSearch: handleSearch,
    }"
  />
</template>

<script setup>
import { DayFlowCalendar } from '@dayflow/vue';

const handleSearch = async (keyword) => {
  // Custom async search (e.g., from an API)
  return fetch(`/api/search?q=${keyword}`).then(res => res.json());
};
</script>
import { Component } from '@angular/core';
import { DayFlowCalendarModule } from '@dayflow/angular';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [DayFlowCalendarModule],
  template: `
    <dayflow-calendar
      [calendar]="calendar"
      [search]="searchConfig"
    >
    </dayflow-calendar>
  `
})
export class AppComponent {
  calendar = {
    // ... calendar app config
  };

  searchConfig = {
    debounceDelay: 500,
    emptyText: 'No events found',
    onSearch: async (keyword: string) => {
      return fetch(`/api/search?q=${keyword}`).then(res => res.json());
    }
  };
}
<script>
  import { DayFlowCalendar } from '@dayflow/svelte';

  const handleSearch = async (keyword) => {
    return fetch(`/api/search?q=${keyword}`).then(res => res.json());
  };
</script>

<DayFlowCalendar
  {calendar}
  search={{
    debounceDelay: 500,
    emptyText: 'No events found',
    onSearch: handleSearch,
  }}
/>

๊ฒ€์ƒ‰ Props

์˜ต์…˜์„ค๋ช…
debounceDelay๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค.
onSearchํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
customSearch์ง์ ‘ ์ž‘์„ฑํ•œ ๋กœ์ง์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋กœ์ปฌ์—์„œ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
onResultClick๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์„ ํƒ์  ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค. ๋‚ด์žฅ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋™์ž‘(์ด๋ฒคํŠธ ๋‚ ์งœ๋กœ ์ด๋™, ์ด๋ฒคํŠธ ๊ฐ•์กฐ, ๋ชจ๋ฐ”์ผ์—์„œ ๊ฒ€์ƒ‰ UI ๋‹ซ๊ธฐ)์„ ์‹คํ–‰ํ•˜๋Š” defaultAction ์ฝœ๋ฐฑ์ด ํ•จ๊ป˜ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. defaultAction()์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ๋‚ด๋น„๊ฒŒ์ด์…˜๊ณผ UI ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
emptyText๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ ํ‘œ์‹œํ•  ๋ฌธ๊ตฌ์ž…๋‹ˆ๋‹ค.
timeFormat๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ‘œ์‹œ์— ์‚ฌ์šฉํ•  ์‹œ๊ฐ„ ํ˜•์‹์ž…๋‹ˆ๋‹ค('12h' ๋˜๋Š” '24h'). useCalendarApp์— ์ „์—ญ timeFormat์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ๊ทธ ์„ค์ •์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ด๋“œ๋ฐ” ๋™์ž‘

์‚ฌ์ด๋“œ๋ฐ”๋Š” @dayflow/plugin-sidebar ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋ฉด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค:

import { createSidebarPlugin } from '@dayflow/plugin-sidebar';

const calendar = useCalendarApp({
  views: [createWeekView()],
  plugins: [
    createSidebarPlugin({
      width: 280,
      initialCollapsed: false,
      createCalendarMode: 'modal', // 'inline' or 'modal'
    }),
  ],
});

return <DayFlowCalendar calendar={calendar} />;
<template>
  <DayFlowCalendar :calendar="calendar" />
</template>

<script setup>
import { DayFlowCalendar, useCalendarApp } from '@dayflow/vue';
import { createWeekView } from '@dayflow/core';
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';

const calendar = useCalendarApp({
  views: [createWeekView()],
  plugins: [
    createSidebarPlugin({
      width: 280,
      initialCollapsed: false,
      createCalendarMode: 'modal',
    }),
  ],
});
</script>
import { Component } from '@angular/core';
import { createWeekView } from '@dayflow/core';
import { createSidebarPlugin } from '@dayflow/plugin-sidebar';
import { DayFlowCalendarModule } from '@dayflow/angular';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [DayFlowCalendarModule],
  template: `
    <dayflow-calendar [calendar]="calendar"></dayflow-calendar>
  `
})
export class AppComponent {
  calendar = {
    views: [createWeekView()],
    plugins: [
      createSidebarPlugin({
        width: 280,
        initialCollapsed: false,
        createCalendarMode: 'modal',
      }),
    ],
  };
}
<script>
  import { DayFlowCalendar, useCalendarApp } from '@dayflow/svelte';
  import { createWeekView } from '@dayflow/core';
  import { createSidebarPlugin } from '@dayflow/plugin-sidebar';

  const calendar = useCalendarApp({
    views: [createWeekView()],
    plugins: [
      createSidebarPlugin({
        width: 280,
        initialCollapsed: false,
        createCalendarMode: 'modal',
      }),
    ],
  });
</script>

<DayFlowCalendar {calendar} />
  • createSidebarPlugin()์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์บ˜๋ฆฐ๋” ํ•„ํ„ฐ์™€ ์ „์ฒด ํ† ๊ธ€ ์ปจํŠธ๋กค์ด ํฌํ•จ๋œ ๊ธฐ๋ณธ ์‚ฌ์ด๋“œ๋ฐ”(DefaultCalendarSidebar)๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  • ๋„ˆ๋น„, ๊ธฐ๋ณธ ์ ‘ํž˜ ์ƒํƒœ, ์ƒ์„ฑ ๋ชจ๋“œ(createCalendarMode)๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ render ๋˜๋Š” renderSidebarHeader๋กœ ์ง์ ‘ ๋งŒ๋“  ๋ Œ๋”๋Ÿฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋Š” CalendarSidebarRenderProps(render์˜ ๊ฒฝ์šฐ) ๋˜๋Š” SidebarHeaderSlotArgs(renderSidebarHeader์˜ ๊ฒฝ์šฐ)๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฏ€๋กœ, ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์ฝœ๋ฐฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ƒ์„ธ ํ‘œ์‹œ ๋ฐฉ์‹

DayFlow๋Š” ์ด๋ฒคํŠธ ์ƒ์„ธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  1. ๊ธฐ๋ณธ ํŒจ๋„ ๋ชจ๋“œ โ€“ useEventDetailDialog๊ฐ€ false(๊ธฐ๋ณธ๊ฐ’)์ด๋ฉด ์ด๋ฒคํŠธ ์ƒ์„ธ๋ฅผ ์—ด ๋•Œ ๋‚ด์žฅ ํ”Œ๋กœํŒ… ํŒจ๋„์ธ DefaultEventDetailPanel์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋”๋ธ” ํด๋ฆญ(eventDetailTrigger: 'dbClick'), eventDetailTrigger: 'click'์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ•œ ๋ฒˆ ํด๋ฆญ์œผ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ„ฐ์น˜ ์ž…๋ ฅ์—์„œ๋Š” ํ•ญ์ƒ ํƒญ์œผ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
  2. ๋Œ€ํ™”์ƒ์ž ๋ชจ๋“œ โ€“ useCalendarApp์—์„œ useEventDetailDialog: true๋กœ ์„ค์ •ํ•˜๋ฉด ํ™”๋ฉด ๊ฐ€์šด๋ฐ์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์žฅ ๋ชจ๋‹ฌ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. eventDetailDialog ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง์ ‘ ๋งŒ๋“  ๋Œ€ํ™”์ƒ์ž๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ โ€“ ์•ฑ ์ฝœ๋ฐฑ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ์ž์ฒด ์ด๋ฒคํŠธ ๋ชจ๋‹ฌ์ด ์ด๋ฏธ ์žˆ๋‹ค๋ฉด, useCalendarApp์—์„œ useEventDetailPanel: false๋กœ ์„ค์ •ํ•ด ํ”Œ๋กœํŒ… ํŒจ๋„์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.
// Suppress the built-in panel โ€” use your own modal triggered elsewhere
const calendar = useCalendarApp({
  ...
  useEventDetailPanel: false,
});

return <DayFlowCalendar calendar={calendar} />;
<template>
  <DayFlowCalendar :calendar="calendar" />
</template>

<script setup>
import { DayFlowCalendar, useCalendarApp } from '@dayflow/vue';

// Suppress the built-in panel โ€” use your own modal triggered elsewhere
const calendar = useCalendarApp({
  ...
  useEventDetailPanel: false,
});
</script>
import { Component } from '@angular/core';
import { DayFlowCalendarModule } from '@dayflow/angular';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [DayFlowCalendarModule],
  template: `
    <dayflow-calendar [calendar]="calendar"></dayflow-calendar>
  `
})
export class AppComponent {
  // Suppress the built-in panel โ€” use your own modal triggered elsewhere
  calendar = {
    ...
    useEventDetailPanel: false,
  };
}
<script>
  import { DayFlowCalendar, useCalendarApp } from '@dayflow/svelte';

  // Suppress the built-in panel โ€” use your own modal triggered elsewhere
  const calendar = useCalendarApp({
    ...
    useEventDetailPanel: false,
  });
</script>

<DayFlowCalendar {calendar} />
// Custom panel content (keeps the default panel chrome)
<DayFlowCalendar
  calendar={calendar}
  eventDetailContent={({ event, onClose }) => (
    <div className='p-4'>
      <h2>{event.title}</h2>
      <button onClick={onClose}>Close</button>
    </div>
  )}
/>
<template>
  <DayFlowCalendar :calendar="calendar">
    <!-- Custom panel content (keeps the default panel chrome) -->
    <template #eventDetailContent="{ event, onClose }">
      <div class="p-4">
        <h2>{{ event.title }}</h2>
        <button @click="onClose()">Close</button>
      </div>
    </template>
  </DayFlowCalendar>
</template>

<script setup>
import { DayFlowCalendar } from '@dayflow/vue';
</script>
<!-- Custom panel content (keeps the default panel chrome) -->
<dayflow-calendar
  [calendar]="calendar"
  [eventDetailContent]="detailContent"
>
</dayflow-calendar>

<ng-template #detailContent let-args>
  <div class="p-4">
    <h2>{{ args.event.title }}</h2>
    <button (click)="args.onClose()">Close</button>
  </div>
</ng-template>
<DayFlowCalendar {calendar} eventDetailContent={CustomDetailContent} />

<!-- CustomDetailContent.svelte -->
<script lang="ts">
  import type { EventDetailContentSlotArgs } from '@dayflow/core';
  let { event, onClose } = $props<EventDetailContentSlotArgs>();
</script>

<div class="p-4">
  <h2>{event.title}</h2>
  <button onclick={onClose}>Close</button>
</div>
// Custom dialog (requires useEventDetailDialog: true in useCalendarApp)
<DayFlowCalendar
  calendar={calendar}
  eventDetailDialog={({ event, isOpen, onClose }) => (
    <MyDialog isOpen={isOpen} onClose={onClose}>
      <EventForm event={event} />
    </MyDialog>
  )}
/>
<template>
  <DayFlowCalendar :calendar="calendar">
    <!-- Custom dialog -->
    <template #eventDetailDialog="{ event, isOpen, onClose }">
      <MyDialog :isOpen="isOpen" @close="onClose()">
        <EventForm :event="event" />
      </MyDialog>
    </template>
  </DayFlowCalendar>
</template>

<script setup>
import { DayFlowCalendar } from '@dayflow/vue';
import MyDialog from './MyDialog.vue';
import EventForm from './EventForm.vue';
</script>
<!-- Custom dialog -->
<dayflow-calendar
  [calendar]="calendar"
  [eventDetailDialog]="dialog"
>
</dayflow-calendar>

<ng-template #dialog let-args>
  <my-dialog [isOpen]="args.isOpen" (close)="args.onClose()">
    <event-form [event]="args.event"></event-form>
  </my-dialog>
</ng-template>
<DayFlowCalendar {calendar} eventDetailDialog={MyCustomDialog} />

<!-- MyCustomDialog.svelte -->
<script lang="ts">
  import type { EventDetailDialogSlotArgs } from '@dayflow/core';
  import MyDialog from './MyDialog.svelte';
  import EventForm from './EventForm.svelte';

  let { event, isOpen, onClose } = $props<EventDetailDialogSlotArgs>();
</script>

<MyDialog {isOpen} {onClose}>
  <EventForm {event} />
</MyDialog>

์š”์•ฝํ•˜๋ฉด, DayFlowCalendar๋Š” ๋ ˆ์ด์•„์›ƒ, ์‚ฌ์ด๋“œ๋ฐ” ์—ฐ๊ฒฐ, ์ด๋ฒคํŠธ ์ƒ์„ธ ์ฒ˜๋ฆฌ ๊ฐ™์€ ์กฐ์œจ ๊ณ„์ธต์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ์—ฌ๋Ÿฌ๋ถ„์€ useCalendarApp ์„ค์ •๊ณผ ๊ทธ ์ฃผ๋ณ€์˜ ์ œํ’ˆ ๊ฒฝํ—˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ