nuxt-ui-elements-pro 0.1.5 → 0.1.7

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 (67) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +153 -18
  3. package/dist/runtime/components/EventCalendar.d.vue.ts +109 -22
  4. package/dist/runtime/components/EventCalendar.vue +225 -602
  5. package/dist/runtime/components/EventCalendar.vue.d.ts +109 -22
  6. package/dist/runtime/components/OrgChart.d.vue.ts +191 -0
  7. package/dist/runtime/components/OrgChart.vue +290 -0
  8. package/dist/runtime/components/OrgChart.vue.d.ts +191 -0
  9. package/dist/runtime/components/event-calendar/EventCalendarHeader.d.vue.ts +45 -0
  10. package/dist/runtime/components/event-calendar/EventCalendarHeader.vue +55 -0
  11. package/dist/runtime/components/event-calendar/EventCalendarHeader.vue.d.ts +45 -0
  12. package/dist/runtime/components/event-calendar/EventCalendarListView.d.vue.ts +25 -0
  13. package/dist/runtime/components/event-calendar/EventCalendarListView.vue +95 -0
  14. package/dist/runtime/components/event-calendar/EventCalendarListView.vue.d.ts +25 -0
  15. package/dist/runtime/components/event-calendar/EventCalendarMonthView.d.vue.ts +34 -0
  16. package/dist/runtime/components/event-calendar/EventCalendarMonthView.vue +336 -0
  17. package/dist/runtime/components/event-calendar/EventCalendarMonthView.vue.d.ts +34 -0
  18. package/dist/runtime/components/event-calendar/EventCalendarTimeGrid.d.vue.ts +31 -0
  19. package/dist/runtime/components/event-calendar/EventCalendarTimeGrid.vue +306 -0
  20. package/dist/runtime/components/event-calendar/EventCalendarTimeGrid.vue.d.ts +31 -0
  21. package/dist/runtime/components/org-chart/OrgChartConnectors.d.vue.ts +15 -0
  22. package/dist/runtime/components/org-chart/OrgChartConnectors.vue +29 -0
  23. package/dist/runtime/components/org-chart/OrgChartConnectors.vue.d.ts +15 -0
  24. package/dist/runtime/components/org-chart/OrgChartControls.d.vue.ts +19 -0
  25. package/dist/runtime/components/org-chart/OrgChartControls.vue +25 -0
  26. package/dist/runtime/components/org-chart/OrgChartControls.vue.d.ts +19 -0
  27. package/dist/runtime/components/org-chart/OrgChartNode.d.vue.ts +30 -0
  28. package/dist/runtime/components/org-chart/OrgChartNode.vue +129 -0
  29. package/dist/runtime/components/org-chart/OrgChartNode.vue.d.ts +30 -0
  30. package/dist/runtime/composables/useEventCalendar.d.ts +52 -0
  31. package/dist/runtime/composables/useEventCalendar.js +362 -0
  32. package/dist/runtime/composables/useEventCalendarContext.d.ts +8 -0
  33. package/dist/runtime/composables/useEventCalendarContext.js +11 -0
  34. package/dist/runtime/composables/useEventCalendarDragDrop.d.ts +1 -1
  35. package/dist/runtime/composables/useEventCalendarDragDrop.js +11 -9
  36. package/dist/runtime/composables/useEventCalendarKeyboard.d.ts +20 -0
  37. package/dist/runtime/composables/useEventCalendarKeyboard.js +128 -0
  38. package/dist/runtime/composables/useEventCalendarResize.d.ts +31 -0
  39. package/dist/runtime/composables/useEventCalendarResize.js +87 -0
  40. package/dist/runtime/composables/useEventCalendarSelect.d.ts +21 -0
  41. package/dist/runtime/composables/useEventCalendarSelect.js +119 -0
  42. package/dist/runtime/composables/useOrgChart.d.ts +42 -0
  43. package/dist/runtime/composables/useOrgChart.js +154 -0
  44. package/dist/runtime/composables/useOrgChartContext.d.ts +8 -0
  45. package/dist/runtime/composables/useOrgChartContext.js +11 -0
  46. package/dist/runtime/composables/useOrgChartDragDrop.d.ts +20 -0
  47. package/dist/runtime/composables/useOrgChartDragDrop.js +67 -0
  48. package/dist/runtime/composables/useOrgChartKeyboard.d.ts +16 -0
  49. package/dist/runtime/composables/useOrgChartKeyboard.js +101 -0
  50. package/dist/runtime/composables/useOrgChartSearch.d.ts +16 -0
  51. package/dist/runtime/composables/useOrgChartSearch.js +62 -0
  52. package/dist/runtime/composables/useOrgChartZoom.d.ts +26 -0
  53. package/dist/runtime/composables/useOrgChartZoom.js +101 -0
  54. package/dist/runtime/index.d.ts +3 -0
  55. package/dist/runtime/index.js +2 -0
  56. package/dist/runtime/types/event-calendar.d.ts +170 -0
  57. package/dist/runtime/types/index.d.ts +2 -0
  58. package/dist/runtime/types/index.js +2 -0
  59. package/dist/runtime/types/org-chart.d.ts +181 -0
  60. package/dist/runtime/types/org-chart.js +0 -0
  61. package/dist/runtime/utils/event-calendar.d.ts +22 -1
  62. package/dist/runtime/utils/event-calendar.js +199 -1
  63. package/dist/runtime/utils/org-chart.d.ts +55 -0
  64. package/dist/runtime/utils/org-chart.js +367 -0
  65. package/dist/runtime/utils/recurrence.d.ts +30 -0
  66. package/dist/runtime/utils/recurrence.js +150 -0
  67. package/package.json +15 -6
