@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
@@ -1,5 +1,5 @@
1
- import { Icon, Badge, Tooltip } from './chunk-RNOUXUBO.js';
2
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { Icon, Badge, Tooltip } from './chunk-YYAGE733.js';
2
+ import { boxed } from './chunk-3JTBOABA.js';
3
3
  import React from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -25,6 +25,14 @@ var STATUS_META = {
25
25
  border: "var(--wp-status-neutral-border)",
26
26
  fg: "var(--wp-status-neutral-fg)"
27
27
  },
28
+ // 취소 — 신청자가 거둬들인 문서의 단계. 반려(빨강 x)와 달리 회색이라 판정이 아닌 종료로 읽힌다.
29
+ cancelled: {
30
+ icon: "circle-x",
31
+ label: "\uCDE8\uC18C",
32
+ bg: "var(--wp-status-neutral-bg)",
33
+ border: "var(--wp-status-neutral-border)",
34
+ fg: "var(--wp-status-neutral-fg)"
35
+ },
28
36
  current: {
29
37
  icon: "circle-dot",
30
38
  label: "\uC9C4\uD589 \uC911",
@@ -40,6 +48,9 @@ var STATUS_META = {
40
48
  fg: "var(--wp-text-muted)"
41
49
  }
42
50
  };
51
+ function normalizeStepStatus(status) {
52
+ return status && Object.prototype.hasOwnProperty.call(STATUS_META, status) ? status : "pending";
53
+ }
43
54
  function stepTitle(step, index, typeLabels) {
44
55
  const name = step.name?.trim();
45
56
  if (name) return name;
@@ -84,6 +95,15 @@ var nodeTextStyle = {
84
95
  whiteSpace: "nowrap",
85
96
  textAlign: "center"
86
97
  };
98
+ var noticeNodeStyle = { ...nodeStyle, maxWidth: 240 };
99
+ var noticeTextStyle = {
100
+ display: "block",
101
+ maxWidth: "100%",
102
+ textAlign: "center",
103
+ whiteSpace: "normal",
104
+ wordBreak: "keep-all",
105
+ overflowWrap: "anywhere"
106
+ };
87
107
  var connectorStyle = {
88
108
  flex: "none",
89
109
  width: "var(--wp-space-6)",
@@ -93,7 +113,7 @@ var connectorStyle = {
93
113
  marginTop: "calc(var(--wp-space-1) + 16px)"
94
114
  };
95
115
  function stepTooltip(step, index, typeLabels) {
96
- const meta = STATUS_META[step.status ?? "pending"];
116
+ const meta = STATUS_META[normalizeStepStatus(step.status)];
97
117
  const lines = [`${stepTitle(step, index, typeLabels)} \u2014 ${meta.label}`];
98
118
  if (step.approver) lines.push(`\uCC98\uB9AC\uC790: ${step.approver}`);
99
119
  if (step.processedAt) lines.push(`\uCC98\uB9AC \uC77C\uC2DC: ${formatDateTime(step.processedAt)}`);
@@ -102,14 +122,53 @@ function stepTooltip(step, index, typeLabels) {
102
122
  }
103
123
  return /* @__PURE__ */ jsx(Fragment, { children: lines.map((line) => /* @__PURE__ */ jsx("span", { style: { display: "block" }, children: line }, line)) });
104
124
  }
125
+ var OUTCOME_NOTICE = {
126
+ approved: {
127
+ tone: "success",
128
+ icon: "check-check",
129
+ badge: "\uC790\uB3D9 \uC2B9\uC778",
130
+ text: "\uACB0\uC7AC \uB2E8\uACC4 \uC5C6\uC774 \uC790\uB3D9 \uC2B9\uC778\uB418\uC5C8\uC2B5\uB2C8\uB2E4"
131
+ },
132
+ pending: {
133
+ tone: "success",
134
+ icon: "check-check",
135
+ badge: "\uC790\uB3D9 \uC2B9\uC778",
136
+ text: "\uACB0\uC7AC \uB2E8\uACC4\uAC00 \uC5C6\uC5B4 \uC62C\uB9AC\uB294 \uC989\uC2DC \uC2B9\uC778\uB429\uB2C8\uB2E4"
137
+ },
138
+ rejected: { tone: "danger", icon: "x", badge: "\uBC18\uB824", text: "\uACB0\uC7AC \uB2E8\uACC4 \uC5C6\uC774 \uBC18\uB824\uB418\uC5C8\uC2B5\uB2C8\uB2E4" },
139
+ cancelled: { tone: "neutral", icon: "circle-x", badge: "\uCDE8\uC18C", text: "\uACB0\uC7AC\uAC00 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4" }
140
+ };
141
+ var OUTCOME_STATUS = {
142
+ approved: "approved",
143
+ pending: "pending",
144
+ rejected: "rejected",
145
+ cancelled: "cancelled"
146
+ };
147
+ function normalizeOutcome(outcome) {
148
+ return outcome && Object.prototype.hasOwnProperty.call(OUTCOME_NOTICE, outcome) ? outcome : "approved";
149
+ }
105
150
  function ApprovalStepperImpl({
106
151
  requester,
107
152
  steps,
153
+ decidedBy,
154
+ decidedAt,
155
+ outcome,
108
156
  onStepClick,
109
157
  typeLabels
110
158
  }) {
111
- const safeSteps = steps ?? [];
112
159
  const clickable = typeof onStepClick === "function";
160
+ const result = normalizeOutcome(outcome);
161
+ const decider = decidedBy?.trim();
162
+ if (steps === null || steps === void 0) return null;
163
+ const safeSteps = steps.length > 0 ? steps : decider ? [
164
+ {
165
+ id: "__decision",
166
+ name: "\uACB0\uC7AC",
167
+ status: OUTCOME_STATUS[result],
168
+ approver: decider,
169
+ processedAt: decidedAt?.trim() || void 0
170
+ }
171
+ ] : [];
113
172
  const requesterNode = requester ? /* @__PURE__ */ jsxs("div", { style: nodeStyle, children: [
114
173
  /* @__PURE__ */ jsx(
115
174
  "span",
@@ -127,17 +186,27 @@ function ApprovalStepperImpl({
127
186
  /* @__PURE__ */ jsx("span", { className: "wp-caption", style: nodeTextStyle, children: requester.sub?.trim() || "\uC2E0\uCCAD\uC790" })
128
187
  ] }) : null;
129
188
  if (safeSteps.length === 0) {
130
- return /* @__PURE__ */ jsxs("div", { className: "wp-row", style: { overflowX: "auto", paddingBottom: "var(--wp-space-1)" }, children: [
131
- requesterNode,
132
- requesterNode ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: connectorStyle }) : null,
133
- /* @__PURE__ */ jsxs("div", { style: nodeStyle, children: [
134
- /* @__PURE__ */ jsxs(Badge, { tone: "success", size: "lg", children: [
135
- /* @__PURE__ */ jsx(Icon, { name: "check-check", size: 14, style: { marginRight: "var(--wp-space-1)" } }),
136
- "\uC790\uB3D9 \uC2B9\uC778"
137
- ] }),
138
- /* @__PURE__ */ jsx("span", { className: "wp-caption", style: { textAlign: "center", whiteSpace: "nowrap" }, children: "\uACB0\uC7AC \uB2E8\uACC4\uAC00 \uC5C6\uC5B4 \uC790\uB3D9\uC73C\uB85C \uC2B9\uC778\uB429\uB2C8\uB2E4" })
139
- ] })
140
- ] });
189
+ const notice = OUTCOME_NOTICE[result];
190
+ const when = decidedAt?.trim();
191
+ return /* @__PURE__ */ jsxs(
192
+ "div",
193
+ {
194
+ className: "wp-row",
195
+ style: { alignItems: "flex-start", overflowX: "auto", paddingBottom: "var(--wp-space-1)" },
196
+ children: [
197
+ requesterNode,
198
+ requesterNode ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: connectorStyle }) : null,
199
+ /* @__PURE__ */ jsxs("div", { style: noticeNodeStyle, "data-outcome": result, children: [
200
+ /* @__PURE__ */ jsxs(Badge, { tone: notice.tone, size: "lg", children: [
201
+ /* @__PURE__ */ jsx(Icon, { name: notice.icon, size: 14, style: { marginRight: "var(--wp-space-1)" } }),
202
+ notice.badge
203
+ ] }),
204
+ /* @__PURE__ */ jsx("span", { className: "wp-caption", style: noticeTextStyle, children: notice.text }),
205
+ when ? /* @__PURE__ */ jsx("span", { className: "wp-caption", style: { ...noticeTextStyle, color: "var(--wp-text-muted)" }, children: formatDateTime(when) }) : null
206
+ ] })
207
+ ]
208
+ }
209
+ );
141
210
  }
142
211
  return /* @__PURE__ */ jsxs(
143
212
  "div",
@@ -154,8 +223,9 @@ function ApprovalStepperImpl({
154
223
  children: [
155
224
  requesterNode,
156
225
  safeSteps.map((step, index) => {
157
- const status = step.status ?? "pending";
226
+ const status = normalizeStepStatus(step.status);
158
227
  const meta = STATUS_META[status];
228
+ const muted = status === "skipped" || status === "cancelled";
159
229
  const body = /* @__PURE__ */ jsxs(Fragment, { children: [
160
230
  /* @__PURE__ */ jsx("span", { style: circleStyle(meta.bg, meta.border, meta.fg, status === "current"), children: /* @__PURE__ */ jsx(Icon, { name: meta.icon, size: 16 }) }),
161
231
  /* @__PURE__ */ jsx(
@@ -164,7 +234,7 @@ function ApprovalStepperImpl({
164
234
  className: "wp-body-sm",
165
235
  style: {
166
236
  ...nodeTextStyle,
167
- color: status === "skipped" ? "var(--wp-text-muted)" : "var(--wp-text-strong)"
237
+ color: muted ? "var(--wp-text-muted)" : "var(--wp-text-strong)"
168
238
  },
169
239
  children: stepTitle(step, index, typeLabels)
170
240
  }
@@ -208,4 +278,4 @@ function ApprovalStepperImpl({
208
278
  }
209
279
  var ApprovalStepper = boxed(ApprovalStepperImpl, "ApprovalStepper");
210
280
 
211
- export { ApprovalStepper };
281
+ export { ApprovalStepper, normalizeStepStatus };
@@ -1,6 +1,6 @@
1
- import { usePanZoomCanvas, MIN_ZOOM, MAX_ZOOM } from './chunk-MMIGOPO5.js';
2
- import { IconButton, Badge } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { usePanZoomCanvas, MIN_ZOOM, MAX_ZOOM } from './chunk-CSZCWBOE.js';
2
+ import { IconButton, Badge } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useMemo, useCallback, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -112,6 +112,7 @@ function OrgChartImpl({
112
112
  setView,
113
113
  dragging,
114
114
  isFullscreen,
115
+ pseudoFullscreen,
115
116
  viewportCenter,
116
117
  zoomAt,
117
118
  toggleFullscreen,
@@ -161,7 +162,9 @@ function OrgChartImpl({
161
162
  cursor: dragging ? "grabbing" : "grab",
162
163
  touchAction: "none",
163
164
  overscrollBehavior: "contain",
164
- userSelect: "none"
165
+ userSelect: "none",
166
+ // 요소 전체화면이 없는 브라우저(iPhone Safari)의 대체 — 화면을 덮는 고정 배치
167
+ ...pseudoFullscreen ? { position: "fixed", inset: 0, zIndex: "var(--wp-z-dialog)", height: "100dvh", borderRadius: 0 } : null
165
168
  },
166
169
  children: [
167
170
  /* @__PURE__ */ jsxs(
@@ -1,4 +1,4 @@
1
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { boxed } from './chunk-3JTBOABA.js';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
 
4
4
  var resolveColor = (color, index) => {
@@ -1,6 +1,6 @@
1
- import { Text } from './chunk-WPSK2CB5.js';
2
- import { Field, Input, Select, IconButton, Button } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { Text } from './chunk-UC725BGW.js';
2
+ import { Field, Input, Select, IconButton, Button } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useMemo } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,7 +1,7 @@
1
- import { ImageLightbox } from './chunk-VY7MVBSE.js';
2
- import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-KO6OEY3G.js';
3
- import { Spinner, Icon, IconButton } from './chunk-RNOUXUBO.js';
4
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { ImageLightbox } from './chunk-3PT5OBOU.js';
2
+ import { useSduiSandbox, useSduiAdapter, hostRawFetchOf, defaultAdapter, useSduiAssetResolver } from './chunk-JHFA5RDN.js';
3
+ import { Spinner, Icon, IconButton } from './chunk-YYAGE733.js';
4
+ import { boxed } from './chunk-3JTBOABA.js';
5
5
  import { useState, useRef, useEffect, useCallback } from 'react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
7
 
@@ -1,25 +1,31 @@
1
+ import { useOverlayLayer, OverlayContainerContext, getOverlayRoot } from './chunk-BITS7UJY.js';
1
2
  import { HoistedStyle } from './chunk-RIZRM7OO.js';
2
- import { useOverlayLayer, OverlayContainerContext, getOverlayRoot } from './chunk-XQPTSEJC.js';
3
- import { Icon } from './chunk-RNOUXUBO.js';
4
- import { boxed } from './chunk-5WW4MBRO.js';
3
+ import { useIsMobile } from './chunk-GSM664TX.js';
4
+ import { Icon } from './chunk-YYAGE733.js';
5
+ import { boxed } from './chunk-3JTBOABA.js';
5
6
  import React, { useState, useRef, useEffect, useMemo, useCallback, useLayoutEffect } from 'react';
6
7
  import { createPortal } from 'react-dom';
7
8
  import { jsxs, jsx } from 'react/jsx-runtime';
8
9
 
9
10
  var ANCHOR_GAP = 8;
10
11
  var VIEWPORT_EDGE = 8;
11
- function anchorTo(host, height) {
12
- if (!host || typeof window === "undefined") return null;
13
- const rect = host.getBoundingClientRect();
14
- const below = window.innerHeight - rect.bottom;
12
+ function anchorTo(rect, viewportHeight, height) {
13
+ const below = viewportHeight - rect.bottom;
15
14
  const up = below < height && rect.top > below;
15
+ const room = (up ? rect.top : below) - ANCHOR_GAP - VIEWPORT_EDGE;
16
16
  return {
17
17
  left: rect.left,
18
18
  top: up ? void 0 : rect.bottom + ANCHOR_GAP,
19
- bottom: up ? window.innerHeight - rect.top + ANCHOR_GAP : void 0,
20
- minWidth: rect.width
19
+ bottom: up ? viewportHeight - rect.top + ANCHOR_GAP : void 0,
20
+ minWidth: rect.width,
21
+ available: Math.max(MIN_AVAILABLE, Math.floor(room))
21
22
  };
22
23
  }
24
+ var MIN_AVAILABLE = 120;
25
+ function anchorToHost(host, height) {
26
+ if (!host || typeof window === "undefined") return null;
27
+ return anchorTo(host.getBoundingClientRect(), window.innerHeight, height);
28
+ }
23
29
  function usePopoverAnchor(open, hostRef, popRef, height) {
24
30
  const [anchor, setAnchor] = useState(null);
25
31
  useLayoutEffect(() => {
@@ -27,7 +33,7 @@ function usePopoverAnchor(open, hostRef, popRef, height) {
27
33
  setAnchor(null);
28
34
  return;
29
35
  }
30
- const place = () => setAnchor(anchorTo(hostRef.current, height));
36
+ const place = () => setAnchor(anchorToHost(hostRef.current, height));
31
37
  place();
32
38
  window.addEventListener("scroll", place, true);
33
39
  window.addEventListener("resize", place);
@@ -57,7 +63,14 @@ var ANCHORED_POP_CSS = `
57
63
  `;
58
64
  function anchorStyle(anchor) {
59
65
  if (!anchor) return void 0;
60
- return { left: anchor.left, top: anchor.top, bottom: anchor.bottom, minWidth: anchor.minWidth };
66
+ const style = {
67
+ left: anchor.left,
68
+ top: anchor.top,
69
+ bottom: anchor.bottom,
70
+ minWidth: anchor.minWidth
71
+ };
72
+ if (anchor.available !== void 0) style["--wp-pop-avail"] = `${anchor.available}px`;
73
+ return style;
61
74
  }
62
75
  function usePortalTo() {
63
76
  const container = React.useContext(OverlayContainerContext);
@@ -279,7 +292,7 @@ function TimePickerImpl({
279
292
  var TP_CSS = `
280
293
  .wp-tp-host{position:relative}
281
294
  .wp-tp-input{padding-right:6px;min-width:calc(5ch + 36px)}
282
- .wp-tp-pop{padding:var(--wp-space-1);max-height:260px;overflow-y:auto;overscroll-behavior:contain}
295
+ .wp-tp-pop{padding:var(--wp-space-1);max-height:min(260px,var(--wp-pop-avail,260px));overflow-y:auto;overscroll-behavior:contain}
283
296
  .wp-tp-opt{display:block;width:100%;padding:6px 10px;border:none;background:transparent;border-radius:var(--wp-radius-sm);font:inherit;font-family:var(--wp-font-mono);font-size:12.5px;color:var(--wp-text-default);text-align:left;cursor:pointer}
284
297
  .wp-tp-opt:hover{background:var(--wp-surface-hover)}
285
298
  .wp-tp-opt:focus-visible{outline:2px solid var(--wp-border-focus);outline-offset:-2px}
@@ -360,6 +373,33 @@ function splitDateTime(value) {
360
373
  const [date = "", time = ""] = value.split(/[T ]/, 2);
361
374
  return [date, time.slice(0, 5)];
362
375
  }
376
+ var ZONED_RE = /^(\d{4}-\d{2}-\d{2})[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?\s*(Z|[+-]\d{2}(?::?\d{2})?)$/i;
377
+ function isZonedDateTime(value) {
378
+ return typeof value === "string" && ZONED_RE.test(value.trim());
379
+ }
380
+ function toLocalWallClock(value) {
381
+ const match = ZONED_RE.exec(value.trim());
382
+ if (!match) return value;
383
+ const [, date, hh, mm, ss = "00", zone] = match;
384
+ const offset = zone.toUpperCase() === "Z" ? "Z" : `${zone.slice(0, 3)}:${zone.length > 3 ? zone.slice(-2) : "00"}`;
385
+ const instant = /* @__PURE__ */ new Date(`${date}T${hh}:${mm}:${ss}${offset}`);
386
+ if (Number.isNaN(instant.getTime())) return value;
387
+ const h = String(instant.getHours()).padStart(2, "0");
388
+ const m = String(instant.getMinutes()).padStart(2, "0");
389
+ return `${formatYmd(instant)}T${h}:${m}`;
390
+ }
391
+ function withLocalOffset(wall) {
392
+ const [date, time] = splitDateTime(wall);
393
+ const day = parseYmd(date);
394
+ const minuteOfDay = parseHm(time);
395
+ if (!day || minuteOfDay === void 0) return wall;
396
+ const local = new Date(day.getFullYear(), day.getMonth(), day.getDate(), Math.floor(minuteOfDay / 60), minuteOfDay % 60, 0, 0);
397
+ const minutes = -local.getTimezoneOffset();
398
+ const sign = minutes >= 0 ? "+" : "-";
399
+ const abs = Math.abs(minutes);
400
+ const zone = `${sign}${String(Math.floor(abs / 60)).padStart(2, "0")}:${String(abs % 60).padStart(2, "0")}`;
401
+ return `${date}T${time}:00${zone}`;
402
+ }
363
403
  function toFieldText(value, withTime) {
364
404
  if (!withTime) return splitDateTime(value)[0];
365
405
  const [date, time] = splitDateTime(value);
@@ -617,6 +657,7 @@ function DatePickerImpl({
617
657
  disabled = false,
618
658
  size = "md",
619
659
  withTime = false,
660
+ zoned,
620
661
  locale
621
662
  }) {
622
663
  const loc = resolveLocale(locale, KO_LOCALE.calendarLabel);
@@ -626,7 +667,10 @@ function DatePickerImpl({
626
667
  const popRef = useRef(null);
627
668
  const inputRef = useRef(null);
628
669
  const isControlled = value !== void 0;
629
- const currentValue = (isControlled ? value : innerValue) ?? "";
670
+ const rawValue = (isControlled ? value : innerValue) ?? "";
671
+ const currentValue = useMemo(() => toLocalWallClock(String(rawValue)), [rawValue]);
672
+ const sawZone = useRef(false);
673
+ if (isZonedDateTime(rawValue)) sawZone.current = true;
630
674
  const fieldText = useMemo(() => toFieldText(currentValue, withTime), [currentValue, withTime]);
631
675
  const [text, setText] = useState(fieldText);
632
676
  useEffect(() => {
@@ -645,7 +689,9 @@ function DatePickerImpl({
645
689
  const anchor = usePopoverAnchor(open, hostRef, popRef, CALENDAR_HEIGHT);
646
690
  const portal = usePortalTo();
647
691
  const isInvalid = Boolean(invalid);
648
- const commit = (next) => {
692
+ const commit = (wall) => {
693
+ const emitZone = withTime && wall !== "" && (zoned ?? sawZone.current);
694
+ const next = emitZone ? withLocalOffset(wall) : wall;
649
695
  if (!isControlled) setInnerValue(next);
650
696
  onChange?.(next);
651
697
  };
@@ -744,6 +790,10 @@ function DatePickerImpl({
744
790
  )
745
791
  ] });
746
792
  }
793
+ function rangeEndText(value) {
794
+ if (typeof value !== "string") return "";
795
+ return isZonedDateTime(value) ? toLocalWallClock(value).slice(0, 10) : value;
796
+ }
747
797
  function DateRangePickerImpl({
748
798
  value,
749
799
  onChange,
@@ -763,8 +813,10 @@ function DateRangePickerImpl({
763
813
  const toRef = useRef(null);
764
814
  const isControlled = value !== void 0;
765
815
  const currentRange = (isControlled ? value : innerRange) ?? {};
766
- const fromValue = currentRange.from ?? "";
767
- const toValue = currentRange.to ?? "";
816
+ const fromValue = rangeEndText(currentRange.from);
817
+ const toValue = rangeEndText(currentRange.to);
818
+ const isMobile = useIsMobile();
819
+ const monthCount = isMobile ? 1 : 2;
768
820
  const [fromText, setFromText] = useState(fromValue);
769
821
  const [toText, setToText] = useState(toValue);
770
822
  useEffect(() => {
@@ -915,14 +967,14 @@ function DateRangePickerImpl({
915
967
  "div",
916
968
  {
917
969
  ref: popRef,
918
- className: "wp-anchored-pop wp-dp-pop wp-dp-pop--wide",
970
+ className: monthCount > 1 ? "wp-anchored-pop wp-dp-pop wp-dp-pop--wide" : "wp-anchored-pop wp-dp-pop",
919
971
  style: anchorStyle(anchor),
920
972
  role: "dialog",
921
973
  "aria-label": loc.calendarLabel,
922
974
  children: /* @__PURE__ */ jsx("div", { className: "wp-dp-pop__body", children: /* @__PURE__ */ jsx(
923
975
  Calendar,
924
976
  {
925
- monthCount: 2,
977
+ monthCount,
926
978
  minDate,
927
979
  maxDate,
928
980
  focusDate,
@@ -952,7 +1004,9 @@ function DateRangePickerImpl({
952
1004
  var DP_CSS = `
953
1005
  .wp-dp-host{position:relative}
954
1006
  .wp-dp-pop--wide{max-width:min(92vw,720px)}
955
- .wp-dp-pop__body{padding:var(--wp-space-4);max-height:60vh;overflow:auto}
1007
+ /* \uC0C1\uD55C\uC740 \uD654\uBA74 60% \uC640 **\uD3B8 \uCABD\uC5D0 \uB0A8\uC740 \uB192\uC774**(anchored-popover \uAC00 --wp-pop-avail \uB85C \uC2E3\uB294\uB2E4) \uC911
1008
+ \uC791\uC740 \uCABD \u2014 \uCE78\uC774 \uD654\uBA74 \uC544\uB798\uCABD\uC774\uBA74 \uD328\uB110\uC774 \uBDF0\uD3EC\uD2B8 \uBC16\uC73C\uB85C \uB118\uCE58\uC9C0 \uC54A\uACE0 \uC548\uC5D0\uC11C \uC2A4\uD06C\uB864\uD55C\uB2E4. */
1009
+ .wp-dp-pop__body{padding:var(--wp-space-4);max-height:min(60vh,calc(var(--wp-pop-avail,100vh) - 2px));overflow:auto}
956
1010
  .wp-dp-range{display:flex;align-items:center;gap:var(--wp-space-1)}
957
1011
  .wp-dp-range>*{flex:1 1 0;min-width:0}
958
1012
  .wp-dp-range__sep{flex:none;color:var(--wp-text-subtle)}
@@ -1,6 +1,6 @@
1
- import { DateRangePicker } from './chunk-RWSH2MBU.js';
2
- import { SegmentedControl, Select } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { DateRangePicker } from './chunk-FP32LNFK.js';
2
+ import { SegmentedControl, Select } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useMemo } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -161,14 +161,14 @@ function PeriodFilterImpl({ value, onChange, years, modes }) {
161
161
  gap: "var(--wp-space-2)"
162
162
  },
163
163
  children: [
164
- /* @__PURE__ */ jsx(
164
+ modeItems.length > 1 ? /* @__PURE__ */ jsx(
165
165
  SegmentedControl,
166
166
  {
167
167
  items: [...modeItems],
168
168
  value: period.mode,
169
169
  onChange: (m) => emit(convertMode(period, m))
170
170
  }
171
- ),
171
+ ) : null,
172
172
  period.mode !== "custom" ? /* @__PURE__ */ jsx("span", { style: { width: 96, flex: "none" }, children: /* @__PURE__ */ jsx(
173
173
  Select,
174
174
  {
@@ -0,0 +1,38 @@
1
+ import { useSyncExternalStore } from 'react';
2
+
3
+ // src/env.ts
4
+ var DEV = (() => {
5
+ try {
6
+ const meta = import.meta;
7
+ return Boolean(meta.env?.DEV);
8
+ } catch {
9
+ return false;
10
+ }
11
+ })();
12
+ var MOBILE_MEDIA_QUERY = "screen and (max-width: 767.98px)";
13
+ function mobileQueryList() {
14
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return null;
15
+ return window.matchMedia(MOBILE_MEDIA_QUERY);
16
+ }
17
+ function subscribeMobile(onChange) {
18
+ const list = mobileQueryList();
19
+ if (!list) return () => {
20
+ };
21
+ if (typeof list.addEventListener === "function") {
22
+ list.addEventListener("change", onChange);
23
+ return () => list.removeEventListener("change", onChange);
24
+ }
25
+ list.addListener(onChange);
26
+ return () => list.removeListener(onChange);
27
+ }
28
+ function mobileSnapshot() {
29
+ return mobileQueryList()?.matches ?? false;
30
+ }
31
+ function mobileServerSnapshot() {
32
+ return false;
33
+ }
34
+ function useIsMobile() {
35
+ return useSyncExternalStore(subscribeMobile, mobileSnapshot, mobileServerSnapshot);
36
+ }
37
+
38
+ export { DEV, MOBILE_MEDIA_QUERY, useIsMobile };
@@ -1,6 +1,6 @@
1
- import { useSduiAdapter, hostFetchOf } from './chunk-KO6OEY3G.js';
2
- import { Badge, Tag } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { useSduiAdapter, hostFetchOf } from './chunk-JHFA5RDN.js';
2
+ import { Badge, Tag } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useRef, useEffect, useMemo, useState } from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,5 +1,5 @@
1
- import { boxed } from './chunk-5WW4MBRO.js';
2
- import { useState } from 'react';
1
+ import { boxed } from './chunk-3JTBOABA.js';
2
+ import { useRef, useState, useEffect } from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
5
5
  var RECORD_SHEET_CSS = `
@@ -15,7 +15,13 @@ var RECORD_SHEET_CSS = `
15
15
  .erp-recsheet__img{display:block;width:100%;height:11rem;object-fit:cover;border-radius:var(--wp-radius-sm)}
16
16
  .erp-recsheet__noimg{display:flex;align-items:center;justify-content:center;width:100%;height:11rem;border:var(--wp-border-w) dashed var(--wp-border-default);border-radius:var(--wp-radius-sm);color:var(--wp-text-disabled);font-size:var(--wp-size-xs)}
17
17
  .erp-recsheet__note{margin:var(--wp-space-2) 0 0;text-align:right;color:var(--wp-text-subtle);font-size:var(--wp-size-xs)}
18
+ .erp-recsheet__frame{position:relative;min-width:0}
19
+ .erp-recsheet__frame::before,.erp-recsheet__frame::after{content:"";position:absolute;top:0;bottom:0;z-index:1;width:var(--wp-space-4);pointer-events:none;opacity:0;transition:opacity var(--wp-duration-fast)}
20
+ .erp-recsheet__frame::before{left:0;background:linear-gradient(to right,color-mix(in srgb,var(--wp-text-strong) 16%,transparent),transparent)}
21
+ .erp-recsheet__frame::after{right:0;background:linear-gradient(to left,color-mix(in srgb,var(--wp-text-strong) 16%,transparent),transparent)}
22
+ .erp-recsheet__frame[data-more-left]::before,.erp-recsheet__frame[data-more-right]::after{opacity:1}
18
23
  @media print{
24
+ .erp-recsheet__frame::before,.erp-recsheet__frame::after{display:none}
19
25
  .erp-recsheet__scroll{overflow-x:visible}
20
26
  .erp-recsheet{min-width:0}
21
27
  .erp-recsheet tr{break-inside:avoid}
@@ -88,6 +94,8 @@ function repeatLength(sources, minRows) {
88
94
  return Math.max(longest, Math.max(0, Math.floor(minRows ?? 0)));
89
95
  }
90
96
  function RecordSheetImpl({ columns, title, rows, note }) {
97
+ const scrollRef = useRef(null);
98
+ const edges = useScrollEdges(scrollRef);
91
99
  const width = gridColumns(columns);
92
100
  const list = Array.isArray(rows) ? rows : [];
93
101
  const body = [];
@@ -116,17 +124,48 @@ function RecordSheetImpl({ columns, title, rows, note }) {
116
124
  }
117
125
  body.push(/* @__PURE__ */ jsx("tr", { children: renderCells(cells, null, `row-${rowIndex}`) }, `row-${rowIndex}`));
118
126
  });
119
- return /* @__PURE__ */ jsxs("div", { className: "erp-recsheet__scroll", children: [
120
- /* @__PURE__ */ jsx(RecordSheetStyles, {}),
121
- /* @__PURE__ */ jsxs("table", { className: "erp-recsheet", children: [
122
- /* @__PURE__ */ jsx("colgroup", { children: Array.from({ length: width }, (_, index) => /* @__PURE__ */ jsx("col", { style: { width: `${100 / width}%` } }, index)) }),
123
- /* @__PURE__ */ jsxs("tbody", { children: [
124
- title ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { className: "erp-recsheet__title", colSpan: width, children: title }) }) : null,
125
- body
127
+ return /* @__PURE__ */ jsx(
128
+ "div",
129
+ {
130
+ className: "erp-recsheet__frame",
131
+ "data-more-left": edges.left ? "" : void 0,
132
+ "data-more-right": edges.right ? "" : void 0,
133
+ children: /* @__PURE__ */ jsxs("div", { ref: scrollRef, className: "erp-recsheet__scroll", children: [
134
+ /* @__PURE__ */ jsx(RecordSheetStyles, {}),
135
+ /* @__PURE__ */ jsxs("table", { className: "erp-recsheet", children: [
136
+ /* @__PURE__ */ jsx("colgroup", { children: Array.from({ length: width }, (_, index) => /* @__PURE__ */ jsx("col", { style: { width: `${100 / width}%` } }, index)) }),
137
+ /* @__PURE__ */ jsxs("tbody", { children: [
138
+ title ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { className: "erp-recsheet__title", colSpan: width, children: title }) }) : null,
139
+ body
140
+ ] })
141
+ ] }),
142
+ note ? /* @__PURE__ */ jsx("p", { className: "erp-recsheet__note", children: note }) : null
126
143
  ] })
127
- ] }),
128
- note ? /* @__PURE__ */ jsx("p", { className: "erp-recsheet__note", children: note }) : null
129
- ] });
144
+ }
145
+ );
146
+ }
147
+ function useScrollEdges(ref) {
148
+ const [edges, setEdges] = useState({ left: false, right: false });
149
+ useEffect(() => {
150
+ const el = ref.current;
151
+ if (!el) return;
152
+ const update = () => {
153
+ const left = el.scrollLeft > 1;
154
+ const right = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;
155
+ setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
156
+ };
157
+ update();
158
+ el.addEventListener("scroll", update, { passive: true });
159
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(update);
160
+ observer?.observe(el);
161
+ const table = el.querySelector("table");
162
+ if (table) observer?.observe(table);
163
+ return () => {
164
+ el.removeEventListener("scroll", update);
165
+ observer?.disconnect();
166
+ };
167
+ }, [ref]);
168
+ return edges;
130
169
  }
131
170
  var RecordSheet = boxed(RecordSheetImpl, "RecordSheet");
132
171
 
@@ -1,6 +1,6 @@
1
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-KO6OEY3G.js';
2
- import { Spinner, Badge, Icon } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-JHFA5RDN.js';
2
+ import { Spinner, Badge, Icon } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useEffect } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
@@ -1,8 +1,8 @@
1
- import { ellipsisStyle, unwrapRows } from './chunk-Q4SWUINA.js';
2
- import { includesLooseSearch } from './chunk-UV6HHFEW.js';
3
- import { useSduiAdapter, hostFetchOf } from './chunk-KO6OEY3G.js';
4
- import { Icon, Button, Input, Spinner } from './chunk-RNOUXUBO.js';
5
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { ellipsisStyle, unwrapRows } from './chunk-VAXRTBJH.js';
2
+ import { includesLooseSearch } from './chunk-A57GKV5F.js';
3
+ import { useSduiAdapter, hostFetchOf } from './chunk-JHFA5RDN.js';
4
+ import { Icon, Button, Input, Spinner } from './chunk-YYAGE733.js';
5
+ import { boxed } from './chunk-3JTBOABA.js';
6
6
  import { useId, useRef, useMemo, useState, useEffect } from 'react';
7
7
  import { jsxs, jsx } from 'react/jsx-runtime';
8
8
 
@@ -1,17 +1,7 @@
1
- import { warnOnce } from './chunk-RNOUXUBO.js';
1
+ import { DEV } from './chunk-GSM664TX.js';
2
+ import { warnOnce } from './chunk-YYAGE733.js';
2
3
  import { createContext, useContext } from 'react';
3
4
 
4
- // src/env.ts
5
- var DEV = (() => {
6
- try {
7
- const meta = import.meta;
8
- return Boolean(meta.env?.DEV);
9
- } catch {
10
- return false;
11
- }
12
- })();
13
-
14
- // src/adapter.ts
15
5
  function isSafeNavigationTarget(to) {
16
6
  if (typeof to !== "string") return false;
17
7
  const value = to.replace(/[\u0000-\u0020]/g, "");
@@ -115,4 +105,4 @@ function hostRawFetchOf(adapter) {
115
105
  };
116
106
  }
117
107
 
118
- export { DEV, SduiAdapterContext, assetResolverOf, defaultAdapter, hostFetchOf, hostRawFetchOf, isSafeNavigationTarget, resolveAdapter, useSduiAdapter, useSduiAssetResolver, useSduiSandbox };
108
+ export { SduiAdapterContext, assetResolverOf, defaultAdapter, hostFetchOf, hostRawFetchOf, isSafeNavigationTarget, resolveAdapter, useSduiAdapter, useSduiAssetResolver, useSduiSandbox };