@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":"index.d.ts","sourceRoot":"","sources":["../../../src/components/changelog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
|
|
3
|
+
/** The text to copy. A function is called lazily, on click. */
|
|
4
|
+
value: string | (() => string);
|
|
5
|
+
/** Show the label next to the icon. */
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Offer the native share sheet first on touch devices. */
|
|
8
|
+
share?: boolean;
|
|
9
|
+
onCopied?: () => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Copy-to-clipboard with the transient check mark — the six lines re-typed in a
|
|
13
|
+
* dozen projects, minus the empty `catch {}` they all shipped.
|
|
14
|
+
*/
|
|
15
|
+
export declare function CopyButton({ value, label, share, onCopied, className, ...props }: CopyButtonProps): React.JSX.Element;
|
|
16
|
+
//# sourceMappingURL=copy-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-button.d.ts","sourceRoot":"","sources":["../../../src/components/copy-button/copy-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACnG,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC/B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,KAAa,EACb,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,qBAuBjB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsxs as c, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
import { Check as a, Copy as d } from "lucide-react";
|
|
4
|
+
import { cn as f } from "../../lib/utils.js";
|
|
5
|
+
import { useCopyToClipboard as l } from "../../hooks/use-copy-to-clipboard.js";
|
|
6
|
+
function k({
|
|
7
|
+
value: o,
|
|
8
|
+
label: e,
|
|
9
|
+
share: n = !1,
|
|
10
|
+
onCopied: r,
|
|
11
|
+
className: s,
|
|
12
|
+
...m
|
|
13
|
+
}) {
|
|
14
|
+
const { copy: p, copied: t } = l({ share: n });
|
|
15
|
+
return /* @__PURE__ */ c(
|
|
16
|
+
"button",
|
|
17
|
+
{
|
|
18
|
+
type: "button",
|
|
19
|
+
onClick: async () => {
|
|
20
|
+
await p(typeof o == "function" ? o() : o) && (r == null || r());
|
|
21
|
+
},
|
|
22
|
+
"aria-label": e ?? (t ? "Copied" : "Copy"),
|
|
23
|
+
title: t ? "Copied" : "Copy",
|
|
24
|
+
className: f(
|
|
25
|
+
"inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
|
|
26
|
+
t && "text-emerald-600 dark:text-emerald-400",
|
|
27
|
+
s
|
|
28
|
+
),
|
|
29
|
+
...m,
|
|
30
|
+
children: [
|
|
31
|
+
t ? /* @__PURE__ */ i(a, { className: "size-3.5" }) : /* @__PURE__ */ i(d, { className: "size-3.5" }),
|
|
32
|
+
e && /* @__PURE__ */ i("span", { children: t ? "Copied" : e })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
k as CopyButton
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=copy-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-button.js","sources":["../../../src/components/copy-button/copy-button.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, Copy } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { useCopyToClipboard } from '../../hooks/use-copy-to-clipboard';\n\nexport interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** The text to copy. A function is called lazily, on click. */\n value: string | (() => string);\n /** Show the label next to the icon. */\n label?: string;\n /** Offer the native share sheet first on touch devices. */\n share?: boolean;\n onCopied?: () => void;\n}\n\n/**\n * Copy-to-clipboard with the transient check mark — the six lines re-typed in a\n * dozen projects, minus the empty `catch {}` they all shipped.\n */\nexport function CopyButton({\n value,\n label,\n share = false,\n onCopied,\n className,\n ...props\n}: CopyButtonProps) {\n const { copy, copied } = useCopyToClipboard({ share });\n\n return (\n <button\n type=\"button\"\n onClick={async () => {\n const ok = await copy(typeof value === 'function' ? value() : value);\n if (ok) onCopied?.();\n }}\n aria-label={label ?? (copied ? 'Copied' : 'Copy')}\n title={copied ? 'Copied' : 'Copy'}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n copied && 'text-emerald-600 dark:text-emerald-400',\n className,\n )}\n {...props}\n >\n {copied ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n {label && <span>{copied ? 'Copied' : label}</span>}\n </button>\n );\n}\n"],"names":["CopyButton","value","label","share","onCopied","className","props","copy","copied","useCopyToClipboard","jsxs","cn","jsx","Check","Copy"],"mappings":";;;;;AAoBO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAoB;AAClB,QAAM,EAAE,MAAAC,GAAM,QAAAC,EAAA,IAAWC,EAAmB,EAAE,OAAAN,GAAO;AAErD,SACE,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,YAAY;AAEnB,QADW,MAAMH,EAAK,OAAON,KAAU,aAAaA,EAAA,IAAUA,CAAK,MAC3DG,KAAA,QAAAA;AAAA,MACV;AAAA,MACA,cAAYF,MAAUM,IAAS,WAAW;AAAA,MAC1C,OAAOA,IAAS,WAAW;AAAA,MAC3B,WAAWG;AAAA,QACT;AAAA,QACAH,KAAU;AAAA,QACVH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAE,IAAS,gBAAAI,EAACC,KAAM,WAAU,WAAA,CAAW,IAAK,gBAAAD,EAACE,GAAA,EAAK,WAAU,WAAA,CAAW;AAAA,QACrEZ,KAAS,gBAAAU,EAAC,QAAA,EAAM,UAAAJ,IAAS,WAAWN,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjD;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/copy-button/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { UseFileDropOptions } from './use-file-drop';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export interface DropZoneProps extends UseFileDropOptions {
|
|
4
|
+
/** Headline inside the zone. */
|
|
5
|
+
label?: React.ReactNode;
|
|
6
|
+
/** Small print — say what you accept and how big. */
|
|
7
|
+
hint?: React.ReactNode;
|
|
8
|
+
/** Replaces the default body entirely. Gets the live drag state. */
|
|
9
|
+
children?: (state: {
|
|
10
|
+
dragging: boolean;
|
|
11
|
+
open: () => void;
|
|
12
|
+
}) => React.ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A drag-and-drop file target that also clicks through to the file picker, with
|
|
17
|
+
* the whole-window drag highlight and folder support behind one prop.
|
|
18
|
+
*/
|
|
19
|
+
export declare function DropZone({ label, hint, children, className, ...options }: DropZoneProps): React.JSX.Element;
|
|
20
|
+
//# sourceMappingURL=drop-zone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drop-zone.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/drop-zone.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,gCAAgC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,qDAAqD;IACrD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAyB,EACzB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,GAAG,OAAO,EACX,EAAE,aAAa,qBAyCf"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsxs as s, jsx as r, Fragment as p } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
import { Upload as f } from "lucide-react";
|
|
4
|
+
import { cn as a } from "../../lib/utils.js";
|
|
5
|
+
import { useFileDrop as b } from "./use-file-drop.js";
|
|
6
|
+
function D({
|
|
7
|
+
label: l = "Drop files here",
|
|
8
|
+
hint: i,
|
|
9
|
+
children: d,
|
|
10
|
+
className: m,
|
|
11
|
+
...e
|
|
12
|
+
}) {
|
|
13
|
+
const { dragging: o, rootProps: u, inputProps: c, open: t } = b(e);
|
|
14
|
+
return /* @__PURE__ */ s(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
...u,
|
|
18
|
+
onClick: e.disabled ? void 0 : t,
|
|
19
|
+
onKeyDown: (n) => {
|
|
20
|
+
(n.key === "Enter" || n.key === " ") && (n.preventDefault(), t());
|
|
21
|
+
},
|
|
22
|
+
role: "button",
|
|
23
|
+
tabIndex: e.disabled ? -1 : 0,
|
|
24
|
+
"aria-disabled": e.disabled,
|
|
25
|
+
className: a(
|
|
26
|
+
"relative flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-6 py-10 text-center transition-colors outline-none",
|
|
27
|
+
"hover:border-ring/60 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring",
|
|
28
|
+
o && "border-ring bg-muted/60",
|
|
29
|
+
e.disabled && "pointer-events-none opacity-50",
|
|
30
|
+
m
|
|
31
|
+
),
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ r("input", { ...c }),
|
|
34
|
+
d ? d({ dragging: o, open: t }) : /* @__PURE__ */ s(p, { children: [
|
|
35
|
+
/* @__PURE__ */ r(
|
|
36
|
+
f,
|
|
37
|
+
{
|
|
38
|
+
className: a(
|
|
39
|
+
"size-6 text-muted-foreground transition-transform",
|
|
40
|
+
o && "scale-110 text-foreground"
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
),
|
|
44
|
+
/* @__PURE__ */ r("p", { className: "text-sm font-medium text-foreground", children: l }),
|
|
45
|
+
i && /* @__PURE__ */ r("p", { className: "text-xs text-muted-foreground", children: i })
|
|
46
|
+
] })
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
D as DropZone
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=drop-zone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drop-zone.js","sources":["../../../src/components/drop-zone/drop-zone.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Upload } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { useFileDrop, type UseFileDropOptions } from './use-file-drop';\n\nexport interface DropZoneProps extends UseFileDropOptions {\n /** Headline inside the zone. */\n label?: React.ReactNode;\n /** Small print — say what you accept and how big. */\n hint?: React.ReactNode;\n /** Replaces the default body entirely. Gets the live drag state. */\n children?: (state: { dragging: boolean; open: () => void }) => React.ReactNode;\n className?: string;\n}\n\n/**\n * A drag-and-drop file target that also clicks through to the file picker, with\n * the whole-window drag highlight and folder support behind one prop.\n */\nexport function DropZone({\n label = 'Drop files here',\n hint,\n children,\n className,\n ...options\n}: DropZoneProps) {\n const { dragging, rootProps, inputProps, open } = useFileDrop(options);\n\n return (\n <div\n {...rootProps}\n onClick={options.disabled ? undefined : open}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n open();\n }\n }}\n role=\"button\"\n tabIndex={options.disabled ? -1 : 0}\n aria-disabled={options.disabled}\n className={cn(\n 'relative flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-6 py-10 text-center transition-colors outline-none',\n 'hover:border-ring/60 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring',\n dragging && 'border-ring bg-muted/60',\n options.disabled && 'pointer-events-none opacity-50',\n className,\n )}\n >\n <input {...inputProps} />\n {children ? (\n children({ dragging, open })\n ) : (\n <>\n <Upload\n className={cn(\n 'size-6 text-muted-foreground transition-transform',\n dragging && 'scale-110 text-foreground',\n )}\n />\n <p className=\"text-sm font-medium text-foreground\">{label}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </>\n )}\n </div>\n );\n}\n"],"names":["DropZone","label","hint","children","className","options","dragging","rootProps","inputProps","open","useFileDrop","jsxs","e","cn","jsx","Fragment","Upload"],"mappings":";;;;;AAoBO,SAASA,EAAS;AAAA,EACvB,OAAAC,IAAQ;AAAA,EACR,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAkB;AAChB,QAAM,EAAE,UAAAC,GAAU,WAAAC,GAAW,YAAAC,GAAY,MAAAC,EAAA,IAASC,EAAYL,CAAO;AAErE,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGJ;AAAA,MACJ,SAASF,EAAQ,WAAW,SAAYI;AAAA,MACxC,WAAW,CAACG,MAAM;AAChB,SAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFH,EAAA;AAAA,MAEJ;AAAA,MACA,MAAK;AAAA,MACL,UAAUJ,EAAQ,WAAW,KAAK;AAAA,MAClC,iBAAeA,EAAQ;AAAA,MACvB,WAAWQ;AAAA,QACT;AAAA,QACA;AAAA,QACAP,KAAY;AAAA,QACZD,EAAQ,YAAY;AAAA,QACpBD;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAU,EAAC,SAAA,EAAO,GAAGN,GAAY;AAAA,QACtBL,IACCA,EAAS,EAAE,UAAAG,GAAU,MAAAG,EAAA,CAAM,IAE3B,gBAAAE,EAAAI,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAD;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAWH;AAAA,gBACT;AAAA,gBACAP,KAAY;AAAA,cAAA;AAAA,YACd;AAAA,UAAA;AAAA,UAEF,gBAAAQ,EAAC,KAAA,EAAE,WAAU,uCAAuC,UAAAb,GAAM;AAAA,UACzDC,KAAQ,gBAAAY,EAAC,KAAA,EAAE,WAAU,iCAAiC,UAAAZ,EAAA,CAAK;AAAA,QAAA,EAAA,CAC9D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface FileRejection {
|
|
3
|
+
file: File;
|
|
4
|
+
reason: 'type' | 'size' | 'count';
|
|
5
|
+
}
|
|
6
|
+
export interface UseFileDropOptions {
|
|
7
|
+
onFiles: (files: File[]) => void;
|
|
8
|
+
/** Same syntax as `<input accept>`: `image/*,.glb`. */
|
|
9
|
+
accept?: string;
|
|
10
|
+
multiple?: boolean;
|
|
11
|
+
maxFiles?: number;
|
|
12
|
+
/** Per-file cap, in bytes. */
|
|
13
|
+
maxSize?: number;
|
|
14
|
+
/** Walk dropped folders recursively (Chromium/WebKit). */
|
|
15
|
+
recursive?: boolean;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
onReject?: (rejections: FileRejection[]) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The headless half of `<DropZone>`: drag state, the click-to-browse input, and
|
|
21
|
+
* validation. Spread `rootProps` on any element to make it a drop target.
|
|
22
|
+
*
|
|
23
|
+
* Drag events fire for every child element, so the depth counter is what keeps
|
|
24
|
+
* the highlight from flickering as the pointer crosses them.
|
|
25
|
+
*/
|
|
26
|
+
export declare function useFileDrop({ onFiles, accept, multiple, maxFiles, maxSize, recursive, disabled, onReject, }: UseFileDropOptions): {
|
|
27
|
+
dragging: boolean;
|
|
28
|
+
rootProps: {
|
|
29
|
+
onDragEnter: (e: React.DragEvent) => void;
|
|
30
|
+
onDragOver: (e: React.DragEvent) => void;
|
|
31
|
+
onDragLeave: (e: React.DragEvent) => void;
|
|
32
|
+
onDrop: (e: React.DragEvent) => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
inputProps: {
|
|
35
|
+
ref: React.RefObject<HTMLInputElement | null>;
|
|
36
|
+
type: "file";
|
|
37
|
+
accept: string | undefined;
|
|
38
|
+
multiple: boolean;
|
|
39
|
+
disabled: boolean;
|
|
40
|
+
className: string;
|
|
41
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
42
|
+
};
|
|
43
|
+
open: () => void | undefined;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=use-file-drop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-file-drop.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/use-file-drop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACjC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,MAAM,EACN,QAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAiB,EACjB,QAAgB,EAChB,QAAQ,GACT,EAAE,kBAAkB;;;yBAgCA,KAAK,CAAC,SAAS;wBAMhB,KAAK,CAAC,SAAS;yBAKd,KAAK,CAAC,SAAS;oBAMd,KAAK,CAAC,SAAS;;;;;;;;;sBAoBnB,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;;;EAUpD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as u from "react";
|
|
2
|
+
function A({
|
|
3
|
+
onFiles: r,
|
|
4
|
+
accept: s,
|
|
5
|
+
multiple: a = !0,
|
|
6
|
+
maxFiles: n,
|
|
7
|
+
maxSize: t,
|
|
8
|
+
recursive: y = !1,
|
|
9
|
+
disabled: l = !1,
|
|
10
|
+
onReject: c
|
|
11
|
+
}) {
|
|
12
|
+
const [T, g] = u.useState(!1), p = u.useRef(0), w = u.useRef(null), D = u.useMemo(() => E(s), [s]), d = u.useCallback(
|
|
13
|
+
(e) => {
|
|
14
|
+
const f = [], o = [];
|
|
15
|
+
for (const i of e)
|
|
16
|
+
L(i, D) ? t != null && i.size > t ? o.push({ file: i, reason: "size" }) : n != null && f.length >= n ? o.push({ file: i, reason: "count" }) : !a && f.length >= 1 ? o.push({ file: i, reason: "count" }) : f.push(i) : o.push({ file: i, reason: "type" });
|
|
17
|
+
o.length && (c == null || c(o)), f.length && r(f);
|
|
18
|
+
},
|
|
19
|
+
[D, n, t, a, r, c]
|
|
20
|
+
), m = () => {
|
|
21
|
+
p.current = 0, g(!1);
|
|
22
|
+
}, C = {
|
|
23
|
+
onDragEnter: (e) => {
|
|
24
|
+
l || !h(e.dataTransfer) || (e.preventDefault(), p.current += 1, g(!0));
|
|
25
|
+
},
|
|
26
|
+
onDragOver: (e) => {
|
|
27
|
+
l || !h(e.dataTransfer) || (e.preventDefault(), e.dataTransfer.dropEffect = "copy");
|
|
28
|
+
},
|
|
29
|
+
onDragLeave: (e) => {
|
|
30
|
+
l || !h(e.dataTransfer) || (e.preventDefault(), p.current -= 1, p.current <= 0 && m());
|
|
31
|
+
},
|
|
32
|
+
onDrop: async (e) => {
|
|
33
|
+
if (l || !h(e.dataTransfer)) return;
|
|
34
|
+
e.preventDefault(), m();
|
|
35
|
+
const f = [...e.dataTransfer.files], o = y ? await W(e.dataTransfer.items) : [];
|
|
36
|
+
d(o.length > 0 ? o : f);
|
|
37
|
+
}
|
|
38
|
+
}, P = {
|
|
39
|
+
ref: w,
|
|
40
|
+
type: "file",
|
|
41
|
+
accept: s,
|
|
42
|
+
multiple: a,
|
|
43
|
+
disabled: l,
|
|
44
|
+
className: "hidden",
|
|
45
|
+
onChange: (e) => {
|
|
46
|
+
d([...e.target.files ?? []]), e.target.value = "";
|
|
47
|
+
}
|
|
48
|
+
}, v = u.useCallback(() => {
|
|
49
|
+
var e;
|
|
50
|
+
return (e = w.current) == null ? void 0 : e.click();
|
|
51
|
+
}, []);
|
|
52
|
+
return { dragging: T, rootProps: C, inputProps: P, open: v };
|
|
53
|
+
}
|
|
54
|
+
function h(r) {
|
|
55
|
+
return !!r && Array.from(r.types ?? []).includes("Files");
|
|
56
|
+
}
|
|
57
|
+
function E(r) {
|
|
58
|
+
return r ? r.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean) : [];
|
|
59
|
+
}
|
|
60
|
+
function L(r, s) {
|
|
61
|
+
if (s.length === 0) return !0;
|
|
62
|
+
const a = r.type.toLowerCase(), n = r.name.toLowerCase();
|
|
63
|
+
return s.some(
|
|
64
|
+
(t) => t.startsWith(".") ? n.endsWith(t) : t.endsWith("/*") ? a.startsWith(t.slice(0, -1)) : a === t
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
async function W(r) {
|
|
68
|
+
const s = [...r].map((n) => {
|
|
69
|
+
var t;
|
|
70
|
+
return (t = n.webkitGetAsEntry) == null ? void 0 : t.call(n);
|
|
71
|
+
}).filter(Boolean);
|
|
72
|
+
if (s.length === 0) return [];
|
|
73
|
+
const a = [];
|
|
74
|
+
return await Promise.all(s.map((n) => k(n, a))), a;
|
|
75
|
+
}
|
|
76
|
+
async function k(r, s) {
|
|
77
|
+
if (r.isFile) {
|
|
78
|
+
const n = await new Promise(
|
|
79
|
+
(t) => r.file(t, () => t(null))
|
|
80
|
+
);
|
|
81
|
+
n && s.push(n);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!r.isDirectory) return;
|
|
85
|
+
const a = r.createReader();
|
|
86
|
+
for (; ; ) {
|
|
87
|
+
const n = await new Promise(
|
|
88
|
+
(t) => a.readEntries(t, () => t([]))
|
|
89
|
+
);
|
|
90
|
+
if (n.length === 0) return;
|
|
91
|
+
await Promise.all(n.map((t) => k(t, s)));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
A as useFileDrop
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=use-file-drop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-file-drop.js","sources":["../../../src/components/drop-zone/use-file-drop.ts"],"sourcesContent":["import * as React from 'react';\n\nexport interface FileRejection {\n file: File;\n reason: 'type' | 'size' | 'count';\n}\n\nexport interface UseFileDropOptions {\n onFiles: (files: File[]) => void;\n /** Same syntax as `<input accept>`: `image/*,.glb`. */\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n /** Per-file cap, in bytes. */\n maxSize?: number;\n /** Walk dropped folders recursively (Chromium/WebKit). */\n recursive?: boolean;\n disabled?: boolean;\n onReject?: (rejections: FileRejection[]) => void;\n}\n\n/**\n * The headless half of `<DropZone>`: drag state, the click-to-browse input, and\n * validation. Spread `rootProps` on any element to make it a drop target.\n *\n * Drag events fire for every child element, so the depth counter is what keeps\n * the highlight from flickering as the pointer crosses them.\n */\nexport function useFileDrop({\n onFiles,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n recursive = false,\n disabled = false,\n onReject,\n}: UseFileDropOptions) {\n const [dragging, setDragging] = React.useState(false);\n const depth = React.useRef(0);\n const input = React.useRef<HTMLInputElement>(null);\n\n const accepts = React.useMemo(() => parseAccept(accept), [accept]);\n\n const take = React.useCallback(\n (list: File[]) => {\n const kept: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of list) {\n if (!matches(file, accepts)) rejected.push({ file, reason: 'type' });\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, reason: 'size' });\n else if (maxFiles != null && kept.length >= maxFiles) rejected.push({ file, reason: 'count' });\n else if (!multiple && kept.length >= 1) rejected.push({ file, reason: 'count' });\n else kept.push(file);\n }\n\n if (rejected.length) onReject?.(rejected);\n if (kept.length) onFiles(kept);\n },\n [accepts, maxFiles, maxSize, multiple, onFiles, onReject],\n );\n\n const reset = () => {\n depth.current = 0;\n setDragging(false);\n };\n\n const rootProps = {\n onDragEnter: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n depth.current += 1;\n setDragging(true);\n },\n onDragOver: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n },\n onDragLeave: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n depth.current -= 1;\n if (depth.current <= 0) reset();\n },\n onDrop: async (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n reset();\n // Read the flat list up front: the DataTransfer is dead once we await.\n const plain = [...e.dataTransfer.files];\n // The entries API is the only way to see inside a dropped folder, but it\n // is non-standard — where it gives us nothing, take the flat list.\n const walked = recursive ? await walkItems(e.dataTransfer.items) : [];\n take(walked.length > 0 ? walked : plain);\n },\n };\n\n const inputProps = {\n ref: input,\n type: 'file' as const,\n accept,\n multiple,\n disabled,\n className: 'hidden',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n take([...(e.target.files ?? [])]);\n e.target.value = ''; // so picking the same file twice fires again\n },\n };\n\n /** Open the OS file picker. */\n const open = React.useCallback(() => input.current?.click(), []);\n\n return { dragging, rootProps, inputProps, open };\n}\n\n/**\n * A drag only concerns us when it carries files. Text dragged from elsewhere on\n * the page reports no `Files` type, and must be left alone so it can still drop\n * into whatever the zone wraps (a textarea, say).\n */\nfunction isFileDrag(dt: DataTransfer | null): boolean {\n return !!dt && Array.from(dt.types ?? []).includes('Files');\n}\n\nfunction parseAccept(accept?: string): string[] {\n return accept\n ? accept\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean)\n : [];\n}\n\nfunction matches(file: File, accepts: string[]): boolean {\n if (accepts.length === 0) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n return accepts.some((a) =>\n a.startsWith('.')\n ? name.endsWith(a)\n : a.endsWith('/*')\n ? type.startsWith(a.slice(0, -1))\n : type === a,\n );\n}\n\n/* ─── Folder drops ────────────────────────────────────────────────────────────\n * `dataTransfer.files` flattens a dropped folder to nothing. The entries API is\n * the only way to read one, and it is non-standard — hence the `any`s and the\n * silent bail on browsers that lack it.\n */\nasync function walkItems(items: DataTransferItemList): Promise<File[]> {\n const entries = [...items]\n .map((item) => (item as any).webkitGetAsEntry?.())\n .filter(Boolean);\n if (entries.length === 0) return [];\n\n const out: File[] = [];\n await Promise.all(entries.map((entry: any) => walk(entry, out)));\n return out;\n}\n\nasync function walk(entry: any, out: File[]): Promise<void> {\n if (entry.isFile) {\n const file = await new Promise<File | null>((resolve) =>\n entry.file(resolve, () => resolve(null)),\n );\n if (file) out.push(file);\n return;\n }\n if (!entry.isDirectory) return;\n\n const reader = entry.createReader();\n // readEntries pages at ~100 entries — keep reading until it returns nothing.\n for (;;) {\n const batch: any[] = await new Promise((resolve) =>\n reader.readEntries(resolve, () => resolve([])),\n );\n if (batch.length === 0) return;\n await Promise.all(batch.map((child) => walk(child, out)));\n }\n}\n"],"names":["useFileDrop","onFiles","accept","multiple","maxFiles","maxSize","recursive","disabled","onReject","dragging","setDragging","React","depth","input","accepts","parseAccept","take","list","kept","rejected","file","matches","reset","rootProps","isFileDrag","plain","walked","walkItems","inputProps","open","_a","dt","type","name","a","items","entries","item","out","entry","walk","resolve","reader","batch","child"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { UseElementPickerOptions } from './use-element-picker';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
type View = 'preview' | 'html' | 'parsed';
|
|
4
|
+
export interface ElementPickerFieldProps extends UseElementPickerOptions {
|
|
5
|
+
/** Field label. */
|
|
6
|
+
label?: React.ReactNode;
|
|
7
|
+
/** Small print under the label. */
|
|
8
|
+
hint?: React.ReactNode;
|
|
9
|
+
/** Text on the trigger while idle. */
|
|
10
|
+
pickLabel?: string;
|
|
11
|
+
/** Shown when nothing is selected yet. */
|
|
12
|
+
emptyLabel?: React.ReactNode;
|
|
13
|
+
/** Which detail tab a card opens on. Default `parsed`. */
|
|
14
|
+
defaultView?: View;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The element picker as a form input: a trigger that arms the page, and a list
|
|
19
|
+
* of what you selected — each with a live thumbnail, its formatted HTML, and
|
|
20
|
+
* the parse (text, kind, hierarchy, attributes, computed styles) laid out for
|
|
21
|
+
* reading. Hovering a card spotlights the element back in the page.
|
|
22
|
+
*
|
|
23
|
+
* The value is `PickedElement[]`; `info` on each is plain data, so
|
|
24
|
+
* `JSON.stringify(picked.map((p) => p.info))` is a ready-made payload — which
|
|
25
|
+
* is the point: this is how you let someone hand an LLM, a scraper or a bug
|
|
26
|
+
* report the exact bits of a page they mean.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ElementPickerField({ label, hint, pickLabel, emptyLabel, defaultView, className, ...options }: ElementPickerFieldProps): React.JSX.Element;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=element-picker-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-picker-field.d.ts","sourceRoot":"","sources":["../../../src/components/element-picker/element-picker-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAiBtF,KAAK,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAkQ1C,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,mBAAmB;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAuB,EACvB,IAAI,EACJ,SAA2B,EAC3B,UAAmC,EACnC,WAAsB,EACtB,SAAS,EACT,GAAG,OAAO,EACX,EAAE,uBAAuB,qBA+DzB"}
|