magoo 0.1.0-beta.0

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 (93) hide show
  1. package/README.md +159 -0
  2. package/README.pt-BR.md +167 -0
  3. package/dist/favicon.svg +1 -0
  4. package/dist/icons.svg +24 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/magoo.css +2 -0
  7. package/dist/magoo.es.js +2084 -0
  8. package/dist/magoo.umd.js +1 -0
  9. package/dist/src/App.vue.d.ts +2 -0
  10. package/dist/src/components/MButton/MButton.spec.d.ts +1 -0
  11. package/dist/src/components/MButton/MButton.stories.d.ts +8 -0
  12. package/dist/src/components/MButton/MButton.vue.d.ts +31 -0
  13. package/dist/src/components/MButton/index.d.ts +1 -0
  14. package/dist/src/components/MCheckbox/MCheckbox.spec.d.ts +1 -0
  15. package/dist/src/components/MCheckbox/MCheckbox.stories.d.ts +8 -0
  16. package/dist/src/components/MCheckbox/MCheckbox.vue.d.ts +35 -0
  17. package/dist/src/components/MCheckbox/index.d.ts +1 -0
  18. package/dist/src/components/MCheckboxList/MCheckboxList.spec.d.ts +1 -0
  19. package/dist/src/components/MCheckboxList/MCheckboxList.stories.d.ts +8 -0
  20. package/dist/src/components/MCheckboxList/MCheckboxList.vue.d.ts +45 -0
  21. package/dist/src/components/MCheckboxList/index.d.ts +1 -0
  22. package/dist/src/components/MErrorMessage/MErrorMessage.spec.d.ts +1 -0
  23. package/dist/src/components/MErrorMessage/MErrorMessage.stories.d.ts +8 -0
  24. package/dist/src/components/MErrorMessage/MErrorMessage.vue.d.ts +8 -0
  25. package/dist/src/components/MErrorMessage/index.d.ts +1 -0
  26. package/dist/src/components/MFieldsetPanel/MFieldsetPanel.spec.d.ts +1 -0
  27. package/dist/src/components/MFieldsetPanel/MFieldsetPanel.stories.d.ts +7 -0
  28. package/dist/src/components/MFieldsetPanel/MFieldsetPanel.vue.d.ts +26 -0
  29. package/dist/src/components/MFieldsetPanel/index.d.ts +1 -0
  30. package/dist/src/components/MFileUpload/MFileUpload.spec.d.ts +1 -0
  31. package/dist/src/components/MFileUpload/MFileUpload.stories.d.ts +10 -0
  32. package/dist/src/components/MFileUpload/MFileUpload.vue.d.ts +65 -0
  33. package/dist/src/components/MFileUpload/index.d.ts +1 -0
  34. package/dist/src/components/MForm/MForm.spec.d.ts +1 -0
  35. package/dist/src/components/MForm/MForm.stories.d.ts +7 -0
  36. package/dist/src/components/MForm/MForm.vue.d.ts +46 -0
  37. package/dist/src/components/MForm/index.d.ts +1 -0
  38. package/dist/src/components/MInput/MInput.spec.d.ts +1 -0
  39. package/dist/src/components/MInput/MInput.stories.d.ts +12 -0
  40. package/dist/src/components/MInput/MInput.vue.d.ts +39 -0
  41. package/dist/src/components/MInput/index.d.ts +1 -0
  42. package/dist/src/components/MList/MList.spec.d.ts +1 -0
  43. package/dist/src/components/MList/MList.stories.d.ts +15 -0
  44. package/dist/src/components/MList/MList.vue.d.ts +142 -0
  45. package/dist/src/components/MList/index.d.ts +1 -0
  46. package/dist/src/components/MNumber/MNumber.spec.d.ts +1 -0
  47. package/dist/src/components/MNumber/MNumber.stories.d.ts +9 -0
  48. package/dist/src/components/MNumber/MNumber.vue.d.ts +41 -0
  49. package/dist/src/components/MNumber/index.d.ts +1 -0
  50. package/dist/src/components/MPassword/MPassword.spec.d.ts +1 -0
  51. package/dist/src/components/MPassword/MPassword.stories.d.ts +8 -0
  52. package/dist/src/components/MPassword/MPassword.vue.d.ts +43 -0
  53. package/dist/src/components/MPassword/index.d.ts +1 -0
  54. package/dist/src/components/MRadio/MRadio.spec.d.ts +1 -0
  55. package/dist/src/components/MRadio/MRadio.stories.d.ts +8 -0
  56. package/dist/src/components/MRadio/MRadio.vue.d.ts +33 -0
  57. package/dist/src/components/MRadio/index.d.ts +1 -0
  58. package/dist/src/components/MRadioList/MRadioList.spec.d.ts +1 -0
  59. package/dist/src/components/MRadioList/MRadioList.stories.d.ts +8 -0
  60. package/dist/src/components/MRadioList/MRadioList.vue.d.ts +45 -0
  61. package/dist/src/components/MRadioList/index.d.ts +1 -0
  62. package/dist/src/components/MSelect/MSelect.spec.d.ts +1 -0
  63. package/dist/src/components/MSelect/MSelect.stories.d.ts +8 -0
  64. package/dist/src/components/MSelect/MSelect.vue.d.ts +43 -0
  65. package/dist/src/components/MSelect/index.d.ts +1 -0
  66. package/dist/src/components/MSwitch/MSwitch.spec.d.ts +1 -0
  67. package/dist/src/components/MSwitch/MSwitch.stories.d.ts +11 -0
  68. package/dist/src/components/MSwitch/MSwitch.vue.d.ts +41 -0
  69. package/dist/src/components/MSwitch/index.d.ts +1 -0
  70. package/dist/src/components/MTextarea/MTextarea.spec.d.ts +1 -0
  71. package/dist/src/components/MTextarea/MTextarea.stories.d.ts +8 -0
  72. package/dist/src/components/MTextarea/MTextarea.vue.d.ts +37 -0
  73. package/dist/src/components/MTextarea/index.d.ts +1 -0
  74. package/dist/src/components/MValidationSummary/MValidationSummary.spec.d.ts +1 -0
  75. package/dist/src/components/MValidationSummary/MValidationSummary.stories.d.ts +8 -0
  76. package/dist/src/components/MValidationSummary/MValidationSummary.vue.d.ts +25 -0
  77. package/dist/src/components/MValidationSummary/index.d.ts +1 -0
  78. package/dist/src/components/index.d.ts +17 -0
  79. package/dist/src/composables/useFieldDescribedBy.d.ts +4 -0
  80. package/dist/src/composables/useFieldErrors.d.ts +7 -0
  81. package/dist/src/composables/useFieldIds.d.ts +6 -0
  82. package/dist/src/index.d.ts +9 -0
  83. package/dist/src/main.d.ts +0 -0
  84. package/dist/src/themes/theme.d.ts +3 -0
  85. package/dist/src/types/forms.d.ts +32 -0
  86. package/dist/src/types/index.d.ts +1 -0
  87. package/dist/src/validation/index.d.ts +4 -0
  88. package/dist/src/validation/types.d.ts +40 -0
  89. package/dist/src/validation/useFormValidation.d.ts +56 -0
  90. package/dist/src/validation/useFormValidation.spec.d.ts +1 -0
  91. package/dist/src/validation/utils.d.ts +17 -0
  92. package/dist/src/validation/utils.spec.d.ts +1 -0
  93. package/package.json +72 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Mensagem ou conjunto de mensagens que um campo pode exibir.
