@wipco/sdui 0.2.0 → 0.3.0

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +27 -0
  3. package/dist/chunk-4SU2KYPU.js +59 -0
  4. package/dist/chunk-56KKWLNI.js +186 -0
  5. package/dist/chunk-7Y4J7EOK.js +115 -0
  6. package/dist/chunk-APCXOCAO.js +110 -0
  7. package/dist/chunk-AROOQ5W6.js +119 -0
  8. package/dist/chunk-DGPRX4MU.js +251 -0
  9. package/dist/chunk-IL2KS4WS.js +25 -0
  10. package/dist/chunk-KADFN76X.js +541 -0
  11. package/dist/chunk-KBHI3IUR.js +40 -0
  12. package/dist/chunk-LZJTKVMO.js +767 -0
  13. package/dist/chunk-MOIU7MUA.js +282 -0
  14. package/dist/chunk-MSAV4J4I.js +77 -0
  15. package/dist/chunk-OOHHW4K4.js +159 -0
  16. package/dist/chunk-Q6SBH63R.js +190 -0
  17. package/dist/chunk-QZQDHSMD.js +78 -0
  18. package/dist/chunk-RH7ESUE6.js +309 -0
  19. package/dist/chunk-SEBPBUZR.js +260 -0
  20. package/dist/chunk-USKRM22W.js +39 -0
  21. package/dist/chunk-WNYWTFGW.js +61 -0
  22. package/dist/chunk-WVRCIVAD.js +72 -0
  23. package/dist/chunk-YJMD6MOE.js +404 -0
  24. package/dist/chunk-ZNITJ4KK.js +433 -0
  25. package/dist/chunk-ZQR3ULVH.js +193 -0
  26. package/dist/{chunk-QJHD6HVQ.js → chunk-ZUCI34QY.js} +106 -390
  27. package/dist/index.d.ts +306 -53
  28. package/dist/index.js +276 -720
  29. package/dist/meta.d.ts +8 -0
  30. package/dist/meta.js +147 -8
  31. package/dist/rich.js +3 -2
  32. package/dist/styles.css +246 -0
  33. package/dist/widgets/AutocompleteField.d.ts +96 -0
  34. package/dist/widgets/AutocompleteField.js +3 -0
  35. package/dist/widgets/ColumnBoard.d.ts +47 -0
  36. package/dist/widgets/ColumnBoard.js +2 -0
  37. package/dist/widgets/DiffView.d.ts +30 -0
  38. package/dist/widgets/DiffView.js +2 -0
  39. package/dist/widgets/Disclosure.d.ts +20 -0
  40. package/dist/widgets/Disclosure.js +2 -0
  41. package/dist/widgets/EventCalendar.d.ts +59 -0
  42. package/dist/widgets/EventCalendar.js +2 -0
  43. package/dist/widgets/ImageLightbox.d.ts +25 -0
  44. package/dist/widgets/ImageLightbox.js +2 -0
  45. package/dist/widgets/InlineEdit.d.ts +23 -0
  46. package/dist/widgets/InlineEdit.js +2 -0
  47. package/dist/widgets/JsonField.d.ts +24 -0
  48. package/dist/widgets/JsonField.js +2 -0
  49. package/dist/widgets/LiveClock.d.ts +21 -0
  50. package/dist/widgets/LiveClock.js +1 -0
  51. package/dist/widgets/OrgChart.d.ts +32 -0
  52. package/dist/widgets/OrgChart.js +2 -0
  53. package/dist/widgets/PeriodFilter.d.ts +48 -0
  54. package/dist/widgets/PeriodFilter.js +2 -0
  55. package/dist/widgets/PrintSheet.d.ts +23 -0
  56. package/dist/widgets/PrintSheet.js +2 -0
  57. package/dist/widgets/SearchableMultiPicker.d.ts +29 -0
  58. package/dist/widgets/SearchableMultiPicker.js +3 -0
  59. package/dist/widgets/SecureScreen.d.ts +25 -0
  60. package/dist/widgets/SecureScreen.js +2 -0
  61. package/dist/widgets/StackedMeter.d.ts +26 -0
  62. package/dist/widgets/StackedMeter.js +1 -0
  63. package/dist/widgets/Strip.d.ts +20 -0
  64. package/dist/widgets/Strip.js +1 -0
  65. package/dist/widgets/SummaryTable.d.ts +31 -0
  66. package/dist/widgets/SummaryTable.js +1 -0
  67. package/dist/widgets/TagMultiSelect.d.ts +25 -0
  68. package/dist/widgets/TagMultiSelect.js +2 -0
  69. package/dist/widgets/Timeline.d.ts +30 -0
  70. package/dist/widgets/Timeline.js +3 -0
  71. package/dist/widgets/TreePicker.d.ts +21 -0
  72. package/dist/widgets/TreePicker.js +3 -0
  73. package/dist/widgets/TreeView.d.ts +26 -0
  74. package/dist/widgets/TreeView.js +2 -0
  75. package/dist/widgets/index.d.ts +76 -0
  76. package/dist/widgets/index.js +69 -0
  77. package/package.json +93 -3
