@wipco/sdui 0.19.0 → 0.19.2

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.
@@ -1,4 +1,4 @@
1
- import { DateRangePicker } from './chunk-L6HNC4B5.js';
1
+ import { DateRangePicker } from './chunk-IY7SMV6V.js';
2
2
  import { SegmentedControl, Select } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
4
  import { useState, useMemo } from 'react';
@@ -1,5 +1,5 @@
1
- import { resolveTreeNodes, TreeView } from './chunk-5H5DSIQW.js';
2
- import { OverlayLayer } from './chunk-L6HNC4B5.js';
1
+ import { resolveTreeNodes, TreeView } from './chunk-TUR4EBKX.js';
2
+ import { OverlayLayer } from './chunk-IY7SMV6V.js';
3
3
  import { Field, Dialog, Icon, Button, Input } from './chunk-WIDDHR7L.js';
4
4
  import { boxed } from './chunk-SAN4IX6N.js';
5
5
  import { useState, useMemo, useEffect } from 'react';
@@ -1,4 +1,4 @@
1
- import { DateRangePicker } from './chunk-L6HNC4B5.js';
1
+ import { useOverlayLayer, DateRangePicker } from './chunk-IY7SMV6V.js';
2
2
  import { Input, Button, IconButton, Tag, Field, Checkbox } from './chunk-WIDDHR7L.js';
3
3
  import { useRef, useEffect, useState, useMemo } from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -21,16 +21,12 @@ function Popover({
21
21
  if (event.target instanceof Node && hostRef.current?.contains(event.target)) return;
22
22
  closeRef.current();
23
23
  };
24
- const closeOnEscape = (event) => {
25
- if (event.key === "Escape") closeRef.current();
26
- };
27
24
  document.addEventListener("pointerdown", closeOnOutside);
28
- document.addEventListener("keydown", closeOnEscape);
29
25
  return () => {
30
26
  document.removeEventListener("pointerdown", closeOnOutside);
31
- document.removeEventListener("keydown", closeOnEscape);
32
27
  };
33
28
  }, [open]);
29
+ useOverlayLayer(open, () => closeRef.current(), hostRef);
34
30
  return (
35
31
  // 트리거와 패널을 함께 감싸는 기준 상자 — .erp-popover-host의 position:relative가
36
32
  // 패널 absolute의 기준이 된다
@@ -365,20 +365,71 @@ function Calendar({
365
365
  })
366
366
  ] }) });
367
367
  }
368
- function useDismiss(open, hostRef, onDismiss) {
368
+ function useDismiss(open, hostRef, popRef, onDismiss) {
369
369
  useEffect(() => {
370
370
  if (!open) return;
371
371
  const handlePointerDown = (event) => {
372
- if (event.target instanceof Node && hostRef.current?.contains(event.target)) return;
372
+ const target = event.target;
373
+ if (target instanceof Node && (hostRef.current?.contains(target) || popRef.current?.contains(target))) return;
373
374
  onDismiss("outside");
374
375
  };
375
376
  document.addEventListener("pointerdown", handlePointerDown);
376
377
  return () => {
377
378
  document.removeEventListener("pointerdown", handlePointerDown);
378
379
  };
379
- }, [open, hostRef, onDismiss]);
380
+ }, [open, hostRef, popRef, onDismiss]);
380
381
  useOverlayLayer(open, () => onDismiss("escape"), hostRef);
381
382
  }
