@seekalfred/primitives 0.6.0 → 0.7.3
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/README.md +214 -15
- package/dist/activity-heatmap/activity-heatmap.d.ts +92 -0
- package/dist/activity-heatmap/activity-heatmap.js +699 -0
- package/dist/activity-heatmap/activity-heatmap.js.map +1 -0
- package/dist/activity-heatmap/index.d.ts +2 -0
- package/dist/activity-heatmap/index.js +2 -0
- package/dist/alert/alert.d.ts +53 -4
- package/dist/alert/alert.js +100 -11
- package/dist/alert/alert.js.map +1 -1
- package/dist/alert/index.d.ts +2 -2
- package/dist/alert/index.js +2 -2
- package/dist/alert-dialog/alert-dialog.d.ts +58 -18
- package/dist/alert-dialog/alert-dialog.js +152 -9
- package/dist/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/alert-dialog/index.d.ts +2 -2
- package/dist/alert-dialog/index.js +2 -2
- package/dist/animated-counter/animated-counter.d.ts +38 -0
- package/dist/animated-counter/animated-counter.js +230 -0
- package/dist/animated-counter/animated-counter.js.map +1 -0
- package/dist/animated-counter/index.d.ts +2 -0
- package/dist/animated-counter/index.js +2 -0
- package/dist/announcement-bar/announcement-bar.d.ts +67 -0
- package/dist/announcement-bar/announcement-bar.js +364 -0
- package/dist/announcement-bar/announcement-bar.js.map +1 -0
- package/dist/announcement-bar/index.d.ts +2 -0
- package/dist/announcement-bar/index.js +2 -0
- package/dist/badge/badge.d.ts +1 -1
- package/dist/bar-chart/bar-chart.d.ts +51 -0
- package/dist/bar-chart/bar-chart.js +565 -0
- package/dist/bar-chart/bar-chart.js.map +1 -0
- package/dist/bar-chart/index.d.ts +2 -0
- package/dist/bar-chart/index.js +2 -0
- package/dist/breadcrumb/breadcrumb.d.ts +2 -2
- package/dist/breadcrumb/breadcrumb.js +12 -3
- package/dist/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/brush-chart/brush-chart.d.ts +64 -0
- package/dist/brush-chart/brush-chart.js +1056 -0
- package/dist/brush-chart/brush-chart.js.map +1 -0
- package/dist/brush-chart/index.d.ts +2 -0
- package/dist/brush-chart/index.js +2 -0
- package/dist/button/button.d.ts +1 -1
- package/dist/button/button.js +31 -21
- package/dist/button/button.js.map +1 -1
- package/dist/button-group/button-group.js +3 -4
- package/dist/button-group/button-group.js.map +1 -1
- package/dist/calendar/calendar.d.ts +1 -1
- package/dist/card/card.d.ts +22 -1
- package/dist/card/card.js +60 -7
- package/dist/card/card.js.map +1 -1
- package/dist/card-stack/card-stack.d.ts +54 -0
- package/dist/card-stack/card-stack.js +492 -0
- package/dist/card-stack/card-stack.js.map +1 -0
- package/dist/card-stack/index.d.ts +2 -0
- package/dist/card-stack/index.js +2 -0
- package/dist/carousel/carousel.d.ts +77 -0
- package/dist/carousel/carousel.js +415 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/carousel/index.d.ts +2 -0
- package/dist/carousel/index.js +2 -0
- package/dist/checkbox/checkbox.js +4 -4
- package/dist/checkbox/checkbox.js.map +1 -1
- package/dist/chip-group/chip-group.d.ts +37 -0
- package/dist/chip-group/chip-group.js +148 -0
- package/dist/chip-group/chip-group.js.map +1 -0
- package/dist/chip-group/index.d.ts +2 -0
- package/dist/chip-group/index.js +2 -0
- package/dist/copy-button/copy-button.d.ts +18 -2
- package/dist/copy-button/copy-button.js +29 -8
- package/dist/copy-button/copy-button.js.map +1 -1
- package/dist/countdown/countdown.d.ts +45 -0
- package/dist/countdown/countdown.js +298 -0
- package/dist/countdown/countdown.js.map +1 -0
- package/dist/countdown/index.d.ts +2 -0
- package/dist/countdown/index.js +2 -0
- package/dist/date-picker/picker-parts.js +1 -1
- package/dist/date-picker/picker-parts.js.map +1 -1
- package/dist/dialog/dialog.js +1 -1
- package/dist/dialog/dialog.js.map +1 -1
- package/dist/donut-chart/donut-chart.d.ts +86 -0
- package/dist/donut-chart/donut-chart.js +593 -0
- package/dist/donut-chart/donut-chart.js.map +1 -0
- package/dist/donut-chart/index.d.ts +2 -0
- package/dist/donut-chart/index.js +2 -0
- package/dist/empty-state/empty-state.d.ts +42 -10
- package/dist/empty-state/empty-state.js +44 -26
- package/dist/empty-state/empty-state.js.map +1 -1
- package/dist/empty-state/index.d.ts +2 -2
- package/dist/empty-state/index.js +2 -2
- package/dist/file-drop-zone/file-drop-zone.js +1 -1
- package/dist/file-drop-zone/file-drop-zone.js.map +1 -1
- package/dist/filter-bar/filter-bar.d.ts +50 -26
- package/dist/filter-bar/filter-bar.js +317 -157
- package/dist/filter-bar/filter-bar.js.map +1 -1
- package/dist/gauge/gauge.d.ts +45 -0
- package/dist/gauge/gauge.js +219 -0
- package/dist/gauge/gauge.js.map +1 -0
- package/dist/gauge/index.d.ts +2 -0
- package/dist/gauge/index.js +2 -0
- package/dist/in-view-title/in-view-title.d.ts +33 -0
- package/dist/in-view-title/in-view-title.js +119 -0
- package/dist/in-view-title/in-view-title.js.map +1 -0
- package/dist/in-view-title/index.d.ts +2 -0
- package/dist/in-view-title/index.js +2 -0
- package/dist/index.d.ts +53 -10
- package/dist/index.js +52 -12
- package/dist/input/input.js +4 -4
- package/dist/input/input.js.map +1 -1
- package/dist/lib/cn.js +11 -1
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/field-message.js +28 -10
- package/dist/lib/field-message.js.map +1 -1
- package/dist/lib/field-shell.js +10 -3
- package/dist/lib/field-shell.js.map +1 -1
- package/dist/lib/field-surface.js +31 -9
- package/dist/lib/field-surface.js.map +1 -1
- package/dist/lib/flag-emoji.js +50 -0
- package/dist/lib/flag-emoji.js.map +1 -0
- package/dist/lib/flip.js +11 -3
- package/dist/lib/flip.js.map +1 -1
- package/dist/lib/menu-highlight.js +64 -0
- package/dist/lib/menu-highlight.js.map +1 -0
- package/dist/lib/motion.js +9 -2
- package/dist/lib/motion.js.map +1 -1
- package/dist/lib/rolling-value.js +1 -1
- package/dist/lib/rolling-value.js.map +1 -1
- package/dist/lib/spring-tween.js +500 -0
- package/dist/lib/spring-tween.js.map +1 -0
- package/dist/lib/swap-text.js +3 -1
- package/dist/lib/swap-text.js.map +1 -1
- package/dist/lib/use-copy-feedback.js +17 -3
- package/dist/lib/use-copy-feedback.js.map +1 -1
- package/dist/line-chart/index.d.ts +2 -0
- package/dist/line-chart/index.js +2 -0
- package/dist/line-chart/line-chart.d.ts +116 -0
- package/dist/line-chart/line-chart.js +740 -0
- package/dist/line-chart/line-chart.js.map +1 -0
- package/dist/mention-input/index.d.ts +2 -0
- package/dist/mention-input/index.js +2 -0
- package/dist/mention-input/mention-input.d.ts +98 -0
- package/dist/mention-input/mention-input.js +576 -0
- package/dist/mention-input/mention-input.js.map +1 -0
- package/dist/menu/menu.d.ts +2 -0
- package/dist/menu/menu.js +23 -12
- package/dist/menu/menu.js.map +1 -1
- package/dist/money-input/index.d.ts +2 -0
- package/dist/money-input/index.js +2 -0
- package/dist/money-input/money-input.d.ts +86 -0
- package/dist/money-input/money-input.js +613 -0
- package/dist/money-input/money-input.js.map +1 -0
- package/dist/morph-select/index.d.ts +2 -0
- package/dist/morph-select/index.js +2 -0
- package/dist/morph-select/morph-select.d.ts +89 -0
- package/dist/morph-select/morph-select.js +712 -0
- package/dist/morph-select/morph-select.js.map +1 -0
- package/dist/multi-select/index.d.ts +2 -0
- package/dist/multi-select/index.js +2 -0
- package/dist/multi-select/multi-select.d.ts +77 -0
- package/dist/multi-select/multi-select.js +209 -0
- package/dist/multi-select/multi-select.js.map +1 -0
- package/dist/number-field/index.d.ts +2 -0
- package/dist/number-field/index.js +2 -0
- package/dist/number-field/number-field.d.ts +42 -0
- package/dist/number-field/number-field.js +199 -0
- package/dist/number-field/number-field.js.map +1 -0
- package/dist/onboarding-checklist/index.d.ts +2 -0
- package/dist/onboarding-checklist/index.js +2 -0
- package/dist/onboarding-checklist/onboarding-checklist.d.ts +55 -0
- package/dist/onboarding-checklist/onboarding-checklist.js +577 -0
- package/dist/onboarding-checklist/onboarding-checklist.js.map +1 -0
- package/dist/password-field/password-field.d.ts +16 -0
- package/dist/password-field/password-field.js +39 -10
- package/dist/password-field/password-field.js.map +1 -1
- package/dist/phone-input/index.d.ts +3 -0
- package/dist/phone-input/index.js +3 -0
- package/dist/phone-input/phone-countries.d.ts +29 -0
- package/dist/phone-input/phone-countries.js +170 -0
- package/dist/phone-input/phone-countries.js.map +1 -0
- package/dist/phone-input/phone-input.d.ts +66 -0
- package/dist/phone-input/phone-input.js +440 -0
- package/dist/phone-input/phone-input.js.map +1 -0
- package/dist/popover/index.d.ts +2 -2
- package/dist/popover/index.js +2 -2
- package/dist/popover/popover.d.ts +51 -2
- package/dist/popover/popover.js +59 -8
- package/dist/popover/popover.js.map +1 -1
- package/dist/progress/progress.d.ts +16 -2
- package/dist/progress/progress.js +16 -9
- package/dist/progress/progress.js.map +1 -1
- package/dist/radio-group/index.d.ts +2 -2
- package/dist/radio-group/index.js +2 -2
- package/dist/radio-group/radio-group.d.ts +33 -3
- package/dist/radio-group/radio-group.js +110 -10
- package/dist/radio-group/radio-group.js.map +1 -1
- package/dist/reactions/index.d.ts +2 -0
- package/dist/reactions/index.js +2 -0
- package/dist/reactions/reactions.d.ts +50 -0
- package/dist/reactions/reactions.js +315 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +3 -0
- package/dist/rich-text-editor/index.js +2 -0
- package/dist/rich-text-editor/rich-text-editor.d.ts +70 -0
- package/dist/rich-text-editor/rich-text-editor.js +909 -0
- package/dist/rich-text-editor/rich-text-editor.js.map +1 -0
- package/dist/rich-text-editor/rich-text-engine.d.ts +16 -0
- package/dist/rich-text-editor/rich-text-engine.js +366 -0
- package/dist/rich-text-editor/rich-text-engine.js.map +1 -0
- package/dist/rich-text-editor/rich-text-html.js +174 -0
- package/dist/rich-text-editor/rich-text-html.js.map +1 -0
- package/dist/rich-text-editor/rich-text-icons.js +43 -0
- package/dist/rich-text-editor/rich-text-icons.js.map +1 -0
- package/dist/ridgeline/index.d.ts +2 -0
- package/dist/ridgeline/index.js +2 -0
- package/dist/ridgeline/ridgeline.d.ts +55 -0
- package/dist/ridgeline/ridgeline.js +701 -0
- package/dist/ridgeline/ridgeline.js.map +1 -0
- package/dist/scroll-area/index.d.ts +2 -2
- package/dist/scroll-area/index.js +2 -2
- package/dist/scroll-area/scroll-area.d.ts +68 -31
- package/dist/scroll-area/scroll-area.js +212 -62
- package/dist/scroll-area/scroll-area.js.map +1 -1
- package/dist/scrub-input/evaluate.d.ts +14 -0
- package/dist/scrub-input/evaluate.js +72 -0
- package/dist/scrub-input/evaluate.js.map +1 -0
- package/dist/scrub-input/index.d.ts +3 -0
- package/dist/scrub-input/index.js +3 -0
- package/dist/scrub-input/scrub-input.d.ts +74 -0
- package/dist/scrub-input/scrub-input.js +486 -0
- package/dist/scrub-input/scrub-input.js.map +1 -0
- package/dist/search-field/search-field.d.ts +24 -2
- package/dist/search-field/search-field.js +24 -9
- package/dist/search-field/search-field.js.map +1 -1
- package/dist/select/select.d.ts +3 -1
- package/dist/select/select.js +28 -14
- package/dist/select/select.js.map +1 -1
- package/dist/separator/separator.d.ts +22 -10
- package/dist/separator/separator.js +33 -11
- package/dist/separator/separator.js.map +1 -1
- package/dist/sheet/sheet.js +2 -1
- package/dist/sheet/sheet.js.map +1 -1
- package/dist/shortcut-recorder/index.d.ts +3 -0
- package/dist/shortcut-recorder/index.js +3 -0
- package/dist/shortcut-recorder/shortcut-model.d.ts +27 -0
- package/dist/shortcut-recorder/shortcut-model.js +206 -0
- package/dist/shortcut-recorder/shortcut-model.js.map +1 -0
- package/dist/shortcut-recorder/shortcut-recorder.d.ts +93 -0
- package/dist/shortcut-recorder/shortcut-recorder.js +489 -0
- package/dist/shortcut-recorder/shortcut-recorder.js.map +1 -0
- package/dist/slider/index.d.ts +2 -2
- package/dist/slider/slider.d.ts +46 -14
- package/dist/slider/slider.js +151 -67
- package/dist/slider/slider.js.map +1 -1
- package/dist/slope-chart/index.d.ts +2 -0
- package/dist/slope-chart/index.js +2 -0
- package/dist/slope-chart/slope-chart.d.ts +54 -0
- package/dist/slope-chart/slope-chart.js +568 -0
- package/dist/slope-chart/slope-chart.js.map +1 -0
- package/dist/sparkline/index.d.ts +2 -0
- package/dist/sparkline/index.js +2 -0
- package/dist/sparkline/sparkline.d.ts +46 -0
- package/dist/sparkline/sparkline.js +390 -0
- package/dist/sparkline/sparkline.js.map +1 -0
- package/dist/split-bar/index.d.ts +2 -0
- package/dist/split-bar/index.js +2 -0
- package/dist/split-bar/split-bar.d.ts +62 -0
- package/dist/split-bar/split-bar.js +513 -0
- package/dist/split-bar/split-bar.js.map +1 -0
- package/dist/split-button/split-button.d.ts +1 -1
- package/dist/split-button/split-button.js +12 -11
- package/dist/split-button/split-button.js.map +1 -1
- package/dist/stat-card/index.d.ts +2 -2
- package/dist/stat-card/index.js +2 -2
- package/dist/stat-card/stat-card.d.ts +58 -5
- package/dist/stat-card/stat-card.js +144 -17
- package/dist/stat-card/stat-card.js.map +1 -1
- package/dist/stepper/index.d.ts +2 -0
- package/dist/stepper/index.js +2 -0
- package/dist/stepper/stepper.d.ts +51 -0
- package/dist/stepper/stepper.js +215 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/streamgraph/index.d.ts +2 -0
- package/dist/streamgraph/index.js +2 -0
- package/dist/streamgraph/streamgraph.d.ts +70 -0
- package/dist/streamgraph/streamgraph.js +613 -0
- package/dist/streamgraph/streamgraph.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/swipe-actions/index.d.ts +2 -0
- package/dist/swipe-actions/index.js +2 -0
- package/dist/swipe-actions/swipe-actions.d.ts +67 -0
- package/dist/swipe-actions/swipe-actions.js +552 -0
- package/dist/swipe-actions/swipe-actions.js.map +1 -0
- package/dist/switch/switch.js +2 -2
- package/dist/switch/switch.js.map +1 -1
- package/dist/table/index.d.ts +2 -2
- package/dist/table/index.js +2 -2
- package/dist/table/table.d.ts +55 -3
- package/dist/table/table.js +340 -165
- package/dist/table/table.js.map +1 -1
- package/dist/tabs/tabs.js +2 -2
- package/dist/tabs/tabs.js.map +1 -1
- package/dist/tag-input/index.d.ts +2 -0
- package/dist/tag-input/index.js +2 -0
- package/dist/tag-input/tag-input.d.ts +40 -0
- package/dist/tag-input/tag-input.js +269 -0
- package/dist/tag-input/tag-input.js.map +1 -0
- package/dist/text-morph/index.d.ts +2 -0
- package/dist/text-morph/index.js +2 -0
- package/dist/text-morph/text-morph.d.ts +23 -0
- package/dist/text-morph/text-morph.js +21 -0
- package/dist/text-morph/text-morph.js.map +1 -0
- package/dist/text-reveal/index.d.ts +2 -0
- package/dist/text-reveal/index.js +2 -0
- package/dist/text-reveal/text-reveal.d.ts +27 -0
- package/dist/text-reveal/text-reveal.js +51 -0
- package/dist/text-reveal/text-reveal.js.map +1 -0
- package/dist/text-shimmer/index.d.ts +2 -0
- package/dist/text-shimmer/index.js +2 -0
- package/dist/text-shimmer/text-shimmer.d.ts +29 -0
- package/dist/text-shimmer/text-shimmer.js +29 -0
- package/dist/text-shimmer/text-shimmer.js.map +1 -0
- package/dist/time-picker/time-picker.d.ts +36 -1
- package/dist/time-picker/time-picker.js +35 -7
- package/dist/time-picker/time-picker.js.map +1 -1
- package/dist/toast/index.d.ts +2 -2
- package/dist/toast/index.js +2 -2
- package/dist/toast/toast.d.ts +7 -1
- package/dist/toast/toast.js +82 -40
- package/dist/toast/toast.js.map +1 -1
- package/dist/tooltip/tooltip.d.ts +9 -2
- package/dist/tooltip/tooltip.js +7 -7
- package/dist/tooltip/tooltip.js.map +1 -1
- package/dist/treemap/index.d.ts +2 -0
- package/dist/treemap/index.js +2 -0
- package/dist/treemap/treemap.d.ts +53 -0
- package/dist/treemap/treemap.js +699 -0
- package/dist/treemap/treemap.js.map +1 -0
- package/dist/usage-meter/index.d.ts +2 -0
- package/dist/usage-meter/index.js +2 -0
- package/dist/usage-meter/usage-meter.d.ts +80 -0
- package/dist/usage-meter/usage-meter.js +458 -0
- package/dist/usage-meter/usage-meter.js.map +1 -0
- package/dist/waffle-chart/index.d.ts +2 -0
- package/dist/waffle-chart/index.js +2 -0
- package/dist/waffle-chart/waffle-chart.d.ts +57 -0
- package/dist/waffle-chart/waffle-chart.js +426 -0
- package/dist/waffle-chart/waffle-chart.js.map +1 -0
- package/package.json +165 -3
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mergeRefs } from "../lib/merge-refs.js";
|
|
4
|
+
import { prefersReducedMotion, useExitBackstop, useIsomorphicLayoutEffect, useReducedMotion } from "../lib/motion.js";
|
|
5
|
+
import { SwapText } from "../lib/swap-text.js";
|
|
6
|
+
import { useHeightFollow } from "../lib/height-follow.js";
|
|
7
|
+
import { usePausableTimeout } from "../lib/pausable-timeout.js";
|
|
8
|
+
import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
9
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
//#region src/announcement-bar/announcement-bar.tsx
|
|
11
|
+
const storageKey = (id) => `alfred-announcement:${id}`;
|
|
12
|
+
/** Forgets a remembered dismissal so the bar with this id shows again. */
|
|
13
|
+
function clearAnnouncementDismissal(id) {
|
|
14
|
+
try {
|
|
15
|
+
window.localStorage.removeItem(storageKey(id));
|
|
16
|
+
} catch {}
|
|
17
|
+
}
|
|
18
|
+
function parts(ms) {
|
|
19
|
+
const total = Math.max(0, Math.floor(ms / 1e3));
|
|
20
|
+
return {
|
|
21
|
+
d: Math.floor(total / 86400),
|
|
22
|
+
h: Math.floor(total % 86400 / 3600),
|
|
23
|
+
m: Math.floor(total % 3600 / 60),
|
|
24
|
+
s: total % 60
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
28
|
+
/** One character cell: a changed digit rises in while the old one lifts away, like a counter winding down. */
|
|
29
|
+
const Digits = ({ value, pending }) => value.split("").map((char, index) => /* @__PURE__ */ jsx("span", {
|
|
30
|
+
className: "announcement-digit",
|
|
31
|
+
children: /* @__PURE__ */ jsx(SwapText, {
|
|
32
|
+
swapKey: pending ? "0" : char,
|
|
33
|
+
children: pending ? "0" : char
|
|
34
|
+
})
|
|
35
|
+
}, value.length - index));
|
|
36
|
+
function Countdown({ to, label, onEnd }) {
|
|
37
|
+
const target = new Date(to).getTime();
|
|
38
|
+
const [now, setNow] = useState(null);
|
|
39
|
+
const ended = useRef(false);
|
|
40
|
+
const endRef = useRef(onEnd);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
endRef.current = onEnd;
|
|
43
|
+
});
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
let timer;
|
|
46
|
+
const tick = () => {
|
|
47
|
+
const current = Date.now();
|
|
48
|
+
setNow(current);
|
|
49
|
+
if (current >= target) {
|
|
50
|
+
if (!ended.current) {
|
|
51
|
+
ended.current = true;
|
|
52
|
+
endRef.current?.();
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
timer = setTimeout(tick, 1e3 - current % 1e3 + 8);
|
|
57
|
+
};
|
|
58
|
+
timer = setTimeout(tick, 0);
|
|
59
|
+
return () => clearTimeout(timer);
|
|
60
|
+
}, [target]);
|
|
61
|
+
const pending = now === null;
|
|
62
|
+
const { d, h, m, s } = parts(pending ? 0 : target - now);
|
|
63
|
+
const spoken = pending ? "" : `${d ? `${d} days ` : ""}${h} hours ${m} minutes`;
|
|
64
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
65
|
+
className: "announcement-countdown",
|
|
66
|
+
children: [label ? /* @__PURE__ */ jsx("span", { children: label }) : null, /* @__PURE__ */ jsxs("span", {
|
|
67
|
+
role: "timer",
|
|
68
|
+
"aria-live": "off",
|
|
69
|
+
"aria-label": spoken,
|
|
70
|
+
"data-pending": pending || void 0,
|
|
71
|
+
className: "announcement-time",
|
|
72
|
+
children: [
|
|
73
|
+
d ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Digits, {
|
|
75
|
+
value: String(d),
|
|
76
|
+
pending
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ jsx("span", {
|
|
79
|
+
"aria-hidden": "true",
|
|
80
|
+
className: "announcement-unit",
|
|
81
|
+
children: "d"
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ jsx("span", {
|
|
84
|
+
"aria-hidden": "true",
|
|
85
|
+
className: "announcement-gap"
|
|
86
|
+
})
|
|
87
|
+
] }) : null,
|
|
88
|
+
/* @__PURE__ */ jsx(Digits, {
|
|
89
|
+
value: pad(h),
|
|
90
|
+
pending
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ jsx("span", {
|
|
93
|
+
"aria-hidden": "true",
|
|
94
|
+
className: "announcement-sep",
|
|
95
|
+
children: ":"
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ jsx(Digits, {
|
|
98
|
+
value: pad(m),
|
|
99
|
+
pending
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ jsx("span", {
|
|
102
|
+
"aria-hidden": "true",
|
|
103
|
+
className: "announcement-sep",
|
|
104
|
+
children: ":"
|
|
105
|
+
}),
|
|
106
|
+
/* @__PURE__ */ jsx(Digits, {
|
|
107
|
+
value: pad(s),
|
|
108
|
+
pending
|
|
109
|
+
})
|
|
110
|
+
]
|
|
111
|
+
})]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const Glyph = ({ path, size = 16 }) => /* @__PURE__ */ jsx("svg", {
|
|
115
|
+
width: size,
|
|
116
|
+
height: size,
|
|
117
|
+
viewBox: "0 0 16 16",
|
|
118
|
+
fill: "none",
|
|
119
|
+
stroke: "currentColor",
|
|
120
|
+
strokeWidth: 1.75,
|
|
121
|
+
strokeLinecap: "round",
|
|
122
|
+
strokeLinejoin: "round",
|
|
123
|
+
"aria-hidden": "true",
|
|
124
|
+
children: /* @__PURE__ */ jsx("path", { d: path })
|
|
125
|
+
});
|
|
126
|
+
const AnnouncementBar = forwardRef(function AnnouncementBar({ messages, id, open: openProp, defaultOpen = true, onOpenChange, index: indexProp, defaultIndex = 0, onIndexChange, interval = 6e3, autoPlay = true, controls = false, dismissible = true, tone = "neutral", onAction, onCountdownEnd, label = "Announcements", className }, ref) {
|
|
127
|
+
const uid = useId();
|
|
128
|
+
const reduced = useReducedMotion();
|
|
129
|
+
const total = messages.length;
|
|
130
|
+
const [openInternal, setOpenInternal] = useState(defaultOpen);
|
|
131
|
+
const [remembered, setRemembered] = useState(false);
|
|
132
|
+
const wanted = openProp ?? (openInternal && !remembered);
|
|
133
|
+
const [rendered, setRendered] = useState(wanted);
|
|
134
|
+
const [shown, setShown] = useState(wanted);
|
|
135
|
+
if (wanted && !rendered) setRendered(true);
|
|
136
|
+
if (!wanted && shown) setShown(false);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (wanted && rendered && !shown) {
|
|
139
|
+
const frame = requestAnimationFrame(() => setShown(true));
|
|
140
|
+
return () => cancelAnimationFrame(frame);
|
|
141
|
+
}
|
|
142
|
+
}, [
|
|
143
|
+
wanted,
|
|
144
|
+
rendered,
|
|
145
|
+
shown
|
|
146
|
+
]);
|
|
147
|
+
const leaving = rendered && !wanted;
|
|
148
|
+
const finish = useCallback(() => setRendered(false), []);
|
|
149
|
+
useExitBackstop(leaving, finish, 900);
|
|
150
|
+
useIsomorphicLayoutEffect(() => {
|
|
151
|
+
if (leaving && prefersReducedMotion()) finish();
|
|
152
|
+
}, [leaving, finish]);
|
|
153
|
+
useIsomorphicLayoutEffect(() => {
|
|
154
|
+
if (!id || openProp !== void 0) return;
|
|
155
|
+
let stored = false;
|
|
156
|
+
try {
|
|
157
|
+
stored = window.localStorage.getItem(storageKey(id)) === "dismissed";
|
|
158
|
+
} catch {}
|
|
159
|
+
if (stored) {
|
|
160
|
+
setRemembered(true);
|
|
161
|
+
setRendered(false);
|
|
162
|
+
setShown(false);
|
|
163
|
+
}
|
|
164
|
+
}, [id, openProp]);
|
|
165
|
+
function dismiss() {
|
|
166
|
+
if (id) try {
|
|
167
|
+
window.localStorage.setItem(storageKey(id), "dismissed");
|
|
168
|
+
} catch {}
|
|
169
|
+
if (openProp === void 0) setOpenInternal(false);
|
|
170
|
+
onOpenChange?.(false);
|
|
171
|
+
}
|
|
172
|
+
const [indexInternal, setIndexInternal] = useState(defaultIndex);
|
|
173
|
+
const current = total ? ((indexProp ?? indexInternal) % total + total) % total : 0;
|
|
174
|
+
const [direction, setDirection] = useState(1);
|
|
175
|
+
function go(step) {
|
|
176
|
+
if (total < 2) return;
|
|
177
|
+
const next = ((current + step) % total + total) % total;
|
|
178
|
+
setDirection(step > 0 ? 1 : -1);
|
|
179
|
+
if (indexProp === void 0) setIndexInternal(next);
|
|
180
|
+
onIndexChange?.(next);
|
|
181
|
+
}
|
|
182
|
+
const [userPaused, setUserPaused] = useState(false);
|
|
183
|
+
const [hovered, setHovered] = useState(false);
|
|
184
|
+
const [focused, setFocused] = useState(false);
|
|
185
|
+
const [hidden, setHidden] = useState(false);
|
|
186
|
+
useEffect(() => {
|
|
187
|
+
const read = () => setHidden(document.visibilityState === "hidden");
|
|
188
|
+
document.addEventListener("visibilitychange", read);
|
|
189
|
+
return () => document.removeEventListener("visibilitychange", read);
|
|
190
|
+
}, []);
|
|
191
|
+
const rotating = autoPlay && !reduced && total > 1;
|
|
192
|
+
const held = hovered || focused || userPaused;
|
|
193
|
+
const setHeld = usePausableTimeout(rotating && wanted ? interval : 0, current, () => go(1));
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
setHeld(held);
|
|
196
|
+
}, [held, setHeld]);
|
|
197
|
+
const frame = useRef(null);
|
|
198
|
+
const content = useRef(null);
|
|
199
|
+
useHeightFollow(frame, content, String(current));
|
|
200
|
+
const bar = useRef(null);
|
|
201
|
+
const barRef = useMemo(() => mergeRefs(ref, bar), [ref]);
|
|
202
|
+
useIsomorphicLayoutEffect(() => {
|
|
203
|
+
bar.current?.toggleAttribute("inert", leaving);
|
|
204
|
+
}, [leaving]);
|
|
205
|
+
const announcement = messages[current];
|
|
206
|
+
if (!rendered || !announcement) return null;
|
|
207
|
+
const navigable = controls && total > 1;
|
|
208
|
+
const controlCount = (navigable ? 2 + (rotating ? 1 : 0) : 0) + (dismissible ? 1 : 0);
|
|
209
|
+
const { action, countdown } = announcement;
|
|
210
|
+
const cta = action ? action.href ? /* @__PURE__ */ jsxs("a", {
|
|
211
|
+
href: action.href,
|
|
212
|
+
className: "announcement-cta",
|
|
213
|
+
onClick: () => {
|
|
214
|
+
action.onClick?.();
|
|
215
|
+
onAction?.(announcement);
|
|
216
|
+
},
|
|
217
|
+
children: [action.label, /* @__PURE__ */ jsx(Glyph, {
|
|
218
|
+
path: "M3 8h10M9 4l4 4-4 4",
|
|
219
|
+
size: 14
|
|
220
|
+
})]
|
|
221
|
+
}) : /* @__PURE__ */ jsxs("button", {
|
|
222
|
+
type: "button",
|
|
223
|
+
className: "announcement-cta",
|
|
224
|
+
onClick: () => {
|
|
225
|
+
action.onClick?.();
|
|
226
|
+
onAction?.(announcement);
|
|
227
|
+
},
|
|
228
|
+
children: [action.label, /* @__PURE__ */ jsx(Glyph, {
|
|
229
|
+
path: "M3 8h10M9 4l4 4-4 4",
|
|
230
|
+
size: 14
|
|
231
|
+
})]
|
|
232
|
+
}) : null;
|
|
233
|
+
return /* @__PURE__ */ jsx("div", {
|
|
234
|
+
"data-slot": "announcement-presence",
|
|
235
|
+
"data-shown": shown || void 0,
|
|
236
|
+
onTransitionEnd: (event) => {
|
|
237
|
+
if (leaving && event.target === event.currentTarget && event.propertyName === "grid-template-rows") finish();
|
|
238
|
+
},
|
|
239
|
+
className: "alert-presence announcement-frame",
|
|
240
|
+
children: /* @__PURE__ */ jsxs("section", {
|
|
241
|
+
ref: barRef,
|
|
242
|
+
"data-slot": "announcement-bar",
|
|
243
|
+
"data-tone": tone,
|
|
244
|
+
"aria-label": label,
|
|
245
|
+
"aria-roledescription": total > 1 ? "carousel" : void 0,
|
|
246
|
+
"aria-hidden": leaving || void 0,
|
|
247
|
+
className: cn("announcement-bar", className),
|
|
248
|
+
style: { "--controls": controlCount },
|
|
249
|
+
onPointerEnter: (event) => event.pointerType === "mouse" && setHovered(true),
|
|
250
|
+
onPointerLeave: () => setHovered(false),
|
|
251
|
+
onFocus: (event) => setFocused(event.target.matches(":focus-visible") && !event.target.closest("[data-pause]")),
|
|
252
|
+
onBlur: (event) => {
|
|
253
|
+
if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
|
|
254
|
+
},
|
|
255
|
+
children: [
|
|
256
|
+
/* @__PURE__ */ jsx("div", { "aria-hidden": "true" }),
|
|
257
|
+
/* @__PURE__ */ jsx("div", {
|
|
258
|
+
ref: frame,
|
|
259
|
+
id: `${uid}-slides`,
|
|
260
|
+
"aria-live": rotating && !held ? "off" : "polite",
|
|
261
|
+
"aria-atomic": "false",
|
|
262
|
+
className: "announcement-viewport height-follow",
|
|
263
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
264
|
+
ref: content,
|
|
265
|
+
children: /* @__PURE__ */ jsx(SwapText, {
|
|
266
|
+
swapKey: announcement.id,
|
|
267
|
+
dir: direction,
|
|
268
|
+
className: "block",
|
|
269
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
270
|
+
role: total > 1 ? "group" : void 0,
|
|
271
|
+
"aria-roledescription": total > 1 ? "slide" : void 0,
|
|
272
|
+
"aria-label": total > 1 ? `${current + 1} of ${total}` : void 0,
|
|
273
|
+
className: "announcement-face",
|
|
274
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
275
|
+
className: "announcement-message",
|
|
276
|
+
children: [
|
|
277
|
+
/* @__PURE__ */ jsx("span", { children: announcement.message }),
|
|
278
|
+
countdown ? /* @__PURE__ */ jsx(Countdown, {
|
|
279
|
+
to: countdown.to,
|
|
280
|
+
label: countdown.label,
|
|
281
|
+
onEnd: () => onCountdownEnd?.(announcement)
|
|
282
|
+
}) : null,
|
|
283
|
+
cta
|
|
284
|
+
]
|
|
285
|
+
})
|
|
286
|
+
})
|
|
287
|
+
})
|
|
288
|
+
})
|
|
289
|
+
}),
|
|
290
|
+
/* @__PURE__ */ jsxs("div", {
|
|
291
|
+
className: "announcement-controls",
|
|
292
|
+
children: [navigable ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
293
|
+
/* @__PURE__ */ jsx("button", {
|
|
294
|
+
type: "button",
|
|
295
|
+
"aria-label": "Previous announcement",
|
|
296
|
+
"aria-controls": `${uid}-slides`,
|
|
297
|
+
className: "announcement-icon",
|
|
298
|
+
onClick: () => go(-1),
|
|
299
|
+
children: /* @__PURE__ */ jsx(Glyph, { path: "M4 10l4-4 4 4" })
|
|
300
|
+
}),
|
|
301
|
+
rotating ? /* @__PURE__ */ jsxs("button", {
|
|
302
|
+
type: "button",
|
|
303
|
+
"aria-label": userPaused ? "Resume announcements" : "Pause announcements",
|
|
304
|
+
"aria-pressed": userPaused,
|
|
305
|
+
"data-pause": "",
|
|
306
|
+
className: "announcement-icon",
|
|
307
|
+
onClick: () => setUserPaused(!userPaused),
|
|
308
|
+
children: [/* @__PURE__ */ jsxs("svg", {
|
|
309
|
+
viewBox: "0 0 20 20",
|
|
310
|
+
fill: "none",
|
|
311
|
+
stroke: "currentColor",
|
|
312
|
+
strokeWidth: 1.75,
|
|
313
|
+
"aria-hidden": "true",
|
|
314
|
+
className: "announcement-ring",
|
|
315
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
316
|
+
cx: "10",
|
|
317
|
+
cy: "10",
|
|
318
|
+
r: "8",
|
|
319
|
+
pathLength: 1,
|
|
320
|
+
className: "announcement-ring-track"
|
|
321
|
+
}), /* @__PURE__ */ jsx("circle", {
|
|
322
|
+
cx: "10",
|
|
323
|
+
cy: "10",
|
|
324
|
+
r: "8",
|
|
325
|
+
pathLength: 1,
|
|
326
|
+
strokeLinecap: "round",
|
|
327
|
+
className: "announcement-ring-fill",
|
|
328
|
+
style: {
|
|
329
|
+
animationDuration: `${interval}ms`,
|
|
330
|
+
animationPlayState: held || hidden ? "paused" : "running"
|
|
331
|
+
}
|
|
332
|
+
}, current)]
|
|
333
|
+
}), /* @__PURE__ */ jsx("svg", {
|
|
334
|
+
viewBox: "0 0 16 16",
|
|
335
|
+
fill: "currentColor",
|
|
336
|
+
"aria-hidden": "true",
|
|
337
|
+
className: "announcement-ring-icon",
|
|
338
|
+
children: userPaused ? /* @__PURE__ */ jsx("path", { d: "M6 4.5v7l5.5-3.5Z" }) : /* @__PURE__ */ jsx("path", { d: "M5.5 4.5h1.8v7H5.5ZM8.7 4.5h1.8v7H8.7Z" })
|
|
339
|
+
})]
|
|
340
|
+
}) : null,
|
|
341
|
+
/* @__PURE__ */ jsx("button", {
|
|
342
|
+
type: "button",
|
|
343
|
+
"aria-label": "Next announcement",
|
|
344
|
+
"aria-controls": `${uid}-slides`,
|
|
345
|
+
className: "announcement-icon",
|
|
346
|
+
onClick: () => go(1),
|
|
347
|
+
children: /* @__PURE__ */ jsx(Glyph, { path: "M4 6l4 4 4-4" })
|
|
348
|
+
})
|
|
349
|
+
] }) : null, dismissible ? /* @__PURE__ */ jsx("button", {
|
|
350
|
+
type: "button",
|
|
351
|
+
"aria-label": "Dismiss",
|
|
352
|
+
className: "announcement-icon",
|
|
353
|
+
onClick: dismiss,
|
|
354
|
+
children: /* @__PURE__ */ jsx(Glyph, { path: "M4 4l8 8M12 4l-8 8" })
|
|
355
|
+
}) : null]
|
|
356
|
+
})
|
|
357
|
+
]
|
|
358
|
+
})
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
//#endregion
|
|
362
|
+
export { AnnouncementBar, clearAnnouncementDismissal };
|
|
363
|
+
|
|
364
|
+
//# sourceMappingURL=announcement-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcement-bar.js","names":[],"sources":["../../src/announcement-bar/announcement-bar.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { useHeightFollow } from \"../lib/height-follow.js\";\nimport { mergeRefs } from \"../lib/merge-refs.js\";\nimport { prefersReducedMotion, useExitBackstop, useIsomorphicLayoutEffect, useReducedMotion } from \"../lib/motion.js\";\nimport { usePausableTimeout } from \"../lib/pausable-timeout.js\";\nimport { SwapText } from \"../lib/swap-text.js\";\n\nexport interface AnnouncementAction {\n label: string;\n /** Renders a link. Without it the action is a button. */\n href?: string;\n onClick?: () => void;\n}\n\nexport interface Announcement {\n /** Stable id, reported to callbacks. */\n id: string;\n message: ReactNode;\n action?: AnnouncementAction;\n /** Counts down to a moment, for example the end of a sale. */\n countdown?: { to: Date | string | number; label?: string };\n}\n\n/**\n * AnnouncementBar: a slim bar for the top of a page.\n *\n * It can rotate several messages: the next one rises in from below (the\n * previous one from above) while the bar follows the new height. Rotation pauses\n * on hover, keyboard focus, a hidden tab and, with the `controls`, a Pause\n * button whose ring is the clock; it is off under reduced motion. Messages can\n * carry a call to action and a live countdown whose digits roll. Dismissing\n * collapses the bar's height so the page below eases up, and with an `id` the\n * dismissal is remembered in `localStorage`. While rotation runs the message is\n * not announced on each change; when it holds, changes are announced politely.\n */\nexport interface AnnouncementBarProps {\n messages: Announcement[];\n /** Remembers dismissal under this id. Change the id to show a new campaign to everyone again. */\n id?: string;\n /** Whether the bar is shown. Leave it out to let the component manage it. */\n open?: boolean;\n /** @default true */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Index of the visible message. */\n index?: number;\n /** @default 0 */\n defaultIndex?: number;\n onIndexChange?: (index: number) => void;\n /** Milliseconds each message stays before the next one. @default 6000 */\n interval?: number;\n /** Rotate automatically. Off under reduced motion. @default true */\n autoPlay?: boolean;\n /** Show previous, next and pause controls when there are several messages. By default only the close button shows. @default false */\n controls?: boolean;\n /** @default true */\n dismissible?: boolean;\n /** `inverted` is the foreground colour as the fill. @default \"neutral\" */\n tone?: \"neutral\" | \"inverted\";\n onAction?: (announcement: Announcement) => void;\n onCountdownEnd?: (announcement: Announcement) => void;\n /** Accessible name of the region. @default \"Announcements\" */\n label?: string;\n /** Extra classes for the bar. Merged last. */\n className?: string;\n}\n\nconst storageKey = (id: string) => `alfred-announcement:${id}`;\n\n/** Forgets a remembered dismissal so the bar with this id shows again. */\nexport function clearAnnouncementDismissal(id: string) {\n try {\n window.localStorage.removeItem(storageKey(id));\n } catch {\n // Storage can be blocked.\n }\n}\n\nfunction parts(ms: number) {\n const total = Math.max(0, Math.floor(ms / 1000));\n return { d: Math.floor(total / 86400), h: Math.floor((total % 86400) / 3600), m: Math.floor((total % 3600) / 60), s: total % 60 };\n}\nconst pad = (value: number) => String(value).padStart(2, \"0\");\n\n/** One character cell: a changed digit rises in while the old one lifts away, like a counter winding down. */\nconst Digits = ({ value, pending }: { value: string; pending: boolean }) =>\n value.split(\"\").map((char, index) => (\n <span key={value.length - index} className=\"announcement-digit\">\n <SwapText swapKey={pending ? \"0\" : char}>{pending ? \"0\" : char}</SwapText>\n </span>\n ));\n\nfunction Countdown({ to, label, onEnd }: { to: Date | string | number; label?: string; onEnd?: () => void }) {\n const target = new Date(to).getTime();\n const [now, setNow] = useState<number | null>(null);\n const ended = useRef(false);\n const endRef = useRef(onEnd);\n useEffect(() => {\n endRef.current = onEnd;\n });\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n const tick = () => {\n const current = Date.now();\n setNow(current);\n if (current >= target) {\n if (!ended.current) {\n ended.current = true;\n endRef.current?.();\n }\n return;\n }\n // Wake just after each whole second, so the digits change on the beat.\n timer = setTimeout(tick, 1000 - (current % 1000) + 8);\n };\n timer = setTimeout(tick, 0);\n return () => clearTimeout(timer);\n }, [target]);\n const pending = now === null;\n const { d, h, m, s } = parts(pending ? 0 : target - now);\n const spoken = pending ? \"\" : `${d ? `${d} days ` : \"\"}${h} hours ${m} minutes`;\n return (\n <span className=\"announcement-countdown\">\n {label ? <span>{label}</span> : null}\n <span role=\"timer\" aria-live=\"off\" aria-label={spoken} data-pending={pending || undefined} className=\"announcement-time\">\n {d ? (\n <>\n <Digits value={String(d)} pending={pending} />\n <span aria-hidden=\"true\" className=\"announcement-unit\">\n d\n </span>\n <span aria-hidden=\"true\" className=\"announcement-gap\" />\n </>\n ) : null}\n <Digits value={pad(h)} pending={pending} />\n <span aria-hidden=\"true\" className=\"announcement-sep\">:</span>\n <Digits value={pad(m)} pending={pending} />\n <span aria-hidden=\"true\" className=\"announcement-sep\">:</span>\n <Digits value={pad(s)} pending={pending} />\n </span>\n </span>\n );\n}\n\nconst Glyph = ({ path, size = 16 }: { path: string; size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d={path} />\n </svg>\n);\n\nexport const AnnouncementBar = forwardRef<HTMLElement, AnnouncementBarProps>(function AnnouncementBar(\n {\n messages,\n id,\n open: openProp,\n defaultOpen = true,\n onOpenChange,\n index: indexProp,\n defaultIndex = 0,\n onIndexChange,\n interval = 6000,\n autoPlay = true,\n controls = false,\n dismissible = true,\n tone = \"neutral\",\n onAction,\n onCountdownEnd,\n label = \"Announcements\",\n className,\n },\n ref,\n) {\n const uid = useId();\n const reduced = useReducedMotion();\n const total = messages.length;\n\n // Open: controlled, or internal and closed at once when this id was dismissed before.\n const [openInternal, setOpenInternal] = useState(defaultOpen);\n const [remembered, setRemembered] = useState(false);\n const wanted = openProp ?? (openInternal && !remembered);\n\n // Presence: a bar that comes and goes collapses its height rather than vanishing (the alert-presence utility).\n const [rendered, setRendered] = useState(wanted);\n const [shown, setShown] = useState(wanted);\n if (wanted && !rendered) setRendered(true);\n if (!wanted && shown) setShown(false);\n useEffect(() => {\n // A newly shown bar mounts collapsed and opens a frame later, so it grows rather than appears.\n if (wanted && rendered && !shown) {\n const frame = requestAnimationFrame(() => setShown(true));\n return () => cancelAnimationFrame(frame);\n }\n }, [wanted, rendered, shown]);\n const leaving = rendered && !wanted;\n const finish = useCallback(() => setRendered(false), []);\n useExitBackstop(leaving, finish, 900);\n useIsomorphicLayoutEffect(() => {\n if (leaving && prefersReducedMotion()) finish();\n }, [leaving, finish]);\n\n // Storage is only readable on the client; a dismissed bar is hidden before paint so it never flashes.\n useIsomorphicLayoutEffect(() => {\n if (!id || openProp !== undefined) return;\n let stored = false;\n try {\n stored = window.localStorage.getItem(storageKey(id)) === \"dismissed\";\n } catch {\n // Storage can be blocked.\n }\n if (stored) {\n setRemembered(true);\n setRendered(false);\n setShown(false);\n }\n }, [id, openProp]);\n\n function dismiss() {\n if (id) {\n try {\n window.localStorage.setItem(storageKey(id), \"dismissed\");\n } catch {\n // Storage can be blocked.\n }\n }\n if (openProp === undefined) setOpenInternal(false);\n onOpenChange?.(false);\n }\n\n // Rotation.\n const [indexInternal, setIndexInternal] = useState(defaultIndex);\n const current = total ? (((indexProp ?? indexInternal) % total) + total) % total : 0;\n const [direction, setDirection] = useState(1);\n function go(step: number) {\n if (total < 2) return;\n const next = (((current + step) % total) + total) % total;\n setDirection(step > 0 ? 1 : -1);\n if (indexProp === undefined) setIndexInternal(next);\n onIndexChange?.(next);\n }\n\n const [userPaused, setUserPaused] = useState(false);\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n const [hidden, setHidden] = useState(false);\n useEffect(() => {\n const read = () => setHidden(document.visibilityState === \"hidden\");\n document.addEventListener(\"visibilitychange\", read);\n return () => document.removeEventListener(\"visibilitychange\", read);\n }, []);\n const rotating = autoPlay && !reduced && total > 1;\n const held = hovered || focused || userPaused;\n // The clock holds while the viewer is looking, and finishes the rest of the time when released. It also holds in a hidden tab.\n const setHeld = usePausableTimeout(rotating && wanted ? interval : 0, current, () => go(1));\n useEffect(() => {\n setHeld(held);\n }, [held, setHeld]);\n\n // The bar follows the height of the current message, which can wrap on narrow screens.\n const frame = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLDivElement>(null);\n useHeightFollow(frame, content, String(current));\n\n // A bar on its way out is out of the tab order and the accessibility tree at once.\n const bar = useRef<HTMLElement | null>(null);\n const barRef = useMemo(() => mergeRefs(ref, bar), [ref]);\n useIsomorphicLayoutEffect(() => {\n bar.current?.toggleAttribute(\"inert\", leaving);\n }, [leaving]);\n\n const announcement = messages[current];\n if (!rendered || !announcement) return null;\n const navigable = controls && total > 1;\n const controlCount = (navigable ? 2 + (rotating ? 1 : 0) : 0) + (dismissible ? 1 : 0);\n const { action, countdown } = announcement;\n const cta = action ? (\n action.href ? (\n <a\n href={action.href}\n className=\"announcement-cta\"\n onClick={() => {\n action.onClick?.();\n onAction?.(announcement);\n }}\n >\n {action.label}\n <Glyph path=\"M3 8h10M9 4l4 4-4 4\" size={14} />\n </a>\n ) : (\n <button\n type=\"button\"\n className=\"announcement-cta\"\n onClick={() => {\n action.onClick?.();\n onAction?.(announcement);\n }}\n >\n {action.label}\n <Glyph path=\"M3 8h10M9 4l4 4-4 4\" size={14} />\n </button>\n )\n ) : null;\n\n return (\n <div\n data-slot=\"announcement-presence\"\n data-shown={shown || undefined}\n onTransitionEnd={(event) => {\n if (leaving && event.target === event.currentTarget && event.propertyName === \"grid-template-rows\") finish();\n }}\n className=\"alert-presence announcement-frame\"\n >\n <section\n ref={barRef}\n data-slot=\"announcement-bar\"\n data-tone={tone}\n aria-label={label}\n aria-roledescription={total > 1 ? \"carousel\" : undefined}\n aria-hidden={leaving || undefined}\n className={cn(\"announcement-bar\", className)}\n style={{ \"--controls\": controlCount } as CSSProperties}\n onPointerEnter={(event) => event.pointerType === \"mouse\" && setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n // Keyboard focus holds the clock; a mouse click that leaves focus on a button does not, and neither does the pause button itself.\n onFocus={(event) => setFocused(event.target.matches(\":focus-visible\") && !event.target.closest(\"[data-pause]\"))}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);\n }}\n >\n <div aria-hidden=\"true\" />\n <div\n ref={frame}\n id={`${uid}-slides`}\n aria-live={rotating && !held ? \"off\" : \"polite\"}\n aria-atomic=\"false\"\n className=\"announcement-viewport height-follow\"\n >\n <div ref={content}>\n <SwapText swapKey={announcement.id} dir={direction} className=\"block\">\n <div\n role={total > 1 ? \"group\" : undefined}\n aria-roledescription={total > 1 ? \"slide\" : undefined}\n aria-label={total > 1 ? `${current + 1} of ${total}` : undefined}\n className=\"announcement-face\"\n >\n <p className=\"announcement-message\">\n <span>{announcement.message}</span>\n {countdown ? <Countdown to={countdown.to} label={countdown.label} onEnd={() => onCountdownEnd?.(announcement)} /> : null}\n {cta}\n </p>\n </div>\n </SwapText>\n </div>\n </div>\n <div className=\"announcement-controls\">\n {navigable ? (\n <>\n <button type=\"button\" aria-label=\"Previous announcement\" aria-controls={`${uid}-slides`} className=\"announcement-icon\" onClick={() => go(-1)}>\n <Glyph path=\"M4 10l4-4 4 4\" />\n </button>\n {rotating ? (\n <button\n type=\"button\"\n aria-label={userPaused ? \"Resume announcements\" : \"Pause announcements\"}\n aria-pressed={userPaused}\n data-pause=\"\"\n className=\"announcement-icon\"\n onClick={() => setUserPaused(!userPaused)}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} aria-hidden=\"true\" className=\"announcement-ring\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" pathLength={1} className=\"announcement-ring-track\" />\n <circle\n key={current}\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n pathLength={1}\n strokeLinecap=\"round\"\n className=\"announcement-ring-fill\"\n style={{ animationDuration: `${interval}ms`, animationPlayState: held || hidden ? \"paused\" : \"running\" }}\n />\n </svg>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" className=\"announcement-ring-icon\">\n {userPaused ? <path d=\"M6 4.5v7l5.5-3.5Z\" /> : <path d=\"M5.5 4.5h1.8v7H5.5ZM8.7 4.5h1.8v7H8.7Z\" />}\n </svg>\n </button>\n ) : null}\n <button type=\"button\" aria-label=\"Next announcement\" aria-controls={`${uid}-slides`} className=\"announcement-icon\" onClick={() => go(1)}>\n <Glyph path=\"M4 6l4 4 4-4\" />\n </button>\n </>\n ) : null}\n {dismissible ? (\n <button type=\"button\" aria-label=\"Dismiss\" className=\"announcement-icon\" onClick={dismiss}>\n <Glyph path=\"M4 4l8 8M12 4l-8 8\" />\n </button>\n ) : null}\n </div>\n </section>\n </div>\n );\n});\n"],"mappings":"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"}
|
package/dist/badge/badge.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ import { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
|
36
36
|
* across every shadcn control.
|
|
37
37
|
*/
|
|
38
38
|
export declare const badgeVariants: (props?: ({
|
|
39
|
-
tone?: "primary" | "
|
|
39
|
+
tone?: "primary" | "success" | "warning" | "danger" | "neutral" | "info" | null | undefined;
|
|
40
40
|
appearance?: "outline" | "solid" | "soft" | null | undefined;
|
|
41
41
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
42
42
|
shape?: "rounded" | "pill" | null | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/bar-chart/bar-chart.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* BarChart: one measure across a run of days, weeks or months, when people
|
|
4
|
+
* compare each period against the rest and against the average.
|
|
5
|
+
*
|
|
6
|
+
* The bars grow from the baseline the first time the chart is seen, each a beat
|
|
7
|
+
* after its neighbour, and the dashed average rises with them. A new range zooms
|
|
8
|
+
* the time axis around the latest bar (bars that stay glide to their new slot,
|
|
9
|
+
* new ones grow outward from them, leaving ones sink into the baseline) while
|
|
10
|
+
* the scale and the average slide to fit. Hover, drag or the arrow keys scrub:
|
|
11
|
+
* the scrubbed bar takes the full colour while the rest step back, a cursor
|
|
12
|
+
* glides to it, and the headline swaps from the average to that bar.
|
|
13
|
+
*
|
|
14
|
+
* Plain SVG and CSS; one small spring tween drives the bars, the zoom, the
|
|
15
|
+
* scale, the average and the cursor. A visually hidden table carries every
|
|
16
|
+
* value, and the plot is a slider.
|
|
17
|
+
*/
|
|
18
|
+
export interface BarChartDatum {
|
|
19
|
+
/** Stable identity, such as an ISO date. A bar whose key survives a data change keeps its place. */
|
|
20
|
+
key: string;
|
|
21
|
+
/** Full label for the headline and screen readers, such as "Tue, Sep 15". */
|
|
22
|
+
label: string;
|
|
23
|
+
/** Short label under the bar, such as "T" or "Sep 14". Leave it out to keep the axis quiet. */
|
|
24
|
+
axisLabel?: string;
|
|
25
|
+
value: number;
|
|
26
|
+
}
|
|
27
|
+
export interface BarChartProps {
|
|
28
|
+
data: BarChartDatum[];
|
|
29
|
+
/** What is measured, such as "Active minutes". Names the chart for assistive technology. */
|
|
30
|
+
label: string;
|
|
31
|
+
/** The range on show, such as "Sep 15–21, 2026". It rests under the headline. */
|
|
32
|
+
period: string;
|
|
33
|
+
/** Unit after each value, such as "min". */
|
|
34
|
+
unit?: string;
|
|
35
|
+
/** Headline label at rest, above the average. @default "Daily average" */
|
|
36
|
+
averageLabel?: string;
|
|
37
|
+
/** Headline label while a bar is scrubbed. @default "Total" */
|
|
38
|
+
valueLabel?: string;
|
|
39
|
+
/** Header of the first column in the data table read by screen readers. @default "Day" */
|
|
40
|
+
categoryLabel?: string;
|
|
41
|
+
/** Draws the average as a dashed reference line. @default true */
|
|
42
|
+
showAverage?: boolean;
|
|
43
|
+
/** Plot height in pixels. @default 176 */
|
|
44
|
+
height?: number;
|
|
45
|
+
formatValue?: (value: number) => string;
|
|
46
|
+
/** Extra classes for the root. Merged last. */
|
|
47
|
+
className?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const BarChart: import("react").ForwardRefExoticComponent<BarChartProps & import("react").RefAttributes<HTMLElement>>;
|
|
50
|
+
//#endregion
|
|
51
|
+
//# sourceMappingURL=bar-chart.d.ts.map
|