@gabvdl/ui 0.0.14
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 +95 -0
- package/dist/components/button/button.d.ts +39 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/button.js +72 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/button/index.d.ts +5 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/tooltip.d.ts +31 -0
- package/dist/components/button/tooltip.d.ts.map +1 -0
- package/dist/components/button/tooltip.js +83 -0
- package/dist/components/button/tooltip.js.map +1 -0
- package/dist/components/changelog/changelog.d.ts +52 -0
- package/dist/components/changelog/changelog.d.ts.map +1 -0
- package/dist/components/changelog/changelog.js +164 -0
- package/dist/components/changelog/changelog.js.map +1 -0
- package/dist/components/changelog/index.d.ts +3 -0
- package/dist/components/changelog/index.d.ts.map +1 -0
- package/dist/components/copy-button/copy-button.d.ts +16 -0
- package/dist/components/copy-button/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button/copy-button.js +40 -0
- package/dist/components/copy-button/copy-button.js.map +1 -0
- package/dist/components/copy-button/index.d.ts +3 -0
- package/dist/components/copy-button/index.d.ts.map +1 -0
- package/dist/components/drop-zone/drop-zone.d.ts +20 -0
- package/dist/components/drop-zone/drop-zone.d.ts.map +1 -0
- package/dist/components/drop-zone/drop-zone.js +54 -0
- package/dist/components/drop-zone/drop-zone.js.map +1 -0
- package/dist/components/drop-zone/index.d.ts +5 -0
- package/dist/components/drop-zone/index.d.ts.map +1 -0
- package/dist/components/drop-zone/use-file-drop.d.ts +45 -0
- package/dist/components/drop-zone/use-file-drop.d.ts.map +1 -0
- package/dist/components/drop-zone/use-file-drop.js +97 -0
- package/dist/components/drop-zone/use-file-drop.js.map +1 -0
- package/dist/components/element-picker/element-picker-field.d.ts +30 -0
- package/dist/components/element-picker/element-picker-field.d.ts.map +1 -0
- package/dist/components/element-picker/element-picker-field.js +273 -0
- package/dist/components/element-picker/element-picker-field.js.map +1 -0
- package/dist/components/element-picker/element-picker.d.ts +45 -0
- package/dist/components/element-picker/element-picker.d.ts.map +1 -0
- package/dist/components/element-picker/element-picker.js +179 -0
- package/dist/components/element-picker/element-picker.js.map +1 -0
- package/dist/components/element-picker/element-preview.d.ts +23 -0
- package/dist/components/element-picker/element-preview.d.ts.map +1 -0
- package/dist/components/element-picker/element-preview.js +72 -0
- package/dist/components/element-picker/element-preview.js.map +1 -0
- package/dist/components/element-picker/index.d.ts +12 -0
- package/dist/components/element-picker/index.d.ts.map +1 -0
- package/dist/components/element-picker/parse.d.ts +32 -0
- package/dist/components/element-picker/parse.d.ts.map +1 -0
- package/dist/components/element-picker/parse.js +230 -0
- package/dist/components/element-picker/parse.js.map +1 -0
- package/dist/components/element-picker/types.d.ts +72 -0
- package/dist/components/element-picker/types.d.ts.map +1 -0
- package/dist/components/element-picker/use-element-picker.d.ts +56 -0
- package/dist/components/element-picker/use-element-picker.d.ts.map +1 -0
- package/dist/components/element-picker/use-element-picker.js +201 -0
- package/dist/components/element-picker/use-element-picker.js.map +1 -0
- package/dist/components/empty-state/empty-state.d.ts +16 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.js +41 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/index.d.ts +3 -0
- package/dist/components/empty-state/index.d.ts.map +1 -0
- package/dist/components/floating-panel/dock-context.d.ts +66 -0
- package/dist/components/floating-panel/dock-context.d.ts.map +1 -0
- package/dist/components/floating-panel/dock-context.js +96 -0
- package/dist/components/floating-panel/dock-context.js.map +1 -0
- package/dist/components/floating-panel/dock.d.ts +26 -0
- package/dist/components/floating-panel/dock.d.ts.map +1 -0
- package/dist/components/floating-panel/dock.js +46 -0
- package/dist/components/floating-panel/dock.js.map +1 -0
- package/dist/components/floating-panel/floating-panel.d.ts +69 -0
- package/dist/components/floating-panel/floating-panel.d.ts.map +1 -0
- package/dist/components/floating-panel/floating-panel.js +285 -0
- package/dist/components/floating-panel/floating-panel.js.map +1 -0
- package/dist/components/floating-panel/index.d.ts +7 -0
- package/dist/components/floating-panel/index.d.ts.map +1 -0
- package/dist/components/fuzzy-list/fuzzy-list.d.ts +96 -0
- package/dist/components/fuzzy-list/fuzzy-list.d.ts.map +1 -0
- package/dist/components/fuzzy-list/fuzzy-list.js +127 -0
- package/dist/components/fuzzy-list/fuzzy-list.js.map +1 -0
- package/dist/components/fuzzy-list/index.d.ts +4 -0
- package/dist/components/fuzzy-list/index.d.ts.map +1 -0
- package/dist/components/global-search/global-search.d.ts +78 -0
- package/dist/components/global-search/global-search.d.ts.map +1 -0
- package/dist/components/global-search/global-search.js +181 -0
- package/dist/components/global-search/global-search.js.map +1 -0
- package/dist/components/global-search/hotkey.d.ts +23 -0
- package/dist/components/global-search/hotkey.d.ts.map +1 -0
- package/dist/components/global-search/hotkey.js +41 -0
- package/dist/components/global-search/hotkey.js.map +1 -0
- package/dist/components/global-search/index.d.ts +5 -0
- package/dist/components/global-search/index.d.ts.map +1 -0
- package/dist/components/iframe-preview/iframe-preview.d.ts +64 -0
- package/dist/components/iframe-preview/iframe-preview.d.ts.map +1 -0
- package/dist/components/iframe-preview/iframe-preview.js +257 -0
- package/dist/components/iframe-preview/iframe-preview.js.map +1 -0
- package/dist/components/iframe-preview/index.d.ts +3 -0
- package/dist/components/iframe-preview/index.d.ts.map +1 -0
- package/dist/components/image-viewer/image-viewer.d.ts +30 -0
- package/dist/components/image-viewer/image-viewer.d.ts.map +1 -0
- package/dist/components/image-viewer/image-viewer.js +226 -0
- package/dist/components/image-viewer/image-viewer.js.map +1 -0
- package/dist/components/image-viewer/index.d.ts +4 -0
- package/dist/components/image-viewer/index.d.ts.map +1 -0
- package/dist/components/image-viewer/progressive-image.d.ts +20 -0
- package/dist/components/image-viewer/progressive-image.d.ts.map +1 -0
- package/dist/components/image-viewer/progressive-image.js +62 -0
- package/dist/components/image-viewer/progressive-image.js.map +1 -0
- package/dist/components/image-viewer/viewable-image.d.ts +17 -0
- package/dist/components/image-viewer/viewable-image.d.ts.map +1 -0
- package/dist/components/image-viewer/viewable-image.js +38 -0
- package/dist/components/image-viewer/viewable-image.js.map +1 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/input.d.ts +15 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/input/input.js +56 -0
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/modal/index.d.ts +5 -0
- package/dist/components/modal/index.d.ts.map +1 -0
- package/dist/components/modal/modal-context.d.ts +37 -0
- package/dist/components/modal/modal-context.d.ts.map +1 -0
- package/dist/components/modal/modal-context.js +81 -0
- package/dist/components/modal/modal-context.js.map +1 -0
- package/dist/components/modal/modal.d.ts +28 -0
- package/dist/components/modal/modal.d.ts.map +1 -0
- package/dist/components/modal/modal.js +94 -0
- package/dist/components/modal/modal.js.map +1 -0
- package/dist/components/nav-2d/index.d.ts +3 -0
- package/dist/components/nav-2d/index.d.ts.map +1 -0
- package/dist/components/nav-2d/nav-2d.d.ts +59 -0
- package/dist/components/nav-2d/nav-2d.d.ts.map +1 -0
- package/dist/components/nav-2d/nav-2d.js +290 -0
- package/dist/components/nav-2d/nav-2d.js.map +1 -0
- package/dist/components/phone-preview/index.d.ts +3 -0
- package/dist/components/phone-preview/index.d.ts.map +1 -0
- package/dist/components/phone-preview/phone-preview.d.ts +45 -0
- package/dist/components/phone-preview/phone-preview.d.ts.map +1 -0
- package/dist/components/phone-preview/phone-preview.js +117 -0
- package/dist/components/phone-preview/phone-preview.js.map +1 -0
- package/dist/components/progressive-bash/index.d.ts +7 -0
- package/dist/components/progressive-bash/index.d.ts.map +1 -0
- package/dist/components/progressive-bash/parse.d.ts +88 -0
- package/dist/components/progressive-bash/parse.d.ts.map +1 -0
- package/dist/components/progressive-bash/parse.js +120 -0
- package/dist/components/progressive-bash/parse.js.map +1 -0
- package/dist/components/progressive-bash/playback.d.ts +50 -0
- package/dist/components/progressive-bash/playback.d.ts.map +1 -0
- package/dist/components/progressive-bash/playback.js +19 -0
- package/dist/components/progressive-bash/playback.js.map +1 -0
- package/dist/components/progressive-bash/progressive-bash.d.ts +97 -0
- package/dist/components/progressive-bash/progressive-bash.d.ts.map +1 -0
- package/dist/components/progressive-bash/progressive-bash.js +377 -0
- package/dist/components/progressive-bash/progressive-bash.js.map +1 -0
- package/dist/components/progressive-list/index.d.ts +3 -0
- package/dist/components/progressive-list/index.d.ts.map +1 -0
- package/dist/components/progressive-list/progressive-list.d.ts +55 -0
- package/dist/components/progressive-list/progressive-list.d.ts.map +1 -0
- package/dist/components/progressive-list/progressive-list.js +83 -0
- package/dist/components/progressive-list/progressive-list.js.map +1 -0
- package/dist/components/progressive-table/index.d.ts +3 -0
- package/dist/components/progressive-table/index.d.ts.map +1 -0
- package/dist/components/progressive-table/progressive-table.d.ts +58 -0
- package/dist/components/progressive-table/progressive-table.d.ts.map +1 -0
- package/dist/components/progressive-table/progressive-table.js +86 -0
- package/dist/components/progressive-table/progressive-table.js.map +1 -0
- package/dist/components/progressive-text/index.d.ts +3 -0
- package/dist/components/progressive-text/index.d.ts.map +1 -0
- package/dist/components/progressive-text/progressive-text.d.ts +54 -0
- package/dist/components/progressive-text/progressive-text.d.ts.map +1 -0
- package/dist/components/progressive-text/progressive-text.js +97 -0
- package/dist/components/progressive-text/progressive-text.js.map +1 -0
- package/dist/components/progressive-timeline/index.d.ts +3 -0
- package/dist/components/progressive-timeline/index.d.ts.map +1 -0
- package/dist/components/progressive-timeline/progressive-timeline.d.ts +46 -0
- package/dist/components/progressive-timeline/progressive-timeline.d.ts.map +1 -0
- package/dist/components/progressive-timeline/progressive-timeline.js +62 -0
- package/dist/components/progressive-timeline/progressive-timeline.js.map +1 -0
- package/dist/components/relative-time/index.d.ts +3 -0
- package/dist/components/relative-time/index.d.ts.map +1 -0
- package/dist/components/relative-time/relative-time.d.ts +14 -0
- package/dist/components/relative-time/relative-time.d.ts.map +1 -0
- package/dist/components/relative-time/relative-time.js +15 -0
- package/dist/components/relative-time/relative-time.js.map +1 -0
- package/dist/components/resizable-layout/index.d.ts +3 -0
- package/dist/components/resizable-layout/index.d.ts.map +1 -0
- package/dist/components/resizable-layout/resizable-layout.d.ts +113 -0
- package/dist/components/resizable-layout/resizable-layout.d.ts.map +1 -0
- package/dist/components/resizable-layout/resizable-layout.js +398 -0
- package/dist/components/resizable-layout/resizable-layout.js.map +1 -0
- package/dist/components/rich-input/compose.d.ts +13 -0
- package/dist/components/rich-input/compose.d.ts.map +1 -0
- package/dist/components/rich-input/compose.js +28 -0
- package/dist/components/rich-input/compose.js.map +1 -0
- package/dist/components/rich-input/index.d.ts +5 -0
- package/dist/components/rich-input/index.d.ts.map +1 -0
- package/dist/components/rich-input/parts.d.ts +53 -0
- package/dist/components/rich-input/parts.d.ts.map +1 -0
- package/dist/components/rich-input/parts.js +285 -0
- package/dist/components/rich-input/parts.js.map +1 -0
- package/dist/components/rich-input/rich-input.d.ts +64 -0
- package/dist/components/rich-input/rich-input.d.ts.map +1 -0
- package/dist/components/rich-input/rich-input.js +351 -0
- package/dist/components/rich-input/rich-input.js.map +1 -0
- package/dist/components/rich-input/types.d.ts +92 -0
- package/dist/components/rich-input/types.d.ts.map +1 -0
- package/dist/components/rich-input/use-draft.d.ts +9 -0
- package/dist/components/rich-input/use-draft.d.ts.map +1 -0
- package/dist/components/rich-input/use-draft.js +47 -0
- package/dist/components/rich-input/use-draft.js.map +1 -0
- package/dist/components/rich-input/use-file-upload.d.ts +18 -0
- package/dist/components/rich-input/use-file-upload.d.ts.map +1 -0
- package/dist/components/rich-input/use-file-upload.js +88 -0
- package/dist/components/rich-input/use-file-upload.js.map +1 -0
- package/dist/components/rich-input/use-guidelines.d.ts +16 -0
- package/dist/components/rich-input/use-guidelines.d.ts.map +1 -0
- package/dist/components/rich-input/use-guidelines.js +85 -0
- package/dist/components/rich-input/use-guidelines.js.map +1 -0
- package/dist/components/rich-input/use-input-history.d.ts +22 -0
- package/dist/components/rich-input/use-input-history.d.ts.map +1 -0
- package/dist/components/rich-input/use-input-history.js +61 -0
- package/dist/components/rich-input/use-input-history.js.map +1 -0
- package/dist/components/rich-input/use-mention.d.ts +24 -0
- package/dist/components/rich-input/use-mention.d.ts.map +1 -0
- package/dist/components/rich-input/use-mention.js +54 -0
- package/dist/components/rich-input/use-mention.js.map +1 -0
- package/dist/components/search-input/index.d.ts +3 -0
- package/dist/components/search-input/index.d.ts.map +1 -0
- package/dist/components/search-input/search-input.d.ts +14 -0
- package/dist/components/search-input/search-input.d.ts.map +1 -0
- package/dist/components/search-input/search-input.js +63 -0
- package/dist/components/search-input/search-input.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.d.ts +19 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +29 -0
- package/dist/components/skeleton/skeleton.js.map +1 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/spinner/index.d.ts.map +1 -0
- package/dist/components/spinner/spinner.d.ts +11 -0
- package/dist/components/spinner/spinner.d.ts.map +1 -0
- package/dist/components/spinner/spinner.js +32 -0
- package/dist/components/spinner/spinner.js.map +1 -0
- package/dist/components/status-badge/index.d.ts +3 -0
- package/dist/components/status-badge/index.d.ts.map +1 -0
- package/dist/components/status-badge/status-badge.d.ts +31 -0
- package/dist/components/status-badge/status-badge.d.ts.map +1 -0
- package/dist/components/status-badge/status-badge.js +53 -0
- package/dist/components/status-badge/status-badge.js.map +1 -0
- package/dist/components/theme/index.d.ts +5 -0
- package/dist/components/theme/index.d.ts.map +1 -0
- package/dist/components/theme/theme-toggle.d.ts +11 -0
- package/dist/components/theme/theme-toggle.d.ts.map +1 -0
- package/dist/components/theme/theme-toggle.js +57 -0
- package/dist/components/theme/theme-toggle.js.map +1 -0
- package/dist/components/theme/theme.d.ts +29 -0
- package/dist/components/theme/theme.d.ts.map +1 -0
- package/dist/components/theme/theme.js +70 -0
- package/dist/components/theme/theme.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/toast.d.ts +64 -0
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +155 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/virtual-list/index.d.ts +3 -0
- package/dist/components/virtual-list/index.d.ts.map +1 -0
- package/dist/components/virtual-list/virtual-list.d.ts +71 -0
- package/dist/components/virtual-list/virtual-list.d.ts.map +1 -0
- package/dist/components/virtual-list/virtual-list.js +65 -0
- package/dist/components/virtual-list/virtual-list.js.map +1 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts +26 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.js +36 -0
- package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
- package/dist/hooks/use-debounced-value.d.ts +23 -0
- package/dist/hooks/use-debounced-value.d.ts.map +1 -0
- package/dist/hooks/use-debounced-value.js +19 -0
- package/dist/hooks/use-debounced-value.js.map +1 -0
- package/dist/hooks/use-intersection.d.ts +25 -0
- package/dist/hooks/use-intersection.d.ts.map +1 -0
- package/dist/hooks/use-intersection.js +38 -0
- package/dist/hooks/use-intersection.js.map +1 -0
- package/dist/hooks/use-local-storage.d.ts +12 -0
- package/dist/hooks/use-local-storage.d.ts.map +1 -0
- package/dist/hooks/use-local-storage.js +43 -0
- package/dist/hooks/use-local-storage.js.map +1 -0
- package/dist/hooks/use-long-press.d.ts +37 -0
- package/dist/hooks/use-long-press.d.ts.map +1 -0
- package/dist/hooks/use-long-press.js +39 -0
- package/dist/hooks/use-long-press.js.map +1 -0
- package/dist/hooks/use-media-query.d.ts +17 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +37 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-overlay.d.ts +20 -0
- package/dist/hooks/use-overlay.d.ts.map +1 -0
- package/dist/hooks/use-overlay.js +42 -0
- package/dist/hooks/use-overlay.js.map +1 -0
- package/dist/image-viewer.css +152 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +62 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/highlight.d.ts +15 -0
- package/dist/lib/highlight.d.ts.map +1 -0
- package/dist/lib/highlight.js +39 -0
- package/dist/lib/highlight.js.map +1 -0
- package/dist/lib/search.d.ts +40 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +91 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay.css +78 -0
- package/dist/styles.css +6 -0
- package/dist/theme.css +81 -0
- package/dist/tooltip.css +53 -0
- package/dist/virtual-list.css +29 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-media-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-media-query.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,UAAU,SAAM,GAAG,OAAO,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as o from "react";
|
|
2
|
+
function r(e) {
|
|
3
|
+
const s = o.useCallback(
|
|
4
|
+
(n) => {
|
|
5
|
+
if (typeof window > "u") return () => {
|
|
6
|
+
};
|
|
7
|
+
const t = window.matchMedia(e);
|
|
8
|
+
return t.addEventListener("change", n), () => t.removeEventListener("change", n);
|
|
9
|
+
},
|
|
10
|
+
[e]
|
|
11
|
+
);
|
|
12
|
+
return o.useSyncExternalStore(
|
|
13
|
+
s,
|
|
14
|
+
() => typeof window > "u" ? !1 : window.matchMedia(e).matches,
|
|
15
|
+
() => !1
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function u(e = 768) {
|
|
19
|
+
return r(`(max-width: ${e - 1}px)`);
|
|
20
|
+
}
|
|
21
|
+
function i() {
|
|
22
|
+
return r("(pointer: coarse)");
|
|
23
|
+
}
|
|
24
|
+
function c() {
|
|
25
|
+
return r("(prefers-color-scheme: dark)");
|
|
26
|
+
}
|
|
27
|
+
function d() {
|
|
28
|
+
return r("(prefers-reduced-motion: reduce)");
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
u as useIsMobile,
|
|
32
|
+
i as useIsTouch,
|
|
33
|
+
r as useMediaQuery,
|
|
34
|
+
c as usePrefersDark,
|
|
35
|
+
d as usePrefersReducedMotion
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=use-media-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-media-query.js","sources":["../../src/hooks/use-media-query.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Subscribe to a CSS media query.\n *\n * SSR-safe (`false` on the server, resolved on hydration) and driven by\n * `useSyncExternalStore`, so several components watching the same query share\n * one listener and never tear.\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = React.useCallback(\n (onChange: () => void) => {\n if (typeof window === 'undefined') return () => {};\n const mql = window.matchMedia(query);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n },\n [query],\n );\n\n return React.useSyncExternalStore(\n subscribe,\n () => (typeof window === 'undefined' ? false : window.matchMedia(query).matches),\n () => false,\n );\n}\n\n/** True below the `md` breakpoint (768px) — the phone/desktop split. */\nexport function useIsMobile(breakpoint = 768): boolean {\n return useMediaQuery(`(max-width: ${breakpoint - 1}px)`);\n}\n\n/** True on a coarse pointer (finger) — use for tap targets, not for width. */\nexport function useIsTouch(): boolean {\n return useMediaQuery('(pointer: coarse)');\n}\n\n/** The OS colour-scheme preference. See `useTheme` for the resolved theme. */\nexport function usePrefersDark(): boolean {\n return useMediaQuery('(prefers-color-scheme: dark)');\n}\n\n/** True when the user asked for less motion — gate animations on it. */\nexport function usePrefersReducedMotion(): boolean {\n return useMediaQuery('(prefers-reduced-motion: reduce)');\n}\n"],"names":["useMediaQuery","query","subscribe","React","onChange","mql","useIsMobile","breakpoint","useIsTouch","usePrefersDark","usePrefersReducedMotion"],"mappings":";AASO,SAASA,EAAcC,GAAwB;AACpD,QAAMC,IAAYC,EAAM;AAAA,IACtB,CAACC,MAAyB;AACxB,UAAI,OAAO,SAAW,IAAa,QAAO,MAAM;AAAA,MAAC;AACjD,YAAMC,IAAM,OAAO,WAAWJ,CAAK;AACnC,aAAAI,EAAI,iBAAiB,UAAUD,CAAQ,GAChC,MAAMC,EAAI,oBAAoB,UAAUD,CAAQ;AAAA,IACzD;AAAA,IACA,CAACH,CAAK;AAAA,EAAA;AAGR,SAAOE,EAAM;AAAA,IACXD;AAAA,IACA,MAAO,OAAO,SAAW,MAAc,KAAQ,OAAO,WAAWD,CAAK,EAAE;AAAA,IACxE,MAAM;AAAA,EAAA;AAEV;AAGO,SAASK,EAAYC,IAAa,KAAc;AACrD,SAAOP,EAAc,eAAeO,IAAa,CAAC,KAAK;AACzD;AAGO,SAASC,IAAsB;AACpC,SAAOR,EAAc,mBAAmB;AAC1C;AAGO,SAASS,IAA0B;AACxC,SAAOT,EAAc,8BAA8B;AACrD;AAGO,SAASU,IAAmC;AACjD,SAAOV,EAAc,kCAAkC;AACzD;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Lock body scroll while `active`.
|
|
4
|
+
*
|
|
5
|
+
* Reference-counted, so nesting a modal inside a viewer (or opening two at
|
|
6
|
+
* once) doesn't unlock the page when only the inner one closes. Compensates for
|
|
7
|
+
* the scrollbar width so the page doesn't jump on lock.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useScrollLock(active?: boolean): void;
|
|
10
|
+
/** Call `onEscape` when Escape is pressed (while `active`). */
|
|
11
|
+
export declare function useEscape(onEscape: () => void, active?: boolean): void;
|
|
12
|
+
/**
|
|
13
|
+
* Close when a click (or focus) lands outside the referenced element.
|
|
14
|
+
*
|
|
15
|
+
* Listens on `pointerdown` so the menu closes before the click resolves — the
|
|
16
|
+
* behaviour every hand-rolled popover forgets, which is why a click on a link
|
|
17
|
+
* behind an open dropdown otherwise gets eaten.
|
|
18
|
+
*/
|
|
19
|
+
export declare function useOutsideClick<T extends HTMLElement = HTMLElement>(onOutside: () => void, active?: boolean): React.RefObject<T | null>;
|
|
20
|
+
//# sourceMappingURL=use-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-overlay.d.ts","sourceRoot":"","sources":["../../src/hooks/use-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,UAAO,QAsB1C;AAKD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,MAAM,UAAO,QAY5D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EACjE,SAAS,EAAE,MAAM,IAAI,EACrB,MAAM,UAAO,6BAiBd"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as o from "react";
|
|
2
|
+
function f(t = !0) {
|
|
3
|
+
o.useEffect(() => {
|
|
4
|
+
if (!t || typeof document > "u") return;
|
|
5
|
+
const e = document.body;
|
|
6
|
+
if (d === 0) {
|
|
7
|
+
const n = window.innerWidth - document.documentElement.clientWidth;
|
|
8
|
+
u = { overflow: e.style.overflow, paddingRight: e.style.paddingRight }, e.style.overflow = "hidden", n > 0 && (e.style.paddingRight = `${n}px`);
|
|
9
|
+
}
|
|
10
|
+
return d += 1, () => {
|
|
11
|
+
d -= 1, d === 0 && u && (e.style.overflow = u.overflow, e.style.paddingRight = u.paddingRight, u = null);
|
|
12
|
+
};
|
|
13
|
+
}, [t]);
|
|
14
|
+
}
|
|
15
|
+
let d = 0, u = null;
|
|
16
|
+
function l(t, e = !0) {
|
|
17
|
+
const n = o.useRef(t);
|
|
18
|
+
n.current = t, o.useEffect(() => {
|
|
19
|
+
if (!e) return;
|
|
20
|
+
const r = (i) => {
|
|
21
|
+
i.key === "Escape" && n.current();
|
|
22
|
+
};
|
|
23
|
+
return window.addEventListener("keydown", r), () => window.removeEventListener("keydown", r);
|
|
24
|
+
}, [e]);
|
|
25
|
+
}
|
|
26
|
+
function w(t, e = !0) {
|
|
27
|
+
const n = o.useRef(null), r = o.useRef(t);
|
|
28
|
+
return r.current = t, o.useEffect(() => {
|
|
29
|
+
if (!e) return;
|
|
30
|
+
const i = (s) => {
|
|
31
|
+
const c = n.current;
|
|
32
|
+
c && !c.contains(s.target) && r.current();
|
|
33
|
+
};
|
|
34
|
+
return document.addEventListener("pointerdown", i, !0), () => document.removeEventListener("pointerdown", i, !0);
|
|
35
|
+
}, [e]), n;
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
l as useEscape,
|
|
39
|
+
w as useOutsideClick,
|
|
40
|
+
f as useScrollLock
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=use-overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-overlay.js","sources":["../../src/hooks/use-overlay.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Lock body scroll while `active`.\n *\n * Reference-counted, so nesting a modal inside a viewer (or opening two at\n * once) doesn't unlock the page when only the inner one closes. Compensates for\n * the scrollbar width so the page doesn't jump on lock.\n */\nexport function useScrollLock(active = true) {\n React.useEffect(() => {\n if (!active || typeof document === 'undefined') return;\n const body = document.body;\n\n if (locks === 0) {\n const gap = window.innerWidth - document.documentElement.clientWidth;\n previous = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };\n body.style.overflow = 'hidden';\n if (gap > 0) body.style.paddingRight = `${gap}px`;\n }\n locks += 1;\n\n return () => {\n locks -= 1;\n if (locks === 0 && previous) {\n body.style.overflow = previous.overflow;\n body.style.paddingRight = previous.paddingRight;\n previous = null;\n }\n };\n }, [active]);\n}\n\nlet locks = 0;\nlet previous: { overflow: string; paddingRight: string } | null = null;\n\n/** Call `onEscape` when Escape is pressed (while `active`). */\nexport function useEscape(onEscape: () => void, active = true) {\n const cb = React.useRef(onEscape);\n cb.current = onEscape;\n\n React.useEffect(() => {\n if (!active) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') cb.current();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [active]);\n}\n\n/**\n * Close when a click (or focus) lands outside the referenced element.\n *\n * Listens on `pointerdown` so the menu closes before the click resolves — the\n * behaviour every hand-rolled popover forgets, which is why a click on a link\n * behind an open dropdown otherwise gets eaten.\n */\nexport function useOutsideClick<T extends HTMLElement = HTMLElement>(\n onOutside: () => void,\n active = true,\n) {\n const ref = React.useRef<T | null>(null);\n const cb = React.useRef(onOutside);\n cb.current = onOutside;\n\n React.useEffect(() => {\n if (!active) return;\n const onDown = (e: PointerEvent) => {\n const el = ref.current;\n if (el && !el.contains(e.target as globalThis.Node)) cb.current();\n };\n document.addEventListener('pointerdown', onDown, true);\n return () => document.removeEventListener('pointerdown', onDown, true);\n }, [active]);\n\n return ref;\n}\n"],"names":["useScrollLock","active","React","body","locks","gap","previous","useEscape","onEscape","cb","onKey","e","useOutsideClick","onOutside","ref","onDown","el"],"mappings":";AASO,SAASA,EAAcC,IAAS,IAAM;AAC3C,EAAAC,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,KAAU,OAAO,WAAa,IAAa;AAChD,UAAME,IAAO,SAAS;AAEtB,QAAIC,MAAU,GAAG;AACf,YAAMC,IAAM,OAAO,aAAa,SAAS,gBAAgB;AACzD,MAAAC,IAAW,EAAE,UAAUH,EAAK,MAAM,UAAU,cAAcA,EAAK,MAAM,aAAA,GACrEA,EAAK,MAAM,WAAW,UAClBE,IAAM,MAAGF,EAAK,MAAM,eAAe,GAAGE,CAAG;AAAA,IAC/C;AACA,WAAAD,KAAS,GAEF,MAAM;AACX,MAAAA,KAAS,GACLA,MAAU,KAAKE,MACjBH,EAAK,MAAM,WAAWG,EAAS,UAC/BH,EAAK,MAAM,eAAeG,EAAS,cACnCA,IAAW;AAAA,IAEf;AAAA,EACF,GAAG,CAACL,CAAM,CAAC;AACb;AAEA,IAAIG,IAAQ,GACRE,IAA8D;AAG3D,SAASC,EAAUC,GAAsBP,IAAS,IAAM;AAC7D,QAAMQ,IAAKP,EAAM,OAAOM,CAAQ;AAChC,EAAAC,EAAG,UAAUD,GAEbN,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,EAAQ;AACb,UAAMS,IAAQ,CAACC,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAUF,EAAG,QAAA;AAAA,IAC7B;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAACT,CAAM,CAAC;AACb;AASO,SAASW,EACdC,GACAZ,IAAS,IACT;AACA,QAAMa,IAAMZ,EAAM,OAAiB,IAAI,GACjCO,IAAKP,EAAM,OAAOW,CAAS;AACjC,SAAAJ,EAAG,UAAUI,GAEbX,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,EAAQ;AACb,UAAMc,IAAS,CAACJ,MAAoB;AAClC,YAAMK,IAAKF,EAAI;AACf,MAAIE,KAAM,CAACA,EAAG,SAASL,EAAE,MAAyB,OAAM,QAAA;AAAA,IAC1D;AACA,oBAAS,iBAAiB,eAAeI,GAAQ,EAAI,GAC9C,MAAM,SAAS,oBAAoB,eAAeA,GAAQ,EAAI;AAAA,EACvE,GAAG,CAACd,CAAM,CAAC,GAEJa;AACT;"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Styling for <ImageViewerProvider> / <ViewableImage>.
|
|
3
|
+
*
|
|
4
|
+
* Plain CSS — no Tailwind directives — so it works whether or not the consumer
|
|
5
|
+
* uses Tailwind. Every visual choice reads from a `--ds-viewer-*` custom
|
|
6
|
+
* property with a sensible fallback, so you can retheme the overlay without
|
|
7
|
+
* overriding selectors. Defaults assume a dark, glassy overlay.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
--ds-viewer-backdrop: rgba(9, 9, 11, 0.96);
|
|
12
|
+
--ds-viewer-fg: #f4f4f5;
|
|
13
|
+
--ds-viewer-muted: #d4d4d8;
|
|
14
|
+
--ds-viewer-ctl-bg: rgba(24, 24, 27, 0.55);
|
|
15
|
+
--ds-viewer-ctl-bg-hover: rgba(63, 63, 70, 0.7);
|
|
16
|
+
--ds-viewer-ctl-border: rgba(255, 255, 255, 0.14);
|
|
17
|
+
--ds-viewer-accent: rgba(255, 255, 255, 0.4);
|
|
18
|
+
--ds-viewer-blur: 6px;
|
|
19
|
+
--ds-viewer-z: 200;
|
|
20
|
+
--ds-viewer-font-mono: ui-monospace, "SFMono-Regular", "JetBrains Mono", "Space Mono", monospace;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.viewable-image {
|
|
24
|
+
display: block;
|
|
25
|
+
height: 100%;
|
|
26
|
+
width: 100%;
|
|
27
|
+
padding: 0;
|
|
28
|
+
border: none;
|
|
29
|
+
background: transparent;
|
|
30
|
+
cursor: zoom-in;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@keyframes ds-viewer-in {
|
|
34
|
+
from { opacity: 0; }
|
|
35
|
+
to { opacity: 1; }
|
|
36
|
+
}
|
|
37
|
+
@keyframes ds-viewer-img-in {
|
|
38
|
+
from { opacity: 0; }
|
|
39
|
+
to { opacity: 1; }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.viewer-overlay {
|
|
43
|
+
position: fixed;
|
|
44
|
+
inset: 0;
|
|
45
|
+
z-index: var(--ds-viewer-z);
|
|
46
|
+
background: var(--ds-viewer-backdrop);
|
|
47
|
+
backdrop-filter: blur(var(--ds-viewer-blur));
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
/* No fill-mode: once the intro ends the animation must release `opacity` so the
|
|
50
|
+
drag-to-dismiss handler can fade the backdrop via inline style. */
|
|
51
|
+
animation: ds-viewer-in 0.18s ease;
|
|
52
|
+
transition: opacity 0.2s ease;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.viewer-stage {
|
|
56
|
+
position: absolute;
|
|
57
|
+
inset: 0;
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
justify-content: center;
|
|
61
|
+
touch-action: none;
|
|
62
|
+
user-select: none;
|
|
63
|
+
cursor: zoom-in;
|
|
64
|
+
}
|
|
65
|
+
.viewer-stage.is-zoomed { cursor: grab; }
|
|
66
|
+
.viewer-stage.is-zoomed:active { cursor: grabbing; }
|
|
67
|
+
|
|
68
|
+
.viewer-img {
|
|
69
|
+
max-width: 100%;
|
|
70
|
+
max-height: 100%;
|
|
71
|
+
object-fit: contain;
|
|
72
|
+
transform-origin: center center;
|
|
73
|
+
will-change: transform;
|
|
74
|
+
-webkit-user-drag: none;
|
|
75
|
+
animation: ds-viewer-img-in 0.2s ease both;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.viewer-ctl {
|
|
79
|
+
position: absolute;
|
|
80
|
+
z-index: calc(var(--ds-viewer-z) + 10);
|
|
81
|
+
display: inline-flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
justify-content: center;
|
|
84
|
+
color: var(--ds-viewer-fg);
|
|
85
|
+
background: var(--ds-viewer-ctl-bg);
|
|
86
|
+
border: 1px solid var(--ds-viewer-ctl-border);
|
|
87
|
+
border-radius: 999px;
|
|
88
|
+
backdrop-filter: blur(8px);
|
|
89
|
+
cursor: pointer;
|
|
90
|
+
transition: background 0.2s, color 0.2s, border-color 0.2s;
|
|
91
|
+
}
|
|
92
|
+
.viewer-ctl:hover {
|
|
93
|
+
background: var(--ds-viewer-ctl-bg-hover);
|
|
94
|
+
color: #fff;
|
|
95
|
+
border-color: var(--ds-viewer-accent);
|
|
96
|
+
}
|
|
97
|
+
.viewer-ctl:focus-visible {
|
|
98
|
+
outline: 2px solid var(--ds-viewer-fg);
|
|
99
|
+
outline-offset: 2px;
|
|
100
|
+
}
|
|
101
|
+
.viewer-ctl svg { width: 1.35rem; height: 1.35rem; }
|
|
102
|
+
|
|
103
|
+
.viewer-close { top: 1rem; right: 1rem; width: 2.75rem; height: 2.75rem; }
|
|
104
|
+
|
|
105
|
+
.viewer-nav {
|
|
106
|
+
top: 50%;
|
|
107
|
+
transform: translateY(-50%);
|
|
108
|
+
width: 3rem;
|
|
109
|
+
height: 3rem;
|
|
110
|
+
}
|
|
111
|
+
.viewer-nav--prev { left: 1rem; }
|
|
112
|
+
.viewer-nav--next { right: 1rem; }
|
|
113
|
+
|
|
114
|
+
.viewer-zoom {
|
|
115
|
+
position: absolute;
|
|
116
|
+
z-index: calc(var(--ds-viewer-z) + 10);
|
|
117
|
+
bottom: 1.1rem;
|
|
118
|
+
left: 50%;
|
|
119
|
+
transform: translateX(-50%);
|
|
120
|
+
display: flex;
|
|
121
|
+
gap: 0.6rem;
|
|
122
|
+
}
|
|
123
|
+
.viewer-zoom .viewer-ctl { position: static; width: 2.6rem; height: 2.6rem; }
|
|
124
|
+
|
|
125
|
+
.viewer-counter {
|
|
126
|
+
position: absolute;
|
|
127
|
+
z-index: calc(var(--ds-viewer-z) + 10);
|
|
128
|
+
top: 1.15rem;
|
|
129
|
+
left: 50%;
|
|
130
|
+
transform: translateX(-50%);
|
|
131
|
+
padding: 0.3rem 0.8rem;
|
|
132
|
+
font-family: var(--ds-viewer-font-mono);
|
|
133
|
+
font-size: 0.62rem;
|
|
134
|
+
letter-spacing: 0.25em;
|
|
135
|
+
color: var(--ds-viewer-muted);
|
|
136
|
+
background: var(--ds-viewer-ctl-bg);
|
|
137
|
+
border: 1px solid var(--ds-viewer-ctl-border);
|
|
138
|
+
border-radius: 999px;
|
|
139
|
+
backdrop-filter: blur(8px);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@media (max-width: 640px) {
|
|
143
|
+
.viewer-nav { width: 2.5rem; height: 2.5rem; }
|
|
144
|
+
.viewer-nav--prev { left: 0.5rem; }
|
|
145
|
+
.viewer-nav--next { right: 0.5rem; }
|
|
146
|
+
.viewer-ctl svg { width: 1.15rem; height: 1.15rem; }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@media (prefers-reduced-motion: reduce) {
|
|
150
|
+
.viewer-overlay,
|
|
151
|
+
.viewer-img { animation: none; }
|
|
152
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export { cn } from './lib/utils';
|
|
2
|
+
export { downloadFile, fmtBytes, fmtCost, fmtDateTime, fmtDuration, fmtNum, relTime, } from './lib/format';
|
|
3
|
+
export type { TimeInput } from './lib/format';
|
|
4
|
+
export { useCopyToClipboard, useDebouncedValue, useEscape, useInfiniteScroll, useIntersection, useIsMobile, useIsTouch, useLocalStorage, useLongPress, useMediaQuery, useOutsideClick, usePrefersDark, usePrefersReducedMotion, useScrollLock, } from './hooks';
|
|
5
|
+
export type { LongPressPoint, UseCopyOptions, UseDebouncedValueOptions, UseInfiniteScrollOptions, UseLongPressOptions, } from './hooks';
|
|
6
|
+
export { ToastProvider, Toaster, useToast } from './components/toast';
|
|
7
|
+
export type { Toast, ToastAction, ToastFn, ToastOptions, ToastPosition, ToastType } from './components/toast';
|
|
8
|
+
export { Modal, ModalProvider, useConfirm, useModal } from './components/modal';
|
|
9
|
+
export type { ConfirmSpec, ModalProps, ModalSize, ModalSpec } from './components/modal';
|
|
10
|
+
export { ThemeProvider, ThemeToggle, resolveTheme, setTheme, toggleTheme, useTheme } from './components/theme';
|
|
11
|
+
export type { ThemeMode, ThemeToggleProps, UseThemeResult } from './components/theme';
|
|
12
|
+
export { Spinner } from './components/spinner';
|
|
13
|
+
export type { SpinnerProps } from './components/spinner';
|
|
14
|
+
export { Skeleton, SkeletonGrid, SkeletonText } from './components/skeleton';
|
|
15
|
+
export type { SkeletonGridProps, SkeletonTextProps } from './components/skeleton';
|
|
16
|
+
export { EmptyState } from './components/empty-state';
|
|
17
|
+
export type { EmptyStateProps } from './components/empty-state';
|
|
18
|
+
export { Badge, JOB_STATUS, StatusBadge } from './components/status-badge';
|
|
19
|
+
export type { BadgeProps, StatusBadgeProps, StatusMeta, Tone } from './components/status-badge';
|
|
20
|
+
export { CopyButton } from './components/copy-button';
|
|
21
|
+
export type { CopyButtonProps } from './components/copy-button';
|
|
22
|
+
export { DropZone, useFileDrop } from './components/drop-zone';
|
|
23
|
+
export type { DropZoneProps, FileRejection, UseFileDropOptions } from './components/drop-zone';
|
|
24
|
+
export { SearchInput } from './components/search-input';
|
|
25
|
+
export type { SearchInputProps } from './components/search-input';
|
|
26
|
+
export { ElementPicker, ElementPickerField, ElementPickerOverlay, ElementPreview, useElementPicker, classify, formatHtml, hierarchy, parseElement, uniqueSelector, STYLE_GROUPS, STYLE_PROPS, } from './components/element-picker';
|
|
27
|
+
export type { ElementPickerProps, ElementPickerOverlayProps, ElementPickerFieldProps, ElementPreviewProps, UseElementPickerOptions, UseElementPickerResult, ParseOptions, ElementField, ElementInfo, ElementKind, ElementPathStep, PickedElement, } from './components/element-picker';
|
|
28
|
+
export { RelativeTime } from './components/relative-time';
|
|
29
|
+
export type { RelativeTimeProps } from './components/relative-time';
|
|
30
|
+
export { ImageViewerProvider, useImageViewer, ViewableImage, ProgressiveImage } from './components/image-viewer';
|
|
31
|
+
export { FuzzyList, highlightAll, highlightSnippet } from './components/fuzzy-list';
|
|
32
|
+
export type { FuzzyListProps, FuzzyRenderContext } from './components/fuzzy-list';
|
|
33
|
+
export { GlobalSearch, formatHotkey, parseHotkey, useHotkey } from './components/global-search';
|
|
34
|
+
export type { GlobalSearchProps, GlobalSearchSource, Hotkey } from './components/global-search';
|
|
35
|
+
export { VirtualList } from './components/virtual-list';
|
|
36
|
+
export type { VirtualListProps, VirtualListHandle } from './components/virtual-list';
|
|
37
|
+
export { Changelog } from './components/changelog';
|
|
38
|
+
export type { ChangelogEntry, ChangelogProps } from './components/changelog';
|
|
39
|
+
export { PhonePreview, IOSStatusBar } from './components/phone-preview';
|
|
40
|
+
export type { PhonePreviewProps } from './components/phone-preview';
|
|
41
|
+
export { IframePreview, IframePreviewOverlay } from './components/iframe-preview';
|
|
42
|
+
export type { IframePreviewProps, IframePreviewOverlayProps, IframePreviewDevice, } from './components/iframe-preview';
|
|
43
|
+
export { Nav2DProvider, Nav2DItem, useNav2D } from './components/nav-2d';
|
|
44
|
+
export type { Nav2DProviderProps, Nav2DItemProps, Nav2DContextValue } from './components/nav-2d';
|
|
45
|
+
export { Button, Tooltip } from './components/button';
|
|
46
|
+
export type { ButtonProps, ButtonVariant, ButtonSize, TooltipProps, TooltipSide, } from './components/button';
|
|
47
|
+
export { Input } from './components/input';
|
|
48
|
+
export type { InputProps } from './components/input';
|
|
49
|
+
export { RichInput, defaultComposePrompt } from './components/rich-input';
|
|
50
|
+
export type { RichInputProps, RichFile, GuidelineTag, RichSendPayload, RichInputHandle, ComposeInput, } from './components/rich-input';
|
|
51
|
+
export { ProgressiveText } from './components/progressive-text';
|
|
52
|
+
export type { ProgressiveTextProps, ProgressiveTextMeta } from './components/progressive-text';
|
|
53
|
+
export { ProgressiveList } from './components/progressive-list';
|
|
54
|
+
export type { ProgressiveListProps, ProgressiveListItemMeta } from './components/progressive-list';
|
|
55
|
+
export { ProgressiveTable } from './components/progressive-table';
|
|
56
|
+
export type { ProgressiveTableProps, ProgressiveTableCellContext } from './components/progressive-table';
|
|
57
|
+
export { useProgressiveSlot, ProgressiveTimelineSlot } from './components/progressive-timeline';
|
|
58
|
+
export type { ProgressiveSlotValue } from './components/progressive-timeline';
|
|
59
|
+
export { ProgressiveBash } from './components/progressive-bash';
|
|
60
|
+
export type { ProgressiveBashProps, ProgressiveBashHandle, BashEntry, PlaybackTuning } from './components/progressive-bash';
|
|
61
|
+
export { computeGapMs as computeBashGapMs, DEFAULT_TUNING as DEFAULT_BASH_TUNING, tokenizeCommand, splitOutput, classifyLine, splitBySubparts, } from './components/progressive-bash';
|
|
62
|
+
export type { CmdToken, CmdKind, OutputLine, OutputSpan, LineKind, SubCommand } from './components/progressive-bash';
|
|
63
|
+
export { ResizableLayout } from './components/resizable-layout';
|
|
64
|
+
export type { ResizableLayoutProps, ResizableLayoutHandle, ResizableDrawerConfig, DrawerSide, MobileMode, } from './components/resizable-layout';
|
|
65
|
+
export { FloatingPanel, Dock, DockProvider, useDockContext } from './components/floating-panel';
|
|
66
|
+
export type { FloatingPanelProps, FloatingPanelHandle, DockProps, DockContextValue, PanelPlacement, FloatingGeom, } from './components/floating-panel';
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { cn as r } from "./lib/utils.js";
|
|
2
|
+
import { downloadFile as m, fmtBytes as p, fmtCost as s, fmtDateTime as f, fmtDuration as i, fmtNum as a, relTime as x } from "./lib/format.js";
|
|
3
|
+
import { Badge as u, JOB_STATUS as n, StatusBadge as P } from "./components/status-badge/status-badge.js";
|
|
4
|
+
import { Button as c } from "./components/button/button.js";
|
|
5
|
+
import { Changelog as S } from "./components/changelog/changelog.js";
|
|
6
|
+
import { CopyButton as d } from "./components/copy-button/copy-button.js";
|
|
7
|
+
import { DEFAULT_TUNING as k, computeGapMs as I } from "./components/progressive-bash/playback.js";
|
|
8
|
+
import { Dock as D } from "./components/floating-panel/dock.js";
|
|
9
|
+
import { DockProvider as L, useDockContext as B } from "./components/floating-panel/dock-context.js";
|
|
10
|
+
import { DropZone as b } from "./components/drop-zone/drop-zone.js";
|
|
11
|
+
import { ElementPicker as M, ElementPickerOverlay as N } from "./components/element-picker/element-picker.js";
|
|
12
|
+
import { ElementPickerField as F } from "./components/element-picker/element-picker-field.js";
|
|
13
|
+
import { ElementPreview as R } from "./components/element-picker/element-preview.js";
|
|
14
|
+
import { EmptyState as _ } from "./components/empty-state/empty-state.js";
|
|
15
|
+
import { FloatingPanel as H } from "./components/floating-panel/floating-panel.js";
|
|
16
|
+
import { FuzzyList as z } from "./components/fuzzy-list/fuzzy-list.js";
|
|
17
|
+
import { GlobalSearch as q } from "./components/global-search/global-search.js";
|
|
18
|
+
import { IOSStatusBar as Q, PhonePreview as Z } from "./components/phone-preview/phone-preview.js";
|
|
19
|
+
import { IframePreview as K, IframePreviewOverlay as W } from "./components/iframe-preview/iframe-preview.js";
|
|
20
|
+
import { ImageViewerProvider as $, useImageViewer as ee } from "./components/image-viewer/image-viewer.js";
|
|
21
|
+
import { Input as re } from "./components/input/input.js";
|
|
22
|
+
import { Modal as me } from "./components/modal/modal.js";
|
|
23
|
+
import { ModalProvider as se, useConfirm as fe, useModal as ie } from "./components/modal/modal-context.js";
|
|
24
|
+
import { Nav2DItem as xe, Nav2DProvider as le, useNav2D as ue } from "./components/nav-2d/nav-2d.js";
|
|
25
|
+
import { ProgressiveBash as Pe } from "./components/progressive-bash/progressive-bash.js";
|
|
26
|
+
import { ProgressiveImage as ce } from "./components/image-viewer/progressive-image.js";
|
|
27
|
+
import { ProgressiveList as Se } from "./components/progressive-list/progressive-list.js";
|
|
28
|
+
import { ProgressiveTable as de } from "./components/progressive-table/progressive-table.js";
|
|
29
|
+
import { ProgressiveText as ke } from "./components/progressive-text/progressive-text.js";
|
|
30
|
+
import { ProgressiveTimelineSlot as ye, useProgressiveSlot as De } from "./components/progressive-timeline/progressive-timeline.js";
|
|
31
|
+
import { RelativeTime as Le } from "./components/relative-time/relative-time.js";
|
|
32
|
+
import { ResizableLayout as Ce } from "./components/resizable-layout/resizable-layout.js";
|
|
33
|
+
import { RichInput as we } from "./components/rich-input/rich-input.js";
|
|
34
|
+
import { STYLE_GROUPS as Ne, STYLE_PROPS as Oe, classify as Fe, formatHtml as Ge, hierarchy as Re, parseElement as Ue, uniqueSelector as _e } from "./components/element-picker/parse.js";
|
|
35
|
+
import { SearchInput as He } from "./components/search-input/search-input.js";
|
|
36
|
+
import { Skeleton as ze, SkeletonGrid as Ye, SkeletonText as qe } from "./components/skeleton/skeleton.js";
|
|
37
|
+
import { Spinner as Qe } from "./components/spinner/spinner.js";
|
|
38
|
+
import { ThemeProvider as je, resolveTheme as Ke, setTheme as We, toggleTheme as Xe, useTheme as $e } from "./components/theme/theme.js";
|
|
39
|
+
import { ThemeToggle as oo } from "./components/theme/theme-toggle.js";
|
|
40
|
+
import { ToastProvider as to, Toaster as mo, useToast as po } from "./components/toast/toast.js";
|
|
41
|
+
import { Tooltip as fo } from "./components/button/tooltip.js";
|
|
42
|
+
import { ViewableImage as ao } from "./components/image-viewer/viewable-image.js";
|
|
43
|
+
import { VirtualList as lo } from "./components/virtual-list/virtual-list.js";
|
|
44
|
+
import { classifyLine as no, splitBySubparts as Po, splitOutput as To, tokenizeCommand as co } from "./components/progressive-bash/parse.js";
|
|
45
|
+
import { defaultComposePrompt as So } from "./components/rich-input/compose.js";
|
|
46
|
+
import { formatHotkey as ho, parseHotkey as ko, useHotkey as Io } from "./components/global-search/hotkey.js";
|
|
47
|
+
import { highlightAll as Do, highlightSnippet as Eo } from "./lib/highlight.js";
|
|
48
|
+
import { useCopyToClipboard as Bo } from "./hooks/use-copy-to-clipboard.js";
|
|
49
|
+
import { useDebouncedValue as bo } from "./hooks/use-debounced-value.js";
|
|
50
|
+
import { useElementPicker as Mo } from "./components/element-picker/use-element-picker.js";
|
|
51
|
+
import { useEscape as Oo, useOutsideClick as Fo, useScrollLock as Go } from "./hooks/use-overlay.js";
|
|
52
|
+
import { useFileDrop as Uo } from "./components/drop-zone/use-file-drop.js";
|
|
53
|
+
import { useInfiniteScroll as Ao, useIntersection as Ho } from "./hooks/use-intersection.js";
|
|
54
|
+
import { useIsMobile as zo, useIsTouch as Yo, useMediaQuery as qo, usePrefersDark as Jo, usePrefersReducedMotion as Qo } from "./hooks/use-media-query.js";
|
|
55
|
+
import { useLocalStorage as jo } from "./hooks/use-local-storage.js";
|
|
56
|
+
import { useLongPress as Wo } from "./hooks/use-long-press.js";
|
|
57
|
+
export {
|
|
58
|
+
u as Badge,
|
|
59
|
+
c as Button,
|
|
60
|
+
S as Changelog,
|
|
61
|
+
d as CopyButton,
|
|
62
|
+
k as DEFAULT_BASH_TUNING,
|
|
63
|
+
D as Dock,
|
|
64
|
+
L as DockProvider,
|
|
65
|
+
b as DropZone,
|
|
66
|
+
M as ElementPicker,
|
|
67
|
+
F as ElementPickerField,
|
|
68
|
+
N as ElementPickerOverlay,
|
|
69
|
+
R as ElementPreview,
|
|
70
|
+
_ as EmptyState,
|
|
71
|
+
H as FloatingPanel,
|
|
72
|
+
z as FuzzyList,
|
|
73
|
+
q as GlobalSearch,
|
|
74
|
+
Q as IOSStatusBar,
|
|
75
|
+
K as IframePreview,
|
|
76
|
+
W as IframePreviewOverlay,
|
|
77
|
+
$ as ImageViewerProvider,
|
|
78
|
+
re as Input,
|
|
79
|
+
n as JOB_STATUS,
|
|
80
|
+
me as Modal,
|
|
81
|
+
se as ModalProvider,
|
|
82
|
+
xe as Nav2DItem,
|
|
83
|
+
le as Nav2DProvider,
|
|
84
|
+
Z as PhonePreview,
|
|
85
|
+
Pe as ProgressiveBash,
|
|
86
|
+
ce as ProgressiveImage,
|
|
87
|
+
Se as ProgressiveList,
|
|
88
|
+
de as ProgressiveTable,
|
|
89
|
+
ke as ProgressiveText,
|
|
90
|
+
ye as ProgressiveTimelineSlot,
|
|
91
|
+
Le as RelativeTime,
|
|
92
|
+
Ce as ResizableLayout,
|
|
93
|
+
we as RichInput,
|
|
94
|
+
Ne as STYLE_GROUPS,
|
|
95
|
+
Oe as STYLE_PROPS,
|
|
96
|
+
He as SearchInput,
|
|
97
|
+
ze as Skeleton,
|
|
98
|
+
Ye as SkeletonGrid,
|
|
99
|
+
qe as SkeletonText,
|
|
100
|
+
Qe as Spinner,
|
|
101
|
+
P as StatusBadge,
|
|
102
|
+
je as ThemeProvider,
|
|
103
|
+
oo as ThemeToggle,
|
|
104
|
+
to as ToastProvider,
|
|
105
|
+
mo as Toaster,
|
|
106
|
+
fo as Tooltip,
|
|
107
|
+
ao as ViewableImage,
|
|
108
|
+
lo as VirtualList,
|
|
109
|
+
Fe as classify,
|
|
110
|
+
no as classifyLine,
|
|
111
|
+
r as cn,
|
|
112
|
+
I as computeBashGapMs,
|
|
113
|
+
So as defaultComposePrompt,
|
|
114
|
+
m as downloadFile,
|
|
115
|
+
p as fmtBytes,
|
|
116
|
+
s as fmtCost,
|
|
117
|
+
f as fmtDateTime,
|
|
118
|
+
i as fmtDuration,
|
|
119
|
+
a as fmtNum,
|
|
120
|
+
ho as formatHotkey,
|
|
121
|
+
Ge as formatHtml,
|
|
122
|
+
Re as hierarchy,
|
|
123
|
+
Do as highlightAll,
|
|
124
|
+
Eo as highlightSnippet,
|
|
125
|
+
Ue as parseElement,
|
|
126
|
+
ko as parseHotkey,
|
|
127
|
+
x as relTime,
|
|
128
|
+
Ke as resolveTheme,
|
|
129
|
+
We as setTheme,
|
|
130
|
+
Po as splitBySubparts,
|
|
131
|
+
To as splitOutput,
|
|
132
|
+
Xe as toggleTheme,
|
|
133
|
+
co as tokenizeCommand,
|
|
134
|
+
_e as uniqueSelector,
|
|
135
|
+
fe as useConfirm,
|
|
136
|
+
Bo as useCopyToClipboard,
|
|
137
|
+
bo as useDebouncedValue,
|
|
138
|
+
B as useDockContext,
|
|
139
|
+
Mo as useElementPicker,
|
|
140
|
+
Oo as useEscape,
|
|
141
|
+
Uo as useFileDrop,
|
|
142
|
+
Io as useHotkey,
|
|
143
|
+
ee as useImageViewer,
|
|
144
|
+
Ao as useInfiniteScroll,
|
|
145
|
+
Ho as useIntersection,
|
|
146
|
+
zo as useIsMobile,
|
|
147
|
+
Yo as useIsTouch,
|
|
148
|
+
jo as useLocalStorage,
|
|
149
|
+
Wo as useLongPress,
|
|
150
|
+
qo as useMediaQuery,
|
|
151
|
+
ie as useModal,
|
|
152
|
+
ue as useNav2D,
|
|
153
|
+
Fo as useOutsideClick,
|
|
154
|
+
Jo as usePrefersDark,
|
|
155
|
+
Qo as usePrefersReducedMotion,
|
|
156
|
+
De as useProgressiveSlot,
|
|
157
|
+
Go as useScrollLock,
|
|
158
|
+
$e as useTheme,
|
|
159
|
+
po as useToast
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type TimeInput = string | number | Date;
|
|
2
|
+
/** `just now` · `4m ago` · `3h ago` · `in 2d` — compact, sign-aware. */
|
|
3
|
+
export declare function relTime(input: TimeInput, now?: TimeInput): string;
|
|
4
|
+
/** `840ms` · `12.4s` · `2m 08s` · `1h 04m` — a duration in ms. */
|
|
5
|
+
export declare function fmtDuration(ms: number): string;
|
|
6
|
+
/** `512 B` · `1.4 KB` · `2.3 MB` — SI-ish, one decimal above KB. */
|
|
7
|
+
export declare function fmtBytes(bytes: number, decimals?: number): string;
|
|
8
|
+
/** `947` · `12.4k` · `3.1M` — compact counts (tokens, rows, plays). */
|
|
9
|
+
export declare function fmtNum(n: number, decimals?: number): string;
|
|
10
|
+
/** `$0.0041` · `$1.24` · `$312` — small LLM costs keep their significant digits. */
|
|
11
|
+
export declare function fmtCost(usd: number, currency?: string): string;
|
|
12
|
+
/** Locale date-time, seconds-free: `12 Jul, 14:03`. */
|
|
13
|
+
export declare function fmtDateTime(input: TimeInput, locale?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Save a string or Blob to the user's disk — the anchor + object-URL dance,
|
|
16
|
+
* with the revoke that hand-rolled copies forget.
|
|
17
|
+
*/
|
|
18
|
+
export declare function downloadFile(filename: string, data: Blob | string, mime?: string): void;
|
|
19
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAU/C,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAE,SAAsB,GAAG,MAAM,CAgB7E;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAY9C;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAY5D;AAED,uEAAuE;AACvE,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAOtD;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAK3D;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CASrE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,SAAe,QAStF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
function a(t) {
|
|
2
|
+
if (t instanceof Date) return t.getTime();
|
|
3
|
+
if (typeof t == "number") return t < 1e11 ? t * 1e3 : t;
|
|
4
|
+
const e = Date.parse(t);
|
|
5
|
+
return Number.isNaN(e) ? NaN : e;
|
|
6
|
+
}
|
|
7
|
+
function s(t, e = Date.now()) {
|
|
8
|
+
const r = a(t);
|
|
9
|
+
if (Number.isNaN(r)) return "—";
|
|
10
|
+
const o = a(e) - r, i = o < 0, n = Math.abs(o) / 1e3, u = (f) => i ? `in ${f}` : `${f} ago`;
|
|
11
|
+
return n < 45 ? "just now" : n < 3600 ? u(`${Math.round(n / 60)}m`) : n < 86400 ? u(`${Math.round(n / 3600)}h`) : n < 604800 ? u(`${Math.round(n / 86400)}d`) : n < 2592e3 ? u(`${Math.round(n / 604800)}w`) : n < 31536e3 ? u(`${Math.round(n / 2592e3)}mo`) : u(`${Math.round(n / 31536e3)}y`);
|
|
12
|
+
}
|
|
13
|
+
function c(t) {
|
|
14
|
+
if (!Number.isFinite(t) || t < 0) return "—";
|
|
15
|
+
if (t < 1e3) return `${Math.round(t)}ms`;
|
|
16
|
+
const e = Math.round(t / 1e3);
|
|
17
|
+
if (e < 60) return `${(t / 1e3).toFixed(1)}s`;
|
|
18
|
+
const r = Math.floor(e / 3600), o = Math.floor(e % 3600 / 60), i = e % 60;
|
|
19
|
+
return r > 0 ? `${r}h ${String(o).padStart(2, "0")}m` : `${o}m ${String(i).padStart(2, "0")}s`;
|
|
20
|
+
}
|
|
21
|
+
function h(t, e = 1) {
|
|
22
|
+
if (!Number.isFinite(t)) return "—";
|
|
23
|
+
if (t < 1024) return `${Math.round(t)} B`;
|
|
24
|
+
const r = ["KB", "MB", "GB", "TB", "PB"];
|
|
25
|
+
let o = t / 1024, i = 0;
|
|
26
|
+
for (; o >= 1024 && i < r.length - 1; )
|
|
27
|
+
o /= 1024, i += 1;
|
|
28
|
+
return `${o.toFixed(e)} ${r[i]}`;
|
|
29
|
+
}
|
|
30
|
+
function $(t, e = 1) {
|
|
31
|
+
if (!Number.isFinite(t)) return "—";
|
|
32
|
+
const r = Math.abs(t);
|
|
33
|
+
return r < 1e3 ? String(Math.round(t)) : r < 1e6 ? `${(t / 1e3).toFixed(e)}k` : r < 1e9 ? `${(t / 1e6).toFixed(e)}M` : `${(t / 1e9).toFixed(e)}B`;
|
|
34
|
+
}
|
|
35
|
+
function d(t, e = "$") {
|
|
36
|
+
if (!Number.isFinite(t)) return "—";
|
|
37
|
+
const r = Math.abs(t), o = r === 0 ? 2 : r < 0.01 ? 4 : r < 100 ? 2 : 0;
|
|
38
|
+
return `${t < 0 ? "-" : ""}${e}${r.toFixed(o)}`;
|
|
39
|
+
}
|
|
40
|
+
function m(t, e) {
|
|
41
|
+
const r = a(t);
|
|
42
|
+
return Number.isNaN(r) ? "—" : new Date(r).toLocaleString(e, {
|
|
43
|
+
day: "numeric",
|
|
44
|
+
month: "short",
|
|
45
|
+
hour: "2-digit",
|
|
46
|
+
minute: "2-digit"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function M(t, e, r = "text/plain") {
|
|
50
|
+
const o = typeof e == "string" ? new Blob([e], { type: `${r};charset=utf-8` }) : e, i = URL.createObjectURL(o), n = document.createElement("a");
|
|
51
|
+
n.href = i, n.download = t, n.click(), setTimeout(() => URL.revokeObjectURL(i), 1e3);
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
M as downloadFile,
|
|
55
|
+
h as fmtBytes,
|
|
56
|
+
d as fmtCost,
|
|
57
|
+
m as fmtDateTime,
|
|
58
|
+
c as fmtDuration,
|
|
59
|
+
$ as fmtNum,
|
|
60
|
+
s as relTime
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sources":["../../src/lib/format.ts"],"sourcesContent":["/*\n * The formatters every homelab app rewrites: \"3 min ago\", \"1.4 GB\", \"2m 08s\",\n * \"$0.0412\". One module, so a queue card in one service and a job row in\n * another round the same way.\n */\n\nexport type TimeInput = string | number | Date;\n\n/** Accepts an ISO string, a Date, epoch ms, or epoch *seconds* (< 1e11). */\nfunction toMs(input: TimeInput): number {\n if (input instanceof Date) return input.getTime();\n if (typeof input === 'number') return input < 1e11 ? input * 1000 : input;\n const parsed = Date.parse(input);\n return Number.isNaN(parsed) ? NaN : parsed;\n}\n\n/** `just now` · `4m ago` · `3h ago` · `in 2d` — compact, sign-aware. */\nexport function relTime(input: TimeInput, now: TimeInput = Date.now()): string {\n const ms = toMs(input);\n if (Number.isNaN(ms)) return '—';\n\n const diff = toMs(now) - ms;\n const future = diff < 0;\n const s = Math.abs(diff) / 1000;\n\n const say = (v: string) => (future ? `in ${v}` : `${v} ago`);\n if (s < 45) return 'just now';\n if (s < 3600) return say(`${Math.round(s / 60)}m`);\n if (s < 86_400) return say(`${Math.round(s / 3600)}h`);\n if (s < 604_800) return say(`${Math.round(s / 86_400)}d`);\n if (s < 2_592_000) return say(`${Math.round(s / 604_800)}w`);\n if (s < 31_536_000) return say(`${Math.round(s / 2_592_000)}mo`);\n return say(`${Math.round(s / 31_536_000)}y`);\n}\n\n/** `840ms` · `12.4s` · `2m 08s` · `1h 04m` — a duration in ms. */\nexport function fmtDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n\n const total = Math.round(ms / 1000);\n if (total < 60) return `${(ms / 1000).toFixed(1)}s`;\n\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n if (h > 0) return `${h}h ${String(m).padStart(2, '0')}m`;\n return `${m}m ${String(s).padStart(2, '0')}s`;\n}\n\n/** `512 B` · `1.4 KB` · `2.3 MB` — SI-ish, one decimal above KB. */\nexport function fmtBytes(bytes: number, decimals = 1): string {\n if (!Number.isFinite(bytes)) return '—';\n if (bytes < 1024) return `${Math.round(bytes)} B`;\n\n const units = ['KB', 'MB', 'GB', 'TB', 'PB'];\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${value.toFixed(decimals)} ${units[unit]}`;\n}\n\n/** `947` · `12.4k` · `3.1M` — compact counts (tokens, rows, plays). */\nexport function fmtNum(n: number, decimals = 1): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n if (abs < 1000) return String(Math.round(n));\n if (abs < 1_000_000) return `${(n / 1000).toFixed(decimals)}k`;\n if (abs < 1_000_000_000) return `${(n / 1_000_000).toFixed(decimals)}M`;\n return `${(n / 1_000_000_000).toFixed(decimals)}B`;\n}\n\n/** `$0.0041` · `$1.24` · `$312` — small LLM costs keep their significant digits. */\nexport function fmtCost(usd: number, currency = '$'): string {\n if (!Number.isFinite(usd)) return '—';\n const abs = Math.abs(usd);\n const digits = abs === 0 ? 2 : abs < 0.01 ? 4 : abs < 100 ? 2 : 0;\n return `${usd < 0 ? '-' : ''}${currency}${abs.toFixed(digits)}`;\n}\n\n/** Locale date-time, seconds-free: `12 Jul, 14:03`. */\nexport function fmtDateTime(input: TimeInput, locale?: string): string {\n const ms = toMs(input);\n if (Number.isNaN(ms)) return '—';\n return new Date(ms).toLocaleString(locale, {\n day: 'numeric',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\n/**\n * Save a string or Blob to the user's disk — the anchor + object-URL dance,\n * with the revoke that hand-rolled copies forget.\n */\nexport function downloadFile(filename: string, data: Blob | string, mime = 'text/plain') {\n const blob = typeof data === 'string' ? new Blob([data], { type: `${mime};charset=utf-8` }) : data;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n // Give the browser a tick to start the download before dropping the URL.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n"],"names":["toMs","input","parsed","relTime","now","ms","diff","future","s","say","v","fmtDuration","total","h","m","fmtBytes","bytes","decimals","units","value","unit","fmtNum","n","abs","fmtCost","usd","currency","digits","fmtDateTime","locale","downloadFile","filename","data","mime","blob","url","a"],"mappings":"AASA,SAASA,EAAKC,GAA0B;AACtC,MAAIA,aAAiB,KAAM,QAAOA,EAAM,QAAA;AACxC,MAAI,OAAOA,KAAU,iBAAiBA,IAAQ,OAAOA,IAAQ,MAAOA;AACpE,QAAMC,IAAS,KAAK,MAAMD,CAAK;AAC/B,SAAO,OAAO,MAAMC,CAAM,IAAI,MAAMA;AACtC;AAGO,SAASC,EAAQF,GAAkBG,IAAiB,KAAK,OAAe;AAC7E,QAAMC,IAAKL,EAAKC,CAAK;AACrB,MAAI,OAAO,MAAMI,CAAE,EAAG,QAAO;AAE7B,QAAMC,IAAON,EAAKI,CAAG,IAAIC,GACnBE,IAASD,IAAO,GAChBE,IAAI,KAAK,IAAIF,CAAI,IAAI,KAErBG,IAAM,CAACC,MAAeH,IAAS,MAAMG,CAAC,KAAK,GAAGA,CAAC;AACrD,SAAIF,IAAI,KAAW,aACfA,IAAI,OAAaC,EAAI,GAAG,KAAK,MAAMD,IAAI,EAAE,CAAC,GAAG,IAC7CA,IAAI,QAAeC,EAAI,GAAG,KAAK,MAAMD,IAAI,IAAI,CAAC,GAAG,IACjDA,IAAI,SAAgBC,EAAI,GAAG,KAAK,MAAMD,IAAI,KAAM,CAAC,GAAG,IACpDA,IAAI,SAAkBC,EAAI,GAAG,KAAK,MAAMD,IAAI,MAAO,CAAC,GAAG,IACvDA,IAAI,UAAmBC,EAAI,GAAG,KAAK,MAAMD,IAAI,MAAS,CAAC,IAAI,IACxDC,EAAI,GAAG,KAAK,MAAMD,IAAI,OAAU,CAAC,GAAG;AAC7C;AAGO,SAASG,EAAYN,GAAoB;AAC9C,MAAI,CAAC,OAAO,SAASA,CAAE,KAAKA,IAAK,EAAG,QAAO;AAC3C,MAAIA,IAAK,IAAM,QAAO,GAAG,KAAK,MAAMA,CAAE,CAAC;AAEvC,QAAMO,IAAQ,KAAK,MAAMP,IAAK,GAAI;AAClC,MAAIO,IAAQ,GAAI,QAAO,IAAIP,IAAK,KAAM,QAAQ,CAAC,CAAC;AAEhD,QAAMQ,IAAI,KAAK,MAAMD,IAAQ,IAAI,GAC3BE,IAAI,KAAK,MAAOF,IAAQ,OAAQ,EAAE,GAClCJ,IAAII,IAAQ;AAClB,SAAIC,IAAI,IAAU,GAAGA,CAAC,KAAK,OAAOC,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,MAC9C,GAAGA,CAAC,KAAK,OAAON,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC5C;AAGO,SAASO,EAASC,GAAeC,IAAW,GAAW;AAC5D,MAAI,CAAC,OAAO,SAASD,CAAK,EAAG,QAAO;AACpC,MAAIA,IAAQ,KAAM,QAAO,GAAG,KAAK,MAAMA,CAAK,CAAC;AAE7C,QAAME,IAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAC3C,MAAIC,IAAQH,IAAQ,MAChBI,IAAO;AACX,SAAOD,KAAS,QAAQC,IAAOF,EAAM,SAAS;AAC5C,IAAAC,KAAS,MACTC,KAAQ;AAEV,SAAO,GAAGD,EAAM,QAAQF,CAAQ,CAAC,IAAIC,EAAME,CAAI,CAAC;AAClD;AAGO,SAASC,EAAOC,GAAWL,IAAW,GAAW;AACtD,MAAI,CAAC,OAAO,SAASK,CAAC,EAAG,QAAO;AAChC,QAAMC,IAAM,KAAK,IAAID,CAAC;AACtB,SAAIC,IAAM,MAAa,OAAO,KAAK,MAAMD,CAAC,CAAC,IACvCC,IAAM,MAAkB,IAAID,IAAI,KAAM,QAAQL,CAAQ,CAAC,MACvDM,IAAM,MAAsB,IAAID,IAAI,KAAW,QAAQL,CAAQ,CAAC,MAC7D,IAAIK,IAAI,KAAe,QAAQL,CAAQ,CAAC;AACjD;AAGO,SAASO,EAAQC,GAAaC,IAAW,KAAa;AAC3D,MAAI,CAAC,OAAO,SAASD,CAAG,EAAG,QAAO;AAClC,QAAMF,IAAM,KAAK,IAAIE,CAAG,GAClBE,IAASJ,MAAQ,IAAI,IAAIA,IAAM,OAAO,IAAIA,IAAM,MAAM,IAAI;AAChE,SAAO,GAAGE,IAAM,IAAI,MAAM,EAAE,GAAGC,CAAQ,GAAGH,EAAI,QAAQI,CAAM,CAAC;AAC/D;AAGO,SAASC,EAAY3B,GAAkB4B,GAAyB;AACrE,QAAMxB,IAAKL,EAAKC,CAAK;AACrB,SAAI,OAAO,MAAMI,CAAE,IAAU,MACtB,IAAI,KAAKA,CAAE,EAAE,eAAewB,GAAQ;AAAA,IACzC,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT;AACH;AAMO,SAASC,EAAaC,GAAkBC,GAAqBC,IAAO,cAAc;AACvF,QAAMC,IAAO,OAAOF,KAAS,WAAW,IAAI,KAAK,CAACA,CAAI,GAAG,EAAE,MAAM,GAAGC,CAAI,iBAAA,CAAkB,IAAID,GACxFG,IAAM,IAAI,gBAAgBD,CAAI,GAC9BE,IAAI,SAAS,cAAc,GAAG;AACpC,EAAAA,EAAE,OAAOD,GACTC,EAAE,WAAWL,GACbK,EAAE,MAAA,GAEF,WAAW,MAAM,IAAI,gBAAgBD,CAAG,GAAG,GAAI;AACjD;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap the matched ranges of `text` in `<mark>`, highlighting the whole string
|
|
4
|
+
* (no windowing). `indices` are Fuse.js match indices — inclusive `[start, end]`
|
|
5
|
+
* pairs.
|
|
6
|
+
*/
|
|
7
|
+
export declare function highlightAll(text: string, indices: readonly [number, number][]): ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Build a compact snippet of `text` centered on the first match, with the
|
|
10
|
+
* matched ranges wrapped in `<mark>` and ellipses at any trimmed edge. Good for
|
|
11
|
+
* long fields (message bodies, descriptions) where you only want the hit in
|
|
12
|
+
* context. `indices` are Fuse.js match indices — inclusive `[start, end]` pairs.
|
|
13
|
+
*/
|
|
14
|
+
export declare function highlightSnippet(text: string, indices: readonly [number, number][], window?: number): ReactNode;
|
|
15
|
+
//# sourceMappingURL=highlight.d.ts.map
|