@wipco/sdui 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/{DatePicker-C_TT_SOw.d.ts → DatePicker-DX9juElE.d.ts} +10 -1
  2. package/dist/{chunk-7P7N43JV.js → chunk-34BABTH4.js} +2 -2
  3. package/dist/{chunk-DMLDKW7K.js → chunk-37BNG4DT.js} +1 -1
  4. package/dist/{chunk-5WW4MBRO.js → chunk-3JTBOABA.js} +6 -2
  5. package/dist/{chunk-HBIIEYKW.js → chunk-3PCR73OC.js} +4 -4
  6. package/dist/{chunk-VY7MVBSE.js → chunk-3PT5OBOU.js} +2 -2
  7. package/dist/{chunk-YVTV4ZV6.js → chunk-4YPPL7JK.js} +1 -1
  8. package/dist/{chunk-E6ISNQK3.js → chunk-6YBSBC77.js} +31 -8
  9. package/dist/{chunk-YWUDBLO6.js → chunk-7G6J6QFC.js} +2 -2
  10. package/dist/{chunk-UV6HHFEW.js → chunk-A57GKV5F.js} +129 -68
  11. package/dist/{chunk-I45EUZC6.js → chunk-AJ3KDBEE.js} +4 -2
  12. package/dist/chunk-BITS7UJY.js +333 -0
  13. package/dist/{chunk-DOL57OOP.js → chunk-BV37UCDF.js} +3 -3
  14. package/dist/chunk-CSZCWBOE.js +256 -0
  15. package/dist/{chunk-XGFDY43I.js → chunk-CUFGH3LB.js} +88 -18
  16. package/dist/{chunk-A6LAIGUS.js → chunk-EGFDELSF.js} +7 -4
  17. package/dist/{chunk-JIV4YHCZ.js → chunk-EJIWOD7W.js} +1 -1
  18. package/dist/{chunk-CXW6KT6X.js → chunk-ESAFQXEU.js} +3 -3
  19. package/dist/{chunk-N5RKM6IC.js → chunk-EUSC5NMZ.js} +4 -4
  20. package/dist/{chunk-RWSH2MBU.js → chunk-FP32LNFK.js} +73 -19
  21. package/dist/{chunk-44TDRCKR.js → chunk-GKYUDTMI.js} +5 -5
  22. package/dist/chunk-GSM664TX.js +38 -0
  23. package/dist/{chunk-I5SD7XRA.js → chunk-GSXD52XG.js} +3 -3
  24. package/dist/{chunk-O4IISNE7.js → chunk-IB2ZPUTF.js} +51 -12
  25. package/dist/{chunk-YOZN35HD.js → chunk-IIRVHSNK.js} +3 -3
  26. package/dist/{chunk-FNMS7OB7.js → chunk-J7BZF4T4.js} +5 -5
  27. package/dist/{chunk-KO6OEY3G.js → chunk-JHFA5RDN.js} +3 -13
  28. package/dist/{chunk-DKVSM5HX.js → chunk-KDKRFWIF.js} +6 -6
  29. package/dist/chunk-KO3EUNWB.js +380 -0
  30. package/dist/{chunk-JYAR7D5U.js → chunk-NLSR3JYU.js} +2 -2
  31. package/dist/{chunk-ZORQPB6B.js → chunk-O4EMQWCV.js} +325 -360
  32. package/dist/{chunk-2HLXCKK7.js → chunk-OCYJ2ZOV.js} +2 -2
  33. package/dist/{chunk-OQ52XMGG.js → chunk-OKNF2SBB.js} +4 -4
  34. package/dist/{chunk-GNA6SX2H.js → chunk-OQ7A3SFM.js} +2 -2
  35. package/dist/{chunk-A5XQOEVH.js → chunk-PCFH74RD.js} +4 -4
  36. package/dist/{chunk-BEM2YS7U.js → chunk-SGGIWPP6.js} +3 -3
  37. package/dist/{chunk-NIJUVTEW.js → chunk-TB7G5DXQ.js} +3 -3
  38. package/dist/{chunk-GZBY7I4Y.js → chunk-TWUKNUUQ.js} +66 -10
  39. package/dist/{chunk-WPSK2CB5.js → chunk-UC725BGW.js} +16 -5
  40. package/dist/{chunk-ZFNFPXPR.js → chunk-US3K6Q5T.js} +2 -2
  41. package/dist/{chunk-MPT7WJG2.js → chunk-USNPJEXH.js} +5 -5
  42. package/dist/{chunk-SAPBDJJQ.js → chunk-UZZLMPRW.js} +2 -2
  43. package/dist/{chunk-Q4SWUINA.js → chunk-VAXRTBJH.js} +1 -1
  44. package/dist/{chunk-RYBBPFI7.js → chunk-VQKX5PJ4.js} +4 -4
  45. package/dist/chunk-VR5MFUD2.js +106 -0
  46. package/dist/{chunk-JZXU22PE.js → chunk-VSNHDHGS.js} +208 -117
  47. package/dist/{chunk-2YP5N4VV.js → chunk-VZOQRQAR.js} +1 -1
  48. package/dist/{chunk-AXGF4M57.js → chunk-XAXROQKB.js} +1 -1
  49. package/dist/{chunk-IZ3JA2BR.js → chunk-XFKNU6QN.js} +3 -3
  50. package/dist/{chunk-GTGS2QRL.js → chunk-XUVWIRZJ.js} +3 -3
  51. package/dist/{chunk-RNOUXUBO.js → chunk-YYAGE733.js} +323 -59
  52. package/dist/index.d.ts +449 -91
  53. package/dist/index.js +1060 -138
  54. package/dist/{layout-C3nRXMwb.d.ts → layout-DmRikwZb.d.ts} +5 -4
  55. package/dist/meta.d.ts +1 -1
  56. package/dist/meta.js +351 -25
  57. package/dist/rich/ExcelUploadCard.d.ts +1 -1
  58. package/dist/rich/ExcelUploadCard.js +5 -4
  59. package/dist/rich.d.ts +22 -3
  60. package/dist/rich.js +304 -35
  61. package/dist/styles.css +119 -4
  62. package/dist/{types-COjGKgmd.d.ts → types-CMikpoN5.d.ts} +65 -2
  63. package/dist/widgets/ApprovalLineEditor.d.ts +1 -1
  64. package/dist/widgets/ApprovalLineEditor.js +9 -8
  65. package/dist/widgets/ApprovalOverridesEditor.d.ts +1 -1
  66. package/dist/widgets/ApprovalOverridesEditor.js +11 -10
  67. package/dist/widgets/ApprovalStepper.d.ts +29 -4
  68. package/dist/widgets/ApprovalStepper.js +3 -3
  69. package/dist/widgets/AutocompleteField.d.ts +1 -1
  70. package/dist/widgets/AutocompleteField.js +9 -8
  71. package/dist/widgets/ColumnBoard.d.ts +1 -1
  72. package/dist/widgets/ColumnBoard.js +3 -3
  73. package/dist/widgets/DiffView.d.ts +1 -1
  74. package/dist/widgets/DiffView.js +3 -3
  75. package/dist/widgets/Disclosure.d.ts +1 -1
  76. package/dist/widgets/Disclosure.js +3 -3
  77. package/dist/widgets/EventCalendar.d.ts +5 -1
  78. package/dist/widgets/EventCalendar.js +5 -3
  79. package/dist/widgets/FileDropzone.d.ts +1 -1
  80. package/dist/widgets/FileDropzone.js +9 -7
  81. package/dist/widgets/ImageLightbox.d.ts +1 -1
  82. package/dist/widgets/ImageLightbox.js +7 -5
  83. package/dist/widgets/InlineEdit.d.ts +1 -1
  84. package/dist/widgets/InlineEdit.js +3 -3
  85. package/dist/widgets/JsonField.d.ts +1 -1
  86. package/dist/widgets/JsonField.js +3 -3
  87. package/dist/widgets/LiveClock.d.ts +1 -1
  88. package/dist/widgets/LiveClock.js +2 -2
  89. package/dist/widgets/OptionSchemaEditor.d.ts +1 -1
  90. package/dist/widgets/OptionSchemaEditor.js +4 -4
  91. package/dist/widgets/OptionValueFields.d.ts +1 -1
  92. package/dist/widgets/OptionValueFields.js +4 -4
  93. package/dist/widgets/OrgChart.d.ts +1 -1
  94. package/dist/widgets/OrgChart.js +4 -4
  95. package/dist/widgets/OrgChartBoard.d.ts +15 -33
  96. package/dist/widgets/OrgChartBoard.js +10 -8
  97. package/dist/widgets/PeriodFilter.d.ts +1 -1
  98. package/dist/widgets/PeriodFilter.js +6 -5
  99. package/dist/widgets/PermissionMatrixEditor.d.ts +34 -2
  100. package/dist/widgets/PermissionMatrixEditor.js +6 -4
  101. package/dist/widgets/PositionSelect.d.ts +1 -1
  102. package/dist/widgets/PositionSelect.js +5 -4
  103. package/dist/widgets/PrintSheet.d.ts +15 -2
  104. package/dist/widgets/PrintSheet.js +3 -3
  105. package/dist/widgets/ProfileEditDiffCard.d.ts +1 -1
  106. package/dist/widgets/ProfileEditDiffCard.js +5 -4
  107. package/dist/widgets/QRDisplay.d.ts +1 -1
  108. package/dist/widgets/QRDisplay.js +5 -4
  109. package/dist/widgets/RankBoard.d.ts +1 -1
  110. package/dist/widgets/RankBoard.js +8 -6
  111. package/dist/widgets/RecordSheet.d.ts +1 -1
  112. package/dist/widgets/RecordSheet.js +2 -2
  113. package/dist/widgets/RoleMemberPicker.d.ts +1 -1
  114. package/dist/widgets/RoleMemberPicker.js +6 -5
  115. package/dist/widgets/SearchableMultiPicker.d.ts +1 -1
  116. package/dist/widgets/SearchableMultiPicker.js +7 -6
  117. package/dist/widgets/SecureScreen.d.ts +1 -1
  118. package/dist/widgets/SecureScreen.js +3 -3
  119. package/dist/widgets/StackedMeter.d.ts +1 -1
  120. package/dist/widgets/StackedMeter.js +2 -2
  121. package/dist/widgets/StagePeriodEditor.d.ts +1 -1
  122. package/dist/widgets/StagePeriodEditor.js +6 -5
  123. package/dist/widgets/Strip.d.ts +1 -1
  124. package/dist/widgets/Strip.js +2 -2
  125. package/dist/widgets/SummaryTable.d.ts +1 -1
  126. package/dist/widgets/SummaryTable.js +2 -2
  127. package/dist/widgets/TagInput.d.ts +1 -1
  128. package/dist/widgets/TagInput.js +3 -3
  129. package/dist/widgets/TagMultiSelect.d.ts +1 -1
  130. package/dist/widgets/TagMultiSelect.js +5 -4
  131. package/dist/widgets/Timeline.d.ts +1 -1
  132. package/dist/widgets/Timeline.js +4 -4
  133. package/dist/widgets/TreePicker.d.ts +1 -1
  134. package/dist/widgets/TreePicker.js +8 -7
  135. package/dist/widgets/TreeView.d.ts +17 -3
  136. package/dist/widgets/TreeView.js +7 -6
  137. package/dist/widgets/index.d.ts +3 -3
  138. package/dist/widgets/index.js +84 -83
  139. package/package.json +1 -1
  140. package/dist/chunk-LFEJLOFN.js +0 -352
  141. package/dist/chunk-MMIGOPO5.js +0 -111
  142. package/dist/chunk-TFGNKFL2.js +0 -39
  143. package/dist/chunk-XQPTSEJC.js +0 -135
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { CSSProperties, ReactNode, ComponentType } from 'react';
3
- import { S as SduiPage, a as SduiAction, b as SduiPropValue, c as SduiRule } from './types-COjGKgmd.js';
4
- export { d as SduiArgRef, e as SduiCalcRef, f as SduiChild, g as SduiIndexRef, h as SduiItemRef, i as SduiNode, j as SduiPageQuery, k as SduiScalar, l as SduiStateRef } from './types-COjGKgmd.js';
5
- import { S as SduiBoxProps, a as SduiContainerLayoutProps, b as SduiColumnsScale, c as SduiGapScale, d as SduiWeightScale, e as SduiTextAlignScale } from './layout-C3nRXMwb.js';
6
- export { C as CHILD_LAYOUT_PROPS, L as LAYOUT_CSS, f as SduiAlignScale, g as SduiChildLayoutProps, h as SduiSizeScale, i as SduiSpanScale, j as childLayoutFrom, k as columnsClass, l as containerLayoutStyle, m as joinClass, n as mergeStyle, t as typographyStyle } from './layout-C3nRXMwb.js';
7
- import { D as DatePickerProps, a as DateRangePickerProps, T as TimePickerProps } from './DatePicker-C_TT_SOw.js';
8
- export { b as DatePicker, c as DateRangePicker, d as DateRangeValue, e as TimePicker } from './DatePicker-C_TT_SOw.js';
3
+ import { S as SduiPage, a as SduiAction, b as SduiPropValue, c as SduiRule } from './types-CMikpoN5.js';
4
+ export { d as SduiArgRef, e as SduiCalcRef, f as SduiChild, g as SduiIndexRef, h as SduiItemRef, i as SduiNode, j as SduiPageQuery, k as SduiScalar, l as SduiStateRef } from './types-CMikpoN5.js';
5
+ import { S as SduiBoxProps, a as SduiContainerLayoutProps, b as SduiColumnsScale, c as SduiGapScale, d as SduiWeightScale, e as SduiTextAlignScale } from './layout-DmRikwZb.js';
6
+ export { C as CHILD_LAYOUT_PROPS, L as LAYOUT_CSS, f as SduiAlignScale, g as SduiChildLayoutProps, h as SduiSizeScale, i as SduiSpanScale, j as childLayoutFrom, k as columnsClass, l as containerLayoutStyle, m as joinClass, n as mergeStyle, t as typographyStyle } from './layout-DmRikwZb.js';
7
+ import { D as DatePickerProps, a as DateRangePickerProps, T as TimePickerProps } from './DatePicker-DX9juElE.js';
8
+ export { b as DatePicker, c as DateRangePicker, d as DateRangeValue, e as TimePicker } from './DatePicker-DX9juElE.js';
9
9
 