3
+ *
4
+ * O formato é intencionalmente independente de qualquer biblioteca de
5
+ * validação para permitir integração por adaptadores no projeto host.
6
+ */
7
+ export type MagooFieldError = string | string[];
8
+ /**
9
+ * Estado de validação e interação consumido pelos componentes de campo.
10
+ */
11
+ export interface MagooFieldState {
12
+ error?: MagooFieldError;
13
+ invalid?: boolean;
14
+ touched?: boolean;
15
+ dirty?: boolean;
16
+ validating?: boolean;
17
+ submitted?: boolean;
18
+ }
19
+ /**
20
+ * Estado convertido por um adaptador de validação externa.
21
+ *
22
+ * O adaptador deve mapear o estado da biblioteca escolhida pelo host para este
23
+ * contrato antes de repassá-lo aos componentes Magoo.
24
+ */
25
+ export interface MagooFieldAdapterState {
26
+ value?: unknown;
27
+ error?: MagooFieldError;
28
+ invalid?: boolean;
29
+ touched?: boolean;
30
+ dirty?: boolean;
31
+ validating?: boolean;
32
+ }
@@ -0,0 +1 @@
1
+ export type { MagooFieldAdapterState, MagooFieldError, MagooFieldState } from './forms';
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { compactErrors, defaultRuleResultAdapter, focusFirstInvalidField, hasErrors, mergeErrors } from './utils';
3
+ export { useFormValidation } from './useFormValidation';
4
+ export type { MagooFieldBinding, MagooFormController, MagooFormValidation, UseFormValidationOptions } from './useFormValidation';
@@ -0,0 +1,40 @@
1
+ import { MagooFieldError } from '../types';
2
+ /** Chave reservada para erros que pertencem ao formulário como um todo. */
3
+ export declare const MAGOO_FORM_ERROR_KEY = "$form";
4
+ export type MagooValidationTrigger = 'input' | 'blur' | 'submit';
5
+ /**
6
+ * Resultado bruto de uma regra. Valores falsy ou `true` significam "válido";
7
+ * strings representam mensagens de erro.
8
+ */
9
+ export type MagooRuleResult = MagooFieldError | boolean | null | undefined | void;
10
+ export interface MagooRuleContext<TValues extends Record<string, unknown> = Record<string, unknown>> {
11
+ field: keyof TValues & string;
12
+ values: TValues;
13
+ }
14
+ export type MagooValidationRule<TValue = unknown, TValues extends Record<string, unknown> = Record<string, unknown>> = (value: TValue, context: MagooRuleContext<TValues>) => MagooRuleResult | Promise<MagooRuleResult>;
15
+ /**
16
+ * Regra de formulário: pode devolver mensagens por campo e/ou mensagens
17
+ * globais sob `MAGOO_FORM_ERROR_KEY`.
18
+ */
19
+ export type MagooFormRule<TValues extends Record<string, unknown> = Record<string, unknown>> = (values: TValues) => Record<string, MagooRuleResult> | MagooRuleResult | Promise<Record<string, MagooRuleResult> | MagooRuleResult>;
20
+ export interface MagooFieldSchema<TValue = unknown, TValues extends Record<string, unknown> = Record<string, unknown>> {
21
+ rules?: MagooValidationRule<TValue, TValues>[];
22
+ /** Campos cuja alteração deve revalidar este campo (ex.: confirmação de senha). */
23
+ dependsOn?: (keyof TValues & string)[];
24
+ /** Sobrescreve os gatilhos globais para este campo. */
25
+ validateOn?: MagooValidationTrigger[];
26
+ /** Interrompe na primeira regra que falhar. */
27
+ bail?: boolean;
28
+ }
29
+ export type MagooValidationSchema<TValues extends Record<string, unknown> = Record<string, unknown>> = {
30
+ [K in keyof TValues & string]?: MagooFieldSchema<TValues[K], TValues> | MagooValidationRule<TValues[K], TValues>[];
31
+ };
32
+ /** Converte a saída de uma regra para uma lista de mensagens. */
33
+ export type MagooRuleResultAdapter = (result: unknown) => string[];
34
+ export type MagooErrorMap = Record<string, string[]>;
35
+ export interface MagooFieldRuntimeState {
36
+ touched: boolean;
37
+ dirty: boolean;
38
+ validating: boolean;
39
+ validated: boolean;
40
+ }
@@ -0,0 +1,56 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ import { MagooFieldError, MagooFieldState } from '../types';
3
+ import { MagooErrorMap, MagooFormRule, MagooRuleResultAdapter, MagooValidationSchema, MagooValidationTrigger } from './types';
4
+ export interface UseFormValidationOptions<TValues extends Record<string, unknown>> {
5
+ /** Objeto de valores. Objetos reativos são usados diretamente; objetos simples são envolvidos em `reactive`. */
6
+ values: TValues;
7
+ schema?: MagooValidationSchema<TValues>;
8
+ formRules?: MagooFormRule<TValues>[];
9
+ /** Gatilhos padrão para todos os campos. */
10
+ validateOn?: MagooValidationTrigger[];
11
+ /** Revalida no `input` um campo que já exibe erro, para que a correção seja refletida imediatamente. */
12
+ revalidateOnInput?: boolean;
13
+ /** Interrompe na primeira regra que falhar (pode ser sobrescrito por campo). */
14
+ bail?: boolean;
15
+ adapter?: MagooRuleResultAdapter;
16
+ }
17
+ export interface MagooFieldBinding<TValue = unknown> {
18
+ name: string;
19
+ modelValue: TValue;
20
+ 'onUpdate:modelValue': (value: TValue) => void;
21
+ onBlur: () => void;
22
+ error: string[];
23
+ submitTriggered: boolean;
24
+ }
25
+ /** Contrato mínimo que o `MForm` precisa; qualquer `MagooFormValidation<T>` o satisfaz. */
26
+ export interface MagooFormController {
27
+ values: Record<string, unknown>;
28
+ allErrors: ComputedRef<MagooErrorMap>;
29
+ handleSubmit: () => Promise<boolean>;
30
+ }
31
+ export interface MagooFormValidation<TValues extends Record<string, unknown> = Record<string, unknown>> {
32
+ values: TValues;
33
+ errors: Readonly<Ref<MagooErrorMap>>;
34
+ serverErrors: Readonly<Ref<MagooErrorMap>>;
35
+ allErrors: ComputedRef<MagooErrorMap>;
36
+ visibleErrors: ComputedRef<MagooErrorMap>;
37
+ formErrors: ComputedRef<string[]>;
38
+ isValid: ComputedRef<boolean>;
39
+ isValidating: ComputedRef<boolean>;
40
+ submitted: Readonly<Ref<boolean>>;
41
+ submitCount: Readonly<Ref<number>>;
42
+ fieldState: (name: keyof TValues & string) => MagooFieldState;
43
+ field: <K extends keyof TValues & string>(name: K) => MagooFieldBinding<TValues[K]>;
44
+ setValue: <K extends keyof TValues & string>(name: K, value: TValues[K]) => void;
45
+ handleInput: <K extends keyof TValues & string>(name: K, value: TValues[K]) => void;
46
+ handleBlur: (name: keyof TValues & string) => void;
47
+ touch: (name: keyof TValues & string) => void;
48
+ validateField: (name: keyof TValues & string) => Promise<string[]>;
49
+ validateForm: () => Promise<boolean>;
50
+ handleSubmit: (onValid?: (values: TValues) => void | Promise<void>) => Promise<boolean>;
51
+ setFieldErrors: (name: string, messages: MagooFieldError) => void;
52
+ setServerErrors: (errors: Record<string, MagooFieldError>) => void;
53
+ clearServerErrors: (name?: string) => void;
54
+ reset: (nextValues?: Partial<TValues>) => void;
55
+ }
56
+ export declare function useFormValidation<TValues extends Record<string, unknown>>(options: UseFormValidationOptions<TValues>): MagooFormValidation<TValues>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { MagooErrorMap, MagooRuleResultAdapter } from './types';
2
+ /**
3
+ * Adaptador padrão: aceita `string`, `string[]`, `boolean`, `null`,
4
+ * `undefined` e objetos `{ message }` (formato comum em bibliotecas externas).
5
+ */
6
+ export declare const defaultRuleResultAdapter: MagooRuleResultAdapter;
7
+ export declare function hasErrors(errors: MagooErrorMap): boolean;
8
+ /** Remove chaves sem mensagens e deduplica mensagens por campo. */
9
+ export declare function compactErrors(errors: MagooErrorMap): MagooErrorMap;
10
+ export declare function mergeErrors(...maps: MagooErrorMap[]): MagooErrorMap;
11
+ /**
12
+ * Foca o primeiro controle inválido dentro do container.
13
+ *
14
+ * Prioriza `aria-invalid="true"` (estado real exposto pelos campos) e recorre
15
+ * ao `name` do primeiro erro quando o estado ainda não foi refletido no DOM.
16
+ */
17
+ export declare function focusFirstInvalidField(container: ParentNode | null | undefined, errors?: MagooErrorMap): HTMLElement | null;
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "magoo",
3
+ "private": false,
4
+ "version": "0.1.0-beta.0",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/magoo.umd.js",
10
+ "module": "./dist/magoo.es.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/magoo.es.js",
16
+ "require": "./dist/magoo.umd.js",
17
+ "default": "./dist/magoo.es.js"
18
+ },
19
+ "./styles": "./dist/magoo.css",
20
+ "./theme.css": "./dist/magoo.css"
21
+ },
22
+ "sideEffects": [
23
+ "*.css"
24
+ ],
25
+ "publishConfig": {
26
+ "tag": "beta"
27
+ },
28
+ "scripts": {
29
+ "dev": "vite",
30
+ "build": "vue-tsc -b && vite build",
31
+ "typecheck": "vue-tsc --noEmit",
32
+ "lint": "eslint . --max-warnings 0",
33
+ "preview": "vite preview",
34
+ "test": "vitest run",
35
+ "prepublishOnly": "npm run lint && npm run typecheck && npm test && npm run build",
36
+ "storybook": "storybook dev -p 6006",
37
+ "build-storybook": "storybook build"
38
+ },
39
+ "peerDependencies": {
40
+ "vue": "^3.5.0"
41
+ },
42
+ "dependencies": {
43
+ "vue": "^3.5.40"
44
+ },
45
+ "devDependencies": {
46
+ "@eslint/js": "^10.0.1",
47
+ "@types/node": "^24.13.3",
48
+ "@vitejs/plugin-vue": "^6.0.8",
49
+ "@vue/test-utils": "^2.4.6",
50
+ "@vue/tsconfig": "^0.9.1",
51
+ "jsdom": "^26.0.1",
52
+ "typescript": "~6.0.2",
53
+ "vite": "^8.2.0",
54
+ "vite-plugin-dts": "^4.1.0",
55
+ "vitest": "^3.2.4",
56
+ "vue-tsc": "^3.3.8",
57
+ "storybook": "^10.5.7",
58
+ "@storybook/vue3-vite": "^10.5.7",
59
+ "@chromatic-com/storybook": "latest",
60
+ "@storybook/addon-vitest": "^10.5.7",
61
+ "@storybook/addon-a11y": "^10.5.7",
62
+ "@storybook/addon-docs": "^10.5.7",
63
+ "@storybook/addon-onboarding": "^10.5.7",
64
+ "@vitest/browser": "3.2.7",
65
+ "@vitest/coverage-v8": "3.2.7",
66
+ "playwright": "latest",
67
+ "eslint": "^10.9.1",
68
+ "eslint-plugin-vue": "^10.10.0",
69
+ "globals": "^17.12.0",
70
+ "typescript-eslint": "^8.69.0"
71
+ }
72
+ }