package/dist/index.d.ts CHANGED
@@ -402,6 +402,102 @@ interface DialogProps extends Omit<React__default.HTMLAttributes<HTMLDivElement>
402
402
  }
403
403
  /** 모달 본체. 오버레이가 가장 가까운 포지셔닝 조상을 채운다 — SDUI에서는 SduiDialog 래퍼가 뷰포트에 고정한다. */
404
404
  declare function Dialog({ title, subtitle, icon, tone, size, footer, onClose, children, className, ...rest }: DialogProps): React__default.JSX.Element;
405
+ /** 배타 뷰 전환 스위치. 항목 2~4개까지, 그보다 많으면 Select다. */
406
+ interface SegmentedItem {
407
+ value: string;
408
+ label?: string;
409
+ /** 앞에 붙일 아이콘 이름 */
410
+ icon?: string;
411
+ }
412
+ interface SegmentedControlProps extends Omit<React__default.HTMLAttributes<HTMLDivElement>, 'onChange'> {
413
+ items: SegmentedItem[];
414
+ value: string;
415
+ onChange?: (value: string) => void;
416
+ /** md(24px 항목, 기본) · lg(30px) */
417
+ size?: 'md' | 'lg';
418
+ className?: string;
419
+ }
420
+ /**
421
+ * 목록/카드, 2D/3D, 일/주/월처럼 하나만 고르는 뷰 전환.
422
+ *
423
+ * `search/SearchResults.tsx`가 "라이브러리에 SegmentedControl이 없다"는 이유로
424
+ * 안에 `ViewToggle` 사본을 들고 있었다. 이 컴포넌트가 그 사본의 원본이다.
425
+ */
426
+ declare function SegmentedControl({ items, value, onChange, size, className, ...rest }: SegmentedControlProps): React__default.JSX.Element;
427
+ /** 사람·팀·자산의 신원 표식. */
428
+ interface AvatarProps extends React__default.HTMLAttributes<HTMLSpanElement> {
429
+ /** 이니셜과 title에 쓰인다 */
430
+ name?: string;
431
+ /** 이미지 URL — 있으면 이니셜을 대신한다 */
432
+ src?: string;
433
+ /** hex(기본, 심볼 실루엣) · round(사람) · square(자산) */
434
+ shape?: 'hex' | 'round' | 'square';
435
+ /** xs 20 · sm 24 · md 28(기본) · lg 36 · xl 48 px */
436
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
437
+ /** brand 네이비(기본) · muted 회색 · accent 레드 */
438
+ tone?: 'brand' | 'muted' | 'accent';
439
+ className?: string;
440
+ }
441
+ /** 사람/자산 표식. 기본은 육각형 — 심볼의 실루엣이다. */
442
+ declare function Avatar({ name, src, shape, size, tone, className, ...rest }: AvatarProps): React__default.JSX.Element;
443
+ /** 프로젝트에서 개별 객체까지의 위치. 4단계를 넘으면 가운데를 접는다. */
444
+ interface BreadcrumbItem {
445
+ label: React__default.ReactNode;
446
+ href?: string;
447
+ icon?: string;
448
+ onClick?: () => void;
449
+ }
450
+ interface BreadcrumbProps extends React__default.HTMLAttributes<HTMLElement> {
451
+ items: BreadcrumbItem[];
452
+ className?: string;
453
+ }
454
+ /** 계보 표시. 마지막 항목은 현재 객체이므로 링크가 아니다. */
455
+ declare function Breadcrumb({ items, className, ...rest }: BreadcrumbProps): React__default.JSX.Element;
456
+ /** 후보가 전부 보이는 배타 선택. 5개 이상이면 Select다. */
457
+ interface RadioProps extends React__default.InputHTMLAttributes<HTMLInputElement> {
458
+ label?: React__default.ReactNode;
459
+ description?: React__default.ReactNode;
460
+ disabled?: boolean;
461
+ }
462
+ /** 2~4개 후보를 다 보여 주는 라디오. Checkbox와 마크업을 공유한다(.wp-check). */
463
+ declare function Radio({ label, description, disabled, className, ...rest }: RadioProps): React__default.JSX.Element;
464
+ /** 주 내비게이션 목록. 활성 항목에 빨간 에지 마커가 붙는다. */
465
+ interface SidebarNavItem {
466
+ value: string;
467
+ label: React__default.ReactNode;
468
+ icon?: string;
469
+ meta?: React__default.ReactNode;
470
+ href?: string;
471
+ }
472
+ interface SidebarNavSection {
473
+ label?: React__default.ReactNode;
474
+ items: SidebarNavItem[];
475
+ }
476
+ interface SidebarNavProps extends Omit<React__default.HTMLAttributes<HTMLElement>, 'onSelect'> {
477
+ sections: SidebarNavSection[];
478
+ value?: string;
479
+ onSelect?: (value: string) => void;
480
+ /** 아이콘만 남기는 56px 레일 */
481
+ collapsed?: boolean;
482
+ /** 흰 표면(설정 하위 내비) 위에 쓰는 밝은 변형 */
483
+ light?: boolean;
484
+ className?: string;
485
+ }
486
+ /** 네이비 사이드바의 주 내비게이션. 섹션 + 항목. */
487
+ declare function SidebarNav({ sections, value, onSelect, collapsed, light, className, ...rest }: SidebarNavProps): React__default.JSX.Element;
488
+ /** 아이콘 전용 컨트롤·잘린 값에 붙이는 hover/focus 힌트. */
489
+ interface TooltipProps extends React__default.HTMLAttributes<HTMLSpanElement> {
490
+ label: React__default.ReactNode;
491
+ /** 단축키 칩, 예: "⌘K" */
492
+ shortcut?: string;
493
+ placement?: 'top' | 'bottom' | 'left' | 'right';
494
+ /** 여러 줄 허용(최대 240px) */
495
+ wrap?: boolean;
496
+ children?: React__default.ReactNode;
497
+ className?: string;
498
+ }
499
+ /** hover 힌트. 트리거를 감싸며 위치는 CSS가 잡는다 — 포털을 쓰지 않는다. */
500
+ declare function Tooltip({ label, shortcut, placement, wrap, children, className, ...rest }: TooltipProps): React__default.JSX.Element;
405
501
 