383
+ var CALENDAR_HEIGHT = 340;
384
+ var ANCHOR_GAP = 8;
385
+ var VIEWPORT_EDGE = 8;
386
+ function anchorTo(host) {
387
+ if (!host || typeof window === "undefined") return null;
388
+ const rect = host.getBoundingClientRect();
389
+ const below = window.innerHeight - rect.bottom;
390
+ const up = below < CALENDAR_HEIGHT && rect.top > below;
391
+ return {
392
+ left: rect.left,
393
+ top: up ? void 0 : rect.bottom + ANCHOR_GAP,
394
+ bottom: up ? window.innerHeight - rect.top + ANCHOR_GAP : void 0,
395
+ minWidth: rect.width
396
+ };
397
+ }
398
+ function usePopoverAnchor(open, hostRef, popRef) {
399
+ const [anchor, setAnchor] = useState(null);
400
+ useLayoutEffect(() => {
401
+ if (!open) {
402
+ setAnchor(null);
403
+ return;
404
+ }
405
+ const place = () => setAnchor(anchorTo(hostRef.current));
406
+ place();
407
+ window.addEventListener("scroll", place, true);
408
+ window.addEventListener("resize", place);
409
+ return () => {
410
+ window.removeEventListener("scroll", place, true);
411
+ window.removeEventListener("resize", place);
412
+ };
413
+ }, [open, hostRef]);
414
+ useLayoutEffect(() => {
415
+ const el = popRef.current;
416
+ if (!open || !el || !anchor) return;
417
+ const overflow = el.getBoundingClientRect().right - (window.innerWidth - VIEWPORT_EDGE);
418
+ if (overflow > 1) {
419
+ setAnchor((prev) => prev ? { ...prev, left: Math.max(VIEWPORT_EDGE, prev.left - overflow) } : prev);
420
+ }
421
+ }, [open, anchor, popRef]);
422
+ return anchor;
423
+ }
424
+ function anchorStyle(anchor) {
425
+ if (!anchor) return void 0;
426
+ return { left: anchor.left, top: anchor.top, bottom: anchor.bottom, minWidth: anchor.minWidth };
427
+ }
428
+ function portal(anchor, container, node) {
429
+ if (!anchor) return null;
430
+ const root = container ?? getOverlayRoot();
431
+ return root ? createPortal(node, root) : node;
432
+ }
382
433
  function DateInput({
383
434
  inputRef,
384
435
  value,
@@ -460,7 +511,9 @@ function DatePickerImpl({
460
511
  setOpen(false);
461
512
  if (reason === "escape") inputRef.current?.focus();
462
513
  }, []);
463
- useDismiss(open, hostRef, dismiss);
514
+ useDismiss(open, hostRef, popRef, dismiss);
515
+ const anchor = usePopoverAnchor(open, hostRef, popRef);
516
+ const overlayContainer = React.useContext(OverlayContainerContext);
464
517
  const isInvalid = Boolean(invalid);
465
518
  const commit = (next) => {
466
519
  if (!isControlled) setInnerValue(next);
@@ -499,8 +552,9 @@ function DatePickerImpl({
499
552
  };
500
553
  const handleBlur = (event) => {
501
554
  const next = event.relatedTarget;
502
- if (next instanceof Node && hostRef.current?.contains(next)) return;
555
+ if (next instanceof Node && (hostRef.current?.contains(next) || popRef.current?.contains(next))) return;
503
556
  if (text !== fieldText) setText(fieldText);
557
+ setOpen(false);
504
558
  };
505
559
  return /* @__PURE__ */ jsxs("div", { ref: hostRef, className: "wp-dp-host", onBlur: handleBlur, children: [
506
560
  /* @__PURE__ */ jsx(HoistedStyle, { id: "wp-datepicker", css: DP_CSS }),
@@ -523,27 +577,41 @@ function DatePickerImpl({
523
577
  }
524
578
  }
525
579
  ),
526
- open ? /* @__PURE__ */ jsx("div", { ref: popRef, className: "wp-dp-pop", role: "dialog", "aria-label": "\uB0A0\uC9DC \uC120\uD0DD \uB2EC\uB825", children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
527
- Calendar,
528
- {
529
- monthCount: 1,
530
- minDate,
531
- maxDate,
532
- focusDate,
533
- onFocusDateChange: setFocusDate,
534
- autoFocus: grabFocus,
535
- dayState: (date) => ({ selected: isSameDay(date, selectedDate) }),
536
- onPick: (date) => {
537
- const ymd = formatYmd(date);
538
- const time = withTime ? splitDateTime(text)[1] : "";
539
- const next = withTime ? `${ymd}T${isValidHm(time) ? time : "00:00"}` : ymd;
540
- setText(toFieldText(next, withTime));
541
- commit(next);
542
- setOpen(false);
543
- inputRef.current?.focus();
580
+ portal(
581
+ anchor,
582
+ overlayContainer,
583
+ /* @__PURE__ */ jsx(
584
+ "div",
585
+ {
586
+ ref: popRef,
587
+ className: "wp-dp-pop",
588
+ style: anchorStyle(anchor),
589
+ role: "dialog",
590
+ "aria-label": "\uB0A0\uC9DC \uC120\uD0DD \uB2EC\uB825",
591
+ children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
592
+ Calendar,
593
+ {
594
+ monthCount: 1,
595
+ minDate,
596
+ maxDate,
597
+ focusDate,
598
+ onFocusDateChange: setFocusDate,
599
+ autoFocus: grabFocus,
600
+ dayState: (date) => ({ selected: isSameDay(date, selectedDate) }),
601
+ onPick: (date) => {
602
+ const ymd = formatYmd(date);
603
+ const time = withTime ? splitDateTime(text)[1] : "";
604
+ const next = withTime ? `${ymd}T${isValidHm(time) ? time : "00:00"}` : ymd;
605
+ setText(toFieldText(next, withTime));
606
+ commit(next);
607
+ setOpen(false);
608
+ inputRef.current?.focus();
609
+ }
610
+ }
611
+ ) })
544
612
  }
545
- }
546
- ) }) }) : null
613
+ )
614
+ )
547
615
  ] });
