@mieweb/ui 0.6.1-dev.125 → 0.6.1-dev.131
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/dist/brands/index.cjs +12 -12
- package/dist/brands/index.js +3 -3
- package/dist/{chunk-MPOWJVV4.js → chunk-3OHVUXDG.js} +3 -3
- package/dist/{chunk-MPOWJVV4.js.map → chunk-3OHVUXDG.js.map} +1 -1
- package/dist/chunk-44CK4CT2.cjs +336 -0
- package/dist/chunk-44CK4CT2.cjs.map +1 -0
- package/dist/chunk-4LVPQ44A.js +228 -0
- package/dist/chunk-4LVPQ44A.js.map +1 -0
- package/dist/chunk-7XUN3OQT.js +3 -0
- package/dist/{chunk-V2DF2GUE.js.map → chunk-7XUN3OQT.js.map} +1 -1
- package/dist/chunk-AEGYWRSL.js +513 -0
- package/dist/chunk-AEGYWRSL.js.map +1 -0
- package/dist/chunk-AFKKJEV5.cjs +72 -0
- package/dist/chunk-AFKKJEV5.cjs.map +1 -0
- package/dist/chunk-AT732HC6.cjs +4 -0
- package/dist/{chunk-74K3RRU7.cjs.map → chunk-AT732HC6.cjs.map} +1 -1
- package/dist/chunk-BIT27PPD.js +49 -0
- package/dist/chunk-BIT27PPD.js.map +1 -0
- package/dist/chunk-BT3ZQJGT.cjs +130 -0
- package/dist/chunk-BT3ZQJGT.cjs.map +1 -0
- package/dist/chunk-BX6BTDTR.js +34 -0
- package/dist/chunk-BX6BTDTR.js.map +1 -0
- package/dist/chunk-C2544GKZ.js +313 -0
- package/dist/chunk-C2544GKZ.js.map +1 -0
- package/dist/chunk-C7RVKV25.cjs +25 -0
- package/dist/chunk-C7RVKV25.cjs.map +1 -0
- package/dist/{chunk-CV4CVGLO.cjs → chunk-DFT7TYKL.cjs} +3 -3
- package/dist/{chunk-CV4CVGLO.cjs.map → chunk-DFT7TYKL.cjs.map} +1 -1
- package/dist/chunk-DLNJLCNO.cjs +101 -0
- package/dist/chunk-DLNJLCNO.cjs.map +1 -0
- package/dist/chunk-DUPR6FEL.js +43 -0
- package/dist/chunk-DUPR6FEL.js.map +1 -0
- package/dist/chunk-EJUPJGKA.js +78 -0
- package/dist/chunk-EJUPJGKA.js.map +1 -0
- package/dist/chunk-ERLPVXOV.js +22 -0
- package/dist/chunk-ERLPVXOV.js.map +1 -0
- package/dist/chunk-KJ5BSGEO.cjs +258 -0
- package/dist/chunk-KJ5BSGEO.cjs.map +1 -0
- package/dist/chunk-MARLXJQO.cjs +537 -0
- package/dist/chunk-MARLXJQO.cjs.map +1 -0
- package/dist/{chunk-WFS6R2F5.js → chunk-OVQKCUTZ.js} +3 -3
- package/dist/{chunk-WFS6R2F5.js.map → chunk-OVQKCUTZ.js.map} +1 -1
- package/dist/chunk-OXYFTCRW.cjs +57 -0
- package/dist/chunk-OXYFTCRW.cjs.map +1 -0
- package/dist/chunk-PI3KOYAT.js +192 -0
- package/dist/chunk-PI3KOYAT.js.map +1 -0
- package/dist/chunk-QKAPKIXI.cjs +80 -0
- package/dist/chunk-QKAPKIXI.cjs.map +1 -0
- package/dist/{chunk-MV337VA7.js → chunk-R6PBBPU3.js} +2 -2
- package/dist/{chunk-MV337VA7.js.map → chunk-R6PBBPU3.js.map} +1 -1
- package/dist/chunk-ROXYP3BZ.cjs +214 -0
- package/dist/chunk-ROXYP3BZ.cjs.map +1 -0
- package/dist/chunk-T3C4RNJ4.js +106 -0
- package/dist/chunk-T3C4RNJ4.js.map +1 -0
- package/dist/{chunk-7BARESXI.cjs → chunk-ULF4PWHW.cjs} +3 -3
- package/dist/{chunk-7BARESXI.cjs.map → chunk-ULF4PWHW.cjs.map} +1 -1
- package/dist/chunk-UOOH356R.cjs +66 -0
- package/dist/chunk-UOOH356R.cjs.map +1 -0
- package/dist/chunk-Y2S6QMKU.js +78 -0
- package/dist/chunk-Y2S6QMKU.js.map +1 -0
- package/dist/{chunk-JLQTPLSY.cjs → chunk-Z6NRP4Z5.cjs} +2 -2
- package/dist/{chunk-JLQTPLSY.cjs.map → chunk-Z6NRP4Z5.cjs.map} +1 -1
- package/dist/components/AlertDialog/index.cjs +18 -0
- package/dist/components/AlertDialog/index.cjs.map +1 -0
- package/dist/components/AlertDialog/index.d.cts +56 -0
- package/dist/components/AlertDialog/index.d.ts +56 -0
- package/dist/components/AlertDialog/index.js +9 -0
- package/dist/components/AlertDialog/index.js.map +1 -0
- package/dist/components/Autocomplete/index.cjs +15 -0
- package/dist/components/Autocomplete/index.cjs.map +1 -0
- package/dist/components/Autocomplete/index.d.cts +77 -0
- package/dist/components/Autocomplete/index.d.ts +77 -0
- package/dist/components/Autocomplete/index.js +6 -0
- package/dist/components/Autocomplete/index.js.map +1 -0
- package/dist/components/Collapsible/index.cjs +21 -0
- package/dist/components/Collapsible/index.cjs.map +1 -0
- package/dist/components/Collapsible/index.d.cts +33 -0
- package/dist/components/Collapsible/index.d.ts +33 -0
- package/dist/components/Collapsible/index.js +4 -0
- package/dist/components/Collapsible/index.js.map +1 -0
- package/dist/components/CountryCodeDropdown/index.cjs +5 -5
- package/dist/components/CountryCodeDropdown/index.js +2 -2
- package/dist/components/Dropdown/index.cjs +8 -8
- package/dist/components/Dropdown/index.js +2 -2
- package/dist/components/FloatingWindow/index.cjs +18 -0
- package/dist/components/FloatingWindow/index.cjs.map +1 -0
- package/dist/components/FloatingWindow/index.d.cts +64 -0
- package/dist/components/FloatingWindow/index.d.ts +64 -0
- package/dist/components/FloatingWindow/index.js +5 -0
- package/dist/components/FloatingWindow/index.js.map +1 -0
- package/dist/components/Label/index.cjs +17 -0
- package/dist/components/Label/index.cjs.map +1 -0
- package/dist/components/Label/index.d.cts +23 -0
- package/dist/components/Label/index.d.ts +23 -0
- package/dist/components/Label/index.js +4 -0
- package/dist/components/Label/index.js.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +32 -0
- package/dist/components/RichTextEditor/index.cjs.map +1 -0
- package/dist/components/RichTextEditor/index.d.cts +62 -0
- package/dist/components/RichTextEditor/index.d.ts +62 -0
- package/dist/components/RichTextEditor/index.js +11 -0
- package/dist/components/RichTextEditor/index.js.map +1 -0
- package/dist/components/ScrollArea/index.cjs +17 -0
- package/dist/components/ScrollArea/index.cjs.map +1 -0
- package/dist/components/ScrollArea/index.d.cts +22 -0
- package/dist/components/ScrollArea/index.d.ts +22 -0
- package/dist/components/ScrollArea/index.js +4 -0
- package/dist/components/ScrollArea/index.js.map +1 -0
- package/dist/components/Separator/index.cjs +17 -0
- package/dist/components/Separator/index.cjs.map +1 -0
- package/dist/components/Separator/index.d.cts +27 -0
- package/dist/components/Separator/index.d.ts +27 -0
- package/dist/components/Separator/index.js +4 -0
- package/dist/components/Separator/index.js.map +1 -0
- package/dist/components/Sheet/index.cjs +48 -0
- package/dist/components/Sheet/index.cjs.map +1 -0
- package/dist/components/Sheet/index.d.cts +62 -0
- package/dist/components/Sheet/index.d.ts +62 -0
- package/dist/components/Sheet/index.js +7 -0
- package/dist/components/Sheet/index.js.map +1 -0
- package/dist/components/Toggle/index.cjs +17 -0
- package/dist/components/Toggle/index.cjs.map +1 -0
- package/dist/components/Toggle/index.d.cts +28 -0
- package/dist/components/Toggle/index.d.ts +28 -0
- package/dist/components/Toggle/index.js +4 -0
- package/dist/components/Toggle/index.js.map +1 -0
- package/dist/hooks/index.cjs +5 -5
- package/dist/hooks/index.js +1 -1
- package/dist/html-MdxqSzjD.d.cts +13 -0
- package/dist/html-MdxqSzjD.d.ts +13 -0
- package/dist/index.cjs +352 -225
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +43 -32
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.cjs +27 -18
- package/dist/utils/index.d.cts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -2
- package/package.json +2 -2
- package/dist/chunk-74K3RRU7.cjs +0 -4
- package/dist/chunk-V2DF2GUE.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ScrollArea/ScrollArea.tsx"],"names":["cva","React","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAM,kBAAA,GAAqBA,0BAAA;AAAA,EACzB;AAAA,IACE,wBAAA;AAAA;AAAA,IAEA,wBAAA;AAAA,IACA,kDAAA;AAAA,IACA,uDAAA;AAAA,IACA,6CAAA;AAAA,IACA,2CAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,WAAA,EAAa;AAAA,QACX,QAAA,EAAU,mCAAA;AAAA,QACV,UAAA,EAAY,mCAAA;AAAA,QACZ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,WAAA,EAAa;AAAA;AACf;AAEJ;AAkBA,IAAM,UAAA,GAAmBC,gBAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,KAAA,IAAS,GAAA,qBAC/CC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,WAAWC,oBAAA,CAAG,kBAAA,CAAmB,EAAE,WAAA,EAAa,GAAG,SAAS,CAAA;AAAA,MAC3D,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA;AAGP;AAGA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-AFKKJEV5.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst scrollAreaVariants = cva(\n [\n 'relative overflow-auto',\n // Thin, theme-aware scrollbars\n '[scrollbar-width:thin]',\n '[scrollbar-color:hsl(var(--border))_transparent]',\n '[&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar]:h-2',\n '[&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full',\n '[&::-webkit-scrollbar-thumb]:bg-border',\n 'hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/40',\n ],\n {\n variants: {\n orientation: {\n vertical: 'overflow-x-hidden overflow-y-auto',\n horizontal: 'overflow-x-auto overflow-y-hidden',\n both: 'overflow-auto',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n }\n);\n\nexport interface ScrollAreaProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof scrollAreaVariants> {}\n\n/**\n * A scrollable container with consistent, theme-aware scrollbar styling.\n *\n * @example\n * ```tsx\n * <ScrollArea className=\"h-64\">\n * <LongContent />\n * </ScrollArea>\n * ```\n */\n/* eslint-disable jsx-a11y/no-noninteractive-tabindex */\nconst ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ className, orientation, children, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"scroll-area\"\n role=\"region\"\n tabIndex={0}\n className={cn(scrollAreaVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n/* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n\nScrollArea.displayName = 'ScrollArea';\n\nexport { ScrollArea, scrollAreaVariants };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-AT732HC6.cjs"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { cn } from './chunk-F3SOEIN2.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var scrollAreaVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"relative overflow-auto",
|
|
9
|
+
// Thin, theme-aware scrollbars
|
|
10
|
+
"[scrollbar-width:thin]",
|
|
11
|
+
"[scrollbar-color:hsl(var(--border))_transparent]",
|
|
12
|
+
"[&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar]:h-2",
|
|
13
|
+
"[&::-webkit-scrollbar-track]:bg-transparent",
|
|
14
|
+
"[&::-webkit-scrollbar-thumb]:rounded-full",
|
|
15
|
+
"[&::-webkit-scrollbar-thumb]:bg-border",
|
|
16
|
+
"hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/40"
|
|
17
|
+
],
|
|
18
|
+
{
|
|
19
|
+
variants: {
|
|
20
|
+
orientation: {
|
|
21
|
+
vertical: "overflow-x-hidden overflow-y-auto",
|
|
22
|
+
horizontal: "overflow-x-auto overflow-y-hidden",
|
|
23
|
+
both: "overflow-auto"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
orientation: "vertical"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
var ScrollArea = React.forwardRef(
|
|
32
|
+
({ className, orientation, children, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
ref,
|
|
36
|
+
"data-slot": "scroll-area",
|
|
37
|
+
role: "region",
|
|
38
|
+
tabIndex: 0,
|
|
39
|
+
className: cn(scrollAreaVariants({ orientation }), className),
|
|
40
|
+
...props,
|
|
41
|
+
children
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
ScrollArea.displayName = "ScrollArea";
|
|
46
|
+
|
|
47
|
+
export { ScrollArea, scrollAreaVariants };
|
|
48
|
+
//# sourceMappingURL=chunk-BIT27PPD.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-BIT27PPD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ScrollArea/ScrollArea.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,kBAAA,GAAqB,GAAA;AAAA,EACzB;AAAA,IACE,wBAAA;AAAA;AAAA,IAEA,wBAAA;AAAA,IACA,kDAAA;AAAA,IACA,uDAAA;AAAA,IACA,6CAAA;AAAA,IACA,2CAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,WAAA,EAAa;AAAA,QACX,QAAA,EAAU,mCAAA;AAAA,QACV,UAAA,EAAY,mCAAA;AAAA,QACZ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,WAAA,EAAa;AAAA;AACf;AAEJ;AAkBA,IAAM,UAAA,GAAmB,KAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,WAAA,EAAa,UAAU,GAAG,KAAA,IAAS,GAAA,qBAC/C,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,WAAW,EAAA,CAAG,kBAAA,CAAmB,EAAE,WAAA,EAAa,GAAG,SAAS,CAAA;AAAA,MAC3D,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA;AAGP;AAGA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-BIT27PPD.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst scrollAreaVariants = cva(\n [\n 'relative overflow-auto',\n // Thin, theme-aware scrollbars\n '[scrollbar-width:thin]',\n '[scrollbar-color:hsl(var(--border))_transparent]',\n '[&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar]:h-2',\n '[&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full',\n '[&::-webkit-scrollbar-thumb]:bg-border',\n 'hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/40',\n ],\n {\n variants: {\n orientation: {\n vertical: 'overflow-x-hidden overflow-y-auto',\n horizontal: 'overflow-x-auto overflow-y-hidden',\n both: 'overflow-auto',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n }\n);\n\nexport interface ScrollAreaProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof scrollAreaVariants> {}\n\n/**\n * A scrollable container with consistent, theme-aware scrollbar styling.\n *\n * @example\n * ```tsx\n * <ScrollArea className=\"h-64\">\n * <LongContent />\n * </ScrollArea>\n * ```\n */\n/* eslint-disable jsx-a11y/no-noninteractive-tabindex */\nconst ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ className, orientation, children, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"scroll-area\"\n role=\"region\"\n tabIndex={0}\n className={cn(scrollAreaVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n/* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n\nScrollArea.displayName = 'ScrollArea';\n\nexport { ScrollArea, scrollAreaVariants };\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkOR5DRJCW_cjs = require('./chunk-OR5DRJCW.cjs');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
|
+
|
|
27
|
+
var CollapsibleContext = React__namespace.createContext(
|
|
28
|
+
null
|
|
29
|
+
);
|
|
30
|
+
function useCollapsibleContext(component) {
|
|
31
|
+
const ctx = React__namespace.useContext(CollapsibleContext);
|
|
32
|
+
if (!ctx) {
|
|
33
|
+
throw new Error(`${component} must be used within a <Collapsible>`);
|
|
34
|
+
}
|
|
35
|
+
return ctx;
|
|
36
|
+
}
|
|
37
|
+
var Collapsible = React__namespace.forwardRef(
|
|
38
|
+
({
|
|
39
|
+
className,
|
|
40
|
+
open: controlledOpen,
|
|
41
|
+
defaultOpen = false,
|
|
42
|
+
onOpenChange,
|
|
43
|
+
disabled,
|
|
44
|
+
children,
|
|
45
|
+
...props
|
|
46
|
+
}, ref) => {
|
|
47
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React__namespace.useState(defaultOpen);
|
|
48
|
+
const generatedId = React__namespace.useId();
|
|
49
|
+
const isControlled = controlledOpen !== void 0;
|
|
50
|
+
const open = isControlled ? controlledOpen : uncontrolledOpen;
|
|
51
|
+
const toggle = React__namespace.useCallback(() => {
|
|
52
|
+
if (disabled) return;
|
|
53
|
+
const next = !open;
|
|
54
|
+
if (!isControlled) setUncontrolledOpen(next);
|
|
55
|
+
onOpenChange?.(next);
|
|
56
|
+
}, [disabled, open, isControlled, onOpenChange]);
|
|
57
|
+
const value = React__namespace.useMemo(
|
|
58
|
+
() => ({
|
|
59
|
+
open,
|
|
60
|
+
toggle,
|
|
61
|
+
disabled,
|
|
62
|
+
contentId: `${generatedId}-content`,
|
|
63
|
+
triggerId: `${generatedId}-trigger`
|
|
64
|
+
}),
|
|
65
|
+
[open, toggle, disabled, generatedId]
|
|
66
|
+
);
|
|
67
|
+
return /* @__PURE__ */ jsxRuntime.jsx(CollapsibleContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
ref,
|
|
71
|
+
"data-slot": "collapsible",
|
|
72
|
+
"data-state": open ? "open" : "closed",
|
|
73
|
+
className: chunkOR5DRJCW_cjs.cn(className),
|
|
74
|
+
...props,
|
|
75
|
+
children
|
|
76
|
+
}
|
|
77
|
+
) });
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
Collapsible.displayName = "Collapsible";
|
|
81
|
+
var CollapsibleTrigger = React__namespace.forwardRef(({ className, onClick, children, ...props }, ref) => {
|
|
82
|
+
const { open, toggle, disabled, contentId, triggerId } = useCollapsibleContext("CollapsibleTrigger");
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
84
|
+
"button",
|
|
85
|
+
{
|
|
86
|
+
ref,
|
|
87
|
+
type: "button",
|
|
88
|
+
id: triggerId,
|
|
89
|
+
"data-slot": "collapsible-trigger",
|
|
90
|
+
"aria-expanded": open,
|
|
91
|
+
"aria-controls": contentId,
|
|
92
|
+
"data-state": open ? "open" : "closed",
|
|
93
|
+
disabled,
|
|
94
|
+
onClick: (e) => {
|
|
95
|
+
toggle();
|
|
96
|
+
onClick?.(e);
|
|
97
|
+
},
|
|
98
|
+
className: chunkOR5DRJCW_cjs.cn(className),
|
|
99
|
+
...props,
|
|
100
|
+
children
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
CollapsibleTrigger.displayName = "CollapsibleTrigger";
|
|
105
|
+
var CollapsibleContent = React__namespace.forwardRef(({ className, forceMount, children, ...props }, ref) => {
|
|
106
|
+
const { open, contentId, triggerId } = useCollapsibleContext("CollapsibleContent");
|
|
107
|
+
if (!open && !forceMount) return null;
|
|
108
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
109
|
+
"div",
|
|
110
|
+
{
|
|
111
|
+
ref,
|
|
112
|
+
id: contentId,
|
|
113
|
+
role: "region",
|
|
114
|
+
"aria-labelledby": triggerId,
|
|
115
|
+
"data-slot": "collapsible-content",
|
|
116
|
+
"data-state": open ? "open" : "closed",
|
|
117
|
+
hidden: !open,
|
|
118
|
+
className: chunkOR5DRJCW_cjs.cn(className),
|
|
119
|
+
...props,
|
|
120
|
+
children
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
CollapsibleContent.displayName = "CollapsibleContent";
|
|
125
|
+
|
|
126
|
+
exports.Collapsible = Collapsible;
|
|
127
|
+
exports.CollapsibleContent = CollapsibleContent;
|
|
128
|
+
exports.CollapsibleTrigger = CollapsibleTrigger;
|
|
129
|
+
//# sourceMappingURL=chunk-BT3ZQJGT.cjs.map
|
|
130
|
+
//# sourceMappingURL=chunk-BT3ZQJGT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Collapsible/Collapsible.tsx"],"names":["React","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,IAAM,kBAAA,GAA2BA,gBAAA,CAAA,aAAA;AAAA,EAC/B;AACF,CAAA;AAEA,SAAS,sBAAsB,SAAA,EAA4C;AACzE,EAAA,MAAM,GAAA,GAAYA,4BAAW,kBAAkB,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,oCAAA,CAAsC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,GAAA;AACT;AAwBA,IAAM,WAAA,GAAoBA,gBAAA,CAAA,UAAA;AAAA,EACxB,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,GAAc,KAAA;AAAA,IACd,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,0BAAS,WAAW,CAAA;AAC1E,IAAA,MAAM,cAAoBA,gBAAA,CAAA,KAAA,EAAM;AAEhC,IAAA,MAAM,eAAe,cAAA,KAAmB,MAAA;AACxC,IAAA,MAAM,IAAA,GAAO,eAAe,cAAA,GAAiB,gBAAA;AAE7C,IAAA,MAAM,MAAA,GAAeA,6BAAY,MAAM;AACrC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,OAAO,CAAC,IAAA;AACd,MAAA,IAAI,CAAC,YAAA,EAAc,mBAAA,CAAoB,IAAI,CAAA;AAC3C,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,GAAG,CAAC,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/C,IAAA,MAAM,KAAA,GAAcA,gBAAA,CAAA,OAAA;AAAA,MAClB,OAAO;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,GAAG,WAAW,CAAA,QAAA,CAAA;AAAA,QACzB,SAAA,EAAW,GAAG,WAAW,CAAA,QAAA;AAAA,OAC3B,CAAA;AAAA,MACA,CAAC,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,WAAW;AAAA,KACtC;AAEA,IAAA,uBACEC,cAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAC3B,QAAA,kBAAAA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,aAAA;AAAA,QACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,QAC5B,SAAA,EAAWC,qBAAG,SAAS,CAAA;AAAA,QACtB,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAK1B,IAAM,kBAAA,GAA2BF,gBAAA,CAAA,UAAA,CAG/B,CAAC,EAAE,SAAA,EAAW,SAAS,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrD,EAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,QAAA,EAAU,WAAW,SAAA,EAAU,GACnD,sBAAsB,oBAAoB,CAAA;AAE5C,EAAA,uBACEC,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,EAAA,EAAI,SAAA;AAAA,MACJ,WAAA,EAAU,qBAAA;AAAA,MACV,eAAA,EAAe,IAAA;AAAA,MACf,eAAA,EAAe,SAAA;AAAA,MACf,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,MAC5B,QAAA;AAAA,MACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,MAAA,EAAO;AACP,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,SAAA,EAAWC,qBAAG,SAAS,CAAA;AAAA,MACtB,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AAOjC,IAAM,kBAAA,GAA2BF,gBAAA,CAAA,UAAA,CAG/B,CAAC,EAAE,SAAA,EAAW,YAAY,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAU,GACjC,sBAAsB,oBAAoB,CAAA;AAE5C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,EAAY,OAAO,IAAA;AAEjC,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAK,QAAA;AAAA,MACL,iBAAA,EAAiB,SAAA;AAAA,MACjB,WAAA,EAAU,qBAAA;AAAA,MACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,MAC5B,QAAQ,CAAC,IAAA;AAAA,MACT,SAAA,EAAWC,qBAAG,SAAS,CAAA;AAAA,MACtB,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,kBAAA,CAAmB,WAAA,GAAc,oBAAA","file":"chunk-BT3ZQJGT.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n disabled?: boolean;\n contentId: string;\n triggerId: string;\n}\n\nconst CollapsibleContext = React.createContext<CollapsibleContextValue | null>(\n null\n);\n\nfunction useCollapsibleContext(component: string): CollapsibleContextValue {\n const ctx = React.useContext(CollapsibleContext);\n if (!ctx) {\n throw new Error(`${component} must be used within a <Collapsible>`);\n }\n return ctx;\n}\n\nexport interface CollapsibleProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback fired when the open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Disables toggling */\n disabled?: boolean;\n}\n\n/**\n * An interactive component that expands and collapses its content.\n *\n * @example\n * ```tsx\n * <Collapsible>\n * <CollapsibleTrigger>Toggle</CollapsibleTrigger>\n * <CollapsibleContent>Hidden content</CollapsibleContent>\n * </Collapsible>\n * ```\n */\nconst Collapsible = React.forwardRef<HTMLDivElement, CollapsibleProps>(\n (\n {\n className,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const generatedId = React.useId();\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n\n const toggle = React.useCallback(() => {\n if (disabled) return;\n const next = !open;\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }, [disabled, open, isControlled, onOpenChange]);\n\n const value = React.useMemo<CollapsibleContextValue>(\n () => ({\n open,\n toggle,\n disabled,\n contentId: `${generatedId}-content`,\n triggerId: `${generatedId}-trigger`,\n }),\n [open, toggle, disabled, generatedId]\n );\n\n return (\n <CollapsibleContext.Provider value={value}>\n <div\n ref={ref}\n data-slot=\"collapsible\"\n data-state={open ? 'open' : 'closed'}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n </CollapsibleContext.Provider>\n );\n }\n);\n\nCollapsible.displayName = 'Collapsible';\n\nexport type CollapsibleTriggerProps =\n React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst CollapsibleTrigger = React.forwardRef<\n HTMLButtonElement,\n CollapsibleTriggerProps\n>(({ className, onClick, children, ...props }, ref) => {\n const { open, toggle, disabled, contentId, triggerId } =\n useCollapsibleContext('CollapsibleTrigger');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n data-slot=\"collapsible-trigger\"\n aria-expanded={open}\n aria-controls={contentId}\n data-state={open ? 'open' : 'closed'}\n disabled={disabled}\n onClick={(e) => {\n toggle();\n onClick?.(e);\n }}\n className={cn(className)}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Keep content mounted when collapsed (hidden via CSS) */\n forceMount?: boolean;\n}\n\nconst CollapsibleContent = React.forwardRef<\n HTMLDivElement,\n CollapsibleContentProps\n>(({ className, forceMount, children, ...props }, ref) => {\n const { open, contentId, triggerId } =\n useCollapsibleContext('CollapsibleContent');\n\n if (!open && !forceMount) return null;\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n data-slot=\"collapsible-content\"\n data-state={open ? 'open' : 'closed'}\n hidden={!open}\n className={cn(className)}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nCollapsibleContent.displayName = 'CollapsibleContent';\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { cn } from './chunk-F3SOEIN2.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var separatorVariants = cva("shrink-0 bg-border", {
|
|
7
|
+
variants: {
|
|
8
|
+
orientation: {
|
|
9
|
+
horizontal: "h-px w-full",
|
|
10
|
+
vertical: "h-full w-px"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
defaultVariants: {
|
|
14
|
+
orientation: "horizontal"
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
var Separator = React.forwardRef(
|
|
18
|
+
({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
ref,
|
|
22
|
+
"data-slot": "separator",
|
|
23
|
+
role: decorative ? "none" : "separator",
|
|
24
|
+
"aria-orientation": decorative ? void 0 : orientation ?? "horizontal",
|
|
25
|
+
className: cn(separatorVariants({ orientation }), className),
|
|
26
|
+
...props
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
Separator.displayName = "Separator";
|
|
31
|
+
|
|
32
|
+
export { Separator, separatorVariants };
|
|
33
|
+
//# sourceMappingURL=chunk-BX6BTDTR.js.map
|
|
34
|
+
//# sourceMappingURL=chunk-BX6BTDTR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Separator/Separator.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,iBAAA,GAAoB,IAAI,oBAAA,EAAsB;AAAA,EAClD,QAAA,EAAU;AAAA,IACR,WAAA,EAAa;AAAA,MACX,UAAA,EAAY,aAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,WAAA,EAAa;AAAA;AAEjB,CAAC;AAuBD,IAAM,SAAA,GAAkB,KAAA,CAAA,UAAA;AAAA,EACtB,CACE,EAAE,SAAA,EAAW,WAAA,GAAc,YAAA,EAAc,aAAa,IAAA,EAAM,GAAG,KAAA,EAAM,EACrE,GAAA,qBAEA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,WAAA;AAAA,MACV,IAAA,EAAM,aAAa,MAAA,GAAS,WAAA;AAAA,MAC5B,kBAAA,EAAkB,UAAA,GAAa,MAAA,GAAa,WAAA,IAAe,YAAA;AAAA,MAC3D,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,WAAA,EAAa,GAAG,SAAS,CAAA;AAAA,MAC1D,GAAG;AAAA;AAAA;AAGV;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-BX6BTDTR.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst separatorVariants = cva('shrink-0 bg-border', {\n variants: {\n orientation: {\n horizontal: 'h-px w-full',\n vertical: 'h-full w-px',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\nexport interface SeparatorProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof separatorVariants> {\n /**\n * Whether the separator is purely decorative. When `true` (default) the\n * separator is hidden from assistive technologies. Set to `false` when the\n * separator conveys meaningful structure.\n */\n decorative?: boolean;\n}\n\n/**\n * A visual or semantic divider between content.\n *\n * @example\n * ```tsx\n * <Separator />\n * <Separator orientation=\"vertical\" />\n * ```\n */\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n data-slot=\"separator\"\n role={decorative ? 'none' : 'separator'}\n aria-orientation={decorative ? undefined : (orientation ?? 'horizontal')}\n className={cn(separatorVariants({ orientation }), className)}\n {...props}\n />\n )\n);\n\nSeparator.displayName = 'Separator';\n\nexport { Separator, separatorVariants };\n"]}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { Button } from './chunk-ZVSW2KS6.js';
|
|
2
|
+
import { cn } from './chunk-F3SOEIN2.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Minus, ExternalLink, X, Square } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var RESIZE_HANDLES = [
|
|
8
|
+
{ dir: "nw", className: "top-0 left-0 h-2 w-2 cursor-nw-resize" },
|
|
9
|
+
{ dir: "ne", className: "top-0 right-0 h-2 w-2 cursor-ne-resize" },
|
|
10
|
+
{ dir: "sw", className: "bottom-0 left-0 h-2 w-2 cursor-sw-resize" },
|
|
11
|
+
{ dir: "n", className: "top-0 left-2 right-2 h-1 cursor-n-resize" },
|
|
12
|
+
{ dir: "s", className: "bottom-0 left-2 right-2 h-1 cursor-s-resize" },
|
|
13
|
+
{ dir: "w", className: "left-0 top-2 bottom-2 w-1 cursor-w-resize" },
|
|
14
|
+
{ dir: "e", className: "right-0 top-2 bottom-2 w-1 cursor-e-resize" }
|
|
15
|
+
];
|
|
16
|
+
var FloatingWindow = React.forwardRef(
|
|
17
|
+
({
|
|
18
|
+
open,
|
|
19
|
+
minimized = false,
|
|
20
|
+
title,
|
|
21
|
+
children,
|
|
22
|
+
footer,
|
|
23
|
+
onClose,
|
|
24
|
+
onMinimize,
|
|
25
|
+
onPopOut,
|
|
26
|
+
draggable = false,
|
|
27
|
+
resizable = true,
|
|
28
|
+
defaultWidth = 1024,
|
|
29
|
+
defaultHeight = 600,
|
|
30
|
+
minWidth = 600,
|
|
31
|
+
minHeight = 400,
|
|
32
|
+
className,
|
|
33
|
+
"aria-label": ariaLabel
|
|
34
|
+
}, ref) => {
|
|
35
|
+
const [size, setSize] = React.useState({
|
|
36
|
+
width: defaultWidth,
|
|
37
|
+
height: defaultHeight
|
|
38
|
+
});
|
|
39
|
+
const [position, setPosition] = React.useState({ x: 50, y: 50 });
|
|
40
|
+
const dragRef = React.useRef(null);
|
|
41
|
+
const resizeRef = React.useRef(null);
|
|
42
|
+
const titleId = React.useId();
|
|
43
|
+
const handleResizeStart = (e, dir) => {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
e.stopPropagation();
|
|
46
|
+
resizeRef.current = {
|
|
47
|
+
dir,
|
|
48
|
+
startX: e.clientX,
|
|
49
|
+
startY: e.clientY,
|
|
50
|
+
startW: size.width,
|
|
51
|
+
startH: size.height,
|
|
52
|
+
startPosX: position.x,
|
|
53
|
+
startPosY: position.y
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
const handleDragStart = (e) => {
|
|
57
|
+
if (!draggable) return;
|
|
58
|
+
if (e.target.closest("[data-window-controls]")) return;
|
|
59
|
+
const rect = e.currentTarget.closest('[data-slot="floating-window"]').getBoundingClientRect();
|
|
60
|
+
dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
|
|
61
|
+
};
|
|
62
|
+
React.useEffect(() => {
|
|
63
|
+
if (!open || minimized) return;
|
|
64
|
+
const handleMouseMove = (e) => {
|
|
65
|
+
if (dragRef.current) {
|
|
66
|
+
setPosition({
|
|
67
|
+
x: e.clientX - dragRef.current.x,
|
|
68
|
+
y: e.clientY - dragRef.current.y
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const r = resizeRef.current;
|
|
73
|
+
if (!r) return;
|
|
74
|
+
const deltaX = e.clientX - r.startX;
|
|
75
|
+
const deltaY = e.clientY - r.startY;
|
|
76
|
+
let newWidth = r.startW;
|
|
77
|
+
let newHeight = r.startH;
|
|
78
|
+
let newX = r.startPosX;
|
|
79
|
+
let newY = r.startPosY;
|
|
80
|
+
if (r.dir.includes("e")) {
|
|
81
|
+
newWidth = Math.max(
|
|
82
|
+
minWidth,
|
|
83
|
+
Math.min(window.innerWidth - 40, r.startW + deltaX)
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
if (r.dir.includes("w")) {
|
|
87
|
+
newWidth = Math.max(minWidth, r.startW - deltaX);
|
|
88
|
+
if (draggable) newX = r.startPosX + (r.startW - newWidth);
|
|
89
|
+
}
|
|
90
|
+
if (r.dir.includes("s")) {
|
|
91
|
+
newHeight = Math.max(
|
|
92
|
+
minHeight,
|
|
93
|
+
Math.min(window.innerHeight - 40, r.startH + deltaY)
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
if (r.dir.includes("n")) {
|
|
97
|
+
newHeight = Math.max(minHeight, r.startH - deltaY);
|
|
98
|
+
if (draggable) newY = r.startPosY + (r.startH - newHeight);
|
|
99
|
+
}
|
|
100
|
+
setSize({ width: newWidth, height: newHeight });
|
|
101
|
+
if (draggable && (r.dir.includes("w") || r.dir.includes("n"))) {
|
|
102
|
+
setPosition({ x: newX, y: newY });
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const handleMouseUp = () => {
|
|
106
|
+
dragRef.current = null;
|
|
107
|
+
resizeRef.current = null;
|
|
108
|
+
};
|
|
109
|
+
document.addEventListener("mousemove", handleMouseMove);
|
|
110
|
+
document.addEventListener("mouseup", handleMouseUp);
|
|
111
|
+
return () => {
|
|
112
|
+
document.removeEventListener("mousemove", handleMouseMove);
|
|
113
|
+
document.removeEventListener("mouseup", handleMouseUp);
|
|
114
|
+
};
|
|
115
|
+
}, [open, minimized, draggable, minWidth, minHeight]);
|
|
116
|
+
if (!open || minimized) return null;
|
|
117
|
+
const windowEl = /* @__PURE__ */ jsxs(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
ref,
|
|
121
|
+
"data-slot": "floating-window",
|
|
122
|
+
role: "dialog",
|
|
123
|
+
"aria-modal": draggable ? void 0 : true,
|
|
124
|
+
"aria-labelledby": typeof title === "string" ? titleId : void 0,
|
|
125
|
+
"aria-label": typeof title === "string" ? void 0 : ariaLabel,
|
|
126
|
+
className: cn(
|
|
127
|
+
"bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl",
|
|
128
|
+
draggable && "border-primary-800 fixed border-2",
|
|
129
|
+
className
|
|
130
|
+
),
|
|
131
|
+
style: draggable ? {
|
|
132
|
+
left: position.x,
|
|
133
|
+
top: position.y,
|
|
134
|
+
width: size.width,
|
|
135
|
+
height: size.height,
|
|
136
|
+
maxWidth: "calc(100vw - 40px)",
|
|
137
|
+
maxHeight: "calc(100vh - 40px)",
|
|
138
|
+
zIndex: 50
|
|
139
|
+
} : {
|
|
140
|
+
width: size.width,
|
|
141
|
+
height: size.height,
|
|
142
|
+
maxWidth: "calc(100vw - 40px)",
|
|
143
|
+
maxHeight: "calc(100vh - 40px)"
|
|
144
|
+
},
|
|
145
|
+
children: [
|
|
146
|
+
resizable && RESIZE_HANDLES.map((handle) => /* @__PURE__ */ jsx(
|
|
147
|
+
"div",
|
|
148
|
+
{
|
|
149
|
+
"aria-hidden": "true",
|
|
150
|
+
className: cn("absolute z-10", handle.className),
|
|
151
|
+
onMouseDown: (e) => handleResizeStart(e, handle.dir)
|
|
152
|
+
},
|
|
153
|
+
handle.dir
|
|
154
|
+
)),
|
|
155
|
+
resizable && /* @__PURE__ */ jsx(
|
|
156
|
+
"div",
|
|
157
|
+
{
|
|
158
|
+
"aria-hidden": "true",
|
|
159
|
+
className: "hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl",
|
|
160
|
+
onMouseDown: (e) => handleResizeStart(e, "se"),
|
|
161
|
+
children: /* @__PURE__ */ jsx(
|
|
162
|
+
"svg",
|
|
163
|
+
{
|
|
164
|
+
className: "text-muted-foreground/50 h-4 w-4",
|
|
165
|
+
viewBox: "0 0 24 24",
|
|
166
|
+
fill: "currentColor",
|
|
167
|
+
children: /* @__PURE__ */ jsx("path", { d: "M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z" })
|
|
168
|
+
}
|
|
169
|
+
)
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
/* @__PURE__ */ jsxs(
|
|
173
|
+
"div",
|
|
174
|
+
{
|
|
175
|
+
"data-slot": "floating-window-header",
|
|
176
|
+
className: cn(
|
|
177
|
+
"bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3",
|
|
178
|
+
draggable && "cursor-move"
|
|
179
|
+
),
|
|
180
|
+
onMouseDown: handleDragStart,
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ jsx(
|
|
183
|
+
"h2",
|
|
184
|
+
{
|
|
185
|
+
id: typeof title === "string" ? titleId : void 0,
|
|
186
|
+
className: "text-lg font-semibold",
|
|
187
|
+
children: title
|
|
188
|
+
}
|
|
189
|
+
),
|
|
190
|
+
/* @__PURE__ */ jsxs("div", { "data-window-controls": true, className: "flex items-center gap-1", children: [
|
|
191
|
+
onMinimize && /* @__PURE__ */ jsx(
|
|
192
|
+
Button,
|
|
193
|
+
{
|
|
194
|
+
type: "button",
|
|
195
|
+
variant: "ghost",
|
|
196
|
+
size: "sm",
|
|
197
|
+
className: "text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0",
|
|
198
|
+
onClick: onMinimize,
|
|
199
|
+
"aria-label": "Minimize",
|
|
200
|
+
title: "Minimize",
|
|
201
|
+
children: /* @__PURE__ */ jsx(Minus, { className: "h-4 w-4" })
|
|
202
|
+
}
|
|
203
|
+
),
|
|
204
|
+
onPopOut && /* @__PURE__ */ jsx(
|
|
205
|
+
Button,
|
|
206
|
+
{
|
|
207
|
+
type: "button",
|
|
208
|
+
variant: "ghost",
|
|
209
|
+
size: "sm",
|
|
210
|
+
className: "text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0",
|
|
211
|
+
onClick: onPopOut,
|
|
212
|
+
"aria-label": "Open in new window",
|
|
213
|
+
title: "Open in new window",
|
|
214
|
+
children: /* @__PURE__ */ jsx(ExternalLink, { className: "h-4 w-4" })
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
/* @__PURE__ */ jsx(
|
|
218
|
+
Button,
|
|
219
|
+
{
|
|
220
|
+
type: "button",
|
|
221
|
+
variant: "ghost",
|
|
222
|
+
size: "sm",
|
|
223
|
+
className: "text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0",
|
|
224
|
+
onClick: onClose,
|
|
225
|
+
"aria-label": "Close",
|
|
226
|
+
title: "Close",
|
|
227
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
] })
|
|
231
|
+
]
|
|
232
|
+
}
|
|
233
|
+
),
|
|
234
|
+
/* @__PURE__ */ jsx(
|
|
235
|
+
"div",
|
|
236
|
+
{
|
|
237
|
+
"data-slot": "floating-window-content",
|
|
238
|
+
role: "region",
|
|
239
|
+
className: "flex-1 overflow-y-auto",
|
|
240
|
+
tabIndex: 0,
|
|
241
|
+
children
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
footer && /* @__PURE__ */ jsx(
|
|
245
|
+
"div",
|
|
246
|
+
{
|
|
247
|
+
"data-slot": "floating-window-footer",
|
|
248
|
+
className: "border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4",
|
|
249
|
+
children: footer
|
|
250
|
+
}
|
|
251
|
+
)
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
);
|
|
255
|
+
if (draggable) return windowEl;
|
|
256
|
+
return /* @__PURE__ */ jsx(
|
|
257
|
+
"div",
|
|
258
|
+
{
|
|
259
|
+
"data-slot": "floating-window-overlay",
|
|
260
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
|
|
261
|
+
children: windowEl
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
);
|
|
266
|
+
FloatingWindow.displayName = "FloatingWindow";
|
|
267
|
+
var MinimizedWindow = React.forwardRef(
|
|
268
|
+
({ title, onRestore, onClose, className }, ref) => /* @__PURE__ */ jsxs(
|
|
269
|
+
"div",
|
|
270
|
+
{
|
|
271
|
+
ref,
|
|
272
|
+
"data-slot": "minimized-window",
|
|
273
|
+
className: cn(
|
|
274
|
+
"border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md",
|
|
275
|
+
className
|
|
276
|
+
),
|
|
277
|
+
children: [
|
|
278
|
+
/* @__PURE__ */ jsxs(
|
|
279
|
+
Button,
|
|
280
|
+
{
|
|
281
|
+
type: "button",
|
|
282
|
+
variant: "ghost",
|
|
283
|
+
size: "sm",
|
|
284
|
+
className: "h-6 px-2",
|
|
285
|
+
onClick: onRestore,
|
|
286
|
+
children: [
|
|
287
|
+
/* @__PURE__ */ jsx(Square, { className: "mr-1 h-3 w-3" }),
|
|
288
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-sm", children: title })
|
|
289
|
+
]
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
/* @__PURE__ */ jsx(
|
|
293
|
+
Button,
|
|
294
|
+
{
|
|
295
|
+
type: "button",
|
|
296
|
+
variant: "ghost",
|
|
297
|
+
size: "sm",
|
|
298
|
+
className: "ml-auto h-6 w-6 p-0",
|
|
299
|
+
onClick: onClose,
|
|
300
|
+
"aria-label": "Close",
|
|
301
|
+
title: "Close",
|
|
302
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
|
|
303
|
+
}
|
|
304
|
+
)
|
|
305
|
+
]
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
);
|
|
309
|
+
MinimizedWindow.displayName = "MinimizedWindow";
|
|
310
|
+
|
|
311
|
+
export { FloatingWindow, MinimizedWindow };
|
|
312
|
+
//# sourceMappingURL=chunk-C2544GKZ.js.map
|
|
313
|
+
//# sourceMappingURL=chunk-C2544GKZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FloatingWindow/FloatingWindow.tsx"],"names":[],"mappings":"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","file":"chunk-C2544GKZ.js","sourcesContent":["import * as React from 'react';\nimport { Minus, Square, ExternalLink, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface FloatingWindowProps {\n /** Whether the window is rendered. */\n open: boolean;\n /** Whether the window is collapsed to a minimized bar (renders nothing). */\n minimized?: boolean;\n /** Window title shown in the header. */\n title: React.ReactNode;\n /** Window body content. */\n children: React.ReactNode;\n /** Footer content, typically action buttons. */\n footer?: React.ReactNode;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Called when the minimize control is activated. Hidden when omitted. */\n onMinimize?: () => void;\n /** Called when the pop-out control is activated. Hidden when omitted. */\n onPopOut?: () => void;\n /**\n * When `true` the window floats at a draggable position. When `false`\n * (default) it is centered over a dimmed overlay like a modal.\n */\n draggable?: boolean;\n /** Whether the window can be resized from its edges/corners. Default true. */\n resizable?: boolean;\n /** Initial width in pixels. Default 1024. */\n defaultWidth?: number;\n /** Initial height in pixels. Default 600. */\n defaultHeight?: number;\n /** Minimum width in pixels. Default 600. */\n minWidth?: number;\n /** Minimum height in pixels. Default 400. */\n minHeight?: number;\n /** Class applied to the window container. */\n className?: string;\n /** Accessible label for the dialog when the title is not text. */\n 'aria-label'?: string;\n}\n\nconst RESIZE_HANDLES: { dir: ResizeDirection; className: string }[] = [\n { dir: 'nw', className: 'top-0 left-0 h-2 w-2 cursor-nw-resize' },\n { dir: 'ne', className: 'top-0 right-0 h-2 w-2 cursor-ne-resize' },\n { dir: 'sw', className: 'bottom-0 left-0 h-2 w-2 cursor-sw-resize' },\n { dir: 'n', className: 'top-0 left-2 right-2 h-1 cursor-n-resize' },\n { dir: 's', className: 'bottom-0 left-2 right-2 h-1 cursor-s-resize' },\n { dir: 'w', className: 'left-0 top-2 bottom-2 w-1 cursor-w-resize' },\n { dir: 'e', className: 'right-0 top-2 bottom-2 w-1 cursor-e-resize' },\n];\n\n/**\n * A presentational floating window shell used for pop-out editors (notes,\n * letters, etc.). It can render as a centered modal-style window or as a\n * draggable, freely-positioned window, and supports edge/corner resizing.\n * Open/minimize/close state and footer actions are controlled via props so it\n * can be wired to any store.\n */\nconst FloatingWindow = React.forwardRef<HTMLDivElement, FloatingWindowProps>(\n (\n {\n open,\n minimized = false,\n title,\n children,\n footer,\n onClose,\n onMinimize,\n onPopOut,\n draggable = false,\n resizable = true,\n defaultWidth = 1024,\n defaultHeight = 600,\n minWidth = 600,\n minHeight = 400,\n className,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const [size, setSize] = React.useState({\n width: defaultWidth,\n height: defaultHeight,\n });\n const [position, setPosition] = React.useState({ x: 50, y: 50 });\n\n const dragRef = React.useRef<{ x: number; y: number } | null>(null);\n const resizeRef = React.useRef<{\n dir: ResizeDirection;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n startPosX: number;\n startPosY: number;\n } | null>(null);\n\n const titleId = React.useId();\n\n const handleResizeStart = (e: React.MouseEvent, dir: ResizeDirection) => {\n e.preventDefault();\n e.stopPropagation();\n resizeRef.current = {\n dir,\n startX: e.clientX,\n startY: e.clientY,\n startW: size.width,\n startH: size.height,\n startPosX: position.x,\n startPosY: position.y,\n };\n };\n\n const handleDragStart = (e: React.MouseEvent) => {\n if (!draggable) return;\n if ((e.target as HTMLElement).closest('[data-window-controls]')) return;\n const rect = (e.currentTarget as HTMLElement)\n .closest('[data-slot=\"floating-window\"]')!\n .getBoundingClientRect();\n dragRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n React.useEffect(() => {\n if (!open || minimized) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (dragRef.current) {\n setPosition({\n x: e.clientX - dragRef.current.x,\n y: e.clientY - dragRef.current.y,\n });\n return;\n }\n const r = resizeRef.current;\n if (!r) return;\n const deltaX = e.clientX - r.startX;\n const deltaY = e.clientY - r.startY;\n let newWidth = r.startW;\n let newHeight = r.startH;\n let newX = r.startPosX;\n let newY = r.startPosY;\n\n if (r.dir.includes('e')) {\n newWidth = Math.max(\n minWidth,\n Math.min(window.innerWidth - 40, r.startW + deltaX)\n );\n }\n if (r.dir.includes('w')) {\n newWidth = Math.max(minWidth, r.startW - deltaX);\n if (draggable) newX = r.startPosX + (r.startW - newWidth);\n }\n if (r.dir.includes('s')) {\n newHeight = Math.max(\n minHeight,\n Math.min(window.innerHeight - 40, r.startH + deltaY)\n );\n }\n if (r.dir.includes('n')) {\n newHeight = Math.max(minHeight, r.startH - deltaY);\n if (draggable) newY = r.startPosY + (r.startH - newHeight);\n }\n\n setSize({ width: newWidth, height: newHeight });\n if (draggable && (r.dir.includes('w') || r.dir.includes('n'))) {\n setPosition({ x: newX, y: newY });\n }\n };\n\n const handleMouseUp = () => {\n dragRef.current = null;\n resizeRef.current = null;\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [open, minimized, draggable, minWidth, minHeight]);\n\n if (!open || minimized) return null;\n\n const windowEl = (\n <div\n ref={ref}\n data-slot=\"floating-window\"\n role=\"dialog\"\n aria-modal={draggable ? undefined : true}\n aria-labelledby={typeof title === 'string' ? titleId : undefined}\n aria-label={typeof title === 'string' ? undefined : ariaLabel}\n className={cn(\n 'bg-card text-card-foreground relative flex flex-col overflow-hidden rounded-lg shadow-2xl',\n draggable && 'border-primary-800 fixed border-2',\n className\n )}\n style={\n draggable\n ? {\n left: position.x,\n top: position.y,\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n zIndex: 50,\n }\n : {\n width: size.width,\n height: size.height,\n maxWidth: 'calc(100vw - 40px)',\n maxHeight: 'calc(100vh - 40px)',\n }\n }\n >\n {resizable &&\n RESIZE_HANDLES.map((handle) => (\n <div\n key={handle.dir}\n aria-hidden=\"true\"\n className={cn('absolute z-10', handle.className)}\n onMouseDown={(e) => handleResizeStart(e, handle.dir)}\n />\n ))}\n {resizable && (\n <div\n aria-hidden=\"true\"\n className=\"hover:bg-muted/50 absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize rounded-tl\"\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n >\n <svg\n className=\"text-muted-foreground/50 h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM22 14H20V12H22V14ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z\" />\n </svg>\n </div>\n )}\n\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- header acts as an optional drag handle; the controls inside remain keyboard accessible */}\n <div\n data-slot=\"floating-window-header\"\n className={cn(\n 'bg-primary-800 text-primary-foreground flex items-center justify-between rounded-t-lg px-4 py-3',\n draggable && 'cursor-move'\n )}\n onMouseDown={handleDragStart}\n >\n <h2\n id={typeof title === 'string' ? titleId : undefined}\n className=\"text-lg font-semibold\"\n >\n {title}\n </h2>\n <div data-window-controls className=\"flex items-center gap-1\">\n {onMinimize && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onMinimize}\n aria-label=\"Minimize\"\n title=\"Minimize\"\n >\n <Minus className=\"h-4 w-4\" />\n </Button>\n )}\n {onPopOut && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onPopOut}\n aria-label=\"Open in new window\"\n title=\"Open in new window\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-primary-foreground hover:bg-primary-foreground/20 h-8 w-8 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"floating-window-content\"\n role=\"region\"\n className=\"flex-1 overflow-y-auto\"\n tabIndex={0}\n >\n {children}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}\n\n {footer && (\n <div\n data-slot=\"floating-window-footer\"\n className=\"border-border bg-card flex items-center justify-end gap-3 rounded-b-lg border-t px-6 py-4\"\n >\n {footer}\n </div>\n )}\n </div>\n );\n\n if (draggable) return windowEl;\n\n return (\n <div\n data-slot=\"floating-window-overlay\"\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n >\n {windowEl}\n </div>\n );\n }\n);\n\nFloatingWindow.displayName = 'FloatingWindow';\n\nexport interface MinimizedWindowProps {\n /** Title shown on the minimized bar. */\n title: React.ReactNode;\n /** Called when the bar is activated to restore the window. */\n onRestore: () => void;\n /** Called when the close control is activated. */\n onClose: () => void;\n /** Additional class for the minimized bar. */\n className?: string;\n}\n\n/**\n * A compact bar representing a minimized {@link FloatingWindow}. Render this\n * (typically in a docked tray) while the corresponding window is minimized.\n */\nconst MinimizedWindow = React.forwardRef<HTMLDivElement, MinimizedWindowProps>(\n ({ title, onRestore, onClose, className }, ref) => (\n <div\n ref={ref}\n data-slot=\"minimized-window\"\n className={cn(\n 'border-border bg-card flex min-w-[200px] items-center gap-2 rounded-lg border px-3 py-2 shadow-md',\n className\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2\"\n onClick={onRestore}\n >\n <Square className=\"mr-1 h-3 w-3\" />\n <span className=\"truncate text-sm\">{title}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto h-6 w-6 p-0\"\n onClick={onClose}\n aria-label=\"Close\"\n title=\"Close\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n )\n);\n\nMinimizedWindow.displayName = 'MinimizedWindow';\n\nexport { FloatingWindow, MinimizedWindow };\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/utils/html.ts
|
|
4
|
+
function stripHtmlTags(html) {
|
|
5
|
+
let result = "";
|
|
6
|
+
let inTag = false;
|
|
7
|
+
for (let i = 0; i < html.length; i++) {
|
|
8
|
+
if (html[i] === "<") {
|
|
9
|
+
inTag = true;
|
|
10
|
+
} else if (html[i] === ">") {
|
|
11
|
+
inTag = false;
|
|
12
|
+
} else if (!inTag) {
|
|
13
|
+
result += html[i];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
function isHtmlEmpty(html) {
|
|
19
|
+
return stripHtmlTags(html).replace(/ /g, " ").trim().length === 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
exports.isHtmlEmpty = isHtmlEmpty;
|
|
23
|
+
exports.stripHtmlTags = stripHtmlTags;
|
|
24
|
+
//# sourceMappingURL=chunk-C7RVKV25.cjs.map
|
|
25
|
+
//# sourceMappingURL=chunk-C7RVKV25.cjs.map
|