@@ -0,0 +1,306 @@
1
+ <script>
2
+ import { Primitive } from "reka-ui";
3
+ import { computed } from "vue";
4
+ import { useEventCalendarContext } from "../../composables/useEventCalendarContext";
5
+ import { format } from "#std/date";
6
+ </script>
7
+
8
+ <script setup>
9
+ const props = defineProps({
10
+ as: { type: null, required: false }
11
+ });
12
+ defineSlots();
13
+ const ctx = useEventCalendarContext();
14
+ const isEmpty = computed(
15
+ () => !ctx.loading.value && ctx.timeGridDays.value.every(
16
+ (day) => day.allDayEvents.length === 0 && day.timedEvents.length === 0
17
+ )
18
+ );
19
+ </script>
20
+
21
+ <template>
22
+ <Primitive
23
+ v-if="ctx.view.value === 'week' || ctx.view.value === 'day'"
24
+ :as="props.as ?? 'div'"
25
+ data-slot="timeGridRoot"
26
+ :class="ctx.ui.value.timeGridRoot({ class: ctx.propUi.value?.timeGridRoot })"
27
+ role="region"
28
+ :aria-label="`${ctx.view.value === 'week' ? 'Week' : 'Day'} view: ${ctx.headerTitle.value}`"
29
+ @keydown="ctx.onGridKeydown">
30
+ <!-- Column headers -->
31
+ <div data-slot="columnHeaders" :class="ctx.ui.value.columnHeaders({ class: ctx.propUi.value?.columnHeaders })">
32
+ <div data-slot="timeGutterSpacer" :class="ctx.ui.value.timeGutterSpacer({ class: ctx.propUi.value?.timeGutterSpacer })" />
33
+ <div
34
+ v-for="day in ctx.timeGridDays.value"
35
+ :key="day.dateKey"
36
+ data-slot="dayColumnHeader"
37
+ :aria-label="ctx.formatDateAriaLabel(day.date)"
38
+ :aria-current="day.isToday ? 'date' : void 0"
39
+ :class="ctx.ui.value.dayColumnHeader({ class: ctx.propUi.value?.dayColumnHeader })">
40
+ <div :class="ctx.ui.value.dayColumnHeaderLabel({ class: ctx.propUi.value?.dayColumnHeaderLabel })">
41
+ {{ format(day.date, ctx.timeGridDays.value.length === 1 ? "dddd" : "ddd", ctx.locale.value) }}
42
+ </div>
43
+ <div
44
+ :class="[
45
+ day.isToday ? ctx.ui.value.dayColumnHeaderToday({ class: ctx.propUi.value?.dayColumnHeaderToday }) : ctx.ui.value.dayColumnHeaderNumber({ class: ctx.propUi.value?.dayColumnHeaderNumber })
46
+ ]">
47
+ {{ day.date.day }}
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <!-- All-day events row -->
53
+ <div data-slot="allDayRow" aria-label="All-day events" :class="ctx.ui.value.allDayRow({ class: ctx.propUi.value?.allDayRow })">
54
+ <div data-slot="allDayLabel" :class="ctx.ui.value.allDayLabel({ class: ctx.propUi.value?.allDayLabel })">all-day</div>
55
+
56
+ <!-- Day view: single column with all-day slot -->
57
+ <template v-if="ctx.timeGridDays.value.length === 1">
58
+ <div
59
+ v-for="day in ctx.timeGridDays.value"
60
+ :key="`allday-${day.dateKey}`"
61
+ data-slot="allDayCell"
62
+ :class="[
63
+ 'flex-1 p-0.5 flex flex-wrap gap-0.5',
64
+ ctx.ui.value.allDayCell({ class: ctx.propUi.value?.allDayCell }),
65
+ ctx.dropTargetKey.value === `allday-${day.dateKey}` && ctx.ui.value.dropTarget({ class: ctx.propUi.value?.dropTarget })
66
+ ]"
67
+ @dragover="ctx.onDragOver(`allday-${day.dateKey}`, $event)"
68
+ @dragleave="ctx.onDragLeave"
69
+ @drop="ctx.onDropMonthCell(day.date, $event)">
70
+ <slot name="all-day" :events="day.allDayEvents.map((e) => e.original)" :date="day.date">
71
+ <div
72
+ v-for="event in day.allDayEvents"
73
+ :key="event.id"
74
+ role="button"
75
+ :aria-label="ctx.formatEventAriaLabel(event)"
76
+ tabindex="0"
77
+ :draggable="ctx.editable.value && event.draggable"
78
+ :class="[ctx.ui.value.eventChip({ class: ctx.propUi.value?.eventChip }), 'w-full']"
79
+ :style="ctx.getEventStyle(event)"
80
+ @click="ctx.handleEventClick(event, $event)"
81
+ @keydown.enter.stop="ctx.handleEventClick(event, $event)"
82
+ @keydown.space.prevent.stop="ctx.handleEventClick(event, $event)"
83
+ @dragstart="ctx.onDragStart(event, $event)"
84
+ @dragend="ctx.onDragEnd">
85
+ <slot name="event" :event="event.original" :view="ctx.view.value">
86
+ <UIcon
87
+ v-if="event.recurringEventId"
88
+ name="i-lucide-repeat"
89
+ data-slot="recurringIcon"
90
+ :class="ctx.ui.value.recurringIcon({ class: ctx.propUi.value?.recurringIcon })"
91
+ aria-hidden="true" />
92
+ {{ event.title }}
93
+ </slot>
94
+ </div>
95
+ </slot>
96
+ </div>
97
+ </template>
98
+
99
+ <!-- Week view: CSS Grid with spanning bars -->
100
+ <template v-else>
101
+ <div
102
+ data-slot="allDayGrid"
103
+ :class="ctx.ui.value.allDayGrid({ class: ctx.propUi.value?.allDayGrid })"
104
+ :style="{
105
+ display: 'grid',
106
+ gridTemplateColumns: `repeat(${ctx.timeGridDays.value.length}, minmax(0, 1fr))`,
107
+ gridTemplateRows: ctx.allDayLayout.value.laneCount > 0 ? `repeat(${ctx.allDayLayout.value.laneCount}, 24px)` : 'minmax(24px, auto)'
108
+ }">
109
+ <!-- Background cells (drop targets + borders) -->
110
+ <div
111
+ v-for="(day, colIdx) in ctx.timeGridDays.value"
112
+ :key="`allday-bg-${day.dateKey}`"
113
+ data-slot="allDayCell"
114
+ :class="[
115
+ ctx.ui.value.allDayCell({ class: ctx.propUi.value?.allDayCell }),
116
+ ctx.dropTargetKey.value === `allday-${day.dateKey}` && ctx.ui.value.dropTarget({ class: ctx.propUi.value?.dropTarget })
117
+ ]"
118
+ :style="{
119
+ gridColumn: `${colIdx + 1}`,
120
+ gridRow: '1 / -1'
121
+ }"
122
+ @dragover="ctx.onDragOver(`allday-${day.dateKey}`, $event)"
123
+ @dragleave="ctx.onDragLeave"
124
+ @drop="ctx.onDropMonthCell(day.date, $event)" />
125
+
126
+ <!-- Spanning event bars -->
127
+ <div
128
+ v-for="spanEvent in ctx.allDayLayout.value.spanning"
129
+ :key="`allday-span-${spanEvent.event.id}-${spanEvent.startCol}`"
130
+ data-slot="allDaySpanningChip"
131
+ role="button"
132
+ :aria-label="ctx.formatEventAriaLabel(spanEvent.event)"
133
+ tabindex="0"
134
+ :draggable="ctx.editable.value && spanEvent.event.draggable && spanEvent.isStart"
135
+ :class="[
136
+ ctx.ui.value.allDaySpanningChip({ class: ctx.propUi.value?.allDaySpanningChip }),
137
+ spanEvent.isStart && 'rounded-l border-l-2 border-[var(--event-color)] ml-0.5',
138
+ spanEvent.isEnd && 'rounded-r mr-0.5',
139
+ !spanEvent.isStart && 'pl-1',
140
+ !spanEvent.isEnd && 'pr-1',
141
+ ctx.draggedEventId.value === spanEvent.event.id && 'opacity-50'
142
+ ]"
143
+ :style="{
144
+ ...ctx.getEventStyle(spanEvent.event, 15),
145
+ gridColumn: `${spanEvent.startCol + 1} / span ${spanEvent.span}`,
146
+ gridRow: `${spanEvent.lane + 1}`
147
+ }"
148
+ @click="ctx.handleEventClick(spanEvent.event, $event)"
149
+ @keydown.enter.stop="ctx.handleEventClick(spanEvent.event, $event)"
150
+ @keydown.space.prevent.stop="ctx.handleEventClick(spanEvent.event, $event)"
151
+ @dragstart="ctx.onDragStart(spanEvent.event, $event)"
152
+ @dragend="ctx.onDragEnd">
153
+ <slot name="event" :event="spanEvent.event.original" :view="ctx.view.value">
154
+ <template v-if="spanEvent.isStart">
155
+ <UIcon
156
+ v-if="spanEvent.event.recurringEventId"
157
+ name="i-lucide-repeat"
158
+ data-slot="recurringIcon"
159
+ :class="ctx.ui.value.recurringIcon({ class: ctx.propUi.value?.recurringIcon })"
160
+ aria-hidden="true" />
161
+ {{ spanEvent.event.title }}
162
+ </template>
163
+ <span v-else class="sr-only">{{ spanEvent.event.title }} (continued)</span>
164
+ </slot>
165
+ </div>
166
+ </div>
167
+ </template>
168
+ </div>
169
+
170
+ <!-- Time grid -->
171
+ <div class="relative">
172
+ <div data-slot="timeGrid" :class="ctx.ui.value.timeGrid({ class: ctx.propUi.value?.timeGrid })" @selectstart.prevent>
173
+ <!-- Time gutter -->
174
+ <div data-slot="timeGutter" :class="ctx.ui.value.timeGutter({ class: ctx.propUi.value?.timeGutter })">
175
+ <div
176
+ v-for="slot in ctx.timeGridSlots.value"
177
+ :key="`gutter-${slot.hour}-${slot.minute}`"
178
+ data-slot="timeGutterSlot"
179
+ :class="ctx.ui.value.timeGutterSlot({ class: ctx.propUi.value?.timeGutterSlot })"
180
+ :style="{ height: `${ctx.SLOT_HEIGHT}px` }">
181
+ <div v-if="slot.label" data-slot="timeLabel" :class="ctx.ui.value.timeLabel({ class: ctx.propUi.value?.timeLabel })">
182
+ <slot name="time-label" :hour="slot.hour" :label="slot.label">
183
+ {{ slot.label }}
184
+ </slot>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ <!-- Day columns -->
190
+ <div
191
+ v-for="day in ctx.timeGridDays.value"
192
+ :key="`col-${day.dateKey}`"
193
+ data-slot="dayColumn"
194
+ :class="ctx.ui.value.dayColumn({ class: ctx.propUi.value?.dayColumn })"
195
+ @dragover="ctx.onTimeGridDragOver(`time-${day.dateKey}`, $event)"
196
+ @dragleave="ctx.onDragLeave"
197
+ @drop="ctx.onDropTimeGrid(day.date, $event)">
198
+ <!-- Time slot rows (grid lines + drag targets) -->
199
+ <div
200
+ v-for="slot in ctx.timeGridSlots.value"
201
+ :key="`row-${slot.hour}-${slot.minute}`"
202
+ data-slot="timeSlotRow"
203
+ :class="[
204
+ ctx.ui.value.timeSlotRow({ class: ctx.propUi.value?.timeSlotRow }),
205
+ ctx.dragSnapSlot.value === `time-${day.dateKey}-${slot.hour}-${slot.minute}` && ctx.ui.value.dragSnapSlot({ class: ctx.propUi.value?.dragSnapSlot }),
206
+ ctx.isSlotInSelection(day.date, slot.hour, slot.minute) && ctx.ui.value.selectionOverlay({ class: ctx.propUi.value?.selectionOverlay })
207
+ ]"
208
+ :style="{ height: `${ctx.SLOT_HEIGHT}px` }"
209
+ @click="ctx.handleDateClick(day)"
210
+ @pointerdown="ctx.onSlotPointerDown(day.date, slot.hour, slot.minute, $event)"
211
+ @pointermove="ctx.onSlotPointerMove(day.date, slot.hour, slot.minute)"
212
+ @pointerup="ctx.onSelectionPointerUp()"
213
+ @dragover="ctx.onSlotDragOver(`time-${day.dateKey}-${slot.hour}-${slot.minute}`, $event)" />
214
+
215
+ <!-- Timed events (absolutely positioned) -->
216
+ <div
217
+ v-for="event in day.timedEvents"
218
+ :key="`ev-${event.id}`"
219
+ data-slot="timeEvent"
220
+ role="button"
221
+ :aria-label="ctx.formatEventAriaLabel(event)"
222
+ tabindex="0"
223
+ :draggable="ctx.editable.value && event.draggable && ctx.resizingEventId.value == null"
224
+ :class="[
225
+ ctx.ui.value.timeEvent({ class: ctx.propUi.value?.timeEvent }),
226
+ ctx.draggedEventId.value != null && ctx.draggedEventId.value !== event.id && 'pointer-events-none',
227
+ ctx.draggedEventId.value === event.id && 'opacity-50',
228
+ ctx.resizingEventId.value != null && ctx.resizingEventId.value !== event.id && 'pointer-events-none',
229
+ ctx.resizingEventId.value === event.id && 'select-none'
230
+ ]"
231
+ :style="{
232
+ ...ctx.getEventStyle(event, 15),
233
+ top: `${event.topPx}px`,
234
+ height: ctx.resizingEventId.value === event.id && ctx.resizePreviewHeightPx.value != null ? `${ctx.resizePreviewHeightPx.value}px` : `${event.heightPx}px`,
235
+ minHeight: '20px',
236
+ left: `calc(${event.column / event.totalColumns * 100}% + 2px)`,
237
+ width: `calc(${1 / event.totalColumns * 100}% - 4px)`
238
+ }"
239
+ @click="ctx.handleEventClick(event, $event)"
240
+ @keydown.enter.stop="ctx.handleEventClick(event, $event)"
241
+ @keydown.space.prevent.stop="ctx.handleEventClick(event, $event)"
242
+ @dragstart="ctx.onDragStart(event, $event)"
243
+ @dragend="ctx.onDragEnd">
244
+ <slot name="event" :event="event.original" :view="ctx.view.value">
245
+ <div data-slot="timeEventTitle" :class="ctx.ui.value.timeEventTitle({ class: ctx.propUi.value?.timeEventTitle })">
246
+ <UIcon
247
+ v-if="event.recurringEventId"
248
+ name="i-lucide-repeat"
249
+ data-slot="recurringIcon"
250
+ :class="ctx.ui.value.recurringIcon({ class: ctx.propUi.value?.recurringIcon })"
251
+ aria-hidden="true" />
252
+ {{ event.title }}
253
+ </div>
254
+ <div data-slot="timeEventTime" :class="ctx.ui.value.timeEventTime({ class: ctx.propUi.value?.timeEventTime })">
255
+ {{ ctx.formatTimeRange(event.start, event.end) }}
256
+ </div>
257
+ </slot>
258
+ <!-- Resize handle (bottom edge) -->
259
+ <div
260
+ v-if="ctx.editable.value && event.resizable"
261
+ data-slot="resizeHandle"
262
+ :class="ctx.ui.value.resizeHandle({ class: ctx.propUi.value?.resizeHandle })"
263
+ @pointerdown.stop="ctx.onResizePointerDown(event, $event)">
264
+ <div
265
+ data-slot="resizeHandleBar"
266
+ :class="ctx.ui.value.resizeHandleBar({ class: ctx.propUi.value?.resizeHandleBar })" />
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+
272
+ <!-- Loading overlay -->
273
+ <div
274
+ v-if="ctx.loading.value"
275
+ data-slot="loadingOverlay"
276
+ role="status"
277
+ :class="ctx.ui.value.loadingOverlay({ class: ctx.propUi.value?.loadingOverlay })">
278
+ <slot name="loading">
279
+ <UIcon
280
+ name="i-lucide-loader-circle"
281
+ data-slot="loadingIcon"
282
+ :class="ctx.ui.value.loadingIcon({ class: ctx.propUi.value?.loadingIcon })"
283
+ aria-hidden="true" />
284
+ <span class="sr-only">Loading events</span>
285
+ </slot>
286
+ </div>
287
+
288
+ <!-- Empty state -->
289
+ <div
290
+ v-else-if="isEmpty"
291
+ data-slot="emptyState"
292
+ :class="ctx.ui.value.emptyState({ class: ctx.propUi.value?.emptyState })">
293
+ <slot name="empty">
294
+ <UIcon
295
+ name="i-lucide-calendar-x2"
296
+ data-slot="emptyStateIcon"
297
+ :class="ctx.ui.value.emptyStateIcon({ class: ctx.propUi.value?.emptyStateIcon })"
298
+ aria-hidden="true" />
299
+ <p data-slot="emptyStateText" :class="ctx.ui.value.emptyStateText({ class: ctx.propUi.value?.emptyStateText })">
300
+ No events
301
+ </p>
302
+ </slot>
303
+ </div>
304
+ </div>
305
+ </Primitive>
306
+ </template>
@@ -0,0 +1,31 @@
1
+ import type { CalendarDate } from "@internationalized/date";
2
+ import type { CalendarEvent, CalendarView } from "../../types/event-calendar.js";
3
+ import { type Component } from "vue";
4
+ export interface EventCalendarTimeGridProps {
5
+ /** Rendered element type @defaultValue 'div' */
6
+ as?: string | Component;
7
+ }
8
+ export interface EventCalendarTimeGridSlots {
9
+ event: (props: {
10
+ event: CalendarEvent;
11
+ view: CalendarView;
12
+ }) => any;
13
+ "time-label": (props: {
14
+ hour: number;
15
+ label: string;
16
+ }) => any;
17
+ "all-day": (props: {
18
+ events: CalendarEvent[];
19
+ date: CalendarDate;
20
+ }) => any;
21
+ loading: () => any;
22
+ empty: () => any;
23
+ }
24
+ declare const _default: typeof __VLS_export;
25
+ export default _default;
26
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<EventCalendarTimeGridProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<EventCalendarTimeGridProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, EventCalendarTimeGridSlots>;
27
+ type __VLS_WithSlots<T, S> = T & {
28
+ new (): {
29
+ $slots: S;
30
+ };
31
+ };
@@ -0,0 +1,15 @@
1
+ declare var __VLS_1: {
2
+ connectors: import("../../types/org-chart.js").OrgChartConnector[];
3
+ };
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_1) => any;
6
+ };
7
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
8
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
9
+ declare const _default: typeof __VLS_export;
10
+ export default _default;
11
+ type __VLS_WithSlots<T, S> = T & {
12
+ new (): {
13
+ $slots: S;
14
+ };
15
+ };
@@ -0,0 +1,29 @@
1
+ <script setup>
2
+ import { useOrgChartContext } from "../../composables/useOrgChartContext";
3
+ const ctx = useOrgChartContext();
4
+ </script>
5
+
6
+ <template>
7
+ <svg
8
+ data-slot="connectorLayer"
9
+ :class="ctx.ui.value.connectorLayer({ class: ctx.propUi.value?.connectorLayer })"
10
+ :width="ctx.layout.value.width"
11
+ :height="ctx.layout.value.height"
12
+ :viewBox="`0 0 ${ctx.layout.value.width} ${ctx.layout.value.height}`"
13
+ aria-hidden="true"
14
+ >
15
+ <!-- Hierarchical connectors -->
16
+ <slot :connectors="ctx.layout.value.connectors">
17
+ <path
18
+ v-for="connector in ctx.layout.value.connectors"
19
+ :key="`${connector.fromId}-${connector.toId}`"
20
+ data-slot="connector"
21
+ :d="connector.path"
22
+ :class="[
23
+ ctx.ui.value.connector({ class: ctx.propUi.value?.connector }),
24
+ ctx.animated.value ? 'transition-all duration-300 ease-in-out' : ''
25
+ ]"
26
+ />
27
+ </slot>
28
+ </svg>
29
+ </template>
@@ -0,0 +1,15 @@
1
+ declare var __VLS_1: {
2
+ connectors: import("../../types/org-chart.js").OrgChartConnector[];
3
+ };
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_1) => any;
6
+ };
7
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
8
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
9
+ declare const _default: typeof __VLS_export;
10
+ export default _default;
11
+ type __VLS_WithSlots<T, S> = T & {
12
+ new (): {
13
+ $slots: S;
14
+ };
15
+ };
@@ -0,0 +1,19 @@
1
+ declare var __VLS_1: {
2
+ zoomIn: () => void;
3
+ zoomOut: () => void;
4
+ zoomReset: () => void;
5
+ fitToView: () => void;
6
+ scale: number;
7
+ };
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,25 @@
1
+ <script setup>
2
+ import { useOrgChartContext } from "../../composables/useOrgChartContext";
3
+ const ctx = useOrgChartContext();
4
+ </script>
5
+
6
+ <template>
7
+ <div
8
+ v-if="ctx.zoomConfig.value.enabled && ctx.zoomConfig.value.controls"
9
+ data-slot="zoomControls"
10
+ :class="ctx.ui.value.zoomControls({ class: ctx.propUi.value?.zoomControls })"
11
+ >
12
+ <slot
13
+ :zoom-in="ctx.zoomIn"
14
+ :zoom-out="ctx.zoomOut"
15
+ :zoom-reset="ctx.zoomReset"
16
+ :fit-to-view="ctx.fitToView"
17
+ :scale="ctx.scale.value"
18
+ >
19
+ <UButton icon="i-lucide-zoom-in" size="xs" color="neutral" variant="outline" square aria-label="Zoom in" @click="ctx.zoomIn" />
20
+ <UButton icon="i-lucide-zoom-out" size="xs" color="neutral" variant="outline" square aria-label="Zoom out" @click="ctx.zoomOut" />
21
+ <UButton icon="i-lucide-maximize" size="xs" color="neutral" variant="outline" square aria-label="Fit to view" @click="ctx.fitToView" />
22
+ <UButton icon="i-lucide-rotate-ccw" size="xs" color="neutral" variant="outline" square aria-label="Reset zoom" @click="ctx.zoomReset" />
23
+ </slot>
24
+ </div>
25
+ </template>
@@ -0,0 +1,19 @@
1
+ declare var __VLS_1: {
2
+ zoomIn: () => void;
3
+ zoomOut: () => void;
4
+ zoomReset: () => void;
5
+ fitToView: () => void;
6
+ scale: number;
7
+ };
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,30 @@
1
+ import type { OrgChartTreeNode } from "../../types/org-chart.js";
2
+ export interface OrgChartNodeProps {
3
+ node: OrgChartTreeNode;
4
+ }
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
7
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<OrgChartNodeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<OrgChartNodeProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
8
+ avatar?: (props: {
9
+ node: import("../../types/org-chart.js").OrgChartNode;
10
+ }) => any;
11
+ } & {
12
+ label?: (props: {
13
+ node: import("../../types/org-chart.js").OrgChartNode;
14
+ }) => any;
15
+ } & {
16
+ description?: (props: {
17
+ node: import("../../types/org-chart.js").OrgChartNode;
18
+ }) => any;
19
+ } & {
20
+ 'collapse-toggle'?: (props: {
21
+ expanded: boolean;
22
+ count: number;
23
+ node: import("../../types/org-chart.js").OrgChartNode;
24
+ }) => any;
25
+ }>;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
@@ -0,0 +1,129 @@
1
+ <script>
2
+ import { computed } from "vue";
3
+ import { useOrgChartContext } from "../../composables/useOrgChartContext";
4
+ </script>
5
+
6
+ <script setup>
7
+ const props = defineProps({
8
+ node: { type: Object, required: true }
9
+ });
10
+ const ctx = useOrgChartContext();
11
+ const isExpanded = computed(() => ctx.isExpanded(props.node.data.id));
12
+ const isSelected = computed(() => ctx.isSelected(props.node.data.id));
13
+ const isFocused = computed(() => ctx.isFocused(props.node.data.id));
14
+ const isMatched = computed(() => ctx.isMatched(props.node.data.id));
15
+ const isDimmed = computed(() => ctx.isDimmed(props.node.data.id));
16
+ const isDragging = computed(() => ctx.draggedNodeId.value === props.node.data.id);
17
+ const isDropTarget = computed(() => ctx.dropTargetId.value === props.node.data.id);
18
+ const hasChildren = computed(() => props.node.children.length > 0);
19
+ const nodeStyle = computed(() => {
20
+ const _layout = ctx.layout.value;
21
+ const cfg = ctx.layoutConfig.value;
22
+ return {
23
+ left: `${props.node.x}px`,
24
+ top: `${props.node.y}px`,
25
+ width: `${cfg.nodeWidth}px`,
26
+ height: `${cfg.nodeHeight}px`
27
+ };
28
+ });
29
+ const togglePosition = computed(() => {
30
+ const cfg = ctx.layoutConfig.value;
31
+ const dir = ctx.direction.value;
32
+ switch (dir) {
33
+ case "vertical":
34
+ return {
35
+ left: `${cfg.nodeWidth / 2 - 10}px`,
36
+ top: `${cfg.nodeHeight - 2}px`
37
+ };
38
+ case "bottom-up":
39
+ return {
40
+ left: `${cfg.nodeWidth / 2 - 10}px`,
41
+ top: "-8px"
42
+ };
43
+ case "horizontal":
44
+ return {
45
+ left: `${cfg.nodeWidth - 2}px`,
46
+ top: `${cfg.nodeHeight / 2 - 10}px`
47
+ };
48
+ case "right-to-left":
49
+ return {
50
+ left: "-8px",
51
+ top: `${cfg.nodeHeight / 2 - 10}px`
52
+ };
53
+ default:
54
+ return {
55
+ left: `${cfg.nodeWidth / 2 - 10}px`,
56
+ top: `${cfg.nodeHeight - 2}px`
57
+ };
58
+ }
59
+ });
60
+ const nodeColor = computed(() => props.node.data.color);
61
+ function nodeClasses() {
62
+ const classes = [ctx.ui.value.node({ class: ctx.propUi.value?.node })];
63
+ if (ctx.animated.value) classes.push(ctx.ui.value.nodeAnimated({ class: ctx.propUi.value?.nodeAnimated }));
64
+ if (isSelected.value) classes.push(ctx.ui.value.nodeSelected({ class: ctx.propUi.value?.nodeSelected }));
65
+ if (isFocused.value) classes.push(ctx.ui.value.nodeFocused({ class: ctx.propUi.value?.nodeFocused }));
66
+ if (isMatched.value) classes.push(ctx.ui.value.nodeMatched({ class: ctx.propUi.value?.nodeMatched }));
67
+ if (isDimmed.value) classes.push(ctx.ui.value.nodeDimmed({ class: ctx.propUi.value?.nodeDimmed }));
68
+ if (isDragging.value) classes.push(ctx.ui.value.nodeDragging({ class: ctx.propUi.value?.nodeDragging }));
69
+ if (isDropTarget.value) classes.push(ctx.ui.value.nodeDropTarget({ class: ctx.propUi.value?.nodeDropTarget }));
70
+ return classes;
71
+ }
72
+ </script>
73
+
74
+ <template>
75
+ <div
76
+ :data-slot="'node'"
77
+ :data-node-id="node.data.id"
78
+ role="treeitem"
79
+ :aria-expanded="hasChildren ? isExpanded : void 0"
80
+ :aria-selected="isSelected"
81
+ :aria-level="node.depth + 1"
82
+ :aria-setsize="node.siblingCount"
83
+ :aria-posinset="node.indexInSiblings + 1"
84
+ :aria-label="`${node.data.name}${node.data.title ? ', ' + node.data.title : ''}`"
85
+ :tabindex="isFocused ? 0 : -1"
86
+ :draggable="ctx.draggable.value && !!node.parent"
87
+ :style="[nodeStyle, nodeColor ? { '--node-color': nodeColor === 'neutral' ? 'var(--ui-bg-inverted)' : `var(--ui-${nodeColor})` } : void 0]"
88
+ :class="nodeClasses()"
89
+ @click="ctx.handleNodeClick(node, $event)"
90
+ @keydown="ctx.onKeydown"
91
+ @dragstart="ctx.onDragStart(node.data.id, $event)"
92
+ @dragover="ctx.onDragOver(node.data.id, $event)"
93
+ @dragleave="ctx.onDragLeave($event)"
94
+ @drop="ctx.onDrop(node.data.id, $event)"
95
+ @dragend="ctx.onDragEnd($event)"
96
+ >
97
+ <slot name="avatar" :node="node.data">
98
+ <img v-if="node.data.avatar" :src="node.data.avatar" :alt="node.data.name" :class="ctx.ui.value.nodeAvatar({ class: ctx.propUi.value?.nodeAvatar })" />
99
+ <div v-else-if="node.data.icon" :class="ctx.ui.value.nodeIcon({ class: ctx.propUi.value?.nodeIcon })">
100
+ <UIcon :name="node.data.icon" />
101
+ </div>
102
+ </slot>
103
+
104
+ <div :class="ctx.ui.value.nodeContent({ class: ctx.propUi.value?.nodeContent })">
105
+ <slot name="label" :node="node.data">
106
+ <span :class="ctx.ui.value.nodeName({ class: ctx.propUi.value?.nodeName })">{{ node.data.name }}</span>
107
+ </slot>
108
+ <slot name="description" :node="node.data">
109
+ <span v-if="node.data.title" :class="ctx.ui.value.nodeTitle({ class: ctx.propUi.value?.nodeTitle })">{{ node.data.title }}</span>
110
+ </slot>
111
+ </div>
112
+
113
+ <!-- Collapse toggle -->
114
+ <button
115
+ v-if="hasChildren"
116
+ :data-slot="'collapseToggle'"
117
+ :style="togglePosition"
118
+ :class="ctx.ui.value.collapseToggle({ class: ctx.propUi.value?.collapseToggle })"
119
+ :aria-label="isExpanded ? 'Collapse' : `Expand (${ctx.getDescendantCount(node.data.id)} members)`"
120
+ @click.stop="ctx.toggleExpand(node.data.id)"
121
+ >
122
+ <slot name="collapse-toggle" :expanded="isExpanded" :count="ctx.getDescendantCount(node.data.id)" :node="node.data">
123
+ <span :class="ctx.ui.value.descendantBadge({ class: ctx.propUi.value?.descendantBadge })">
124
+ {{ isExpanded ? "\u2212" : "+" }}
125
+ </span>
126
+ </slot>
127
+ </button>
128
+ </div>
129
+ </template>
@@ -0,0 +1,30 @@
1
+ import type { OrgChartTreeNode } from "../../types/org-chart.js";
2
+ export interface OrgChartNodeProps {
3
+ node: OrgChartTreeNode;
4
+ }
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
7
+ declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<OrgChartNodeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<OrgChartNodeProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
8
+ avatar?: (props: {
9
+ node: import("../../types/org-chart.js").OrgChartNode;
10
+ }) => any;
11
+ } & {
12
+ label?: (props: {
13
+ node: import("../../types/org-chart.js").OrgChartNode;
14
+ }) => any;
15
+ } & {
16
+ description?: (props: {
17
+ node: import("../../types/org-chart.js").OrgChartNode;
18
+ }) => any;
19
+ } & {
20
+ 'collapse-toggle'?: (props: {
21
+ expanded: boolean;
22
+ count: number;
23
+ node: import("../../types/org-chart.js").OrgChartNode;
24
+ }) => any;
25
+ }>;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };