mado-ui 0.3.2 → 0.4.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.
- package/css/index.css +41 -6
- package/dist/components/button.d.ts +3 -23
- package/dist/components/details.d.ts +2 -2
- package/dist/components/drop-down.d.ts +1 -1
- package/dist/components/form/fieldset.d.ts +35 -7
- package/dist/components/form/index.d.ts +5 -6
- package/dist/components/form/input/date/index.d.ts +36 -0
- package/dist/components/form/input/index.d.ts +78 -12
- package/dist/components/form/submit-button.d.ts +1 -1
- package/dist/components/form/textarea.d.ts +1 -1
- package/dist/components/ghost.d.ts +1 -1
- package/dist/components/heading.d.ts +1 -1
- package/dist/components/iframe.d.ts +15 -0
- package/dist/components/index.d.ts +10 -11
- package/dist/components/link.d.ts +3 -14
- package/dist/components/modal.d.ts +1 -1
- package/dist/components/time.d.ts +1 -1
- package/dist/components/tooltip.d.ts +1 -1
- package/dist/components.esm.js +466 -122
- package/dist/components.esm.js.map +1 -1
- package/dist/components.js +465 -119
- package/dist/components.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -3
- package/dist/hooks/use-fieldset-context.d.ts +22 -0
- package/dist/hooks/use-form-context.d.ts +18 -10
- package/dist/hooks.esm.js +99 -5
- package/dist/hooks.esm.js.map +1 -1
- package/dist/hooks.js +100 -3
- package/dist/hooks.js.map +1 -1
- package/dist/icons/3-people.d.ts +2 -2
- package/dist/icons/3-rectangles-desktop-fill.d.ts +2 -2
- package/dist/icons/3-rectangles-desktop.d.ts +2 -2
- package/dist/icons/airplane.d.ts +2 -2
- package/dist/icons/arrow-triangle-2-circlepath-circle-fill.d.ts +2 -2
- package/dist/icons/arrow-triangle-2-circlepath-circle.d.ts +2 -2
- package/dist/icons/bag-fill.d.ts +2 -2
- package/dist/icons/banknote.d.ts +2 -2
- package/dist/icons/bell-fill.d.ts +2 -2
- package/dist/icons/bolt-car.d.ts +2 -2
- package/dist/icons/bolt-fill.d.ts +2 -2
- package/dist/icons/bolt-ring-closed.d.ts +2 -2
- package/dist/icons/bolt-trianglebadge-exclamationmark.d.ts +2 -2
- package/dist/icons/book-fill.d.ts +2 -2
- package/dist/icons/bookmark-fill.d.ts +2 -2
- package/dist/icons/briefcase-fill.d.ts +2 -2
- package/dist/icons/bubble-left-fill.d.ts +2 -2
- package/dist/icons/building-2-fill.d.ts +2 -2
- package/dist/icons/calendar.d.ts +2 -2
- package/dist/icons/camera-fill.d.ts +2 -2
- package/dist/icons/car-fill.d.ts +2 -2
- package/dist/icons/cart-fill.d.ts +2 -2
- package/dist/icons/chart-bar-doc-horizontal.d.ts +2 -2
- package/dist/icons/checkmark-seal.d.ts +2 -2
- package/dist/icons/checkmark.d.ts +2 -2
- package/dist/icons/chevron-down.d.ts +2 -2
- package/dist/icons/chevron-left-forwardslash-chevron-right.d.ts +2 -2
- package/dist/icons/chevron-left.d.ts +2 -2
- package/dist/icons/chevron-right.d.ts +2 -2
- package/dist/icons/chevron-up-chevron-down.d.ts +2 -2
- package/dist/icons/circle-fill.d.ts +2 -2
- package/dist/icons/clock-badge-checkmark.d.ts +2 -2
- package/dist/icons/clock-fill.d.ts +2 -2
- package/dist/icons/cloud-fill.d.ts +2 -2
- package/dist/icons/cube-fill.d.ts +2 -2
- package/dist/icons/curve-point-left.d.ts +2 -2
- package/dist/icons/dial-high.d.ts +2 -2
- package/dist/icons/doc-fill.d.ts +2 -2
- package/dist/icons/doc-on-clipboard.d.ts +2 -2
- package/dist/icons/doc-on-doc-fill.d.ts +2 -2
- package/dist/icons/doc-on-doc.d.ts +2 -2
- package/dist/icons/doc-text-magnifyingglass.d.ts +2 -2
- package/dist/icons/dollar-sign.d.ts +2 -2
- package/dist/icons/ellipsis-circle-fill.d.ts +2 -2
- package/dist/icons/ellipsis-circle.d.ts +2 -2
- package/dist/icons/envelope-fill.d.ts +2 -2
- package/dist/icons/envelope.d.ts +2 -2
- package/dist/icons/exclamationmark-octagon.d.ts +2 -2
- package/dist/icons/eye.d.ts +2 -2
- package/dist/icons/figure-water-fitness.d.ts +2 -2
- package/dist/icons/flag-fill.d.ts +2 -2
- package/dist/icons/flame-fill.d.ts +2 -2
- package/dist/icons/folder-fill.d.ts +2 -2
- package/dist/icons/folder.d.ts +2 -2
- package/dist/icons/gearshape-fill.d.ts +2 -2
- package/dist/icons/gearshape.d.ts +2 -2
- package/dist/icons/gift-fill.d.ts +2 -2
- package/dist/icons/globe-americas-fill.d.ts +2 -2
- package/dist/icons/hare-fill.d.ts +2 -2
- package/dist/icons/house-deskclock.d.ts +2 -2
- package/dist/icons/house-fill.d.ts +2 -2
- package/dist/icons/house.d.ts +2 -2
- package/dist/icons/iphone-house.d.ts +2 -2
- package/dist/icons/light-ribbon.d.ts +2 -2
- package/dist/icons/lightbulb-fill.d.ts +2 -2
- package/dist/icons/lightbulb-led.d.ts +2 -2
- package/dist/icons/list-bullet-clipboard-fill.d.ts +2 -2
- package/dist/icons/magnifyingglass.d.ts +2 -2
- package/dist/icons/map-pin-ellipse.d.ts +2 -2
- package/dist/icons/minus-plus-batterblock.d.ts +2 -2
- package/dist/icons/network-shield.d.ts +2 -2
- package/dist/icons/network.d.ts +2 -2
- package/dist/icons/newspaper-fill.d.ts +2 -2
- package/dist/icons/number.d.ts +2 -2
- package/dist/icons/paperplane-fill.d.ts +2 -2
- package/dist/icons/person-crop-square.d.ts +2 -2
- package/dist/icons/person-fill-questionmark.d.ts +2 -2
- package/dist/icons/person-fill.d.ts +2 -2
- package/dist/icons/person.d.ts +2 -2
- package/dist/icons/phone-arrow-up-right.d.ts +2 -2
- package/dist/icons/phone-fill.d.ts +2 -2
- package/dist/icons/phone.d.ts +2 -2
- package/dist/icons/play-rectangle-fill.d.ts +2 -2
- package/dist/icons/plus.d.ts +2 -2
- package/dist/icons/qrcode.d.ts +2 -2
- package/dist/icons/rectangle-portrait-and-arrow-left-fill.d.ts +2 -2
- package/dist/icons/rectangle-portrait-and-arrow-left.d.ts +2 -2
- package/dist/icons/sensor.d.ts +2 -2
- package/dist/icons/signature.d.ts +2 -2
- package/dist/icons/solar-panel.d.ts +2 -2
- package/dist/icons/square-and-arrow-down-fill.d.ts +2 -2
- package/dist/icons/square-and-arrow-down.d.ts +2 -2
- package/dist/icons/square-and-arrow-up-fill.d.ts +2 -2
- package/dist/icons/square-and-arrow-up.d.ts +2 -2
- package/dist/icons/square-and-pencil-fill.d.ts +2 -2
- package/dist/icons/square-and-pencil.d.ts +2 -2
- package/dist/icons/text-bubble.d.ts +2 -2
- package/dist/icons/trash-fill.d.ts +2 -2
- package/dist/icons/trash.d.ts +2 -2
- package/dist/icons/tree.d.ts +2 -2
- package/dist/icons/umbrella-fill.d.ts +2 -2
- package/dist/icons/xmark.d.ts +2 -2
- package/dist/icons.esm.js.map +1 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.esm.js +466 -122
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +465 -119
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -2
- package/dist/types/utils.d.ts +20 -0
- package/dist/utils/get-date.d.ts +17 -0
- package/dist/utils/index.d.ts +8 -9
- package/dist/utils/string-manipulation.d.ts +38 -3
- package/dist/utils/tw-sort.d.ts +1 -1
- package/dist/utils.esm.js +112 -21
- package/dist/utils.esm.js.map +1 -1
- package/dist/utils.js +113 -20
- package/dist/utils.js.map +1 -1
- package/package.json +4 -4
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import createFastContext from './create-fast-context';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
2
|
+
export * from './use-fieldset-context';
|
|
3
|
+
export * from './use-form-context';
|
|
4
|
+
export * from './use-form-status';
|
|
5
|
+
export { createFastContext };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Field } from './use-form-context';
|
|
2
|
+
export type FieldsetContextValue = {
|
|
3
|
+
fieldList: Field[];
|
|
4
|
+
decorative: boolean;
|
|
5
|
+
id: string;
|
|
6
|
+
join?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
export type FieldsetContext = [
|
|
10
|
+
FieldsetContextValue | undefined,
|
|
11
|
+
{
|
|
12
|
+
registerField: (field: Field) => void;
|
|
13
|
+
removeField: (fieldID: string) => void;
|
|
14
|
+
updateField: (fieldID: string, updates: Partial<Field>) => void;
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
import { ReactNode } from 'react';
|
|
18
|
+
export declare function FieldsetContextProvider({ children, initialValue, }: {
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
initialValue?: FieldsetContextValue;
|
|
21
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function useFieldsetContext(): FieldsetContext;
|
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
1
|
export type FieldType = 'array' | 'email' | 'file' | 'number' | 'object' | 'string' | 'tel' | 'textarea' | 'url';
|
|
3
|
-
type
|
|
2
|
+
export type StringField = {
|
|
4
3
|
type: 'email' | 'file' | 'number' | 'string' | 'tel' | 'textarea' | 'url';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
4
|
+
value: string;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
invalid?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type ObjectField = {
|
|
9
9
|
type: 'object';
|
|
10
10
|
fields: Field[];
|
|
11
11
|
};
|
|
12
|
+
export type ArrayField = {
|
|
13
|
+
type: 'array';
|
|
14
|
+
of: ArrayObjectOrNormalField;
|
|
15
|
+
};
|
|
16
|
+
type ArrayObjectOrNormalField = StringField | ArrayField | ObjectField;
|
|
12
17
|
export type Field = ArrayObjectOrNormalField & {
|
|
13
18
|
id: string;
|
|
14
|
-
invalid?: boolean;
|
|
15
19
|
name: string;
|
|
16
|
-
required?: boolean;
|
|
17
|
-
value: string;
|
|
18
20
|
};
|
|
19
21
|
export type FormContext = Field[];
|
|
22
|
+
import { ReactNode } from 'react';
|
|
20
23
|
/**
|
|
21
24
|
* # Define Field
|
|
22
25
|
*
|
|
23
26
|
* This is a helper function to define a field in a form context with type safety.
|
|
24
27
|
*/
|
|
25
28
|
export declare function defineField(fieldDefinition: Field): Field;
|
|
29
|
+
export declare function isStringField(field: Field): boolean;
|
|
26
30
|
export declare function FormContextProvider({ children }: {
|
|
27
31
|
children?: ReactNode;
|
|
28
32
|
}): import("react/jsx-runtime").JSX.Element;
|
|
29
|
-
export declare function useFormContext(): [FormContext | undefined,
|
|
33
|
+
export declare function useFormContext(): readonly [FormContext | undefined, {
|
|
34
|
+
readonly registerField: (field: Field) => void;
|
|
35
|
+
readonly removeField: (fieldID: string) => void;
|
|
36
|
+
readonly updateField: (fieldID: string, updates: Partial<Field>) => void;
|
|
37
|
+
}];
|
|
30
38
|
export {};
|
package/dist/hooks.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useContext, useSyncExternalStore, useRef, Suspense } from 'react';
|
|
2
|
+
import { createContext, useContext, useSyncExternalStore, useRef, useCallback, useEffect, Suspense } from 'react';
|
|
3
3
|
|
|
4
4
|
function createFastContext(defaultInitialState) {
|
|
5
5
|
function useStoreData(initialState = defaultInitialState) {
|
|
@@ -52,12 +52,106 @@ function createFastContext(defaultInitialState) {
|
|
|
52
52
|
function defineField(fieldDefinition) {
|
|
53
53
|
return fieldDefinition;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
function isStringField(field) {
|
|
56
|
+
return Boolean(field.type !== 'object' && field.type !== 'array');
|
|
57
|
+
}
|
|
58
|
+
const { Provider: Provider$2, useStore: useStore$2 } = createFastContext([]);
|
|
56
59
|
function FormContextProvider({ children }) {
|
|
57
|
-
return jsx(Provider$
|
|
60
|
+
return jsx(Provider$2, { children: children });
|
|
58
61
|
}
|
|
59
62
|
function useFormContext() {
|
|
60
|
-
|
|
63
|
+
const [formContext, setFormContext] = useStore$2(store => store);
|
|
64
|
+
const registerField = useCallback((field) => {
|
|
65
|
+
setFormContext?.(prevContext => {
|
|
66
|
+
const otherFields = (prevContext || []).filter(otherField => otherField.id !== field.id);
|
|
67
|
+
return [...otherFields, field];
|
|
68
|
+
});
|
|
69
|
+
}, []);
|
|
70
|
+
const removeField = useCallback((fieldID) => {
|
|
71
|
+
setFormContext?.(prevContext => (prevContext || []).filter(field => field.id !== fieldID));
|
|
72
|
+
}, []);
|
|
73
|
+
const updateField = useCallback((fieldID, updates) => {
|
|
74
|
+
setFormContext?.(prevContext => {
|
|
75
|
+
const field = prevContext.find(({ id }) => id === fieldID);
|
|
76
|
+
if (!field)
|
|
77
|
+
throw new Error(`Field with id "${fieldID}" not found in form context.`);
|
|
78
|
+
const otherFields = prevContext.filter(({ id }) => id !== fieldID);
|
|
79
|
+
const updatedField = { ...field, ...updates };
|
|
80
|
+
return [...otherFields, updatedField];
|
|
81
|
+
});
|
|
82
|
+
}, []);
|
|
83
|
+
return [formContext, { registerField, removeField, updateField }];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const { Provider: Provider$1, useStore: useStore$1 } = createFastContext(undefined);
|
|
87
|
+
function FieldsetContextProvider({ children, initialValue, }) {
|
|
88
|
+
return jsx(Provider$1, { initialValue: initialValue, children: children });
|
|
89
|
+
}
|
|
90
|
+
function useFieldsetContext() {
|
|
91
|
+
const [fieldsetContext, setFieldsetContext] = useStore$1(store => store), [, formContextFunctions] = useFormContext();
|
|
92
|
+
const registerField = useCallback((field) => {
|
|
93
|
+
setFieldsetContext?.(prev => {
|
|
94
|
+
if (!prev)
|
|
95
|
+
return prev;
|
|
96
|
+
const existingFieldIndex = prev.fieldList.findIndex(existingField => existingField.id === field.id);
|
|
97
|
+
const newFieldList = existingFieldIndex >= 0
|
|
98
|
+
? prev.fieldList.map((existingField, index) => (index === existingFieldIndex ? field : existingField))
|
|
99
|
+
: [...prev.fieldList, field];
|
|
100
|
+
return { ...prev, fieldList: newFieldList };
|
|
101
|
+
});
|
|
102
|
+
}, []);
|
|
103
|
+
const removeField = useCallback((fieldID) => {
|
|
104
|
+
setFieldsetContext?.(prev => {
|
|
105
|
+
if (!prev)
|
|
106
|
+
return prev;
|
|
107
|
+
return {
|
|
108
|
+
...prev,
|
|
109
|
+
fieldList: prev.fieldList.filter(field => field.id !== fieldID),
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}, []);
|
|
113
|
+
const updateField = useCallback((fieldID, updates) => {
|
|
114
|
+
setFieldsetContext?.(prev => {
|
|
115
|
+
if (!prev)
|
|
116
|
+
return prev;
|
|
117
|
+
return {
|
|
118
|
+
...prev,
|
|
119
|
+
fieldList: prev.fieldList.map(field => (field.id === fieldID ? { ...field, ...updates } : field)),
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}, []);
|
|
123
|
+
const createFormContextEntry = useCallback((fieldsetEntry) => {
|
|
124
|
+
if (fieldsetEntry.join) {
|
|
125
|
+
const joinedValue = fieldsetEntry.fieldList
|
|
126
|
+
.filter(field => isStringField(field) && field.value !== '')
|
|
127
|
+
.map(field => field.value)
|
|
128
|
+
.join(fieldsetEntry.join);
|
|
129
|
+
return defineField({
|
|
130
|
+
type: 'string',
|
|
131
|
+
id: fieldsetEntry.id,
|
|
132
|
+
name: fieldsetEntry.name,
|
|
133
|
+
value: joinedValue,
|
|
134
|
+
required: fieldsetEntry.fieldList.some(field => field.required),
|
|
135
|
+
invalid: fieldsetEntry.fieldList.some(field => field.invalid),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return defineField({
|
|
139
|
+
type: 'object',
|
|
140
|
+
id: fieldsetEntry.id,
|
|
141
|
+
name: fieldsetEntry.name,
|
|
142
|
+
fields: fieldsetEntry.fieldList,
|
|
143
|
+
});
|
|
144
|
+
}, []);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
if (!fieldsetContext || fieldsetContext.decorative)
|
|
147
|
+
return;
|
|
148
|
+
const formContextEntry = createFormContextEntry(fieldsetContext);
|
|
149
|
+
formContextFunctions.registerField(formContextEntry);
|
|
150
|
+
return () => {
|
|
151
|
+
formContextFunctions.removeField(fieldsetContext.id);
|
|
152
|
+
};
|
|
153
|
+
}, [fieldsetContext, formContextFunctions.registerField, formContextFunctions.removeField, createFormContextEntry]);
|
|
154
|
+
return [fieldsetContext, { registerField, removeField, updateField }];
|
|
61
155
|
}
|
|
62
156
|
|
|
63
157
|
const DEFAULT_STATUS = 'incomplete';
|
|
@@ -69,5 +163,5 @@ function useFormStatus() {
|
|
|
69
163
|
return useStore(store => store);
|
|
70
164
|
}
|
|
71
165
|
|
|
72
|
-
export { FormContextProvider, FormStatusProvider, createFastContext, defineField, useFormContext, useFormStatus };
|
|
166
|
+
export { FieldsetContextProvider, FormContextProvider, FormStatusProvider, createFastContext, defineField, isStringField, useFieldsetContext, useFormContext, useFormStatus };
|
|
73
167
|
//# sourceMappingURL=hooks.esm.js.map
|
package/dist/hooks.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.esm.js","sources":["../src/hooks/create-fast-context.tsx","../src/hooks/use-form-context.tsx","../src/hooks/use-form-status.tsx"],"sourcesContent":["// * React\nimport { HTMLAttributes, useRef, createContext, useContext, useSyncExternalStore } from 'react'\n\nexport default function createFastContext<Store>(defaultInitialState: Store) {\n\tfunction useStoreData(initialState: Store = defaultInitialState): {\n\t\tget: () => Store\n\t\tset: (value: Store | ((prevState: Store) => Store)) => void\n\t\tsubscribe: (callback: () => void) => () => void\n\t} {\n\t\tconst store = useRef(initialState),\n\t\t\tget = () => store.current,\n\t\t\tsubscribers = useRef(new Set<() => void>())\n\n\t\tconst set = (value: Store | ((prevState: Store) => Store)) => {\n\t\t\tif (typeof value === 'function') {\n\t\t\t\tstore.current = (value as (prevState: Store) => Store)(store.current)\n\t\t\t} else {\n\t\t\t\tstore.current = value\n\t\t\t}\n\t\t\tsubscribers.current.forEach(callback => callback())\n\t\t}\n\n\t\tconst subscribe = (callback: () => void) => {\n\t\t\tsubscribers.current.add(callback)\n\t\t\treturn () => subscribers.current.delete(callback)\n\t\t}\n\n\t\treturn {\n\t\t\tget,\n\t\t\tset,\n\t\t\tsubscribe,\n\t\t}\n\t}\n\n\ttype UseStoreDataReturnType = ReturnType<typeof useStoreData>\n\n\tconst StoreContext = createContext<UseStoreDataReturnType | null>(null)\n\n\tfunction Provider({\n\t\tinitialValue = defaultInitialState,\n\t\t...props\n\t}: Pick<HTMLAttributes<HTMLElement>, 'children'> & { initialValue?: Store }) {\n\t\treturn <StoreContext.Provider value={useStoreData(initialValue)} {...props} />\n\t}\n\n\tfunction useStore<SelectorOutput>(\n\t\tselector: (store: Store) => SelectorOutput,\n\t\tinitialValue?: Store,\n\t): [SelectorOutput | undefined, ((value: Store | ((prevState: Store) => Store)) => void) | undefined] {\n\t\tconst store = useContext(StoreContext)\n\n\t\tif (!store) {\n\t\t\tconst localStoreValue = initialValue !== undefined ? initialValue : defaultInitialState\n\n\t\t\tconst selectedValue = selector(localStoreValue)\n\t\t\tconst noOpSet = () => console.warn('Attempting to set store value outside of Provider')\n\n\t\t\treturn [selectedValue, noOpSet]\n\t\t}\n\n\t\tconst state = useSyncExternalStore(\n\t\t\tstore.subscribe,\n\t\t\t() => selector(store.get()),\n\t\t\t() => selector(initialValue !== undefined ? initialValue : defaultInitialState),\n\t\t)\n\n\t\treturn [state, store.set]\n\t}\n\n\treturn {\n\t\tProvider,\n\t\tuseStore,\n\t}\n}\n","// * Types\nimport { ReactNode } from 'react'\n\nexport type FieldType = 'array' | 'email' | 'file' | 'number' | 'object' | 'string' | 'tel' | 'textarea' | 'url'\n\ntype ArrayObjectOrNormalField =\n\t| { type: 'email' | 'file' | 'number' | 'string' | 'tel' | 'textarea' | 'url' }\n\t| { type: 'array'; of: ArrayObjectOrNormalField }\n\t| { type: 'object'; fields: Field[] }\n\nexport type Field = ArrayObjectOrNormalField & {\n\tid: string\n\tinvalid?: boolean\n\tname: string\n\trequired?: boolean\n\tvalue: string\n}\n\nexport type FormContext = Field[]\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\n/**\n * # Define Field\n *\n * This is a helper function to define a field in a form context with type safety.\n */\nexport function defineField(fieldDefinition: Field) {\n\treturn fieldDefinition\n}\n\nconst { Provider, useStore } = createFastContext<FormContext>([])\n\nexport function FormContextProvider({ children }: { children?: ReactNode }) {\n\treturn <Provider>{children}</Provider>\n}\n\nexport function useFormContext() {\n\treturn useStore(store => store)\n}\n","// * Types\nimport { ReactNode, Suspense } from 'react'\n\nexport type FormStatus = 'error' | 'incomplete' | 'loading' | 'ready' | 'success' | 'readonly'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst DEFAULT_STATUS: FormStatus = 'incomplete'\n\nconst { Provider, useStore } = createFastContext<FormStatus>(DEFAULT_STATUS)\n\nexport function FormStatusProvider({\n\tchildren,\n\tinitialStatus = DEFAULT_STATUS,\n}: {\n\tchildren?: ReactNode\n\tinitialStatus?: FormStatus\n}) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<Provider initialValue={initialStatus}>{children}</Provider>\n\t\t</Suspense>\n\t)\n}\n\nexport function useFormStatus() {\n\treturn useStore(store => store)\n}\n"],"names":["_jsx","Provider","useStore"],"mappings":";;;AAGc,SAAU,iBAAiB,CAAQ,mBAA0B,EAAA;IAC1E,SAAS,YAAY,CAAC,YAAA,GAAsB,mBAAmB,EAAA;QAK9D,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EACjC,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EACzB,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,EAAc,CAAC;AAE5C,QAAA,MAAM,GAAG,GAAG,CAAC,KAA4C,KAAI;AAC5D,YAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;gBAChC,KAAK,CAAC,OAAO,GAAI,KAAqC,CAAC,KAAK,CAAC,OAAO,CAAC;;iBAC/D;AACN,gBAAA,KAAK,CAAC,OAAO,GAAG,KAAK;;AAEtB,YAAA,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;AACpD,SAAC;AAED,QAAA,MAAM,SAAS,GAAG,CAAC,QAAoB,KAAI;AAC1C,YAAA,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACjC,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;AAClD,SAAC;QAED,OAAO;YACN,GAAG;YACH,GAAG;YACH,SAAS;SACT;;AAKF,IAAA,MAAM,YAAY,GAAG,aAAa,CAAgC,IAAI,CAAC;IAEvE,SAAS,QAAQ,CAAC,EACjB,YAAY,GAAG,mBAAmB,EAClC,GAAG,KAAK,EACkE,EAAA;AAC1E,QAAA,OAAOA,GAAA,CAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC,EAAA,GAAM,KAAK,GAAI;;AAG/E,IAAA,SAAS,QAAQ,CAChB,QAA0C,EAC1C,YAAoB,EAAA;AAEpB,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC;QAEtC,IAAI,CAAC,KAAK,EAAE;AACX,YAAA,MAAM,eAAe,GAAG,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,mBAAmB;AAEvF,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC;AAEvF,YAAA,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC;;AAGhC,QAAA,MAAM,KAAK,GAAG,oBAAoB,CACjC,KAAK,CAAC,SAAS,EACf,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAC3B,MAAM,QAAQ,CAAC,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,mBAAmB,CAAC,CAC/E;AAED,QAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;;IAG1B,OAAO;QACN,QAAQ;QACR,QAAQ;KACR;AACF;;AClDA;;;;AAIG;AACG,SAAU,WAAW,CAAC,eAAsB,EAAA;AACjD,IAAA,OAAO,eAAe;AACvB;AAEA,MAAM,YAAEC,UAAQ,YAAEC,UAAQ,EAAE,GAAG,iBAAiB,CAAc,EAAE,CAAC;AAE3D,SAAU,mBAAmB,CAAC,EAAE,QAAQ,EAA4B,EAAA;AACzE,IAAA,OAAOF,GAAA,CAACC,UAAQ,EAAA,EAAA,QAAA,EAAE,QAAQ,GAAY;AACvC;SAEgB,cAAc,GAAA;IAC7B,OAAOC,UAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;AAChC;;AChCA,MAAM,cAAc,GAAe,YAAY;AAE/C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAa,cAAc,CAAC;AAEtE,SAAU,kBAAkB,CAAC,EAClC,QAAQ,EACR,aAAa,GAAG,cAAc,GAI9B,EAAA;AACA,IAAA,QACCF,GAAA,CAAC,QAAQ,EAAA,EAAA,QAAA,EACRA,IAAC,QAAQ,EAAA,EAAC,YAAY,EAAE,aAAa,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAY,EAAA,CAClD;AAEb;SAEgB,aAAa,GAAA;IAC5B,OAAO,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC;AAChC;;;;"}
|
|
1
|
+
{"version":3,"file":"hooks.esm.js","sources":["../src/hooks/create-fast-context.tsx","../src/hooks/use-form-context.tsx","../src/hooks/use-fieldset-context.tsx","../src/hooks/use-form-status.tsx"],"sourcesContent":["// * React\nimport { HTMLAttributes, useRef, createContext, useContext, useSyncExternalStore } from 'react'\n\nexport default function createFastContext<Store>(defaultInitialState: Store) {\n\tfunction useStoreData(initialState: Store = defaultInitialState): {\n\t\tget: () => Store\n\t\tset: (value: Store | ((prevState: Store) => Store)) => void\n\t\tsubscribe: (callback: () => void) => () => void\n\t} {\n\t\tconst store = useRef(initialState),\n\t\t\tget = () => store.current,\n\t\t\tsubscribers = useRef(new Set<() => void>())\n\n\t\tconst set = (value: Store | ((prevState: Store) => Store)) => {\n\t\t\tif (typeof value === 'function') {\n\t\t\t\tstore.current = (value as (prevState: Store) => Store)(store.current)\n\t\t\t} else {\n\t\t\t\tstore.current = value\n\t\t\t}\n\t\t\tsubscribers.current.forEach(callback => callback())\n\t\t}\n\n\t\tconst subscribe = (callback: () => void) => {\n\t\t\tsubscribers.current.add(callback)\n\t\t\treturn () => subscribers.current.delete(callback)\n\t\t}\n\n\t\treturn {\n\t\t\tget,\n\t\t\tset,\n\t\t\tsubscribe,\n\t\t}\n\t}\n\n\ttype UseStoreDataReturnType = ReturnType<typeof useStoreData>\n\n\tconst StoreContext = createContext<UseStoreDataReturnType | null>(null)\n\n\tfunction Provider({\n\t\tinitialValue = defaultInitialState,\n\t\t...props\n\t}: Pick<HTMLAttributes<HTMLElement>, 'children'> & { initialValue?: Store }) {\n\t\treturn <StoreContext.Provider value={useStoreData(initialValue)} {...props} />\n\t}\n\n\tfunction useStore<SelectorOutput>(\n\t\tselector: (store: Store) => SelectorOutput,\n\t\tinitialValue?: Store,\n\t): [SelectorOutput | undefined, ((value: Store | ((prevState: Store) => Store)) => void) | undefined] {\n\t\tconst store = useContext(StoreContext)\n\n\t\tif (!store) {\n\t\t\tconst localStoreValue = initialValue !== undefined ? initialValue : defaultInitialState\n\n\t\t\tconst selectedValue = selector(localStoreValue)\n\t\t\tconst noOpSet = () => console.warn('Attempting to set store value outside of Provider')\n\n\t\t\treturn [selectedValue, noOpSet]\n\t\t}\n\n\t\tconst state = useSyncExternalStore(\n\t\t\tstore.subscribe,\n\t\t\t() => selector(store.get()),\n\t\t\t() => selector(initialValue !== undefined ? initialValue : defaultInitialState),\n\t\t)\n\n\t\treturn [state, store.set]\n\t}\n\n\treturn {\n\t\tProvider,\n\t\tuseStore,\n\t}\n}\n","// * Types\nexport type FieldType = 'array' | 'email' | 'file' | 'number' | 'object' | 'string' | 'tel' | 'textarea' | 'url'\n\nexport type StringField = {\n\ttype: 'email' | 'file' | 'number' | 'string' | 'tel' | 'textarea' | 'url'\n\tvalue: string\n\trequired?: boolean\n\tinvalid?: boolean\n}\n\nexport type ObjectField = { type: 'object'; fields: Field[] }\n\nexport type ArrayField = { type: 'array'; of: ArrayObjectOrNormalField }\n\ntype ArrayObjectOrNormalField = StringField | ArrayField | ObjectField\n\nexport type Field = ArrayObjectOrNormalField & {\n\tid: string\n\tname: string\n}\n\nexport type FormContext = Field[]\n\n// * React\nimport { ReactNode, useCallback } from 'react'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\n/**\n * # Define Field\n *\n * This is a helper function to define a field in a form context with type safety.\n */\nexport function defineField(fieldDefinition: Field) {\n\treturn fieldDefinition\n}\n\nexport function isStringField(field: Field) {\n\treturn Boolean(field.type !== 'object' && field.type !== 'array')\n}\n\nconst { Provider, useStore } = createFastContext<FormContext>([])\n\nexport function FormContextProvider({ children }: { children?: ReactNode }) {\n\treturn <Provider>{children}</Provider>\n}\n\nexport function useFormContext() {\n\tconst [formContext, setFormContext] = useStore(store => store)\n\n\tconst registerField = useCallback((field: Field) => {\n\t\tsetFormContext?.(prevContext => {\n\t\t\tconst otherFields = (prevContext || []).filter(otherField => otherField.id !== field.id)\n\n\t\t\treturn [...otherFields, field]\n\t\t})\n\t}, [])\n\n\tconst removeField = useCallback((fieldID: string) => {\n\t\tsetFormContext?.(prevContext => (prevContext || []).filter(field => field.id !== fieldID))\n\t}, [])\n\n\tconst updateField = useCallback((fieldID: string, updates: Partial<Field>) => {\n\t\tsetFormContext?.(prevContext => {\n\t\t\tconst field = prevContext.find(({ id }) => id === fieldID)\n\n\t\t\tif (!field) throw new Error(`Field with id \"${fieldID}\" not found in form context.`)\n\n\t\t\tconst otherFields = prevContext.filter(({ id }) => id !== fieldID)\n\n\t\t\tconst updatedField = { ...field, ...updates } as Field\n\n\t\t\treturn [...otherFields, updatedField]\n\t\t})\n\t}, [])\n\n\treturn [formContext, { registerField, removeField, updateField }] as const\n}\n","// * Types\nimport { defineField, Field, isStringField, StringField, useFormContext } from './use-form-context'\n\nexport type FieldsetContextValue = {\n\tfieldList: Field[]\n\tdecorative: boolean\n\tid: string\n\tjoin?: string\n\tname: string\n}\n\nexport type FieldsetContext = [\n\tFieldsetContextValue | undefined,\n\t{\n\t\tregisterField: (field: Field) => void\n\t\tremoveField: (fieldID: string) => void\n\t\tupdateField: (fieldID: string, updates: Partial<Field>) => void\n\t},\n]\n\n// * React\nimport { ReactNode, useCallback, useEffect } from 'react'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst { Provider, useStore } = createFastContext<FieldsetContextValue | undefined>(undefined)\n\nexport function FieldsetContextProvider({\n\tchildren,\n\tinitialValue,\n}: {\n\tchildren?: ReactNode\n\tinitialValue?: FieldsetContextValue\n}) {\n\treturn <Provider initialValue={initialValue}>{children}</Provider>\n}\n\nexport function useFieldsetContext(): FieldsetContext {\n\tconst [fieldsetContext, setFieldsetContext] = useStore(store => store),\n\t\t[, formContextFunctions] = useFormContext()\n\n\tconst registerField = useCallback((field: Field) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\tconst existingFieldIndex = prev.fieldList.findIndex(existingField => existingField.id === field.id)\n\n\t\t\tconst newFieldList =\n\t\t\t\texistingFieldIndex >= 0\n\t\t\t\t\t? prev.fieldList.map((existingField, index) => (index === existingFieldIndex ? field : existingField))\n\t\t\t\t\t: [...prev.fieldList, field]\n\n\t\t\treturn { ...prev, fieldList: newFieldList }\n\t\t})\n\t}, [])\n\n\tconst removeField = useCallback((fieldID: string) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\treturn {\n\t\t\t\t...prev,\n\t\t\t\tfieldList: prev.fieldList.filter(field => field.id !== fieldID),\n\t\t\t}\n\t\t})\n\t}, [])\n\n\tconst updateField = useCallback((fieldID: string, updates: Partial<Field>) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\treturn {\n\t\t\t\t...prev,\n\t\t\t\tfieldList: prev.fieldList.map(field => (field.id === fieldID ? ({ ...field, ...updates } as Field) : field)),\n\t\t\t}\n\t\t})\n\t}, [])\n\n\tconst createFormContextEntry = useCallback((fieldsetEntry: FieldsetContextValue): Field => {\n\t\tif (fieldsetEntry.join) {\n\t\t\tconst joinedValue = fieldsetEntry.fieldList\n\t\t\t\t.filter(field => isStringField(field) && (field as StringField).value !== '')\n\t\t\t\t.map(field => (field as StringField).value)\n\t\t\t\t.join(fieldsetEntry.join)\n\n\t\t\treturn defineField({\n\t\t\t\ttype: 'string',\n\t\t\t\tid: fieldsetEntry.id,\n\t\t\t\tname: fieldsetEntry.name,\n\t\t\t\tvalue: joinedValue,\n\t\t\t\trequired: fieldsetEntry.fieldList.some(field => (field as StringField).required),\n\t\t\t\tinvalid: fieldsetEntry.fieldList.some(field => (field as StringField).invalid),\n\t\t\t})\n\t\t}\n\n\t\treturn defineField({\n\t\t\ttype: 'object',\n\t\t\tid: fieldsetEntry.id,\n\t\t\tname: fieldsetEntry.name,\n\t\t\tfields: fieldsetEntry.fieldList,\n\t\t})\n\t}, [])\n\n\tuseEffect(() => {\n\t\tif (!fieldsetContext || fieldsetContext.decorative) return\n\n\t\tconst formContextEntry = createFormContextEntry(fieldsetContext)\n\n\t\tformContextFunctions.registerField(formContextEntry)\n\n\t\treturn () => {\n\t\t\tformContextFunctions.removeField(fieldsetContext.id)\n\t\t}\n\t}, [fieldsetContext, formContextFunctions.registerField, formContextFunctions.removeField, createFormContextEntry])\n\n\treturn [fieldsetContext, { registerField, removeField, updateField }]\n}\n","// * Types\nimport { ReactNode, Suspense } from 'react'\n\nexport type FormStatus = 'error' | 'incomplete' | 'loading' | 'ready' | 'success' | 'readonly'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst DEFAULT_STATUS: FormStatus = 'incomplete'\n\nconst { Provider, useStore } = createFastContext<FormStatus>(DEFAULT_STATUS)\n\nexport function FormStatusProvider({\n\tchildren,\n\tinitialStatus = DEFAULT_STATUS,\n}: {\n\tchildren?: ReactNode\n\tinitialStatus?: FormStatus\n}) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<Provider initialValue={initialStatus}>{children}</Provider>\n\t\t</Suspense>\n\t)\n}\n\nexport function useFormStatus() {\n\treturn useStore(store => store)\n}\n"],"names":["_jsx","Provider","useStore"],"mappings":"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"}
|
package/dist/hooks.js
CHANGED
|
@@ -54,12 +54,106 @@ function createFastContext(defaultInitialState) {
|
|
|
54
54
|
function defineField(fieldDefinition) {
|
|
55
55
|
return fieldDefinition;
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
function isStringField(field) {
|
|
58
|
+
return Boolean(field.type !== 'object' && field.type !== 'array');
|
|
59
|
+
}
|
|
60
|
+
const { Provider: Provider$2, useStore: useStore$2 } = createFastContext([]);
|
|
58
61
|
function FormContextProvider({ children }) {
|
|
59
|
-
return jsxRuntime.jsx(Provider$
|
|
62
|
+
return jsxRuntime.jsx(Provider$2, { children: children });
|
|
60
63
|
}
|
|
61
64
|
function useFormContext() {
|
|
62
|
-
|
|
65
|
+
const [formContext, setFormContext] = useStore$2(store => store);
|
|
66
|
+
const registerField = react.useCallback((field) => {
|
|
67
|
+
setFormContext?.(prevContext => {
|
|
68
|
+
const otherFields = (prevContext || []).filter(otherField => otherField.id !== field.id);
|
|
69
|
+
return [...otherFields, field];
|
|
70
|
+
});
|
|
71
|
+
}, []);
|
|
72
|
+
const removeField = react.useCallback((fieldID) => {
|
|
73
|
+
setFormContext?.(prevContext => (prevContext || []).filter(field => field.id !== fieldID));
|
|
74
|
+
}, []);
|
|
75
|
+
const updateField = react.useCallback((fieldID, updates) => {
|
|
76
|
+
setFormContext?.(prevContext => {
|
|
77
|
+
const field = prevContext.find(({ id }) => id === fieldID);
|
|
78
|
+
if (!field)
|
|
79
|
+
throw new Error(`Field with id "${fieldID}" not found in form context.`);
|
|
80
|
+
const otherFields = prevContext.filter(({ id }) => id !== fieldID);
|
|
81
|
+
const updatedField = { ...field, ...updates };
|
|
82
|
+
return [...otherFields, updatedField];
|
|
83
|
+
});
|
|
84
|
+
}, []);
|
|
85
|
+
return [formContext, { registerField, removeField, updateField }];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const { Provider: Provider$1, useStore: useStore$1 } = createFastContext(undefined);
|
|
89
|
+
function FieldsetContextProvider({ children, initialValue, }) {
|
|
90
|
+
return jsxRuntime.jsx(Provider$1, { initialValue: initialValue, children: children });
|
|
91
|
+
}
|
|
92
|
+
function useFieldsetContext() {
|
|
93
|
+
const [fieldsetContext, setFieldsetContext] = useStore$1(store => store), [, formContextFunctions] = useFormContext();
|
|
94
|
+
const registerField = react.useCallback((field) => {
|
|
95
|
+
setFieldsetContext?.(prev => {
|
|
96
|
+
if (!prev)
|
|
97
|
+
return prev;
|
|
98
|
+
const existingFieldIndex = prev.fieldList.findIndex(existingField => existingField.id === field.id);
|
|
99
|
+
const newFieldList = existingFieldIndex >= 0
|
|
100
|
+
? prev.fieldList.map((existingField, index) => (index === existingFieldIndex ? field : existingField))
|
|
101
|
+
: [...prev.fieldList, field];
|
|
102
|
+
return { ...prev, fieldList: newFieldList };
|
|
103
|
+
});
|
|
104
|
+
}, []);
|
|
105
|
+
const removeField = react.useCallback((fieldID) => {
|
|
106
|
+
setFieldsetContext?.(prev => {
|
|
107
|
+
if (!prev)
|
|
108
|
+
return prev;
|
|
109
|
+
return {
|
|
110
|
+
...prev,
|
|
111
|
+
fieldList: prev.fieldList.filter(field => field.id !== fieldID),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}, []);
|
|
115
|
+
const updateField = react.useCallback((fieldID, updates) => {
|
|
116
|
+
setFieldsetContext?.(prev => {
|
|
117
|
+
if (!prev)
|
|
118
|
+
return prev;
|
|
119
|
+
return {
|
|
120
|
+
...prev,
|
|
121
|
+
fieldList: prev.fieldList.map(field => (field.id === fieldID ? { ...field, ...updates } : field)),
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
}, []);
|
|
125
|
+
const createFormContextEntry = react.useCallback((fieldsetEntry) => {
|
|
126
|
+
if (fieldsetEntry.join) {
|
|
127
|
+
const joinedValue = fieldsetEntry.fieldList
|
|
128
|
+
.filter(field => isStringField(field) && field.value !== '')
|
|
129
|
+
.map(field => field.value)
|
|
130
|
+
.join(fieldsetEntry.join);
|
|
131
|
+
return defineField({
|
|
132
|
+
type: 'string',
|
|
133
|
+
id: fieldsetEntry.id,
|
|
134
|
+
name: fieldsetEntry.name,
|
|
135
|
+
value: joinedValue,
|
|
136
|
+
required: fieldsetEntry.fieldList.some(field => field.required),
|
|
137
|
+
invalid: fieldsetEntry.fieldList.some(field => field.invalid),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return defineField({
|
|
141
|
+
type: 'object',
|
|
142
|
+
id: fieldsetEntry.id,
|
|
143
|
+
name: fieldsetEntry.name,
|
|
144
|
+
fields: fieldsetEntry.fieldList,
|
|
145
|
+
});
|
|
146
|
+
}, []);
|
|
147
|
+
react.useEffect(() => {
|
|
148
|
+
if (!fieldsetContext || fieldsetContext.decorative)
|
|
149
|
+
return;
|
|
150
|
+
const formContextEntry = createFormContextEntry(fieldsetContext);
|
|
151
|
+
formContextFunctions.registerField(formContextEntry);
|
|
152
|
+
return () => {
|
|
153
|
+
formContextFunctions.removeField(fieldsetContext.id);
|
|
154
|
+
};
|
|
155
|
+
}, [fieldsetContext, formContextFunctions.registerField, formContextFunctions.removeField, createFormContextEntry]);
|
|
156
|
+
return [fieldsetContext, { registerField, removeField, updateField }];
|
|
63
157
|
}
|
|
64
158
|
|
|
65
159
|
const DEFAULT_STATUS = 'incomplete';
|
|
@@ -71,10 +165,13 @@ function useFormStatus() {
|
|
|
71
165
|
return useStore(store => store);
|
|
72
166
|
}
|
|
73
167
|
|
|
168
|
+
exports.FieldsetContextProvider = FieldsetContextProvider;
|
|
74
169
|
exports.FormContextProvider = FormContextProvider;
|
|
75
170
|
exports.FormStatusProvider = FormStatusProvider;
|
|
76
171
|
exports.createFastContext = createFastContext;
|
|
77
172
|
exports.defineField = defineField;
|
|
173
|
+
exports.isStringField = isStringField;
|
|
174
|
+
exports.useFieldsetContext = useFieldsetContext;
|
|
78
175
|
exports.useFormContext = useFormContext;
|
|
79
176
|
exports.useFormStatus = useFormStatus;
|
|
80
177
|
//# sourceMappingURL=hooks.js.map
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../src/hooks/create-fast-context.tsx","../src/hooks/use-form-context.tsx","../src/hooks/use-form-status.tsx"],"sourcesContent":["// * React\nimport { HTMLAttributes, useRef, createContext, useContext, useSyncExternalStore } from 'react'\n\nexport default function createFastContext<Store>(defaultInitialState: Store) {\n\tfunction useStoreData(initialState: Store = defaultInitialState): {\n\t\tget: () => Store\n\t\tset: (value: Store | ((prevState: Store) => Store)) => void\n\t\tsubscribe: (callback: () => void) => () => void\n\t} {\n\t\tconst store = useRef(initialState),\n\t\t\tget = () => store.current,\n\t\t\tsubscribers = useRef(new Set<() => void>())\n\n\t\tconst set = (value: Store | ((prevState: Store) => Store)) => {\n\t\t\tif (typeof value === 'function') {\n\t\t\t\tstore.current = (value as (prevState: Store) => Store)(store.current)\n\t\t\t} else {\n\t\t\t\tstore.current = value\n\t\t\t}\n\t\t\tsubscribers.current.forEach(callback => callback())\n\t\t}\n\n\t\tconst subscribe = (callback: () => void) => {\n\t\t\tsubscribers.current.add(callback)\n\t\t\treturn () => subscribers.current.delete(callback)\n\t\t}\n\n\t\treturn {\n\t\t\tget,\n\t\t\tset,\n\t\t\tsubscribe,\n\t\t}\n\t}\n\n\ttype UseStoreDataReturnType = ReturnType<typeof useStoreData>\n\n\tconst StoreContext = createContext<UseStoreDataReturnType | null>(null)\n\n\tfunction Provider({\n\t\tinitialValue = defaultInitialState,\n\t\t...props\n\t}: Pick<HTMLAttributes<HTMLElement>, 'children'> & { initialValue?: Store }) {\n\t\treturn <StoreContext.Provider value={useStoreData(initialValue)} {...props} />\n\t}\n\n\tfunction useStore<SelectorOutput>(\n\t\tselector: (store: Store) => SelectorOutput,\n\t\tinitialValue?: Store,\n\t): [SelectorOutput | undefined, ((value: Store | ((prevState: Store) => Store)) => void) | undefined] {\n\t\tconst store = useContext(StoreContext)\n\n\t\tif (!store) {\n\t\t\tconst localStoreValue = initialValue !== undefined ? initialValue : defaultInitialState\n\n\t\t\tconst selectedValue = selector(localStoreValue)\n\t\t\tconst noOpSet = () => console.warn('Attempting to set store value outside of Provider')\n\n\t\t\treturn [selectedValue, noOpSet]\n\t\t}\n\n\t\tconst state = useSyncExternalStore(\n\t\t\tstore.subscribe,\n\t\t\t() => selector(store.get()),\n\t\t\t() => selector(initialValue !== undefined ? initialValue : defaultInitialState),\n\t\t)\n\n\t\treturn [state, store.set]\n\t}\n\n\treturn {\n\t\tProvider,\n\t\tuseStore,\n\t}\n}\n","// * Types\nimport { ReactNode } from 'react'\n\nexport type FieldType = 'array' | 'email' | 'file' | 'number' | 'object' | 'string' | 'tel' | 'textarea' | 'url'\n\ntype ArrayObjectOrNormalField =\n\t| { type: 'email' | 'file' | 'number' | 'string' | 'tel' | 'textarea' | 'url' }\n\t| { type: 'array'; of: ArrayObjectOrNormalField }\n\t| { type: 'object'; fields: Field[] }\n\nexport type Field = ArrayObjectOrNormalField & {\n\tid: string\n\tinvalid?: boolean\n\tname: string\n\trequired?: boolean\n\tvalue: string\n}\n\nexport type FormContext = Field[]\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\n/**\n * # Define Field\n *\n * This is a helper function to define a field in a form context with type safety.\n */\nexport function defineField(fieldDefinition: Field) {\n\treturn fieldDefinition\n}\n\nconst { Provider, useStore } = createFastContext<FormContext>([])\n\nexport function FormContextProvider({ children }: { children?: ReactNode }) {\n\treturn <Provider>{children}</Provider>\n}\n\nexport function useFormContext() {\n\treturn useStore(store => store)\n}\n","// * Types\nimport { ReactNode, Suspense } from 'react'\n\nexport type FormStatus = 'error' | 'incomplete' | 'loading' | 'ready' | 'success' | 'readonly'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst DEFAULT_STATUS: FormStatus = 'incomplete'\n\nconst { Provider, useStore } = createFastContext<FormStatus>(DEFAULT_STATUS)\n\nexport function FormStatusProvider({\n\tchildren,\n\tinitialStatus = DEFAULT_STATUS,\n}: {\n\tchildren?: ReactNode\n\tinitialStatus?: FormStatus\n}) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<Provider initialValue={initialStatus}>{children}</Provider>\n\t\t</Suspense>\n\t)\n}\n\nexport function useFormStatus() {\n\treturn useStore(store => store)\n}\n"],"names":["useRef","createContext","_jsx","useContext","useSyncExternalStore","Provider","useStore","Suspense"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../src/hooks/create-fast-context.tsx","../src/hooks/use-form-context.tsx","../src/hooks/use-fieldset-context.tsx","../src/hooks/use-form-status.tsx"],"sourcesContent":["// * React\nimport { HTMLAttributes, useRef, createContext, useContext, useSyncExternalStore } from 'react'\n\nexport default function createFastContext<Store>(defaultInitialState: Store) {\n\tfunction useStoreData(initialState: Store = defaultInitialState): {\n\t\tget: () => Store\n\t\tset: (value: Store | ((prevState: Store) => Store)) => void\n\t\tsubscribe: (callback: () => void) => () => void\n\t} {\n\t\tconst store = useRef(initialState),\n\t\t\tget = () => store.current,\n\t\t\tsubscribers = useRef(new Set<() => void>())\n\n\t\tconst set = (value: Store | ((prevState: Store) => Store)) => {\n\t\t\tif (typeof value === 'function') {\n\t\t\t\tstore.current = (value as (prevState: Store) => Store)(store.current)\n\t\t\t} else {\n\t\t\t\tstore.current = value\n\t\t\t}\n\t\t\tsubscribers.current.forEach(callback => callback())\n\t\t}\n\n\t\tconst subscribe = (callback: () => void) => {\n\t\t\tsubscribers.current.add(callback)\n\t\t\treturn () => subscribers.current.delete(callback)\n\t\t}\n\n\t\treturn {\n\t\t\tget,\n\t\t\tset,\n\t\t\tsubscribe,\n\t\t}\n\t}\n\n\ttype UseStoreDataReturnType = ReturnType<typeof useStoreData>\n\n\tconst StoreContext = createContext<UseStoreDataReturnType | null>(null)\n\n\tfunction Provider({\n\t\tinitialValue = defaultInitialState,\n\t\t...props\n\t}: Pick<HTMLAttributes<HTMLElement>, 'children'> & { initialValue?: Store }) {\n\t\treturn <StoreContext.Provider value={useStoreData(initialValue)} {...props} />\n\t}\n\n\tfunction useStore<SelectorOutput>(\n\t\tselector: (store: Store) => SelectorOutput,\n\t\tinitialValue?: Store,\n\t): [SelectorOutput | undefined, ((value: Store | ((prevState: Store) => Store)) => void) | undefined] {\n\t\tconst store = useContext(StoreContext)\n\n\t\tif (!store) {\n\t\t\tconst localStoreValue = initialValue !== undefined ? initialValue : defaultInitialState\n\n\t\t\tconst selectedValue = selector(localStoreValue)\n\t\t\tconst noOpSet = () => console.warn('Attempting to set store value outside of Provider')\n\n\t\t\treturn [selectedValue, noOpSet]\n\t\t}\n\n\t\tconst state = useSyncExternalStore(\n\t\t\tstore.subscribe,\n\t\t\t() => selector(store.get()),\n\t\t\t() => selector(initialValue !== undefined ? initialValue : defaultInitialState),\n\t\t)\n\n\t\treturn [state, store.set]\n\t}\n\n\treturn {\n\t\tProvider,\n\t\tuseStore,\n\t}\n}\n","// * Types\nexport type FieldType = 'array' | 'email' | 'file' | 'number' | 'object' | 'string' | 'tel' | 'textarea' | 'url'\n\nexport type StringField = {\n\ttype: 'email' | 'file' | 'number' | 'string' | 'tel' | 'textarea' | 'url'\n\tvalue: string\n\trequired?: boolean\n\tinvalid?: boolean\n}\n\nexport type ObjectField = { type: 'object'; fields: Field[] }\n\nexport type ArrayField = { type: 'array'; of: ArrayObjectOrNormalField }\n\ntype ArrayObjectOrNormalField = StringField | ArrayField | ObjectField\n\nexport type Field = ArrayObjectOrNormalField & {\n\tid: string\n\tname: string\n}\n\nexport type FormContext = Field[]\n\n// * React\nimport { ReactNode, useCallback } from 'react'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\n/**\n * # Define Field\n *\n * This is a helper function to define a field in a form context with type safety.\n */\nexport function defineField(fieldDefinition: Field) {\n\treturn fieldDefinition\n}\n\nexport function isStringField(field: Field) {\n\treturn Boolean(field.type !== 'object' && field.type !== 'array')\n}\n\nconst { Provider, useStore } = createFastContext<FormContext>([])\n\nexport function FormContextProvider({ children }: { children?: ReactNode }) {\n\treturn <Provider>{children}</Provider>\n}\n\nexport function useFormContext() {\n\tconst [formContext, setFormContext] = useStore(store => store)\n\n\tconst registerField = useCallback((field: Field) => {\n\t\tsetFormContext?.(prevContext => {\n\t\t\tconst otherFields = (prevContext || []).filter(otherField => otherField.id !== field.id)\n\n\t\t\treturn [...otherFields, field]\n\t\t})\n\t}, [])\n\n\tconst removeField = useCallback((fieldID: string) => {\n\t\tsetFormContext?.(prevContext => (prevContext || []).filter(field => field.id !== fieldID))\n\t}, [])\n\n\tconst updateField = useCallback((fieldID: string, updates: Partial<Field>) => {\n\t\tsetFormContext?.(prevContext => {\n\t\t\tconst field = prevContext.find(({ id }) => id === fieldID)\n\n\t\t\tif (!field) throw new Error(`Field with id \"${fieldID}\" not found in form context.`)\n\n\t\t\tconst otherFields = prevContext.filter(({ id }) => id !== fieldID)\n\n\t\t\tconst updatedField = { ...field, ...updates } as Field\n\n\t\t\treturn [...otherFields, updatedField]\n\t\t})\n\t}, [])\n\n\treturn [formContext, { registerField, removeField, updateField }] as const\n}\n","// * Types\nimport { defineField, Field, isStringField, StringField, useFormContext } from './use-form-context'\n\nexport type FieldsetContextValue = {\n\tfieldList: Field[]\n\tdecorative: boolean\n\tid: string\n\tjoin?: string\n\tname: string\n}\n\nexport type FieldsetContext = [\n\tFieldsetContextValue | undefined,\n\t{\n\t\tregisterField: (field: Field) => void\n\t\tremoveField: (fieldID: string) => void\n\t\tupdateField: (fieldID: string, updates: Partial<Field>) => void\n\t},\n]\n\n// * React\nimport { ReactNode, useCallback, useEffect } from 'react'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst { Provider, useStore } = createFastContext<FieldsetContextValue | undefined>(undefined)\n\nexport function FieldsetContextProvider({\n\tchildren,\n\tinitialValue,\n}: {\n\tchildren?: ReactNode\n\tinitialValue?: FieldsetContextValue\n}) {\n\treturn <Provider initialValue={initialValue}>{children}</Provider>\n}\n\nexport function useFieldsetContext(): FieldsetContext {\n\tconst [fieldsetContext, setFieldsetContext] = useStore(store => store),\n\t\t[, formContextFunctions] = useFormContext()\n\n\tconst registerField = useCallback((field: Field) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\tconst existingFieldIndex = prev.fieldList.findIndex(existingField => existingField.id === field.id)\n\n\t\t\tconst newFieldList =\n\t\t\t\texistingFieldIndex >= 0\n\t\t\t\t\t? prev.fieldList.map((existingField, index) => (index === existingFieldIndex ? field : existingField))\n\t\t\t\t\t: [...prev.fieldList, field]\n\n\t\t\treturn { ...prev, fieldList: newFieldList }\n\t\t})\n\t}, [])\n\n\tconst removeField = useCallback((fieldID: string) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\treturn {\n\t\t\t\t...prev,\n\t\t\t\tfieldList: prev.fieldList.filter(field => field.id !== fieldID),\n\t\t\t}\n\t\t})\n\t}, [])\n\n\tconst updateField = useCallback((fieldID: string, updates: Partial<Field>) => {\n\t\tsetFieldsetContext?.(prev => {\n\t\t\tif (!prev) return prev\n\n\t\t\treturn {\n\t\t\t\t...prev,\n\t\t\t\tfieldList: prev.fieldList.map(field => (field.id === fieldID ? ({ ...field, ...updates } as Field) : field)),\n\t\t\t}\n\t\t})\n\t}, [])\n\n\tconst createFormContextEntry = useCallback((fieldsetEntry: FieldsetContextValue): Field => {\n\t\tif (fieldsetEntry.join) {\n\t\t\tconst joinedValue = fieldsetEntry.fieldList\n\t\t\t\t.filter(field => isStringField(field) && (field as StringField).value !== '')\n\t\t\t\t.map(field => (field as StringField).value)\n\t\t\t\t.join(fieldsetEntry.join)\n\n\t\t\treturn defineField({\n\t\t\t\ttype: 'string',\n\t\t\t\tid: fieldsetEntry.id,\n\t\t\t\tname: fieldsetEntry.name,\n\t\t\t\tvalue: joinedValue,\n\t\t\t\trequired: fieldsetEntry.fieldList.some(field => (field as StringField).required),\n\t\t\t\tinvalid: fieldsetEntry.fieldList.some(field => (field as StringField).invalid),\n\t\t\t})\n\t\t}\n\n\t\treturn defineField({\n\t\t\ttype: 'object',\n\t\t\tid: fieldsetEntry.id,\n\t\t\tname: fieldsetEntry.name,\n\t\t\tfields: fieldsetEntry.fieldList,\n\t\t})\n\t}, [])\n\n\tuseEffect(() => {\n\t\tif (!fieldsetContext || fieldsetContext.decorative) return\n\n\t\tconst formContextEntry = createFormContextEntry(fieldsetContext)\n\n\t\tformContextFunctions.registerField(formContextEntry)\n\n\t\treturn () => {\n\t\t\tformContextFunctions.removeField(fieldsetContext.id)\n\t\t}\n\t}, [fieldsetContext, formContextFunctions.registerField, formContextFunctions.removeField, createFormContextEntry])\n\n\treturn [fieldsetContext, { registerField, removeField, updateField }]\n}\n","// * Types\nimport { ReactNode, Suspense } from 'react'\n\nexport type FormStatus = 'error' | 'incomplete' | 'loading' | 'ready' | 'success' | 'readonly'\n\n// * Hooks\nimport createFastContext from './create-fast-context'\n\nconst DEFAULT_STATUS: FormStatus = 'incomplete'\n\nconst { Provider, useStore } = createFastContext<FormStatus>(DEFAULT_STATUS)\n\nexport function FormStatusProvider({\n\tchildren,\n\tinitialStatus = DEFAULT_STATUS,\n}: {\n\tchildren?: ReactNode\n\tinitialStatus?: FormStatus\n}) {\n\treturn (\n\t\t<Suspense>\n\t\t\t<Provider initialValue={initialStatus}>{children}</Provider>\n\t\t</Suspense>\n\t)\n}\n\nexport function useFormStatus() {\n\treturn useStore(store => store)\n}\n"],"names":["useRef","createContext","_jsx","useContext","useSyncExternalStore","Provider","useStore","useCallback","useEffect","Suspense"],"mappings":"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"}
|
package/dist/icons/3-people.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ThreePeople(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ThreePeople(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ThreeRectanglesDesktopFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ThreeRectanglesDesktopFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ThreeRectanglesDesktop(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ThreeRectanglesDesktop(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/airplane.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function Airplane(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function Airplane(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ArrowTriangle2CirclepathCircleFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ArrowTriangle2CirclepathCircleFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ArrowTriangle2CirclepathCircle(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ArrowTriangle2CirclepathCircle(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/bag-fill.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BagFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BagFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/banknote.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function Banknote(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function Banknote(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BellFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BellFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/bolt-car.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BoltCar(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BoltCar(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BoltFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BoltFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BoltRingClosed(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BoltRingClosed(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BoltTrianglebadgeExclamationmark(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BoltTrianglebadgeExclamationmark(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BookFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BookFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BookmarkFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BookmarkFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BriefcaseFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BriefcaseFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function BubbleLeftFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function BubbleLeftFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function Building2Fill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function Building2Fill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/calendar.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function Calendar(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function Calendar(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function CameraFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function CameraFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
package/dist/icons/car-fill.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function CarFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function CarFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function CartFill(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function CartFill(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ChartBarDocHorizontal(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ChartBarDocHorizontal(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function CheckmarkSeal(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function CheckmarkSeal(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function Checkmark(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function Checkmark(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ChevronDown(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ChevronDown(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function ChevronLeftForwardslashChevronRight(props:
|
|
1
|
+
import { ComponentPropsWithRef } from 'react';
|
|
2
|
+
export default function ChevronLeftForwardslashChevronRight(props: Omit<ComponentPropsWithRef<'svg'>, 'viewBox'>): import("react/jsx-runtime").JSX.Element;
|