@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.
Files changed (270) hide show
  1. package/dist/blocked-email-domains.json +41 -0
  2. package/dist/buttons/SgButton.d.ts +43 -0
  3. package/dist/buttons/SgButton.d.ts.map +1 -0
  4. package/dist/buttons/SgButton.js +123 -0
  5. package/dist/buttons/SgFloatActionButton.d.ts +60 -0
  6. package/dist/buttons/SgFloatActionButton.d.ts.map +1 -0
  7. package/dist/buttons/SgFloatActionButton.js +532 -0
  8. package/dist/buttons/SgSpeedDial.d.ts +40 -0
  9. package/dist/buttons/SgSpeedDial.d.ts.map +1 -0
  10. package/dist/buttons/SgSpeedDial.js +149 -0
  11. package/dist/buttons/SgSplitButton.d.ts +32 -0
  12. package/dist/buttons/SgSplitButton.d.ts.map +1 -0
  13. package/dist/buttons/SgSplitButton.js +81 -0
  14. package/dist/clock/SgClock.d.ts +28 -0
  15. package/dist/clock/SgClock.d.ts.map +1 -0
  16. package/dist/clock/SgClock.js +280 -0
  17. package/dist/clock/SgTimeProvider.d.ts +13 -0
  18. package/dist/clock/SgTimeProvider.d.ts.map +1 -0
  19. package/dist/clock/SgTimeProvider.js +44 -0
  20. package/dist/clock/themes/SgClockThemePicker.d.ts +14 -0
  21. package/dist/clock/themes/SgClockThemePicker.d.ts.map +1 -0
  22. package/dist/clock/themes/SgClockThemePicker.js +71 -0
  23. package/dist/clock/themes/SgClockThemePreview.d.ts +7 -0
  24. package/dist/clock/themes/SgClockThemePreview.d.ts.map +1 -0
  25. package/dist/clock/themes/SgClockThemePreview.js +11 -0
  26. package/dist/clock/themes/builtins.d.ts +3 -0
  27. package/dist/clock/themes/builtins.d.ts.map +1 -0
  28. package/dist/clock/themes/builtins.js +241 -0
  29. package/dist/clock/themes/index.d.ts +9 -0
  30. package/dist/clock/themes/index.d.ts.map +1 -0
  31. package/dist/clock/themes/index.js +7 -0
  32. package/dist/clock/themes/provider.d.ts +19 -0
  33. package/dist/clock/themes/provider.d.ts.map +1 -0
  34. package/dist/clock/themes/provider.js +54 -0
  35. package/dist/clock/themes/registry.d.ts +9 -0
  36. package/dist/clock/themes/registry.d.ts.map +1 -0
  37. package/dist/clock/themes/registry.js +25 -0
  38. package/dist/clock/themes/renderTheme.d.ts +7 -0
  39. package/dist/clock/themes/renderTheme.d.ts.map +1 -0
  40. package/dist/clock/themes/renderTheme.js +41 -0
  41. package/dist/clock/themes/types.d.ts +21 -0
  42. package/dist/clock/themes/types.d.ts.map +1 -0
  43. package/dist/clock/themes/types.js +1 -0
  44. package/dist/clock/themes/urlThemeCache.d.ts +2 -0
  45. package/dist/clock/themes/urlThemeCache.d.ts.map +1 -0
  46. package/dist/clock/themes/urlThemeCache.js +11 -0
  47. package/dist/clock/themes/useDarkFlag.d.ts +2 -0
  48. package/dist/clock/themes/useDarkFlag.d.ts.map +1 -0
  49. package/dist/clock/themes/useDarkFlag.js +14 -0
  50. package/dist/commons/SgBadge.d.ts +51 -0
  51. package/dist/commons/SgBadge.d.ts.map +1 -0
  52. package/dist/commons/SgBadge.js +141 -0
  53. package/dist/commons/SgBadgeOverlay.d.ts +13 -0
  54. package/dist/commons/SgBadgeOverlay.d.ts.map +1 -0
  55. package/dist/commons/SgBadgeOverlay.js +20 -0
  56. package/dist/commons/SgButton.d.ts +39 -0
  57. package/dist/commons/SgButton.d.ts.map +1 -0
  58. package/dist/commons/SgButton.js +116 -0
  59. package/dist/commons/SgPopup.d.ts +42 -0
  60. package/dist/commons/SgPopup.d.ts.map +1 -0
  61. package/dist/commons/SgPopup.js +218 -0
  62. package/dist/commons/SgToast.d.ts +44 -0
  63. package/dist/commons/SgToast.d.ts.map +1 -0
  64. package/dist/commons/SgToast.js +97 -0
  65. package/dist/commons/SgToaster.d.ts +11 -0
  66. package/dist/commons/SgToaster.d.ts.map +1 -0
  67. package/dist/commons/SgToaster.js +85 -0
  68. package/dist/commons/common-passwords.d.ts +2 -0
  69. package/dist/commons/common-passwords.d.ts.map +1 -0
  70. package/dist/commons/common-passwords.js +167 -0
  71. package/dist/environment/SgEnvironmentProvider.d.ts +31 -0
  72. package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -0
  73. package/dist/environment/SgEnvironmentProvider.js +120 -0
  74. package/dist/environment/persistence.d.ts +44 -0
  75. package/dist/environment/persistence.d.ts.map +1 -0
  76. package/dist/environment/persistence.js +149 -0
  77. package/dist/gadgets/clock/SgClock.d.ts +18 -0
  78. package/dist/gadgets/clock/SgClock.d.ts.map +1 -0
  79. package/dist/gadgets/clock/SgClock.js +407 -0
  80. package/dist/gadgets/clock/SgTimeProvider.d.ts +13 -0
  81. package/dist/gadgets/clock/SgTimeProvider.d.ts.map +1 -0
  82. package/dist/gadgets/clock/SgTimeProvider.js +44 -0
  83. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +14 -0
  84. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -0
  85. package/dist/gadgets/clock/themes/SgClockThemePicker.js +71 -0
  86. package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts +7 -0
  87. package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts.map +1 -0
  88. package/dist/gadgets/clock/themes/SgClockThemePreview.js +11 -0
  89. package/dist/gadgets/clock/themes/builtins.d.ts +3 -0
  90. package/dist/gadgets/clock/themes/builtins.d.ts.map +1 -0
  91. package/dist/gadgets/clock/themes/builtins.js +241 -0
  92. package/dist/gadgets/clock/themes/index.d.ts +9 -0
  93. package/dist/gadgets/clock/themes/index.d.ts.map +1 -0
  94. package/dist/gadgets/clock/themes/index.js +7 -0
  95. package/dist/gadgets/clock/themes/provider.d.ts +19 -0
  96. package/dist/gadgets/clock/themes/provider.d.ts.map +1 -0
  97. package/dist/gadgets/clock/themes/provider.js +54 -0
  98. package/dist/gadgets/clock/themes/registry.d.ts +9 -0
  99. package/dist/gadgets/clock/themes/registry.d.ts.map +1 -0
  100. package/dist/gadgets/clock/themes/registry.js +25 -0
  101. package/dist/gadgets/clock/themes/renderTheme.d.ts +7 -0
  102. package/dist/gadgets/clock/themes/renderTheme.d.ts.map +1 -0
  103. package/dist/gadgets/clock/themes/renderTheme.js +41 -0
  104. package/dist/gadgets/clock/themes/types.d.ts +21 -0
  105. package/dist/gadgets/clock/themes/types.d.ts.map +1 -0
  106. package/dist/gadgets/clock/themes/types.js +1 -0
  107. package/dist/gadgets/clock/themes/urlThemeCache.d.ts +2 -0
  108. package/dist/gadgets/clock/themes/urlThemeCache.d.ts.map +1 -0
  109. package/dist/gadgets/clock/themes/urlThemeCache.js +11 -0
  110. package/dist/gadgets/clock/themes/useDarkFlag.d.ts +2 -0
  111. package/dist/gadgets/clock/themes/useDarkFlag.d.ts.map +1 -0
  112. package/dist/gadgets/clock/themes/useDarkFlag.js +14 -0
  113. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts +23 -0
  114. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts.map +1 -0
  115. package/dist/gadgets/flip-digit/SgFlipDigit.js +118 -0
  116. package/dist/gadgets/flip-digit/index.d.ts +3 -0
  117. package/dist/gadgets/flip-digit/index.d.ts.map +1 -0
  118. package/dist/gadgets/flip-digit/index.js +1 -0
  119. package/dist/i18n/en-US.json +76 -0
  120. package/dist/i18n/es.json +76 -0
  121. package/dist/i18n/index.d.ts +328 -0
  122. package/dist/i18n/index.d.ts.map +1 -0
  123. package/dist/i18n/index.js +87 -0
  124. package/dist/i18n/pt-BR.json +76 -0
  125. package/dist/i18n/pt-PT.json +76 -0
  126. package/dist/index.d.ts +88 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +46 -0
  129. package/dist/inputs/FloatingInput.d.ts +13 -0
  130. package/dist/inputs/FloatingInput.d.ts.map +1 -0
  131. package/dist/inputs/FloatingInput.js +53 -0
  132. package/dist/inputs/FloatingSelect.d.ts +15 -0
  133. package/dist/inputs/FloatingSelect.d.ts.map +1 -0
  134. package/dist/inputs/FloatingSelect.js +52 -0
  135. package/dist/inputs/FloatingTextArea.d.ts +11 -0
  136. package/dist/inputs/FloatingTextArea.d.ts.map +1 -0
  137. package/dist/inputs/FloatingTextArea.js +34 -0
  138. package/dist/inputs/InputBirthDate.d.ts +13 -0
  139. package/dist/inputs/InputBirthDate.d.ts.map +1 -0
  140. package/dist/inputs/InputBirthDate.js +46 -0
  141. package/dist/inputs/InputDate.d.ts +8 -0
  142. package/dist/inputs/InputDate.d.ts.map +1 -0
  143. package/dist/inputs/InputDate.js +23 -0
  144. package/dist/inputs/InputEmail.d.ts +14 -0
  145. package/dist/inputs/InputEmail.d.ts.map +1 -0
  146. package/dist/inputs/InputEmail.js +43 -0
  147. package/dist/inputs/InputPassword.d.ts +12 -0
  148. package/dist/inputs/InputPassword.d.ts.map +1 -0
  149. package/dist/inputs/InputPassword.js +42 -0
  150. package/dist/inputs/MaskedInputs.d.ts +27 -0
  151. package/dist/inputs/MaskedInputs.d.ts.map +1 -0
  152. package/dist/inputs/MaskedInputs.js +161 -0
  153. package/dist/inputs/SgAutocomplete.d.ts +42 -0
  154. package/dist/inputs/SgAutocomplete.d.ts.map +1 -0
  155. package/dist/inputs/SgAutocomplete.js +241 -0
  156. package/dist/inputs/SgCurrencyEdit.d.ts +56 -0
  157. package/dist/inputs/SgCurrencyEdit.d.ts.map +1 -0
  158. package/dist/inputs/SgCurrencyEdit.js +496 -0
  159. package/dist/inputs/SgInputBirthDate.d.ts +13 -0
  160. package/dist/inputs/SgInputBirthDate.d.ts.map +1 -0
  161. package/dist/inputs/SgInputBirthDate.js +48 -0
  162. package/dist/inputs/SgInputCEP.d.ts +33 -0
  163. package/dist/inputs/SgInputCEP.d.ts.map +1 -0
  164. package/dist/inputs/SgInputCEP.js +117 -0
  165. package/dist/inputs/SgInputCNPJ.d.ts +20 -0
  166. package/dist/inputs/SgInputCNPJ.d.ts.map +1 -0
  167. package/dist/inputs/SgInputCNPJ.js +133 -0
  168. package/dist/inputs/SgInputCPF.d.ts +15 -0
  169. package/dist/inputs/SgInputCPF.d.ts.map +1 -0
  170. package/dist/inputs/SgInputCPF.js +70 -0
  171. package/dist/inputs/SgInputCPFCNPJ.d.ts +15 -0
  172. package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -0
  173. package/dist/inputs/SgInputCPFCNPJ.js +92 -0
  174. package/dist/inputs/SgInputDate.d.ts +8 -0
  175. package/dist/inputs/SgInputDate.d.ts.map +1 -0
  176. package/dist/inputs/SgInputDate.js +120 -0
  177. package/dist/inputs/SgInputEmail.d.ts +16 -0
  178. package/dist/inputs/SgInputEmail.d.ts.map +1 -0
  179. package/dist/inputs/SgInputEmail.js +74 -0
  180. package/dist/inputs/SgInputFone.d.ts +15 -0
  181. package/dist/inputs/SgInputFone.d.ts.map +1 -0
  182. package/dist/inputs/SgInputFone.js +60 -0
  183. package/dist/inputs/SgInputMasked.d.ts +27 -0
  184. package/dist/inputs/SgInputMasked.d.ts.map +1 -0
  185. package/dist/inputs/SgInputMasked.js +161 -0
  186. package/dist/inputs/SgInputNumber.d.ts +49 -0
  187. package/dist/inputs/SgInputNumber.d.ts.map +1 -0
  188. package/dist/inputs/SgInputNumber.js +438 -0
  189. package/dist/inputs/SgInputPassword.d.ts +26 -0
  190. package/dist/inputs/SgInputPassword.d.ts.map +1 -0
  191. package/dist/inputs/SgInputPassword.js +278 -0
  192. package/dist/inputs/SgInputPhone.d.ts +15 -0
  193. package/dist/inputs/SgInputPhone.d.ts.map +1 -0
  194. package/dist/inputs/SgInputPhone.js +66 -0
  195. package/dist/inputs/SgInputPostalCode.d.ts +37 -0
  196. package/dist/inputs/SgInputPostalCode.d.ts.map +1 -0
  197. package/dist/inputs/SgInputPostalCode.js +193 -0
  198. package/dist/inputs/SgInputSelect.d.ts +16 -0
  199. package/dist/inputs/SgInputSelect.d.ts.map +1 -0
  200. package/dist/inputs/SgInputSelect.js +104 -0
  201. package/dist/inputs/SgInputText.d.ts +49 -0
  202. package/dist/inputs/SgInputText.d.ts.map +1 -0
  203. package/dist/inputs/SgInputText.js +336 -0
  204. package/dist/inputs/SgInputTextArea.d.ts +41 -0
  205. package/dist/inputs/SgInputTextArea.d.ts.map +1 -0
  206. package/dist/inputs/SgInputTextArea.js +216 -0
  207. package/dist/inputs/SgTextEditor.d.ts +27 -0
  208. package/dist/inputs/SgTextEditor.d.ts.map +1 -0
  209. package/dist/inputs/SgTextEditor.js +201 -0
  210. package/dist/integration/module.d.ts +39 -0
  211. package/dist/integration/module.d.ts.map +1 -0
  212. package/dist/integration/module.js +1 -0
  213. package/dist/layout/GroupBox.d.ts +10 -0
  214. package/dist/layout/GroupBox.d.ts.map +1 -0
  215. package/dist/layout/GroupBox.js +14 -0
  216. package/dist/layout/SgCard.d.ts +35 -0
  217. package/dist/layout/SgCard.d.ts.map +1 -0
  218. package/dist/layout/SgCard.js +106 -0
  219. package/dist/layout/SgDockLayout.d.ts +37 -0
  220. package/dist/layout/SgDockLayout.d.ts.map +1 -0
  221. package/dist/layout/SgDockLayout.js +101 -0
  222. package/dist/layout/SgDockZone.d.ts +12 -0
  223. package/dist/layout/SgDockZone.d.ts.map +1 -0
  224. package/dist/layout/SgDockZone.js +20 -0
  225. package/dist/layout/SgGrid.d.ts +18 -0
  226. package/dist/layout/SgGrid.d.ts.map +1 -0
  227. package/dist/layout/SgGrid.js +101 -0
  228. package/dist/layout/SgGroupBox.d.ts +10 -0
  229. package/dist/layout/SgGroupBox.d.ts.map +1 -0
  230. package/dist/layout/SgGroupBox.js +14 -0
  231. package/dist/layout/SgMainPanel.d.ts +11 -0
  232. package/dist/layout/SgMainPanel.d.ts.map +1 -0
  233. package/dist/layout/SgMainPanel.js +70 -0
  234. package/dist/layout/SgPanel.d.ts +22 -0
  235. package/dist/layout/SgPanel.d.ts.map +1 -0
  236. package/dist/layout/SgPanel.js +33 -0
  237. package/dist/layout/SgScreen.d.ts +11 -0
  238. package/dist/layout/SgScreen.d.ts.map +1 -0
  239. package/dist/layout/SgScreen.js +18 -0
  240. package/dist/layout/SgStack.d.ts +15 -0
  241. package/dist/layout/SgStack.d.ts.map +1 -0
  242. package/dist/layout/SgStack.js +32 -0
  243. package/dist/layout/SgToolBar.d.ts +46 -0
  244. package/dist/layout/SgToolBar.d.ts.map +1 -0
  245. package/dist/layout/SgToolBar.js +199 -0
  246. package/dist/layout/SgTreeView.d.ts +80 -0
  247. package/dist/layout/SgTreeView.d.ts.map +1 -0
  248. package/dist/layout/SgTreeView.js +338 -0
  249. package/dist/manifest.d.ts +3 -0
  250. package/dist/manifest.d.ts.map +1 -0
  251. package/dist/manifest.js +19 -0
  252. package/dist/masks.d.ts +14 -0
  253. package/dist/masks.d.ts.map +1 -0
  254. package/dist/masks.js +91 -0
  255. package/dist/overlay/SgDialog.d.ts +39 -0
  256. package/dist/overlay/SgDialog.d.ts.map +1 -0
  257. package/dist/overlay/SgDialog.js +177 -0
  258. package/dist/overlay/SgPopup.d.ts +42 -0
  259. package/dist/overlay/SgPopup.d.ts.map +1 -0
  260. package/dist/overlay/SgPopup.js +218 -0
  261. package/dist/rhf.d.ts +6 -0
  262. package/dist/rhf.d.ts.map +1 -0
  263. package/dist/rhf.js +1 -0
  264. package/dist/validators.d.ts +27 -0
  265. package/dist/validators.d.ts.map +1 -0
  266. package/dist/validators.js +218 -0
  267. package/dist/wizard/SGWizard.d.ts +28 -0
  268. package/dist/wizard/SGWizard.d.ts.map +1 -0
  269. package/dist/wizard/SGWizard.js +124 -0
  270. package/package.json +53 -0
