@seedgrid/fe-components 0.2.4
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/blocked-email-domains.json +41 -0
- package/dist/buttons/SgButton.d.ts +43 -0
- package/dist/buttons/SgButton.d.ts.map +1 -0
- package/dist/buttons/SgButton.js +123 -0
- package/dist/buttons/SgFloatActionButton.d.ts +60 -0
- package/dist/buttons/SgFloatActionButton.d.ts.map +1 -0
- package/dist/buttons/SgFloatActionButton.js +532 -0
- package/dist/buttons/SgSpeedDial.d.ts +40 -0
- package/dist/buttons/SgSpeedDial.d.ts.map +1 -0
- package/dist/buttons/SgSpeedDial.js +149 -0
- package/dist/buttons/SgSplitButton.d.ts +32 -0
- package/dist/buttons/SgSplitButton.d.ts.map +1 -0
- package/dist/buttons/SgSplitButton.js +81 -0
- package/dist/clock/SgClock.d.ts +28 -0
- package/dist/clock/SgClock.d.ts.map +1 -0
- package/dist/clock/SgClock.js +280 -0
- package/dist/clock/SgTimeProvider.d.ts +13 -0
- package/dist/clock/SgTimeProvider.d.ts.map +1 -0
- package/dist/clock/SgTimeProvider.js +44 -0
- package/dist/clock/themes/SgClockThemePicker.d.ts +14 -0
- package/dist/clock/themes/SgClockThemePicker.d.ts.map +1 -0
- package/dist/clock/themes/SgClockThemePicker.js +71 -0
- package/dist/clock/themes/SgClockThemePreview.d.ts +7 -0
- package/dist/clock/themes/SgClockThemePreview.d.ts.map +1 -0
- package/dist/clock/themes/SgClockThemePreview.js +11 -0
- package/dist/clock/themes/builtins.d.ts +3 -0
- package/dist/clock/themes/builtins.d.ts.map +1 -0
- package/dist/clock/themes/builtins.js +241 -0
- package/dist/clock/themes/index.d.ts +9 -0
- package/dist/clock/themes/index.d.ts.map +1 -0
- package/dist/clock/themes/index.js +7 -0
- package/dist/clock/themes/provider.d.ts +19 -0
- package/dist/clock/themes/provider.d.ts.map +1 -0
- package/dist/clock/themes/provider.js +54 -0
- package/dist/clock/themes/registry.d.ts +9 -0
- package/dist/clock/themes/registry.d.ts.map +1 -0
- package/dist/clock/themes/registry.js +25 -0
- package/dist/clock/themes/renderTheme.d.ts +7 -0
- package/dist/clock/themes/renderTheme.d.ts.map +1 -0
- package/dist/clock/themes/renderTheme.js +41 -0
- package/dist/clock/themes/types.d.ts +21 -0
- package/dist/clock/themes/types.d.ts.map +1 -0
- package/dist/clock/themes/types.js +1 -0
- package/dist/clock/themes/urlThemeCache.d.ts +2 -0
- package/dist/clock/themes/urlThemeCache.d.ts.map +1 -0
- package/dist/clock/themes/urlThemeCache.js +11 -0
- package/dist/clock/themes/useDarkFlag.d.ts +2 -0
- package/dist/clock/themes/useDarkFlag.d.ts.map +1 -0
- package/dist/clock/themes/useDarkFlag.js +14 -0
- package/dist/commons/SgBadge.d.ts +51 -0
- package/dist/commons/SgBadge.d.ts.map +1 -0
- package/dist/commons/SgBadge.js +141 -0
- package/dist/commons/SgBadgeOverlay.d.ts +13 -0
- package/dist/commons/SgBadgeOverlay.d.ts.map +1 -0
- package/dist/commons/SgBadgeOverlay.js +20 -0
- package/dist/commons/SgButton.d.ts +39 -0
- package/dist/commons/SgButton.d.ts.map +1 -0
- package/dist/commons/SgButton.js +116 -0
- package/dist/commons/SgPopup.d.ts +42 -0
- package/dist/commons/SgPopup.d.ts.map +1 -0
- package/dist/commons/SgPopup.js +218 -0
- package/dist/commons/SgToast.d.ts +44 -0
- package/dist/commons/SgToast.d.ts.map +1 -0
- package/dist/commons/SgToast.js +97 -0
- package/dist/commons/SgToaster.d.ts +11 -0
- package/dist/commons/SgToaster.d.ts.map +1 -0
- package/dist/commons/SgToaster.js +85 -0
- package/dist/commons/common-passwords.d.ts +2 -0
- package/dist/commons/common-passwords.d.ts.map +1 -0
- package/dist/commons/common-passwords.js +167 -0
- package/dist/environment/SgEnvironmentProvider.d.ts +31 -0
- package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -0
- package/dist/environment/SgEnvironmentProvider.js +120 -0
- package/dist/environment/persistence.d.ts +44 -0
- package/dist/environment/persistence.d.ts.map +1 -0
- package/dist/environment/persistence.js +149 -0
- package/dist/gadgets/clock/SgClock.d.ts +18 -0
- package/dist/gadgets/clock/SgClock.d.ts.map +1 -0
- package/dist/gadgets/clock/SgClock.js +407 -0
- package/dist/gadgets/clock/SgTimeProvider.d.ts +13 -0
- package/dist/gadgets/clock/SgTimeProvider.d.ts.map +1 -0
- package/dist/gadgets/clock/SgTimeProvider.js +44 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +14 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.js +71 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts +7 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.js +11 -0
- package/dist/gadgets/clock/themes/builtins.d.ts +3 -0
- package/dist/gadgets/clock/themes/builtins.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/builtins.js +241 -0
- package/dist/gadgets/clock/themes/index.d.ts +9 -0
- package/dist/gadgets/clock/themes/index.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/index.js +7 -0
- package/dist/gadgets/clock/themes/provider.d.ts +19 -0
- package/dist/gadgets/clock/themes/provider.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/provider.js +54 -0
- package/dist/gadgets/clock/themes/registry.d.ts +9 -0
- package/dist/gadgets/clock/themes/registry.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/registry.js +25 -0
- package/dist/gadgets/clock/themes/renderTheme.d.ts +7 -0
- package/dist/gadgets/clock/themes/renderTheme.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/renderTheme.js +41 -0
- package/dist/gadgets/clock/themes/types.d.ts +21 -0
- package/dist/gadgets/clock/themes/types.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/types.js +1 -0
- package/dist/gadgets/clock/themes/urlThemeCache.d.ts +2 -0
- package/dist/gadgets/clock/themes/urlThemeCache.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/urlThemeCache.js +11 -0
- package/dist/gadgets/clock/themes/useDarkFlag.d.ts +2 -0
- package/dist/gadgets/clock/themes/useDarkFlag.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/useDarkFlag.js +14 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.d.ts +23 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.d.ts.map +1 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.js +118 -0
- package/dist/gadgets/flip-digit/index.d.ts +3 -0
- package/dist/gadgets/flip-digit/index.d.ts.map +1 -0
- package/dist/gadgets/flip-digit/index.js +1 -0
- package/dist/i18n/en-US.json +76 -0
- package/dist/i18n/es.json +76 -0
- package/dist/i18n/index.d.ts +328 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +87 -0
- package/dist/i18n/pt-BR.json +76 -0
- package/dist/i18n/pt-PT.json +76 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/inputs/FloatingInput.d.ts +13 -0
- package/dist/inputs/FloatingInput.d.ts.map +1 -0
- package/dist/inputs/FloatingInput.js +53 -0
- package/dist/inputs/FloatingSelect.d.ts +15 -0
- package/dist/inputs/FloatingSelect.d.ts.map +1 -0
- package/dist/inputs/FloatingSelect.js +52 -0
- package/dist/inputs/FloatingTextArea.d.ts +11 -0
- package/dist/inputs/FloatingTextArea.d.ts.map +1 -0
- package/dist/inputs/FloatingTextArea.js +34 -0
- package/dist/inputs/InputBirthDate.d.ts +13 -0
- package/dist/inputs/InputBirthDate.d.ts.map +1 -0
- package/dist/inputs/InputBirthDate.js +46 -0
- package/dist/inputs/InputDate.d.ts +8 -0
- package/dist/inputs/InputDate.d.ts.map +1 -0
- package/dist/inputs/InputDate.js +23 -0
- package/dist/inputs/InputEmail.d.ts +14 -0
- package/dist/inputs/InputEmail.d.ts.map +1 -0
- package/dist/inputs/InputEmail.js +43 -0
- package/dist/inputs/InputPassword.d.ts +12 -0
- package/dist/inputs/InputPassword.d.ts.map +1 -0
- package/dist/inputs/InputPassword.js +42 -0
- package/dist/inputs/MaskedInputs.d.ts +27 -0
- package/dist/inputs/MaskedInputs.d.ts.map +1 -0
- package/dist/inputs/MaskedInputs.js +161 -0
- package/dist/inputs/SgAutocomplete.d.ts +42 -0
- package/dist/inputs/SgAutocomplete.d.ts.map +1 -0
- package/dist/inputs/SgAutocomplete.js +241 -0
- package/dist/inputs/SgCurrencyEdit.d.ts +56 -0
- package/dist/inputs/SgCurrencyEdit.d.ts.map +1 -0
- package/dist/inputs/SgCurrencyEdit.js +496 -0
- package/dist/inputs/SgInputBirthDate.d.ts +13 -0
- package/dist/inputs/SgInputBirthDate.d.ts.map +1 -0
- package/dist/inputs/SgInputBirthDate.js +48 -0
- package/dist/inputs/SgInputCEP.d.ts +33 -0
- package/dist/inputs/SgInputCEP.d.ts.map +1 -0
- package/dist/inputs/SgInputCEP.js +117 -0
- package/dist/inputs/SgInputCNPJ.d.ts +20 -0
- package/dist/inputs/SgInputCNPJ.d.ts.map +1 -0
- package/dist/inputs/SgInputCNPJ.js +133 -0
- package/dist/inputs/SgInputCPF.d.ts +15 -0
- package/dist/inputs/SgInputCPF.d.ts.map +1 -0
- package/dist/inputs/SgInputCPF.js +70 -0
- package/dist/inputs/SgInputCPFCNPJ.d.ts +15 -0
- package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -0
- package/dist/inputs/SgInputCPFCNPJ.js +92 -0
- package/dist/inputs/SgInputDate.d.ts +8 -0
- package/dist/inputs/SgInputDate.d.ts.map +1 -0
- package/dist/inputs/SgInputDate.js +120 -0
- package/dist/inputs/SgInputEmail.d.ts +16 -0
- package/dist/inputs/SgInputEmail.d.ts.map +1 -0
- package/dist/inputs/SgInputEmail.js +74 -0
- package/dist/inputs/SgInputFone.d.ts +15 -0
- package/dist/inputs/SgInputFone.d.ts.map +1 -0
- package/dist/inputs/SgInputFone.js +60 -0
- package/dist/inputs/SgInputMasked.d.ts +27 -0
- package/dist/inputs/SgInputMasked.d.ts.map +1 -0
- package/dist/inputs/SgInputMasked.js +161 -0
- package/dist/inputs/SgInputNumber.d.ts +49 -0
- package/dist/inputs/SgInputNumber.d.ts.map +1 -0
- package/dist/inputs/SgInputNumber.js +438 -0
- package/dist/inputs/SgInputPassword.d.ts +26 -0
- package/dist/inputs/SgInputPassword.d.ts.map +1 -0
- package/dist/inputs/SgInputPassword.js +278 -0
- package/dist/inputs/SgInputPhone.d.ts +15 -0
- package/dist/inputs/SgInputPhone.d.ts.map +1 -0
- package/dist/inputs/SgInputPhone.js +66 -0
- package/dist/inputs/SgInputPostalCode.d.ts +37 -0
- package/dist/inputs/SgInputPostalCode.d.ts.map +1 -0
- package/dist/inputs/SgInputPostalCode.js +193 -0
- package/dist/inputs/SgInputSelect.d.ts +16 -0
- package/dist/inputs/SgInputSelect.d.ts.map +1 -0
- package/dist/inputs/SgInputSelect.js +104 -0
- package/dist/inputs/SgInputText.d.ts +49 -0
- package/dist/inputs/SgInputText.d.ts.map +1 -0
- package/dist/inputs/SgInputText.js +336 -0
- package/dist/inputs/SgInputTextArea.d.ts +41 -0
- package/dist/inputs/SgInputTextArea.d.ts.map +1 -0
- package/dist/inputs/SgInputTextArea.js +216 -0
- package/dist/inputs/SgTextEditor.d.ts +27 -0
- package/dist/inputs/SgTextEditor.d.ts.map +1 -0
- package/dist/inputs/SgTextEditor.js +201 -0
- package/dist/integration/module.d.ts +39 -0
- package/dist/integration/module.d.ts.map +1 -0
- package/dist/integration/module.js +1 -0
- package/dist/layout/GroupBox.d.ts +10 -0
- package/dist/layout/GroupBox.d.ts.map +1 -0
- package/dist/layout/GroupBox.js +14 -0
- package/dist/layout/SgCard.d.ts +35 -0
- package/dist/layout/SgCard.d.ts.map +1 -0
- package/dist/layout/SgCard.js +106 -0
- package/dist/layout/SgDockLayout.d.ts +37 -0
- package/dist/layout/SgDockLayout.d.ts.map +1 -0
- package/dist/layout/SgDockLayout.js +101 -0
- package/dist/layout/SgDockZone.d.ts +12 -0
- package/dist/layout/SgDockZone.d.ts.map +1 -0
- package/dist/layout/SgDockZone.js +20 -0
- package/dist/layout/SgGrid.d.ts +18 -0
- package/dist/layout/SgGrid.d.ts.map +1 -0
- package/dist/layout/SgGrid.js +101 -0
- package/dist/layout/SgGroupBox.d.ts +10 -0
- package/dist/layout/SgGroupBox.d.ts.map +1 -0
- package/dist/layout/SgGroupBox.js +14 -0
- package/dist/layout/SgMainPanel.d.ts +11 -0
- package/dist/layout/SgMainPanel.d.ts.map +1 -0
- package/dist/layout/SgMainPanel.js +70 -0
- package/dist/layout/SgPanel.d.ts +22 -0
- package/dist/layout/SgPanel.d.ts.map +1 -0
- package/dist/layout/SgPanel.js +33 -0
- package/dist/layout/SgScreen.d.ts +11 -0
- package/dist/layout/SgScreen.d.ts.map +1 -0
- package/dist/layout/SgScreen.js +18 -0
- package/dist/layout/SgStack.d.ts +15 -0
- package/dist/layout/SgStack.d.ts.map +1 -0
- package/dist/layout/SgStack.js +32 -0
- package/dist/layout/SgToolBar.d.ts +46 -0
- package/dist/layout/SgToolBar.d.ts.map +1 -0
- package/dist/layout/SgToolBar.js +199 -0
- package/dist/layout/SgTreeView.d.ts +80 -0
- package/dist/layout/SgTreeView.d.ts.map +1 -0
- package/dist/layout/SgTreeView.js +338 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +19 -0
- package/dist/masks.d.ts +14 -0
- package/dist/masks.d.ts.map +1 -0
- package/dist/masks.js +91 -0
- package/dist/overlay/SgDialog.d.ts +39 -0
- package/dist/overlay/SgDialog.d.ts.map +1 -0
- package/dist/overlay/SgDialog.js +177 -0
- package/dist/overlay/SgPopup.d.ts +42 -0
- package/dist/overlay/SgPopup.d.ts.map +1 -0
- package/dist/overlay/SgPopup.js +218 -0
- package/dist/rhf.d.ts +6 -0
- package/dist/rhf.d.ts.map +1 -0
- package/dist/rhf.js +1 -0
- package/dist/validators.d.ts +27 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +218 -0
- package/dist/wizard/SGWizard.d.ts +28 -0
- package/dist/wizard/SGWizard.d.ts.map +1 -0
- package/dist/wizard/SGWizard.js +124 -0
- package/package.json +53 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
function cn(...parts) {
|
|
6
|
+
return parts.filter(Boolean).join(" ");
|
|
7
|
+
}
|
|
8
|
+
function sizeClass(size) {
|
|
9
|
+
switch (size) {
|
|
10
|
+
case "sm":
|
|
11
|
+
return "max-w-sm";
|
|
12
|
+
case "md":
|
|
13
|
+
return "max-w-lg";
|
|
14
|
+
case "lg":
|
|
15
|
+
return "max-w-2xl";
|
|
16
|
+
case "xl":
|
|
17
|
+
return "max-w-4xl";
|
|
18
|
+
case "full":
|
|
19
|
+
return "max-w-none w-[calc(100vw-2rem)] h-[calc(100vh-2rem)] max-h-none";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function severityClass(severity) {
|
|
23
|
+
switch (severity) {
|
|
24
|
+
case "primary":
|
|
25
|
+
return "border-t-[hsl(var(--primary))]";
|
|
26
|
+
case "secondary":
|
|
27
|
+
return "border-t-[hsl(var(--secondary))]";
|
|
28
|
+
case "success":
|
|
29
|
+
return "border-t-[hsl(var(--tertiary,var(--accent,var(--primary))))]";
|
|
30
|
+
case "info":
|
|
31
|
+
return "border-t-[hsl(var(--secondary,var(--primary)))]";
|
|
32
|
+
case "warning":
|
|
33
|
+
return "border-t-[hsl(var(--accent,var(--secondary,var(--primary))))]";
|
|
34
|
+
case "help":
|
|
35
|
+
return "border-t-[hsl(var(--secondary,var(--primary)))]";
|
|
36
|
+
case "danger":
|
|
37
|
+
return "border-t-[hsl(var(--destructive))]";
|
|
38
|
+
case "plain":
|
|
39
|
+
default:
|
|
40
|
+
return "border-t-[hsl(var(--border))]";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function contentStateClass(animation, entered) {
|
|
44
|
+
const common = entered ? "opacity-100" : "opacity-0";
|
|
45
|
+
switch (animation) {
|
|
46
|
+
case "fade":
|
|
47
|
+
return common;
|
|
48
|
+
case "zoom":
|
|
49
|
+
return cn(common, entered ? "scale-100" : "scale-95");
|
|
50
|
+
case "slideUp":
|
|
51
|
+
return cn(common, entered ? "translate-y-0" : "translate-y-2");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function SgDialog(props) {
|
|
55
|
+
const { open: openProp, onOpenChange, defaultOpen = false, title, subtitle, leading, trailing, children, footer, size = "md", severity = "plain", animation = "zoom", transitionMs = 160, autoCloseMs, className, overlayClassName, contentClassName, headerClassName, bodyClassName, footerClassName, closeable = true, onClose, closeOnOverlayClick = true, closeOnEsc = true, lockBodyScroll = true, initialFocusRef, restoreFocus = true, ariaLabel } = props;
|
|
56
|
+
const isControlled = openProp !== undefined;
|
|
57
|
+
const [openUncontrolled, setOpenUncontrolled] = React.useState(defaultOpen);
|
|
58
|
+
const open = isControlled ? !!openProp : openUncontrolled;
|
|
59
|
+
const setOpen = React.useCallback((next) => {
|
|
60
|
+
if (!isControlled)
|
|
61
|
+
setOpenUncontrolled(next);
|
|
62
|
+
onOpenChange?.(next);
|
|
63
|
+
}, [isControlled, onOpenChange]);
|
|
64
|
+
const close = React.useCallback(() => {
|
|
65
|
+
if (!open)
|
|
66
|
+
return;
|
|
67
|
+
setOpen(false);
|
|
68
|
+
onClose?.();
|
|
69
|
+
}, [open, setOpen, onClose]);
|
|
70
|
+
const [mounted, setMounted] = React.useState(false);
|
|
71
|
+
const [present, setPresent] = React.useState(open);
|
|
72
|
+
const [entered, setEntered] = React.useState(false);
|
|
73
|
+
React.useEffect(() => setMounted(true), []);
|
|
74
|
+
React.useEffect(() => {
|
|
75
|
+
if (open) {
|
|
76
|
+
setPresent(true);
|
|
77
|
+
const id = window.setTimeout(() => setEntered(true), 0);
|
|
78
|
+
return () => window.clearTimeout(id);
|
|
79
|
+
}
|
|
80
|
+
setEntered(false);
|
|
81
|
+
const id = window.setTimeout(() => setPresent(false), transitionMs);
|
|
82
|
+
return () => window.clearTimeout(id);
|
|
83
|
+
}, [open, transitionMs]);
|
|
84
|
+
React.useEffect(() => {
|
|
85
|
+
if (!open)
|
|
86
|
+
return;
|
|
87
|
+
if (!autoCloseMs || autoCloseMs <= 0)
|
|
88
|
+
return;
|
|
89
|
+
const id = window.setTimeout(() => {
|
|
90
|
+
close();
|
|
91
|
+
}, autoCloseMs);
|
|
92
|
+
return () => window.clearTimeout(id);
|
|
93
|
+
}, [open, autoCloseMs, close]);
|
|
94
|
+
React.useEffect(() => {
|
|
95
|
+
if (!present || !open || !lockBodyScroll)
|
|
96
|
+
return;
|
|
97
|
+
const original = document.body.style.overflow;
|
|
98
|
+
document.body.style.overflow = "hidden";
|
|
99
|
+
return () => {
|
|
100
|
+
document.body.style.overflow = original;
|
|
101
|
+
};
|
|
102
|
+
}, [present, open, lockBodyScroll]);
|
|
103
|
+
const overlayRef = React.useRef(null);
|
|
104
|
+
const contentRef = React.useRef(null);
|
|
105
|
+
const lastActiveRef = React.useRef(null);
|
|
106
|
+
React.useEffect(() => {
|
|
107
|
+
if (!open)
|
|
108
|
+
return;
|
|
109
|
+
lastActiveRef.current = document.activeElement;
|
|
110
|
+
const focusTarget = initialFocusRef?.current ??
|
|
111
|
+
contentRef.current?.querySelector(`[data-sg-dialog-initial-focus="true"], button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`);
|
|
112
|
+
const id = window.setTimeout(() => focusTarget?.focus?.(), 0);
|
|
113
|
+
return () => window.clearTimeout(id);
|
|
114
|
+
}, [open, initialFocusRef]);
|
|
115
|
+
React.useEffect(() => {
|
|
116
|
+
if (open)
|
|
117
|
+
return;
|
|
118
|
+
if (!restoreFocus)
|
|
119
|
+
return;
|
|
120
|
+
lastActiveRef.current?.focus?.();
|
|
121
|
+
}, [open, restoreFocus]);
|
|
122
|
+
React.useEffect(() => {
|
|
123
|
+
if (!open || !closeOnEsc)
|
|
124
|
+
return;
|
|
125
|
+
const onKeyDown = (e) => {
|
|
126
|
+
if (e.key === "Escape") {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
close();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (e.key === "Tab") {
|
|
132
|
+
const root = contentRef.current;
|
|
133
|
+
if (!root)
|
|
134
|
+
return;
|
|
135
|
+
const focusables = Array.from(root.querySelectorAll(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)).filter((el) => !el.hasAttribute("disabled") && el.getAttribute("aria-hidden") !== "true");
|
|
136
|
+
if (focusables.length === 0)
|
|
137
|
+
return;
|
|
138
|
+
const first = focusables[0];
|
|
139
|
+
const last = focusables[focusables.length - 1];
|
|
140
|
+
if (!first || !last)
|
|
141
|
+
return;
|
|
142
|
+
const active = document.activeElement;
|
|
143
|
+
if (!e.shiftKey && active === last) {
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
first.focus();
|
|
146
|
+
}
|
|
147
|
+
else if (e.shiftKey && active === first) {
|
|
148
|
+
e.preventDefault();
|
|
149
|
+
last.focus();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
document.addEventListener("keydown", onKeyDown);
|
|
154
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
155
|
+
}, [open, closeOnEsc, close]);
|
|
156
|
+
const onOverlayMouseDown = (e) => {
|
|
157
|
+
if (!closeOnOverlayClick)
|
|
158
|
+
return;
|
|
159
|
+
if (e.target === overlayRef.current)
|
|
160
|
+
close();
|
|
161
|
+
};
|
|
162
|
+
if (!mounted)
|
|
163
|
+
return null;
|
|
164
|
+
if (!present)
|
|
165
|
+
return null;
|
|
166
|
+
const a11yLabel = ariaLabel ?? (typeof title === "string" ? title : undefined) ?? "Dialog";
|
|
167
|
+
const overlayBase = "fixed inset-0 bg-black/60 backdrop-blur-[1px] transition-opacity";
|
|
168
|
+
const overlayState = entered ? "opacity-100" : "opacity-0";
|
|
169
|
+
const contentBase = "w-full rounded-2xl bg-background text-foreground shadow-2xl border border-border " +
|
|
170
|
+
"max-h-[85vh] flex flex-col transition duration-150 ease-out border-t-4";
|
|
171
|
+
const transitionStyle = { transitionDuration: `${transitionMs}ms` };
|
|
172
|
+
return createPortal(_jsxs("div", { className: cn("fixed inset-0 z-[1000]", className), role: "dialog", "aria-modal": "true", "aria-label": a11yLabel, children: [_jsx("div", { ref: overlayRef, onMouseDown: onOverlayMouseDown, className: cn(overlayBase, overlayState, overlayClassName), style: transitionStyle }), _jsx("div", { className: "fixed inset-0 flex items-center justify-center p-4", children: _jsxs("div", { ref: contentRef, className: cn(contentBase, sizeClass(size), contentStateClass(animation, entered), severityClass(severity), contentClassName), style: transitionStyle, children: [(title || subtitle || closeable || leading || trailing) && (_jsxs("div", { className: cn("px-5 py-4 border-b border-border flex items-start gap-3", headerClassName), children: [leading ? _jsx("div", { className: "shrink-0 pt-0.5", children: leading }) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [title ? _jsx("div", { className: "text-base font-semibold leading-6", children: title }) : null, subtitle ? _jsx("div", { className: "text-sm text-muted-foreground mt-1", children: subtitle }) : null] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [trailing ? _jsx("div", { className: "shrink-0", children: trailing }) : null, closeable ? (_jsx("button", { type: "button", onClick: close, className: cn("inline-flex items-center justify-center h-9 w-9 rounded-lg", "hover:bg-muted/60 active:bg-muted", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring,var(--primary)))]"), "aria-label": "Close", children: _jsx(CloseIcon, {}) })) : null] })] })), _jsx("div", { className: cn("px-5 py-4 overflow-auto", bodyClassName), children: children }), footer ? (_jsx("div", { className: cn("px-5 py-4 border-t border-border flex items-center justify-end gap-2", footerClassName), children: footer })) : null] }) })] }), document.body);
|
|
173
|
+
}
|
|
174
|
+
function CloseIcon() {
|
|
175
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", className: "size-5", "aria-hidden": "true", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }));
|
|
176
|
+
}
|
|
177
|
+
SgDialog.displayName = "SgDialog";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export type SgPopupPlacement = "auto" | "top" | "right" | "bottom" | "left";
|
|
3
|
+
export type SgPopupPreferPlacement = "top" | "right" | "bottom" | "left";
|
|
4
|
+
export type SgPopupAlign = "start" | "center" | "end";
|
|
5
|
+
export type SgPopupSeverity = "primary" | "secondary" | "success" | "info" | "warning" | "help" | "danger" | "plain";
|
|
6
|
+
export type SgPopupAction = {
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
label: string;
|
|
9
|
+
hint?: string;
|
|
10
|
+
severity?: SgPopupSeverity;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
closeOnClick?: boolean;
|
|
13
|
+
onClick?: () => void;
|
|
14
|
+
};
|
|
15
|
+
export type SgPopupProps = {
|
|
16
|
+
title?: string;
|
|
17
|
+
subtitle?: string;
|
|
18
|
+
open?: boolean;
|
|
19
|
+
onOpenChange?: (open: boolean) => void;
|
|
20
|
+
defaultOpen?: boolean;
|
|
21
|
+
onOpen?: () => void;
|
|
22
|
+
onClose?: () => void;
|
|
23
|
+
anchorRef: React.RefObject<HTMLElement>;
|
|
24
|
+
placement?: SgPopupPlacement;
|
|
25
|
+
preferPlacement?: SgPopupPreferPlacement;
|
|
26
|
+
align?: SgPopupAlign;
|
|
27
|
+
offset?: number;
|
|
28
|
+
padding?: number;
|
|
29
|
+
closeOnOutsideClick?: boolean;
|
|
30
|
+
closeOnEscape?: boolean;
|
|
31
|
+
className?: string;
|
|
32
|
+
style?: React.CSSProperties;
|
|
33
|
+
zIndex?: number;
|
|
34
|
+
minWidth?: number | string;
|
|
35
|
+
actions?: SgPopupAction[];
|
|
36
|
+
children?: React.ReactNode;
|
|
37
|
+
};
|
|
38
|
+
export declare function SgPopup(props: Readonly<SgPopupProps>): React.ReactPortal | null;
|
|
39
|
+
export declare namespace SgPopup {
|
|
40
|
+
var displayName: string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=SgPopup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SgPopup.d.ts","sourceRoot":"","sources":["../../src/overlay/SgPopup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmB/B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAExC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAwHF,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,4BAwLpD;yBAxLe,OAAO"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
function cn(...parts) {
|
|
6
|
+
return parts.filter(Boolean).join(" ");
|
|
7
|
+
}
|
|
8
|
+
function clamp(value, min, max) {
|
|
9
|
+
return Math.max(min, Math.min(value, max));
|
|
10
|
+
}
|
|
11
|
+
function useEvent(fn) {
|
|
12
|
+
const ref = React.useRef(fn);
|
|
13
|
+
React.useEffect(() => {
|
|
14
|
+
ref.current = fn;
|
|
15
|
+
}, [fn]);
|
|
16
|
+
return React.useCallback((...args) => ref.current?.(...args), []);
|
|
17
|
+
}
|
|
18
|
+
const ACTION_CLS = {
|
|
19
|
+
primary: "text-primary-foreground bg-primary hover:brightness-95",
|
|
20
|
+
secondary: "text-secondary-foreground bg-secondary hover:brightness-95",
|
|
21
|
+
success: "text-white bg-emerald-600 hover:brightness-95",
|
|
22
|
+
info: "text-white bg-sky-600 hover:brightness-95",
|
|
23
|
+
warning: "text-white bg-amber-600 hover:brightness-95",
|
|
24
|
+
help: "text-white bg-violet-600 hover:brightness-95",
|
|
25
|
+
danger: "text-destructive-foreground bg-destructive hover:brightness-95",
|
|
26
|
+
plain: "text-foreground bg-muted hover:bg-muted/80"
|
|
27
|
+
};
|
|
28
|
+
const ACTION_DEFAULT_CLS = "text-foreground bg-transparent hover:bg-muted/80";
|
|
29
|
+
function computeAlignedLeft(anchor, popup, align) {
|
|
30
|
+
if (align === "start")
|
|
31
|
+
return anchor.left;
|
|
32
|
+
if (align === "center")
|
|
33
|
+
return anchor.left + anchor.width / 2 - popup.width / 2;
|
|
34
|
+
return anchor.right - popup.width;
|
|
35
|
+
}
|
|
36
|
+
function computeAlignedTop(anchor, popup, align) {
|
|
37
|
+
if (align === "start")
|
|
38
|
+
return anchor.top;
|
|
39
|
+
if (align === "center")
|
|
40
|
+
return anchor.top + anchor.height / 2 - popup.height / 2;
|
|
41
|
+
return anchor.bottom - popup.height;
|
|
42
|
+
}
|
|
43
|
+
function chooseAutoPlacement(opts) {
|
|
44
|
+
const { anchor, popup, offset, prefer, viewportW, viewportH } = opts;
|
|
45
|
+
const space = {
|
|
46
|
+
right: viewportW - anchor.right,
|
|
47
|
+
left: anchor.left,
|
|
48
|
+
bottom: viewportH - anchor.bottom,
|
|
49
|
+
top: anchor.top
|
|
50
|
+
};
|
|
51
|
+
const fits = (placement) => {
|
|
52
|
+
if (placement === "left" || placement === "right") {
|
|
53
|
+
return space[placement] >= popup.width + offset;
|
|
54
|
+
}
|
|
55
|
+
return space[placement] >= popup.height + offset;
|
|
56
|
+
};
|
|
57
|
+
const opposite = {
|
|
58
|
+
right: "left",
|
|
59
|
+
left: "right",
|
|
60
|
+
top: "bottom",
|
|
61
|
+
bottom: "top"
|
|
62
|
+
};
|
|
63
|
+
const candidates = [
|
|
64
|
+
prefer,
|
|
65
|
+
opposite[prefer],
|
|
66
|
+
"bottom",
|
|
67
|
+
"top",
|
|
68
|
+
"right",
|
|
69
|
+
"left"
|
|
70
|
+
];
|
|
71
|
+
return candidates.find(fits) ?? prefer;
|
|
72
|
+
}
|
|
73
|
+
function computePosition(opts) {
|
|
74
|
+
const { anchor, popup, placement, preferPlacement, align, offset, padding } = opts;
|
|
75
|
+
const vw = window.innerWidth;
|
|
76
|
+
const vh = window.innerHeight;
|
|
77
|
+
const finalPlacement = placement === "auto"
|
|
78
|
+
? chooseAutoPlacement({
|
|
79
|
+
anchor,
|
|
80
|
+
popup,
|
|
81
|
+
offset,
|
|
82
|
+
prefer: preferPlacement,
|
|
83
|
+
viewportW: vw,
|
|
84
|
+
viewportH: vh
|
|
85
|
+
})
|
|
86
|
+
: placement;
|
|
87
|
+
let top = 0;
|
|
88
|
+
let left = 0;
|
|
89
|
+
if (finalPlacement === "right") {
|
|
90
|
+
left = anchor.right + offset;
|
|
91
|
+
top = computeAlignedTop(anchor, popup, align);
|
|
92
|
+
}
|
|
93
|
+
else if (finalPlacement === "left") {
|
|
94
|
+
left = anchor.left - popup.width - offset;
|
|
95
|
+
top = computeAlignedTop(anchor, popup, align);
|
|
96
|
+
}
|
|
97
|
+
else if (finalPlacement === "bottom") {
|
|
98
|
+
top = anchor.bottom + offset;
|
|
99
|
+
left = computeAlignedLeft(anchor, popup, align);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
top = anchor.top - popup.height - offset;
|
|
103
|
+
left = computeAlignedLeft(anchor, popup, align);
|
|
104
|
+
}
|
|
105
|
+
left = clamp(left, padding, vw - popup.width - padding);
|
|
106
|
+
top = clamp(top, padding, vh - popup.height - padding);
|
|
107
|
+
return { top, left };
|
|
108
|
+
}
|
|
109
|
+
export function SgPopup(props) {
|
|
110
|
+
const { title, subtitle, open, onOpenChange, defaultOpen = false, onOpen, onClose, anchorRef, placement = "auto", preferPlacement = "right", align = "start", offset = 8, padding = 8, closeOnOutsideClick = true, closeOnEscape = true, className, style, zIndex = 60, minWidth = 180, actions, children } = props;
|
|
111
|
+
const isControlled = typeof open === "boolean";
|
|
112
|
+
const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
|
|
113
|
+
const isOpen = isControlled ? open : internalOpen;
|
|
114
|
+
const setOpen = React.useCallback((next) => {
|
|
115
|
+
if (!isControlled)
|
|
116
|
+
setInternalOpen(next);
|
|
117
|
+
onOpenChange?.(next);
|
|
118
|
+
}, [isControlled, onOpenChange]);
|
|
119
|
+
const onOpenEvt = useEvent(onOpen);
|
|
120
|
+
const onCloseEvt = useEvent(onClose);
|
|
121
|
+
const prevOpen = React.useRef(isOpen);
|
|
122
|
+
React.useEffect(() => {
|
|
123
|
+
if (prevOpen.current !== isOpen) {
|
|
124
|
+
if (isOpen)
|
|
125
|
+
onOpenEvt?.();
|
|
126
|
+
else
|
|
127
|
+
onCloseEvt?.();
|
|
128
|
+
prevOpen.current = isOpen;
|
|
129
|
+
}
|
|
130
|
+
}, [isOpen, onOpenEvt, onCloseEvt]);
|
|
131
|
+
const panelRef = React.useRef(null);
|
|
132
|
+
const [pos, setPos] = React.useState(null);
|
|
133
|
+
const recompute = React.useCallback(() => {
|
|
134
|
+
const anchorEl = anchorRef.current;
|
|
135
|
+
const panelEl = panelRef.current;
|
|
136
|
+
if (!anchorEl || !panelEl)
|
|
137
|
+
return;
|
|
138
|
+
const anchorRect = anchorEl.getBoundingClientRect();
|
|
139
|
+
const popupRect = panelEl.getBoundingClientRect();
|
|
140
|
+
const next = computePosition({
|
|
141
|
+
anchor: anchorRect,
|
|
142
|
+
popup: popupRect,
|
|
143
|
+
placement,
|
|
144
|
+
preferPlacement,
|
|
145
|
+
align,
|
|
146
|
+
offset,
|
|
147
|
+
padding
|
|
148
|
+
});
|
|
149
|
+
setPos({ top: next.top, left: next.left });
|
|
150
|
+
}, [anchorRef, placement, preferPlacement, align, offset, padding]);
|
|
151
|
+
React.useLayoutEffect(() => {
|
|
152
|
+
if (!isOpen)
|
|
153
|
+
return;
|
|
154
|
+
recompute();
|
|
155
|
+
const raf = requestAnimationFrame(recompute);
|
|
156
|
+
return () => cancelAnimationFrame(raf);
|
|
157
|
+
}, [isOpen, recompute]);
|
|
158
|
+
React.useEffect(() => {
|
|
159
|
+
if (!isOpen)
|
|
160
|
+
return;
|
|
161
|
+
const onResize = () => recompute();
|
|
162
|
+
const onScroll = () => recompute();
|
|
163
|
+
window.addEventListener("resize", onResize);
|
|
164
|
+
window.addEventListener("scroll", onScroll, { passive: true, capture: true });
|
|
165
|
+
return () => {
|
|
166
|
+
window.removeEventListener("resize", onResize);
|
|
167
|
+
window.removeEventListener("scroll", onScroll, true);
|
|
168
|
+
};
|
|
169
|
+
}, [isOpen, recompute]);
|
|
170
|
+
React.useEffect(() => {
|
|
171
|
+
if (!isOpen)
|
|
172
|
+
return;
|
|
173
|
+
const onDown = (e) => {
|
|
174
|
+
if (!closeOnOutsideClick)
|
|
175
|
+
return;
|
|
176
|
+
const panel = panelRef.current;
|
|
177
|
+
const anchor = anchorRef.current;
|
|
178
|
+
const target = e.target;
|
|
179
|
+
if (panel && panel.contains(target))
|
|
180
|
+
return;
|
|
181
|
+
if (anchor && anchor.contains(target))
|
|
182
|
+
return;
|
|
183
|
+
setOpen(false);
|
|
184
|
+
};
|
|
185
|
+
const onKey = (e) => {
|
|
186
|
+
if (!closeOnEscape)
|
|
187
|
+
return;
|
|
188
|
+
if (e.key === "Escape")
|
|
189
|
+
setOpen(false);
|
|
190
|
+
};
|
|
191
|
+
document.addEventListener("mousedown", onDown);
|
|
192
|
+
document.addEventListener("keydown", onKey);
|
|
193
|
+
return () => {
|
|
194
|
+
document.removeEventListener("mousedown", onDown);
|
|
195
|
+
document.removeEventListener("keydown", onKey);
|
|
196
|
+
};
|
|
197
|
+
}, [isOpen, closeOnOutsideClick, closeOnEscape, setOpen, anchorRef]);
|
|
198
|
+
const close = React.useCallback(() => setOpen(false), [setOpen]);
|
|
199
|
+
if (!isOpen)
|
|
200
|
+
return null;
|
|
201
|
+
const body = (_jsxs("div", { ref: panelRef, className: cn("fixed overflow-hidden rounded-md border border-border bg-background shadow-lg", "min-w-[180px]", className), style: {
|
|
202
|
+
zIndex,
|
|
203
|
+
top: pos?.top ?? -9999,
|
|
204
|
+
left: pos?.left ?? -9999,
|
|
205
|
+
minWidth,
|
|
206
|
+
...style
|
|
207
|
+
}, role: "dialog", "aria-modal": "false", children: [title ? (_jsx("div", { className: "bg-primary px-3 py-2 text-xs font-medium text-primary-foreground", children: title })) : null, subtitle ? (_jsx("div", { className: "border-b border-border bg-background px-3 py-2 text-xs text-muted-foreground", children: subtitle })) : null, children ? _jsx("div", { className: "p-2", children: children }) : null, actions && actions.length > 0 ? (_jsx("div", { className: cn(children ? "border-t border-border" : "", "p-1"), children: actions.map((a, idx) => {
|
|
208
|
+
const hasSeverity = a.severity !== undefined;
|
|
209
|
+
const sev = a.severity ?? "plain";
|
|
210
|
+
return (_jsx("button", { type: "button", disabled: a.disabled, title: a.hint, className: cn("w-full select-none rounded px-3 py-2 text-left text-sm", "transition-[filter,background-color] duration-150", "disabled:opacity-50 disabled:cursor-not-allowed", idx > 0 ? "border-t border-border" : "", hasSeverity ? ACTION_CLS[sev] : ACTION_DEFAULT_CLS), onClick: () => {
|
|
211
|
+
a.onClick?.();
|
|
212
|
+
if (a.closeOnClick ?? true)
|
|
213
|
+
close();
|
|
214
|
+
}, children: _jsxs("span", { className: "inline-flex items-center gap-2", children: [a.icon ? _jsx("span", { className: "inline-flex", children: a.icon }) : null, _jsx("span", { children: a.label })] }) }, idx));
|
|
215
|
+
}) })) : null] }));
|
|
216
|
+
return createPortal(body, document.body);
|
|
217
|
+
}
|
|
218
|
+
SgPopup.displayName = "SgPopup";
|
package/dist/rhf.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rhf.d.ts","sourceRoot":"","sources":["../src/rhf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;CACxB,CAAC"}
|
package/dist/rhf.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SgComponentsI18n, type SgComponentsI18nInput } from "./i18n";
|
|
2
|
+
export declare const DEFAULT_BLOCKED_EMAIL_DOMAINS: string[];
|
|
3
|
+
export declare function getBlockedEmailDomains(extra?: string[]): string[];
|
|
4
|
+
export declare function isBlockedEmailDomain(email: string, extra?: string[]): boolean;
|
|
5
|
+
export declare function onlyDigits(value: string): string;
|
|
6
|
+
export declare function isValidCpf(value: string): boolean;
|
|
7
|
+
export declare function isValidCnpj(value: string): boolean;
|
|
8
|
+
export declare function isValidEmail(value: string): boolean;
|
|
9
|
+
export type PasswordPolicy = {
|
|
10
|
+
minSize?: number;
|
|
11
|
+
upper?: boolean;
|
|
12
|
+
lower?: boolean;
|
|
13
|
+
number?: boolean;
|
|
14
|
+
special?: boolean;
|
|
15
|
+
noRepeat?: boolean;
|
|
16
|
+
expirationDays?: number;
|
|
17
|
+
maxHistory?: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function validatePassword(value: string, policy?: PasswordPolicy, i18n?: SgComponentsI18nInput | SgComponentsI18n): string | null;
|
|
20
|
+
export declare function isDateAfter(value: string, minDate?: string): boolean;
|
|
21
|
+
export declare function isDateBefore(value: string, maxDate?: string): boolean;
|
|
22
|
+
export type BirthDatePolicy = {
|
|
23
|
+
minAge?: number;
|
|
24
|
+
maxAge?: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function validateBirthDate(value: string, policy: BirthDatePolicy, i18n?: SgComponentsI18nInput | SgComponentsI18n): string | null;
|
|
27
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAMrG,eAAO,MAAM,6BAA6B,UAEf,CAAC;AAa5B,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAUtD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAMnE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,WAiBvC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,WAyCxC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,WAEzC;AAuCD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,cAAmB,EAC3B,IAAI,CAAC,EAAE,qBAAqB,GAAG,gBAAgB,iBAkChD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,WAG1D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,WAG3D;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAWF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,qBAAqB,GAAG,gBAAgB,iBAmChD"}
|