406
502
  interface GridProps {
407
503
  /** wp-grid--N 프리셋 */
@@ -500,6 +596,10 @@ declare function Divider({ style }: {
500
596
  style?: React__default.CSSProperties;
501
597
  }): React__default.JSX.Element;
502
598
 
599
+ /** SduiRenderer가 제공하는 액션 디스패처. 레지스트리의 복합 컴포넌트가 선언적 액션을 실행할 때 쓴다. */
600
+ type SduiDispatch = (action: SduiAction, eventValue?: unknown) => void;
601
+ declare function useSduiDispatch(): SduiDispatch;
602
+
503
603
  /**
504
604
  * 목록 원격 조회 어댑터.
505
605
  *
@@ -661,6 +761,20 @@ interface SearchFilter {
661
761
  value: string;
662
762
  }[];
663
763
  }
764
+ /**
765
+ * 목록/카드 전환 버튼 한 칸.
766
+ *
767
+ * 예전에는 이 두 칸(`목록`/`카드`)이 코드에 박혀 있어 스펙이 라벨·아이콘·순서를
768
+ * 바꿀 수 없었고, `disableGrid`/`disableList`로 **끄는 것만** 가능했다.
769
+ * 이제 `views`로 목록 자체를 정할 수 있고, 두 disable 프롭은 그 축약형으로 남는다.
770
+ */
771
+ interface SearchViewItem {
772
+ value: 'grid' | 'list';
773
+ /** 생략 시 기본 아이콘 — list=list, grid=layout-grid */
774
+ icon?: string;
775
+ /** 생략 시 기본 라벨 — list=목록, grid=카드 */
776
+ label?: string;
777
+ }
664
778
  interface GridCardRow<T> {
665
779
  icon?: React__default.ReactNode | ((item: T) => React__default.ReactNode);
666
780
  label?: React__default.ReactNode | ((item: T) => React__default.ReactNode);
@@ -690,6 +804,14 @@ interface SearchResultsProps<T> {
690
804
  leftFilters?: SearchFilter[];
691
805
  rightFilters?: SearchFilter[];
692
806
  initialView?: 'grid' | 'list';
807
+ /**
808
+ * 노출할 보기 목록. 생략하면 목록/카드 두 칸이 기본값이고,
809
+ * 그때만 `disableGrid`/`disableList`가 목록을 깎는다(둘 다 오면 views가 이긴다).
810
+ * 한 칸만 남으면 전환 버튼 자체를 그리지 않는다.
811
+ */
812
+ views?: SearchViewItem[];
813
+ /** 페이지당 건수 선택지. 생략 시 [10, 20, 50, 100]. 첫 값이 기본 페이지 크기다. */
814
+ pageSizes?: number[];
693
815
  className?: string;
694
816
  /** 검색/필터/페이지 파라미터 (controlled) */
695
817
  searchParams: URLSearchParams;
@@ -713,9 +835,96 @@ interface SearchResultsProps<T> {
713
835
  */
714
836
  virtual?: boolean | number;
715
837
  }
838
+ /**
839
+ * 스펙이 준 페이지 크기 목록을 다듬는다 — 양의 정수만, 중복 제거, 오름차순.
840
+ * 쓸 값이 하나도 없으면 undefined를 돌려 기본 선택지를 쓰게 한다.
841
+ */
842
+ declare function normalizePageSizes(sizes: number[] | undefined): number[] | undefined;
716
843
  declare function SearchResults<T extends {
717
844
  id: string;
718
- }>({ item, columns, gridConfig, leftFilters, rightFilters, initialView, className, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields, searchPlaceholder, virtual, }: SearchResultsProps<T>): React__default.JSX.Element;
845
+ }>({ item, columns, gridConfig, leftFilters, rightFilters, initialView, views, pageSizes, className, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields, searchPlaceholder, virtual, }: SearchResultsProps<T>): React__default.JSX.Element;
846
+
847
+ /**
848
+ * 셀 표현 어휘 — 목록 컬럼의 셀과 카드 행의 값이 **같은 규칙**을 쓴다.
849
+ *
850
+ * 예전에는 스펙이 고를 수 있는 표현이 `badge` 하나뿐이었고 나머지는 `row[key]` 원문
851
+ * 출력이었다. 밑에 깔린 `SearchColumn.render`는 임의의 노드를 그릴 수 있는데 스펙에는
852
+ * 그 역량이 두 종류(원문/배지)로만 열려 있었다는 뜻이다. 여기서 그 구멍을 메운다.
853
+ *
854
+ * 규약 두 가지:
855
+ * - **모르는 type은 원문으로 강등한다.** 스펙은 신뢰할 수 없는 입력이고, 컬럼 하나 때문에
856
+ * 목록 전체가 비면 안 된다. 판별 유니언이라 새 type을 더해도 옛 스펙은 그대로 돈다.
857
+ * - **값을 해석하지 못하면 원문을 그대로 낸다.** ERP는 이미 서식된 문자열(`"12,400,000"`,
858
+ * `"2026-07-31 09:00"`)을 내려주는 자리가 많아, 파싱 실패를 빈칸으로 만들면 퇴행이다.
859
+ */
860
+
861
+ /** ProgressBar가 받는 톤 */
862
+ type MeterTone = 'brand' | 'success' | 'warning' | 'danger' | 'info';
863
+ /** 값을 그대로 출력한다. cell을 생략한 것과 같으며, 명시하고 싶을 때 쓴다. */
864
+ interface SduiTextCell {
865
+ type: 'text';
866
+ }
867
+ /** 값을 배지로. 톤은 값별 매핑(없는 값은 neutral). */
868
+ interface SduiBadgeCell {
869
+ type: 'badge';
870
+ toneMap?: Record<string, BadgeTone>;
871
+ }
872
+ /** 값을 태그로. 선행 점 색은 값별 매핑(CSS 색상 문자열). */
873
+ interface SduiTagCell {
874
+ type: 'tag';
875
+ colorMap?: Record<string, string>;
876
+ filled?: boolean;
877
+ }
878
+ /**
879
+ * 값을 링크로. `to`는 `/assets/{id}` 처럼 행의 필드를 `{키}`로 끼워 넣는 경로 템플릿이고,
880
+ * 클릭하면 navigate 액션이 나간다(렌더러가 대상 안전성을 다시 검사한다).
881
+ */
882
+ interface SduiLinkCell {
883
+ type: 'link';
884
+ to: string;
885
+ /** 링크 문구로 쓸 필드 — 생략하면 컬럼 자신의 값 */
886
+ labelKey?: string;
887
+ icon?: string;
888
+ }
889
+ /** 값을 진행 막대로. 분모는 maxKey(행의 필드) → max → 100 순으로 정한다. */
890
+ interface SduiProgressCell {
891
+ type: 'progress';
892
+ max?: number;
893
+ maxKey?: string;
894
+ tone?: MeterTone;
895
+ showValue?: boolean;
896
+ }
897
+ /** 값을 아이콘으로. iconMap에 없는 값은 icon(공통 기본)으로, 그것도 없으면 원문으로. */
898
+ interface SduiIconCell {
899
+ type: 'icon';
900
+ iconMap?: Record<string, string>;
901
+ icon?: string;
902
+ /** 아이콘 뒤에 값도 적는다 */
903
+ withLabel?: boolean;
904
+ }
905
+ /**
906
+ * 숫자 서식(ko-KR 천단위) + 접두/접미. 통화는 `{ type:'number', suffix:'원' }`이다 —
907
+ * `currency` 타입을 따로 두지 않은 이유는 ERP가 원화 단일이고, 그 자리에 필요한 것이
908
+ * 통화 기호가 아니라 "단위 문자열"이기 때문이다(원·건·개·%·kg).
909
+ */
910
+ interface SduiNumberCell {
911
+ type: 'number';
912
+ /** 소수 자릿수 (기본 0) */
913
+ digits?: number;
914
+ prefix?: string;
915
+ suffix?: string;
916
+ }
917
+ /** 날짜 서식(ko-KR). 파싱되지 않는 값은 원문 그대로. */
918
+ interface SduiDateCell {
919
+ type: 'date';
920
+ format?: 'date' | 'datetime' | 'time';
921
+ }
922
+ type SduiCell = SduiTextCell | SduiBadgeCell | SduiTagCell | SduiLinkCell | SduiProgressCell | SduiIconCell | SduiNumberCell | SduiDateCell;
923
+ /**
924
+ * 셀 스펙 → 렌더 함수. `undefined`를 돌려주면 호출자가 원문을 그대로 출력한다
925
+ * (표에서는 `<td>{row[key]}</td>`, 카드에서는 값 문자열).
926
+ */
927
+ declare function cellRenderer(cell: SduiCell | undefined, key: string, dispatch: SduiDispatch): ((row: SearchRow) => React__default.ReactNode) | undefined;
719
928
 
720
929
  /**
721
930
  * SearchResults의 SDUI 어댑터 — 함수 프롭 없이 JSON만으로 검색+목록 화면을 구성한다.
@@ -736,12 +945,36 @@ interface SduiSearchColumn {
736
945
  ratio?: number;
737
946
  mono?: boolean;
738
947
  strong?: boolean;
739
- /** 셀 표현. 생략하면 row[key]를 그대로 출력한다 */
740
- cell?: {
741
- type: 'badge';
742
- /** 값 → Badge 톤 매핑 (없는 값은 neutral) */
743
- toneMap?: Record<string, BadgeTone>;
744
- };
948
+ /** 셀 표현. 생략하면 row[key]를 그대로 출력한다 — 어휘는 `cells.tsx` 참고 */
949
+ cell?: SduiCell;
950
+ }
951
+ /**
952
+ * 카드 행 표시 조건.
953
+ * `key`만 주면 "그 값이 비어 있지 않을 때"다. 값이 없는 행을 감춰 카드 높이가
954
+ * 들쭉날쭉해지지 않게 하는 것이 주 용도라 그것이 기본 의미다.
955
+ */
956
+ interface SduiRowCondition {
957
+ key: string;
958
+ equals?: string | number | boolean;
959
+ in?: Array<string | number>;
960
+ notEmpty?: boolean;
961
+ }
962
+ interface SduiGridCardRow {
963
+ label?: string;
964
+ valueKey: string;
965
+ /** 라벨 앞 아이콘 */
966
+ icon?: string;
967
+ /** 값 표현 — 컬럼 셀과 같은 어휘 */
968
+ cell?: SduiCell;
969
+ /** 조건부 행 */
970
+ showWhen?: SduiRowCondition;
971
+ }
972
+ /** 카드 우상단 버튼 — 이벤트 값으로 행 객체 전체가 전달된다 */
973
+ interface SduiGridCardAction {
974
+ label: string;
975
+ icon?: string;
976
+ variant?: 'default' | 'destructive' | 'outline';
977
+ run: SduiAction | SduiAction[];
745
978
  }
746
979
  interface SduiGridCard {
747
980
  titleKey: string;
@@ -750,10 +983,14 @@ interface SduiGridCard {
750
983
  key: string;
751
984
  toneMap?: Record<string, BadgeTone>;
752
985
  };
753
- rows?: Array<{
754
- label?: string;
755
- valueKey: string;
756
- }>;
986
+ /** 한 열로 쌓는 행 */
987
+ rows?: SduiGridCardRow[];
988
+ /** 두 열 배치 — 좌/우 각각의 행 목록. rows와 함께 쓰면 두 열이 위, rows가 아래다 */
989
+ leftRows?: SduiGridCardRow[];
990
+ rightRows?: SduiGridCardRow[];
991
+ /** 카드 맨 아래 보조 문구로 쓸 필드 */
992
+ noteKey?: string;
993
+ actions?: SduiGridCardAction[];
757
994
  }
758
995
  interface SduiSearchAction {
759
996
  label: string;
@@ -772,6 +1009,13 @@ interface SduiSearchCommonProps {
772
1009
  gridCard?: SduiGridCard;
773
1010
  actions?: SduiSearchAction[];
774
1011
  initialView?: 'grid' | 'list';
1012
+ /**
1013
+ * 노출할 보기 목록(라벨·아이콘·순서). 생략하면 목록/카드 두 칸이 기본이다.
1014
+ * gridCard 없이 카드 보기를 넣으면 빈 카드가 나오므로 여기서 걸러낸다.
1015
+ */
1016
+ views?: SearchViewItem[];
1017
+ /** 페이지당 건수 선택지. 생략 시 [10, 20, 50, 100] */
1018
+ pageSizes?: number[];
775
1019
  disableGrid?: boolean;
776
1020
  disableList?: boolean;
777
1021
  searchPlaceholder?: string;
@@ -785,7 +1029,7 @@ interface SduiSearchCommonProps {
785
1029
  interface SduiSearchResultsProps extends SduiSearchCommonProps {
786
1030
  data: SearchRow[];
787
1031
  }
788
- declare function SduiSearchResults({ title, data, columns, fields, leftFilters, rightFilters, gridCard, actions, initialView, disableGrid, disableList, searchPlaceholder, rowClick, headerActions, virtual, }: SduiSearchResultsProps): React__default.JSX.Element;
1032
+ declare function SduiSearchResults({ title, data, columns, fields, leftFilters, rightFilters, gridCard, actions, initialView, views, pageSizes, disableGrid, disableList, searchPlaceholder, rowClick, headerActions, virtual, }: SduiSearchResultsProps): React__default.JSX.Element;
789
1033
  interface RemoteSearchResultsProps extends SduiSearchCommonProps {
790
1034
  /**
791
1035
  * 목록 endpoint — page/limit/search/필드키 쿼리를 붙여 조회하고
@@ -795,7 +1039,7 @@ interface RemoteSearchResultsProps extends SduiSearchCommonProps {
795
1039
  /** 페이지당 행 수 (기본 10) — limit 파라미터의 초기값 */
796
1040
  pageSize?: number;
797
1041
  }
798
- declare function RemoteSearchResults({ title, endpoint, columns, fields, leftFilters, rightFilters, gridCard, actions, initialView, disableGrid, disableList, searchPlaceholder, rowClick, headerActions, virtual, pageSize, }: RemoteSearchResultsProps): React__default.JSX.Element;
1042
+ declare function RemoteSearchResults({ title, endpoint, columns, fields, leftFilters, rightFilters, gridCard, actions, initialView, views, pageSizes, disableGrid, disableList, searchPlaceholder, rowClick, headerActions, virtual, pageSize, }: RemoteSearchResultsProps): React__default.JSX.Element;
799
1043
 
800
1044
  /**
801
1045
  * 목록 표 — SearchResults 전용. 내장 `Table`은 정렬 헤더·선택 표시·가상 스크롤을
@@ -950,42 +1194,6 @@ declare const defaultRegistry: {
950
1194
  */
951
1195
  declare function createRegistry(extensions: SduiRegistry): SduiRegistry;
952
1196
 
953
- /** custom 액션을 앱 코드로 위임하는 확장 지점. */
954
- type CustomActionHandler = (name: string, payload?: SduiPropValue, value?: unknown) => void;
955
- /** custom 검증 규칙 구현 — 에러 메시지 또는 null 반환 */
956
- type CustomValidator = (fieldValue: SduiPropValue | undefined, values: Record<string, SduiPropValue>) => string | null;
957
- interface SduiRendererProps {
958
- page: SduiPage;
959
- /** 컴포넌트 어휘 — 생략 시 내장 기본 레지스트리 */
960
- registry?: SduiRegistry;
961
- /** 내비게이션·API·실시간 연결점 — 생략 시 브라우저 기본 구현 */
962
- adapter?: SduiAdapter;
963
- /**
964
- * page.urlState ↔ URL 쿼리 동기화 여부 (기본 true).
965
- * 편집기 미리보기처럼 실제 페이지 라우트가 아닌 곳에 마운트할 때 false로 끈다 —
966
- * 안 그러면 미리보기의 상태가 호스트 앱 URL을 오염시킨다.
967
- */
968
- syncUrlState?: boolean;
969
- onCustomAction?: CustomActionHandler;
970
- customValidators?: Record<string, CustomValidator>;
971
- }
972
- /**
973
- * 서버(JSON 스펙) 주도 페이지 렌더러.
974
- * 스펙은 직렬화 가능한 데이터만 담고, 상태·이벤트·폼·내비게이션은 여기서 해석한다.
975
- */
976
- declare function SduiRenderer({ page, registry, adapter, syncUrlState, onCustomAction, customValidators, }: SduiRendererProps): React__default.JSX.Element;
977
-
978
- /**
979
- * 스펙 구조 검증기 — 서버(또는 편집기)가 만든 스펙의 형태 오류를 렌더 전에 찾아낸다.
980
- * 렌더러는 개발 모드에서 이 결과를 콘솔에 경고하고, 관리자 편집기는
981
- * 저장 전에 같은 검사를 돌려 문제 목록을 보여준다.
982
- */
983
- interface SpecIssue {
984
- path: string;
985
- message: string;
986
- }
987
- declare function validateSpec(page: unknown, knownComponents?: Set<string>): SpecIssue[];
988
-
989
1197
  /**
990
1198
  * 권한 판정 주입 지점.
991
1199
  *
@@ -1027,9 +1235,54 @@ declare function SduiPermissionProvider({ can, children }: SduiPermissionProvide
1027
1235
  */
1028
1236
  declare function useSduiCan(): SduiCanFn;
1029
1237
 
1030
- /** SduiRenderer가 제공하는 액션 디스패처. 레지스트리의 복합 컴포넌트가 선언적 액션을 실행할 때 쓴다. */
1031
- type SduiDispatch = (action: SduiAction, eventValue?: unknown) => void;
1032
- declare function useSduiDispatch(): SduiDispatch;
1238
+ /** custom 액션을 앱 코드로 위임하는 확장 지점. */
1239
+ type CustomActionHandler = (name: string, payload?: SduiPropValue, value?: unknown) => void;
1240
+ /** custom 검증 규칙 구현 — 에러 메시지 또는 null 반환 */
1241
+ type CustomValidator = (fieldValue: SduiPropValue | undefined, values: Record<string, SduiPropValue>) => string | null;
1242
+ interface SduiRendererProps {
1243
+ page: SduiPage;
1244
+ /** 컴포넌트 어휘 — 생략 시 내장 기본 레지스트리 */
1245
+ registry?: SduiRegistry;
1246
+ /** 내비게이션·API·실시간 연결점 — 생략 시 브라우저 기본 구현 */
1247
+ adapter?: SduiAdapter;
1248
+ /**
1249
+ * page.urlState ↔ URL 쿼리 동기화 여부 (기본 true).
1250
+ * 편집기 미리보기처럼 실제 페이지 라우트가 아닌 곳에 마운트할 때 false로 끈다 —
1251
+ * 안 그러면 미리보기의 상태가 호스트 앱 URL을 오염시킨다.
1252
+ */
1253
+ syncUrlState?: boolean;
1254
+ /**
1255
+ * 권한 판정 — `Can` 게이트가 이 콜백에 질의한다.
1256
+ *
1257
+ * 라이브러리는 권한 모델을 알지 않는다(근거는 permission.tsx 주석). ERP라면
1258
+ * `can={(q) => can(user, q.entity, q.action, q.scope)}`처럼 자기 판정 함수를 꽂는다.
1259
+ * 세션이 없는 편집기 미리보기·스토리북은 `can="allow-all"`을 **명시**한다 —
1260
+ * 아무것도 주지 않으면 게이트는 열리되 console.error가 한 번 난다.
1261
+ *
1262
+ * 이 프롭이 없어서 소비 앱이 `Can`을 자기 구현으로 덮어써야 했다. 이제 렌더러가
1263
+ * `SduiPermissionProvider`로 흘려보내므로 판정 함수만 주면 게이트는 라이브러리 것을 쓴다.
1264
+ * (렌더러 밖에서 직접 provider로 감싸도 동작한다 — 그쪽이 바깥이라 이 프롭이 이긴다.)
1265
+ */
1266
+ can?: SduiCanSetting;
1267
+ onCustomAction?: CustomActionHandler;
1268
+ customValidators?: Record<string, CustomValidator>;
1269
+ }
1270
+ /**
1271
+ * 서버(JSON 스펙) 주도 페이지 렌더러.
1272
+ * 스펙은 직렬화 가능한 데이터만 담고, 상태·이벤트·폼·내비게이션은 여기서 해석한다.
1273
+ */
1274
+ declare function SduiRenderer({ page, registry, adapter, syncUrlState, can, onCustomAction, customValidators, }: SduiRendererProps): React__default.JSX.Element;
1275
+
1276
+ /**
1277
+ * 스펙 구조 검증기 — 서버(또는 편집기)가 만든 스펙의 형태 오류를 렌더 전에 찾아낸다.
1278
+ * 렌더러는 개발 모드에서 이 결과를 콘솔에 경고하고, 관리자 편집기는
1279
+ * 저장 전에 같은 검사를 돌려 문제 목록을 보여준다.
1280
+ */
1281
+ interface SpecIssue {
1282
+ path: string;
1283
+ message: string;
1284
+ }
1285
+ declare function validateSpec(page: unknown, knownComponents?: Set<string>): SpecIssue[];
1033
1286
 
1034
1287
  /** Form이 렌더러에 등록하는 검증 설정 */
1035
1288
  interface SduiFormConfig {
@@ -1068,4 +1321,4 @@ declare class NodeErrorBoundary extends React__default.Component<Props, State> {
1068
1321
  render(): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
1069
1322
  }
1070
1323
 
1071
- export { Actions, type ActionsProps, Alert, type AlertProps, Badge, type BadgeProps, type BadgeTone, Button, type ButtonProps, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type CustomActionHandler, type CustomValidator, DatePicker, DateRangePicker, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, NodeErrorBoundary, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, RemoteSearchResults, type RemoteSearchResultsProps, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SduiAction, type SduiAdapter, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, SduiDialog, type SduiDispatch, SduiForm, type SduiFormConfig, type SduiFormProps, type SduiGridCard, SduiPage, SduiPermissionProvider, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchResults, type SduiSearchResultsProps, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchToolbar, type SearchValues, Section, type SectionProps, Select, type SelectOption, type SelectProps, Show, type ShowProps, type SortDir, Spacer, type SpacerProps, type SpecIssue, Spinner, type SpinnerProps, StatCard, type StatCardProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextPreset, type TextProps, Textarea, type TextareaProps, Toast, type ToastProps, cascadingValuePaths, cleanSearchValues, createRegistry, defaultAdapter, defaultRegistry, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue, useRemoteSearchPage, useSduiCan, useSduiDispatch, useSduiRuntime, useSearchFetcher, validateSpec };
1324
+ export { Actions, type ActionsProps, Alert, type AlertProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type CustomActionHandler, type CustomValidator, DatePicker, DateRangePicker, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, type MeterTone, NodeErrorBoundary, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, Radio, type RadioProps, RemoteSearchResults, type RemoteSearchResultsProps, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SduiAction, type SduiAdapter, type SduiBadgeCell, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, type SduiCell, type SduiDateCell, SduiDialog, type SduiDispatch, SduiForm, type SduiFormConfig, type SduiFormProps, type SduiGridCard, type SduiGridCardAction, type SduiGridCardRow, type SduiIconCell, type SduiLinkCell, type SduiNumberCell, SduiPage, SduiPermissionProvider, type SduiProgressCell, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, type SduiRowCondition, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchResults, type SduiSearchResultsProps, type SduiTagCell, type SduiTextCell, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchToolbar, type SearchValues, type SearchViewItem, Section, type SectionProps, SegmentedControl, type SegmentedControlProps, type SegmentedItem, Select, type SelectOption, type SelectProps, Show, type ShowProps, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SidebarNavSection, type SortDir, Spacer, type SpacerProps, type SpecIssue, Spinner, type SpinnerProps, StatCard, type StatCardProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextPreset, type TextProps, Textarea, type TextareaProps, Toast, type ToastProps, Tooltip, type TooltipProps, cascadingValuePaths, cellRenderer, cleanSearchValues, createRegistry, defaultAdapter, defaultRegistry, includesLooseSearch, joinMultiValue, normalizePageSizes, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue, useRemoteSearchPage, useSduiCan, useSduiDispatch, useSduiRuntime, useSearchFetcher, validateSpec };