548
616
  }
549
617
  function DateRangePickerImpl({
@@ -584,7 +652,9 @@ function DateRangePickerImpl({
584
652
  setOpen(false);
585
653
  if (reason === "escape") (end === "to" ? toRef : fromRef).current?.focus();
586
654
  }, [end]);
587
- useDismiss(open, hostRef, dismiss);
655
+ useDismiss(open, hostRef, popRef, dismiss);
656
+ const anchor = usePopoverAnchor(open, hostRef, popRef);
657
+ const overlayContainer = React.useContext(OverlayContainerContext);
588
658
  const isInvalid = Boolean(invalid);
589
659
  const commit = (nextFrom, nextTo) => {
590
660
  const next = { from: nextFrom || void 0, to: nextTo || void 0 };
@@ -636,9 +706,10 @@ function DateRangePickerImpl({
636
706
  };
637
707
  const handleBlur = (event) => {
638
708
  const next = event.relatedTarget;
639
- if (next instanceof Node && hostRef.current?.contains(next)) return;
709
+ if (next instanceof Node && (hostRef.current?.contains(next) || popRef.current?.contains(next))) return;
640
710
  if (fromText !== fromValue) setFromText(fromValue);
641
711
  if (toText !== toValue) setToText(toValue);
712
+ setOpen(false);
642
713
  };
643
714
  const pick = (date) => {
644
715
  const ymd = formatYmd(date);
@@ -706,36 +777,50 @@ function DateRangePickerImpl({
706
777
  }
707
778
  )
708
779
  ] }),
709
- open ? /* @__PURE__ */ jsx("div", { ref: popRef, className: "wp-dp-pop wp-dp-pop--wide", role: "dialog", "aria-label": "\uAE30\uAC04 \uC120\uD0DD \uB2EC\uB825", children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
710
- Calendar,
711
- {
712
- monthCount: 2,
713
- minDate,
714
- maxDate,
715
- focusDate,
716
- onFocusDateChange: setFocusDate,
717
- autoFocus: grabFocus,
718
- dayState: (date) => {
719
- const t = date.getTime();
720
- const start = fromDate?.getTime();
721
- const end2 = toDate?.getTime();
722
- if (start !== void 0 && end2 !== void 0 && t > start && t < end2) return { rangeMiddle: true };
723
- return {
724
- rangeStart: start !== void 0 && t === start && end2 !== void 0,
725
- rangeEnd: end2 !== void 0 && t === end2,
726
- // 한쪽 끝만 정해진 상태는 단일 선택처럼 보인다
727
- selected: start !== void 0 && t === start && end2 === void 0 || end2 !== void 0 && t === end2 && start === void 0 || void 0
728
- };
729
- },
730
- onPick: pick
731
- }
732
- ) }) }) : null
780
+ portal(
781
+ anchor,
782
+ overlayContainer,
783
+ /* @__PURE__ */ jsx(
784
+ "div",
785
+ {
786
+ ref: popRef,
787
+ className: "wp-dp-pop wp-dp-pop--wide",
788
+ style: anchorStyle(anchor),
789
+ role: "dialog",
790
+ "aria-label": "\uAE30\uAC04 \uC120\uD0DD \uB2EC\uB825",
791
+ children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
792
+ Calendar,
793
+ {
794
+ monthCount: 2,
795
+ minDate,
796
+ maxDate,
797
+ focusDate,
798
+ onFocusDateChange: setFocusDate,
799
+ autoFocus: grabFocus,
800
+ dayState: (date) => {
801
+ const t = date.getTime();
802
+ const start = fromDate?.getTime();
803
+ const end2 = toDate?.getTime();
804
+ if (start !== void 0 && end2 !== void 0 && t > start && t < end2) return { rangeMiddle: true };
805
+ return {
806
+ rangeStart: start !== void 0 && t === start && end2 !== void 0,
807
+ rangeEnd: end2 !== void 0 && t === end2,
808
+ // 한쪽 끝만 정해진 상태는 단일 선택처럼 보인다
809
+ selected: start !== void 0 && t === start && end2 === void 0 || end2 !== void 0 && t === end2 && start === void 0 || void 0
810
+ };
811
+ },
812
+ onPick: pick
813
+ }
814
+ ) })
815
+ }
816
+ )
817
+ )
733
818
  ] });
