@formitiva/react 0.9.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 (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.full.md +456 -0
  3. package/README.md +114 -0
  4. package/dist/components/fields/advanced/ColorInput.d.ts +5 -0
  5. package/dist/components/fields/advanced/EmailInput.d.ts +6 -0
  6. package/dist/components/fields/advanced/FileInput.d.ts +5 -0
  7. package/dist/components/fields/advanced/PasswordInput.d.ts +6 -0
  8. package/dist/components/fields/advanced/PhoneInput.d.ts +7 -0
  9. package/dist/components/fields/advanced/RatingInput.d.ts +9 -0
  10. package/dist/components/fields/advanced/SliderInput.d.ts +5 -0
  11. package/dist/components/fields/advanced/UnitValueInput.d.ts +5 -0
  12. package/dist/components/fields/advanced/UrlInput.d.ts +9 -0
  13. package/dist/components/fields/base/PopupOptionMenu.d.ts +16 -0
  14. package/dist/components/fields/base/Tooltip.d.ts +8 -0
  15. package/dist/components/fields/choices/CheckboxInput.d.ts +5 -0
  16. package/dist/components/fields/choices/DropdownInput.d.ts +8 -0
  17. package/dist/components/fields/choices/MultiSelection.d.ts +9 -0
  18. package/dist/components/fields/choices/RadioInput.d.ts +8 -0
  19. package/dist/components/fields/choices/SwitchInput.d.ts +5 -0
  20. package/dist/components/fields/date-time/DateInput.d.ts +6 -0
  21. package/dist/components/fields/date-time/TimeInput.d.ts +6 -0
  22. package/dist/components/fields/text-numeric/FloatArrayInput.d.ts +5 -0
  23. package/dist/components/fields/text-numeric/FloatInput.d.ts +9 -0
  24. package/dist/components/fields/text-numeric/IntegerArrayInput.d.ts +6 -0
  25. package/dist/components/fields/text-numeric/IntegerInput.d.ts +6 -0
  26. package/dist/components/fields/text-numeric/MultilineTextInput.d.ts +6 -0
  27. package/dist/components/fields/text-numeric/NumericStepperInput.d.ts +6 -0
  28. package/dist/components/fields/text-numeric/TextInput.d.ts +8 -0
  29. package/dist/components/fields/ui-elements/Button.d.ts +14 -0
  30. package/dist/components/fields/ui-elements/Description.d.ts +10 -0
  31. package/dist/components/fields/ui-elements/ImageDisplay.d.ts +5 -0
  32. package/dist/components/fields/ui-elements/Separator.d.ts +21 -0
  33. package/dist/components/form/Formitiva.d.ts +16 -0
  34. package/dist/components/form/FormitivaProvider.d.ts +18 -0
  35. package/dist/components/form/FormitivaRenderer.d.ts +20 -0
  36. package/dist/components/form/SubmissionButton.d.ts +8 -0
  37. package/dist/components/form/SubmissionMessage.d.ts +7 -0
  38. package/dist/components/layout/FieldGroup.d.ts +16 -0
  39. package/dist/components/layout/FieldRenderer.d.ts +14 -0
  40. package/dist/components/layout/LayoutComponents.d.ts +77 -0
  41. package/dist/core/env.d.ts +1 -0
  42. package/dist/core/fieldVisibility.d.ts +13 -0
  43. package/dist/core/formitivaModel.d.ts +31 -0
  44. package/dist/core/formitivaTypes.d.ts +128 -0
  45. package/dist/core/registries/baseRegistry.d.ts +15 -0
  46. package/dist/core/registries/buttonHandlerRegistry.d.ts +44 -0
  47. package/dist/core/registries/componentRegistry.d.ts +15 -0
  48. package/dist/core/registries/pluginRegistry.d.ts +45 -0
  49. package/dist/core/registries/submissionHandlerRegistry.d.ts +7 -0
  50. package/dist/core/registries/validationHandlerRegistry.d.ts +20 -0
  51. package/dist/core/submitForm.d.ts +9 -0
  52. package/dist/formitiva.cjs.js +404 -0
  53. package/dist/formitiva.es.js +5626 -0
  54. package/dist/hooks/useDebouncedCallback.d.ts +27 -0
  55. package/dist/hooks/useDropdownPosition.d.ts +6 -0
  56. package/dist/hooks/useFieldValidator.d.ts +3 -0
  57. package/dist/hooks/useFormitivaContext.d.ts +4 -0
  58. package/dist/hooks/useUncontrolledValidatedInput.d.ts +21 -0
  59. package/dist/hooks/useUnitValueField.d.ts +13 -0
  60. package/dist/index.d.ts +27 -0
  61. package/dist/react.css +1 -0
  62. package/dist/styles/cssClasses.d.ts +15 -0
  63. package/dist/styles/themeUtils.d.ts +31 -0
  64. package/dist/themes/ant-design-dark.css +31 -0
  65. package/dist/themes/ant-design.css +42 -0
  66. package/dist/themes/blueprint-dark.css +31 -0
  67. package/dist/themes/blueprint.css +43 -0
  68. package/dist/themes/compact-variant.css +8 -0
  69. package/dist/themes/fluent.css +40 -0
  70. package/dist/themes/glass-morphism.css +25 -0
  71. package/dist/themes/high-contrast-accessible.css +22 -0
  72. package/dist/themes/ios-mobile.css +32 -0
  73. package/dist/themes/macos-native.css +32 -0
  74. package/dist/themes/material-dark.css +27 -0
  75. package/dist/themes/material.css +46 -0
  76. package/dist/themes/midnight-dark.css +24 -0
  77. package/dist/themes/modern-light.css +23 -0
  78. package/dist/themes/neon-cyber-dark.css +24 -0
  79. package/dist/themes/shadcn.css +40 -0
  80. package/dist/themes/soft-pastel.css +24 -0
  81. package/dist/themes/spacious-variant.css +9 -0
  82. package/dist/themes/tailwind-dark.css +30 -0
  83. package/dist/themes/tailwind.css +50 -0
  84. package/dist/utils/definitionSerializers.d.ts +62 -0
  85. package/dist/utils/groupingHelpers.d.ts +24 -0
  86. package/dist/utils/translationUtils.d.ts +52 -0
  87. package/dist/utils/unitValueMapper.d.ts +14 -0
  88. package/dist/validation/registerBuiltinTypeValidators.d.ts +11 -0
  89. package/dist/validation/validation.d.ts +12 -0
  90. package/dist/validation/validators/validateColorField.d.ts +2 -0
  91. package/dist/validation/validators/validateDateField.d.ts +2 -0
  92. package/dist/validation/validators/validateEmailField.d.ts +2 -0
  93. package/dist/validation/validators/validateFieldPattern.d.ts +3 -0
  94. package/dist/validation/validators/validateFileField.d.ts +2 -0
  95. package/dist/validation/validators/validateFloatField.d.ts +3 -0
  96. package/dist/validation/validators/validateIntegerField.d.ts +3 -0
  97. package/dist/validation/validators/validatePhoneField.d.ts +2 -0
  98. package/dist/validation/validators/validateRatingField.d.ts +2 -0
  99. package/dist/validation/validators/validateSelectionFields.d.ts +3 -0
  100. package/dist/validation/validators/validateSliderField.d.ts +2 -0
  101. package/dist/validation/validators/validateTextField.d.ts +2 -0
  102. package/dist/validation/validators/validateTimeField.d.ts +2 -0
  103. package/dist/validation/validators/validateUnitValueField.d.ts +2 -0
  104. package/dist/validation/validators/validateUrlField.d.ts +2 -0
  105. package/package.json +92 -0
@@ -0,0 +1,27 @@
1
+ export type DebouncedCallback = {
2
+ callback: (...args: unknown[]) => void;
3
+ cancel: () => void;
4
+ flush: () => void;
5
+ };
6
+ /**
7
+ * useDebouncedCallback
8
+ * - callback: function to call
9
+ * - wait: debounce delay in ms
10
+ * - options.leading: if true, call on leading edge (optional)
11
+ *
12
+ * Returns { callback, cancel, flush } where callback is debounced.
13
+ */
14
+ export declare function useDebouncedCallback(callback: (...args: unknown[]) => unknown, wait?: number, options?: {
15
+ leading?: boolean;
16
+ trailing?: boolean;
17
+ }): DebouncedCallback;
18
+ /**
19
+ * createDebouncedCallback - non-hook variant that returns the same API but
20
+ * doesn't use React hooks. Useful for creating many debounced callbacks
21
+ * programmatically (e.g., driven from a static schema) while handling
22
+ * lifecycle cleanup manually.
23
+ */
24
+ export declare function createDebouncedCallback(callback: (...args: unknown[]) => unknown, wait?: number, options?: {
25
+ leading?: boolean;
26
+ trailing?: boolean;
27
+ }): DebouncedCallback;
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export declare function useDropdownPosition(controlRef: React.RefObject<HTMLElement | null>, open: boolean, maxHeight?: number): {
3
+ left: number;
4
+ top: number;
5
+ width: number;
6
+ } | null;
@@ -0,0 +1,3 @@
1
+ import type { DefinitionPropertyField, FieldValueType } from '../core/formitivaTypes';
2
+ export type ValidationTrigger = 'change' | 'blur' | 'sync';
3
+ export declare function useFieldValidator(field: DefinitionPropertyField, externalError?: string | null): (value: FieldValueType, trigger?: ValidationTrigger) => string | null;
@@ -0,0 +1,4 @@
1
+ import type { FormitivaContextType } from '../core/formitivaTypes';
2
+ export declare const FormitivaContext: import("react").Context<FormitivaContextType | undefined>;
3
+ declare const useFormitivaContext: () => FormitivaContextType;
4
+ export default useFormitivaContext;
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ import type { ValidationTrigger } from "./useFieldValidator";
3
+ export type UseUncontrolledValidatedInputProps = {
4
+ value?: string | number;
5
+ disabled?: boolean;
6
+ onChange?: (value: string) => void;
7
+ onError?: (error: string | null) => void;
8
+ validate: (value: string, trigger?: ValidationTrigger) => string | null;
9
+ };
10
+ /**
11
+ * Handles:
12
+ * - Uncontrolled input
13
+ * - Validation
14
+ * - Error sync
15
+ */
16
+ export declare function useUncontrolledValidatedInput<T extends HTMLInputElement | HTMLTextAreaElement = HTMLInputElement>({ value, disabled, onChange, onError, validate, }: UseUncontrolledValidatedInputProps): {
17
+ inputRef: React.MutableRefObject<T | null>;
18
+ error: string | null;
19
+ handleChange: (e: React.ChangeEvent<T>) => void;
20
+ handleBlur: () => void;
21
+ };
@@ -0,0 +1,13 @@
1
+ import type { DefinitionPropertyField } from "../core/formitivaTypes";
2
+ export declare function useUnitValueField(definitionName: string, field: DefinitionPropertyField, value: [string | number, string], unitFactors: {
3
+ default: string;
4
+ labels: Record<string, string>;
5
+ reverseLabels?: Record<string, string>;
6
+ }, t: (key: string) => string, onChange?: (v: [string, string], err: string | null) => void, onError?: (err: string | null) => void): {
7
+ value: string;
8
+ unit: string;
9
+ error: string | null;
10
+ setValue: (v: string) => void;
11
+ setUnit: (u: string) => void;
12
+ setBoth: (v: string, u: string) => void;
13
+ };
@@ -0,0 +1,27 @@
1
+ export declare function injectFormitivaStyles(): void;
2
+ export { default as Formitiva } from './components/form/Formitiva';
3
+ export { default as FormitivaRenderer } from './components/form/FormitivaRenderer';
4
+ export type { FormitivaRendererProps } from './components/form/FormitivaRenderer';
5
+ export { FormitivaProvider } from './components/form/FormitivaProvider';
6
+ export { default as useFormitivaContext } from './hooks/useFormitivaContext';
7
+ export { StandardFieldLayout } from './components/layout/LayoutComponents';
8
+ export { CSS_CLASSES, combineClasses } from './styles/cssClasses';
9
+ export type { FormitivaContextType, FormitivaProviderProps, DefinitionPropertyField, FormitivaDefinition, FormitivaInstance, FormitivaProps, FieldValueType, ErrorType, FieldCustomValidationHandler, FieldTypeValidationHandler, FormValidationHandler, FormSubmissionHandler, InputOnChange, BaseInputProps, TranslationFunction, FieldValidationMode } from './core/formitivaTypes';
10
+ export { registerComponent, getComponent, } from './core/registries/componentRegistry';
11
+ export { validateFieldValue, // Deprecated, use validateFieldWithHandler instead
12
+ validateFieldWithCustomHandler } from './validation/validation';
13
+ export { type FormitivaPlugin, type ConflictResolution, type PluginRegistrationOptions, type PluginConflict, registerPlugin, unregisterPlugin, getPlugin, getAllPlugins, hasPlugin, registerComponents, } from './core/registries/pluginRegistry';
14
+ export type { LoadDefinitionOptions, DefinitionLoadResult, InstanceLoadResult, } from './core/formitivaModel';
15
+ export { loadJsonDefinition, createInstanceFromDefinition, // Create new instance with default values
16
+ loadInstance, // Load existing instance (valuesMap)
17
+ upgradeInstanceToLatestDefinition } from './core/formitivaModel';
18
+ export { registerSubmissionHandler, } from './core/registries/submissionHandlerRegistry';
19
+ export { registerFieldCustomValidationHandler, registerFieldTypeValidationHandler, registerFormValidationHandler, } from './core/registries/validationHandlerRegistry';
20
+ export { registerButtonHandler, getButtonHandler, hasButtonHandler, unregisterButtonHandler, listButtonHandlers, type ButtonHandler, } from './core/registries/buttonHandlerRegistry';
21
+ export { type DebouncedCallback, useDebouncedCallback } from './hooks/useDebouncedCallback';
22
+ export { useFieldValidator } from './hooks/useFieldValidator';
23
+ export { useUncontrolledValidatedInput, type UseUncontrolledValidatedInputProps } from './hooks/useUncontrolledValidatedInput';
24
+ export * as Units from './utils/unitValueMapper';
25
+ export { isDarkTheme } from './styles/themeUtils';
26
+ export { serializeInstance, deserializeInstance, serializeDefinition, deserializeDefinition } from './utils/definitionSerializers';
27
+ export { getSupportedLanguages } from './utils/translationUtils';
package/dist/react.css ADDED
@@ -0,0 +1 @@
1
+ :root{--formitiva-primary-bg: #f9f9f9;--formitiva-secondary-bg: #fff;--formitiva-text-color: #000;--formitiva-text-muted: #666;--formitiva-label-text-color: #000000;--formitiva-form-border-color: #000000;--formitiva-border-color: #ccc;--formitiva-border-hover: #999;--formitiva-border-focus: #4CAF50;--formitiva-error-color: #e11d48;--formitiva-success-color: #4CAF50;--formitiva-space: 8px;--formitiva-space-lg: 12px;--formitiva-option-menu-hover-bg: #80FFFF;--formitiva-column-gap: var(--formitiva-space);--formitiva-inline-gap: var(--formitiva-space);--formitiva-label-gap: 0px;--formitiva-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--formitiva-font-size: 14px;--formitiva-font-weight: 500;--formitiva-label-font-family: var(--formitiva-font-family);--formitiva-label-font-size: 14px;--formitiva-label-font-weight: 600;--formitiva-border-radius: 0px;--formitiva-border-width: 1px;--formitiva-border-style: solid;--formitiva-form-border-radius: 0px;--formitiva-form-border-style: solid;--formitiva-form-border-width: 0px;--formitiva-group-border-radius: var(--formitiva-border-radius);--formitiva-group-border-style: var(--formitiva-border-style);--formitiva-group-border-width: var(--formitiva-border-width);--formitiva-form-shadow: 0 2px 4px rgba(0, 0, 0, .1);--formitiva-button-bg: var(--formitiva-success-color);--formitiva-button-text: #ffffff;--formitiva-button-padding: var(--formitiva-space) 12px;--formitiva-button-border-radius: 6px;--formitiva-button-font-size: 14px;--formitiva-button-font-weight: var(--formitiva-font-weight);--formitiva-button-hover-opacity: .9;--formitiva-button-disabled-opacity: .6;--formitiva-button-disabled-bg: #cccccc;--formitiva-button-disabled-cursor: not-allowed;--formitiva-button-margin-top: .5em;--formitiva-button-shadow: none;--formitiva-input-padding: var(--formitiva-space);--formitiva-container-padding: var(--formitiva-space-lg);--formitiva-field-gap: var(--formitiva-space);--formitiva-input-bg: var(--formitiva-secondary-bg);--formitiva-field-text-color: #0000ff;--formitiva-tooltip-color-bg: rgba(60,60,60,.92);--formitiva-tooltip-color: #ffffff;--formitiva-field-grid-columns: 1fr 2fr}[data-formitiva-theme=dark]{--formitiva-primary-bg: #121212;--formitiva-secondary-bg: #1A1A1A;--formitiva-input-bg: #262626;--formitiva-text-color: #EDEDED;--formitiva-text-muted: #A5A5A5;--formitiva-field-text-color: #C8C8E5;--formitiva-border-color: #3A3A3A;--formitiva-border-hover: #4A4A4A;--formitiva-border-focus: #4DA6FF;--formitiva-form-border-color: #333333;--formitiva-error-color: #FF6B6B;--formitiva-success-color: #4CAF6A;--formitiva-option-menu-hover-bg: rgba(255, 255, 255, .06);--formitiva-form-shadow: 0 2px 8px rgba(0, 0, 0, .45);--formitiva-tooltip-color-bg: rgba(40, 40, 40, .95);--formitiva-tooltip-color: #F5F5F5}.formitiva-container{font-family:var(--formitiva-font-family, sans-serif);font-size:var(--formitiva-font-size, 14px);background:var(--formitiva-primary-bg, #f9f9f9);color:var(--formitiva-text-color, #000000);padding:var(--formitiva-container-padding, 12px);border-radius:var(--formitiva-form-border-radius, 0px);border-color:var(--formitiva-form-border-color, #000000);border-style:var(--formitiva-form-border-style, solid);border-width:var(--formitiva-form-border-width, 0px);box-shadow:var(--formitiva-form-shadow, none);gap:var(--formitiva-space-lg, 12px);max-width:100%;margin:0 auto}.formitiva-field{display:grid;grid-template-columns:var(--formitiva-field-grid-columns, 1fr 2fr);align-items:start;padding:0;gap:var(--formitiva-column-gap, 8px);margin-bottom:var(--formitiva-field-gap, 8px)}.formitiva-group{border:1px solid var(--formitiva-border-color, #bbb);padding:var(--formitiva-fieldset-padding, .5em);border-radius:var(--formitiva-group-border-radius, var(--formitiva-border-radius, 4px));border-style:var(--formitiva-group-border-style, var(--formitiva-border-style, solid));border-width:var(--formitiva-group-border-width, var(--formitiva-border-width, 1px));margin-bottom:var(--formitiva-space, 8px)}.formitiva-group_legend{font-weight:700;cursor:pointer;display:flex;justify-content:space-between;align-items:center;padding:0 var(--formitiva-space, 8px);color:var(--formitiva-text-color, inherit);margin-left:.4em}.formitiva-group_legend_arrow{margin-left:.4em}.formitiva-label{justify-self:start;align-self:center;white-space:normal;line-height:1.4;min-width:100px;color:var(--formitiva-label-text-color, var(--formitiva-text-color, #000000));font-family:var(--formitiva-label-font-family, var(--formitiva-font-family, sans-serif));font-weight:var(--formitiva-label-font-weight, var(--formitiva-font-weight, 600));font-size:var(--formitiva-label-font-size, var(--formitiva-font-size, 14px));-webkit-user-select:none;user-select:none}.formitiva-description{font-size:var(--formitiva-font-size, 14px);font-weight:var(--formitiva-font-weight, 500);margin:var(--formitiva-space, 8px) 0;color:var(--formitiva-text-color, #000000);-webkit-user-select:none;user-select:none}.formitiva-input{width:100%;color:var(--formitiva-text-color, #000000);border:1px solid var(--formitiva-border-color, #ccc);border-radius:var(--formitiva-border-radius, 0px);border-style:var(--formitiva-border-style, solid);border-width:var(--formitiva-border-width, 1px);padding:var(--formitiva-input-padding, 8px);box-sizing:border-box;background-color:var(--formitiva-input-bg, #ffffff);font-size:var(--formitiva-font-size, 14px);font-weight:var(--formitiva-font-weight, 400);transition:border-color .2s ease;box-shadow:inset 0 1px #ffffff08}.formitiva-input:hover{border-color:var(--formitiva-border-hover, #4A4A4A)}.formitiva-input:focus{outline:none;border-color:var(--formitiva-border-focus, #4DA6FF);box-shadow:0 0 0 3px #22d3ee66,0 0 16px #22d3ee40,inset 0 1px #ffffff0d}.formitiva-input--text{text-align:left}.formitiva-input--number{text-align:right}.formitiva-input--select{text-align:left;appearance:none;background-image:url("data:image/svg+xml;utf8,<svg fill='%23666' height='8' viewBox='0 0 24 24' width='8' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");background-repeat:no-repeat;background-position:right var(--formitiva-space) center;background-size:20px;padding-right:32px}.formitiva-select{text-align:left;appearance:none;background-image:url("data:image/svg+xml;utf8,<svg fill='%23666' height='8' viewBox='0 0 24 24' width='8' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");background-repeat:no-repeat;background-position:right var(--formitiva-space) center;background-size:2.5em;padding-right:32px;background-color:var(--formitiva-input-bg)}.formitiva-textarea{width:100%;background-color:var(--formitiva-input-bg);color:var(--formitiva-text-color);border:1px solid var(--formitiva-border-color);border-radius:var(--formitiva-border-radius);padding:var(--formitiva-input-padding);box-sizing:border-box}.formitiva-chip{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background-color:var(--formitiva-input-bg);border:1px solid var(--formitiva-border-color);border-radius:var(--formitiva-border-radius);color:var(--formitiva-text-color);font-size:.875rem;gap:8px}.formitiva-button{background-color:var(--formitiva-button-bg, var(--formitiva-success-color, #4CAF50));color:var(--formitiva-button-text, var(--formitiva-text-color, #000000));padding:var(--formitiva-button-padding);border-radius:var(--formitiva-button-border-radius, 6px);font-size:var(--formitiva-button-font-size);font-weight:var(--formitiva-button-font-weight);box-shadow:var(--formitiva-button-shadow);margin-top:var(--formitiva-button-margin-top);border:none;cursor:pointer;transition:opacity .2s ease;width:100%;display:flex;justify-content:center;align-items:center}.formitiva-button:hover:not(:disabled){opacity:var(--formitiva-button-hover-opacity);background-color:var(--formitiva-button-bg-hover, #0056b3)}.formitiva-button:disabled{opacity:var(--formitiva-button-disabled-opacity);background-color:var(--formitiva-button-disabled-bg);cursor:var(--formitiva-button-disabled-cursor)}@media(max-width:1024px){.formitiva-container{padding:calc(var(--formitiva-space) * .8)}.formitiva-field{gap:calc(var(--formitiva-column-gap) * .8)}}@media(max-width:768px){.formitiva-field{grid-template-columns:1fr;gap:6px}.formitiva-label{justify-self:start;margin-bottom:4px;font-size:.9rem}.formitiva-container{padding:var(--formitiva-space)}.formitiva-input,.formitiva-textarea,.formitiva-select{font-size:16px;padding:var(--formitiva-input-padding)}.formitiva-checkbox-wrapper,.formitiva-radio-wrapper{padding:8px 0;min-height:44px;align-items:center}.formitiva-group{margin-bottom:calc(var(--formitiva-space) * 1.5)}}@media(max-width:480px){.formitiva-container{padding:calc(var(--formitiva-space) * .7)}.formitiva-field{gap:8px}.formitiva-label{font-size:.85rem;line-height:1.3}.formitiva-input,.formitiva-textarea,.formitiva-select{padding:14px}}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CSS class constants and helpers
3
+ */
4
+ export declare const CSS_CLASSES: {
5
+ readonly field: "formitiva-field";
6
+ readonly label: "formitiva-label";
7
+ readonly input: "formitiva-input";
8
+ readonly textInput: "formitiva-input--text";
9
+ readonly inputNumber: "formitiva-input--number";
10
+ readonly inputSelect: "formitiva-select";
11
+ readonly rangeInput: "formitiva-input--range";
12
+ readonly button: "formitiva-button";
13
+ readonly description: "formitiva-description";
14
+ };
15
+ export declare const combineClasses: (...classes: (string | undefined | null | false | Record<string, boolean>)[]) => string;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Utility functions for theme detection and management
3
+ */
4
+ /**
5
+ * Determines if a theme is dark-themed based on naming convention.
6
+ *
7
+ * Convention: Theme names containing "dark" are considered dark themes.
8
+ *
9
+ * When creating custom themes:
10
+ * - Include "dark" in the theme name for dark themes (e.g., "my-theme-dark")
11
+ * - Or rely on CSS variables only and avoid theme-specific logic
12
+ *
13
+ * @param themeName - The theme name from the `theme` prop
14
+ * @returns true if the theme is dark-themed
15
+ *
16
+ * @example
17
+ * isDarkTheme('material-dark') // true
18
+ * isDarkTheme('dark') // true
19
+ * isDarkTheme('midnight-dark') // true
20
+ * isDarkTheme('my-custom-dark') // true
21
+ * isDarkTheme('material') // false
22
+ */
23
+ export declare function isDarkTheme(themeName: string): boolean;
24
+ /**
25
+ * Determines if a color string represents a dark color.
26
+ * Supports hex (3, 4, 6, 8 digits) and rgb/rgba formats.
27
+ *
28
+ * @param color - The color string to check
29
+ * @returns true if the color is considered dark (luminance < 128)
30
+ */
31
+ export declare function isDarkColor(color: string): boolean;
@@ -0,0 +1,31 @@
1
+ [data-formitiva-theme="antd-dark"] {
2
+ --formitiva-primary-bg: #141414;
3
+ --formitiva-secondary-bg: #1f1f1f;
4
+ --formitiva-input-bg: #1f1f1f;
5
+
6
+ --formitiva-text-color: #e8e8e8;
7
+ --formitiva-text-muted: #9ca3af;
8
+
9
+ --formitiva-border-color: #303030;
10
+ --formitiva-border-hover: #434343;
11
+ --formitiva-border-focus: #1677ff;
12
+
13
+ --formitiva-option-menu-hover-bg: #1a1a1a;
14
+
15
+ --formitiva-error-color: #ff4d4f;
16
+ --formitiva-success-color: #52c41a;
17
+
18
+ --formitiva-border-radius: 6px;
19
+
20
+ --formitiva-shadow:
21
+ 0 6px 20px #000000;
22
+
23
+ --formitiva-button-bg: #1677ff;
24
+ --formitiva-button-text: white;
25
+
26
+ --formitiva-input-padding: 10px 12px;
27
+
28
+ /* Tooltip */
29
+ --formitiva-tooltip-color-bg: #282828;
30
+ --formitiva-tooltip-color: #F5F5F5;
31
+ }
@@ -0,0 +1,42 @@
1
+ [data-formitiva-theme="antd"] {
2
+ /* Surfaces */
3
+ --formitiva-primary-bg: #ffffff;
4
+ --formitiva-secondary-bg: #ffffff;
5
+ --formitiva-input-bg: #ffffff;
6
+
7
+ /* Text */
8
+ --formitiva-text-color: #1f1f1f;
9
+ --formitiva-text-muted: #8c8c8c;
10
+
11
+ /* Borders */
12
+ --formitiva-border-color: #d9d9d9;
13
+ --formitiva-border-hover: #bfbfbf;
14
+ --formitiva-border-focus: #1677ff; /* Ant Primary */
15
+
16
+ /* States */
17
+ --formitiva-error-color: #ff4d4f;
18
+ --formitiva-success-color: #52c41a;
19
+
20
+ /* Interaction */
21
+ --formitiva-option-menu-hover-bg: #fafafa;
22
+
23
+ /* Shape ??AntD slightly rounded */
24
+ --formitiva-border-radius: 6px;
25
+
26
+ /* Elevation */
27
+ --formitiva-shadow:
28
+ 0 2px 8px #000000;
29
+
30
+ /* Buttons */
31
+ --formitiva-button-bg: #1677ff;
32
+ --formitiva-button-text: #ffffff;
33
+ --formitiva-button-border-radius: 6px;
34
+
35
+ /* Comfortable spacing */
36
+ --formitiva-input-padding: 10px 12px;
37
+ --formitiva-font-size: 14px;
38
+
39
+ /* Tooltip */
40
+ --formitiva-tooltip-color-bg: #3c3c3c;
41
+ --formitiva-tooltip-color: #ffffff;
42
+ }
@@ -0,0 +1,31 @@
1
+ [data-formitiva-theme="blueprint-dark"] {
2
+ --formitiva-primary-bg: #202b33;
3
+ --formitiva-secondary-bg: #293742;
4
+ --formitiva-input-bg: #30404d;
5
+
6
+ --formitiva-text-color: #f5f8fa;
7
+ --formitiva-text-muted: #c0cbd3;
8
+
9
+ --formitiva-border-color: #394b59;
10
+ --formitiva-border-hover: #738694;
11
+ --formitiva-border-focus: #2b95d6;
12
+
13
+ --formitiva-option-menu-hover-bg: #ffffff;
14
+
15
+ --formitiva-error-color: #ff7373;
16
+ --formitiva-success-color: #3dcc91;
17
+
18
+ --formitiva-border-radius: 4px;
19
+
20
+ --formitiva-shadow:
21
+ 0 4px 20px #10161a;
22
+
23
+ --formitiva-button-bg: #2b95d6;
24
+ --formitiva-button-text: white;
25
+
26
+ --formitiva-input-padding: 8px 10px;
27
+
28
+ /* Tooltip */
29
+ --formitiva-tooltip-color-bg: #282828;
30
+ --formitiva-tooltip-color: #F5F5F5;
31
+ }
@@ -0,0 +1,43 @@
1
+ [data-formitiva-theme="blueprint"] {
2
+ /* Surfaces */
3
+ --formitiva-primary-bg: #f5f8fa;
4
+ --formitiva-secondary-bg: #ffffff;
5
+ --formitiva-input-bg: #ffffff;
6
+
7
+ /* Text */
8
+ --formitiva-text-color: #182026;
9
+ --formitiva-text-muted: #5c7080;
10
+
11
+ /* Borders */
12
+ --formitiva-border-color: #d8e1e8;
13
+ --formitiva-border-hover: #8a9ba8;
14
+ --formitiva-border-focus: #137cbd; /* Blueprint Primary Blue */
15
+
16
+ /* Status */
17
+ --formitiva-error-color: #c23030;
18
+ --formitiva-success-color: #0f9960;
19
+
20
+ /* Interaction */
21
+ --formitiva-option-menu-hover-bg: #ebf1f5;
22
+
23
+ /* Shape */
24
+ --formitiva-border-radius: 4px;
25
+
26
+ /* Elevation */
27
+ --formitiva-shadow:
28
+ 0 1px 3px #10161a,
29
+ 0 0 0 1px #10161a;
30
+
31
+ /* Buttons */
32
+ --formitiva-button-bg: #137cbd;
33
+ --formitiva-button-text: #ffffff;
34
+ --formitiva-button-border-radius: 4px;
35
+
36
+ /* Density */
37
+ --formitiva-input-padding: 8px 10px;
38
+ --formitiva-font-size: 13px;
39
+
40
+ /* Tooltip */
41
+ --formitiva-tooltip-color-bg: #3c3c3c;
42
+ --formitiva-tooltip-color: #ffffff;
43
+ }
@@ -0,0 +1,8 @@
1
+ [data-formitiva-size="compact"] {
2
+ --formitiva-input-padding: 6px 8px;
3
+ --formitiva-font-size: 12px;
4
+ --formitiva-space: 4px;
5
+ --formitiva-space-lg: 6px;
6
+ --formitiva-field-gap: 6px;
7
+ --formitiva-column-gap: 8px;
8
+ }
@@ -0,0 +1,40 @@
1
+ [data-formitiva-theme="fluent"] {
2
+ /* Surfaces */
3
+ --formitiva-primary-bg: #ffffff;
4
+ --formitiva-secondary-bg: #ffffff;
5
+ --formitiva-input-bg: #f5f6f8;
6
+
7
+ /* Text */
8
+ --formitiva-text-color: #242424;
9
+ --formitiva-text-muted: #616161;
10
+
11
+ /* Borders */
12
+ --formitiva-border-color: #d1d1d6;
13
+ --formitiva-border-hover: #bdbdbd;
14
+ --formitiva-border-focus: #0078d4;
15
+
16
+ /* Accent */
17
+ --formitiva-success-color: #107c10;
18
+ --formitiva-error-color: #d13438;
19
+
20
+ /* Interaction */
21
+ --formitiva-option-menu-hover-bg: #000000;
22
+
23
+ /* Shape */
24
+ --formitiva-border-radius: 6px;
25
+
26
+ /* Shadow */
27
+ --formitiva-shadow:
28
+ 0 4px 12px #000000;
29
+
30
+ /* Buttons */
31
+ --formitiva-button-bg: #0078d4;
32
+ --formitiva-button-text: white;
33
+ --formitiva-button-border-radius: 6px;
34
+
35
+ --formitiva-input-padding: 10px 12px;
36
+
37
+ /* Tooltip */
38
+ --formitiva-tooltip-color-bg: #3c3c3c;
39
+ --formitiva-tooltip-color: #ffffff;
40
+ }
@@ -0,0 +1,25 @@
1
+ [data-formitiva-theme="glass"] {
2
+ --formitiva-primary-bg: #ffffff40;
3
+ --formitiva-secondary-bg: #ffffff59;
4
+ --formitiva-input-bg: #ffffff59;
5
+
6
+ backdrop-filter: blur(14px);
7
+ -webkit-backdrop-filter: blur(14px);
8
+
9
+ --formitiva-text-color: #111827;
10
+ --formitiva-text-muted: #4b5563;
11
+
12
+ --formitiva-border-color: #ffffff66;
13
+ --formitiva-border-hover: #ffffffb3;
14
+ --formitiva-border-focus: #38bdf8;
15
+
16
+ --formitiva-error-color: #e11d48;
17
+ --formitiva-success-color: #059669;
18
+
19
+ --formitiva-border-radius: 12px;
20
+ --formitiva-shadow: 0 12px 40px #000000;
21
+
22
+ /* Tooltip */
23
+ --formitiva-tooltip-color-bg: #3c3c3c;
24
+ --formitiva-tooltip-color: #ffffff;
25
+ }
@@ -0,0 +1,22 @@
1
+ [data-formitiva-theme="accessible"] {
2
+ --formitiva-primary-bg: #ffffff;
3
+ --formitiva-secondary-bg: #ffffff;
4
+ --formitiva-input-bg: #ffffff;
5
+
6
+ --formitiva-text-color: #000000;
7
+ --formitiva-text-muted: #333333;
8
+
9
+ --formitiva-border-color: #000000;
10
+ --formitiva-border-hover: #000000;
11
+ --formitiva-border-focus: #1d4ed8;
12
+
13
+ --formitiva-error-color: #b91c1c;
14
+ --formitiva-success-color: #166534;
15
+
16
+ --formitiva-border-radius: 0;
17
+ --formitiva-shadow: none;
18
+
19
+ /* Tooltip */
20
+ --formitiva-tooltip-color-bg: #3c3c3c;
21
+ --formitiva-tooltip-color: #ffffff;
22
+ }
@@ -0,0 +1,32 @@
1
+ [data-formitiva-theme="ios"] {
2
+ --formitiva-primary-bg: #f2f2f7;
3
+ --formitiva-secondary-bg: #ffffff;
4
+ --formitiva-input-bg: #ffffff;
5
+
6
+ --formitiva-text-color: #000000;
7
+ --formitiva-text-muted: #8e8e93;
8
+
9
+ --formitiva-border-color: #d1d1d6;
10
+ --formitiva-border-hover: #b3b3b9;
11
+ --formitiva-border-focus: #0a84ff;
12
+
13
+ --formitiva-error-color: #ff3b30;
14
+ --formitiva-success-color: #34c759;
15
+
16
+ --formitiva-option-menu-hover-bg: #000000;
17
+
18
+ --formitiva-border-radius: 14px;
19
+
20
+ --formitiva-shadow:
21
+ 0 10px 30px #000000;
22
+
23
+ --formitiva-button-bg: #0a84ff;
24
+ --formitiva-button-text: white;
25
+ --formitiva-button-border-radius: 14px;
26
+
27
+ --formitiva-input-padding: 14px 16px;
28
+
29
+ /* Tooltip */
30
+ --formitiva-tooltip-color-bg: #3c3c3c;
31
+ --formitiva-tooltip-color: #ffffff;
32
+ }
@@ -0,0 +1,32 @@
1
+ [data-formitiva-theme="macos"] {
2
+ --formitiva-primary-bg: #f5f5f7;
3
+ --formitiva-secondary-bg: #ffffff;
4
+ --formitiva-input-bg: #ffffff;
5
+
6
+ --formitiva-text-color: #111111;
7
+ --formitiva-text-muted: #6e6e73;
8
+
9
+ --formitiva-border-color: #d2d2d7;
10
+ --formitiva-border-hover: #9e9ea2;
11
+ --formitiva-border-focus: #0a84ff;
12
+
13
+ --formitiva-success-color: #34c759;
14
+ --formitiva-error-color: #ff3b30;
15
+
16
+ --formitiva-option-menu-hover-bg: #000000;
17
+
18
+ --formitiva-border-radius: 999px;
19
+
20
+ --formitiva-shadow:
21
+ 0 8px 30px #000000;
22
+
23
+ --formitiva-button-bg: #0a84ff;
24
+ --formitiva-button-text: white;
25
+ --formitiva-button-border-radius: 999px;
26
+
27
+ --formitiva-input-padding: 10px 14px;
28
+
29
+ /* Tooltip */
30
+ --formitiva-tooltip-color-bg: #3c3c3c;
31
+ --formitiva-tooltip-color: #ffffff;
32
+ }
@@ -0,0 +1,27 @@
1
+ [data-formitiva-theme="material-dark"] {
2
+ --formitiva-primary-bg: #121212;
3
+ --formitiva-secondary-bg: #1D1B20;
4
+ --formitiva-input-bg: #2B2830;
5
+
6
+ --formitiva-text-color: #EDE7F6;
7
+ --formitiva-text-muted: #BDB5D7;
8
+
9
+ --formitiva-border-color: #3A3346;
10
+ --formitiva-border-hover: #524364;
11
+ --formitiva-border-focus: #D0BCFF;
12
+
13
+ --formitiva-option-menu-hover-bg: #ffffff;
14
+
15
+ --formitiva-error-color: #F2B8B5;
16
+ --formitiva-success-color: #81C995;
17
+
18
+ --formitiva-border-radius: 12px;
19
+ --formitiva-shadow: 0 8px 30px #000000;
20
+
21
+ --formitiva-button-bg: #D0BCFF;
22
+ --formitiva-button-text: #381E72;
23
+
24
+ /* Tooltip */
25
+ --formitiva-tooltip-color-bg: #282828;
26
+ --formitiva-tooltip-color: #F5F5F5;
27
+ }
@@ -0,0 +1,46 @@
1
+ /* Material Design 3 Inspired Light Theme */
2
+ [data-formitiva-theme="material"] {
3
+
4
+ /* Surfaces */
5
+ --formitiva-primary-bg: #ffffff;
6
+ --formitiva-secondary-bg: #ffffff;
7
+ --formitiva-input-bg: #f9fafb;
8
+
9
+ /* Text */
10
+ --formitiva-text-color: #1f2937;
11
+ --formitiva-text-muted: #6b7280;
12
+
13
+ /* Material Border System */
14
+ --formitiva-border-color: #e5e7eb;
15
+ --formitiva-border-hover: #cbd5e1;
16
+ --formitiva-border-focus: #6750A4; /* Material Purple Primary */
17
+
18
+ /* State Colors */
19
+ --formitiva-error-color: #B3261E;
20
+ --formitiva-success-color: #1E8E3E;
21
+
22
+ /* Interaction */
23
+ --formitiva-option-menu-hover-bg: #000000;
24
+
25
+ /* Shape */
26
+ --formitiva-border-radius: 12px;
27
+
28
+ /* Elevation */
29
+ --formitiva-shadow:
30
+ 0 1px 2px #000000,
31
+ 0 2px 6px #000000;
32
+
33
+ /* Buttons */
34
+ --formitiva-button-bg: #6750A4;
35
+ --formitiva-button-text: #ffffff;
36
+ --formitiva-button-border-radius: 999px; /* pill */
37
+ --formitiva-button-shadow:
38
+ 0 2px 6px #000000;
39
+
40
+ /* Inputs */
41
+ --formitiva-input-padding: 12px 14px;
42
+
43
+ /* Tooltip */
44
+ --formitiva-tooltip-color-bg: #3c3c3c;
45
+ --formitiva-tooltip-color: #ffffff;
46
+ }
@@ -0,0 +1,24 @@
1
+ [data-formitiva-theme="midnight-dark"] {
2
+ --formitiva-primary-bg: #0b1120;
3
+ --formitiva-secondary-bg: #111c2d;
4
+ --formitiva-input-bg: #14223a;
5
+
6
+ --formitiva-text-color: #e5f0ff;
7
+ --formitiva-text-muted: #9db2d4;
8
+
9
+ --formitiva-border-color: #1f2b44;
10
+ --formitiva-border-hover: #2c3d5e;
11
+ --formitiva-border-focus: #60a5fa;
12
+
13
+ --formitiva-error-color: #fb7185;
14
+ --formitiva-success-color: #4ade80;
15
+
16
+ --formitiva-option-menu-hover-bg: #ffffff;
17
+ --formitiva-border-radius: 6px;
18
+
19
+ --formitiva-shadow: 0 12px 28px #000000;
20
+
21
+ /* Tooltip */
22
+ --formitiva-tooltip-color-bg: #282828;
23
+ --formitiva-tooltip-color: #F5F5F5;
24
+ }
@@ -0,0 +1,23 @@
1
+ [data-formitiva-theme="modern-light"] {
2
+ --formitiva-primary-bg: #ffffff;
3
+ --formitiva-secondary-bg: #fafafa;
4
+ --formitiva-input-bg: #ffffff;
5
+
6
+ --formitiva-text-color: #1f2937;
7
+ --formitiva-text-muted: #6b7280;
8
+
9
+ --formitiva-border-color: #e5e7eb;
10
+ --formitiva-border-hover: #d1d5db;
11
+ --formitiva-border-focus: #2563eb;
12
+
13
+ --formitiva-error-color: #dc2626;
14
+ --formitiva-success-color: #16a34a;
15
+
16
+ --formitiva-option-menu-hover-bg: #f3f4f6;
17
+ --formitiva-border-radius: 6px;
18
+ --formitiva-shadow: 0 8px 24px #000000;
19
+
20
+ /* Tooltip */
21
+ --formitiva-tooltip-color-bg: #3c3c3c;
22
+ --formitiva-tooltip-color: #ffffff;
23
+ }
@@ -0,0 +1,24 @@
1
+ [data-formitiva-theme="neon-cyber-dark"] {
2
+ --formitiva-primary-bg: #0c0f1a;
3
+ --formitiva-secondary-bg: #11172b;
4
+ --formitiva-input-bg: #141c33;
5
+
6
+ --formitiva-text-color: #e0e7ff;
7
+ --formitiva-text-muted: #9ca3af;
8
+
9
+ --formitiva-border-color: #303b63;
10
+ --formitiva-border-hover: #6366f1;
11
+ --formitiva-border-focus: #22d3ee;
12
+
13
+ --formitiva-error-color: #fb7185;
14
+ --formitiva-success-color: #34d399;
15
+
16
+ --formitiva-option-menu-hover-bg: #636cf1;
17
+ --formitiva-border-radius: 10px;
18
+
19
+ --formitiva-shadow: 0 0 20px #636cf1;
20
+
21
+ /* Tooltip */
22
+ --formitiva-tooltip-color-bg: #282828;
23
+ --formitiva-tooltip-color: #F5F5F5;
24
+ }