10
10
  /**
11
11
  * 호스트 앱 연결점 — ERP에서는 라우터·erpFetch·SSE가 하던 일을
@@ -96,6 +96,24 @@ interface SduiAdapter {
96
96
  * 어긋나지 않게 한다. 기본: window.history.replaceState.
97
97
  */
98
98
  replaceQuery?: (params: URLSearchParams) => void;
99
+ /**
100
+ * 이탈 가드 통지 — 페이지의 `leaveGuard` 식이나 작성 중인 `Form.guard` 폼이 있어
101
+ * "떠나면 잃는다"가 참이 될 때 문구를, 풀리면 `null` 을 준다(값이 바뀔 때만, 언마운트에
102
+ * `null`). 렌더러는 beforeunload 는 스스로 걸지만 **앱 안 이동은 호스트 라우터만 막을 수
103
+ * 있다** — 셸 메뉴·브레드크럼·브라우저 뒤로 가기는 렌더러를 거치지 않는다.
104
+ *
105
+ * 이 콜백을 주면 렌더러는 자기 `navigate` 액션도 묻지 않고 그대로 보낸다(두 번 묻지
106
+ * 않게) — 호스트가 라우터 차단(react-router `useBlocker` 등)으로 한 곳에서 묻는다.
107
+ * 안 주면 렌더러가 `navigate` 액션 앞에서만 확인 창을 띄운다.
108
+ */
109
+ setLeaveGuard?: (message: string | null) => void;
110
+ /**
111
+ * 페이지 제목 통지 — `page.titleFrom` 이 있는 화면에서, 풀린 제목(비어 있으면
112
+ * `page.title`)이 바뀔 때마다, 언마운트에 `null`. 문서 <title>·브레드크럼 마지막 단계를
113
+ * 레코드 이름으로 바꾸는 자리다. `titleFrom` 이 없는 화면은 부르지 않는다 — 기존 화면의
114
+ * 제목 경로(스펙 JSON 의 `title`)는 그대로다.
115
+ */
116
+ setTitle?: (title: string | null) => void;
99
117
  /**
100
118
  * 스펙이 준 **자산 URL**을 브라우저가 자동으로 받아 오기 직전에 가로채는 자리.
101
119
  *
@@ -197,6 +215,54 @@ declare function useSduiSandbox(): boolean;
197
215
  type SduiDispatch = (action: SduiAction, eventValue?: unknown) => void;
198
216
  declare function useSduiDispatch(): SduiDispatch;
199
217
 
218
+ /**
219
+ * 어휘 전체. **렌더러와 편집기 검증기가 같은 이 집합을 본다** — 목록이 두 벌이면
220
+ * 한쪽에만 연산을 더했을 때 "렌더는 되는데 저장이 거부되는" 스펙이 생긴다.
221
+ */
222
+ declare const CALC_OPS: ReadonlySet<string>;
223
+ /** 일시 서식 — `date` YYYY-MM-DD · `datetime` YYYY-MM-DD HH:mm · `time` HH:mm */
224
+ type SduiDateFormat = 'date' | 'datetime' | 'time';
225
+ /**
226
+ * 시간대가 붙은 **완전한** ISO 8601 일시 문자열인가.
227
+ *
228
+ * 형식을 지정하지 않은 값을 자동으로 서식할지 가르는 판정이라 일부러 좁다 — 날짜만 있는 값,
229
+ * 시간대 없는 일시, 숫자, 그 밖의 글자는 전부 아니다(그것들은 원문 그대로 둔다).
230
+ * 시간대가 붙은 일시는 사람이 쓴 글이 아니라 서버가 찍은 타임스탬프라, 원문을 보여 줄 까닭이 없다.
231
+ */
232
+ declare function isZonedIsoDateTime(value: unknown): value is string;
233
+ /**
234
+ * 일시 → 한국 시각 글자. 빈 값(null·undefined·'')은 `''`.
235
+ *
236
+ * - 시간대가 붙은 일시는 KST 로 옮긴다.
237
+ * - 날짜만 있는 값은 어느 서식이든 YYYY-MM-DD 다 — 모르는 시각을 "00:00" 으로 지어내지 않는다.
238
+ * - 날짜로 읽을 수 없는 문자열은 **원문 그대로**(서버가 이미 서식한 "2026-07-31 ~ 08-02" 같은 값).
239
+ */
240
+ declare function formatDateValue(value: unknown, format?: SduiDateFormat): string;
241
+ /**
242
+ * 값 → 숫자. 숫자, 또는 숫자로 읽히는 문자열("12400", "12,400", "-3.5")만 받는다. 아니면 null.
243
+ * 위의 `toNumber` 와 다르다 — 저쪽은 산술용이라 못 읽으면 0 이고, 이쪽은 "숫자가 아니면
244
+ * 원문을 지킨다"를 가르는 판정이다.
245
+ */
246
+ declare function parseNumeric(value: unknown): number | null;
247
+ /**
248
+ * 숫자 → ko-KR 천 단위 글자. 빈 값은 `''`, 숫자가 아닌 값은 원문 그대로.
249
+ *
250
+ * `digits` 를 주면 소수 자리를 그만큼 **고정**한다(0~6, 표의 number 셀과 같은 범위).
251
+ * 주지 않으면 값이 가진 소수를 그대로 둔다.
252
+ */
253
+ declare function formatNumberValue(value: unknown, digits?: unknown): string;
254
+ /** 표시 서식 — KeyValueList 항목·Table 열의 `format`. */
255
+ type SduiDisplayFormat = SduiDateFormat | 'number' | 'currency';
256
+ /**
257
+ * 표시할 값에 서식을 입힌다 — KeyValueList·Table 이 공유한다.
258
+ *
259
+ * - `format` 을 주면 그 서식이다. `currency` 는 원 단위(`11,200원`)이고, 숫자가 아니면 원문이다.
260
+ * - 주지 않으면 **시간대가 붙은 완전한 ISO 일시만** KST `YYYY-MM-DD HH:mm` 으로 바꾼다.
261
+ * 날짜만 있는 값·숫자·그 밖의 글자는 그대로 — 스펙이 뜻을 말하지 않은 값을 추측하지 않는다.
262
+ * - 문자열·숫자가 아닌 값(노드·배열·객체)은 건드리지 않는다.
263
+ */
264
+ declare function formatDisplayValue(value: unknown, format?: unknown): unknown;
265
+
200
266
  /**
201
267
  * 내장 기본 컴포넌트 세트 — WIPCO 디자인 시스템(wp-* 토큰)을 따르는
202
268
  * 독립 구현. ERP 디자인 시스템과 같은 프롭 규약을 쓰므로 스펙이 호환된다.
@@ -337,7 +403,7 @@ interface SelectProps extends Omit<React__default.SelectHTMLAttributes<HTMLSelec
337
403
  /** 비어 있는 첫 옵션 */