734
819
  }
735
820
  var DP_CSS = `
736
821
  .wp-dp-host{position:relative}
737
- .wp-dp-pop{position:absolute;top:calc(100% + var(--wp-space-2));left:0;min-width:100%;width:max-content;background:var(--wp-surface-card);border:1px solid var(--wp-border-subtle);border-radius:var(--wp-radius-lg);box-shadow:var(--wp-shadow-lg);z-index:300}
738
- .wp-dp-pop--wide{max-width:min(640px,90vw)}
822
+ .wp-dp-pop{position:fixed;width:max-content;max-width:min(92vw,400px);background:var(--wp-surface-card);border:1px solid var(--wp-border-subtle);border-radius:var(--wp-radius-lg);box-shadow:var(--wp-shadow-lg);z-index:var(--wp-z-dialog);pointer-events:auto}
823
+ .wp-dp-pop--wide{max-width:min(92vw,720px)}
739
824
  .wp-dp-pop__body{padding:var(--wp-space-4);max-height:60vh;overflow:auto}
740
825
  .wp-dp-range{display:flex;align-items:center;gap:var(--wp-space-1)}
741
826
  .wp-dp-range>*{flex:1 1 0;min-width:0}
@@ -1,5 +1,5 @@
1
- import { includesLooseSearch } from './chunk-VAXBRGDZ.js';
2
- import { OverlayLayer } from './chunk-L6HNC4B5.js';
1
+ import { includesLooseSearch } from './chunk-GUFIEWW2.js';
2
+ import { OverlayLayer } from './chunk-IY7SMV6V.js';
3
3
  import { Button, Dialog, Input, Tag, Checkbox } from './chunk-WIDDHR7L.js';
4
4
  import { boxed } from './chunk-SAN4IX6N.js';
5
5
  import React, { useMemo, useState, useEffect } from 'react';
@@ -1,4 +1,4 @@
1
- import { buildCascadingTree } from './chunk-VAXBRGDZ.js';
1
+ import { buildCascadingTree } from './chunk-GUFIEWW2.js';
2
2
  import { Input, IconButton, EmptyState, Icon, Badge } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
4
  import React, { useMemo, useState, useRef, useEffect } from 'react';
@@ -1,4 +1,4 @@
1
- import { includesLooseSearch } from './chunk-VAXBRGDZ.js';
1
+ import { includesLooseSearch } from './chunk-GUFIEWW2.js';
2
2
  import { Icon, Button, Input, Spinner } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
4
  import { useId, useRef, useState, useEffect, useMemo } from 'react';
package/dist/index.js CHANGED
@@ -2,10 +2,10 @@ import { DEV, isSafeNavigationTarget, useSduiAdapter, hostFetchOf, useSduiSandbo
2
2
  export { defaultAdapter, useSduiAssetResolver, useSduiSandbox } from './chunk-WGRB5UL4.js';
3
3
  import { ImageViewer } from './chunk-THEP3VWY.js';
4
4
  export { ImageViewer } from './chunk-THEP3VWY.js';
5
- import { normalizeSearchFields, searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-VAXBRGDZ.js';
6
- export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-VAXBRGDZ.js';
7
- import { HoistedStyle, DateRangePicker, DatePicker, OverlayLayer } from './chunk-L6HNC4B5.js';
8
- export { DatePicker, DateRangePicker, OverlayContainerContext, OverlayLayer, getOverlayRoot, useOverlayLayer } from './chunk-L6HNC4B5.js';
5
+ import { normalizeSearchFields, searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-GUFIEWW2.js';
6
+ export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-GUFIEWW2.js';
7
+ import { HoistedStyle, DateRangePicker, DatePicker, OverlayLayer } from './chunk-IY7SMV6V.js';
8
+ export { DatePicker, DateRangePicker, OverlayContainerContext, OverlayLayer, getOverlayRoot, useOverlayLayer } from './chunk-IY7SMV6V.js';
9
9
  import { EmptyState, Button, Checkbox, SegmentedControl, Spinner, Select, Pagination, Icon, Card, Badge, ProgressBar, Tag, Toast, Textarea, Tabs, Table, Switch, StatCard, Input, IconButton, Field, Alert, warnOnce, Dialog } from './chunk-WIDDHR7L.js';
10
10
  export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip } from './chunk-WIDDHR7L.js';
11
11
  import { boxed, mergeStyle, containerLayoutStyle, joinClass, columnsClass, typographyStyle, LAYOUT_CSS, childLayoutFrom, CHILD_LAYOUT_PROPS } from './chunk-SAN4IX6N.js';
package/dist/rich.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useSduiAssetResolver } from './chunk-WGRB5UL4.js';
2
- import { HoistedStyle } from './chunk-L6HNC4B5.js';
3
- export { DatePicker, DateRangePicker } from './chunk-L6HNC4B5.js';
2
+ import { HoistedStyle } from './chunk-IY7SMV6V.js';
3
+ export { DatePicker, DateRangePicker } from './chunk-IY7SMV6V.js';
4
4
  import { Spinner, EmptyState } from './chunk-WIDDHR7L.js';
5
5
  import './chunk-SAN4IX6N.js';
6
6
  import { useRef, useCallback, useMemo, useState, useEffect, useLayoutEffect } from 'react';
@@ -1,5 +1,5 @@
1
- export { AutocompleteField, toAutocompleteOptions } from '../chunk-6KGO2PO4.js';
2
- import '../chunk-VAXBRGDZ.js';
3
- import '../chunk-L6HNC4B5.js';
1
+ export { AutocompleteField, toAutocompleteOptions } from '../chunk-YKROA4XK.js';
2
+ import '../chunk-GUFIEWW2.js';
3
+ import '../chunk-IY7SMV6V.js';
4
4
  import '../chunk-WIDDHR7L.js';
5
5
  import '../chunk-SAN4IX6N.js';
@@ -1,4 +1,4 @@
1
- export { PeriodFilter } from '../chunk-ACZHPPGA.js';
2
- import '../chunk-L6HNC4B5.js';
1
+ export { PeriodFilter } from '../chunk-44VLH3I2.js';
2
+ import '../chunk-IY7SMV6V.js';
3
3
  import '../chunk-WIDDHR7L.js';
4
4
  import '../chunk-SAN4IX6N.js';
@@ -1,5 +1,5 @@
1
- export { SearchableMultiPicker } from '../chunk-LDVPLJ3S.js';
2
- import '../chunk-VAXBRGDZ.js';
3
- import '../chunk-L6HNC4B5.js';
1
+ export { SearchableMultiPicker } from '../chunk-J5QWCUDJ.js';
2
+ import '../chunk-GUFIEWW2.js';
3
+ import '../chunk-IY7SMV6V.js';
4
4
  import '../chunk-WIDDHR7L.js';
5
5
  import '../chunk-SAN4IX6N.js';
@@ -1,6 +1,6 @@
1
- export { TreePicker } from '../chunk-4IJGZ2TV.js';
2
- import '../chunk-5H5DSIQW.js';
3
- import '../chunk-VAXBRGDZ.js';
4
- import '../chunk-L6HNC4B5.js';
1
+ export { TreePicker } from '../chunk-F5BAER4V.js';
2
+ import '../chunk-TUR4EBKX.js';
3
+ import '../chunk-GUFIEWW2.js';
4
+ import '../chunk-IY7SMV6V.js';
5
5
  import '../chunk-WIDDHR7L.js';
6
6
  import '../chunk-SAN4IX6N.js';
@@ -1,5 +1,5 @@
1
- export { TreeView, buildTreeNodes, pruneExcluded, resolveTreeNodes } from '../chunk-5H5DSIQW.js';
2
- import '../chunk-VAXBRGDZ.js';
3
- import '../chunk-L6HNC4B5.js';
1
+ export { TreeView, buildTreeNodes, pruneExcluded, resolveTreeNodes } from '../chunk-TUR4EBKX.js';
2
+ import '../chunk-GUFIEWW2.js';
3
+ import '../chunk-IY7SMV6V.js';
4
4
  import '../chunk-WIDDHR7L.js';
5
5
  import '../chunk-SAN4IX6N.js';
@@ -1,5 +1,5 @@
1
- import { SearchableMultiPicker } from '../chunk-LDVPLJ3S.js';
2
- export { SearchableMultiPicker } from '../chunk-LDVPLJ3S.js';
1
+ import { SearchableMultiPicker } from '../chunk-J5QWCUDJ.js';
2
+ export { SearchableMultiPicker } from '../chunk-J5QWCUDJ.js';
3
3
  import { SecureScreen } from '../chunk-IIRENCDS.js';
4
4
  export { SecureScreen } from '../chunk-IIRENCDS.js';
5
5
  import { StackedMeter } from '../chunk-BMZKZGJF.js';
@@ -12,10 +12,10 @@ import { TagMultiSelect } from '../chunk-QDEZXA34.js';
12
12
  export { TagMultiSelect } from '../chunk-QDEZXA34.js';
13
13
  import { Timeline } from '../chunk-EFYEOT47.js';
14
14
  export { Timeline } from '../chunk-EFYEOT47.js';
15
- import { TreePicker } from '../chunk-4IJGZ2TV.js';
16
- export { TreePicker } from '../chunk-4IJGZ2TV.js';
17
- import { TreeView } from '../chunk-5H5DSIQW.js';
18
- export { TreeView, buildTreeNodes } from '../chunk-5H5DSIQW.js';
15
+ import { TreePicker } from '../chunk-F5BAER4V.js';
16
+ export { TreePicker } from '../chunk-F5BAER4V.js';
17
+ import { TreeView } from '../chunk-TUR4EBKX.js';
18
+ export { TreeView, buildTreeNodes } from '../chunk-TUR4EBKX.js';
19
19
  import { EventCalendar } from '../chunk-C3JY6GA3.js';
20
20
  export { EventCalendar } from '../chunk-C3JY6GA3.js';
21
21
  import { ImageLightbox } from '../chunk-XPBZMECW.js';
@@ -28,14 +28,14 @@ import { LiveClock } from '../chunk-Z3WGIFJP.js';
28
28
  export { LiveClock } from '../chunk-Z3WGIFJP.js';
29
29
  import { OrgChart } from '../chunk-QWJ3OBBL.js';
30
30
  export { OrgChart } from '../chunk-QWJ3OBBL.js';
31
- import { PeriodFilter } from '../chunk-ACZHPPGA.js';
32
- export { PeriodFilter } from '../chunk-ACZHPPGA.js';
31
+ import { PeriodFilter } from '../chunk-44VLH3I2.js';
32
+ export { PeriodFilter } from '../chunk-44VLH3I2.js';
33
33
  import { PrintSheet } from '../chunk-MYJ2KEIP.js';
34
34
  export { PrintSheet } from '../chunk-MYJ2KEIP.js';
35
35
  import '../chunk-THEP3VWY.js';
36
- export { AutocompleteField, toAutocompleteOptions } from '../chunk-6KGO2PO4.js';
37
- import '../chunk-VAXBRGDZ.js';
38
- import '../chunk-L6HNC4B5.js';
36
+ export { AutocompleteField, toAutocompleteOptions } from '../chunk-YKROA4XK.js';
37
+ import '../chunk-GUFIEWW2.js';
38
+ import '../chunk-IY7SMV6V.js';
39
39
  import { ColumnBoard } from '../chunk-C4JRSZGS.js';
40
40
  export { ColumnBoard } from '../chunk-C4JRSZGS.js';
41
41
  import { DiffView } from '../chunk-LDJ2CFFH.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipco/sdui",
3
- "version": "0.19.0",
3
+ "version": "0.19.2",
4
4
  "description": "WIPCO 서버 주도 UI(SDUI) 렌더러 — JSON 페이지 스펙을 React 컴포넌트로 렌더링",
5
5
  "keywords": [
6
6
  "sdui",