@seekbuddy/dsh-ui 0.0.0-stage → 0.2.0-beta.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 (195) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/LICENSE +22 -0
  3. package/README.md +175 -2
  4. package/README.zh.md +176 -0
  5. package/THIRD_PARTY_NOTICES.md +42 -0
  6. package/UPSTREAM.md +56 -0
  7. package/dist/blocks.js +1582 -0
  8. package/dist/chunks/chunk-23KOEBWJ.js +104 -0
  9. package/dist/chunks/chunk-3HCOU44R.js +697 -0
  10. package/dist/chunks/chunk-5JXG4BHW.js +31 -0
  11. package/dist/chunks/chunk-5XDVPALS.js +61 -0
  12. package/dist/chunks/chunk-AY44MQMD.js +3052 -0
  13. package/dist/chunks/chunk-B3EEK7A2.js +408 -0
  14. package/dist/chunks/chunk-CEBTQO6W.js +24 -0
  15. package/dist/chunks/chunk-CI73NXA5.js +202 -0
  16. package/dist/chunks/chunk-CTQPGUZP.js +22 -0
  17. package/dist/chunks/chunk-F352IICS.js +57 -0
  18. package/dist/chunks/chunk-IOBKTEKP.js +144 -0
  19. package/dist/chunks/chunk-KETGFAOH.js +66 -0
  20. package/dist/chunks/chunk-LA3QDZYN.js +2777 -0
  21. package/dist/chunks/chunk-NE62SYOZ.js +89 -0
  22. package/dist/chunks/chunk-OQPH36OI.js +754 -0
  23. package/dist/chunks/chunk-QJKAQ6PO.js +155 -0
  24. package/dist/chunks/chunk-R6AUJQ3G.js +129 -0
  25. package/dist/chunks/chunk-RNVSCTW7.js +24 -0
  26. package/dist/chunks/chunk-RZOP2PFC.js +152 -0
  27. package/dist/chunks/chunk-TQU54HSM.js +112 -0
  28. package/dist/chunks/chunk-TUK6UGXM.js +36 -0
  29. package/dist/chunks/chunk-TZ7HRE6D.js +328 -0
  30. package/dist/chunks/chunk-VIH56PDF.js +57 -0
  31. package/dist/chunks/chunk-WUL523OW.js +27 -0
  32. package/dist/chunks/chunk-XX6MSZLS.js +261 -0
  33. package/dist/chunks/chunk-ZA47FP7C.js +7 -0
  34. package/dist/chunks/chunk-ZZNL5PWF.js +170 -0
  35. package/dist/icons.js +803 -0
  36. package/dist/index.js +1182 -0
  37. package/dist/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  38. package/dist/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  39. package/dist/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  40. package/dist/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  41. package/dist/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  42. package/dist/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  43. package/dist/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  44. package/dist/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  45. package/dist/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  46. package/dist/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  47. package/dist/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  48. package/dist/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  49. package/dist/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  50. package/dist/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  51. package/dist/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  52. package/dist/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  53. package/dist/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  54. package/dist/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  55. package/dist/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  56. package/dist/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  57. package/dist/katex.css +1 -0
  58. package/dist/katex.css.d.ts +2 -0
  59. package/dist/markdown.js +148 -0
  60. package/dist/meta.json +6876 -0
  61. package/dist/root-inputs.json +67 -0
  62. package/dist/seekbuddy-card.js +7 -0
  63. package/dist/seekbuddy-empty.js +8 -0
  64. package/dist/seekbuddy-internal/DangerButton.js +7 -0
  65. package/dist/seekbuddy-internal/Mark.js +7 -0
  66. package/dist/seekbuddy-internal/Message.js +10 -0
  67. package/dist/seekbuddy-internal/Pagination.js +9 -0
  68. package/dist/seekbuddy-internal/StatusBadge.js +7 -0
  69. package/dist/seekbuddy-internal/SubtleButton.js +7 -0
  70. package/dist/seekbuddy-internal/Switch.js +7 -0
  71. package/dist/seekbuddy-internal/Upload.js +7 -0
  72. package/dist/seekbuddy-internal/date/Calendar.js +8 -0
  73. package/dist/seekbuddy-internal/date/DatePicker.js +9 -0
  74. package/dist/seekbuddy-internal/date/DateRangePicker.js +9 -0
  75. package/dist/seekbuddy-internal/date/TimePicker.js +8 -0
  76. package/dist/seekbuddy-internal/date/fields.js +16 -0
  77. package/dist/seekbuddy-internal/qr/QrCode.js +7 -0
  78. package/dist/seekbuddy-spinner.js +7 -0
  79. package/dist/seekbuddy-tabs.js +7 -0
  80. package/dist/seekbuddy-timeline.js +8 -0
  81. package/dist/seekbuddy.js +89 -0
  82. package/dist/theme-bootstrap.js +13 -0
  83. package/dist/theme.js +37 -0
  84. package/dist/tokens.css +934 -0
  85. package/dist/tokens.css.d.ts +2 -0
  86. package/dist/types/Button.d.ts +18 -0
  87. package/dist/types/Checkbox.d.ts +19 -0
  88. package/dist/types/CodeFileIcon.d.ts +11 -0
  89. package/dist/types/CodeToolbar.d.ts +29 -0
  90. package/dist/types/ConfigField.d.ts +32 -0
  91. package/dist/types/ConnectionIndicator.d.ts +25 -0
  92. package/dist/types/DiffBlock.d.ts +51 -0
  93. package/dist/types/DisclosureRow.d.ts +35 -0
  94. package/dist/types/FileTypeIcon.d.ts +42 -0
  95. package/dist/types/FoldToggle.d.ts +19 -0
  96. package/dist/types/HoverCard.d.ts +36 -0
  97. package/dist/types/ImageLightbox.d.ts +26 -0
  98. package/dist/types/ImagePreview.d.ts +11 -0
  99. package/dist/types/Input.d.ts +11 -0
  100. package/dist/types/JsonTree.d.ts +58 -0
  101. package/dist/types/LinkIcon.d.ts +33 -0
  102. package/dist/types/Menu.d.ts +142 -0
  103. package/dist/types/MenuGroup.d.ts +21 -0
  104. package/dist/types/MenuSurface.d.ts +15 -0
  105. package/dist/types/Modal.d.ts +43 -0
  106. package/dist/types/PermissionIcon.d.ts +38 -0
  107. package/dist/types/Pill.d.ts +12 -0
  108. package/dist/types/ReadBlock.d.ts +47 -0
  109. package/dist/types/ReferenceIcon.d.ts +20 -0
  110. package/dist/types/RiskConfirmation.d.ts +19 -0
  111. package/dist/types/SearchBlock.d.ts +71 -0
  112. package/dist/types/SegmentedControl.d.ts +34 -0
  113. package/dist/types/SegmentedTabs.d.ts +25 -0
  114. package/dist/types/ShortcutKeys.d.ts +10 -0
  115. package/dist/types/SiteGlyph.d.ts +24 -0
  116. package/dist/types/StateDot.d.ts +19 -0
  117. package/dist/types/Switch.d.ts +19 -0
  118. package/dist/types/Tag.d.ts +31 -0
  119. package/dist/types/TerminalBlock.d.ts +77 -0
  120. package/dist/types/TextShimmer.d.ts +22 -0
  121. package/dist/types/Toast.d.ts +48 -0
  122. package/dist/types/Tooltip.d.ts +63 -0
  123. package/dist/types/WebBlock.d.ts +60 -0
  124. package/dist/types/ansi.d.ts +16 -0
  125. package/dist/types/blocks.d.ts +19 -0
  126. package/dist/types/clipboard.d.ts +8 -0
  127. package/dist/types/code-file-icon-artwork.d.ts +53 -0
  128. package/dist/types/code-file-types.d.ts +29 -0
  129. package/dist/types/code-highlighting.d.ts +11 -0
  130. package/dist/types/css-modules.d.ts +6 -0
  131. package/dist/types/darwin-desktop.d.ts +8 -0
  132. package/dist/types/file-size.d.ts +7 -0
  133. package/dist/types/focus.d.ts +8 -0
  134. package/dist/types/guide-artwork.d.ts +14 -0
  135. package/dist/types/head-tail-cap.d.ts +22 -0
  136. package/dist/types/icons/index.d.ts +384 -0
  137. package/dist/types/icons/props.d.ts +8 -0
  138. package/dist/types/icons/shared-artwork.d.ts +42 -0
  139. package/dist/types/icons.d.ts +6 -0
  140. package/dist/types/index.d.ts +53 -0
  141. package/dist/types/input-modality.d.ts +18 -0
  142. package/dist/types/keyboard-composition.d.ts +10 -0
  143. package/dist/types/markdown/CodeBlock.d.ts +34 -0
  144. package/dist/types/markdown/JsonBlock.d.ts +7 -0
  145. package/dist/types/markdown/MarkdownDelegate.d.ts +45 -0
  146. package/dist/types/markdown/MarkdownText.d.ts +47 -0
  147. package/dist/types/markdown/cjkFriendlyStrong.d.ts +8 -0
  148. package/dist/types/markdown/file-link.d.ts +12 -0
  149. package/dist/types/markdown/highlight.d.ts +147 -0
  150. package/dist/types/markdown/incremental.d.ts +79 -0
  151. package/dist/types/markdown/katex.d.ts +18 -0
  152. package/dist/types/markdown/local-image-syntax.d.ts +9 -0
  153. package/dist/types/markdown/mathCompatibility.d.ts +10 -0
  154. package/dist/types/markdown/parse.d.ts +24 -0
  155. package/dist/types/markdown/plain-text.d.ts +21 -0
  156. package/dist/types/markdown/render.d.ts +140 -0
  157. package/dist/types/markdown/useViewportHighlighting.d.ts +10 -0
  158. package/dist/types/markdown.d.ts +9 -0
  159. package/dist/types/overlay-top-margin.d.ts +7 -0
  160. package/dist/types/plugin-artwork.d.ts +16 -0
  161. package/dist/types/pointer-grace.d.ts +21 -0
  162. package/dist/types/rank-by-name.d.ts +21 -0
  163. package/dist/types/relative-time.d.ts +22 -0
  164. package/dist/types/seekbuddy/Card.d.ts +28 -0
  165. package/dist/types/seekbuddy/DangerButton.d.ts +31 -0
  166. package/dist/types/seekbuddy/Empty.d.ts +34 -0
  167. package/dist/types/seekbuddy/Mark.d.ts +27 -0
  168. package/dist/types/seekbuddy/Message.d.ts +52 -0
  169. package/dist/types/seekbuddy/Pagination.d.ts +66 -0
  170. package/dist/types/seekbuddy/Spinner.d.ts +20 -0
  171. package/dist/types/seekbuddy/StatusBadge.d.ts +33 -0
  172. package/dist/types/seekbuddy/SubtleButton.d.ts +30 -0
  173. package/dist/types/seekbuddy/Switch.d.ts +36 -0
  174. package/dist/types/seekbuddy/Tabs.d.ts +49 -0
  175. package/dist/types/seekbuddy/Timeline.d.ts +42 -0
  176. package/dist/types/seekbuddy/Upload.d.ts +101 -0
  177. package/dist/types/seekbuddy/date/Calendar.d.ts +94 -0
  178. package/dist/types/seekbuddy/date/DatePicker.d.ts +29 -0
  179. package/dist/types/seekbuddy/date/DateRangePicker.d.ts +41 -0
  180. package/dist/types/seekbuddy/date/TimePicker.d.ts +35 -0
  181. package/dist/types/seekbuddy/date/date.d.ts +79 -0
  182. package/dist/types/seekbuddy/date/fields.d.ts +45 -0
  183. package/dist/types/seekbuddy/index.d.ts +49 -0
  184. package/dist/types/seekbuddy/qr/QrCode.d.ts +37 -0
  185. package/dist/types/seekbuddy/qr/qr.d.ts +38 -0
  186. package/dist/types/theme-bootstrap.d.ts +3 -0
  187. package/dist/types/theme-core.d.ts +14 -0
  188. package/dist/types/theme.d.ts +4 -0
  189. package/dist/types/use-copy-feedback.d.ts +13 -0
  190. package/dist/types/useAnchoredMaxHeight.d.ts +13 -0
  191. package/dist/types/useAnchoredPosition.d.ts +35 -0
  192. package/dist/types/useDismissOnOutsidePointer.d.ts +10 -0
  193. package/dist/types/useModalLayer.d.ts +26 -0
  194. package/dist/types/user-text.d.ts +36 -0
  195. package/package.json +151 -4