338
404
  placeholder?: string;
339
405
  }
340
- declare function Select({ options, valueKey, labelKey, size, invalid, placeholder, className, ...rest }: SelectProps): React__default.JSX.Element;
406
+ declare function Select({ options, valueKey, labelKey, size, invalid, placeholder, className, style, ...rest }: SelectProps): React__default.JSX.Element;
341
407
  interface CheckboxProps extends React__default.InputHTMLAttributes<HTMLInputElement> {
342
408
  label?: React__default.ReactNode;
343
409
  description?: React__default.ReactNode;
@@ -350,13 +416,13 @@ interface CheckboxProps extends React__default.InputHTMLAttributes<HTMLInputElem
350
416
  indeterminate?: boolean;
351
417
  disabled?: boolean;
352
418
  }
353
- declare function Checkbox({ label, description, indeterminate, disabled, className, ...rest }: CheckboxProps): React__default.JSX.Element;
419
+ declare function Checkbox({ label, description, indeterminate, disabled, className, style, ...rest }: CheckboxProps): React__default.JSX.Element;
354
420
  interface SwitchProps extends Omit<React__default.InputHTMLAttributes<HTMLInputElement>, 'size'> {
355
421
  label?: React__default.ReactNode;
356
422
  size?: 'sm' | 'md';
357
423
  disabled?: boolean;
358
424
  }
359
- declare function Switch({ label, size, disabled, className, ...rest }: SwitchProps): React__default.JSX.Element;
425
+ declare function Switch({ label, size, disabled, className, style, ...rest }: SwitchProps): React__default.JSX.Element;
360
426
  interface FieldProps extends React__default.HTMLAttributes<HTMLDivElement> {
361
427
  label?: React__default.ReactNode;
362
428
  /** 에러가 없을 때 보여줄 안내 한 줄 */
@@ -395,9 +461,14 @@ interface BadgeProps extends React__default.HTMLAttributes<HTMLSpanElement> {
395
461
  /** 선행 5px 점 — 라이브/진행 상태 */
396
462
  dot?: boolean;
397
463
  size?: 'md' | 'lg';
464
+ /**
465
+ * 긴 문구를 칸 폭 안에서 여러 줄로 감싼다(`wp-badge--wrap`, 1.6.1). 기본은 한 줄 고정 높이다.
466
+ * 예전에는 스펙이 style 로 height:auto·white-space:normal 등을 박아 흉내 냈다.
467
+ */
468
+ wrap?: boolean;
398
469
  children?: React__default.ReactNode;
399
470
  }
400
- declare function Badge({ tone, dot, size, children, className, ...rest }: BadgeProps): React__default.JSX.Element;
471
+ declare function Badge({ tone, dot, size, wrap, children, className, ...rest }: BadgeProps): React__default.JSX.Element;
401
472
  interface TagProps extends React__default.HTMLAttributes<HTMLSpanElement> {
402
473
  /** 선행 점의 CSS 색상 */
403
474
  color?: string;
@@ -464,6 +535,12 @@ interface TableColumn {
464
535
  toneMap?: Record<string, string>;
465
536
  labelMap?: Record<string, string>;
466
537
  };
538
+ /**
539
+ * 셀 값의 표시 서식 — KeyValueList 항목의 `format` 과 같다
540
+ * (`date`·`datetime`·`time` 은 한국 시각, `number` 천 단위, `currency` 천 단위 + 원).
541
+ * 주지 않아도 시간대가 붙은 완전한 ISO 일시는 KST `YYYY-MM-DD HH:mm` 으로 바뀐다.
542
+ */
543
+ format?: SduiDisplayFormat;
467
544
  /** 프로그래매틱 사용 전용 — JSON 스펙에서는 쓸 수 없다 */
468
545
  render?: (row: any, index: number) => React__default.ReactNode;
469
546
  }
@@ -487,10 +564,23 @@ interface TableProps extends React__default.TableHTMLAttributes<HTMLTableElement
487
564
  /** 행 key와 선택에 쓸 필드. 기본 "id" */
488
565
  rowKey?: string;
489
566
  onRowClick?: (row: any) => void;
490
- /** rows가 비었을 때 대신 렌더링 — EmptyState 권장 */
567
+ /** rows가 비었을 때 대신 렌더링 — EmptyState 권장. 없으면 머리글 아래 `emptyText` 한 줄이 선다. */
491
568
  empty?: React__default.ReactNode;
569
+ /**
570
+ * `empty` 슬롯 없이 비었을 때 표 안에 놓는 안내 한 줄(기본 "표시할 항목이 없습니다").
571
+ * 예전에는 머리글만 남아 "비어 있는지, 아직 안 온 건지" 알 수 없었다(카테고리 상세의 하위 카테고리 표).
572
+ */
573
+ emptyText?: string;
574
+ /**
575
+ * 좁은 화면(≤767.98px)에서 행을 카드로 쌓아도 되는 표인가 — `wp-table--stackable` + `td[data-label]`
576
+ * (목록 표 ResultTable 과 같은 계약). 기본은 **sticky 가 아니면 켜짐** — 고정 머리글 표는 ResultTable 의
577
+ * 가상 표처럼 쌓지 않는다(행 카드는 머리글을 숨기므로 "고정 머리글"과 어긋난다; 엑셀 미리보기처럼 열이 많은
578
+ * 표는 옆으로 미는 쪽이 읽힌다). 쌓는 모양은 소비자 CSS 가 모바일 미디어 쿼리 안에서만 그리므로 데스크톱은
579
+ * 그대로다. 열이 많은 집계표를 옆으로 미는 표로 두려면 false, 고정 머리글 표를 그래도 쌓으려면 true.
580
+ */
581
+ stackable?: boolean;
492
582
  }
