ics-ui-kit 1.0.0-alpha.0 → 1.0.0-alpha.2
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/CalendarPreviousMonthButton-CHMp8bkd.js +2964 -0
- package/dist/CalendarPreviousMonthButton-CHMp8bkd.js.map +1 -0
- package/dist/{CheckboxField-Ca48ZYoX.js → CheckboxField-xDqHgXHh.js} +2 -2
- package/dist/{CheckboxField-Ca48ZYoX.js.map → CheckboxField-xDqHgXHh.js.map} +1 -1
- package/dist/{Command-CsW4aK7M.js → Command-WsAKNQrY.js} +2 -2
- package/dist/{Command-CsW4aK7M.js.map → Command-WsAKNQrY.js.map} +1 -1
- package/dist/{Dialog-BT_775Iz.js → Dialog-i_Y-phdM.js} +42 -43
- package/dist/Dialog-i_Y-phdM.js.map +1 -0
- package/dist/{Field-BRPdaQ8D.js → Field-BcwUtgGr.js} +2 -2
- package/dist/{Field-BRPdaQ8D.js.map → Field-BcwUtgGr.js.map} +1 -1
- package/dist/{FieldLabel-ic0eq9Un.js → FieldLabel-DYu1AcGH.js} +2 -2
- package/dist/{FieldLabel-ic0eq9Un.js.map → FieldLabel-DYu1AcGH.js.map} +1 -1
- package/dist/{FormFooterTemplate-BIwnBQhL.js → FormFooterTemplate-CHlas_Pp.js} +2 -2
- package/dist/{FormFooterTemplate-BIwnBQhL.js.map → FormFooterTemplate-CHlas_Pp.js.map} +1 -1
- package/dist/FormStack-DfoaOry7.js +1205 -0
- package/dist/FormStack-DfoaOry7.js.map +1 -0
- package/dist/{IconTooltip-CgbefRXG.js → IconTooltip-R6_6_f40.js} +2 -2
- package/dist/{IconTooltip-CgbefRXG.js.map → IconTooltip-R6_6_f40.js.map} +1 -1
- package/dist/{Popover-Dz2eNsXh.js → Popover-XrJa7lyb.js} +49 -50
- package/dist/Popover-XrJa7lyb.js.map +1 -0
- package/dist/{Select-Bfbtj5zt.js → Select-DO02vXt3.js} +185 -186
- package/dist/{Select-Bfbtj5zt.js.map → Select-DO02vXt3.js.map} +1 -1
- package/dist/{Sheet-aLBPtE1k.js → Sheet-C2UoHLL0.js} +35 -36
- package/dist/Sheet-C2UoHLL0.js.map +1 -0
- package/dist/{TextOverflowTooltip-BaNPKqnO.js → TextOverflowTooltip-XPDdO9Dz.js} +2 -2
- package/dist/{TextOverflowTooltip-BaNPKqnO.js.map → TextOverflowTooltip-XPDdO9Dz.js.map} +1 -1
- package/dist/{Tooltip-DOgKy50D.js → Tooltip-D2XvRS0c.js} +63 -64
- package/dist/Tooltip-D2XvRS0c.js.map +1 -0
- package/dist/blocks/auth/otp-form.js +3240 -204
- package/dist/blocks/auth/otp-form.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialog.d.ts +2 -4
- package/dist/components/alert-dialog.js +70 -71
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/calendar/components/calendar-dropdown/CalendarDropdown.d.ts +24 -0
- package/dist/components/calendar/styles.d.ts +61 -0
- package/dist/components/calendar-scroll/CalendarScroll.d.ts +21 -0
- package/dist/components/calendar-scroll/CalendarScroll.stories.d.ts +16 -0
- package/dist/components/calendar-scroll/index.d.ts +3 -0
- package/dist/components/calendar-scroll.d.ts +2 -0
- package/dist/components/calendar-scroll.js +181 -0
- package/dist/components/calendar-scroll.js.map +1 -0
- package/dist/components/calendar.js +51 -147
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/command.js +1 -1
- package/dist/components/dialog/Dialog.d.ts +2 -4
- package/dist/components/dialog.js +3 -3
- package/dist/components/drawer/components/drawer-content/DrawerContent.d.ts +1 -2
- package/dist/components/drawer.js +96 -97
- package/dist/components/drawer.js.map +1 -1
- package/dist/components/dropdown/Dropdown.d.ts +2 -4
- package/dist/components/dropdown.js +251 -252
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/file-upload.js +1 -1
- package/dist/components/form/Form.d.ts +14 -0
- package/dist/components/form/components/form-field/FormField.d.ts +4 -0
- package/dist/components/form.js +3 -3
- package/dist/components/icon-tooltip.js +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/overflow-tooltip.js +1 -1
- package/dist/components/popover/Popover.d.ts +1 -2
- package/dist/components/popover.js +1 -1
- package/dist/components/resizable/Resizable.d.ts +1 -1
- package/dist/components/scheduler.js +1 -1
- package/dist/components/search-select/multi-select/MultiSelect.d.ts +1 -1
- package/dist/components/search-select.js +3 -3
- package/dist/components/search-select.js.map +1 -1
- package/dist/components/select/Select.d.ts +1 -2
- package/dist/components/select.js +1 -1
- package/dist/components/sheet/Sheet.d.ts +1 -2
- package/dist/components/sheet.js +1 -1
- package/dist/components/sidebar.js +2 -2
- package/dist/components/switch.js +1 -1
- package/dist/components/tag-input.js +1 -1
- package/dist/components/tooltip/Tooltip.d.ts +2 -4
- package/dist/components/tooltip.js +1 -1
- package/dist/tailwind.css +406 -361
- package/package.json +22 -18
- package/dist/DayPicker-4hE1QEvO.js +0 -2452
- package/dist/DayPicker-4hE1QEvO.js.map +0 -1
- package/dist/Dialog-BT_775Iz.js.map +0 -1
- package/dist/FormStack-CxiZhx1n.js +0 -127
- package/dist/FormStack-CxiZhx1n.js.map +0 -1
- package/dist/Popover-Dz2eNsXh.js.map +0 -1
- package/dist/Sheet-aLBPtE1k.js.map +0 -1
- package/dist/Tooltip-DOgKy50D.js.map +0 -1
- package/dist/buildMatchPatternFn-d7GTeGl_.js +0 -68
- package/dist/buildMatchPatternFn-d7GTeGl_.js.map +0 -1
- package/dist/components/portal-container/PortalContainer.d.ts +0 -10
- package/dist/components/portal-container/index.d.ts +0 -2
- package/dist/components/portal-container/portalContainerEvents.d.ts +0 -12
- package/dist/components/portal-container/usePortalContainer.d.ts +0 -11
- package/dist/components/portal-container.d.ts +0 -2
- package/dist/components/portal-container.js +0 -14
- package/dist/components/portal-container.js.map +0 -1
- package/dist/index.esm-CXA6i4d7.js +0 -1282
- package/dist/index.esm-CXA6i4d7.js.map +0 -1
- package/dist/normalizeDates-9A3c9WYM.js +0 -32
- package/dist/normalizeDates-9A3c9WYM.js.map +0 -1
- package/dist/styles.css +0 -9064
- package/dist/styles.d.ts +0 -1
- package/dist/usePortalContainer-B1xla842.js +0 -33
- package/dist/usePortalContainer-B1xla842.js.map +0 -1
- package/dist/vendors/date-fns/index.d.ts +0 -12
- package/dist/vendors/date-fns/locale/en-US/index.d.ts +0 -5
- package/dist/vendors/date-fns/locale/en-US.d.ts +0 -2
- package/dist/vendors/date-fns/locale/en-US.js +0 -372
- package/dist/vendors/date-fns/locale/en-US.js.map +0 -1
- package/dist/vendors/date-fns/locale/ru/index.d.ts +0 -5
- package/dist/vendors/date-fns/locale/ru.d.ts +0 -2
- package/dist/vendors/date-fns/locale/ru.js +0 -569
- package/dist/vendors/date-fns/locale/ru.js.map +0 -1
- package/dist/vendors/date-fns.d.ts +0 -2
- package/dist/vendors/date-fns.js +0 -2
- package/dist/vendors/date-fns.js.map +0 -1
- package/dist/vendors/react-day-picker/index.d.ts +0 -13
- package/dist/vendors/react-day-picker.d.ts +0 -2
- package/dist/vendors/react-day-picker.js +0 -87
- package/dist/vendors/react-day-picker.js.map +0 -1
- package/dist/vendors/react-hook-form/index.d.ts +0 -14
- package/dist/vendors/react-hook-form.d.ts +0 -2
- package/dist/vendors/react-hook-form.js +0 -19
- package/dist/vendors/react-hook-form.js.map +0 -1
- package/dist/vendors/tanstack/react-table/index.d.ts +0 -13
- package/dist/vendors/tanstack/react-table.d.ts +0 -2
- package/dist/vendors/tanstack/react-table.js +0 -2090
- package/dist/vendors/tanstack/react-table.js.map +0 -1
- package/dist/vendors/zod/index.d.ts +0 -13
- package/dist/vendors/zod.d.ts +0 -2
- package/dist/vendors/zod.js +0 -3080
- package/dist/vendors/zod.js.map +0 -1
- package/dist/zod-BMNoK3aM.js +0 -75
- package/dist/zod-BMNoK3aM.js.map +0 -1
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { jsx as a, jsxs as l } from "react/jsx-runtime";
|
|
2
2
|
import * as r from "react";
|
|
3
|
-
import { R as
|
|
3
|
+
import { R as N, T as w, C as d, P as v, a as c, b as m, D as f, O as p } from "./index-CMxHunQ4.js";
|
|
4
4
|
import { T as o } from "./index-BVqs-uqP.js";
|
|
5
|
-
import { o as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
({ className: e, blur: t, type: s, ...i }, n) => /* @__PURE__ */ a(p, { className: j({ blur: t, type: s, className: e }), ...i, ref: n })
|
|
5
|
+
import { o as C } from "./Overlay-E0UvxzIc.js";
|
|
6
|
+
import { I as R } from "./Icon-DH3ev9GK.js";
|
|
7
|
+
import { X as T } from "./x-tDTt7hTQ.js";
|
|
8
|
+
const Q = N, U = w, W = d, D = v, O = o({ extend: C }), h = r.forwardRef(
|
|
9
|
+
({ className: e, blur: t, type: s, ...i }, n) => /* @__PURE__ */ a(p, { className: O({ blur: t, type: s, className: e }), ...i, ref: n })
|
|
11
10
|
);
|
|
12
11
|
h.displayName = p.displayName;
|
|
13
|
-
const
|
|
12
|
+
const j = o({
|
|
14
13
|
base: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary"
|
|
15
|
-
}), y = r.forwardRef(({ className: e, ...t }, s) => /* @__PURE__ */ l(d, { ref: s, className:
|
|
16
|
-
/* @__PURE__ */ a(
|
|
14
|
+
}), y = r.forwardRef(({ className: e, ...t }, s) => /* @__PURE__ */ l(d, { ref: s, className: j({ className: e }), ...t, children: [
|
|
15
|
+
/* @__PURE__ */ a(R, { icon: T }),
|
|
17
16
|
/* @__PURE__ */ a("span", { className: "sr-only", children: "Close" })
|
|
18
17
|
] }));
|
|
19
18
|
y.displayName = d.displayName;
|
|
20
|
-
const
|
|
19
|
+
const F = o({
|
|
21
20
|
base: "shadow-soft-lg fixed z-50 flex flex-col bg-background transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
22
21
|
variants: {
|
|
23
22
|
side: {
|
|
@@ -30,7 +29,7 @@ const H = o({
|
|
|
30
29
|
defaultVariants: {
|
|
31
30
|
side: "right"
|
|
32
31
|
}
|
|
33
|
-
}),
|
|
32
|
+
}), H = r.forwardRef(
|
|
34
33
|
({
|
|
35
34
|
side: e = "right",
|
|
36
35
|
className: t,
|
|
@@ -41,8 +40,8 @@ const H = o({
|
|
|
41
40
|
portalContainer: b,
|
|
42
41
|
...g
|
|
43
42
|
}, x) => {
|
|
44
|
-
const S =
|
|
45
|
-
return /* @__PURE__ */ l(
|
|
43
|
+
const S = F({ side: e, className: t });
|
|
44
|
+
return /* @__PURE__ */ l(D, { container: b, children: [
|
|
46
45
|
/* @__PURE__ */ a(h, { type: n, blur: u }),
|
|
47
46
|
/* @__PURE__ */ l(c, { ref: x, className: S, ...g, children: [
|
|
48
47
|
s,
|
|
@@ -51,33 +50,33 @@ const H = o({
|
|
|
51
50
|
] });
|
|
52
51
|
}
|
|
53
52
|
);
|
|
54
|
-
|
|
55
|
-
const
|
|
53
|
+
H.displayName = c.displayName;
|
|
54
|
+
const P = o({
|
|
56
55
|
base: "flex flex-col space-y-2 p-6 text-center sm:text-left"
|
|
56
|
+
}), k = ({ className: e, ...t }) => /* @__PURE__ */ a("div", { className: P({ className: e }), ...t });
|
|
57
|
+
k.displayName = "SheetHeader";
|
|
58
|
+
const B = o({
|
|
59
|
+
base: "flex flex-col-reverse p-6 pt-0 sm:flex-row sm:justify-end sm:space-x-2"
|
|
57
60
|
}), I = ({ className: e, ...t }) => /* @__PURE__ */ a("div", { className: B({ className: e }), ...t });
|
|
58
|
-
I.displayName = "
|
|
61
|
+
I.displayName = "SheetFooter";
|
|
59
62
|
const z = o({
|
|
60
|
-
base: "flex flex-col-reverse p-6 pt-0 sm:flex-row sm:justify-end sm:space-x-2"
|
|
61
|
-
}), V = ({ className: e, ...t }) => /* @__PURE__ */ a("div", { className: z({ className: e }), ...t });
|
|
62
|
-
V.displayName = "SheetFooter";
|
|
63
|
-
const X = o({
|
|
64
63
|
base: "text-lg font-semibold text-foreground"
|
|
65
|
-
}),
|
|
66
|
-
|
|
67
|
-
const
|
|
64
|
+
}), V = r.forwardRef(({ className: e, ...t }, s) => /* @__PURE__ */ a(m, { ref: s, className: z({ className: e }), ...t }));
|
|
65
|
+
V.displayName = m.displayName;
|
|
66
|
+
const X = o({
|
|
68
67
|
base: "text-sm text-muted-foreground"
|
|
69
|
-
}),
|
|
70
|
-
|
|
68
|
+
}), q = r.forwardRef(({ className: e, ...t }, s) => /* @__PURE__ */ a(f, { ref: s, className: X({ className: e }), ...t }));
|
|
69
|
+
q.displayName = f.displayName;
|
|
71
70
|
export {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
71
|
+
Q as S,
|
|
72
|
+
H as a,
|
|
73
|
+
k as b,
|
|
74
|
+
I as c,
|
|
75
|
+
V as d,
|
|
76
|
+
q as e,
|
|
77
|
+
U as f,
|
|
78
|
+
W as g,
|
|
79
|
+
D as h,
|
|
81
80
|
h as i
|
|
82
81
|
};
|
|
83
|
-
//# sourceMappingURL=Sheet-
|
|
82
|
+
//# sourceMappingURL=Sheet-C2UoHLL0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sheet-C2UoHLL0.js","sources":["../src/components/sheet/Sheet.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\r\nimport { tv } from \"tailwind-variants\";\r\nimport { X } from \"lucide-react\";\r\nimport { overlayStyles, OverlayVariants } from \"../overlay/Overlay\";\r\nimport { Icon } from \"../icon\";\r\nimport { VariantsConfig } from \"@/lib/utils/variants\";\r\n\r\nconst Sheet = SheetPrimitive.Root;\r\n\r\nconst SheetTrigger = SheetPrimitive.Trigger;\r\n\r\nconst SheetClose = SheetPrimitive.Close;\r\n\r\nconst SheetPortal = SheetPrimitive.Portal;\r\n\r\nconst sheetOverlayStyles = tv({ extend: overlayStyles });\r\n\r\ninterface SheetOverlayProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>, OverlayVariants {}\r\n\r\nconst SheetOverlay = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Overlay>, SheetOverlayProps>(\r\n\t({ className, blur, type, ...props }, ref) => (\r\n\t\t<SheetPrimitive.Overlay className={sheetOverlayStyles({ blur, type, className })} {...props} ref={ref} />\r\n\t)\r\n);\r\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\r\n\r\nconst sheetCloseButtonStyles = tv({\r\n\tbase: \"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\"\r\n});\r\n\r\nconst SheetCloseButton = React.forwardRef<\r\n\tReact.ElementRef<typeof SheetPrimitive.Close>,\r\n\tReact.ComponentPropsWithoutRef<typeof SheetPrimitive.Close>\r\n>(({ className, ...props }, ref) => (\r\n\t<SheetPrimitive.Close ref={ref} className={sheetCloseButtonStyles({ className })} {...props}>\r\n\t\t<Icon icon={X} />\r\n\t\t<span className=\"sr-only\">Close</span>\r\n\t</SheetPrimitive.Close>\r\n));\r\n\r\nSheetCloseButton.displayName = SheetPrimitive.Close.displayName;\r\n\r\nexport interface SheetContentVariants {\r\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n}\r\n\r\nconst sheetContentStyles = tv({\r\n\tbase: \"shadow-soft-lg fixed z-50 flex flex-col bg-background transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n\tvariants: {\r\n\t\tside: {\r\n\t\t\ttop: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\r\n\t\t\tbottom: \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\r\n\t\t\tleft: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\r\n\t\t\tright: \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\"\r\n\t\t}\r\n\t} satisfies VariantsConfig<SheetContentVariants>,\r\n\tdefaultVariants: {\r\n\t\tside: \"right\"\r\n\t}\r\n});\r\n\r\ninterface SheetContentProps\r\n\textends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\r\n\t\tSheetContentVariants {\r\n\tshowCloseButton?: boolean;\r\n\toverlayType?: OverlayVariants[\"type\"];\r\n\toverlayBlur?: OverlayVariants[\"blur\"];\r\n\t/**\r\n\t * Контейнер для портала. Если не указан, портал рендерится в document.body\r\n\t */\r\n\tportalContainer?: HTMLElement;\r\n}\r\n\r\nconst SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(\r\n\t(\r\n\t\t{\r\n\t\t\tside = \"right\",\r\n\t\t\tclassName,\r\n\t\t\tchildren,\r\n\t\t\tshowCloseButton = true,\r\n\t\t\toverlayType,\r\n\t\t\toverlayBlur,\r\n\t\t\tportalContainer,\r\n\t\t\t...props\r\n\t\t},\r\n\t\tref\r\n\t) => {\r\n\t\tconst styles = sheetContentStyles({ side, className });\r\n\t\tconst container = portalContainer;\r\n\r\n\t\treturn (\r\n\t\t\t<SheetPortal container={container}>\r\n\t\t\t\t<SheetOverlay type={overlayType} blur={overlayBlur} />\r\n\t\t\t\t<SheetPrimitive.Content ref={ref} className={styles} {...props}>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t\t{showCloseButton && <SheetCloseButton />}\r\n\t\t\t\t</SheetPrimitive.Content>\r\n\t\t\t</SheetPortal>\r\n\t\t);\r\n\t}\r\n);\r\n\r\nSheetContent.displayName = SheetPrimitive.Content.displayName;\r\n\r\nconst sheetHeaderStyles = tv({\r\n\tbase: \"flex flex-col space-y-2 p-6 text-center sm:text-left\"\r\n});\r\n\r\nconst SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n\t<div className={sheetHeaderStyles({ className })} {...props} />\r\n);\r\n\r\nSheetHeader.displayName = \"SheetHeader\";\r\n\r\nconst sheetFooterStyles = tv({\r\n\tbase: \"flex flex-col-reverse p-6 pt-0 sm:flex-row sm:justify-end sm:space-x-2\"\r\n});\r\n\r\nconst SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\r\n\t<div className={sheetFooterStyles({ className })} {...props} />\r\n);\r\n\r\nSheetFooter.displayName = \"SheetFooter\";\r\n\r\nconst sheetTitleStyles = tv({\r\n\tbase: \"text-lg font-semibold text-foreground\"\r\n});\r\n\r\nconst SheetTitle = React.forwardRef<\r\n\tReact.ElementRef<typeof SheetPrimitive.Title>,\r\n\tReact.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n\t<SheetPrimitive.Title ref={ref} className={sheetTitleStyles({ className })} {...props} />\r\n));\r\n\r\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\r\n\r\nconst sheetDescriptionStyles = tv({\r\n\tbase: \"text-sm text-muted-foreground\"\r\n});\r\n\r\nconst SheetDescription = React.forwardRef<\r\n\tReact.ElementRef<typeof SheetPrimitive.Description>,\r\n\tReact.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n\t<SheetPrimitive.Description ref={ref} className={sheetDescriptionStyles({ className })} {...props} />\r\n));\r\n\r\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\r\n\r\nexport {\r\n\tSheet,\r\n\tSheetPortal,\r\n\tSheetOverlay,\r\n\tSheetTrigger,\r\n\tSheetClose,\r\n\tSheetContent,\r\n\tSheetHeader,\r\n\tSheetFooter,\r\n\tSheetTitle,\r\n\tSheetDescription\r\n};\r\n"],"names":["Sheet","SheetPrimitive.Root","SheetTrigger","SheetPrimitive.Trigger","SheetClose","SheetPrimitive.Close","SheetPortal","SheetPrimitive.Portal","sheetOverlayStyles","tv","overlayStyles","SheetOverlay","React","className","blur","type","props","ref","jsx","SheetPrimitive.Overlay","sheetCloseButtonStyles","SheetCloseButton","jsxs","Icon","X","sheetContentStyles","SheetContent","side","children","showCloseButton","overlayType","overlayBlur","portalContainer","styles","SheetPrimitive.Content","sheetHeaderStyles","SheetHeader","sheetFooterStyles","SheetFooter","sheetTitleStyles","SheetTitle","SheetPrimitive.Title","sheetDescriptionStyles","SheetDescription","SheetPrimitive.Description"],"mappings":";;;;;;;AAQA,MAAMA,IAAQC,GAERC,IAAeC,GAEfC,IAAaC,GAEbC,IAAcC,GAEdC,IAAqBC,EAAG,EAAE,QAAQC,GAAe,GAIjDC,IAAeC,EAAM;AAAA,EAC1B,CAAC,EAAE,WAAAC,GAAW,MAAAC,GAAM,MAAAC,GAAM,GAAGC,KAASC,MACpC,gBAAAC,EAAAC,GAAA,EAAuB,WAAWX,EAAmB,EAAE,MAAAM,GAAM,MAAAC,GAAM,WAAAF,GAAW,GAAI,GAAGG,GAAO,KAAAC,EAAU,CAAA;AAEzG;AACAN,EAAa,cAAcQ,EAAuB;AAElD,MAAMC,IAAyBX,EAAG;AAAA,EACjC,MAAM;AACP,CAAC,GAEKY,IAAmBT,EAAM,WAG7B,CAAC,EAAE,WAAAC,GAAW,GAAGG,EAAM,GAAGC,MAC3B,gBAAAK,EAACjB,GAAA,EAAqB,KAAAY,GAAU,WAAWG,EAAuB,EAAE,WAAAP,EAAU,CAAC,GAAI,GAAGG,GACrF,UAAA;AAAA,EAAC,gBAAAE,EAAAK,GAAA,EAAK,MAAMC,EAAG,CAAA;AAAA,EACd,gBAAAN,EAAA,QAAA,EAAK,WAAU,WAAU,UAAK,QAAA,CAAA;AAAA,EAAA,CAChC,CACA;AAEDG,EAAiB,cAAchB,EAAqB;AAMpD,MAAMoB,IAAqBhB,EAAG;AAAA,EAC7B,MAAM;AAAA,EACN,UAAU;AAAA,IACT,MAAM;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EAET;AAAA,EACA,iBAAiB;AAAA,IAChB,MAAM;AAAA,EAAA;AAER,CAAC,GAcKiB,IAAed,EAAM;AAAA,EAC1B,CACC;AAAA,IACC,MAAAe,IAAO;AAAA,IACP,WAAAd;AAAA,IACA,UAAAe;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,aAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,GAAGhB;AAAA,KAEJC,MACI;AACJ,UAAMgB,IAASR,EAAmB,EAAE,MAAAE,GAAM,WAAAd,GAAW;AAIpD,WAAA,gBAAAS,EAAChB,KAAY,WAHI0B,GAIhB,UAAA;AAAA,MAAA,gBAAAd,EAACP,GAAa,EAAA,MAAMmB,GAAa,MAAMC,GAAa;AAAA,MACpD,gBAAAT,EAACY,GAAA,EAAuB,KAAAjB,GAAU,WAAWgB,GAAS,GAAGjB,GACvD,UAAA;AAAA,QAAAY;AAAA,QACAC,uBAAoBR,GAAiB,CAAA,CAAA;AAAA,MAAA,EACvC,CAAA;AAAA,IAAA,GACD;AAAA,EAAA;AAGH;AAEAK,EAAa,cAAcQ,EAAuB;AAElD,MAAMC,IAAoB1B,EAAG;AAAA,EAC5B,MAAM;AACP,CAAC,GAEK2B,IAAc,CAAC,EAAE,WAAAvB,GAAW,GAAGG,QACpC,gBAAAE,EAAC,OAAI,EAAA,WAAWiB,EAAkB,EAAE,WAAAtB,EAAA,CAAW,GAAI,GAAGG,EAAO,CAAA;AAG9DoB,EAAY,cAAc;AAE1B,MAAMC,IAAoB5B,EAAG;AAAA,EAC5B,MAAM;AACP,CAAC,GAEK6B,IAAc,CAAC,EAAE,WAAAzB,GAAW,GAAGG,QACpC,gBAAAE,EAAC,OAAI,EAAA,WAAWmB,EAAkB,EAAE,WAAAxB,EAAA,CAAW,GAAI,GAAGG,EAAO,CAAA;AAG9DsB,EAAY,cAAc;AAE1B,MAAMC,IAAmB9B,EAAG;AAAA,EAC3B,MAAM;AACP,CAAC,GAEK+B,IAAa5B,EAAM,WAGvB,CAAC,EAAE,WAAAC,GAAW,GAAGG,EAAM,GAAGC,MAC3B,gBAAAC,EAACuB,GAAA,EAAqB,KAAAxB,GAAU,WAAWsB,EAAiB,EAAE,WAAA1B,GAAW,GAAI,GAAGG,GAAO,CACvF;AAEDwB,EAAW,cAAcC,EAAqB;AAE9C,MAAMC,IAAyBjC,EAAG;AAAA,EACjC,MAAM;AACP,CAAC,GAEKkC,IAAmB/B,EAAM,WAG7B,CAAC,EAAE,WAAAC,GAAW,GAAGG,EAAM,GAAGC,MAC3B,gBAAAC,EAAC0B,GAAA,EAA2B,KAAA3B,GAAU,WAAWyB,EAAuB,EAAE,WAAA7B,GAAW,GAAI,GAAGG,GAAO,CACnG;AAED2B,EAAiB,cAAcC,EAA2B;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as t, jsxs as p } from "react/jsx-runtime";
|
|
2
2
|
import { c as n } from "./cn-dsXlqdJg.js";
|
|
3
|
-
import { a as u, T, b as g, c as m } from "./Tooltip-
|
|
3
|
+
import { a as u, T, b as g, c as m } from "./Tooltip-D2XvRS0c.js";
|
|
4
4
|
import { useState as O, useRef as h, useCallback as d } from "react";
|
|
5
5
|
const w = (o) => o.scrollWidth > o.offsetWidth || o.scrollHeight > o.offsetHeight, x = () => {
|
|
6
6
|
const [o, r] = O(!1), e = h(null), s = d((l) => {
|
|
@@ -33,4 +33,4 @@ export {
|
|
|
33
33
|
v as T,
|
|
34
34
|
x as u
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=TextOverflowTooltip-
|
|
36
|
+
//# sourceMappingURL=TextOverflowTooltip-XPDdO9Dz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextOverflowTooltip-BaNPKqnO.js","sources":["../src/lib/utils/dom.ts","../src/components/overflow-tooltip/useOverflowTooltip.ts","../src/components/overflow-tooltip/OverflowTooltip.tsx","../src/components/overflow-tooltip/TextOverflowTooltip.tsx"],"sourcesContent":["/**\n * Проверяет, переполнен ли элемент (дочерние элементы выходят за пределы родительского элемента)\n * @param element - HTML элемент для проверки\n * @returns true, если элемент переполнен по ширине или высоте\n *\n * @example\n * // подсказку показываем только там, где текст обрезан\n * const truncated = isElementOverflowing(labelRef.current);\n */\nexport const isElementOverflowing = (element: HTMLElement): boolean => {\n\treturn element.scrollWidth > element.offsetWidth || element.scrollHeight > element.offsetHeight;\n};\n\n/**\n * Canvas для измерения текста переиспользуется: на каждый вызов создавать его расточительно.\n *\n * Контекст один на все поля страницы, и это безопасно ровно до тех пор, пока каждое\n * измерение выставляет **все** влияющие на ширину свойства. Условное присваивание оставило бы\n * настройку от предыдущего поля: соседняя таблица со своим `letter-spacing` мерила бы текст\n * чужим трекингом. Поэтому свойства ниже пишутся всегда, а сам canvas остаётся приватным\n * для этого модуля — иначе инвариант незаметно нарушит следующий пользователь.\n */\nlet measureContext: CanvasRenderingContext2D | null | undefined;\n\nconst getMeasureContext = () => {\n\tif (measureContext === undefined) measureContext = document.createElement(\"canvas\").getContext(\"2d\");\n\treturn measureContext;\n};\n\n/**\n * Ставит каретку в `input`/`textarea` по горизонтальной координате указателя (`clientX`).\n *\n * Нужно там, где поле появляется по клику уже после самого клика — например, при переходе\n * ячейки таблицы в режим редактирования по двойному щелчку: без этого каретка встаёт\n * в начало или конец, а не туда, куда целился пользователь.\n *\n * `caretPositionFromPoint` / `caretRangeFromPoint` здесь бесполезны: содержимое `input`\n * не является частью DOM-дерева, и Range/Selection API до него не достаёт — вернётся сам\n * элемент, а не позиция в тексте. Поэтому индекс считается вручную: текст измеряется\n * на offscreen canvas тем же шрифтом, и выбирается ближайшая к точке граница символа.\n * Ширины префиксов монотонно растут, так что перебор обрывается, как только начал удаляться\n * от цели.\n *\n * Учитывается только горизонталь, поэтому для многострочного текста функция не годится —\n * там нужен `placeCaretAtClientPoint` по `contenteditable`.\n *\n * Возвращает `false`, если поставить каретку не удалось (поле пустое, тип поля не поддерживает\n * выделение или canvas недоступен) — вызывающему коду в этом случае стоит оставить поведение\n * по умолчанию.\n *\n * @example\n * // координата запоминается на dblclick, применяется, когда поле получило фокус\n * <input\n * autoFocus\n * onFocus={(event) => {\n * const input = event.currentTarget;\n * if (!placeCaretAtPoint(input, caretX)) placeCaretAtEnd(input);\n * }}\n * />\n */\nexport const placeCaretAtPoint = (element: HTMLInputElement | HTMLTextAreaElement, clientX: number): boolean => {\n\tconst value = element.value;\n\tif (!value) return false;\n\n\t// У `type=number|email|date|time|color` выделения нет, а `setSelectionRange` на них кидает\n\t// `InvalidStateError`. Тип полей задаёт прикладной код, поэтому проверяем, а не полагаемся.\n\tif (element.selectionStart === null) return false;\n\n\tconst context = getMeasureContext();\n\tif (!context) return false;\n\n\tconst style = window.getComputedStyle(element);\n\tcontext.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\t// `letterSpacing` у canvas принимает только длину: `normal` из вычисленных стилей его сломает.\n\t// Пишется на каждом вызове — иначе значение утечёт в следующее поле, см. `measureContext`.\n\tif (\"letterSpacing\" in context) {\n\t\tcontext.letterSpacing = style.letterSpacing.endsWith(\"px\") ? style.letterSpacing : \"0px\";\n\t}\n\n\tconst rect = element.getBoundingClientRect();\n\tconst borderLeft = parseFloat(style.borderLeftWidth) || 0;\n\tconst borderRight = parseFloat(style.borderRightWidth) || 0;\n\tconst paddingLeft = parseFloat(style.paddingLeft) || 0;\n\tconst paddingRight = parseFloat(style.paddingRight) || 0;\n\tconst contentLeft = rect.left + borderLeft + paddingLeft;\n\tconst contentWidth = rect.width - borderLeft - borderRight - paddingLeft - paddingRight;\n\n\t// Текст короче поля прижимается по `text-align`, и отсчитывать позицию от левого края\n\t// нельзя — у выровненного вправо поля это промах на всю свободную ширину.\n\tconst slack = contentWidth - context.measureText(value).width;\n\tlet originX = contentLeft - element.scrollLeft;\n\tif (slack > 0) {\n\t\tif (style.textAlign === \"right\" || style.textAlign === \"end\") originX += slack;\n\t\telse if (style.textAlign === \"center\") originX += slack / 2;\n\t}\n\n\tconst targetX = clientX - originX;\n\tlet bestIndex = 0;\n\tlet bestDistance = Infinity;\n\tfor (let index = 0; index <= value.length; index++) {\n\t\tconst distance = Math.abs(context.measureText(value.slice(0, index)).width - targetX);\n\t\tif (distance > bestDistance) break;\n\t\tbestDistance = distance;\n\t\tbestIndex = index;\n\t}\n\n\telement.setSelectionRange(bestIndex, bestIndex);\n\treturn true;\n};\n\n/**\n * Ставит каретку в `contenteditable` по точке указателя.\n *\n * В отличие от `input`, текст здесь — обычные узлы DOM, поэтому измерять ничего не нужно:\n * браузер сам отдаёт позицию по координатам. Работает и с переносами, так что это тот случай,\n * когда многострочная правка делается редактируемым `div`, а не `textarea`.\n *\n * Возвращает `false`, если точка не попала в текст элемента, — вызывающему коду стоит\n * поставить каретку в конец через `placeCaretAtEnd`.\n *\n * @example\n * const editor = event.currentTarget;\n * if (!placeCaretAtClientPoint(editor, event.clientX, event.clientY)) placeCaretAtEnd(editor);\n */\nexport const placeCaretAtClientPoint = (element: HTMLElement, clientX: number, clientY: number): boolean => {\n\tconst selection = window.getSelection();\n\tif (!selection) return false;\n\n\tconst range = caretRangeAtPoint(clientX, clientY);\n\t// Точка могла прийтись на отступ ячейки или на соседний узел: чужую позицию не ставим.\n\tif (!range || !element.contains(range.startContainer)) return false;\n\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n\treturn true;\n};\n\n/**\n * Оба способа спросить у браузера позицию каретки по координатам — объявлены здесь сами.\n *\n * `caretPositionFromPoint` — стандартный, но в `lib.dom` TS 5.6 его ещё нет.\n * `caretRangeFromPoint` — легаси WebKit, в `lib.dom` он помечен `@deprecated`; берётся\n * только фолбэком для Safari до 17.4, где стандартного метода ещё не было. Объявление\n * собрано в одном месте намеренно: обращение идёт к нему, а не к устаревшему члену `Document`,\n * и причина использования легаси видна рядом, а не прячется за подавленной подсказкой.\n */\ntype DocumentWithCaretApi = Document & {\n\tcaretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n\tcaretRangeFromPoint?: (x: number, y: number) => Range | null;\n};\n\nconst caretRangeAtPoint = (clientX: number, clientY: number): Range | null => {\n\tconst doc = document as DocumentWithCaretApi;\n\n\tif (doc.caretPositionFromPoint) {\n\t\tconst position = doc.caretPositionFromPoint(clientX, clientY);\n\t\tif (!position) return null;\n\t\tconst range = document.createRange();\n\t\trange.setStart(position.offsetNode, position.offset);\n\t\trange.collapse(true);\n\t\treturn range;\n\t}\n\n\treturn doc.caretRangeFromPoint?.(clientX, clientY) ?? null;\n};\n\n/**\n * Ставит каретку в конец содержимого `contenteditable` — поведение F2 в Excel.\n *\n * @example\n * // F2 открывает правку с кареткой в конце\n * if (event.key === \"F2\") placeCaretAtEnd(editorRef.current);\n */\nexport const placeCaretAtEnd = (element: HTMLElement): void => {\n\tconst selection = window.getSelection();\n\tif (!selection) return;\n\n\tconst range = document.createRange();\n\trange.selectNodeContents(element);\n\trange.collapse(false);\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n};\n\n/**\n * Вставляет текст в текущую позицию каретки внутри `contenteditable`, заменяя выделенное.\n *\n * Нужно на вставке из буфера: по умолчанию `contenteditable` принимает разметку, и в ячейку\n * приезжает чужое форматирование вместе с текстом.\n *\n * @example\n * onPaste={(event) => {\n * event.preventDefault();\n * insertTextAtCaret(event.currentTarget, event.clipboardData.getData(\"text/plain\"));\n * }}\n */\nexport const insertTextAtCaret = (element: HTMLElement, text: string): void => {\n\tconst selection = window.getSelection();\n\tif (!selection?.rangeCount) return;\n\n\tconst range = selection.getRangeAt(0);\n\tif (!element.contains(range.startContainer)) return;\n\n\trange.deleteContents();\n\tconst node = document.createTextNode(text);\n\trange.insertNode(node);\n\trange.setStartAfter(node);\n\trange.collapse(true);\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n};\n","import { useCallback, useRef, useState } from \"react\";\r\nimport { isElementOverflowing } from \"../../lib/utils/dom\";\r\n\r\nexport const useOverflowTooltip = <T extends HTMLElement>() => {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst ref = useRef<T>(null);\r\n\r\n\tconst onOpenChange = useCallback((newOpen: boolean) => {\r\n\t\tif (newOpen === false) {\r\n\t\t\tsetOpen(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!ref.current) return;\r\n\t\tif (isElementOverflowing(ref.current)) {\r\n\t\t\tsetOpen(true);\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn { open, onOpenChange, ref };\r\n};\r\n","import { cn } from \"@/lib/utils\";\r\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\r\nimport { useOverflowTooltip } from \"./useOverflowTooltip\";\r\nimport React from \"react\";\r\n\r\ntype OverflowTooltipProps = {\r\n\tchildren: React.ReactNode;\r\n\t/**\r\n\t * HTML-элемент для обертки содержимого.\r\n\t * Используется для соблюдения правильной HTML-семантики.\r\n\t * Например:\r\n\t * - span (по умолчанию) для текста и инлайн-элементов\r\n\t * - div для блочного содержимого и сложных структур\r\n\t * @default span\r\n\t */\r\n\ttriggerTag?: React.ElementType;\r\n\t/**\r\n\t * Классы для обработки переполненного содержимого.\r\n\t * Например: \"truncate\", \"line-clamp-3\" и т.д.\r\n\t */\r\n\tclassName?: string;\r\n\t/**\r\n\t * Классы для содержимого тултипа.\r\n\t * С помощью них можно управлять стилями тултипа, например шириной, переносом текста и т.д.\r\n\t */\r\n\ttooltipClassName?: string;\r\n\tfocus?: \"high\";\r\n};\r\n\r\nexport const OverflowTooltip = ({ children, className, focus, triggerTag, tooltipClassName }: OverflowTooltipProps) => {\r\n\tconst { open, onOpenChange, ref } = useOverflowTooltip<HTMLDivElement>();\r\n\tconst TriggerTag = triggerTag || \"span\";\r\n\treturn (\r\n\t\t<TooltipProvider>\r\n\t\t\t<Tooltip open={open} onOpenChange={onOpenChange}>\r\n\t\t\t\t<TooltipTrigger asChild>\r\n\t\t\t\t\t<TriggerTag ref={ref} className={cn(className)}>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</TriggerTag>\r\n\t\t\t\t</TooltipTrigger>\r\n\t\t\t\t<TooltipContent focus={focus} className={cn(\"max-w-xs\", tooltipClassName)}>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</TooltipContent>\r\n\t\t\t</Tooltip>\r\n\t\t</TooltipProvider>\r\n\t);\r\n};\r\n\r\nOverflowTooltip.displayName = \"OverflowTooltip\";\r\n","import { cn } from \"@/lib/utils\";\r\nimport React from \"react\";\r\nimport { OverflowTooltip } from \"./OverflowTooltip\";\r\n\r\ntype TextOverflowTooltipProps = {\r\n\tchildren?: React.ReactNode;\r\n\tclassName?: string;\r\n\ttooltipClassName?: string;\r\n};\r\n\r\nexport const TextOverflowTooltip = ({ children, className, tooltipClassName }: TextOverflowTooltipProps) => {\r\n\treturn (\r\n\t\t<OverflowTooltip\r\n\t\t\tclassName={cn(\"inline-block max-w-full truncate\", className)}\r\n\t\t\ttooltipClassName={tooltipClassName}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</OverflowTooltip>\r\n\t);\r\n};\r\n\r\nTextOverflowTooltip.displayName = \"TextOverflowTooltip\";\r\n"],"names":["isElementOverflowing","element","useOverflowTooltip","open","setOpen","useState","ref","useRef","onOpenChange","useCallback","newOpen","OverflowTooltip","children","className","focus","triggerTag","tooltipClassName","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","cn","TooltipContent","TextOverflowTooltip"],"mappings":";;;;AASa,MAAAA,IAAuB,CAACC,MAC7BA,EAAQ,cAAcA,EAAQ,eAAeA,EAAQ,eAAeA,EAAQ,cCPvEC,IAAqB,MAA6B;AAC9D,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChCC,IAAMC,EAAU,IAAI,GAEpBC,IAAeC,EAAY,CAACC,MAAqB;AACtD,QAAIA,MAAY,IAAO;AACtB,MAAAN,EAAQ,EAAK;AACb;AAAA,IAAA;AAEG,IAACE,EAAI,WACLN,EAAqBM,EAAI,OAAO,KACnCF,EAAQ,EAAI;AAAA,EAEd,GAAG,EAAE;AAEE,SAAA,EAAE,MAAAD,GAAM,cAAAK,GAAc,KAAAF,EAAI;AAClC,GCUaK,IAAkB,CAAC,EAAE,UAAAC,GAAU,WAAAC,GAAW,OAAAC,GAAO,YAAAC,GAAY,kBAAAC,QAA6C;AACtH,QAAM,EAAE,MAAAb,GAAM,cAAAK,GAAc,KAAAF,EAAA,IAAQJ,EAAmC;AAEvE,SACE,gBAAAe,EAAAC,GAAA,EACA,UAAC,gBAAAC,EAAAC,GAAA,EAAQ,MAAAjB,GAAY,cAAAK,GACpB,UAAA;AAAA,IAAC,gBAAAS,EAAAI,GAAA,EAAe,SAAO,IACtB,UAAC,gBAAAJ,EALcF,KAAc,QAK5B,EAAW,KAAAT,GAAU,WAAWgB,EAAGT,CAAS,GAC3C,UAAAD,EACF,CAAA,GACD;AAAA,IACA,gBAAAK,EAACM,KAAe,OAAAT,GAAc,WAAWQ,EAAG,YAAYN,CAAgB,GACtE,UAAAJ,EACF,CAAA;AAAA,EAAA,EAAA,CACD,EACD,CAAA;AAEF;AAEAD,EAAgB,cAAc;ACtCvB,MAAMa,IAAsB,CAAC,EAAE,UAAAZ,GAAU,WAAAC,GAAW,kBAAAG,QAEzD,gBAAAC;AAAA,EAACN;AAAA,EAAA;AAAA,IACA,WAAWW,EAAG,oCAAoCT,CAAS;AAAA,IAC3D,kBAAAG;AAAA,IAEC,UAAAJ;AAAA,EAAA;AACF;AAIFY,EAAoB,cAAc;"}
|
|
1
|
+
{"version":3,"file":"TextOverflowTooltip-XPDdO9Dz.js","sources":["../src/lib/utils/dom.ts","../src/components/overflow-tooltip/useOverflowTooltip.ts","../src/components/overflow-tooltip/OverflowTooltip.tsx","../src/components/overflow-tooltip/TextOverflowTooltip.tsx"],"sourcesContent":["/**\n * Проверяет, переполнен ли элемент (дочерние элементы выходят за пределы родительского элемента)\n * @param element - HTML элемент для проверки\n * @returns true, если элемент переполнен по ширине или высоте\n *\n * @example\n * // подсказку показываем только там, где текст обрезан\n * const truncated = isElementOverflowing(labelRef.current);\n */\nexport const isElementOverflowing = (element: HTMLElement): boolean => {\n\treturn element.scrollWidth > element.offsetWidth || element.scrollHeight > element.offsetHeight;\n};\n\n/**\n * Canvas для измерения текста переиспользуется: на каждый вызов создавать его расточительно.\n *\n * Контекст один на все поля страницы, и это безопасно ровно до тех пор, пока каждое\n * измерение выставляет **все** влияющие на ширину свойства. Условное присваивание оставило бы\n * настройку от предыдущего поля: соседняя таблица со своим `letter-spacing` мерила бы текст\n * чужим трекингом. Поэтому свойства ниже пишутся всегда, а сам canvas остаётся приватным\n * для этого модуля — иначе инвариант незаметно нарушит следующий пользователь.\n */\nlet measureContext: CanvasRenderingContext2D | null | undefined;\n\nconst getMeasureContext = () => {\n\tif (measureContext === undefined) measureContext = document.createElement(\"canvas\").getContext(\"2d\");\n\treturn measureContext;\n};\n\n/**\n * Ставит каретку в `input`/`textarea` по горизонтальной координате указателя (`clientX`).\n *\n * Нужно там, где поле появляется по клику уже после самого клика — например, при переходе\n * ячейки таблицы в режим редактирования по двойному щелчку: без этого каретка встаёт\n * в начало или конец, а не туда, куда целился пользователь.\n *\n * `caretPositionFromPoint` / `caretRangeFromPoint` здесь бесполезны: содержимое `input`\n * не является частью DOM-дерева, и Range/Selection API до него не достаёт — вернётся сам\n * элемент, а не позиция в тексте. Поэтому индекс считается вручную: текст измеряется\n * на offscreen canvas тем же шрифтом, и выбирается ближайшая к точке граница символа.\n * Ширины префиксов монотонно растут, так что перебор обрывается, как только начал удаляться\n * от цели.\n *\n * Учитывается только горизонталь, поэтому для многострочного текста функция не годится —\n * там нужен `placeCaretAtClientPoint` по `contenteditable`.\n *\n * Возвращает `false`, если поставить каретку не удалось (поле пустое, тип поля не поддерживает\n * выделение или canvas недоступен) — вызывающему коду в этом случае стоит оставить поведение\n * по умолчанию.\n *\n * @example\n * // координата запоминается на dblclick, применяется, когда поле получило фокус\n * <input\n * autoFocus\n * onFocus={(event) => {\n * const input = event.currentTarget;\n * if (!placeCaretAtPoint(input, caretX)) placeCaretAtEnd(input);\n * }}\n * />\n */\nexport const placeCaretAtPoint = (element: HTMLInputElement | HTMLTextAreaElement, clientX: number): boolean => {\n\tconst value = element.value;\n\tif (!value) return false;\n\n\t// У `type=number|email|date|time|color` выделения нет, а `setSelectionRange` на них кидает\n\t// `InvalidStateError`. Тип полей задаёт прикладной код, поэтому проверяем, а не полагаемся.\n\tif (element.selectionStart === null) return false;\n\n\tconst context = getMeasureContext();\n\tif (!context) return false;\n\n\tconst style = window.getComputedStyle(element);\n\tcontext.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n\t// `letterSpacing` у canvas принимает только длину: `normal` из вычисленных стилей его сломает.\n\t// Пишется на каждом вызове — иначе значение утечёт в следующее поле, см. `measureContext`.\n\tif (\"letterSpacing\" in context) {\n\t\tcontext.letterSpacing = style.letterSpacing.endsWith(\"px\") ? style.letterSpacing : \"0px\";\n\t}\n\n\tconst rect = element.getBoundingClientRect();\n\tconst borderLeft = parseFloat(style.borderLeftWidth) || 0;\n\tconst borderRight = parseFloat(style.borderRightWidth) || 0;\n\tconst paddingLeft = parseFloat(style.paddingLeft) || 0;\n\tconst paddingRight = parseFloat(style.paddingRight) || 0;\n\tconst contentLeft = rect.left + borderLeft + paddingLeft;\n\tconst contentWidth = rect.width - borderLeft - borderRight - paddingLeft - paddingRight;\n\n\t// Текст короче поля прижимается по `text-align`, и отсчитывать позицию от левого края\n\t// нельзя — у выровненного вправо поля это промах на всю свободную ширину.\n\tconst slack = contentWidth - context.measureText(value).width;\n\tlet originX = contentLeft - element.scrollLeft;\n\tif (slack > 0) {\n\t\tif (style.textAlign === \"right\" || style.textAlign === \"end\") originX += slack;\n\t\telse if (style.textAlign === \"center\") originX += slack / 2;\n\t}\n\n\tconst targetX = clientX - originX;\n\tlet bestIndex = 0;\n\tlet bestDistance = Infinity;\n\tfor (let index = 0; index <= value.length; index++) {\n\t\tconst distance = Math.abs(context.measureText(value.slice(0, index)).width - targetX);\n\t\tif (distance > bestDistance) break;\n\t\tbestDistance = distance;\n\t\tbestIndex = index;\n\t}\n\n\telement.setSelectionRange(bestIndex, bestIndex);\n\treturn true;\n};\n\n/**\n * Ставит каретку в `contenteditable` по точке указателя.\n *\n * В отличие от `input`, текст здесь — обычные узлы DOM, поэтому измерять ничего не нужно:\n * браузер сам отдаёт позицию по координатам. Работает и с переносами, так что это тот случай,\n * когда многострочная правка делается редактируемым `div`, а не `textarea`.\n *\n * Возвращает `false`, если точка не попала в текст элемента, — вызывающему коду стоит\n * поставить каретку в конец через `placeCaretAtEnd`.\n *\n * @example\n * const editor = event.currentTarget;\n * if (!placeCaretAtClientPoint(editor, event.clientX, event.clientY)) placeCaretAtEnd(editor);\n */\nexport const placeCaretAtClientPoint = (element: HTMLElement, clientX: number, clientY: number): boolean => {\n\tconst selection = window.getSelection();\n\tif (!selection) return false;\n\n\tconst range = caretRangeAtPoint(clientX, clientY);\n\t// Точка могла прийтись на отступ ячейки или на соседний узел: чужую позицию не ставим.\n\tif (!range || !element.contains(range.startContainer)) return false;\n\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n\treturn true;\n};\n\n/**\n * Оба способа спросить у браузера позицию каретки по координатам — объявлены здесь сами.\n *\n * `caretPositionFromPoint` — стандартный, но в `lib.dom` TS 5.6 его ещё нет.\n * `caretRangeFromPoint` — легаси WebKit, в `lib.dom` он помечен `@deprecated`; берётся\n * только фолбэком для Safari до 17.4, где стандартного метода ещё не было. Объявление\n * собрано в одном месте намеренно: обращение идёт к нему, а не к устаревшему члену `Document`,\n * и причина использования легаси видна рядом, а не прячется за подавленной подсказкой.\n */\ntype DocumentWithCaretApi = Document & {\n\tcaretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n\tcaretRangeFromPoint?: (x: number, y: number) => Range | null;\n};\n\nconst caretRangeAtPoint = (clientX: number, clientY: number): Range | null => {\n\tconst doc = document as DocumentWithCaretApi;\n\n\tif (doc.caretPositionFromPoint) {\n\t\tconst position = doc.caretPositionFromPoint(clientX, clientY);\n\t\tif (!position) return null;\n\t\tconst range = document.createRange();\n\t\trange.setStart(position.offsetNode, position.offset);\n\t\trange.collapse(true);\n\t\treturn range;\n\t}\n\n\treturn doc.caretRangeFromPoint?.(clientX, clientY) ?? null;\n};\n\n/**\n * Ставит каретку в конец содержимого `contenteditable` — поведение F2 в Excel.\n *\n * @example\n * // F2 открывает правку с кареткой в конце\n * if (event.key === \"F2\") placeCaretAtEnd(editorRef.current);\n */\nexport const placeCaretAtEnd = (element: HTMLElement): void => {\n\tconst selection = window.getSelection();\n\tif (!selection) return;\n\n\tconst range = document.createRange();\n\trange.selectNodeContents(element);\n\trange.collapse(false);\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n};\n\n/**\n * Вставляет текст в текущую позицию каретки внутри `contenteditable`, заменяя выделенное.\n *\n * Нужно на вставке из буфера: по умолчанию `contenteditable` принимает разметку, и в ячейку\n * приезжает чужое форматирование вместе с текстом.\n *\n * @example\n * onPaste={(event) => {\n * event.preventDefault();\n * insertTextAtCaret(event.currentTarget, event.clipboardData.getData(\"text/plain\"));\n * }}\n */\nexport const insertTextAtCaret = (element: HTMLElement, text: string): void => {\n\tconst selection = window.getSelection();\n\tif (!selection?.rangeCount) return;\n\n\tconst range = selection.getRangeAt(0);\n\tif (!element.contains(range.startContainer)) return;\n\n\trange.deleteContents();\n\tconst node = document.createTextNode(text);\n\trange.insertNode(node);\n\trange.setStartAfter(node);\n\trange.collapse(true);\n\tselection.removeAllRanges();\n\tselection.addRange(range);\n};\n","import { useCallback, useRef, useState } from \"react\";\r\nimport { isElementOverflowing } from \"../../lib/utils/dom\";\r\n\r\nexport const useOverflowTooltip = <T extends HTMLElement>() => {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst ref = useRef<T>(null);\r\n\r\n\tconst onOpenChange = useCallback((newOpen: boolean) => {\r\n\t\tif (newOpen === false) {\r\n\t\t\tsetOpen(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!ref.current) return;\r\n\t\tif (isElementOverflowing(ref.current)) {\r\n\t\t\tsetOpen(true);\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn { open, onOpenChange, ref };\r\n};\r\n","import { cn } from \"@/lib/utils\";\r\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\r\nimport { useOverflowTooltip } from \"./useOverflowTooltip\";\r\nimport React from \"react\";\r\n\r\ntype OverflowTooltipProps = {\r\n\tchildren: React.ReactNode;\r\n\t/**\r\n\t * HTML-элемент для обертки содержимого.\r\n\t * Используется для соблюдения правильной HTML-семантики.\r\n\t * Например:\r\n\t * - span (по умолчанию) для текста и инлайн-элементов\r\n\t * - div для блочного содержимого и сложных структур\r\n\t * @default span\r\n\t */\r\n\ttriggerTag?: React.ElementType;\r\n\t/**\r\n\t * Классы для обработки переполненного содержимого.\r\n\t * Например: \"truncate\", \"line-clamp-3\" и т.д.\r\n\t */\r\n\tclassName?: string;\r\n\t/**\r\n\t * Классы для содержимого тултипа.\r\n\t * С помощью них можно управлять стилями тултипа, например шириной, переносом текста и т.д.\r\n\t */\r\n\ttooltipClassName?: string;\r\n\tfocus?: \"high\";\r\n};\r\n\r\nexport const OverflowTooltip = ({ children, className, focus, triggerTag, tooltipClassName }: OverflowTooltipProps) => {\r\n\tconst { open, onOpenChange, ref } = useOverflowTooltip<HTMLDivElement>();\r\n\tconst TriggerTag = triggerTag || \"span\";\r\n\treturn (\r\n\t\t<TooltipProvider>\r\n\t\t\t<Tooltip open={open} onOpenChange={onOpenChange}>\r\n\t\t\t\t<TooltipTrigger asChild>\r\n\t\t\t\t\t<TriggerTag ref={ref} className={cn(className)}>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</TriggerTag>\r\n\t\t\t\t</TooltipTrigger>\r\n\t\t\t\t<TooltipContent focus={focus} className={cn(\"max-w-xs\", tooltipClassName)}>\r\n\t\t\t\t\t{children}\r\n\t\t\t\t</TooltipContent>\r\n\t\t\t</Tooltip>\r\n\t\t</TooltipProvider>\r\n\t);\r\n};\r\n\r\nOverflowTooltip.displayName = \"OverflowTooltip\";\r\n","import { cn } from \"@/lib/utils\";\r\nimport React from \"react\";\r\nimport { OverflowTooltip } from \"./OverflowTooltip\";\r\n\r\ntype TextOverflowTooltipProps = {\r\n\tchildren?: React.ReactNode;\r\n\tclassName?: string;\r\n\ttooltipClassName?: string;\r\n};\r\n\r\nexport const TextOverflowTooltip = ({ children, className, tooltipClassName }: TextOverflowTooltipProps) => {\r\n\treturn (\r\n\t\t<OverflowTooltip\r\n\t\t\tclassName={cn(\"inline-block max-w-full truncate\", className)}\r\n\t\t\ttooltipClassName={tooltipClassName}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</OverflowTooltip>\r\n\t);\r\n};\r\n\r\nTextOverflowTooltip.displayName = \"TextOverflowTooltip\";\r\n"],"names":["isElementOverflowing","element","useOverflowTooltip","open","setOpen","useState","ref","useRef","onOpenChange","useCallback","newOpen","OverflowTooltip","children","className","focus","triggerTag","tooltipClassName","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","cn","TooltipContent","TextOverflowTooltip"],"mappings":";;;;AASa,MAAAA,IAAuB,CAACC,MAC7BA,EAAQ,cAAcA,EAAQ,eAAeA,EAAQ,eAAeA,EAAQ,cCPvEC,IAAqB,MAA6B;AAC9D,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChCC,IAAMC,EAAU,IAAI,GAEpBC,IAAeC,EAAY,CAACC,MAAqB;AACtD,QAAIA,MAAY,IAAO;AACtB,MAAAN,EAAQ,EAAK;AACb;AAAA,IAAA;AAEG,IAACE,EAAI,WACLN,EAAqBM,EAAI,OAAO,KACnCF,EAAQ,EAAI;AAAA,EAEd,GAAG,EAAE;AAEE,SAAA,EAAE,MAAAD,GAAM,cAAAK,GAAc,KAAAF,EAAI;AAClC,GCUaK,IAAkB,CAAC,EAAE,UAAAC,GAAU,WAAAC,GAAW,OAAAC,GAAO,YAAAC,GAAY,kBAAAC,QAA6C;AACtH,QAAM,EAAE,MAAAb,GAAM,cAAAK,GAAc,KAAAF,EAAA,IAAQJ,EAAmC;AAEvE,SACE,gBAAAe,EAAAC,GAAA,EACA,UAAC,gBAAAC,EAAAC,GAAA,EAAQ,MAAAjB,GAAY,cAAAK,GACpB,UAAA;AAAA,IAAC,gBAAAS,EAAAI,GAAA,EAAe,SAAO,IACtB,UAAC,gBAAAJ,EALcF,KAAc,QAK5B,EAAW,KAAAT,GAAU,WAAWgB,EAAGT,CAAS,GAC3C,UAAAD,EACF,CAAA,GACD;AAAA,IACA,gBAAAK,EAACM,KAAe,OAAAT,GAAc,WAAWQ,EAAG,YAAYN,CAAgB,GACtE,UAAAJ,EACF,CAAA;AAAA,EAAA,EAAA,CACD,EACD,CAAA;AAEF;AAEAD,EAAgB,cAAc;ACtCvB,MAAMa,IAAsB,CAAC,EAAE,UAAAZ,GAAU,WAAAC,GAAW,kBAAAG,QAEzD,gBAAAC;AAAA,EAACN;AAAA,EAAA;AAAA,IACA,WAAWW,EAAG,oCAAoCT,CAAS;AAAA,IAC3D,kBAAAG;AAAA,IAEC,UAAAJ;AAAA,EAAA;AACF;AAIFY,EAAoB,cAAc;"}
|
|
@@ -12,14 +12,13 @@ import { R as me } from "./index-Uiy0Xwy2.js";
|
|
|
12
12
|
import { T as w } from "./index-BVqs-uqP.js";
|
|
13
13
|
import { I as ve } from "./Icon-DH3ev9GK.js";
|
|
14
14
|
import { S as Te } from "./Shortcut-D8L15_ed.js";
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
var [L, ye] = ae("Tooltip", [
|
|
15
|
+
import { T as ge } from "./Text-DeBE8AKl.js";
|
|
16
|
+
var [L, xe] = ae("Tooltip", [
|
|
18
17
|
X
|
|
19
|
-
]), A = X(), W = "TooltipProvider",
|
|
18
|
+
]), A = X(), W = "TooltipProvider", ye = 700, O = "tooltip.open", [Ce, D] = L(W), I = (t) => {
|
|
20
19
|
const {
|
|
21
20
|
__scopeTooltip: o,
|
|
22
|
-
delayDuration: e =
|
|
21
|
+
delayDuration: e = ye,
|
|
23
22
|
skipDelayDuration: r = 300,
|
|
24
23
|
disableHoverableContent: n = !1,
|
|
25
24
|
children: i
|
|
@@ -28,7 +27,7 @@ var [L, ye] = ae("Tooltip", [
|
|
|
28
27
|
const d = l.current;
|
|
29
28
|
return () => window.clearTimeout(d);
|
|
30
29
|
}, []), /* @__PURE__ */ c(
|
|
31
|
-
|
|
30
|
+
Ce,
|
|
32
31
|
{
|
|
33
32
|
scope: o,
|
|
34
33
|
isOpenDelayedRef: a,
|
|
@@ -52,7 +51,7 @@ var [L, ye] = ae("Tooltip", [
|
|
|
52
51
|
);
|
|
53
52
|
};
|
|
54
53
|
I.displayName = W;
|
|
55
|
-
var _ = "Tooltip", [
|
|
54
|
+
var _ = "Tooltip", [be, k] = L(_), M = (t) => {
|
|
56
55
|
const {
|
|
57
56
|
__scopeTooltip: o,
|
|
58
57
|
children: e,
|
|
@@ -80,7 +79,7 @@ var _ = "Tooltip", [we, k] = L(_), M = (t) => {
|
|
|
80
79
|
return s.useEffect(() => () => {
|
|
81
80
|
p.current && (window.clearTimeout(p.current), p.current = 0);
|
|
82
81
|
}, []), /* @__PURE__ */ c(ue, { ...d, children: /* @__PURE__ */ c(
|
|
83
|
-
|
|
82
|
+
be,
|
|
84
83
|
{
|
|
85
84
|
scope: o,
|
|
86
85
|
contentId: m,
|
|
@@ -131,24 +130,24 @@ var S = "TooltipTrigger", H = s.forwardRef(
|
|
|
131
130
|
}
|
|
132
131
|
);
|
|
133
132
|
H.displayName = S;
|
|
134
|
-
var j = "TooltipPortal", [
|
|
133
|
+
var j = "TooltipPortal", [we, Pe] = L(j, {
|
|
135
134
|
forceMount: void 0
|
|
136
135
|
}), G = (t) => {
|
|
137
136
|
const { __scopeTooltip: o, forceMount: e, children: r, container: n } = t, i = k(j, o);
|
|
138
|
-
return /* @__PURE__ */ c(
|
|
137
|
+
return /* @__PURE__ */ c(we, { scope: o, forceMount: e, children: /* @__PURE__ */ c(K, { present: e || i.open, children: /* @__PURE__ */ c(ie, { asChild: !0, container: n, children: r }) }) });
|
|
139
138
|
};
|
|
140
139
|
G.displayName = j;
|
|
141
140
|
var b = "TooltipContent", $ = s.forwardRef(
|
|
142
141
|
(t, o) => {
|
|
143
|
-
const e =
|
|
144
|
-
return /* @__PURE__ */ c(K, { present: r || a.open, children: a.disableHoverableContent ? /* @__PURE__ */ c(Z, { side: n, ...i, ref: o }) : /* @__PURE__ */ c(
|
|
142
|
+
const e = Pe(b, t.__scopeTooltip), { forceMount: r = e.forceMount, side: n = "top", ...i } = t, a = k(b, t.__scopeTooltip);
|
|
143
|
+
return /* @__PURE__ */ c(K, { present: r || a.open, children: a.disableHoverableContent ? /* @__PURE__ */ c(Z, { side: n, ...i, ref: o }) : /* @__PURE__ */ c(Re, { side: n, ...i, ref: o }) });
|
|
145
144
|
}
|
|
146
|
-
),
|
|
145
|
+
), Re = s.forwardRef((t, o) => {
|
|
147
146
|
const e = k(b, t.__scopeTooltip), r = D(b, t.__scopeTooltip), n = s.useRef(null), i = q(o, n), [a, h] = s.useState(null), { trigger: l, onClose: d } = e, u = n.current, { onPointerInTransitChange: f } = r, m = s.useCallback(() => {
|
|
148
147
|
h(null), f(!1);
|
|
149
148
|
}, [f]), p = s.useCallback(
|
|
150
149
|
(v, g) => {
|
|
151
|
-
const T = v.currentTarget, y = { x: v.clientX, y: v.clientY }, x =
|
|
150
|
+
const T = v.currentTarget, y = { x: v.clientX, y: v.clientY }, x = Ne(y, T.getBoundingClientRect()), P = Le(y, x), R = Ae(g.getBoundingClientRect()), E = Se([...P, ...R]);
|
|
152
151
|
h(E), f(!0);
|
|
153
152
|
},
|
|
154
153
|
[f]
|
|
@@ -163,13 +162,13 @@ var b = "TooltipContent", $ = s.forwardRef(
|
|
|
163
162
|
}, [l, u, p, m]), s.useEffect(() => {
|
|
164
163
|
if (a) {
|
|
165
164
|
const v = (g) => {
|
|
166
|
-
const T = g.target, y = { x: g.clientX, y: g.clientY }, x = l?.contains(T) || u?.contains(T), P = !
|
|
165
|
+
const T = g.target, y = { x: g.clientX, y: g.clientY }, x = l?.contains(T) || u?.contains(T), P = !Oe(y, a);
|
|
167
166
|
x ? m() : P && (m(), d());
|
|
168
167
|
};
|
|
169
168
|
return document.addEventListener("pointermove", v), () => document.removeEventListener("pointermove", v);
|
|
170
169
|
}
|
|
171
170
|
}, [l, u, a, d, m]), /* @__PURE__ */ c(Z, { ...t, ref: i });
|
|
172
|
-
}), [
|
|
171
|
+
}), [Ee, _e] = L(_, { isInside: !1 }), ke = se("TooltipContent"), Z = s.forwardRef(
|
|
173
172
|
(t, o) => {
|
|
174
173
|
const {
|
|
175
174
|
__scopeTooltip: e,
|
|
@@ -211,8 +210,8 @@ var b = "TooltipContent", $ = s.forwardRef(
|
|
|
211
210
|
"--radix-tooltip-trigger-height": "var(--radix-popper-anchor-height)"
|
|
212
211
|
},
|
|
213
212
|
children: [
|
|
214
|
-
/* @__PURE__ */ c(
|
|
215
|
-
/* @__PURE__ */ c(
|
|
213
|
+
/* @__PURE__ */ c(ke, { children: r }),
|
|
214
|
+
/* @__PURE__ */ c(Ee, { scope: e, isInside: !0, children: /* @__PURE__ */ c(me, { id: l.contentId, role: "tooltip", children: n || r }) })
|
|
216
215
|
]
|
|
217
216
|
}
|
|
218
217
|
)
|
|
@@ -224,14 +223,14 @@ $.displayName = b;
|
|
|
224
223
|
var J = "TooltipArrow", z = s.forwardRef(
|
|
225
224
|
(t, o) => {
|
|
226
225
|
const { __scopeTooltip: e, ...r } = t, n = A(e);
|
|
227
|
-
return
|
|
226
|
+
return _e(
|
|
228
227
|
J,
|
|
229
228
|
e
|
|
230
229
|
).isInside ? null : /* @__PURE__ */ c(de, { ...n, ...r, ref: o });
|
|
231
230
|
}
|
|
232
231
|
);
|
|
233
232
|
z.displayName = J;
|
|
234
|
-
function
|
|
233
|
+
function Ne(t, o) {
|
|
235
234
|
const e = Math.abs(o.top - t.y), r = Math.abs(o.bottom - t.y), n = Math.abs(o.right - t.x), i = Math.abs(o.left - t.x);
|
|
236
235
|
switch (Math.min(e, r, n, i)) {
|
|
237
236
|
case i:
|
|
@@ -246,7 +245,7 @@ function Le(t, o) {
|
|
|
246
245
|
throw new Error("unreachable");
|
|
247
246
|
}
|
|
248
247
|
}
|
|
249
|
-
function
|
|
248
|
+
function Le(t, o, e = 5) {
|
|
250
249
|
const r = [];
|
|
251
250
|
switch (o) {
|
|
252
251
|
case "top":
|
|
@@ -276,7 +275,7 @@ function Ae(t, o, e = 5) {
|
|
|
276
275
|
}
|
|
277
276
|
return r;
|
|
278
277
|
}
|
|
279
|
-
function
|
|
278
|
+
function Ae(t) {
|
|
280
279
|
const { top: o, right: e, bottom: r, left: n } = t;
|
|
281
280
|
return [
|
|
282
281
|
{ x: n, y: o },
|
|
@@ -285,7 +284,7 @@ function Oe(t) {
|
|
|
285
284
|
{ x: n, y: r }
|
|
286
285
|
];
|
|
287
286
|
}
|
|
288
|
-
function
|
|
287
|
+
function Oe(t, o) {
|
|
289
288
|
const { x: e, y: r } = t;
|
|
290
289
|
let n = !1;
|
|
291
290
|
for (let i = 0, a = o.length - 1; i < o.length; a = i++) {
|
|
@@ -294,11 +293,11 @@ function Se(t, o) {
|
|
|
294
293
|
}
|
|
295
294
|
return n;
|
|
296
295
|
}
|
|
297
|
-
function
|
|
296
|
+
function Se(t) {
|
|
298
297
|
const o = t.slice();
|
|
299
|
-
return o.sort((e, r) => e.x < r.x ? -1 : e.x > r.x ? 1 : e.y < r.y ? -1 : e.y > r.y ? 1 : 0),
|
|
298
|
+
return o.sort((e, r) => e.x < r.x ? -1 : e.x > r.x ? 1 : e.y < r.y ? -1 : e.y > r.y ? 1 : 0), De(o);
|
|
300
299
|
}
|
|
301
|
-
function
|
|
300
|
+
function De(t) {
|
|
302
301
|
if (t.length <= 1) return t.slice();
|
|
303
302
|
const o = [];
|
|
304
303
|
for (let r = 0; r < t.length; r++) {
|
|
@@ -324,7 +323,7 @@ function Ie(t) {
|
|
|
324
323
|
return e.pop(), o.length === 1 && e.length === 1 && o[0].x === e[0].x && o[0].y === e[0].y ? o : o.concat(e);
|
|
325
324
|
}
|
|
326
325
|
var Q = I, ee = M, te = H, oe = G, F = $, B = z;
|
|
327
|
-
const
|
|
326
|
+
const it = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
328
327
|
__proto__: null,
|
|
329
328
|
Arrow: B,
|
|
330
329
|
Content: F,
|
|
@@ -338,8 +337,8 @@ const ct = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
338
337
|
TooltipProvider: I,
|
|
339
338
|
TooltipTrigger: H,
|
|
340
339
|
Trigger: te,
|
|
341
|
-
createTooltipScope:
|
|
342
|
-
}, Symbol.toStringTag, { value: "Module" })), re = s.createContext({}), N = () => s.useContext(re),
|
|
340
|
+
createTooltipScope: xe
|
|
341
|
+
}, Symbol.toStringTag, { value: "Module" })), re = s.createContext({}), N = () => s.useContext(re), lt = Q, ct = ee, ut = te, Ie = w({
|
|
343
342
|
slots: {
|
|
344
343
|
fill: "fill-status-neutral-fg",
|
|
345
344
|
stroke: "stroke-primary-border stroke-[0.5px]",
|
|
@@ -353,9 +352,9 @@ const ct = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
353
352
|
}
|
|
354
353
|
}
|
|
355
354
|
}
|
|
356
|
-
}),
|
|
355
|
+
}), Me = s.forwardRef(
|
|
357
356
|
({ width: t, height: o, className: e, ...r }, n) => {
|
|
358
|
-
const { focus: i } = N(), a =
|
|
357
|
+
const { focus: i } = N(), a = Ie({ focus: i });
|
|
359
358
|
return /* @__PURE__ */ c(B, { ref: n, asChild: !0, ...r, children: /* @__PURE__ */ Y(
|
|
360
359
|
"svg",
|
|
361
360
|
{
|
|
@@ -380,8 +379,8 @@ const ct = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
380
379
|
) });
|
|
381
380
|
}
|
|
382
381
|
);
|
|
383
|
-
|
|
384
|
-
const
|
|
382
|
+
Me.displayName = B.displayName;
|
|
383
|
+
const He = w({
|
|
385
384
|
base: [
|
|
386
385
|
"z-50 rounded-lg border-[0.5px] px-2 py-1.5 text-xs backdrop-blur animate-in fade-in-0 zoom-in-95",
|
|
387
386
|
"border-primary-border bg-alpha-30 text-primary-fg shadow-soft-sm",
|
|
@@ -393,81 +392,81 @@ const je = w({
|
|
|
393
392
|
high: "border-0 bg-alpha-high-20 text-inverse-primary-fg shadow-soft-base"
|
|
394
393
|
}
|
|
395
394
|
}
|
|
396
|
-
}),
|
|
395
|
+
}), je = s.forwardRef(
|
|
397
396
|
({ className: t, sideOffset: o = 8, portalContainer: e, focus: r, ...n }, i) => {
|
|
398
|
-
const a =
|
|
397
|
+
const a = e;
|
|
399
398
|
return /* @__PURE__ */ c(re.Provider, { value: { focus: r }, children: /* @__PURE__ */ c(oe, { container: a, children: /* @__PURE__ */ c(
|
|
400
399
|
F,
|
|
401
400
|
{
|
|
402
401
|
ref: i,
|
|
403
402
|
sideOffset: o,
|
|
404
|
-
className:
|
|
403
|
+
className: He({ className: t, focus: r }),
|
|
405
404
|
...n
|
|
406
405
|
}
|
|
407
406
|
) }) });
|
|
408
407
|
}
|
|
409
408
|
);
|
|
410
|
-
|
|
411
|
-
const
|
|
409
|
+
je.displayName = F.displayName;
|
|
410
|
+
const Ge = w({
|
|
412
411
|
base: "text-sm font-medium text-primary-fg",
|
|
413
412
|
variants: {
|
|
414
413
|
focus: {
|
|
415
414
|
high: "text-inverse-primary-fg"
|
|
416
415
|
}
|
|
417
416
|
}
|
|
418
|
-
}),
|
|
417
|
+
}), $e = s.forwardRef(({ className: t, children: o, ...e }, r) => {
|
|
419
418
|
const { focus: n } = N();
|
|
420
|
-
return /* @__PURE__ */ c("div", { ref: r, className:
|
|
419
|
+
return /* @__PURE__ */ c("div", { ref: r, className: Ge({ className: t, focus: n }), ...e, children: o });
|
|
421
420
|
});
|
|
422
|
-
|
|
423
|
-
const
|
|
421
|
+
$e.displayName = "TooltipTitle";
|
|
422
|
+
const ze = w({
|
|
424
423
|
base: "",
|
|
425
424
|
variants: {
|
|
426
425
|
focus: {
|
|
427
426
|
high: "text-inverse-secondary-fg"
|
|
428
427
|
}
|
|
429
428
|
}
|
|
430
|
-
}),
|
|
429
|
+
}), Fe = s.forwardRef(({ className: t, children: o, ...e }, r) => {
|
|
431
430
|
const { focus: n } = N();
|
|
432
|
-
return /* @__PURE__ */ c(
|
|
431
|
+
return /* @__PURE__ */ c(ge, { ref: r, size: "xs", className: ze({ className: t, focus: n }), ...e, children: o });
|
|
433
432
|
});
|
|
434
|
-
|
|
435
|
-
const
|
|
433
|
+
Fe.displayName = "TooltipText";
|
|
434
|
+
const Be = w({
|
|
436
435
|
base: "shrink-0 text-xs text-primary-fg",
|
|
437
436
|
variants: {
|
|
438
437
|
focus: {
|
|
439
438
|
high: "text-inverse-primary-fg"
|
|
440
439
|
}
|
|
441
440
|
}
|
|
442
|
-
}),
|
|
441
|
+
}), Ue = s.forwardRef(({ className: t, ...o }, e) => {
|
|
443
442
|
const { focus: r } = N();
|
|
444
|
-
return /* @__PURE__ */ c(ve, { size: "lg", className:
|
|
443
|
+
return /* @__PURE__ */ c(ve, { size: "lg", className: Be({ className: t, focus: r }), ref: e, ...o });
|
|
445
444
|
});
|
|
446
|
-
|
|
447
|
-
const
|
|
445
|
+
Ue.displayName = "TooltipIcon";
|
|
446
|
+
const Ve = w({
|
|
448
447
|
base: "h-auto p-0 text-xs text-muted",
|
|
449
448
|
variants: {
|
|
450
449
|
focus: {
|
|
451
450
|
high: "text-inverse-secondary-fg opacity-70"
|
|
452
451
|
}
|
|
453
452
|
}
|
|
454
|
-
}),
|
|
453
|
+
}), Ye = s.forwardRef(({ className: t, ...o }, e) => {
|
|
455
454
|
const { focus: r } = N();
|
|
456
|
-
return /* @__PURE__ */ c(Te, { variant: "ghost", className:
|
|
455
|
+
return /* @__PURE__ */ c(Te, { variant: "ghost", className: Ve({ className: t, focus: r }), ref: e, ...o });
|
|
457
456
|
});
|
|
458
|
-
|
|
457
|
+
Ye.displayName = "TooltipShortcut";
|
|
459
458
|
export {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
459
|
+
ct as T,
|
|
460
|
+
lt as a,
|
|
461
|
+
ut as b,
|
|
462
|
+
je as c,
|
|
463
|
+
Me as d,
|
|
464
|
+
$e as e,
|
|
465
|
+
Fe as f,
|
|
466
|
+
Ue as g,
|
|
467
|
+
Ye as h,
|
|
469
468
|
re as i,
|
|
470
|
-
|
|
469
|
+
it as j,
|
|
471
470
|
N as u
|
|
472
471
|
};
|
|
473
|
-
//# sourceMappingURL=Tooltip-
|
|
472
|
+
//# sourceMappingURL=Tooltip-D2XvRS0c.js.map
|