@@ -0,0 +1,216 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import { X } from "lucide-react";
5
+ import { Controller } from "react-hook-form";
6
+ import { t, useComponentsI18n } from "../i18n";
7
+ function ErrorText(props) {
8
+ if (!props.message)
9
+ return null;
10
+ return _jsx("p", { className: "text-xs text-red-600", children: props.message });
11
+ }
12
+ function mergeTextareaPropsWithField(textareaProps, field) {
13
+ const resolvedValue = typeof field.value === "string" ? field.value : field.value == null ? "" : String(field.value);
14
+ return {
15
+ ...textareaProps,
16
+ value: resolvedValue,
17
+ onChange: (event) => {
18
+ field.onChange(event);
19
+ textareaProps?.onChange?.(event);
20
+ },
21
+ onBlur: (event) => {
22
+ field.onBlur();
23
+ textareaProps?.onBlur?.(event);
24
+ },
25
+ ref: (node) => {
26
+ field.ref(node);
27
+ const ref = textareaProps?.ref;
28
+ if (!ref)
29
+ return;
30
+ if (typeof ref === "function") {
31
+ ref(node);
32
+ }
33
+ else if (ref && typeof ref === "object" && "current" in ref) {
34
+ ref.current = node;
35
+ }
36
+ }
37
+ };
38
+ }
39
+ function SgInputTextAreaBase(props) {
40
+ const i18n = useComponentsI18n();
41
+ const textareaProps = props.textareaProps ?? {};
42
+ const labelText = props.labelText ?? props.label ?? "";
43
+ const placeholder = props.hintText ?? labelText;
44
+ const textareaRef = React.useRef(null);
45
+ const [internalError, setInternalError] = React.useState(null);
46
+ const [hasInteracted, setHasInteracted] = React.useState(false);
47
+ const [isFilled, setIsFilled] = React.useState(() => {
48
+ const value = textareaProps.value ?? textareaProps.defaultValue ?? "";
49
+ return String(value).length > 0;
50
+ });
51
+ const [valueLength, setValueLength] = React.useState(() => {
52
+ const value = textareaProps.value ?? textareaProps.defaultValue ?? "";
53
+ return String(value).length;
54
+ });
55
+ React.useEffect(() => {
56
+ const next = (textareaRef.current?.value ?? "").length > 0;
57
+ if (next !== isFilled)
58
+ setIsFilled(next);
59
+ setValueLength((textareaRef.current?.value ?? "").length);
60
+ });
61
+ React.useEffect(() => {
62
+ if (textareaProps.value === undefined)
63
+ return;
64
+ setIsFilled(String(textareaProps.value ?? "").length > 0);
65
+ setValueLength(String(textareaProps.value ?? "").length);
66
+ }, [textareaProps.value]);
67
+ const setRefs = React.useCallback((node) => {
68
+ textareaRef.current = node;
69
+ const ref = textareaProps.ref;
70
+ if (!ref)
71
+ return;
72
+ if (typeof ref === "function") {
73
+ ref(node);
74
+ }
75
+ else if (typeof ref === "object") {
76
+ ref.current = node;
77
+ }
78
+ }, [textareaProps]);
79
+ const runValidation = React.useCallback((value) => {
80
+ const required = props.required ?? false;
81
+ if (!value && required) {
82
+ const message = props.requiredMessage ?? t(i18n, "components.inputs.textarea.required");
83
+ setInternalError(message);
84
+ props.onValidation?.(message);
85
+ return;
86
+ }
87
+ if (props.maxLength && value.length > props.maxLength) {
88
+ const message = props.maxLengthMessage ??
89
+ t(i18n, "components.inputs.textarea.maxLength", { max: props.maxLength });
90
+ setInternalError(message);
91
+ props.onValidation?.(message);
92
+ return;
93
+ }
94
+ if (props.minLength && value.length < props.minLength) {
95
+ const message = props.minLengthMessage ??
96
+ t(i18n, "components.inputs.textarea.minLength", { min: props.minLength });
97
+ setInternalError(message);
98
+ props.onValidation?.(message);
99
+ return;
100
+ }
101
+ if (props.minNumberOfWords && wordCount(value) < props.minNumberOfWords) {
102
+ const message = props.minNumberOfWordsMessage ??
103
+ t(i18n, "components.inputs.textarea.minWords", { min: props.minNumberOfWords });
104
+ setInternalError(message);
105
+ props.onValidation?.(message);
106
+ return;
107
+ }
108
+ if (props.minLines && lineCount(value) < props.minLines) {
109
+ const message = props.minLinesMessage ?? t(i18n, "components.inputs.textarea.minLines", { min: props.minLines });
110
+ setInternalError(message);
111
+ props.onValidation?.(message);
112
+ return;
113
+ }
114
+ if (props.validation) {
115
+ const message = props.validation(value);
116
+ setInternalError(message);
117
+ props.onValidation?.(message ?? null);
118
+ return;
119
+ }
120
+ setInternalError(null);
121
+ props.onValidation?.(null);
122
+ }, [i18n, props]);
123
+ const handleChange = (event) => {
124
+ setIsFilled(event.currentTarget.value.length > 0);
125
+ setValueLength(event.currentTarget.value.length);
126
+ setHasInteracted(true);
127
+ runValidation(event.currentTarget.value);
128
+ textareaProps.onChange?.(event);
129
+ props.onChange?.(event.currentTarget.value);
130
+ };
131
+ const handleBlur = (event) => {
132
+ setIsFilled(event.currentTarget.value.length > 0);
133
+ if ((props.validateOnBlur ?? true) || hasInteracted) {
134
+ runValidation(event.currentTarget.value);
135
+ }
136
+ textareaProps.onBlur?.(event);
137
+ props.onExit?.();
138
+ };
139
+ const handleFocus = () => {
140
+ props.onEnter?.();
141
+ };
142
+ const handleClear = () => {
143
+ if (!textareaRef.current)
144
+ return;
145
+ textareaRef.current.value = "";
146
+ setIsFilled(false);
147
+ setValueLength(0);
148
+ const event = {
149
+ target: textareaRef.current,
150
+ currentTarget: textareaRef.current
151
+ };
152
+ textareaProps.onChange?.(event);
153
+ props.onChange?.("");
154
+ props.onClear?.();
155
+ };
156
+ const isDisabled = props.enabled === false || textareaProps.readOnly;
157
+ const canShowClear = (props.clearButton ?? true) && !isDisabled;
158
+ const hasSuffix = canShowClear;
159
+ const paddingLeft = props.prefixIcon ? "pl-10" : "px-3";
160
+ const paddingRight = hasSuffix ? "pr-10" : "pr-3";
161
+ const baseClass = "peer w-full rounded-md text-sm placeholder-transparent focus:outline-none";
162
+ const hasError = Boolean(props.error ?? internalError);
163
+ const borderClass = (props.withBorder ?? true) || hasError
164
+ ? hasError
165
+ ? "border border-[hsl(var(--destructive))] shadow-sm focus:border-[hsl(var(--destructive))] focus:ring-2 focus:ring-[hsl(var(--destructive)/0.25)]"
166
+ : "border border-border shadow-sm focus:border-[hsl(var(--primary))] focus:ring-2 focus:ring-[hsl(var(--primary)/0.25)]"
167
+ : "border border-transparent";
168
+ const bgClass = props.filled ? "bg-muted/40" : "bg-white";
169
+ const finalClass = [
170
+ baseClass,
171
+ borderClass,
172
+ bgClass,
173
+ paddingLeft,
174
+ paddingRight,
175
+ "pt-4",
176
+ "pb-3"
177
+ ].join(" ");
178
+ let resolvedBorderRadius;
179
+ if (props.borderRadius !== undefined) {
180
+ resolvedBorderRadius =
181
+ typeof props.borderRadius === "number"
182
+ ? `${props.borderRadius}px`
183
+ : props.borderRadius;
184
+ }
185
+ const resolvedHeight = props.height;
186
+ const textareaStyle = {
187
+ borderRadius: resolvedBorderRadius,
188
+ ...(textareaProps.style ?? {})
189
+ };
190
+ if (resolvedHeight !== undefined) {
191
+ textareaStyle.height =
192
+ typeof resolvedHeight === "number" ? `${resolvedHeight}px` : resolvedHeight;
193
+ }
194
+ return (_jsxs("div", { style: { width: props.width ?? "100%" }, children: [_jsxs("div", { className: "relative", children: [props.prefixIcon ? (_jsx("span", { className: "pointer-events-none absolute left-3 top-3 text-foreground/60", children: props.prefixIcon })) : null, _jsx("textarea", { id: props.id, placeholder: placeholder, className: props.className ?? finalClass, style: textareaStyle, maxLength: props.maxLength, rows: props.maxLines ?? 2, readOnly: props.enabled === false ? true : textareaProps.readOnly, disabled: props.enabled === false, ...textareaProps, ref: setRefs, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus }), _jsx("label", { htmlFor: props.id, className: [
195
+ "absolute left-3 bg-white px-1 transition-all",
196
+ isFilled ? "-top-2 text-xs" : "top-3 text-sm",
197
+ hasError ? "text-[hsl(var(--destructive))]" : isFilled ? "text-[hsl(var(--primary))]" : "text-foreground/60",
198
+ hasError
199
+ ? "peer-focus:-top-2 peer-focus:text-xs peer-focus:text-[hsl(var(--destructive))]"
200
+ : "peer-focus:-top-2 peer-focus:text-xs peer-focus:text-[hsl(var(--primary))]",
201
+ props.labelClassName ?? ""
202
+ ].join(" "), children: labelText }), canShowClear ? (_jsx("button", { type: "button", onClick: handleClear, className: "absolute right-2 top-3 rounded px-1 text-xs text-foreground/60 hover:text-foreground", "aria-label": t(i18n, "components.actions.clear"), children: _jsx(X, { size: 16 }) })) : null] }), _jsxs("div", { className: "mt-0 flex items-center justify-between gap-2", children: [_jsx(ErrorText, { message: props.error ?? internalError ?? undefined }), props.showCharCounter ? (_jsxs("span", { className: "text-[11px] text-foreground/50", children: [valueLength, props.maxLength ? `/${props.maxLength}` : ""] })) : null] })] }));
203
+ }
204
+ export function SgInputTextArea(props) {
205
+ const { control, name, ...rest } = props;
206
+ if (control && name) {
207
+ return (_jsx(Controller, { name: name, control: control, render: ({ field, fieldState }) => (_jsx(SgInputTextAreaBase, { ...rest, error: rest.error ?? fieldState.error?.message, textareaProps: mergeTextareaPropsWithField(rest.textareaProps, field) })) }));
208
+ }
209
+ return _jsx(SgInputTextAreaBase, { ...rest });
210
+ }
211
+ function wordCount(value) {
212
+ return value.trim().split(/\s+/).filter(Boolean).length;
213
+ }
214
+ function lineCount(value) {
215
+ return value.split("\n").length;
216
+ }
@@ -0,0 +1,27 @@
1
+ export type SgTextEditorSaveMeta = {
2
+ htmlDocument: string;
3
+ contentHtml: string;
4
+ cssText: string;
5
+ };
6
+ export type SgTextEditorProps = {
7
+ id: string;
8
+ valueHtml?: string;
9
+ defaultValueHtml?: string;
10
+ onChangeHtml?: (htmlBody: string) => void;
11
+ cssText?: string;
12
+ onCssTextChange?: (cssText: string) => void;
13
+ fileName?: string;
14
+ onSave?: (file: File, meta: SgTextEditorSaveMeta) => void;
15
+ onLoad?: (meta: SgTextEditorSaveMeta) => void;
16
+ height?: number;
17
+ placeholder?: string;
18
+ disabled?: boolean;
19
+ showCssEditor?: boolean;
20
+ cssEditorLabel?: string;
21
+ className?: string;
22
+ };
23
+ export declare function SgTextEditor(props: Readonly<SgTextEditorProps>): import("react/jsx-runtime").JSX.Element;
24
+ export declare namespace SgTextEditor {
25
+ var displayName: string;
26
+ }
27
+ //# sourceMappingURL=SgTextEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SgTextEditor.d.ts","sourceRoot":"","sources":["../../src/inputs/SgTextEditor.tsx"],"names":[],"mappings":"AAgBA,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAE9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2DF,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,2CAgY9D;yBAhYe,YAAY"}
@@ -0,0 +1,201 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { EditorContent, useEditor } from "@tiptap/react";
5
+ import StarterKit from "@tiptap/starter-kit";
6
+ import Underline from "@tiptap/extension-underline";
7
+ import Link from "@tiptap/extension-link";
8
+ import Image from "@tiptap/extension-image";
9
+ import TextAlign from "@tiptap/extension-text-align";
10
+ import TextStyle from "@tiptap/extension-text-style";
11
+ import Color from "@tiptap/extension-color";
12
+ import Highlight from "@tiptap/extension-highlight";
13
+ import Subscript from "@tiptap/extension-subscript";
14
+ import Superscript from "@tiptap/extension-superscript";
15
+ import FontFamily from "@tiptap/extension-font-family";
16
+ function cn(...parts) {
17
+ return parts.filter(Boolean).join(" ");
18
+ }
19
+ const TextStyleWithSize = TextStyle.extend({
20
+ addAttributes() {
21
+ return {
22
+ fontSize: {
23
+ default: null,
24
+ parseHTML: (element) => element.style.fontSize?.replace(/["']/g, "") ?? null,
25
+ renderHTML: (attrs) => {
26
+ if (!attrs.fontSize)
27
+ return {};
28
+ return { style: `font-size:${attrs.fontSize}` };
29
+ }
30
+ }
31
+ };
32
+ }
33
+ });
34
+ function parseHtmlDocument(html) {
35
+ const doc = new DOMParser().parseFromString(html, "text/html");
36
+ const cssText = Array.from(doc.querySelectorAll("head style"))
37
+ .map((s) => s.textContent ?? "")
38
+ .join("\n")
39
+ .trim();
40
+ const bodyHtml = (doc.body?.innerHTML ?? "").trim();
41
+ return { cssText, bodyHtml };
42
+ }
43
+ function buildFullHtmlDocument(bodyHtml, cssText) {
44
+ const safeCss = (cssText ?? "").trim();
45
+ return `<!doctype html>
46
+ <html lang="pt-BR">
47
+ <head>
48
+ <meta charset="utf-8" />
49
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
50
+ ${safeCss ? `<style>\n${safeCss}\n</style>` : ""}
51
+ </head>
52
+ <body>
53
+ ${bodyHtml ?? ""}
54
+ </body>
55
+ </html>`;
56
+ }
57
+ function toFile(fullHtml, fileName) {
58
+ return new File([fullHtml], fileName, { type: "text/html;charset=utf-8" });
59
+ }
60
+ function canRun(editor, fn) {
61
+ if (!editor)
62
+ return false;
63
+ try {
64
+ return fn(editor);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ export function SgTextEditor(props) {
71
+ const { id, valueHtml, defaultValueHtml, onChangeHtml, cssText = "", onCssTextChange, fileName, onSave, onLoad, height = 320, placeholder = "Type here...", disabled, showCssEditor = false, cssEditorLabel = "Embedded CSS", className } = props;
72
+ const isControlled = typeof valueHtml === "string";
73
+ const editor = useEditor({
74
+ editable: !disabled,
75
+ extensions: [
76
+ StarterKit.configure({ codeBlock: {} }),
77
+ Underline,
78
+ Link.configure({ openOnClick: false, autolink: true, linkOnPaste: true }),
79
+ Image.configure({ inline: false }),
80
+ TextStyleWithSize,
81
+ FontFamily,
82
+ Color,
83
+ Highlight.configure({ multicolor: true }),
84
+ Subscript,
85
+ Superscript,
86
+ TextAlign.configure({ types: ["heading", "paragraph"] })
87
+ ],
88
+ content: isControlled ? valueHtml : (defaultValueHtml ?? ""),
89
+ editorProps: {
90
+ attributes: {
91
+ id,
92
+ "aria-label": id,
93
+ class: cn("prose max-w-none focus:outline-none min-h-[120px]", disabled ? "opacity-60" : ""),
94
+ "data-placeholder": placeholder
95
+ }
96
+ },
97
+ onUpdate: ({ editor }) => {
98
+ onChangeHtml?.(editor.getHTML());
99
+ }
100
+ });
101
+ React.useEffect(() => {
102
+ if (!editor)
103
+ return;
104
+ if (!isControlled)
105
+ return;
106
+ const current = editor.getHTML();
107
+ if (current !== valueHtml)
108
+ editor.commands.setContent(valueHtml ?? "", false);
109
+ }, [editor, isControlled, valueHtml]);
110
+ const doSave = React.useCallback(() => {
111
+ if (!editor)
112
+ return;
113
+ const contentHtml = editor.getHTML();
114
+ const htmlDocument = buildFullHtmlDocument(contentHtml, cssText);
115
+ const f = toFile(htmlDocument, fileName ?? `${id}.html`);
116
+ onSave?.(f, { htmlDocument, contentHtml, cssText });
117
+ }, [editor, cssText, fileName, id, onSave]);
118
+ const loadFromHtmlString = React.useCallback((htmlDoc) => {
119
+ if (!editor)
120
+ return;
121
+ const parsed = parseHtmlDocument(htmlDoc);
122
+ if (parsed.cssText && parsed.cssText !== cssText) {
123
+ onCssTextChange?.(parsed.cssText);
124
+ }
125
+ editor.commands.setContent(parsed.bodyHtml || "", false);
126
+ onLoad?.({ htmlDocument: htmlDoc, contentHtml: parsed.bodyHtml, cssText: parsed.cssText });
127
+ }, [editor, cssText, onCssTextChange, onLoad]);
128
+ const loadFromHtmlFile = React.useCallback(async (file) => {
129
+ const text = await file.text();
130
+ loadFromHtmlString(text);
131
+ }, [loadFromHtmlString]);
132
+ const exec = (fn) => {
133
+ if (!editor)
134
+ return;
135
+ editor.chain().focus();
136
+ fn();
137
+ };
138
+ const active = (name, attrs) => !!editor?.isActive(name, attrs);
139
+ return (_jsxs("div", { className: cn("w-full", className), children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 rounded-t-lg border border-b-0 bg-background p-2", children: [_jsxs("select", { className: "h-9 rounded-md border px-2 text-sm bg-background", disabled: !editor || disabled, value: active("heading", { level: 1 })
140
+ ? "h1"
141
+ : active("heading", { level: 2 })
142
+ ? "h2"
143
+ : active("heading", { level: 3 })
144
+ ? "h3"
145
+ : "p", onChange: (e) => {
146
+ const v = e.target.value;
147
+ if (!editor)
148
+ return;
149
+ editor.chain().focus();
150
+ if (v === "p")
151
+ editor.commands.setParagraph();
152
+ if (v === "h1")
153
+ editor.commands.toggleHeading({ level: 1 });
154
+ if (v === "h2")
155
+ editor.commands.toggleHeading({ level: 2 });
156
+ if (v === "h3")
157
+ editor.commands.toggleHeading({ level: 3 });
158
+ }, children: [_jsx("option", { value: "h1", children: "Heading" }), _jsx("option", { value: "h2", children: "Subheading" }), _jsx("option", { value: "p", children: "Normal" }), _jsx("option", { value: "h3", children: "Heading 3" })] }), _jsxs("select", { className: "h-9 rounded-md border px-2 text-sm bg-background", disabled: !editor || disabled, onChange: (e) => {
159
+ const v = e.target.value;
160
+ if (!editor)
161
+ return;
162
+ editor.chain().focus().setFontFamily(v).run();
163
+ }, defaultValue: "inherit", children: [_jsx("option", { value: "inherit", children: "Default" }), _jsx("option", { value: "Arial", children: "Arial" }), _jsx("option", { value: "Georgia", children: "Georgia" }), _jsx("option", { value: "Times New Roman", children: "Times" }), _jsx("option", { value: "Courier New", children: "Courier" })] }), _jsxs("select", { className: "h-9 rounded-md border px-2 text-sm bg-background", disabled: !editor || disabled, defaultValue: "16px", onChange: (e) => {
164
+ const size = e.target.value;
165
+ if (!editor)
166
+ return;
167
+ editor.chain().focus().setMark("textStyle", { fontSize: size }).run();
168
+ }, children: [_jsx("option", { value: "12px", children: "12" }), _jsx("option", { value: "14px", children: "14" }), _jsx("option", { value: "16px", children: "16" }), _jsx("option", { value: "18px", children: "18" }), _jsx("option", { value: "24px", children: "24" }), _jsx("option", { value: "32px", children: "32" })] }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Bold", text: "B", active: active("bold"), disabled: !canRun(editor, (ed) => ed.can().chain().focus().toggleBold().run()) || !!disabled, onClick: () => exec(() => editor.chain().toggleBold().run()) }), _jsx(ToolbarButton, { label: "Italic", text: "I", active: active("italic"), disabled: !canRun(editor, (ed) => ed.can().chain().focus().toggleItalic().run()) || !!disabled, onClick: () => exec(() => editor.chain().toggleItalic().run()) }), _jsx(ToolbarButton, { label: "Underline", text: "U", active: active("underline"), disabled: !canRun(editor, (ed) => ed.can().chain().focus().toggleUnderline().run()) || !!disabled, onClick: () => exec(() => editor.chain().toggleUnderline().run()) }), _jsx(ToolbarButton, { label: "Strike", text: "S", active: active("strike"), disabled: !canRun(editor, (ed) => ed.can().chain().focus().toggleStrike().run()) || !!disabled, onClick: () => exec(() => editor.chain().toggleStrike().run()) }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "A" }), _jsx("input", { type: "color", disabled: !editor || disabled, onChange: (e) => editor?.chain().focus().setColor(e.target.value).run(), className: "h-8 w-10 cursor-pointer", "aria-label": "Text color" })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "H" }), _jsx("input", { type: "color", disabled: !editor || disabled, onChange: (e) => editor?.chain().focus().toggleHighlight({ color: e.target.value }).run(), className: "h-8 w-10 cursor-pointer", "aria-label": "Highlight color" })] }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Subscript", text: "x2", active: active("subscript"), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().toggleSubscript().run()) }), _jsx(ToolbarButton, { label: "Superscript", text: "x^", active: active("superscript"), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().toggleSuperscript().run()) }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Bullets", text: "\u2022", active: active("bulletList"), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().toggleBulletList().run()) }), _jsx(ToolbarButton, { label: "Numbered", text: "1.", active: active("orderedList"), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().toggleOrderedList().run()) }), _jsx(ToolbarButton, { label: "Outdent", text: "<", active: false, disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().liftListItem("listItem").run()) }), _jsx(ToolbarButton, { label: "Indent", text: ">", active: false, disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().sinkListItem("listItem").run()) }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Align left", text: "L", active: active("paragraph", { textAlign: "left" }) || active("heading", { textAlign: "left" }), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().setTextAlign("left").run()) }), _jsx(ToolbarButton, { label: "Align center", text: "C", active: active("paragraph", { textAlign: "center" }) || active("heading", { textAlign: "center" }), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().setTextAlign("center").run()) }), _jsx(ToolbarButton, { label: "Align right", text: "R", active: active("paragraph", { textAlign: "right" }) || active("heading", { textAlign: "right" }), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().setTextAlign("right").run()) }), _jsx(ToolbarButton, { label: "Justify", text: "J", active: active("paragraph", { textAlign: "justify" }) || active("heading", { textAlign: "justify" }), disabled: !editor || !!disabled, onClick: () => exec(() => editor.chain().setTextAlign("justify").run()) }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Link", text: "Link", active: active("link"), disabled: !editor || !!disabled, onClick: () => {
169
+ if (!editor)
170
+ return;
171
+ const prev = editor.getAttributes("link").href;
172
+ const url = window.prompt("URL", prev ?? "https://");
173
+ if (!url) {
174
+ editor.chain().focus().unsetLink().run();
175
+ return;
176
+ }
177
+ editor.chain().focus().setLink({ href: url }).run();
178
+ } }), _jsx(ToolbarButton, { label: "Image", text: "Img", active: false, disabled: !editor || !!disabled, onClick: () => {
179
+ if (!editor)
180
+ return;
181
+ const src = window.prompt("Image URL");
182
+ if (!src)
183
+ return;
184
+ editor.chain().focus().setImage({ src }).run();
185
+ } }), _jsx("div", { className: "mx-1 h-6 w-px bg-border" }), _jsx(ToolbarButton, { label: "Clear", text: "X", active: false, disabled: !editor || !!disabled, onClick: () => {
186
+ if (!editor)
187
+ return;
188
+ editor.chain().focus().unsetAllMarks().clearNodes().run();
189
+ } }), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [_jsx("button", { type: "button", className: "h-9 rounded-md border bg-muted px-3 text-sm hover:bg-muted/80 disabled:opacity-50", disabled: !editor || !!disabled, onClick: doSave, children: "Save" }), _jsxs("label", { className: "h-9 cursor-pointer rounded-md border bg-muted px-3 text-sm leading-9 hover:bg-muted/80", children: ["Load HTML", _jsx("input", { type: "file", accept: "text/html,.html", className: "hidden", onChange: (e) => {
190
+ const f = e.target.files?.[0];
191
+ if (!f)
192
+ return;
193
+ void loadFromHtmlFile(f);
194
+ e.currentTarget.value = "";
195
+ } })] })] })] }), _jsx("div", { className: "rounded-b-lg border bg-background", style: { height }, children: _jsx("div", { className: "h-full overflow-auto p-3", children: _jsx(EditorContent, { editor: editor }) }) }), showCssEditor ? (_jsxs("div", { className: "mt-3", children: [_jsx("label", { className: "mb-1 block text-sm font-medium text-foreground", children: cssEditorLabel }), _jsx("textarea", { value: cssText, onChange: (e) => onCssTextChange?.(e.target.value), className: "min-h-[160px] w-full rounded-lg border p-2 font-mono text-xs" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "CSS is embedded inside the saved HTML document." })] })) : null] }));
196
+ }
197
+ function ToolbarButton(props) {
198
+ const { label, text, active, disabled, onClick } = props;
199
+ return (_jsx("button", { type: "button", title: label, "aria-label": label, disabled: disabled, onClick: onClick, className: cn("h-9 min-w-9 rounded-md border px-2 text-sm", "hover:bg-muted/80 disabled:opacity-50", active ? "bg-muted" : "bg-background"), children: text }));
200
+ }
201
+ SgTextEditor.displayName = "SgTextEditor";
@@ -0,0 +1,39 @@
1
+ import type React from "react";
2
+ export type SeedGridModuleId = string;
3
+ export type SeedGridProvider = React.ComponentType<{
4
+ children: React.ReactNode;
5
+ }>;
6
+ export type SeedGridNavItem = {
7
+ id: string;
8
+ labelKey: string;
9
+ href: string;
10
+ icon?: string;
11
+ requiresAuth?: boolean;
12
+ order?: number;
13
+ };
14
+ export type SeedGridRoute = {
15
+ id: string;
16
+ path: string;
17
+ requiresAuth?: boolean;
18
+ };
19
+ export type SeedGridI18nBundle = {
20
+ namespace: string;
21
+ resources: Record<string, string>;
22
+ distPath?: string;
23
+ };
24
+ export type SeedGridRegistry = {
25
+ addProvider: (provider: SeedGridProvider) => void;
26
+ addNavItem: (item: SeedGridNavItem) => void;
27
+ addRoute: (route: SeedGridRoute) => void;
28
+ };
29
+ export type SeedGridModuleManifest = {
30
+ id: SeedGridModuleId;
31
+ name: string;
32
+ version: string;
33
+ i18n?: {
34
+ defaultLocale: "pt-BR";
35
+ bundles: SeedGridI18nBundle[];
36
+ };
37
+ register: (registry: SeedGridRegistry) => void;
38
+ };
39
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/integration/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC;IACjD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,UAAU,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,gBAAgB,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACL,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,kBAAkB,EAAE,CAAC;KAC/B,CAAC;IACF,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAChD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export type SgGroupBoxProps = {
3
+ title: string;
4
+ height?: number | string;
5
+ width?: number | string;
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ };
9
+ export declare function SgGroupBox(props: SgGroupBoxProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=GroupBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupBox.d.ts","sourceRoot":"","sources":["../../src/layout/GroupBox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAmBhD"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ function toCssSize(value) {
4
+ if (value === undefined || value === null)
5
+ return undefined;
6
+ return typeof value === "number" ? `${value}px` : value;
7
+ }
8
+ export function SgGroupBox(props) {
9
+ const { title, height, width, children, className } = props;
10
+ return (_jsx("div", { className: className, style: {
11
+ width: toCssSize(width) ?? "100%",
12
+ height: toCssSize(height)
13
+ }, children: _jsxs("fieldset", { className: "relative rounded-lg border border-border bg-white px-4 pb-4 pt-5", children: [_jsx("legend", { className: "px-2 text-xs font-semibold uppercase tracking-wider text-foreground/70", children: title }), _jsx("div", { children: children })] }) }));
14
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from "react";
2
+ export type SgCardVariant = "default" | "outlined" | "flat" | "elevated";
3
+ export type SgCardSize = "sm" | "md" | "lg";
4
+ export type SgCardProps = Omit<React.HTMLAttributes<HTMLElement>, "title" | "onClick"> & {
5
+ className?: string;
6
+ headerClassName?: string;
7
+ bodyClassName?: string;
8
+ footerClassName?: string;
9
+ variant?: SgCardVariant;
10
+ size?: SgCardSize;
11
+ leading?: React.ReactNode;
12
+ trailing?: React.ReactNode;
13
+ trailer?: React.ReactNode;
14
+ title?: React.ReactNode;
15
+ description?: React.ReactNode;
16
+ actions?: React.ReactNode;
17
+ header?: React.ReactNode;
18
+ footer?: React.ReactNode;
19
+ clickable?: boolean;
20
+ disabled?: boolean;
21
+ collapsible?: boolean;
22
+ defaultOpen?: boolean;
23
+ open?: boolean;
24
+ onOpenChange?: (open: boolean) => void;
25
+ collapseIcon?: React.ReactNode;
26
+ collapseToggleAlign?: "left" | "right";
27
+ toggleOnHeaderClick?: boolean;
28
+ onClick?: React.MouseEventHandler<HTMLElement>;
29
+ children?: React.ReactNode;
30
+ };
31
+ export declare function SgCard(props: Readonly<SgCardProps>): import("react/jsx-runtime").JSX.Element;
32
+ export declare namespace SgCard {
33
+ var displayName: string;
34
+ }
35
+ //# sourceMappingURL=SgCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SgCard.d.ts","sourceRoot":"","sources":["../../src/layout/SgCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC,GAAG;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AA0BF,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,2CA4OlD;yBA5Oe,MAAM"}