@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,338 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { ChevronDown, ChevronUp, Search } from "lucide-react";
|
|
5
|
+
import { SgInputText } from "../inputs/SgInputText";
|
|
6
|
+
import { SgButton } from "../buttons/SgButton";
|
|
7
|
+
function cn(...parts) {
|
|
8
|
+
return parts.filter(Boolean).join(" ");
|
|
9
|
+
}
|
|
10
|
+
export function sgTreeFromJson(json, iconRegistry) {
|
|
11
|
+
const walk = (list) => list.map((n) => ({
|
|
12
|
+
id: n.id,
|
|
13
|
+
label: n.label,
|
|
14
|
+
disabled: n.disabled,
|
|
15
|
+
icon: n.icon ? iconRegistry?.[n.icon] : undefined,
|
|
16
|
+
children: n.children?.length ? walk(n.children) : undefined,
|
|
17
|
+
meta: n.meta
|
|
18
|
+
}));
|
|
19
|
+
return walk(json);
|
|
20
|
+
}
|
|
21
|
+
export function sgTreeFromJsonWithChecked(json, iconRegistry) {
|
|
22
|
+
const checkedIds = [];
|
|
23
|
+
const walk = (list) => list.map((n) => {
|
|
24
|
+
if (n.checked)
|
|
25
|
+
checkedIds.push(n.id);
|
|
26
|
+
return {
|
|
27
|
+
id: n.id,
|
|
28
|
+
label: n.label,
|
|
29
|
+
disabled: n.disabled,
|
|
30
|
+
icon: n.icon ? iconRegistry?.[n.icon] : undefined,
|
|
31
|
+
children: n.children?.length ? walk(n.children) : undefined,
|
|
32
|
+
meta: n.meta
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
const nodes = walk(json);
|
|
36
|
+
// If a branch is checked, include all descendants to reflect the visual state.
|
|
37
|
+
const maps = buildMaps(nodes);
|
|
38
|
+
const expandedChecked = new Set();
|
|
39
|
+
for (const id of checkedIds) {
|
|
40
|
+
expandedChecked.add(id);
|
|
41
|
+
const descendants = collectDescendants(maps.childrenById, id);
|
|
42
|
+
for (const d of descendants)
|
|
43
|
+
expandedChecked.add(d);
|
|
44
|
+
}
|
|
45
|
+
return { nodes, checkedIds: Array.from(expandedChecked) };
|
|
46
|
+
}
|
|
47
|
+
function collectAllIds(nodes, out) {
|
|
48
|
+
for (const n of nodes) {
|
|
49
|
+
out.add(n.id);
|
|
50
|
+
if (n.children?.length)
|
|
51
|
+
collectAllIds(n.children, out);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function buildMaps(nodes) {
|
|
55
|
+
const parentById = new Map();
|
|
56
|
+
const nodeById = new Map();
|
|
57
|
+
const childrenById = new Map();
|
|
58
|
+
function walk(list, parentId) {
|
|
59
|
+
for (const n of list) {
|
|
60
|
+
parentById.set(n.id, parentId);
|
|
61
|
+
nodeById.set(n.id, n);
|
|
62
|
+
childrenById.set(n.id, (n.children ?? []).map((c) => c.id));
|
|
63
|
+
if (n.children?.length)
|
|
64
|
+
walk(n.children, n.id);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
walk(nodes, null);
|
|
68
|
+
return { parentById, nodeById, childrenById };
|
|
69
|
+
}
|
|
70
|
+
function collectDescendants(childrenById, id) {
|
|
71
|
+
const out = [];
|
|
72
|
+
const stack = [...(childrenById.get(id) ?? [])];
|
|
73
|
+
while (stack.length) {
|
|
74
|
+
const cur = stack.pop();
|
|
75
|
+
out.push(cur);
|
|
76
|
+
const kids = childrenById.get(cur);
|
|
77
|
+
if (kids?.length)
|
|
78
|
+
stack.push(...kids);
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
function collectAncestors(parentById, id) {
|
|
83
|
+
const out = [];
|
|
84
|
+
let cur = parentById.get(id) ?? null;
|
|
85
|
+
while (cur) {
|
|
86
|
+
out.push(cur);
|
|
87
|
+
cur = parentById.get(cur) ?? null;
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
function filterTreeByQuery(nodes, query) {
|
|
92
|
+
const q = query.trim().toLowerCase();
|
|
93
|
+
if (!q)
|
|
94
|
+
return { filtered: nodes, matchIds: new Set() };
|
|
95
|
+
const matchIds = new Set();
|
|
96
|
+
function dfs(list) {
|
|
97
|
+
const res = [];
|
|
98
|
+
for (const n of list) {
|
|
99
|
+
const selfMatch = n.label.toLowerCase().includes(q);
|
|
100
|
+
const kids = n.children?.length ? dfs(n.children) : [];
|
|
101
|
+
if (selfMatch || kids.length) {
|
|
102
|
+
if (selfMatch)
|
|
103
|
+
matchIds.add(n.id);
|
|
104
|
+
res.push({ ...n, children: kids.length ? kids : n.children ? [] : undefined });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return res;
|
|
108
|
+
}
|
|
109
|
+
return { filtered: dfs(nodes), matchIds };
|
|
110
|
+
}
|
|
111
|
+
function computeCheckedState(id, childrenById, checked) {
|
|
112
|
+
const kids = childrenById.get(id) ?? [];
|
|
113
|
+
if (!kids.length)
|
|
114
|
+
return checked.has(id) ? "checked" : "unchecked";
|
|
115
|
+
let hasChecked = false;
|
|
116
|
+
let hasUnchecked = false;
|
|
117
|
+
for (const k of kids) {
|
|
118
|
+
const st = computeCheckedState(k, childrenById, checked);
|
|
119
|
+
if (st === "indeterminate")
|
|
120
|
+
return "indeterminate";
|
|
121
|
+
if (st === "checked")
|
|
122
|
+
hasChecked = true;
|
|
123
|
+
if (st === "unchecked")
|
|
124
|
+
hasUnchecked = true;
|
|
125
|
+
if (hasChecked && hasUnchecked)
|
|
126
|
+
return "indeterminate";
|
|
127
|
+
}
|
|
128
|
+
if (hasChecked && !hasUnchecked)
|
|
129
|
+
return "checked";
|
|
130
|
+
if (!hasChecked && hasUnchecked)
|
|
131
|
+
return "unchecked";
|
|
132
|
+
return checked.has(id) ? "checked" : "unchecked";
|
|
133
|
+
}
|
|
134
|
+
function setBranchChecked(id, value, childrenById, checked) {
|
|
135
|
+
const all = [id, ...collectDescendants(childrenById, id)];
|
|
136
|
+
for (const x of all) {
|
|
137
|
+
if (value)
|
|
138
|
+
checked.add(x);
|
|
139
|
+
else
|
|
140
|
+
checked.delete(x);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function useControllable(opts, fallback) {
|
|
144
|
+
const isControlled = "value" in opts && opts.value !== undefined;
|
|
145
|
+
const [inner, setInner] = React.useState("defaultValue" in opts && opts.defaultValue !== undefined ? opts.defaultValue : fallback);
|
|
146
|
+
const value = isControlled ? opts.value : inner;
|
|
147
|
+
const setValue = React.useCallback((next) => {
|
|
148
|
+
if (!isControlled)
|
|
149
|
+
setInner(next);
|
|
150
|
+
opts.onChange?.(next);
|
|
151
|
+
}, [isControlled, opts]);
|
|
152
|
+
return [value, setValue];
|
|
153
|
+
}
|
|
154
|
+
function uniq(arr) {
|
|
155
|
+
return Array.from(new Set(arr));
|
|
156
|
+
}
|
|
157
|
+
function sameStringArray(a, b) {
|
|
158
|
+
if (a === b)
|
|
159
|
+
return true;
|
|
160
|
+
if (a.length !== b.length)
|
|
161
|
+
return false;
|
|
162
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
163
|
+
if (a[i] !== b[i])
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
const sizeMap = {
|
|
169
|
+
sm: { text: "text-xs", btn: "h-8 px-2.5 text-xs", input: "h-8 px-2.5 text-xs", checkbox: "h-3.5 w-3.5", icon: "h-3.5 w-3.5" },
|
|
170
|
+
md: { text: "text-sm", btn: "h-9 px-3 text-sm", input: "h-9 px-3 text-sm", checkbox: "h-4 w-4", icon: "h-4 w-4" },
|
|
171
|
+
lg: { text: "text-base", btn: "h-10 px-3.5 text-base", input: "h-10 px-3.5 text-base", checkbox: "h-5 w-5", icon: "h-5 w-5" }
|
|
172
|
+
};
|
|
173
|
+
const densityMap = {
|
|
174
|
+
compact: { rowPy: "py-0.5", rowPx: "px-1.5", gap: "gap-1.5", caret: "h-5 w-5", indent: 14 },
|
|
175
|
+
normal: { rowPy: "py-1", rowPx: "px-2", gap: "gap-2", caret: "h-6 w-6", indent: 16 },
|
|
176
|
+
comfortable: { rowPy: "py-1.5", rowPx: "px-2.5", gap: "gap-2.5", caret: "h-7 w-7", indent: 18 }
|
|
177
|
+
};
|
|
178
|
+
function toneClasses(tone) {
|
|
179
|
+
if (tone === "muted") {
|
|
180
|
+
return {
|
|
181
|
+
panelBg: "bg-sg-surface2 bg-muted/30",
|
|
182
|
+
rowHover: "hover:bg-sg-hover hover:bg-foreground/5",
|
|
183
|
+
subtle: "text-sg-muted text-muted-foreground"
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
panelBg: "bg-sg-surface bg-background",
|
|
188
|
+
rowHover: "hover:bg-sg-hover hover:bg-foreground/5",
|
|
189
|
+
subtle: "text-sg-muted text-muted-foreground"
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export const SgTreeView = React.forwardRef(function SgTreeView(props, ref) {
|
|
193
|
+
const { nodes, className, size = "md", density = "normal", tone = "default", iconTone = "default", checkable = false, checkMode = "live", confirmSelection = "leafOnly", searchable = false, searchPlaceholder = "Search...", expandMatchesOnSearch = true, branchLabelBehavior = "toggle", emptyText = "No items.", maxHeightClassName = "max-h-[60vh]" } = props;
|
|
194
|
+
const SZ = sizeMap[size];
|
|
195
|
+
const DY = densityMap[density];
|
|
196
|
+
const T = toneClasses(tone);
|
|
197
|
+
const maps = React.useMemo(() => buildMaps(nodes), [nodes]);
|
|
198
|
+
const allIds = React.useMemo(() => {
|
|
199
|
+
const s = new Set();
|
|
200
|
+
collectAllIds(nodes, s);
|
|
201
|
+
return s;
|
|
202
|
+
}, [nodes]);
|
|
203
|
+
const [expandedIds, setExpandedIds] = useControllable(props.expandedIds !== undefined
|
|
204
|
+
? { value: props.expandedIds, onChange: props.onExpandedChange }
|
|
205
|
+
: { defaultValue: props.defaultExpandedIds ?? [], onChange: props.onExpandedChange }, []);
|
|
206
|
+
const [checkedIdsLive, setCheckedIdsLive] = useControllable(props.checkedIds !== undefined
|
|
207
|
+
? { value: props.checkedIds, onChange: (ids) => props.onCheckedChange?.(ids) }
|
|
208
|
+
: { defaultValue: props.defaultCheckedIds ?? [], onChange: props.onCheckedChange }, []);
|
|
209
|
+
const [pendingCheckedIds, setPendingCheckedIds] = React.useState(props.defaultCheckedIds ?? []);
|
|
210
|
+
React.useEffect(() => {
|
|
211
|
+
if (checkMode !== "confirm")
|
|
212
|
+
return;
|
|
213
|
+
if (props.checkedIds)
|
|
214
|
+
setPendingCheckedIds(props.checkedIds);
|
|
215
|
+
}, [checkMode, props.checkedIds]);
|
|
216
|
+
const effectiveCheckedIds = checkMode === "confirm" ? pendingCheckedIds : checkedIdsLive;
|
|
217
|
+
const [search, setSearch] = useControllable(props.searchValue !== undefined
|
|
218
|
+
? { value: props.searchValue, onChange: props.onSearchChange }
|
|
219
|
+
: { defaultValue: props.defaultSearchValue ?? "", onChange: props.onSearchChange }, "");
|
|
220
|
+
const searchId = React.useId();
|
|
221
|
+
const expandedSet = React.useMemo(() => new Set(expandedIds), [expandedIds]);
|
|
222
|
+
const checkedSet = React.useMemo(() => new Set(effectiveCheckedIds), [effectiveCheckedIds]);
|
|
223
|
+
const { filtered, matchIds } = React.useMemo(() => filterTreeByQuery(nodes, search), [nodes, search]);
|
|
224
|
+
React.useEffect(() => {
|
|
225
|
+
if (!expandMatchesOnSearch)
|
|
226
|
+
return;
|
|
227
|
+
const q = search.trim();
|
|
228
|
+
if (!q)
|
|
229
|
+
return;
|
|
230
|
+
const add = new Set(expandedSet);
|
|
231
|
+
for (const id of matchIds) {
|
|
232
|
+
for (const a of collectAncestors(maps.parentById, id))
|
|
233
|
+
add.add(a);
|
|
234
|
+
}
|
|
235
|
+
const nextIds = Array.from(add);
|
|
236
|
+
if (!sameStringArray(nextIds, expandedIds))
|
|
237
|
+
setExpandedIds(nextIds);
|
|
238
|
+
}, [search, expandMatchesOnSearch, matchIds, maps.parentById, expandedSet, expandedIds, setExpandedIds]);
|
|
239
|
+
const toggleExpand = React.useCallback((node) => {
|
|
240
|
+
const isOpen = expandedSet.has(node.id);
|
|
241
|
+
const next = new Set(expandedSet);
|
|
242
|
+
if (isOpen) {
|
|
243
|
+
next.delete(node.id);
|
|
244
|
+
props.onCollapse?.(node);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
next.add(node.id);
|
|
248
|
+
props.onExpand?.(node);
|
|
249
|
+
}
|
|
250
|
+
setExpandedIds(Array.from(next));
|
|
251
|
+
}, [expandedSet, props, setExpandedIds]);
|
|
252
|
+
const applyCheckedIds = React.useCallback((nextIds) => {
|
|
253
|
+
const next = uniq(nextIds);
|
|
254
|
+
if (checkMode === "confirm") {
|
|
255
|
+
setPendingCheckedIds(next);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
setCheckedIdsLive(next);
|
|
259
|
+
}
|
|
260
|
+
}, [checkMode, setCheckedIdsLive]);
|
|
261
|
+
const toggleCheck = React.useCallback((node) => {
|
|
262
|
+
if (!checkable || node.disabled)
|
|
263
|
+
return;
|
|
264
|
+
const next = new Set(checkedSet);
|
|
265
|
+
const st = computeCheckedState(node.id, maps.childrenById, checkedSet);
|
|
266
|
+
const willCheck = st !== "checked";
|
|
267
|
+
setBranchChecked(node.id, willCheck, maps.childrenById, next);
|
|
268
|
+
applyCheckedIds(Array.from(next));
|
|
269
|
+
}, [applyCheckedIds, checkable, checkedSet, maps.childrenById]);
|
|
270
|
+
const expandAll = React.useCallback(() => {
|
|
271
|
+
setExpandedIds(Array.from(allIds));
|
|
272
|
+
}, [allIds, setExpandedIds]);
|
|
273
|
+
const collapseAll = React.useCallback(() => {
|
|
274
|
+
setExpandedIds([]);
|
|
275
|
+
}, [setExpandedIds]);
|
|
276
|
+
const clearChecked = React.useCallback(() => {
|
|
277
|
+
applyCheckedIds([]);
|
|
278
|
+
}, [applyCheckedIds]);
|
|
279
|
+
const getCheckedLeafIds = React.useCallback((ids) => ids.filter((id) => {
|
|
280
|
+
const n = maps.nodeById.get(id);
|
|
281
|
+
return !!n && !(n.children?.length);
|
|
282
|
+
}), [maps.nodeById]);
|
|
283
|
+
React.useImperativeHandle(ref, () => ({
|
|
284
|
+
getCheckedIds: () => effectiveCheckedIds,
|
|
285
|
+
getCheckedLeafIds: () => getCheckedLeafIds(effectiveCheckedIds),
|
|
286
|
+
setCheckedIds: (ids) => applyCheckedIds(ids),
|
|
287
|
+
getExpandedIds: () => expandedIds,
|
|
288
|
+
setExpandedIds: (ids) => setExpandedIds(ids),
|
|
289
|
+
expandAll,
|
|
290
|
+
collapseAll,
|
|
291
|
+
clearChecked
|
|
292
|
+
}));
|
|
293
|
+
const confirmCfg = props.confirmBar ?? false;
|
|
294
|
+
const confirmEnabled = !!confirmCfg && checkable && checkMode === "confirm";
|
|
295
|
+
const confirmSelectedIds = React.useMemo(() => {
|
|
296
|
+
if (confirmSelection === "all")
|
|
297
|
+
return effectiveCheckedIds;
|
|
298
|
+
return getCheckedLeafIds(effectiveCheckedIds);
|
|
299
|
+
}, [confirmSelection, effectiveCheckedIds, getCheckedLeafIds]);
|
|
300
|
+
const confirmDisabled = confirmEnabled &&
|
|
301
|
+
(confirmCfg && confirmCfg.disabledWhenEmpty !== false) &&
|
|
302
|
+
confirmSelectedIds.length === 0;
|
|
303
|
+
const onConfirm = () => {
|
|
304
|
+
if (!confirmEnabled || !confirmCfg)
|
|
305
|
+
return;
|
|
306
|
+
confirmCfg.onConfirm(confirmSelectedIds);
|
|
307
|
+
if (confirmCfg.resetAfterConfirm)
|
|
308
|
+
applyCheckedIds([]);
|
|
309
|
+
};
|
|
310
|
+
const onCancel = () => {
|
|
311
|
+
if (!confirmEnabled || !confirmCfg)
|
|
312
|
+
return;
|
|
313
|
+
confirmCfg.onCancel?.();
|
|
314
|
+
};
|
|
315
|
+
const renderNode = (node, depth) => {
|
|
316
|
+
const hasChildren = !!node.children?.length;
|
|
317
|
+
const isOpen = expandedSet.has(node.id);
|
|
318
|
+
const isDisabled = !!node.disabled;
|
|
319
|
+
const checkedState = checkable ? computeCheckedState(node.id, maps.childrenById, checkedSet) : "unchecked";
|
|
320
|
+
return (_jsxs("div", { children: [_jsxs("div", { className: cn("flex items-center rounded-md", DY.rowPx, DY.rowPy, DY.gap, T.rowHover, isDisabled && "opacity-60"), style: { paddingLeft: 8 + depth * DY.indent }, children: [_jsx("button", { type: "button", className: cn(DY.caret, "shrink-0 rounded-md flex items-center justify-center", "hover:bg-sg-hover2 hover:bg-foreground/10", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", !hasChildren && "opacity-0 pointer-events-none"), onClick: () => hasChildren && !isDisabled && toggleExpand(node), "aria-label": isOpen ? "Collapse" : "Expand", disabled: isDisabled, children: _jsx("span", { className: cn("transition-transform", isOpen && "rotate-90"), children: ">" }) }), checkable && (_jsx("input", { type: "checkbox", className: cn(SZ.checkbox, "rounded border border-sg-border bg-sg-surface", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30"), disabled: isDisabled, checked: checkedState === "checked", ref: (el) => {
|
|
321
|
+
if (el)
|
|
322
|
+
el.indeterminate = checkedState === "indeterminate";
|
|
323
|
+
}, onChange: () => toggleCheck(node) })), node.icon && (_jsx("div", { className: cn("shrink-0", SZ.icon, iconTone === "primary" ? "text-[rgb(var(--sg-primary-600))]" : ""), children: node.icon })), _jsx("button", { type: "button", className: cn("flex-1 text-left rounded-md", SZ.text, isDisabled ? "cursor-not-allowed" : "cursor-pointer", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30"), onClick: () => {
|
|
324
|
+
if (isDisabled)
|
|
325
|
+
return;
|
|
326
|
+
if (!hasChildren) {
|
|
327
|
+
props.onLeafClick?.(node.id);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (branchLabelBehavior === "toggle") {
|
|
331
|
+
toggleExpand(node);
|
|
332
|
+
}
|
|
333
|
+
}, disabled: isDisabled, children: node.label })] }), hasChildren && isOpen && _jsx("div", { children: node.children.map((c) => renderNode(c, depth + 1)) })] }, node.id));
|
|
334
|
+
};
|
|
335
|
+
const hasAny = filtered.length > 0;
|
|
336
|
+
return (_jsxs("div", { className: cn("w-full", className), children: [_jsxs("div", { className: "mb-2 flex items-center gap-2", children: [searchable && (_jsx(SgInputText, { id: searchId, labelText: searchPlaceholder, placeholder: searchPlaceholder, prefixIcon: _jsx(Search, { size: 16 }), clearButton: true, filled: true, inputProps: { value: search }, onChange: (value) => setSearch(value) })), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: expandAll, leftIcon: _jsx(ChevronDown, { className: "size-4" }), children: "Expand all" }), _jsx(SgButton, { severity: "secondary", appearance: "ghost", size: "sm", shape: "rounded", onClick: collapseAll, leftIcon: _jsx(ChevronUp, { className: "size-4" }), children: "Collapse all" }), checkable && (_jsx(SgButton, { severity: "danger", appearance: "outline", size: "sm", shape: "rounded", onClick: clearChecked, title: "Clear selection", children: "Clear" }))] }), _jsxs("div", { className: cn("rounded-sg border border-sg-border", T.panelBg, "text-sg-text"), children: [_jsx("div", { className: cn("overflow-auto", maxHeightClassName), children: _jsx("div", { className: "p-2", children: !hasAny ? (_jsx("div", { className: cn("p-6 text-center", SZ.text, T.subtle), children: emptyText })) : (filtered.map((n) => renderNode(n, 0))) }) }), confirmEnabled && confirmCfg && (_jsx("div", { className: cn("border-t border-sg-border px-3 py-2", (confirmCfg.sticky ?? true) && "sticky bottom-0 bg-sg-surface/95 bg-background/95 backdrop-blur"), children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("div", { className: cn("text-xs", T.subtle), children: confirmCfg.hint ?? (_jsxs(_Fragment, { children: ["Selected: ", _jsx("span", { className: "font-medium text-sg-text", children: confirmSelectedIds.length }), confirmSelection === "leafOnly" ? " (leafs)" : ""] })) }), _jsxs("div", { className: "flex items-center gap-2", children: [(confirmCfg.showCancel ?? false) && (_jsx("button", { type: "button", onClick: onCancel, className: cn("rounded-md border border-sg-border", T.panelBg, "text-sg-text hover:bg-sg-hover", "focus:outline-none focus:ring-2 focus:ring-sg-focus/30", SZ.btn), children: confirmCfg.cancelLabel ?? "Cancel" })), _jsx(SgButton, { severity: "secondary", appearance: "outline", size: "md", shape: "rounded", onClick: clearChecked, disabled: !!confirmDisabled, children: "Clear" }), _jsx(SgButton, { severity: "primary", appearance: "solid", elevation: "sm", size: "md", shape: "rounded", disabled: !!confirmDisabled, onClick: onConfirm, children: confirmCfg.label ?? "Confirm" })] })] }) }))] })] }));
|
|
337
|
+
});
|
|
338
|
+
SgTreeView.displayName = "SgTreeView";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,kBAAkB,EAAE,sBAiBhC,CAAC"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ptBr from "./i18n/pt-BR.json";
|
|
2
|
+
export const componentsManifest = {
|
|
3
|
+
id: "seedgrid-fe-components",
|
|
4
|
+
name: "SeedGrid FE Components",
|
|
5
|
+
version: "0.2.0",
|
|
6
|
+
i18n: {
|
|
7
|
+
defaultLocale: "pt-BR",
|
|
8
|
+
bundles: [
|
|
9
|
+
{
|
|
10
|
+
namespace: "components",
|
|
11
|
+
resources: ptBr,
|
|
12
|
+
distPath: "dist/i18n/pt-BR.json"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
register(_registry) {
|
|
17
|
+
// No navigation or providers for this package.
|
|
18
|
+
}
|
|
19
|
+
};
|
package/dist/masks.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function onlyDigits(value: string): string;
|
|
2
|
+
export declare function maskCpf(value: string): string;
|
|
3
|
+
export declare function maskCnpj(value: string): string;
|
|
4
|
+
export declare function maskCpfCnpj(value: string): string;
|
|
5
|
+
export declare function maskCep(value: string): string;
|
|
6
|
+
export declare function maskPostalCodeBR(value: string): string;
|
|
7
|
+
export declare function maskPostalCodePT(value: string): string;
|
|
8
|
+
export declare function maskPostalCodeUS(value: string): string;
|
|
9
|
+
export declare function maskPostalCodeES(value: string): string;
|
|
10
|
+
export declare function maskPostalCodeUY(value: string): string;
|
|
11
|
+
export declare function maskPostalCodeAR(value: string): string;
|
|
12
|
+
export declare function maskPostalCodePY(value: string): string;
|
|
13
|
+
export declare function maskPhone(value: string): string;
|
|
14
|
+
//# sourceMappingURL=masks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"masks.d.ts","sourceRoot":"","sources":["../src/masks.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,UAEvC;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,UAQpC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,UAWrC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,UAOxC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,UAEpC;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAK7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAK7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAK7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAE7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAE7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAG7C;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,UAE7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAStC"}
|
package/dist/masks.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export function onlyDigits(value) {
|
|
2
|
+
return value.replace(/\D/g, "");
|
|
3
|
+
}
|
|
4
|
+
function onlyAlnumUpper(value) {
|
|
5
|
+
return value.replace(/[^0-9A-Za-z]/g, "").toUpperCase();
|
|
6
|
+
}
|
|
7
|
+
export function maskCpf(value) {
|
|
8
|
+
const digits = onlyDigits(value).slice(0, 11);
|
|
9
|
+
const part1 = digits.slice(0, 3);
|
|
10
|
+
const part2 = digits.slice(3, 6);
|
|
11
|
+
const part3 = digits.slice(6, 9);
|
|
12
|
+
const part4 = digits.slice(9, 11);
|
|
13
|
+
const out = [part1, part2, part3].filter(Boolean).join(".");
|
|
14
|
+
return part4 ? `${out}-${part4}` : out;
|
|
15
|
+
}
|
|
16
|
+
export function maskCnpj(value) {
|
|
17
|
+
const chars = onlyAlnumUpper(value).slice(0, 14);
|
|
18
|
+
const part1 = chars.slice(0, 2);
|
|
19
|
+
const part2 = chars.slice(2, 5);
|
|
20
|
+
const part3 = chars.slice(5, 8);
|
|
21
|
+
const part4 = chars.slice(8, 12);
|
|
22
|
+
const part5 = chars.slice(12, 14);
|
|
23
|
+
let out = [part1, part2, part3].filter(Boolean).join(".");
|
|
24
|
+
if (part4)
|
|
25
|
+
out += `/${part4}`;
|
|
26
|
+
if (part5)
|
|
27
|
+
out += `-${part5}`;
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
export function maskCpfCnpj(value) {
|
|
31
|
+
const alnum = onlyAlnumUpper(value);
|
|
32
|
+
if (/[A-Z]/.test(alnum)) {
|
|
33
|
+
return maskCnpj(alnum);
|
|
34
|
+
}
|
|
35
|
+
const digits = onlyDigits(value);
|
|
36
|
+
return digits.length <= 11 ? maskCpf(digits) : maskCnpj(digits);
|
|
37
|
+
}
|
|
38
|
+
export function maskCep(value) {
|
|
39
|
+
return maskPostalCodeBR(value);
|
|
40
|
+
}
|
|
41
|
+
// BR: 00000-000 (8 digits)
|
|
42
|
+
export function maskPostalCodeBR(value) {
|
|
43
|
+
const digits = onlyDigits(value).slice(0, 8);
|
|
44
|
+
const part1 = digits.slice(0, 5);
|
|
45
|
+
const part2 = digits.slice(5, 8);
|
|
46
|
+
return part2 ? `${part1}-${part2}` : part1;
|
|
47
|
+
}
|
|
48
|
+
// PT: 0000-000 (7 digits)
|
|
49
|
+
export function maskPostalCodePT(value) {
|
|
50
|
+
const digits = onlyDigits(value).slice(0, 7);
|
|
51
|
+
const part1 = digits.slice(0, 4);
|
|
52
|
+
const part2 = digits.slice(4, 7);
|
|
53
|
+
return part2 ? `${part1}-${part2}` : part1;
|
|
54
|
+
}
|
|
55
|
+
// US: 00000 or 00000-0000 (5 or 9 digits)
|
|
56
|
+
export function maskPostalCodeUS(value) {
|
|
57
|
+
const digits = onlyDigits(value).slice(0, 9);
|
|
58
|
+
const part1 = digits.slice(0, 5);
|
|
59
|
+
const part2 = digits.slice(5, 9);
|
|
60
|
+
return part2 ? `${part1}-${part2}` : part1;
|
|
61
|
+
}
|
|
62
|
+
// ES: 00000 (5 digits)
|
|
63
|
+
export function maskPostalCodeES(value) {
|
|
64
|
+
return onlyDigits(value).slice(0, 5);
|
|
65
|
+
}
|
|
66
|
+
// UY: 00000 (5 digits)
|
|
67
|
+
export function maskPostalCodeUY(value) {
|
|
68
|
+
return onlyDigits(value).slice(0, 5);
|
|
69
|
+
}
|
|
70
|
+
// AR: A0000AAA (1 letter + 4 digits + 3 letters) or legacy 0000 (4 digits)
|
|
71
|
+
export function maskPostalCodeAR(value) {
|
|
72
|
+
const clean = value.replaceAll(/[^0-9A-Za-z]/g, "").toUpperCase().slice(0, 8);
|
|
73
|
+
return clean;
|
|
74
|
+
}
|
|
75
|
+
// PY: 000000 (6 digits)
|
|
76
|
+
export function maskPostalCodePY(value) {
|
|
77
|
+
return onlyDigits(value).slice(0, 6);
|
|
78
|
+
}
|
|
79
|
+
export function maskPhone(value) {
|
|
80
|
+
const digits = onlyDigits(value).slice(0, 11);
|
|
81
|
+
const ddd = digits.slice(0, 2);
|
|
82
|
+
const part1 = digits.length > 10 ? digits.slice(2, 7) : digits.slice(2, 6);
|
|
83
|
+
const part2 = digits.length > 10 ? digits.slice(7, 11) : digits.slice(6, 10);
|
|
84
|
+
if (!ddd)
|
|
85
|
+
return digits;
|
|
86
|
+
if (!part1)
|
|
87
|
+
return `(${ddd}`;
|
|
88
|
+
if (!part2)
|
|
89
|
+
return `(${ddd}) ${part1}`;
|
|
90
|
+
return `(${ddd}) ${part1}-${part2}`;
|
|
91
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export type SgDialogSize = "sm" | "md" | "lg" | "xl" | "full";
|
|
3
|
+
export type SgDialogSeverity = "primary" | "secondary" | "success" | "info" | "warning" | "help" | "danger" | "plain";
|
|
4
|
+
export type SgDialogAnimation = "fade" | "zoom" | "slideUp";
|
|
5
|
+
export type SgDialogProps = {
|
|
6
|
+
open?: boolean;
|
|
7
|
+
onOpenChange?: (open: boolean) => void;
|
|
8
|
+
defaultOpen?: boolean;
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
subtitle?: React.ReactNode;
|
|
11
|
+
leading?: React.ReactNode;
|
|
12
|
+
trailing?: React.ReactNode;
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
footer?: React.ReactNode;
|
|
15
|
+
size?: SgDialogSize;
|
|
16
|
+
severity?: SgDialogSeverity;
|
|
17
|
+
animation?: SgDialogAnimation;
|
|
18
|
+
transitionMs?: number;
|
|
19
|
+
autoCloseMs?: number;
|
|
20
|
+
className?: string;
|
|
21
|
+
overlayClassName?: string;
|
|
22
|
+
contentClassName?: string;
|
|
23
|
+
headerClassName?: string;
|
|
24
|
+
bodyClassName?: string;
|
|
25
|
+
footerClassName?: string;
|
|
26
|
+
closeable?: boolean;
|
|
27
|
+
onClose?: () => void;
|
|
28
|
+
closeOnOverlayClick?: boolean;
|
|
29
|
+
closeOnEsc?: boolean;
|
|
30
|
+
lockBodyScroll?: boolean;
|
|
31
|
+
initialFocusRef?: React.RefObject<HTMLElement>;
|
|
32
|
+
restoreFocus?: boolean;
|
|
33
|
+
ariaLabel?: string;
|
|
34
|
+
};
|
|
35
|
+
export declare function SgDialog(props: Readonly<SgDialogProps>): React.ReactPortal | null;
|
|
36
|
+
export declare namespace SgDialog {
|
|
37
|
+
var displayName: string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=SgDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SgDialog.d.ts","sourceRoot":"","sources":["../../src/overlay/SgDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuDF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,4BAqPtD;yBArPe,QAAQ"}
|