@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,155 @@
1
+ import {
2
+ Calendar
3
+ } from "./chunk-XX6MSZLS.js";
4
+ import {
5
+ addMonths,
6
+ compareIso,
7
+ monthOf,
8
+ todayIso
9
+ } from "./chunk-RZOP2PFC.js";
10
+
11
+ // src/seekbuddy/date/DateRangePicker.tsx
12
+ import clsx from "clsx";
13
+ import { Button } from "@seekbuddy/dsh-ui";
14
+ import { IconCheckOutlineRegular } from "@seekbuddy/dsh-ui/icons";
15
+ import { useId, useState } from "react";
16
+
17
+ // .build/css/seekbuddy/date/DateRangePicker.module.mjs
18
+ var id = "@seekbuddy/dsh-ui/seekbuddy/date/DateRangePicker.module.css";
19
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
20
+ const element = document.createElement("style");
21
+ element.setAttribute("data-dsh-ui-primitives", id);
22
+ element.textContent = '.JkkOGq_picker{color:var(--dsw-alias-label-primary);grid-template-columns:auto 1fr;grid-template-areas:"JkkOGq_presets JkkOGq_calendar""JkkOGq_footer JkkOGq_footer";gap:12px 16px;display:inline-grid}.JkkOGq_presets{border-right:.5px solid var(--dsw-alias-border-l1);grid-area:JkkOGq_presets;align-content:start;gap:2px;min-width:96px;margin:0;padding:0 12px 0 0;list-style:none;display:grid}.JkkOGq_presets:focus-visible{border-radius:var(--dsw-radius-sm);outline-offset:2px;outline-style:solid}.JkkOGq_preset{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:var(--dsw-font-xs-13);white-space:nowrap;justify-content:space-between;align-items:center;gap:8px;padding:0 8px;display:flex}.JkkOGq_preset:hover{background:var(--dsw-alias-interactive-bg-hover)}.JkkOGq_presetSelected{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-multi-select)}.JkkOGq_presets:focus-visible [data-active]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary)}.JkkOGq_presetLabel{text-overflow:ellipsis;min-width:0;overflow:hidden}.JkkOGq_check{color:var(--dsw-alias-state-business-primary);flex:none}.JkkOGq_calendar{grid-area:JkkOGq_calendar}.JkkOGq_footer{border-top:.5px solid var(--dsw-alias-border-l1);grid-area:JkkOGq_footer;justify-content:space-between;align-items:center;gap:12px;min-height:28px;padding-top:12px;display:flex}.JkkOGq_status{min-width:0;color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13)}.JkkOGq_actions{flex:none;gap:8px;display:inline-flex}';
23
+ document.head.appendChild(element);
24
+ }
25
+ var DateRangePicker_module_default = { "calendar": "JkkOGq_calendar", "preset": "JkkOGq_preset", "check": "JkkOGq_check", "footer": "JkkOGq_footer", "actions": "JkkOGq_actions", "presetLabel": "JkkOGq_presetLabel", "picker": "JkkOGq_picker", "presetSelected": "JkkOGq_presetSelected", "presets": "JkkOGq_presets", "status": "JkkOGq_status" };
26
+
27
+ // src/seekbuddy/date/DateRangePicker.tsx
28
+ import { jsx, jsxs } from "react/jsx-runtime";
29
+ var sameRange = (a, b) => a !== null && a.start === b.start && a.end === b.end;
30
+ function DateRangePicker({
31
+ value,
32
+ onChange,
33
+ onCancel,
34
+ presets,
35
+ labels,
36
+ month,
37
+ onMonthChange,
38
+ numberOfMonths = 2,
39
+ today: todayProp,
40
+ className,
41
+ ...calendar
42
+ }) {
43
+ const idBase = useId();
44
+ const [todayFallback] = useState(() => todayProp ?? todayIso());
45
+ const today = todayProp ?? todayFallback;
46
+ const [draft, setDraft] = useState(value);
47
+ const [seenValue, setSeenValue] = useState(value);
48
+ const [monthState, setMonthState] = useState(() => monthOf(value?.start ?? today));
49
+ const visibleMonth = month ?? monthState;
50
+ const inView = (date) => {
51
+ const m = monthOf(date);
52
+ return compareIso(m, visibleMonth) >= 0 && compareIso(m, addMonths(visibleMonth, numberOfMonths - 1)) <= 0;
53
+ };
54
+ if (value !== seenValue) {
55
+ setSeenValue(value);
56
+ setDraft(value);
57
+ if (value !== null && month === void 0 && !inView(value.start)) setMonthState(monthOf(value.start));
58
+ }
59
+ const showMonth = (next) => {
60
+ if (month === void 0) setMonthState(next);
61
+ onMonthChange?.(next);
62
+ };
63
+ const [highlighted, setHighlighted] = useState(0);
64
+ const choosePreset = (preset) => {
65
+ setDraft(preset.range);
66
+ if (!inView(preset.range.start)) showMonth(monthOf(preset.range.start));
67
+ };
68
+ const onPresetsKeyDown = (event) => {
69
+ if (presets === void 0 || presets.length === 0) return;
70
+ let next = highlighted;
71
+ if (event.key === "ArrowDown") next = Math.min(presets.length - 1, highlighted + 1);
72
+ else if (event.key === "ArrowUp") next = Math.max(0, highlighted - 1);
73
+ else if (event.key === "Home") next = 0;
74
+ else if (event.key === "End") next = presets.length - 1;
75
+ else if (event.key === "Enter" || event.key === " ") {
76
+ event.preventDefault();
77
+ const preset = presets[highlighted];
78
+ if (preset !== void 0) choosePreset(preset);
79
+ return;
80
+ } else return;
81
+ event.preventDefault();
82
+ setHighlighted(next);
83
+ };
84
+ const presetId = (index) => `${idBase}-preset-${index}`;
85
+ const complete = draft !== null && draft.end !== null;
86
+ const drafting = draft !== null && draft.end === null;
87
+ const apply = () => {
88
+ if (draft !== null && draft.end !== null) onChange({ start: draft.start, end: draft.end });
89
+ };
90
+ const cancel = () => {
91
+ setDraft(value);
92
+ onCancel?.();
93
+ };
94
+ return /* @__PURE__ */ jsxs("div", { className: clsx(DateRangePicker_module_default.picker, className), children: [
95
+ presets !== void 0 && presets.length > 0 && /* @__PURE__ */ jsx(
96
+ "ul",
97
+ {
98
+ role: "listbox",
99
+ "aria-label": labels.presets,
100
+ "aria-activedescendant": presetId(Math.min(highlighted, presets.length - 1)),
101
+ tabIndex: 0,
102
+ className: DateRangePicker_module_default.presets,
103
+ onKeyDown: onPresetsKeyDown,
104
+ children: presets.map((preset, index) => {
105
+ const selected = sameRange(draft, preset.range);
106
+ return /* @__PURE__ */ jsxs(
107
+ "li",
108
+ {
109
+ id: presetId(index),
110
+ role: "option",
111
+ "aria-selected": selected,
112
+ "data-active": index === highlighted || void 0,
113
+ className: clsx(DateRangePicker_module_default.preset, selected && DateRangePicker_module_default.presetSelected),
114
+ onClick: () => {
115
+ setHighlighted(index);
116
+ choosePreset(preset);
117
+ },
118
+ children: [
119
+ /* @__PURE__ */ jsx("span", { className: DateRangePicker_module_default.presetLabel, children: preset.label }),
120
+ selected && /* @__PURE__ */ jsx(IconCheckOutlineRegular, { size: 14, className: DateRangePicker_module_default.check })
121
+ ]
122
+ },
123
+ preset.key
124
+ );
125
+ })
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx(
129
+ Calendar,
130
+ {
131
+ ...calendar,
132
+ mode: "range",
133
+ value: draft,
134
+ onChange: setDraft,
135
+ month: visibleMonth,
136
+ onMonthChange: showMonth,
137
+ numberOfMonths,
138
+ today,
139
+ labels,
140
+ className: DateRangePicker_module_default.calendar
141
+ }
142
+ ),
143
+ /* @__PURE__ */ jsxs("div", { className: DateRangePicker_module_default.footer, children: [
144
+ /* @__PURE__ */ jsx("span", { className: DateRangePicker_module_default.status, role: "status", "aria-live": "polite", children: drafting ? labels.pickEnd : "" }),
145
+ /* @__PURE__ */ jsxs("span", { className: DateRangePicker_module_default.actions, children: [
146
+ /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: cancel, children: labels.cancel }),
147
+ /* @__PURE__ */ jsx(Button, { variant: "primary", size: "sm", disabled: !complete, onClick: apply, children: labels.apply })
148
+ ] })
149
+ ] })
150
+ ] });
151
+ }
152
+
153
+ export {
154
+ DateRangePicker
155
+ };
@@ -0,0 +1,129 @@
1
+ // src/seekbuddy/Pagination.tsx
2
+ import clsx from "clsx";
3
+ import { useState } from "react";
4
+ import { Button } from "@seekbuddy/dsh-ui";
5
+ import { IconChevronLeftOutlineRegular, IconChevronRightOutlineRegular } from "@seekbuddy/dsh-ui/icons";
6
+
7
+ // .build/css/seekbuddy/Pagination.module.mjs
8
+ var id = "@seekbuddy/dsh-ui/seekbuddy/Pagination.module.css";
9
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
10
+ const element = document.createElement("style");
11
+ element.setAttribute("data-dsh-ui-primitives", id);
12
+ element.textContent = "._74CmUG_nav{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px;display:flex}._74CmUG_total{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13);margin-right:8px}._74CmUG_step{width:28px;min-width:28px;padding:0}._74CmUG_page{min-width:28px;font:var(--dsw-font-xs-13);font-variant-numeric:tabular-nums;padding:0 6px}._74CmUG_current{background:var(--dsw-alias-interactive-bg-active);color:var(--dsw-alias-label-primary);font-weight:600}._74CmUG_jump{color:var(--dsw-alias-label-tertiary);letter-spacing:1px}._74CmUG_arrows,._74CmUG_jump:hover:not(:disabled) ._74CmUG_dots,._74CmUG_jump:focus-visible ._74CmUG_dots{display:none}._74CmUG_jump:hover:not(:disabled) ._74CmUG_arrows,._74CmUG_jump:focus-visible ._74CmUG_arrows{display:inline}._74CmUG_simple{min-width:48px;color:var(--dsw-alias-label-secondary);text-align:center;font:var(--dsw-font-xs-13);font-variant-numeric:tabular-nums}";
13
+ document.head.appendChild(element);
14
+ }
15
+ var Pagination_module_default = { "dots": "_74CmUG_dots", "nav": "_74CmUG_nav", "step": "_74CmUG_step", "current": "_74CmUG_current", "page": "_74CmUG_page", "jump": "_74CmUG_jump", "arrows": "_74CmUG_arrows", "simple": "_74CmUG_simple", "total": "_74CmUG_total" };
16
+
17
+ // src/seekbuddy/Pagination.tsx
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ function pageItems(current, pages, lessItems = false) {
20
+ const window = lessItems ? 3 : 5;
21
+ if (pages <= window + 2) return Array.from({ length: pages }, (_, index) => ({ type: "page", page: index + 1 }));
22
+ const half = Math.floor(window / 2);
23
+ let start = Math.max(2, current - half);
24
+ let end = Math.min(pages - 1, current + half);
25
+ if (current - half < 2) end = Math.min(pages - 1, window);
26
+ if (current + half > pages - 1) start = Math.max(2, pages - window + 1);
27
+ const items = [{ type: "page", page: 1 }];
28
+ if (start > 2) items.push({ type: "jump-previous", page: Math.max(1, current - window) });
29
+ for (let page = start; page <= end; page += 1) items.push({ type: "page", page });
30
+ if (end < pages - 1) items.push({ type: "jump-next", page: Math.min(pages, current + window) });
31
+ items.push({ type: "page", page: pages });
32
+ return items;
33
+ }
34
+ function Pagination({
35
+ current,
36
+ defaultCurrent = 1,
37
+ pageSize,
38
+ defaultPageSize = 10,
39
+ total,
40
+ onChange,
41
+ showTotal,
42
+ hideOnSinglePage = true,
43
+ simple = false,
44
+ showLessItems = false,
45
+ disabled = false,
46
+ labels,
47
+ className
48
+ }) {
49
+ const [ownCurrent, setOwnCurrent] = useState(defaultCurrent);
50
+ const size = Math.max(1, pageSize ?? defaultPageSize);
51
+ const pages = Math.max(1, Math.ceil(Math.max(0, total) / size));
52
+ const page = Math.min(pages, Math.max(1, current ?? ownCurrent));
53
+ if (hideOnSinglePage && pages <= 1) return null;
54
+ const go = (target) => {
55
+ const next = Math.min(pages, Math.max(1, target));
56
+ if (next === page) return;
57
+ if (current === void 0) setOwnCurrent(next);
58
+ onChange?.(next, size);
59
+ };
60
+ const from = total === 0 ? 0 : (page - 1) * size + 1;
61
+ const to = Math.min(total, page * size);
62
+ return /* @__PURE__ */ jsxs("nav", { className: clsx(Pagination_module_default.nav, className), "aria-label": labels.navigation, children: [
63
+ showTotal === void 0 ? null : /* @__PURE__ */ jsx("span", { className: Pagination_module_default.total, children: showTotal(total, [from, to]) }),
64
+ /* @__PURE__ */ jsx(
65
+ Button,
66
+ {
67
+ variant: "ghost",
68
+ size: "sm",
69
+ className: Pagination_module_default.step,
70
+ "aria-label": labels.previous,
71
+ disabled: disabled || page <= 1,
72
+ icon: /* @__PURE__ */ jsx(IconChevronLeftOutlineRegular, {}),
73
+ onClick: () => go(page - 1)
74
+ }
75
+ ),
76
+ simple ? /* @__PURE__ */ jsxs("span", { className: Pagination_module_default.simple, "aria-current": "page", children: [
77
+ page,
78
+ " / ",
79
+ pages
80
+ ] }) : pageItems(page, pages, showLessItems).map(
81
+ (item) => item.type === "page" ? /* @__PURE__ */ jsx(
82
+ Button,
83
+ {
84
+ variant: "ghost",
85
+ size: "sm",
86
+ className: clsx(Pagination_module_default.page, item.page === page && Pagination_module_default.current),
87
+ "aria-label": labels.page(item.page),
88
+ "aria-current": item.page === page ? "page" : void 0,
89
+ disabled,
90
+ onClick: () => go(item.page),
91
+ children: item.page
92
+ },
93
+ item.page
94
+ ) : /* @__PURE__ */ jsxs(
95
+ Button,
96
+ {
97
+ variant: "ghost",
98
+ size: "sm",
99
+ className: clsx(Pagination_module_default.page, Pagination_module_default.jump),
100
+ "aria-label": item.type === "jump-previous" ? labels.jumpPrevious : labels.jumpNext,
101
+ disabled,
102
+ onClick: () => go(item.page),
103
+ children: [
104
+ /* @__PURE__ */ jsx("span", { className: Pagination_module_default.dots, "aria-hidden": "true", children: "\u2022\u2022\u2022" }),
105
+ /* @__PURE__ */ jsx("span", { className: Pagination_module_default.arrows, "aria-hidden": "true", children: item.type === "jump-previous" ? "\xAB" : "\xBB" })
106
+ ]
107
+ },
108
+ item.type
109
+ )
110
+ ),
111
+ /* @__PURE__ */ jsx(
112
+ Button,
113
+ {
114
+ variant: "ghost",
115
+ size: "sm",
116
+ className: Pagination_module_default.step,
117
+ "aria-label": labels.next,
118
+ disabled: disabled || page >= pages,
119
+ icon: /* @__PURE__ */ jsx(IconChevronRightOutlineRegular, {}),
120
+ onClick: () => go(page + 1)
121
+ }
122
+ )
123
+ ] });
124
+ }
125
+
126
+ export {
127
+ pageItems,
128
+ Pagination
129
+ };
@@ -0,0 +1,24 @@
1
+ // src/seekbuddy/SubtleButton.tsx
2
+ import clsx from "clsx";
3
+ import { forwardRef } from "react";
4
+ import { Button } from "@seekbuddy/dsh-ui";
5
+
6
+ // .build/css/seekbuddy/SubtleButton.module.mjs
7
+ var id = "@seekbuddy/dsh-ui/seekbuddy/SubtleButton.module.css";
8
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
9
+ const element = document.createElement("style");
10
+ element.setAttribute("data-dsh-ui-primitives", id);
11
+ element.textContent = ".n7ffrG_subtle{color:var(--dsw-alias-label-secondary)}.n7ffrG_subtle:hover:not(:disabled),.n7ffrG_subtle:active:not(:disabled){color:var(--dsw-alias-label-primary)}.n7ffrG_subtle:focus-visible{outline-offset:2px;outline-style:solid}";
12
+ document.head.appendChild(element);
13
+ }
14
+ var SubtleButton_module_default = { "subtle": "n7ffrG_subtle" };
15
+
16
+ // src/seekbuddy/SubtleButton.tsx
17
+ import { jsx } from "react/jsx-runtime";
18
+ var SubtleButton = forwardRef(function SubtleButton2({ className, ...rest }, ref) {
19
+ return /* @__PURE__ */ jsx(Button, { ...rest, ref, variant: "ghost", className: clsx(SubtleButton_module_default.subtle, className) });
20
+ });
21
+
22
+ export {
23
+ SubtleButton
24
+ };
@@ -0,0 +1,152 @@
1
+ // src/seekbuddy/date/date.ts
2
+ var ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
3
+ var ISO_MONTH = /^(\d{4})-(\d{2})$/;
4
+ var ISO_TIME = /^(\d{2}):(\d{2})$/;
5
+ var REFERENCE_SUNDAY_UTC = Date.UTC(2024, 0, 7);
6
+ var pad2 = (value) => String(value).padStart(2, "0");
7
+ var pad4 = (value) => String(value).padStart(4, "0");
8
+ function daysInMonth(y, m) {
9
+ return new Date(Date.UTC(y, m, 0)).getUTCDate();
10
+ }
11
+ function parseIsoDate(iso) {
12
+ const match = ISO_DATE.exec(iso);
13
+ if (match === null) throw new RangeError(`Invalid ISO date: ${iso}`);
14
+ const y = Number(match[1]);
15
+ const m = Number(match[2]);
16
+ const d = Number(match[3]);
17
+ if (m < 1 || m > 12 || d < 1 || d > daysInMonth(y, m)) throw new RangeError(`Invalid ISO date: ${iso}`);
18
+ return { y, m, d };
19
+ }
20
+ function formatIsoDate({ y, m, d }) {
21
+ return `${pad4(y)}-${pad2(m)}-${pad2(d)}`;
22
+ }
23
+ function parseIsoMonth(month) {
24
+ const match = ISO_MONTH.exec(month);
25
+ if (match === null) throw new RangeError(`Invalid ISO month: ${month}`);
26
+ const y = Number(match[1]);
27
+ const m = Number(match[2]);
28
+ if (m < 1 || m > 12) throw new RangeError(`Invalid ISO month: ${month}`);
29
+ return { y, m };
30
+ }
31
+ function formatIsoMonth(y, m) {
32
+ return `${pad4(y)}-${pad2(m)}`;
33
+ }
34
+ function monthOf(iso) {
35
+ const { y, m } = parseIsoDate(iso);
36
+ return formatIsoMonth(y, m);
37
+ }
38
+ function todayIso() {
39
+ const now = /* @__PURE__ */ new Date();
40
+ return formatIsoDate({ y: now.getFullYear(), m: now.getMonth() + 1, d: now.getDate() });
41
+ }
42
+ function fromUtc(ms) {
43
+ const date = new Date(ms);
44
+ return formatIsoDate({ y: date.getUTCFullYear(), m: date.getUTCMonth() + 1, d: date.getUTCDate() });
45
+ }
46
+ function addDays(iso, n) {
47
+ const { y, m, d } = parseIsoDate(iso);
48
+ return fromUtc(Date.UTC(y, m - 1, d + n));
49
+ }
50
+ function addMonths(month, n) {
51
+ const { y, m } = parseIsoMonth(month);
52
+ const total = y * 12 + (m - 1) + n;
53
+ return formatIsoMonth(Math.floor(total / 12), total % 12 + 1);
54
+ }
55
+ function addMonthsToDate(iso, n) {
56
+ const { d } = parseIsoDate(iso);
57
+ const { y, m } = parseIsoMonth(addMonths(monthOf(iso), n));
58
+ return formatIsoDate({ y, m, d: Math.min(d, daysInMonth(y, m)) });
59
+ }
60
+ function compareIso(a, b) {
61
+ if (a < b) return -1;
62
+ if (a > b) return 1;
63
+ return 0;
64
+ }
65
+ function weekdayOf(iso) {
66
+ const { y, m, d } = parseIsoDate(iso);
67
+ return new Date(Date.UTC(y, m - 1, d)).getUTCDay();
68
+ }
69
+ function weekOffset(iso, weekStart) {
70
+ return (weekdayOf(iso) - weekStart + 7) % 7;
71
+ }
72
+ function monthGrid(month, weekStart) {
73
+ const first = `${month}-01`;
74
+ const start = addDays(first, -weekOffset(first, weekStart));
75
+ const cells = [];
76
+ for (let index = 0; index < 42; index += 1) cells.push(addDays(start, index));
77
+ return cells;
78
+ }
79
+ function isInRange(iso, range) {
80
+ return compareIso(range.start, iso) <= 0 && compareIso(iso, range.end) <= 0;
81
+ }
82
+ function normalizeRange(a, b) {
83
+ return compareIso(a, b) <= 0 ? { start: a, end: b } : { start: b, end: a };
84
+ }
85
+ function isOutsideBounds(iso, min, max) {
86
+ return min !== void 0 && compareIso(iso, min) < 0 || max !== void 0 && compareIso(iso, max) > 0;
87
+ }
88
+ function weekdayNames(locale, weekStart, style = "short") {
89
+ const format = new Intl.DateTimeFormat(locale, { weekday: style, timeZone: "UTC" });
90
+ const names = [];
91
+ for (let index = 0; index < 7; index += 1) {
92
+ const weekday = (weekStart + index) % 7;
93
+ names.push(format.format(REFERENCE_SUNDAY_UTC + weekday * 864e5));
94
+ }
95
+ return names;
96
+ }
97
+ function monthTitle(locale, month) {
98
+ const { y, m } = parseIsoMonth(month);
99
+ return new Intl.DateTimeFormat(locale, { year: "numeric", month: "long", timeZone: "UTC" }).format(
100
+ Date.UTC(y, m - 1, 1)
101
+ );
102
+ }
103
+ function formatDate(locale, iso, options) {
104
+ const { y, m, d } = parseIsoDate(iso);
105
+ return new Intl.DateTimeFormat(locale, { ...options, timeZone: "UTC" }).format(Date.UTC(y, m - 1, d));
106
+ }
107
+ function formatDateMedium(locale, iso) {
108
+ return formatDate(locale, iso, { year: "numeric", month: "short", day: "numeric", weekday: "short" });
109
+ }
110
+ function parseIsoTime(time) {
111
+ const match = ISO_TIME.exec(time);
112
+ if (match === null) throw new RangeError(`Invalid ISO time: ${time}`);
113
+ const h = Number(match[1]);
114
+ const min = Number(match[2]);
115
+ if (h > 23 || min > 59) throw new RangeError(`Invalid ISO time: ${time}`);
116
+ return { h, min };
117
+ }
118
+ function timeToMinutes(time) {
119
+ const { h, min } = parseIsoTime(time);
120
+ return h * 60 + min;
121
+ }
122
+ function minutesToTime(minutes) {
123
+ const wrapped = (Math.trunc(minutes) % 1440 + 1440) % 1440;
124
+ return `${pad2(Math.floor(wrapped / 60))}:${pad2(wrapped % 60)}`;
125
+ }
126
+ function clampTime(time, min, max) {
127
+ let minutes = timeToMinutes(time);
128
+ if (min !== void 0) minutes = Math.max(minutes, timeToMinutes(min));
129
+ if (max !== void 0) minutes = Math.min(minutes, timeToMinutes(max));
130
+ return minutesToTime(minutes);
131
+ }
132
+
133
+ export {
134
+ monthOf,
135
+ todayIso,
136
+ addDays,
137
+ addMonths,
138
+ addMonthsToDate,
139
+ compareIso,
140
+ weekOffset,
141
+ monthGrid,
142
+ isInRange,
143
+ normalizeRange,
144
+ isOutsideBounds,
145
+ weekdayNames,
146
+ monthTitle,
147
+ formatDateMedium,
148
+ parseIsoTime,
149
+ timeToMinutes,
150
+ minutesToTime,
151
+ clampTime
152
+ };
@@ -0,0 +1,112 @@
1
+ // src/seekbuddy/Tabs.tsx
2
+ import clsx from "clsx";
3
+ import { useId, useRef } from "react";
4
+
5
+ // .build/css/seekbuddy/Tabs.module.mjs
6
+ var id = "@seekbuddy/dsh-ui/seekbuddy/Tabs.module.css";
7
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
8
+ const element = document.createElement("style");
9
+ element.setAttribute("data-dsh-ui-primitives", id);
10
+ element.textContent = '.XNMLKW_tabs{min-width:0;display:grid}.XNMLKW_tablist{min-height:41px;box-shadow:inset 0 -1px 0 var(--dsw-alias-border-l1);align-items:flex-end;gap:20px;display:flex;overflow-x:auto}.XNMLKW_tab{min-height:41px;color:var(--dsw-alias-label-tertiary);cursor:pointer;font:var(--dsw-font-xxs-12);white-space:nowrap;background:0 0;border:0;flex:none;align-items:center;gap:7px;padding:0 1px;font-weight:500;display:inline-flex;position:relative}.XNMLKW_md .XNMLKW_tab{font:var(--dsw-font-s-14);font-weight:500}.XNMLKW_lg .XNMLKW_tab{min-height:44px;font:var(--dsw-font-base-16);font-weight:500}.XNMLKW_bold .XNMLKW_tab{font:var(--dsw-font-xxs-strong-12)}.XNMLKW_bold.XNMLKW_md .XNMLKW_tab{font:var(--dsw-font-s-strong-14)}.XNMLKW_bold.XNMLKW_lg .XNMLKW_tab{font:var(--dsw-font-base-strong-16)}.XNMLKW_tab:hover:not(:disabled),.XNMLKW_active{color:var(--dsw-alias-label-primary)}.XNMLKW_active:after{content:"";background:var(--dsw-alias-state-business-primary);height:2px;position:absolute;bottom:0;left:0;right:0}.XNMLKW_tab:disabled{cursor:not-allowed;opacity:.5}.XNMLKW_tab:focus-visible{border-radius:var(--dsw-radius-xs);outline-offset:2px;outline-style:solid}.XNMLKW_count{border-radius:var(--dsw-radius-sm);min-width:20px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-active);font:var(--dsw-font-xxxs-11);text-align:center;padding:1px 6px;font-weight:500}.XNMLKW_panel{min-width:0;color:var(--dsw-alias-label-primary);padding-top:16px}.XNMLKW_panel:focus-visible{border-radius:var(--dsw-radius-xs);outline-offset:2px;outline-style:solid}';
11
+ document.head.appendChild(element);
12
+ }
13
+ var Tabs_module_default = { "tablist": "XNMLKW_tablist", "bold": "XNMLKW_bold", "active": "XNMLKW_active", "panel": "XNMLKW_panel", "count": "XNMLKW_count", "tabs": "XNMLKW_tabs", "tab": "XNMLKW_tab", "lg": "XNMLKW_lg", "md": "XNMLKW_md" };
14
+
15
+ // src/seekbuddy/Tabs.tsx
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ var NEXT_KEYS = /* @__PURE__ */ new Set(["ArrowRight", "ArrowDown"]);
18
+ var PREVIOUS_KEYS = /* @__PURE__ */ new Set(["ArrowLeft", "ArrowUp"]);
19
+ function Tabs({
20
+ label,
21
+ items,
22
+ activeKey,
23
+ onChange,
24
+ panelId,
25
+ size = "sm",
26
+ bold = false,
27
+ className
28
+ }) {
29
+ const generatedId = useId();
30
+ const buttons = useRef(/* @__PURE__ */ new Map());
31
+ const withPanels = items.some((item) => item.children !== void 0);
32
+ const idBase = panelId === void 0 || withPanels ? generatedId : panelId;
33
+ const tabId = (key) => `${idBase}-tab-${key}`;
34
+ const ownPanelId = (key) => `${idBase}-panel-${key}`;
35
+ const enabled = items.filter((item) => item.disabled !== true);
36
+ const selected = enabled.some((item) => item.key === activeKey) ? activeKey : enabled[0]?.key;
37
+ const active = items.find((item) => item.key === selected);
38
+ const move = (event) => {
39
+ if (enabled.length === 0) return;
40
+ const current = Math.max(
41
+ 0,
42
+ enabled.findIndex((item) => item.key === selected)
43
+ );
44
+ let next;
45
+ if (NEXT_KEYS.has(event.key)) next = (current + 1) % enabled.length;
46
+ else if (PREVIOUS_KEYS.has(event.key)) next = (current - 1 + enabled.length) % enabled.length;
47
+ else if (event.key === "Home") next = 0;
48
+ else if (event.key === "End") next = enabled.length - 1;
49
+ else return;
50
+ event.preventDefault();
51
+ const target = enabled[next];
52
+ if (target === void 0) return;
53
+ onChange(target.key);
54
+ buttons.current.get(target.key)?.focus();
55
+ };
56
+ const tablist = /* @__PURE__ */ jsx(
57
+ "div",
58
+ {
59
+ className: clsx(Tabs_module_default.tablist, Tabs_module_default[size], bold && Tabs_module_default.bold, !withPanels && className),
60
+ role: "tablist",
61
+ "aria-label": label,
62
+ onKeyDown: move,
63
+ children: items.map((item) => {
64
+ const isActive = item.key === selected;
65
+ return /* @__PURE__ */ jsxs(
66
+ "button",
67
+ {
68
+ ref: (node) => {
69
+ if (node === null) buttons.current.delete(item.key);
70
+ else buttons.current.set(item.key, node);
71
+ },
72
+ type: "button",
73
+ role: "tab",
74
+ id: tabId(item.key),
75
+ "aria-selected": isActive,
76
+ "aria-controls": withPanels ? ownPanelId(item.key) : panelId,
77
+ tabIndex: isActive ? 0 : -1,
78
+ disabled: item.disabled,
79
+ className: clsx(Tabs_module_default.tab, isActive && Tabs_module_default.active),
80
+ onClick: () => {
81
+ if (!isActive) onChange(item.key);
82
+ },
83
+ children: [
84
+ item.label,
85
+ item.count !== void 0 && /* @__PURE__ */ jsx("span", { className: Tabs_module_default.count, children: item.count })
86
+ ]
87
+ },
88
+ item.key
89
+ );
90
+ })
91
+ }
92
+ );
93
+ if (!withPanels) return tablist;
94
+ return /* @__PURE__ */ jsxs("div", { className: clsx(Tabs_module_default.tabs, className), children: [
95
+ tablist,
96
+ active !== void 0 && /* @__PURE__ */ jsx(
97
+ "div",
98
+ {
99
+ role: "tabpanel",
100
+ id: ownPanelId(active.key),
101
+ "aria-labelledby": tabId(active.key),
102
+ tabIndex: 0,
103
+ className: Tabs_module_default.panel,
104
+ children: active.children
105
+ }
106
+ )
107
+ ] });
108
+ }
109
+
110
+ export {
111
+ Tabs
112
+ };
@@ -0,0 +1,36 @@
1
+ // src/seekbuddy/StatusBadge.tsx
2
+ import clsx from "clsx";
3
+ import { Pill, StateDot } from "@seekbuddy/dsh-ui";
4
+
5
+ // .build/css/seekbuddy/StatusBadge.module.mjs
6
+ var id = "@seekbuddy/dsh-ui/seekbuddy/StatusBadge.module.css";
7
+ if (typeof document !== "undefined" && !document.querySelector('style[data-dsh-ui-primitives="' + id + '"]')) {
8
+ const element = document.createElement("style");
9
+ element.setAttribute("data-dsh-ui-primitives", id);
10
+ element.textContent = ".WjHBIa_badge{white-space:nowrap}.WjHBIa_dot{flex:none}.WjHBIa_progress{color:var(--dsw-alias-label-secondary)}.WjHBIa_neutral{color:var(--dsw-alias-label-tertiary)}.WjHBIa_success{color:var(--dsw-alias-state-success-primary)}.WjHBIa_warning{color:var(--dsw-alias-state-warn-primary)}.WjHBIa_error{color:var(--dsw-alias-state-error-primary)}";
11
+ document.head.appendChild(element);
12
+ }
13
+ var StatusBadge_module_default = { "dot": "WjHBIa_dot", "badge": "WjHBIa_badge", "success": "WjHBIa_success", "progress": "WjHBIa_progress", "neutral": "WjHBIa_neutral", "warning": "WjHBIa_warning", "error": "WjHBIa_error" };
14
+
15
+ // src/seekbuddy/StatusBadge.tsx
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ var DOTS = {
18
+ neutral: "idle",
19
+ success: "done",
20
+ progress: "ongoing",
21
+ warning: "warning",
22
+ error: "error"
23
+ };
24
+ function StatusBadge({ tone, children, dot = true, className }) {
25
+ return (
26
+ // Static Pill forwards only className / children, so the tone is carried by its class alone.
27
+ /* @__PURE__ */ jsxs(Pill, { className: clsx(StatusBadge_module_default.badge, StatusBadge_module_default[tone], className), children: [
28
+ dot && /* @__PURE__ */ jsx(StateDot, { state: DOTS[tone], size: 8, className: StatusBadge_module_default.dot }),
29
+ children
30
+ ] })
31
+ );
32
+ }
33
+
34
+ export {
35
+ StatusBadge
36
+ };