@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.
- package/CHANGELOG.md +49 -0
- package/LICENSE +22 -0
- package/README.md +175 -2
- package/README.zh.md +176 -0
- package/THIRD_PARTY_NOTICES.md +42 -0
- package/UPSTREAM.md +56 -0
- package/dist/blocks.js +1582 -0
- package/dist/chunks/chunk-23KOEBWJ.js +104 -0
- package/dist/chunks/chunk-3HCOU44R.js +697 -0
- package/dist/chunks/chunk-5JXG4BHW.js +31 -0
- package/dist/chunks/chunk-5XDVPALS.js +61 -0
- package/dist/chunks/chunk-AY44MQMD.js +3052 -0
- package/dist/chunks/chunk-B3EEK7A2.js +408 -0
- package/dist/chunks/chunk-CEBTQO6W.js +24 -0
- package/dist/chunks/chunk-CI73NXA5.js +202 -0
- package/dist/chunks/chunk-CTQPGUZP.js +22 -0
- package/dist/chunks/chunk-F352IICS.js +57 -0
- package/dist/chunks/chunk-IOBKTEKP.js +144 -0
- package/dist/chunks/chunk-KETGFAOH.js +66 -0
- package/dist/chunks/chunk-LA3QDZYN.js +2777 -0
- package/dist/chunks/chunk-NE62SYOZ.js +89 -0
- package/dist/chunks/chunk-OQPH36OI.js +754 -0
- package/dist/chunks/chunk-QJKAQ6PO.js +155 -0
- package/dist/chunks/chunk-R6AUJQ3G.js +129 -0
- package/dist/chunks/chunk-RNVSCTW7.js +24 -0
- package/dist/chunks/chunk-RZOP2PFC.js +152 -0
- package/dist/chunks/chunk-TQU54HSM.js +112 -0
- package/dist/chunks/chunk-TUK6UGXM.js +36 -0
- package/dist/chunks/chunk-TZ7HRE6D.js +328 -0
- package/dist/chunks/chunk-VIH56PDF.js +57 -0
- package/dist/chunks/chunk-WUL523OW.js +27 -0
- package/dist/chunks/chunk-XX6MSZLS.js +261 -0
- package/dist/chunks/chunk-ZA47FP7C.js +7 -0
- package/dist/chunks/chunk-ZZNL5PWF.js +170 -0
- package/dist/icons.js +803 -0
- package/dist/index.js +1182 -0
- package/dist/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/katex.css +1 -0
- package/dist/katex.css.d.ts +2 -0
- package/dist/markdown.js +148 -0
- package/dist/meta.json +6876 -0
- package/dist/root-inputs.json +67 -0
- package/dist/seekbuddy-card.js +7 -0
- package/dist/seekbuddy-empty.js +8 -0
- package/dist/seekbuddy-internal/DangerButton.js +7 -0
- package/dist/seekbuddy-internal/Mark.js +7 -0
- package/dist/seekbuddy-internal/Message.js +10 -0
- package/dist/seekbuddy-internal/Pagination.js +9 -0
- package/dist/seekbuddy-internal/StatusBadge.js +7 -0
- package/dist/seekbuddy-internal/SubtleButton.js +7 -0
- package/dist/seekbuddy-internal/Switch.js +7 -0
- package/dist/seekbuddy-internal/Upload.js +7 -0
- package/dist/seekbuddy-internal/date/Calendar.js +8 -0
- package/dist/seekbuddy-internal/date/DatePicker.js +9 -0
- package/dist/seekbuddy-internal/date/DateRangePicker.js +9 -0
- package/dist/seekbuddy-internal/date/TimePicker.js +8 -0
- package/dist/seekbuddy-internal/date/fields.js +16 -0
- package/dist/seekbuddy-internal/qr/QrCode.js +7 -0
- package/dist/seekbuddy-spinner.js +7 -0
- package/dist/seekbuddy-tabs.js +7 -0
- package/dist/seekbuddy-timeline.js +8 -0
- package/dist/seekbuddy.js +89 -0
- package/dist/theme-bootstrap.js +13 -0
- package/dist/theme.js +37 -0
- package/dist/tokens.css +934 -0
- package/dist/tokens.css.d.ts +2 -0
- package/dist/types/Button.d.ts +18 -0
- package/dist/types/Checkbox.d.ts +19 -0
- package/dist/types/CodeFileIcon.d.ts +11 -0
- package/dist/types/CodeToolbar.d.ts +29 -0
- package/dist/types/ConfigField.d.ts +32 -0
- package/dist/types/ConnectionIndicator.d.ts +25 -0
- package/dist/types/DiffBlock.d.ts +51 -0
- package/dist/types/DisclosureRow.d.ts +35 -0
- package/dist/types/FileTypeIcon.d.ts +42 -0
- package/dist/types/FoldToggle.d.ts +19 -0
- package/dist/types/HoverCard.d.ts +36 -0
- package/dist/types/ImageLightbox.d.ts +26 -0
- package/dist/types/ImagePreview.d.ts +11 -0
- package/dist/types/Input.d.ts +11 -0
- package/dist/types/JsonTree.d.ts +58 -0
- package/dist/types/LinkIcon.d.ts +33 -0
- package/dist/types/Menu.d.ts +142 -0
- package/dist/types/MenuGroup.d.ts +21 -0
- package/dist/types/MenuSurface.d.ts +15 -0
- package/dist/types/Modal.d.ts +43 -0
- package/dist/types/PermissionIcon.d.ts +38 -0
- package/dist/types/Pill.d.ts +12 -0
- package/dist/types/ReadBlock.d.ts +47 -0
- package/dist/types/ReferenceIcon.d.ts +20 -0
- package/dist/types/RiskConfirmation.d.ts +19 -0
- package/dist/types/SearchBlock.d.ts +71 -0
- package/dist/types/SegmentedControl.d.ts +34 -0
- package/dist/types/SegmentedTabs.d.ts +25 -0
- package/dist/types/ShortcutKeys.d.ts +10 -0
- package/dist/types/SiteGlyph.d.ts +24 -0
- package/dist/types/StateDot.d.ts +19 -0
- package/dist/types/Switch.d.ts +19 -0
- package/dist/types/Tag.d.ts +31 -0
- package/dist/types/TerminalBlock.d.ts +77 -0
- package/dist/types/TextShimmer.d.ts +22 -0
- package/dist/types/Toast.d.ts +48 -0
- package/dist/types/Tooltip.d.ts +63 -0
- package/dist/types/WebBlock.d.ts +60 -0
- package/dist/types/ansi.d.ts +16 -0
- package/dist/types/blocks.d.ts +19 -0
- package/dist/types/clipboard.d.ts +8 -0
- package/dist/types/code-file-icon-artwork.d.ts +53 -0
- package/dist/types/code-file-types.d.ts +29 -0
- package/dist/types/code-highlighting.d.ts +11 -0
- package/dist/types/css-modules.d.ts +6 -0
- package/dist/types/darwin-desktop.d.ts +8 -0
- package/dist/types/file-size.d.ts +7 -0
- package/dist/types/focus.d.ts +8 -0
- package/dist/types/guide-artwork.d.ts +14 -0
- package/dist/types/head-tail-cap.d.ts +22 -0
- package/dist/types/icons/index.d.ts +384 -0
- package/dist/types/icons/props.d.ts +8 -0
- package/dist/types/icons/shared-artwork.d.ts +42 -0
- package/dist/types/icons.d.ts +6 -0
- package/dist/types/index.d.ts +53 -0
- package/dist/types/input-modality.d.ts +18 -0
- package/dist/types/keyboard-composition.d.ts +10 -0
- package/dist/types/markdown/CodeBlock.d.ts +34 -0
- package/dist/types/markdown/JsonBlock.d.ts +7 -0
- package/dist/types/markdown/MarkdownDelegate.d.ts +45 -0
- package/dist/types/markdown/MarkdownText.d.ts +47 -0
- package/dist/types/markdown/cjkFriendlyStrong.d.ts +8 -0
- package/dist/types/markdown/file-link.d.ts +12 -0
- package/dist/types/markdown/highlight.d.ts +147 -0
- package/dist/types/markdown/incremental.d.ts +79 -0
- package/dist/types/markdown/katex.d.ts +18 -0
- package/dist/types/markdown/local-image-syntax.d.ts +9 -0
- package/dist/types/markdown/mathCompatibility.d.ts +10 -0
- package/dist/types/markdown/parse.d.ts +24 -0
- package/dist/types/markdown/plain-text.d.ts +21 -0
- package/dist/types/markdown/render.d.ts +140 -0
- package/dist/types/markdown/useViewportHighlighting.d.ts +10 -0
- package/dist/types/markdown.d.ts +9 -0
- package/dist/types/overlay-top-margin.d.ts +7 -0
- package/dist/types/plugin-artwork.d.ts +16 -0
- package/dist/types/pointer-grace.d.ts +21 -0
- package/dist/types/rank-by-name.d.ts +21 -0
- package/dist/types/relative-time.d.ts +22 -0
- package/dist/types/seekbuddy/Card.d.ts +28 -0
- package/dist/types/seekbuddy/DangerButton.d.ts +31 -0
- package/dist/types/seekbuddy/Empty.d.ts +34 -0
- package/dist/types/seekbuddy/Mark.d.ts +27 -0
- package/dist/types/seekbuddy/Message.d.ts +52 -0
- package/dist/types/seekbuddy/Pagination.d.ts +66 -0
- package/dist/types/seekbuddy/Spinner.d.ts +20 -0
- package/dist/types/seekbuddy/StatusBadge.d.ts +33 -0
- package/dist/types/seekbuddy/SubtleButton.d.ts +30 -0
- package/dist/types/seekbuddy/Switch.d.ts +36 -0
- package/dist/types/seekbuddy/Tabs.d.ts +49 -0
- package/dist/types/seekbuddy/Timeline.d.ts +42 -0
- package/dist/types/seekbuddy/Upload.d.ts +101 -0
- package/dist/types/seekbuddy/date/Calendar.d.ts +94 -0
- package/dist/types/seekbuddy/date/DatePicker.d.ts +29 -0
- package/dist/types/seekbuddy/date/DateRangePicker.d.ts +41 -0
- package/dist/types/seekbuddy/date/TimePicker.d.ts +35 -0
- package/dist/types/seekbuddy/date/date.d.ts +79 -0
- package/dist/types/seekbuddy/date/fields.d.ts +45 -0
- package/dist/types/seekbuddy/index.d.ts +49 -0
- package/dist/types/seekbuddy/qr/QrCode.d.ts +37 -0
- package/dist/types/seekbuddy/qr/qr.d.ts +38 -0
- package/dist/types/theme-bootstrap.d.ts +3 -0
- package/dist/types/theme-core.d.ts +14 -0
- package/dist/types/theme.d.ts +4 -0
- package/dist/types/use-copy-feedback.d.ts +13 -0
- package/dist/types/useAnchoredMaxHeight.d.ts +13 -0
- package/dist/types/useAnchoredPosition.d.ts +35 -0
- package/dist/types/useDismissOnOutsidePointer.d.ts +10 -0
- package/dist/types/useModalLayer.d.ts +26 -0
- package/dist/types/user-text.d.ts +36 -0
- 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
|
+
};
|