493
- declare function Table({ columns, rows, dense, hover, sticky, sort, onSort, selectedIds, rowKey, onRowClick, empty, className, ...rest }: TableProps): React__default.JSX.Element;
583
+ declare function Table({ columns, rows, dense, hover, sticky, sort, onSort, selectedIds, rowKey, onRowClick, empty, emptyText, stackable: stackableProp, className, style, ...rest }: TableProps): React__default.JSX.Element;
494
584
  interface StatCardProps extends React__default.HTMLAttributes<HTMLDivElement> {
495
585
  label: React__default.ReactNode;
496
586
  value: React__default.ReactNode;
@@ -518,7 +608,7 @@ interface SpinnerProps extends React__default.HTMLAttributes<HTMLSpanElement> {
518
608
  inverse?: boolean;
519
609
  label?: string;
520
610
  }
521
- declare function Spinner({ size, inverse, label, className, ...rest }: SpinnerProps): React__default.JSX.Element;
611
+ declare function Spinner({ size, inverse, label, className, style, ...rest }: SpinnerProps): React__default.JSX.Element;
522
612
  interface ProgressBarProps extends React__default.HTMLAttributes<HTMLDivElement> {
523
613
  /** 0~`max` */
524
614
  value: number;
@@ -661,6 +751,172 @@ interface TooltipProps extends React__default.HTMLAttributes<HTMLSpanElement> {
661
751
  /** hover 힌트. 트리거를 감싸며 위치는 CSS가 잡는다 — 포털을 쓰지 않는다. */
662
752
  declare function Tooltip({ label, shortcut, placement, wrap, children, className, ...rest }: TooltipProps): React__default.JSX.Element;
663
753
 
754
+ /**
755
+ * 목록 표 — SearchResults 전용. 내장 `Table`은 정렬 헤더·선택 표시·가상 스크롤을
756
+ * 다루지 않으므로, 같은 wp-table 마크업/클래스를 유지한 채 그 세 가지를 더한 변형이다.
757
+ *
758
+ * 가상 스크롤은 **의존성 없이** 직접 구현한다(core는 무거운 외부 의존성을 갖지 않는다).
759
+ * ERP는 @tanstack/react-virtual을 썼지만, 여기서 필요한 건 "고정 행 높이 목록의 창"뿐이라
760
+ * scrollTop → 인덱스 범위 계산으로 충분하다. 렌더 범위 밖은 상/하단 스페이서 행으로 대체한다
761
+ * (<table> 마크업에서 transform 대신 안전하게 동작하는 방식).
762
+ */
763
+
764
+ interface ResultTableColumn<T> {
765
+ key: string;
766
+ header: React__default.ReactNode;
767
+ sortable?: boolean;
768
+ /** right → 우측 정렬 + tabular numerals (wp-table__num) */
769
+ align?: 'left' | 'right';
770
+ /** 고정폭 글꼴 셀 (wp-table__mono) */
771
+ mono?: boolean;
772
+ /** 강조 셀 (wp-table__strong) */
773
+ strong?: boolean;
774
+ /** CSS width — "180px", "22%" */
775
+ width?: string;
776
+ /**
777
+ * 칸 이름(문자열) — 각 `<td data-label>` 로 나간다. 좁은 화면에서 표를 행 카드로 쌓을 때
778
+ * 칸마다 "무슨 값인지"를 CSS(`attr(data-label)`)가 붙인다. 생략하면 `header` 가 문자열일
779
+ * 때 그것을 쓰고, 아니면 빈 값(선택 칸처럼 라벨이 없는 칸)이다.
780
+ */
781
+ label?: string;
782
+ /**
783
+ * 모바일 행 카드에서의 역할 — `data-mobile` 속성으로 나간다(모양은 소비자 CSS).
784
+ * `title`: 카드 머리(라벨 없이 굵게), `hide`: 모바일 카드에서 숨김.
785
+ */
786
+ mobile?: 'title' | 'hide';
787
+ render?: (row: T, index: number) => React__default.ReactNode;
788
+ }
789
+ type SortDir = 'asc' | 'desc';
790
+ interface ResultTableProps<T extends {
791
+ id: string;
792
+ }> {
793
+ columns: ResultTableColumn<T>[];
794
+ rows: T[];
795
+ sort?: {
796
+ key: string;
797
+ dir: SortDir;
798
+ };
799
+ onSort?: (key: string) => void;
800
+ onRowClick?: (row: T) => void;
801
+ /** 체크박스로 고른 행 — `aria-selected="true"`(선택 바탕)만 붙는다. SearchResults 의 일괄 선택이 여기로 온다. */
802
+ selectedIds?: string[];
803
+ /**
804
+ * 표시 전용 강조 행(1.6.1) — `aria-current="true"` + `wp-row--selected` 클래스. 체크박스 선택과 별개다:
805
+ * 옆 창에 열어 둔 행처럼 "지금 보고 있는 것"을 가리킬 뿐, 일괄 액션의 대상이 되지 않는다.
806
+ * 그래서 체크 선택의 `aria-selected` 를 빌리지 않는다 — 같은 속성이면 스크린리더가 둘을 "선택됨"으로
807
+ * 똑같이 읽는다. 바탕·막대는 클래스가 칠한다(aria-selected 규칙에 기대지 않는다).
808
+ * SearchResults 의 `selectedIds` 가 이리로 온다. id 비교는 문자열로 한다(행 id 가 숫자인 JSON 도 맞게).
809
+ */
810
+ pickedIds?: readonly string[];
811
+ /** rows가 비었을 때 표 대신 렌더 */
812
+ empty?: React__default.ReactNode;
813
+ /** true면 스크롤 창 안에서 보이는 행만 렌더한다 */
814
+ virtual?: boolean;
815
+ /** 가상 스크롤 컨테이너 높이(px). 기본 560 */
816
+ height?: number;
817
+ /** 가상 스크롤 행 높이(px) 초기 추정치. 첫 렌더 후 실측값으로 대체된다 — 기본 41(wp-table 기본 행) */
818
+ rowHeight?: number;
819
+ /**
820
+ * 좁은 화면에서 행을 카드로 쌓아도 되는 표인가 — `wp-table--stackable` 클래스(기본 true).
821
+ * 쌓는 모양은 소비자 CSS 가 모바일 미디어 쿼리 안에서만 그린다(데스크톱은 그대로다).
822
+ * 가상 모드는 "모든 행의 높이가 같다"는 가정 위에 서 있어 쌓지 않는다.
823
+ */
824
+ stackable?: boolean;
825
+ }
826
+ declare function ResultTable<T extends {
827
+ id: string;
828
+ }>({ columns, rows, sort, onSort, onRowClick, selectedIds, pickedIds, empty, virtual, height, rowHeight, stackable, }: ResultTableProps<T>): React__default.JSX.Element;
829
+ interface ResultEmptyStateProps {
830
+ /** 목록 이름 — 기본 문구에 들어간다("대여 이력이 없습니다") */
831
+ title: string;
832
+ /** 검색어·상세검색·필터 칩 중 하나라도 걸려 있는가 — 문구와 초기화 버튼이 갈린다 */
833
+ filtered?: boolean;
834
+ /** 조건 없이 비었을 때의 제목 — 생략 시 "아직 {title}이/가 없습니다" */
835
+ emptyTitle?: string;
836
+ /** 조건 없이 비었을 때의 보조 문구 */
837
+ emptyText?: string;
838
+ /** 구분 탭이 골라져 있는가 — "아직"을 빼서 다른 탭에는 있을 수 있음을 남긴다 */
839
+ scoped?: boolean;
840
+ /** 조건 초기화 — 주면 filtered 일 때 버튼이 선다 */
841
+ onReset?: () => void;
842
+ }
843
+ /**
844
+ * 목록이 비었을 때의 표준 표현 — 목록/카드 뷰가 같은 문구를 쓴다.
845
+ *
846
+ * 예전 문구는 한 가지뿐이었다: "{title}이(가) 없습니다 — 검색 조건을 바꾸거나 초기화해 보세요."
847
+ * 검색한 적도 없는 빈 목록(첫 대여 이력, 0건 위임)에도 검색을 탓했고, 초기화 버튼은 없었고,
848
+ * 조사는 "이(가)"로 남았다. 이제 조건이 걸렸을 때만 조건을 말한다.
849
+ */
850
+ declare function ResultEmptyState({ title, filtered, emptyTitle, emptyText, scoped, onReset }: ResultEmptyStateProps): React__default.JSX.Element;
851
+
852
+ /**
853
+ * 목록 정렬 파라미터와 서버 정렬 메아리.
854
+ *
855
+ * ## 왜 정렬이 파라미터가 되었나
856
+ *
857
+ * 예전 정렬은 SearchResults 안의 useState 였고, 받은 행만 다시 늘어놓았다. 서버 페이징 목록
858
+ * (462건 중 10건만 받은 장비 목록, 42쪽짜리 휴지통)에서 '장비명' 머리를 두 번 누르면 전체의
859
+ * 마지막 이름이 아니라 **1쪽 10건의 역순**이 나왔다 — 사용자는 전체가 정렬됐다고 믿는다.
860
+ * 그래서 정렬도 page·search 처럼 `searchParams` 의 한 축(`sort`·`order`)이 되었다:
861
+ *
862
+ * - 전 행이 로드된 목록은 예전처럼 로컬에서 정렬한다(파라미터만 읽는다).
863
+ * - 부분 데이터(서버 페이징)는 **로컬에서 정렬하지 않는다.** 파라미터가 조회 쿼리에 실려
864
+ * 서버가 전체를 정렬한 1쪽을 다시 준다.
865
+ * - 서버는 정렬을 적용했으면 응답에 `sort: { field, order }` 를 메아리한다. 부분 데이터
866
+ * 응답에 메아리가 없으면 그 목록(또는 그 열)은 서버가 정렬하지 못한다 — 정렬 표시를 끈다.
867
+ *
868
+ * 파라미터라서 주소창 동기화(ERP)·뒤로 가기·공유 링크에 정렬이 같이 실린다.
869
+ */
870
+
871
+ declare const SORT_PARAM = "sort";
872
+ declare const ORDER_PARAM = "order";
873
+ interface SortState {
874
+ key: string;
875
+ dir: SortDir;
876
+ }
877
+ /** 서버가 적용했다고 알린 정렬 — 목록 응답의 `sort` 필드 */
878
+ interface SortEcho {
879
+ field: string;
880
+ order: SortDir;
881
+ }
882
+ /** `sort`·`order` 파라미터 → 정렬 상태. `order` 가 없거나 모르는 값이면 오름차순이다. */
883
+ declare function sortFromParams(params: URLSearchParams): SortState | null;
884
+ /** 머리를 누를 때의 순환 — 새 열은 오름차순, 오름차순 → 내림차순 → 해제 */
885
+ declare function nextSort(current: SortState | null, key: string): SortState | null;
886
+ /** 목록 응답 본문에서 정렬 메아리를 꺼낸다. 모양이 다르면 null — 메아리 없음으로 본다. */
887
+ declare function sortEchoOf(body: unknown): SortEcho | null;
888
+ /**
889
+ * 서버가 정렬하지 못하는 열 — SearchResults `serverUnsortable` 에 그대로 꽂는다.
890
+ * `'all'` 은 목록 전체(서버가 한 번도 메아리하지 않았다).
891
+ */
892
+ type ServerUnsortable = 'all' | readonly string[];
893
+ /**
894
+ * endpoint 별 서버 정렬 지원 기억.
895
+ *
896
+ * 메아리는 "적용했을 때만" 오므로 누르기 전에는 지원 여부를 모른다. 부분 데이터 응답을
897
+ * 볼 때마다 기록해 두고, 판정은 둘로 나눈다:
898
+ * - 그 endpoint 가 **한 번도** 메아리하지 않았는데 메아리가 없다 → 목록 전체 정렬 불가('all').
899
+ * 정렬을 아예 모르는 서버(전용 핸들러 등)에서 열마다 한 번씩 헛누르게 하지 않는다.
900
+ * - 다른 열에서 메아리한 적이 있다 → 그 **열만** 불가. 파생 열(조인한 이름 등)만 화이트리스트
901
+ * 밖인 목록에서 정렬 전체를 잃지 않는다.
902
+ *
903
+ * 키는 endpoint 의 경로(쿼리 앞)다 — `/approvals?entity_type=borrow` 와 `…=leave` 는 같은
904
+ * 자원이라 지원 여부도 같다.
905
+ */
906
+ interface ServerSortMemory {
907
+ /** 부분 데이터 응답 한 건을 기록한다. 요청한 정렬이 적용되지 않았으면 false. */
908
+ record(endpoint: string, requested: SortState, echo: SortEcho | null): boolean;
909
+ /** 지금까지의 판정 — 같은 판정이면 같은 참조를 돌려준다(메모 의존성에 안전) */
910
+ unsortable(endpoint: string): ServerUnsortable;
911
+ /** 이 열의 정렬을 서버에 청해도 되는가 */
912
+ allows(endpoint: string, key: string): boolean;
913
+ }
914
+ declare function createServerSortMemory(): ServerSortMemory;
915
+ /** 앱 전역 기억 — 라이브러리 원격 목록과 호스트 원격 목록(ERP)이 같은 판정을 공유한다. */
916
+ declare const serverSortMemory: ServerSortMemory;
917
+ /** 정렬 파라미터를 뗀 사본 — 서버가 정렬하지 못하는 열을 청했을 때 되돌리는 데 쓴다 */
918
+ declare function withoutSort(params: URLSearchParams): URLSearchParams;
919
+
664
920
  /**
665
921
  * 목록 원격 조회 어댑터.
666
922
  *
@@ -688,6 +944,11 @@ interface SearchRow {
688
944
  interface SearchPage {
689
945
  data: SearchRow[];
690
946
  total: number;
947
+ /**
948
+ * 서버가 적용했다고 메아리한 정렬(`sort: { field, order }`). 없으면 null/생략 —
949
+ * 부분 데이터에서 정렬을 청했는데 없으면 서버가 그 정렬을 못 한다는 뜻이다(sort.ts).
950
+ */
951
+ sort?: SortEcho | null;
691
952
  }
692
953
  /**
693
954
  * 목록 한 페이지를 가져온다. 실패하면 Error(사용자에게 보여줄 메시지)를 던진다.
@@ -726,6 +987,11 @@ declare function SduiSearchInvalidationProvider({ invalidator, children, }: {
726
987
  declare function useSearchFetcher(): SearchFetcher;
727
988
  interface RemotePageState {
728
989
  page: SearchPage;
990
+ /**
991
+ * `page` 가 어느 쿼리(`URLSearchParams.toString()`)의 응답인가 — 첫 응답 전에는 null.
992
+ * 쿼리가 바뀐 직후에는 직전 쪽을 유지하므로(깜빡임 방지) 지금 쿼리의 응답인지 가를 때 쓴다.
993
+ */
994
+ pageQuery: string | null;
729
995
  isLoading: boolean;
730
996
  error: Error | null;
731
997
  reload: () => void;
@@ -882,6 +1148,11 @@ interface SearchColumn<T> {
882
1148
  ratio?: number;
883
1149
  mono?: boolean;
884
1150
  strong?: boolean;
1151
+ /**
1152
+ * 모바일 행 카드에서의 역할 — `title` 은 카드 머리(라벨 없이 굵게), `hide` 는 모바일에서 숨김.
1153
+ * 아무 열도 `title` 이 아니면 `primaryKey` 열, 그다음 첫 `strong` 열이 머리가 된다.
1154
+ */
1155
+ mobile?: 'title' | 'hide';
885
1156
  accessor?: (item: T) => string | number | Date | null | undefined;
886
1157
  render?: (item: T) => React__default.ReactNode;
887
1158
  }
@@ -991,6 +1262,46 @@ interface SearchResultsProps<T> {
991
1262
  * (서버 페이징 모드에서는 현재 응답 분량만 가상화).
992
1263
  */
993
1264
  virtual?: boolean | number;
1265
+ /**
1266
+ * 부분 데이터(서버 페이징)에서 정렬 머리를 끌 열 — `'all'` 이면 전부.
1267
+ *
1268
+ * 정렬은 `searchParams` 의 `sort`·`order` 다. 전 행이 로드된 목록은 로컬에서 정렬하고,
1269
+ * 부분 데이터는 **로컬에서 정렬하지 않는다**(현재 쪽만 뒤섞으면 전체가 정렬된 줄 안다) —
1270
+ * 조회 측이 그 파라미터로 다시 가져온다. 서버가 정렬하지 못한다고 판정된 열(응답에 정렬
1271
+ * 메아리가 없었다)은 조회 측이 여기로 넘겨 머리를 끈다(`serverSortMemory`).
1272
+ */
1273
+ serverUnsortable?: ServerUnsortable;
1274
+ /**
1275
+ * 행을 대표하는 필드(카드 제목과 같은 것) — 선택 칸의 접근성 이름("○○ 선택")과
1276
+ * 모바일 행 카드의 머리 열을 고르는 데 쓴다. 생략하면 첫 strong 열.
1277
+ */
1278
+ primaryKey?: string;
1279
+ /** 조건 없이 비었을 때의 제목 — 생략 시 "아직 {title}이/가 없습니다" */
1280
+ emptyTitle?: string;
1281
+ /** 조건 없이 비었을 때의 보조 문구 */
1282
+ emptyText?: string;
1283
+ /**
1284
+ * 검색어·필터·상세검색을 **조회 측(서버)이 이미 적용한** 목록 — 전 행이 한 쪽에 다 들어와도
1285
+ * 여기서 다시 거르지 않는다(정렬·쪽 나누기는 그대로 로컬).
1286
+ *
1287
+ * 로컬 재필터는 데모 배열처럼 아무도 거르지 않은 데이터를 위한 것인데, 원격 목록에 그대로
1288
+ * 적용되면 서버와 조금이라도 다른 조건이 행을 먹어 치운다. 실측 셋: 접미사 키(`issuerNameContains`)가
1289
+ * 행에 없어 0건, dateRange 의 to-경계를 문자열로 비교해 당일 행 누락, 그리고 필터 값은 코드
1290
+ * (`maintenance_started`)인데 행에는 라벨('수리 시작')이 실려 있어 1건이 전부 걸러진 장비 이력
1291
+ * (asset-18). endpoint 목록(RemoteSearchResults)은 이 값을 켠다.
1292
+ */
1293
+ serverFiltered?: boolean;
1294
+ /**
1295
+ * 표시 전용 강조(1.6.1) — 이 id 의 행(목록 보기)·카드(카드 보기)를 강조한다. 체크박스 선택(`actions`)과
1296
+ * **별개**다: 일괄 액션의 대상이 되지 않고, 선택 바도 세우지 않는다. 옆 창·상세에 열어 둔 행을 목록에서
1297
+ * 가리키는 자리다 — 스펙은 `"selectedIds": [{"$state":"rt.$picked.id"}]` 처럼 준다.
1298
+ *
1299
+ * 행은 `aria-current="true"` + `wp-row--selected`, 카드는 `wp-card--selected` + `is-selected` +
1300
+ * `aria-current="true"` 다. 체크 선택의 `aria-selected` 는 쓰지 않는다 — 스크린리더가 강조와 체크 선택을
1301
+ * 똑같이 "선택됨"으로 읽게 되고, 카드(버튼·일반 상자 역할)는 aria-selected 를 가질 수도 없다. 비교는
1302
+ * 문자열로 하고, 바인딩이 아직 비어 `null`·`undefined` 인 원소는 버린다.
1303
+ */
1304
+ selectedIds?: string[];
994
1305
  }
995
1306
  /**
996
1307
  * 스펙이 준 페이지 크기 목록을 다듬는다 — 양의 정수만, 중복 제거, 오름차순.
@@ -999,7 +1310,7 @@ interface SearchResultsProps<T> {
999
1310
  declare function normalizePageSizes(sizes: number[] | undefined): number[] | undefined;
1000
1311
  declare function SearchResults<T extends {
1001
1312
  id: string;
1002
- }>({ item, columns, gridConfig, leftFilters, rightFilters, tabs, summary, initialView, views, pageSizes, className, style, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields: rawAdvancedSearchFields, searchPlaceholder, virtual, }: SearchResultsProps<T>): React__default.JSX.Element;
1313
+ }>({ item, columns, gridConfig, leftFilters, rightFilters, tabs, summary, initialView, views, pageSizes, className, style, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields: rawAdvancedSearchFields, searchPlaceholder, virtual, serverUnsortable, primaryKey, emptyTitle, emptyText, serverFiltered, selectedIds, }: SearchResultsProps<T>): React__default.JSX.Element;
1003
1314
 
1004
1315
  /**
1005
1316
  * 셀 표현 어휘 — 목록 컬럼의 셀과 카드 행의 값이 **같은 규칙**을 쓴다.
@@ -1159,7 +1470,10 @@ interface SduiSearchSummary {
1159
1470
  endpoint: string;
1160
1471
  items: SduiSearchSummaryItem[];
1161
1472
  }
1162
- /** 합계 조회에 넘길 쿼리 — 목록 쿼리에서 페이지 축(page/limit)만 뺀다. */
1473
+ /**
1474
+ * 합계 조회에 넘길 쿼리 — 목록 쿼리에서 페이지 축(page/limit)과 정렬 축(sort/order)을 뺀다.
1475
+ * 정렬은 합을 바꾸지 않는다 — 남겨 두면 머리를 누를 때마다 합계가 헛되이 다시 조회된다.
1476
+ */
1163
1477
  declare function summaryParams(params: URLSearchParams): URLSearchParams;
1164
1478
  interface SearchSummaryCardsProps {
1165
1479
  items: SduiSearchSummaryItem[];
@@ -1179,6 +1493,11 @@ interface SduiSearchColumn {
1179
1493
  ratio?: number;
1180
1494
  mono?: boolean;
1181
1495
  strong?: boolean;
1496
+ /**
1497
+ * 모바일(≤767.98px) 행 카드에서의 역할 — `title`: 카드 머리(라벨 없이 굵게),
1498
+ * `hide`: 모바일에서 숨김(식별자·보조 열). 생략하면 보통 칸(라벨 + 값).
1499
+ */
1500
+ mobile?: 'title' | 'hide';
1182
1501
  /** 셀 표현. 생략하면 row[key]를 그대로 출력한다 — 어휘는 `cells.tsx` 참고 */
1183
1502
  cell?: SduiCell;
1184
1503
  }
@@ -1272,10 +1591,28 @@ interface SduiSearchCommonProps {
1272
1591
  headerActions?: React__default.ReactNode;
1273
1592
  /** 가상 스크롤 — true면 기본 임계값 150행, 숫자면 그 값이 임계값 (JSON 직렬화 가능) */
1274
1593
  virtual?: boolean | number;
1594
+ /** 조건 없이 비었을 때의 제목 — 생략 시 "아직 {title}이/가 없습니다" */
1595
+ emptyTitle?: string;
1596
+ /** 조건 없이 비었을 때의 보조 문구 */
1597
+ emptyText?: string;
1598
+ /**
1599
+ * 목록의 **현재 조회 조건**(검색어·상세검색·필터 칩·구분 탭·정렬 — page/limit 제외)을 쿼리 문자열로
1600
+ * 이 상태 키에 적어 둔다(`setState`). 스펙이 같은 조건으로 다른 화면을 여는 자리 — 인쇄 보기
1601
+ * (`/print/asset/assets?` + 조건)처럼 "지금 보이는 목록 그대로"가 필요한 링크 — 가 읽는다.
1602
+ * 조건이 없으면 빈 문자열. 생략하면 아무것도 적지 않는다.
1603
+ */
1604
+ queryStateKey?: string;
1605
+ /**
1606
+ * 표시 전용 강조 — 이 id 의 행·카드를 강조한다(체크박스 선택과 별개, 일괄 액션 대상 아님).
1607
+ * 옆 창에 열어 둔 행을 가리키는 자리: `"selectedIds": [{"$state":"rt.$picked.id"}]`. 계약은 SearchResultsProps.selectedIds.
1608
+ */
1609
+ selectedIds?: string[];
1275
1610
  }
1276
1611
  interface SduiSearchResultsProps extends SduiSearchCommonProps {
1277
1612
  data: SearchRow[];
1278
1613
  }
1614
+ /** page·limit 을 뺀 조회 조건 — `queryStateKey` 에 적는 값. 인쇄·내보내기는 쪽과 무관하게 전체가 대상이다. */
1615
+ declare function conditionParams(params: URLSearchParams): string;
1279
1616
  /** JSON 컬럼 정의 → SearchResults 컬럼. 셀 해석은 cellRenderer 한 벌이다. */
1280
1617
  declare function mapColumns(columns: SduiSearchColumn[], dispatch: SduiDispatch): SearchColumn<SearchRow>[];
1281
1618
  /** 카드 행 표시 조건 판정 — 조건이 아예 없으면 항상 표시한다 */
@@ -1318,56 +1655,6 @@ declare const SduiSearchResults: React__default.FC<SduiSearchResultsProps & Sdui
1318
1655
  /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다. 까닭은 {@link ../boxed.tsx}에 있다. */
1319
1656
  declare const RemoteSearchResults: React__default.FC<RemoteSearchResultsProps & SduiBoxProps>;
1320
1657
 
1321
- /**
1322
- * 목록 표 — SearchResults 전용. 내장 `Table`은 정렬 헤더·선택 표시·가상 스크롤을
1323
- * 다루지 않으므로, 같은 wp-table 마크업/클래스를 유지한 채 그 세 가지를 더한 변형이다.
1324
- *
1325
- * 가상 스크롤은 **의존성 없이** 직접 구현한다(core는 무거운 외부 의존성을 갖지 않는다).
1326
- * ERP는 @tanstack/react-virtual을 썼지만, 여기서 필요한 건 "고정 행 높이 목록의 창"뿐이라
1327
- * scrollTop → 인덱스 범위 계산으로 충분하다. 렌더 범위 밖은 상/하단 스페이서 행으로 대체한다
1328
- * (<table> 마크업에서 transform 대신 안전하게 동작하는 방식).
1329
- */
1330
-
1331
- interface ResultTableColumn<T> {
1332
- key: string;
1333
- header: React__default.ReactNode;
1334
- sortable?: boolean;
1335
- /** right → 우측 정렬 + tabular numerals (wp-table__num) */
1336
- align?: 'left' | 'right';
1337
- /** 고정폭 글꼴 셀 (wp-table__mono) */
1338
- mono?: boolean;
1339
- /** 강조 셀 (wp-table__strong) */
1340
- strong?: boolean;
1341
- /** CSS width — "180px", "22%" */
1342
- width?: string;
1343
- render?: (row: T, index: number) => React__default.ReactNode;
1344
- }
1345
- type SortDir = 'asc' | 'desc';
1346
- interface ResultTableProps<T extends {
1347
- id: string;
1348
- }> {
1349
- columns: ResultTableColumn<T>[];
1350
- rows: T[];
1351
- sort?: {
1352
- key: string;
1353
- dir: SortDir;
1354
- };
1355
- onSort?: (key: string) => void;
1356
- onRowClick?: (row: T) => void;
1357
- selectedIds?: string[];
1358
- /** rows가 비었을 때 표 대신 렌더 */
1359
- empty?: React__default.ReactNode;
1360
- /** true면 스크롤 창 안에서 보이는 행만 렌더한다 */
1361
- virtual?: boolean;
1362
- /** 가상 스크롤 컨테이너 높이(px). 기본 560 */
1363
- height?: number;
1364
- /** 가상 스크롤 행 높이(px) 초기 추정치. 첫 렌더 후 실측값으로 대체된다 — 기본 41(wp-table 기본 행) */
1365
- rowHeight?: number;
1366
- }
1367
- declare function ResultTable<T extends {
1368
- id: string;
1369
- }>({ columns, rows, sort, onSort, onRowClick, selectedIds, empty, virtual, height, rowHeight, }: ResultTableProps<T>): React__default.JSX.Element;
1370
-
1371
1658
  /**
1372
1659
  * 권한 게이트 — 통과하면 children, 실패하면 fallback 슬롯(없으면 아무 것도)을 렌더한다.
1373
1660
  * 판정 자체는 하지 않는다. 호스트가 주입한 콜백(permission.tsx)에 질의만 위임한다.
@@ -1394,8 +1681,22 @@ declare function Can({ entity, action, scope, fallback, children }: CanProps): R
1394
1681
  interface GridProps extends SduiContainerLayoutProps {
1395
1682
  /** wp-grid--N 프리셋 (1~6) */
1396
1683
  columns?: SduiColumnsScale;
1397
- /** 커스텀 트랙 — grid-template-columns 값. columns보다 우선 */
1684
+ /**
1685
+ * 커스텀 트랙 — grid-template-columns 값. columns보다 우선.
1686
+ *
1687
+ * 인라인 `grid-template-columns` 가 아니라 **CSS 변수**(`--wp-grid-template`)와 클래스
1688
+ * (`wp-grid--custom`)로 낸다. 인라인 선언은 미디어 쿼리가 이길 수 없어서, 좁은 화면에서도
1689
+ * 트랙이 그대로 남아 두 칸이 150px 로 찌그러지고 한글이 낱글자로 세로로 쌓였다(실측 390px:
1690
+ * 일괄 대여·카테고리 관리·팀 관리). 데스크톱의 계산 결과는 예전과 같다.
1691
+ * 모바일(≤767.98px)에서는 한 칸으로 접힌다 — 접으면 안 되는 줄은 `collapse={false}`.
1692
+ */
1398
1693
  template?: string;
1694
+ /**
1695
+ * 모바일에서 한 칸으로 접을지(기본 true). `false` 면 좁은 화면에서도 트랙을 지킨다 —
1696
+ * "A → B [x]" 처럼 칸 사이 관계가 곧 뜻인 줄(화살표·삭제 버튼 칸)이 그 자리다.
1697
+ * 5·6열 프리셋의 태블릿 2열 접힘도 함께 끈다.
1698
+ */
1699
+ collapse?: boolean;
1399
1700
  /**
1400
1701
  * 안쪽 여백(`padding`). `Card`가 이미 갖고 있던 것을 여기에도 연다 —
1401
1702
  * 실측: 스펙이 `style.padding`으로 두 번 손으로 쓰고 있었고, 둘 다 그리드 자체의
@@ -1406,7 +1707,7 @@ interface GridProps extends SduiContainerLayoutProps {
1406
1707
  style?: React__default.CSSProperties;
1407
1708
  children?: React__default.ReactNode;
1408
1709
  }
1409
- declare function Grid({ columns, template, gap, rowGap, columnGap, align, justify, wrap, padding, className, style, children, }: GridProps): React__default.JSX.Element;
1710
+ declare function Grid({ columns, template, collapse, gap, rowGap, columnGap, align, justify, wrap, padding, className, style, children, }: GridProps): React__default.JSX.Element;
1410
1711
  type Justify = 'start' | 'center' | 'end' | 'between';
1411
1712
  interface SduiContainerRoleProps {
1412
1713
  /**
@@ -1521,6 +1822,26 @@ interface KeyValueItem {
1521
1822
  * 배열을 그냥 노드로 흘리면 React 가 원소를 구분자 없이 이어 붙여 "ab" 처럼 보인다.
1522
1823
  */
1523
1824
  prefix?: string;
1825
+ /**
1826
+ * 값의 표시 서식.
1827
+ *
1828
+ * - `date` YYYY-MM-DD · `datetime` YYYY-MM-DD HH:mm · `time` HH:mm — 한국 시각(KST)
1829
+ * - `number` 천 단위 쉼표 · `currency` 천 단위 + `원`
1830
+ *
1831
+ * 주지 않아도 **시간대가 붙은 완전한 ISO 일시**("2026-08-07T01:27:23.968677+00:00")는
1832
+ * KST `YYYY-MM-DD HH:mm` 으로 바뀐다 — 서버 타임스탬프를 원문으로 보여 줄 까닭이 없고,
1833
+ * UTC 원문은 한국 시각보다 9시간 이르게 읽힌다. 날짜만 있는 값·숫자·그 밖의 글자는
1834
+ * 서식을 주지 않으면 그대로다.
1835
+ */
1836
+ format?: SduiDisplayFormat;
1837
+ /**
1838
+ * 값을 라벨 **아래 전체 폭**에 왼쪽 정렬로 둔다(원문 줄바꿈 유지).
1839
+ *
1840
+ * 값 칸은 오른쪽 정렬이라, 여러 줄로 넘어가는 서술(요건·비고·사유)이 톱니 모양 문단이 되어
1841
+ * 읽기 어려웠다. 주지 않으면 **줄바꿈이 있거나 80자를 넘는 글**일 때 자동으로 켜진다.
1842
+ * `false` 를 주면 길어도 끈다.
1843
+ */
1844
+ block?: boolean;
1524
1845
  }
1525
1846
  interface KeyValueListProps {
1526
1847
  /** 값의 원천 객체 — 보통 상태 바인딩({ "$state": "selectedOrder" })을 넣는다 */
@@ -1548,13 +1869,28 @@ declare function Show({ when, children }: ShowProps): React__default.JSX.Element
1548
1869
  /** 가로 구분선 */
1549
1870
  declare function Divider({ style, className }: SduiBoxProps): React__default.JSX.Element;
1550
1871
 
1872
+ interface SduiDialogProps extends DialogProps {
1873
+ /**
1874
+ * Escape·바깥 클릭(모바일은 뒤로 가기까지)으로 닫기 전에 "작성 중인 내용을 버릴까요?"를 묻는다.
1875
+ *
1876
+ * - 생략: 창 안의 Form 이 작성 중(`$dirty`)이고 사용자가 창 안을 조작했을 때만 묻는다.
1877
+ * - `true` 또는 문구: 언제나 묻는다(문구를 주면 그 문구로). Form 없이 상태로 입력을 모으는
1878
+ * 창(평가 작성 등)은 `$calc` 로 "입력이 있으면 문구, 없으면 false" 를 묶는다.
1879
+ * - `false`: 묻지 않는다.
1880
+ *
1881
+ * 닫기(X)·스펙의 '취소' 버튼은 사용자가 고른 닫기라 묻지 않는다 — 실수로 닫히는 길은
1882
+ * Escape 와 어두운 바깥 영역이다(ERP 실측: 10문항 평가 작성이 바깥 클릭 한 번에 사라졌다).
1883
+ */
1884
+ confirmClose?: boolean | string;
1885
+ }
1551
1886
  /**
1552
1887
  * Dialog + 표준 닫기 UX(Escape·배경 클릭). 레지스트리의 "Dialog"는 이 래퍼다.
1553
1888
  *
1554
1889
  * 겹침 처리는 전부 OverlayLayer가 맡는다 — 단일 오버레이 루트로 포털해 조상
1555
1890
  * CSS에 휘둘리지 않고, Escape는 맨 위 한 겹만 닫는다(overlay.tsx 주석 참고).
1891
+ * 포커스(열 때 창으로, Tab 가두기, 닫으면 연 버튼으로)와 모바일 뒤로 가기 닫기도 거기 있다.
1556
1892
  */
1557
- declare function SduiDialog(props: DialogProps): React.JSX.Element;
1893
+ declare function SduiDialog({ confirmClose, ...props }: SduiDialogProps): React__default.JSX.Element;
1558
1894
 
1559
1895
  /**
1560
1896
  * SDUI 폼 컨테이너. 필드 값은 페이지 상태의 `{id}.{field}` 키에 산다:
@@ -1577,7 +1913,12 @@ interface SduiFormProps {
1577
1913
  rules?: Record<string, SduiRule[]>;
1578
1914
  /** 에러 메시지용 필드 라벨 */
1579
1915
  labels?: Record<string, string>;
1580
- /** true면 작성 중(dirty) 창 닫기/새로고침 시 확인을 띄운다 */
1916
+ /**
1917
+ * true면 작성 중(dirty)일 때 새로고침·창 닫기와 **앱 안 이동** 전에 확인을 띄운다.
1918
+ * 앱 안 이동은 렌더러의 이탈 가드(`page.leaveGuard` 와 같은 통로)로 올라간다 —
1919
+ * 호스트가 `adapter.setLeaveGuard` 를 받으면 셸 메뉴·뒤로 가기까지 막고, 안 받으면
1920
+ * 스펙의 `navigate` 액션 앞에서만 묻는다. 저장 직후(`$resetDirty` 대기 중)의 이동은 묻지 않는다.
1921
+ */
1581
1922
  guard?: boolean;
1582
1923
  onSubmit?: (event: React__default.FormEvent) => void;
1583
1924
  className?: string;
@@ -1855,6 +2196,24 @@ declare function SduiPermissionProvider({ can, children }: SduiPermissionProvide
1855
2196
  */
1856
2197
  declare function useSduiCan(): SduiCanFn;
1857
2198
 
2199
+ /** Form이 렌더러에 등록하는 검증 설정 */
2200
+ interface SduiFormConfig {
2201
+ rules: Record<string, SduiRule[]>;
2202
+ /** 에러 메시지에 쓸 필드 라벨 (없으면 필드 키) */
2203
+ labels: Record<string, string>;
2204
+ }
2205
+ /**
2206
+ * 렌더러 런타임 — 페이지 상태와 폼 레지스트리에 대한 접근.
2207
+ * SduiForm 등 상태와 직접 상호작용해야 하는 스마트 컴포넌트가 쓴다.
2208
+ */
2209
+ interface SduiRuntime {
2210
+ state: Record<string, SduiPropValue | undefined>;
2211
+ setEntries: (entries: Record<string, SduiPropValue | undefined>) => void;
2212
+ registerForm: (id: string, config: SduiFormConfig) => void;
2213
+ unregisterForm: (id: string) => void;
2214
+ }
2215
+ declare function useSduiRuntime(): SduiRuntime;
2216
+
1858
2217
  /** custom 액션을 앱 코드로 위임하는 확장 지점. */
1859
2218
  type CustomActionHandler = (name: string, payload?: SduiPropValue, value?: unknown) => void;
1860
2219
  /** custom 검증 규칙 구현 — 에러 메시지 또는 null 반환 */
@@ -1974,12 +2333,6 @@ declare function patternSpecCandidates(id: string): SpecIdCandidate[];
1974
2333
  */
1975
2334
  declare function resolvePatternSpec<T>(id: string, load: (specId: string) => Promise<T | null | undefined>): Promise<ResolvedPatternSpec<T> | null>;
1976
2335
 
1977
- /**
1978
- * 어휘 전체. **렌더러와 편집기 검증기가 같은 이 집합을 본다** — 목록이 두 벌이면
1979
- * 한쪽에만 연산을 더했을 때 "렌더는 되는데 저장이 거부되는" 스펙이 생긴다.
1980
- */
1981
- declare const CALC_OPS: ReadonlySet<string>;
1982
-
1983
2336
  declare const ICON_NAMES: readonly string[];
1984
2337
 
1985
2338
  /**
@@ -2013,23 +2366,23 @@ interface SpecIssue {
2013
2366
  type SlotNamesOf = (component: string) => Set<string> | null;
2014
2367
  declare function validateSpec(page: unknown, knownComponents?: Set<string>, slotNamesOf?: SlotNamesOf): SpecIssue[];
2015
2368
 
2016
- /** Form이 렌더러에 등록하는 검증 설정 */
2017
- interface SduiFormConfig {
2018
- rules: Record<string, SduiRule[]>;
2019
- /** 에러 메시지에 쓸 필드 라벨 (없으면 필드 키) */
2020
- labels: Record<string, string>;
2021
- }
2022
2369
  /**
2023
- * 렌더러 런타임 — 페이지 상태와 폼 레지스트리에 대한 접근.
2024
- * SduiForm 등 상태와 직접 상호작용해야 하는 스마트 컴포넌트가 쓴다.
2370
+ * 모바일 폭 판정 — **CSS 와 같은 경계 하나**를 쓴다.
2371
+ *
2372
+ * 브레이크포인트 계약: mobile ≤767.98px · tablet 768–1023.98px · desktop ≥1024px.
2373
+ * `.98` 은 소수 픽셀 뷰포트(확대·고해상도)에서 767px 과 768px 사이가 비지 않게 하는 관례다.
2374
+ * `screen and` 이 붙는 이유: 인쇄 용지 폭(A4 ≈ 720px)이 `max-width` 쿼리에 걸려 인쇄물이
2375
+ * 모바일 배치로 나오는 것을 막는다. LAYOUT_CSS 의 미디어 쿼리도 같은 문자열을 쓴다.
2025
2376
  */
2026
- interface SduiRuntime {
2027
- state: Record<string, SduiPropValue | undefined>;
2028
- setEntries: (entries: Record<string, SduiPropValue | undefined>) => void;
2029
- registerForm: (id: string, config: SduiFormConfig) => void;
2030
- unregisterForm: (id: string) => void;
2031
- }
2032
- declare function useSduiRuntime(): SduiRuntime;
2377
+ declare const MOBILE_MEDIA_QUERY = "screen and (max-width: 767.98px)";
2378
+ /**
2379
+ * 지금 뷰포트가 모바일 폭(≤767.98px)인가.
2380
+ *
2381
+ * JS 로 폭을 판정하는 곳은 **이 훅 하나**다 — 컴포넌트마다 `innerWidth` 를 재거나 자기 경계를
2382
+ * 두면 CSS 가 접는 폭과 JS 가 보기를 바꾸는 폭이 갈라진다. 배치만 바꾸는 일은 CSS 로 하고,
2383
+ * 이 훅은 **CSS 로는 못 하는 것**(기본 보기 전환, 초기 뷰 계산 등)에만 쓴다.
2384
+ */
2385
+ declare function useIsMobile(): boolean;
2033
2386
 
2034
2387
  /**
2035
2388
  * `boxed()` — 어떤 컴포넌트든 바깥에서 온 `style`·`className`을 자기 뿌리에 얹게 만든다.
@@ -2088,6 +2441,11 @@ declare function useOverlayLayer(active: boolean, onEscape?: () => void, nodeRef
2088
2441
  isTop: boolean;
2089
2442
  holdsTop: boolean;
2090
2443
  };
2444
+ /**
2445
+ * 모달 겹이 하나라도 떠 있는가 — 창 밖에서 그려지는 것(토스트)이 자리를 비켜 줄 때 쓴다.
2446
+ * 스택 구독이라 창이 열리고 닫힐 때만 다시 그린다.
2447
+ */
2448
+ declare function useAnyModalOpen(): boolean;
2091
2449
  /**
2092
2450
  * 겹을 담을 곳을 바꾼다. 기본은 body 밑 단일 루트지만, **화면 일부에 페이지를
2093
2451
  * 그려 보이는 곳**(편집기 미리보기·뷰어)은 자기 상자를 지정해야 한다 — 안 그러면
@@ -2162,4 +2520,4 @@ interface ImageViewerProps {
2162
2520
  */
2163
2521
  declare function ImageViewer({ src, alt, open, onClose }: ImageViewerProps): React__default.ReactPortal | null;
2164
2522
 
2165
- export { Actions, type ActionsProps, Alert, type AlertProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, CALC_OPS, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type ColProps, type CustomActionHandler, type CustomValidator, DatePickerProps, DateRangePickerProps, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, ICON_NAMES, Icon, IconButton, type IconButtonProps, type IconProps, ImageViewer, type ImageViewerProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, type MeterTone, NodeErrorBoundary, OverlayContainerContext, OverlayLayer, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, Radio, type RadioProps, type RemotePageState, RemoteSearchResults, type RemoteSearchResultsProps, type RemoteSummaryState, type ResolvedPatternSpec, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SduiAction, type SduiAdapter, type SduiAssetContext, type SduiAssetResolver, type SduiBadgeCell, SduiBoxProps, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, type SduiCell, SduiColumnsScale, SduiContainerLayoutProps, type SduiContainerRoleProps, type SduiDateCell, SduiDialog, type SduiDispatch, SduiForm, type SduiFormConfig, type SduiFormProps, SduiGapScale, type SduiGridCard, type SduiGridCardAction, type SduiGridCardRow, type SduiIconCell, type SduiImageCell, type SduiLinkCell, type SduiNumberCell, SduiPage, SduiPermissionProvider, type SduiProgressCell, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, type SduiRowCondition, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchInvalidationProvider, SduiSearchResults, type SduiSearchResultsProps, type SduiSearchSummary, type SduiSearchSummaryItem, type SduiTagCell, SduiTextAlignScale, type SduiTextCell, type SduiUseSpec, SduiWeightScale, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchInvalidator, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchSummaryCards, type SearchSummaryCardsProps, type SearchTabs, SearchToolbar, type SearchValues, type SearchViewItem, Section, type SectionProps, SegmentedControl, type SegmentedControlProps, type SegmentedItem, Select, type SelectOption, type SelectOptionRecord, type SelectProps, Show, type ShowProps, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SidebarNavSection, type SortDir, SortHandle, type SortHandleProps, SortableList, type SortableListProps, Spacer, type SpacerProps, type SpecIdCandidate, 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, TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, boxed, cascadingValuePaths, cellRenderer, cleanSearchValues, createRegistry, createSearchInvalidator, defaultAdapter, defaultRegistry, getOverlayRoot, imageRenderer, includesLooseSearch, isValidSpecId, joinMultiValue, loadOptionalModule, mapActions, mapCardRows, mapColumns, mapGridCard, mapViews, matchesCondition, normalizePageSizes, normalizeSearchText, patternSpecCandidates, resolvePatternSpec, searchFieldKeys, searchValuesFromParams, sortableDropIndex, sortableMove, splitMultiValue, summaryParams, useOverlayLayer, useRemoteSearchPage, useRemoteSearchSummary, useSduiAssetResolver, useSduiCan, useSduiDispatch, useSduiRuntime, useSduiSandbox, useSearchFetcher, validateSpec, withProps };
2523
+ export { Actions, type ActionsProps, Alert, type AlertProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, CALC_OPS, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type ColProps, type CustomActionHandler, type CustomValidator, DatePickerProps, DateRangePickerProps, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, ICON_NAMES, Icon, IconButton, type IconButtonProps, type IconProps, ImageViewer, type ImageViewerProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, MOBILE_MEDIA_QUERY, type MeterTone, NodeErrorBoundary, ORDER_PARAM, OverlayContainerContext, OverlayLayer, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, Radio, type RadioProps, type RemotePageState, RemoteSearchResults, type RemoteSearchResultsProps, type RemoteSummaryState, type ResolvedPatternSpec, ResultEmptyState, type ResultEmptyStateProps, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SORT_PARAM, SduiAction, type SduiAdapter, type SduiAssetContext, type SduiAssetResolver, type SduiBadgeCell, SduiBoxProps, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, type SduiCell, SduiColumnsScale, SduiContainerLayoutProps, type SduiContainerRoleProps, type SduiDateCell, type SduiDateFormat, SduiDialog, type SduiDispatch, type SduiDisplayFormat, SduiForm, type SduiFormConfig, type SduiFormProps, SduiGapScale, type SduiGridCard, type SduiGridCardAction, type SduiGridCardRow, type SduiIconCell, type SduiImageCell, type SduiLinkCell, type SduiNumberCell, SduiPage, SduiPermissionProvider, type SduiProgressCell, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, type SduiRowCondition, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchInvalidationProvider, SduiSearchResults, type SduiSearchResultsProps, type SduiSearchSummary, type SduiSearchSummaryItem, type SduiTagCell, SduiTextAlignScale, type SduiTextCell, type SduiUseSpec, SduiWeightScale, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchInvalidator, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchSummaryCards, type SearchSummaryCardsProps, type SearchTabs, SearchToolbar, type SearchValues, type SearchViewItem, Section, type SectionProps, SegmentedControl, type SegmentedControlProps, type SegmentedItem, Select, type SelectOption, type SelectOptionRecord, type SelectProps, type ServerSortMemory, type ServerUnsortable, Show, type ShowProps, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SidebarNavSection, type SortDir, type SortEcho, SortHandle, type SortHandleProps, type SortState, SortableList, type SortableListProps, Spacer, type SpacerProps, type SpecIdCandidate, 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, TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, boxed, cascadingValuePaths, cellRenderer, cleanSearchValues, conditionParams, createRegistry, createSearchInvalidator, createServerSortMemory, defaultAdapter, defaultRegistry, formatDateValue, formatDisplayValue, formatNumberValue, getOverlayRoot, imageRenderer, includesLooseSearch, isValidSpecId, isZonedIsoDateTime, joinMultiValue, loadOptionalModule, mapActions, mapCardRows, mapColumns, mapGridCard, mapViews, matchesCondition, nextSort, normalizePageSizes, normalizeSearchText, parseNumeric, patternSpecCandidates, resolvePatternSpec, searchFieldKeys, searchValuesFromParams, serverSortMemory, sortEchoOf, sortFromParams, sortableDropIndex, sortableMove, splitMultiValue, summaryParams, useAnyModalOpen, useIsMobile, useOverlayLayer, useRemoteSearchPage, useRemoteSearchSummary, useSduiAssetResolver, useSduiCan, useSduiDispatch, useSduiRuntime, useSduiSandbox, useSearchFetcher, validateSpec, withProps, withoutSort };