@civitai/blocks-react 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.
Files changed (82) hide show
  1. package/README.md +48 -0
  2. package/dist/hooks/useAppStorage.d.ts +75 -0
  3. package/dist/hooks/useAppStorage.d.ts.map +1 -0
  4. package/dist/hooks/useAppStorage.js +73 -0
  5. package/dist/hooks/useAppStorage.js.map +1 -0
  6. package/dist/hooks/useBlockAnalytics.d.ts +9 -0
  7. package/dist/hooks/useBlockAnalytics.d.ts.map +1 -0
  8. package/dist/hooks/useBlockAnalytics.js +14 -0
  9. package/dist/hooks/useBlockAnalytics.js.map +1 -0
  10. package/dist/hooks/useBlockContext.d.ts +18 -0
  11. package/dist/hooks/useBlockContext.d.ts.map +1 -0
  12. package/dist/hooks/useBlockContext.js +39 -0
  13. package/dist/hooks/useBlockContext.js.map +1 -0
  14. package/dist/hooks/useBlockResize.d.ts +13 -0
  15. package/dist/hooks/useBlockResize.d.ts.map +1 -0
  16. package/dist/hooks/useBlockResize.js +33 -0
  17. package/dist/hooks/useBlockResize.js.map +1 -0
  18. package/dist/hooks/useBlockSettings.d.ts +7 -0
  19. package/dist/hooks/useBlockSettings.d.ts.map +1 -0
  20. package/dist/hooks/useBlockSettings.js +9 -0
  21. package/dist/hooks/useBlockSettings.js.map +1 -0
  22. package/dist/hooks/useBlockToken.d.ts +16 -0
  23. package/dist/hooks/useBlockToken.d.ts.map +1 -0
  24. package/dist/hooks/useBlockToken.js +61 -0
  25. package/dist/hooks/useBlockToken.js.map +1 -0
  26. package/dist/hooks/useBuzzPurchase.d.ts +12 -0
  27. package/dist/hooks/useBuzzPurchase.d.ts.map +1 -0
  28. package/dist/hooks/useBuzzPurchase.js +16 -0
  29. package/dist/hooks/useBuzzPurchase.js.map +1 -0
  30. package/dist/hooks/useBuzzWorkflow.d.ts +21 -0
  31. package/dist/hooks/useBuzzWorkflow.d.ts.map +1 -0
  32. package/dist/hooks/useBuzzWorkflow.js +76 -0
  33. package/dist/hooks/useBuzzWorkflow.js.map +1 -0
  34. package/dist/hooks/useCheckpointPicker.d.ts +34 -0
  35. package/dist/hooks/useCheckpointPicker.d.ts.map +1 -0
  36. package/dist/hooks/useCheckpointPicker.js +41 -0
  37. package/dist/hooks/useCheckpointPicker.js.map +1 -0
  38. package/dist/hooks/useCivitaiNavigate.d.ts +11 -0
  39. package/dist/hooks/useCivitaiNavigate.d.ts.map +1 -0
  40. package/dist/hooks/useCivitaiNavigate.js +16 -0
  41. package/dist/hooks/useCivitaiNavigate.js.map +1 -0
  42. package/dist/index.d.ts +27 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +24 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/internal/detector.d.ts +31 -0
  47. package/dist/internal/detector.d.ts.map +1 -0
  48. package/dist/internal/detector.js +67 -0
  49. package/dist/internal/detector.js.map +1 -0
  50. package/dist/internal/iframeTransport.d.ts +55 -0
  51. package/dist/internal/iframeTransport.d.ts.map +1 -0
  52. package/dist/internal/iframeTransport.js +200 -0
  53. package/dist/internal/iframeTransport.js.map +1 -0
  54. package/dist/internal/inlineTransport.d.ts +18 -0
  55. package/dist/internal/inlineTransport.d.ts.map +1 -0
  56. package/dist/internal/inlineTransport.js +36 -0
  57. package/dist/internal/inlineTransport.js.map +1 -0
  58. package/dist/internal/singleton.d.ts +18 -0
  59. package/dist/internal/singleton.d.ts.map +1 -0
  60. package/dist/internal/singleton.js +28 -0
  61. package/dist/internal/singleton.js.map +1 -0
  62. package/dist/internal/transport.d.ts +100 -0
  63. package/dist/internal/transport.d.ts.map +1 -0
  64. package/dist/internal/transport.js +67 -0
  65. package/dist/internal/transport.js.map +1 -0
  66. package/dist/internal/validate.d.ts +56 -0
  67. package/dist/internal/validate.d.ts.map +1 -0
  68. package/dist/internal/validate.js +202 -0
  69. package/dist/internal/validate.js.map +1 -0
  70. package/dist/testing.d.ts +14 -0
  71. package/dist/testing.d.ts.map +1 -0
  72. package/dist/testing.js +16 -0
  73. package/dist/testing.js.map +1 -0
  74. package/dist/ui/SettingsForm.d.ts +79 -0
  75. package/dist/ui/SettingsForm.d.ts.map +1 -0
  76. package/dist/ui/SettingsForm.js +199 -0
  77. package/dist/ui/SettingsForm.js.map +1 -0
  78. package/dist/ui/index.d.ts +11 -0
  79. package/dist/ui/index.d.ts.map +1 -0
  80. package/dist/ui/index.js +10 -0
  81. package/dist/ui/index.js.map +1 -0
  82. package/package.json +69 -0
@@ -0,0 +1,199 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useState } from 'react';
3
+ /**
4
+ * Thrown by `onSubmit` callers to surface per-field server errors back to
5
+ * the form. The form renders the message under the named field.
6
+ */
7
+ export class SettingsFormError extends Error {
8
+ fieldErrors;
9
+ name = 'SettingsFormError';
10
+ constructor(fieldErrors) {
11
+ super('Settings validation failed');
12
+ this.fieldErrors = fieldErrors;
13
+ }
14
+ }
15
+ /**
16
+ * Test if a field should render for the current scope + declared-scopes
17
+ * combination. Exposed for callers that want to count visible fields
18
+ * before rendering (e.g. "no settings to configure" empty state).
19
+ */
20
+ export function isFieldVisible(field, forScope, declaredScopes) {
21
+ if (field.scope !== forScope)
22
+ return false;
23
+ if (field.requires_scope && !declaredScopes.includes(field.requires_scope))
24
+ return false;
25
+ return true;
26
+ }
27
+ export function SettingsForm(props) {
28
+ const visibleFields = useMemo(() => Object.entries(props.manifestSettings).filter(([, def]) => isFieldVisible(def, props.forScope, props.declaredScopes)), [props.manifestSettings, props.forScope, props.declaredScopes]);
29
+ const [values, setValues] = useState(() => {
30
+ const seed = {};
31
+ for (const [key, def] of visibleFields) {
32
+ if (Object.prototype.hasOwnProperty.call(props.initialValues, key)) {
33
+ seed[key] = props.initialValues[key];
34
+ }
35
+ else if (def.default !== undefined) {
36
+ seed[key] = def.default;
37
+ }
38
+ else {
39
+ seed[key] = null;
40
+ }
41
+ }
42
+ return seed;
43
+ });
44
+ const [errors, setErrors] = useState({});
45
+ const [submitting, setSubmitting] = useState(false);
46
+ const [submitError, setSubmitError] = useState(null);
47
+ const setFieldValue = useCallback((key, value) => {
48
+ setValues((prev) => ({ ...prev, [key]: value }));
49
+ setErrors((prev) => {
50
+ if (!prev[key])
51
+ return prev;
52
+ const { [key]: _drop, ...rest } = prev;
53
+ return rest;
54
+ });
55
+ }, []);
56
+ const handleSubmit = useCallback(async (e) => {
57
+ e?.preventDefault();
58
+ // Client-side range guard so users get immediate feedback. Server
59
+ // is still authoritative — same checks fire there.
60
+ const clientErrors = {};
61
+ for (const [key, def] of visibleFields) {
62
+ const err = clientValidateField(key, def, values[key]);
63
+ if (err)
64
+ clientErrors[key] = err;
65
+ }
66
+ if (Object.keys(clientErrors).length > 0) {
67
+ setErrors(clientErrors);
68
+ return;
69
+ }
70
+ setSubmitting(true);
71
+ setSubmitError(null);
72
+ try {
73
+ await props.onSubmit(values);
74
+ setErrors({});
75
+ }
76
+ catch (err) {
77
+ if (err instanceof SettingsFormError) {
78
+ setErrors(err.fieldErrors);
79
+ }
80
+ else if (err instanceof Error) {
81
+ setSubmitError(err.message);
82
+ }
83
+ else {
84
+ setSubmitError('Failed to save settings');
85
+ }
86
+ }
87
+ finally {
88
+ setSubmitting(false);
89
+ }
90
+ }, [props, values, visibleFields]);
91
+ if (visibleFields.length === 0) {
92
+ return (_jsx("div", { className: props.className, "data-civitai-settings-form": "empty", children: _jsx("p", { children: "No settings to configure." }) }));
93
+ }
94
+ return (_jsxs("form", { className: props.className, "data-civitai-settings-form": props.forScope, onSubmit: handleSubmit, children: [visibleFields.map(([key, def]) => (_jsx(FieldRow, { fieldKey: key, def: def, value: values[key], error: errors[key], disabled: submitting, resourcePicker: props.resourcePicker, onChange: (v) => setFieldValue(key, v) }, key))), submitError ? (_jsx("div", { "data-civitai-settings-form-error": true, role: "alert", children: submitError })) : null, _jsx("button", { type: "submit", disabled: submitting, "data-civitai-settings-form-submit": true,
95
+ // Don't rely on the implicit form submit event — happy-dom (and
96
+ // some browsers in older modes) won't dispatch it for a synthetic
97
+ // click. Calling `handleSubmit` directly mirrors the production
98
+ // path: e.preventDefault() inside handleSubmit is a no-op when
99
+ // `e` is undefined.
100
+ onClick: (e) => {
101
+ e.preventDefault();
102
+ void handleSubmit();
103
+ }, children: submitting ? 'Saving…' : props.submitLabel ?? 'Save' })] }));
104
+ }
105
+ function FieldRow(props) {
106
+ const { fieldKey, def, value, error, disabled, onChange, resourcePicker } = props;
107
+ return (_jsxs("div", { "data-civitai-settings-field": fieldKey, children: [_jsxs("label", { htmlFor: `setting-${fieldKey}`, children: [_jsx("span", { "data-label": true, children: def.label }), _jsx("span", { "data-description": true, children: def.description })] }), _jsx(FieldInput, { fieldKey: fieldKey, def: def, value: value, disabled: disabled, resourcePicker: resourcePicker, onChange: onChange }), error ? (_jsx("div", { "data-civitai-settings-field-error": true, role: "alert", children: error })) : null] }));
108
+ }
109
+ function FieldInput(props) {
110
+ const { fieldKey, def, value, disabled, onChange, resourcePicker } = props;
111
+ const id = `setting-${fieldKey}`;
112
+ if (def.type === 'number') {
113
+ return renderNumberField(id, def, value, disabled, onChange, resourcePicker, fieldKey);
114
+ }
115
+ if (def.type === 'string') {
116
+ return renderStringField(id, def, value, disabled, onChange);
117
+ }
118
+ return renderBooleanField(id, def, value, disabled, onChange);
119
+ }
120
+ function renderNumberField(id, def, value, disabled, onChange, resourcePicker, fieldKey) {
121
+ const widget = def.widget ?? 'number';
122
+ if (widget === 'resource_picker') {
123
+ return (_jsx("button", { id: id, type: "button", disabled: disabled, "data-civitai-settings-input": "resource_picker", onClick: async () => {
124
+ if (!resourcePicker)
125
+ return;
126
+ const next = await resourcePicker({
127
+ fieldKey,
128
+ widgetOptions: def.widget_options ?? {},
129
+ currentValue: typeof value === 'number' ? value : null,
130
+ });
131
+ onChange(next);
132
+ }, children: typeof value === 'number' ? `Selected: #${value}` : 'Choose…' }));
133
+ }
134
+ if (widget === 'slider') {
135
+ return (_jsx("input", { id: id, type: "range", "data-civitai-settings-input": "slider", disabled: disabled, min: def.min, max: def.max, step: def.step ?? 1, value: typeof value === 'number' ? value : def.default ?? def.min ?? 0, onChange: (e) => onChange(Number(e.target.value)) }));
136
+ }
137
+ return (_jsx("input", { id: id, type: "number", "data-civitai-settings-input": "number", disabled: disabled, min: def.min, max: def.max, step: def.step, value: typeof value === 'number' ? value : '', onChange: (e) => {
138
+ const raw = e.target.value;
139
+ if (raw === '') {
140
+ onChange(null);
141
+ return;
142
+ }
143
+ const parsed = Number(raw);
144
+ onChange(Number.isFinite(parsed) ? parsed : raw);
145
+ } }));
146
+ }
147
+ function renderStringField(id, def, value, disabled, onChange) {
148
+ const widget = def.widget ?? 'text';
149
+ if (widget === 'select') {
150
+ return (_jsx("select", { id: id, "data-civitai-settings-input": "select", disabled: disabled, value: typeof value === 'string' ? value : def.default ?? '', onChange: (e) => onChange(e.target.value), children: (def.enum ?? []).map((option) => (_jsx("option", { value: option, children: option }, option))) }));
151
+ }
152
+ if (widget === 'textarea') {
153
+ return (_jsx("textarea", { id: id, "data-civitai-settings-input": "textarea", disabled: disabled, maxLength: def.max_length, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value) }));
154
+ }
155
+ return (_jsx("input", { id: id, type: "text", "data-civitai-settings-input": "text", disabled: disabled, maxLength: def.max_length, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value) }));
156
+ }
157
+ function renderBooleanField(id, _def, value, disabled, onChange) {
158
+ return (_jsx("input", { id: id, type: "checkbox", role: "switch", "data-civitai-settings-input": "toggle", disabled: disabled, checked: value === true, onChange: (e) => onChange(e.target.checked) }));
159
+ }
160
+ function clientValidateField(_key, def, raw) {
161
+ // null is a valid "cleared" state for any nullable field (e.g. resource
162
+ // picker that hasn't been set). Treat as "no value to range-check."
163
+ if (raw === null || raw === undefined)
164
+ return null;
165
+ if (def.type === 'number') {
166
+ if (typeof raw !== 'number' || !Number.isFinite(raw)) {
167
+ return `${def.label} must be a number`;
168
+ }
169
+ if (def.min !== undefined && raw < def.min)
170
+ return `${def.label} must be >= ${def.min}`;
171
+ if (def.max !== undefined && raw > def.max)
172
+ return `${def.label} must be <= ${def.max}`;
173
+ return null;
174
+ }
175
+ if (def.type === 'string') {
176
+ if (typeof raw !== 'string')
177
+ return `${def.label} must be a string`;
178
+ if (def.max_length !== undefined && raw.length > def.max_length) {
179
+ return `${def.label} exceeds max length ${def.max_length}`;
180
+ }
181
+ if (def.pattern) {
182
+ try {
183
+ if (!new RegExp(def.pattern).test(raw))
184
+ return `${def.label} format invalid`;
185
+ }
186
+ catch {
187
+ /* server reports malformed pattern */
188
+ }
189
+ }
190
+ if (def.enum && !def.enum.includes(raw))
191
+ return `${def.label} not in allowed values`;
192
+ return null;
193
+ }
194
+ // boolean
195
+ if (typeof raw !== 'boolean')
196
+ return `${def.label} must be a boolean`;
197
+ return null;
198
+ }
199
+ //# sourceMappingURL=SettingsForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsForm.js","sourceRoot":"","sources":["../../src/ui/SettingsForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `@civitai/blocks-react/ui` — opinionated UI components for App Block authoring.
3
+ *
4
+ * v0 scope: just the generic, manifest-driven `SettingsForm`. The W6
5
+ * component pack (Button, Input, Card, Modal, …) will land here too as
6
+ * separate exports; importing from `/ui` (not the root) keeps the
7
+ * transport-only consumer's bundle lean.
8
+ */
9
+ export { SettingsForm, SettingsFormError, isFieldVisible } from './SettingsForm.js';
10
+ export type { SettingsFormProps } from './SettingsForm.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `@civitai/blocks-react/ui` — opinionated UI components for App Block authoring.
3
+ *
4
+ * v0 scope: just the generic, manifest-driven `SettingsForm`. The W6
5
+ * component pack (Button, Input, Card, Modal, …) will land here too as
6
+ * separate exports; importing from `/ui` (not the root) keeps the
7
+ * transport-only consumer's bundle lean.
8
+ */
9
+ export { SettingsForm, SettingsFormError, isFieldVisible } from './SettingsForm.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@civitai/blocks-react",
3
+ "version": "0.4.0",
4
+ "description": "React hooks and iframe transport for Civitai App Blocks. Pairs with @civitai/app-sdk/blocks.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./ui": {
15
+ "types": "./dist/ui/index.d.ts",
16
+ "import": "./dist/ui/index.js"
17
+ },
18
+ "./testing": {
19
+ "types": "./dist/testing.d.ts",
20
+ "import": "./dist/testing.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest"
32
+ },
33
+ "engines": {
34
+ "node": ">=20"
35
+ },
36
+ "peerDependencies": {
37
+ "@civitai/app-sdk": "workspace:^",
38
+ "react": "^18.0.0 || ^19.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@civitai/app-sdk": "workspace:*",
42
+ "@testing-library/react": "^16.0.0",
43
+ "@types/node": "^25.9.1",
44
+ "@types/react": "^19.2.15",
45
+ "happy-dom": "^15.0.0",
46
+ "react": "^19.0.0",
47
+ "react-dom": "^19.0.0",
48
+ "typescript": "^5.9.2",
49
+ "vitest": "^4.0.18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "keywords": [
55
+ "civitai",
56
+ "blocks",
57
+ "react",
58
+ "iframe",
59
+ "postmessage",
60
+ "embed"
61
+ ],
62
+ "homepage": "https://github.com/civitai/civitai-app-starters/tree/main/packages/civitai-blocks-react#readme",
63
+ "bugs": "https://github.com/civitai/civitai-app-starters/issues",
64
+ "repository": {
65
+ "type": "git",
66
+ "url": "git+https://github.com/civitai/civitai-app-starters.git",
67
+ "directory": "packages/civitai-blocks-react"
68
+ }
69
+ }