@@ -0,0 +1,328 @@
1
+ // src/seekbuddy/Upload.tsx
2
+ import clsx from "clsx";
3
+ import {
4
+ useEffect,
5
+ useId,
6
+ useRef,
7
+ useState
8
+ } from "react";
9
+ import { Button } from "@seekbuddy/dsh-ui";
10
+ import {
11
+ IconCloseOutlineRegular,
12
+ IconPaperclipOutlineRegular,
13
+ IconRefreshOutlineRegular
14
+ } from "@seekbuddy/dsh-ui/icons";
15
+
16
+ // .build/css/seekbuddy/Upload.module.mjs
17
+ var id = "@seekbuddy/dsh-ui/seekbuddy/Upload.module.css";
18
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
19
+ const element = document.createElement("style");
20
+ element.setAttribute("data-dsh-ui-primitives", id);
21
+ element.textContent = "._8vfhUq_upload{flex-direction:column;gap:8px;display:flex}._8vfhUq_input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute;overflow:hidden}._8vfhUq_trigger{flex-wrap:wrap;align-items:center;gap:12px;display:flex;position:relative}._8vfhUq_hint{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13)}._8vfhUq_dropzone{box-sizing:border-box;border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-lg);text-align:center;cursor:pointer;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:24px;display:flex;position:relative}._8vfhUq_dropzone:hover:not(._8vfhUq_disabled){background:var(--dsw-alias-interactive-bg-hover)}._8vfhUq_dropzone:focus-visible{outline-offset:2px;outline-style:solid}._8vfhUq_dropIcon{color:var(--dsw-alias-label-tertiary);margin-bottom:4px;display:inline-flex}._8vfhUq_dropTitle{color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-strong-14)}._8vfhUq_dragging{border-color:var(--dsw-alias-state-business-primary)}._8vfhUq_dragging ._8vfhUq_dropIcon,._8vfhUq_dragging ._8vfhUq_dropTitle{color:var(--dsw-alias-state-business-primary)}._8vfhUq_disabled{color:var(--dsw-alias-label-dimmed);cursor:not-allowed}._8vfhUq_disabled ._8vfhUq_dropIcon,._8vfhUq_disabled ._8vfhUq_dropTitle,._8vfhUq_disabled ._8vfhUq_hint{color:var(--dsw-alias-label-dimmed)}._8vfhUq_list{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}._8vfhUq_item{border-radius:var(--dsw-radius-sm);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;column-gap:8px;padding:6px 8px;display:grid}._8vfhUq_item:hover{background:var(--dsw-alias-interactive-bg-hover)}._8vfhUq_fileIcon{color:var(--dsw-alias-label-tertiary);display:inline-flex}._8vfhUq_name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font:var(--dsw-font-xs-13);text-align:left;overflow:hidden}._8vfhUq_nameButton{cursor:pointer;background:0 0;border:0;padding:0}._8vfhUq_nameButton:hover{text-decoration:underline}._8vfhUq_nameButton:focus-visible{outline-offset:2px;border-radius:var(--dsw-radius-xs);outline-style:solid}._8vfhUq_actions{gap:2px;display:flex}._8vfhUq_action{width:28px;min-width:28px;padding:0}._8vfhUq_meta{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xxs-12);grid-column:2;gap:8px;display:flex}._8vfhUq_error ._8vfhUq_fileIcon,._8vfhUq_error ._8vfhUq_name,._8vfhUq_error ._8vfhUq_status{color:var(--dsw-alias-state-error-primary)}._8vfhUq_track{corner-shape:round;background:var(--dsw-alias-interactive-bg-active);border-radius:999px;grid-column:2/-1;height:2px;margin-top:4px;display:block;overflow:hidden}._8vfhUq_fill{background:var(--dsw-alias-state-business-primary);height:100%;display:block}";
22
+ document.head.appendChild(element);
23
+ }
24
+ var Upload_module_default = { "item": "_8vfhUq_item", "trigger": "_8vfhUq_trigger", "track": "_8vfhUq_track", "nameButton": "_8vfhUq_nameButton", "name": "_8vfhUq_name", "list": "_8vfhUq_list", "dragging": "_8vfhUq_dragging", "status": "_8vfhUq_status", "dropIcon": "_8vfhUq_dropIcon", "fill": "_8vfhUq_fill", "dropzone": "_8vfhUq_dropzone", "disabled": "_8vfhUq_disabled", "dropTitle": "_8vfhUq_dropTitle", "error": "_8vfhUq_error", "meta": "_8vfhUq_meta", "input": "_8vfhUq_input", "action": "_8vfhUq_action", "upload": "_8vfhUq_upload", "fileIcon": "_8vfhUq_fileIcon", "actions": "_8vfhUq_actions", "hint": "_8vfhUq_hint" };
25
+
26
+ // src/seekbuddy/Upload.tsx
27
+ import { jsx, jsxs } from "react/jsx-runtime";
28
+ function Upload({
29
+ layout = "button",
30
+ accept,
31
+ multiple = false,
32
+ maxCount,
33
+ maxSize,
34
+ disabled = false,
35
+ items,
36
+ defaultItems,
37
+ beforeUpload,
38
+ upload,
39
+ onChange,
40
+ onReject,
41
+ onRemove,
42
+ onPreview,
43
+ showList = true,
44
+ labels,
45
+ className
46
+ }) {
47
+ const [ownItems, setOwnItems] = useState(() => defaultItems ?? []);
48
+ const list = items ?? ownItems;
49
+ const latest = useRef(list);
50
+ latest.current = list;
51
+ const controllers = useRef(/* @__PURE__ */ new Map());
52
+ const mounted = useRef(true);
53
+ const sequence = useRef(0);
54
+ const input = useRef(null);
55
+ const [dragging, setDragging] = useState(false);
56
+ const dragDepth = useRef(0);
57
+ const prefix = useId();
58
+ useEffect(() => {
59
+ mounted.current = true;
60
+ const active = controllers.current;
61
+ return () => {
62
+ mounted.current = false;
63
+ for (const controller of active.values()) controller.abort();
64
+ active.clear();
65
+ };
66
+ }, []);
67
+ const commit = (next) => {
68
+ latest.current = next;
69
+ if (items === void 0) setOwnItems(next);
70
+ onChange?.(next);
71
+ };
72
+ const patch = (uid, change) => {
73
+ if (!mounted.current) return;
74
+ const index = latest.current.findIndex((item) => item.uid === uid);
75
+ if (index === -1) return;
76
+ const next = latest.current.slice();
77
+ next[index] = { ...next[index], ...change };
78
+ commit(next);
79
+ };
80
+ const start = (uid, file) => {
81
+ controllers.current.get(uid)?.abort();
82
+ const controller = new AbortController();
83
+ controllers.current.set(uid, controller);
84
+ patch(uid, { status: "uploading", percent: 0, error: void 0 });
85
+ upload(file, {
86
+ onProgress: (percent) => {
87
+ if (!controller.signal.aborted) patch(uid, { percent: Math.min(100, Math.max(0, Math.round(percent))) });
88
+ },
89
+ signal: controller.signal
90
+ }).then(
91
+ (response) => {
92
+ if (!controller.signal.aborted) patch(uid, { status: "done", percent: 100, response });
93
+ },
94
+ (reason) => {
95
+ if (!controller.signal.aborted) patch(uid, { status: "error", error: errorMessage(reason) });
96
+ }
97
+ );
98
+ };
99
+ const add = async (picked) => {
100
+ if (disabled) return;
101
+ const candidates = multiple ? picked : picked.slice(0, 1);
102
+ const rejections = [];
103
+ let accepted = [];
104
+ for (const file of candidates) {
105
+ if (accept !== void 0 && !matchesAccept(file, accept)) rejections.push({ file, reason: "accept" });
106
+ else if (maxSize !== void 0 && file.size > maxSize) rejections.push({ file, reason: "size" });
107
+ else accepted.push(file);
108
+ }
109
+ if (maxCount !== void 0) {
110
+ const room = maxCount === 1 ? 1 : Math.max(0, maxCount - latest.current.length);
111
+ for (const file of accepted.slice(room)) rejections.push({ file, reason: "count" });
112
+ accepted = accepted.slice(0, room);
113
+ }
114
+ if (rejections.length > 0) onReject?.(rejections);
115
+ if (beforeUpload !== void 0) {
116
+ const checks = await Promise.all(
117
+ accepted.map((file) => Promise.resolve(beforeUpload(file, accepted)).catch(() => false))
118
+ );
119
+ accepted = accepted.filter((_, index) => checks[index]);
120
+ }
121
+ if (accepted.length === 0 || !mounted.current) return;
122
+ const fresh = accepted.map((file) => {
123
+ sequence.current += 1;
124
+ return {
125
+ uid: `${prefix}-${sequence.current}`,
126
+ name: file.name,
127
+ size: file.size,
128
+ status: "uploading",
129
+ percent: 0,
130
+ file
131
+ };
132
+ });
133
+ if (maxCount === 1) {
134
+ for (const item of latest.current) controllers.current.get(item.uid)?.abort();
135
+ commit(fresh);
136
+ } else {
137
+ commit([...latest.current, ...fresh]);
138
+ }
139
+ for (const item of fresh) start(item.uid, item.file);
140
+ };
141
+ const remove = async (item) => {
142
+ if (onRemove !== void 0 && !await onRemove(item)) return;
143
+ controllers.current.get(item.uid)?.abort();
144
+ controllers.current.delete(item.uid);
145
+ commit(latest.current.filter((entry) => entry.uid !== item.uid));
146
+ };
147
+ const open = () => {
148
+ if (!disabled) input.current?.click();
149
+ };
150
+ const onInputChange = (event) => {
151
+ const files = [...event.target.files ?? []];
152
+ event.target.value = "";
153
+ void add(files);
154
+ };
155
+ const onKeyDown = (event) => {
156
+ if (event.key === "Enter" || event.key === " ") {
157
+ event.preventDefault();
158
+ open();
159
+ }
160
+ };
161
+ const onDragEnter = (event) => {
162
+ if (!hasFiles(event)) return;
163
+ event.preventDefault();
164
+ dragDepth.current += 1;
165
+ setDragging(true);
166
+ };
167
+ const onDragLeave = (event) => {
168
+ if (!hasFiles(event)) return;
169
+ dragDepth.current = Math.max(0, dragDepth.current - 1);
170
+ if (dragDepth.current === 0) setDragging(false);
171
+ };
172
+ const onDragOver = (event) => {
173
+ if (!hasFiles(event)) return;
174
+ event.preventDefault();
175
+ event.dataTransfer.dropEffect = disabled ? "none" : "copy";
176
+ };
177
+ const onDrop = (event) => {
178
+ if (!hasFiles(event)) return;
179
+ event.preventDefault();
180
+ dragDepth.current = 0;
181
+ setDragging(false);
182
+ void add([...event.dataTransfer.files]);
183
+ };
184
+ const picker = /* @__PURE__ */ jsx(
185
+ "input",
186
+ {
187
+ ref: input,
188
+ className: Upload_module_default.input,
189
+ type: "file",
190
+ tabIndex: -1,
191
+ accept,
192
+ multiple,
193
+ disabled,
194
+ onClick: (event) => event.stopPropagation(),
195
+ onChange: onInputChange
196
+ }
197
+ );
198
+ return /* @__PURE__ */ jsxs("div", { className: clsx(Upload_module_default.upload, className), children: [
199
+ layout === "dragger" ? /* @__PURE__ */ jsxs(
200
+ "div",
201
+ {
202
+ className: clsx(Upload_module_default.dropzone, dragging && Upload_module_default.dragging, disabled && Upload_module_default.disabled),
203
+ role: "button",
204
+ tabIndex: disabled ? -1 : 0,
205
+ "aria-disabled": disabled || void 0,
206
+ onClick: open,
207
+ onKeyDown,
208
+ onDragEnter,
209
+ onDragLeave,
210
+ onDragOver,
211
+ onDrop,
212
+ children: [
213
+ picker,
214
+ /* @__PURE__ */ jsx("span", { className: Upload_module_default.dropIcon, "aria-hidden": "true", children: /* @__PURE__ */ jsx(UploadGlyph, {}) }),
215
+ /* @__PURE__ */ jsx("span", { className: Upload_module_default.dropTitle, children: labels.trigger }),
216
+ labels.hint === void 0 ? null : /* @__PURE__ */ jsx("span", { className: Upload_module_default.hint, children: labels.hint })
217
+ ]
218
+ }
219
+ ) : /* @__PURE__ */ jsxs("div", { className: Upload_module_default.trigger, children: [
220
+ picker,
221
+ /* @__PURE__ */ jsx(Button, { variant: "outline", icon: /* @__PURE__ */ jsx(UploadGlyph, {}), disabled, onClick: open, children: labels.trigger }),
222
+ labels.hint === void 0 ? null : /* @__PURE__ */ jsx("span", { className: Upload_module_default.hint, children: labels.hint })
223
+ ] }),
224
+ showList && list.length > 0 ? /* @__PURE__ */ jsx("ul", { className: Upload_module_default.list, "aria-label": labels.list, children: list.map((item) => /* @__PURE__ */ jsxs("li", { className: clsx(Upload_module_default.item, Upload_module_default[item.status]), "data-status": item.status, children: [
225
+ /* @__PURE__ */ jsx("span", { className: Upload_module_default.fileIcon, "aria-hidden": "true", children: /* @__PURE__ */ jsx(IconPaperclipOutlineRegular, {}) }),
226
+ onPreview === void 0 ? /* @__PURE__ */ jsx("span", { className: Upload_module_default.name, children: item.name }) : /* @__PURE__ */ jsx("button", { type: "button", className: clsx(Upload_module_default.name, Upload_module_default.nameButton), onClick: () => onPreview(item), children: item.name }),
227
+ /* @__PURE__ */ jsxs("span", { className: Upload_module_default.actions, children: [
228
+ item.status === "error" && item.file !== void 0 ? /* @__PURE__ */ jsx(
229
+ Button,
230
+ {
231
+ variant: "ghost",
232
+ size: "sm",
233
+ className: Upload_module_default.action,
234
+ "aria-label": labels.retry,
235
+ disabled,
236
+ icon: /* @__PURE__ */ jsx(IconRefreshOutlineRegular, {}),
237
+ onClick: () => start(item.uid, item.file)
238
+ }
239
+ ) : null,
240
+ /* @__PURE__ */ jsx(
241
+ Button,
242
+ {
243
+ variant: "ghost",
244
+ size: "sm",
245
+ className: Upload_module_default.action,
246
+ "aria-label": labels.remove,
247
+ disabled,
248
+ icon: /* @__PURE__ */ jsx(IconCloseOutlineRegular, {}),
249
+ onClick: () => void remove(item)
250
+ }
251
+ )
252
+ ] }),
253
+ /* @__PURE__ */ jsxs("span", { className: Upload_module_default.meta, children: [
254
+ /* @__PURE__ */ jsx("span", { children: formatBytes(item.size) }),
255
+ /* @__PURE__ */ jsx("span", { className: Upload_module_default.status, role: "status", children: statusText(item, labels) })
256
+ ] }),
257
+ item.status === "uploading" ? /* @__PURE__ */ jsx(
258
+ "span",
259
+ {
260
+ className: Upload_module_default.track,
261
+ role: "progressbar",
262
+ "aria-label": labels.uploading,
263
+ "aria-valuemin": 0,
264
+ "aria-valuemax": 100,
265
+ "aria-valuenow": item.percent,
266
+ children: /* @__PURE__ */ jsx("span", { className: Upload_module_default.fill, style: { width: `${item.percent}%` } })
267
+ }
268
+ ) : null
269
+ ] }, item.uid)) }) : null
270
+ ] });
271
+ }
272
+ function statusText(item, labels) {
273
+ if (item.status === "uploading") return `${labels.uploading} ${item.percent}%`;
274
+ if (item.status === "error") return item.error === void 0 || item.error === "" ? labels.error : item.error;
275
+ return labels.done;
276
+ }
277
+ function errorMessage(reason) {
278
+ return reason instanceof Error ? reason.message : typeof reason === "string" ? reason : "";
279
+ }
280
+ function matchesAccept(file, accept) {
281
+ const name = file.name.toLowerCase();
282
+ const type = file.type.toLowerCase();
283
+ return accept.split(",").map((rule) => rule.trim().toLowerCase()).filter((rule) => rule !== "").some((rule) => {
284
+ if (rule.startsWith(".")) return name.endsWith(rule);
285
+ if (rule.endsWith("/*")) return type.startsWith(rule.slice(0, -1));
286
+ return type === rule;
287
+ });
288
+ }
289
+ function hasFiles(event) {
290
+ return [...event.dataTransfer?.types ?? []].includes("Files");
291
+ }
292
+ function formatBytes(bytes) {
293
+ if (bytes < 1024) return `${bytes} B`;
294
+ const units = ["KB", "MB", "GB"];
295
+ let value = bytes / 1024;
296
+ let unit = 0;
297
+ while (value >= 1024 && unit < units.length - 1) {
298
+ value /= 1024;
299
+ unit += 1;
300
+ }
301
+ return `${value.toFixed(1).replace(/\.0$/, "")} ${units[unit]}`;
302
+ }
303
+ function UploadGlyph() {
304
+ return /* @__PURE__ */ jsxs(
305
+ "svg",
306
+ {
307
+ width: 20,
308
+ height: 20,
309
+ viewBox: "0 0 24 24",
310
+ fill: "none",
311
+ stroke: "currentColor",
312
+ strokeWidth: "2",
313
+ strokeLinecap: "round",
314
+ strokeLinejoin: "round",
315
+ "aria-hidden": "true",
316
+ focusable: "false",
317
+ children: [
318
+ /* @__PURE__ */ jsx("path", { d: "M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3" }),
319
+ /* @__PURE__ */ jsx("path", { d: "M12 15V4" }),
320
+ /* @__PURE__ */ jsx("path", { d: "M7.5 8.5 12 4l4.5 4.5" })
321
+ ]
322
+ }
323
+ );
324
+ }
325
+
326
+ export {
327
+ Upload
328
+ };
@@ -0,0 +1,57 @@
1
+ import {
2
+ Spinner
3
+ } from "./chunk-WUL523OW.js";
4
+
5
+ // src/seekbuddy/Timeline.tsx
6
+ import clsx from "clsx";
7
+
8
+ // .build/css/seekbuddy/Timeline.module.mjs
9
+ var id = "@seekbuddy/dsh-ui/seekbuddy/Timeline.module.css";
10
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
11
+ const element = document.createElement("style");
12
+ element.setAttribute("data-dsh-ui-primitives", id);
13
+ element.textContent = ".M4slRG_timeline{--timeline-badge:16px;--timeline-gap:20px;gap:28px;display:grid}.M4slRG_heading{color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);margin:0 0 20px}.M4slRG_list{margin:0;padding:0;list-style:none;display:grid}.M4slRG_item{grid-template-columns:var(--timeline-badge) minmax(0, 1fr);column-gap:var(--timeline-gap);padding-bottom:28px;display:grid;position:relative}.M4slRG_item:last-child{padding-bottom:0}.M4slRG_rail{top:calc(var(--timeline-badge) + 6px);bottom:0;left:calc(var(--timeline-badge) / 2);background:var(--dsw-alias-border-l1);width:1px;position:absolute}.M4slRG_item:last-child .M4slRG_rail{bottom:-20px}.M4slRG_badgeCell{width:var(--timeline-badge);height:var(--timeline-badge);justify-content:center;align-items:center;margin-top:3px;display:inline-flex}.M4slRG_badge{width:var(--timeline-badge);height:var(--timeline-badge)}.M4slRG_succeeded{color:var(--dsw-alias-state-success-primary)}.M4slRG_failed{color:var(--dsw-alias-state-error-primary)}.M4slRG_canceled,.M4slRG_running{color:var(--dsw-alias-label-tertiary)}.M4slRG_glyph{fill:none;stroke:var(--dsw-alias-label-primary-inverted);stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round}.M4slRG_body{text-align:left;gap:10px;min-width:0;display:grid}.M4slRG_select{border-radius:var(--dsw-radius-sm);color:inherit;cursor:pointer;font:inherit;background:0 0;border:0;padding:0}.M4slRG_select:hover .M4slRG_title{color:var(--dsw-alias-label-primary-bluish)}.M4slRG_select:focus-visible{outline-offset:4px;outline-style:solid}.M4slRG_title{min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14);flex-wrap:wrap;align-items:center;gap:8px;display:flex}.M4slRG_meta{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13);flex-wrap:wrap;gap:4px 12px;display:flex}.M4slRG_message{color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xs-13);overflow-wrap:anywhere}.M4slRG_messageError{color:var(--dsw-alias-state-error-primary)}.M4slRG_srOnly{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
14
+ document.head.appendChild(element);
15
+ }
16
+ var Timeline_module_default = { "succeeded": "M4slRG_succeeded", "title": "M4slRG_title", "meta": "M4slRG_meta", "glyph": "M4slRG_glyph", "select": "M4slRG_select", "timeline": "M4slRG_timeline", "failed": "M4slRG_failed", "badge": "M4slRG_badge", "body": "M4slRG_body", "list": "M4slRG_list", "item": "M4slRG_item", "badgeCell": "M4slRG_badgeCell", "canceled": "M4slRG_canceled", "message": "M4slRG_message", "heading": "M4slRG_heading", "rail": "M4slRG_rail", "running": "M4slRG_running", "messageError": "M4slRG_messageError", "srOnly": "M4slRG_srOnly" };
17
+
18
+ // src/seekbuddy/Timeline.tsx
19
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
+ var BADGE_TONE = {
21
+ succeeded: Timeline_module_default.succeeded,
22
+ failed: Timeline_module_default.failed,
23
+ canceled: Timeline_module_default.canceled
24
+ };
25
+ function Badge({ status, label }) {
26
+ if (status === "running") return /* @__PURE__ */ jsx(Spinner, { className: Timeline_module_default.running, label });
27
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
28
+ /* @__PURE__ */ jsxs("svg", { className: clsx(Timeline_module_default.badge, BADGE_TONE[status]), viewBox: "0 0 16 16", "aria-hidden": "true", children: [
29
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "8", fill: "currentColor" }),
30
+ status === "succeeded" && /* @__PURE__ */ jsx("path", { className: Timeline_module_default.glyph, d: "M4.5 8.2l2.3 2.3 4.7-4.8" }),
31
+ status === "failed" && /* @__PURE__ */ jsx("path", { className: Timeline_module_default.glyph, d: "M5.3 5.3l5.4 5.4M10.7 5.3l-5.4 5.4" }),
32
+ status === "canceled" && /* @__PURE__ */ jsx("path", { className: Timeline_module_default.glyph, d: "M4.8 8h6.4" })
33
+ ] }),
34
+ /* @__PURE__ */ jsx("span", { className: Timeline_module_default.srOnly, children: label })
35
+ ] });
36
+ }
37
+ function Timeline({ label, statusLabels, groups, className }) {
38
+ return /* @__PURE__ */ jsx("section", { className: clsx(Timeline_module_default.timeline, className), "aria-label": label, children: groups.map((group) => /* @__PURE__ */ jsxs("div", { children: [
39
+ group.heading !== void 0 && /* @__PURE__ */ jsx("h3", { className: Timeline_module_default.heading, children: group.heading }),
40
+ /* @__PURE__ */ jsx("ol", { className: Timeline_module_default.list, children: group.items.map((item) => {
41
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
42
+ /* @__PURE__ */ jsx("div", { className: Timeline_module_default.title, children: item.title }),
43
+ item.meta !== void 0 && item.meta.length > 0 && /* @__PURE__ */ jsx("div", { className: Timeline_module_default.meta, children: item.meta.map((part, index) => /* @__PURE__ */ jsx("span", { children: part }, index)) }),
44
+ item.message !== void 0 && /* @__PURE__ */ jsx("div", { className: clsx(Timeline_module_default.message, item.status === "failed" && Timeline_module_default.messageError), children: item.message })
45
+ ] });
46
+ return /* @__PURE__ */ jsxs("li", { className: Timeline_module_default.item, "data-status": item.status, children: [
47
+ /* @__PURE__ */ jsx("span", { className: Timeline_module_default.rail, "aria-hidden": "true" }),
48
+ /* @__PURE__ */ jsx("span", { className: Timeline_module_default.badgeCell, children: /* @__PURE__ */ jsx(Badge, { status: item.status, label: statusLabels[item.status] }) }),
49
+ item.onSelect === void 0 ? /* @__PURE__ */ jsx("div", { className: Timeline_module_default.body, children: body }) : /* @__PURE__ */ jsx("button", { type: "button", className: clsx(Timeline_module_default.body, Timeline_module_default.select), onClick: item.onSelect, children: body })
50
+ ] }, item.key);
51
+ }) })
52
+ ] }, group.key)) });
53
+ }
54
+
55
+ export {
56
+ Timeline
57
+ };
@@ -0,0 +1,27 @@
1
+ // src/seekbuddy/Spinner.tsx
2
+ import clsx from "clsx";
3
+
4
+ // .build/css/seekbuddy/Spinner.module.mjs
5
+ var id = "@seekbuddy/dsh-ui/seekbuddy/Spinner.module.css";
6
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
7
+ const element = document.createElement("style");
8
+ element.setAttribute("data-dsh-ui-primitives", id);
9
+ element.textContent = ".ACvqaW_ring{box-sizing:border-box;corner-shape:round;border:2px solid color-mix(in srgb, currentColor 35%, transparent);border-top-color:currentColor;border-radius:50%;flex:none;animation:.85s linear infinite ACvqaW_dsh-seekbuddy-spinner;display:inline-block}.ACvqaW_sm{width:.85rem;height:.85rem}.ACvqaW_md{border-width:3px;width:2rem;height:2rem}.ACvqaW_page{color:var(--dsw-alias-label-primary)}.ACvqaW_status{align-items:center;display:inline-flex;position:relative}.ACvqaW_label{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@keyframes ACvqaW_dsh-seekbuddy-spinner{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.ACvqaW_ring{border-top-color:color-mix(in srgb, currentColor 35%, transparent);border-right-color:currentColor;animation:none}}";
10
+ document.head.appendChild(element);
11
+ }
12
+ var Spinner_module_default = { "dsh-seekbuddy-spinner": "ACvqaW_dsh-seekbuddy-spinner", "page": "ACvqaW_page", "status": "ACvqaW_status", "ring": "ACvqaW_ring", "label": "ACvqaW_label", "sm": "ACvqaW_sm", "md": "ACvqaW_md" };
13
+
14
+ // src/seekbuddy/Spinner.tsx
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ function Spinner({ size = "sm", tone = "inherit", label, className }) {
17
+ const ring = clsx(Spinner_module_default.ring, Spinner_module_default[size], tone === "page" && Spinner_module_default.page);
18
+ if (label === void 0) return /* @__PURE__ */ jsx("span", { className: clsx(ring, className), "aria-hidden": "true" });
19
+ return /* @__PURE__ */ jsxs("span", { className: clsx(Spinner_module_default.status, className), role: "status", "aria-live": "polite", children: [
20
+ /* @__PURE__ */ jsx("span", { className: ring, "aria-hidden": "true" }),
21
+ /* @__PURE__ */ jsx("span", { className: Spinner_module_default.label, children: label })
22
+ ] });
23
+ }
24
+
25
+ export {
26
+ Spinner
27
+ };