@civitai/blocks-react 0.71.0 → 0.72.2
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/README.md +308 -15
- package/dist/hooks/useAppStorage.js +2 -0
- package/dist/hooks/useAppWorkflows.js +2 -0
- package/dist/hooks/useBatchEstimate.d.ts +4 -0
- package/dist/hooks/useBatchEstimate.js +6 -0
- package/dist/hooks/useBlockAnalytics.js +2 -0
- package/dist/hooks/useBlockBreakpoint.js +2 -0
- package/dist/hooks/useBlockContext.js +2 -0
- package/dist/hooks/useBlockResize.js +2 -0
- package/dist/hooks/useBlockSettings.js +2 -0
- package/dist/hooks/useBlockTheme.js +2 -0
- package/dist/hooks/useBlockToken.js +2 -0
- package/dist/hooks/useBuzzAccounts.js +2 -0
- package/dist/hooks/useBuzzBalance.js +2 -0
- package/dist/hooks/useBuzzPurchase.js +2 -0
- package/dist/hooks/useBuzzTransactions.js +2 -0
- package/dist/hooks/useBuzzWorkflow.d.ts +35 -3
- package/dist/hooks/useBuzzWorkflow.js +32 -3
- package/dist/hooks/useCheckpointPicker.d.ts +2 -0
- package/dist/hooks/useCheckpointPicker.js +4 -0
- package/dist/hooks/useCivitaiNavigate.js +2 -0
- package/dist/hooks/useCivitaiRoute.js +2 -0
- package/dist/hooks/useCollectionFollow.js +2 -0
- package/dist/hooks/useConsentUnavailable.js +2 -0
- package/dist/hooks/useCreatePostFromApp.js +2 -0
- package/dist/hooks/useDailyCompensation.js +2 -0
- package/dist/hooks/useDirectLoad.js +2 -0
- package/dist/hooks/useDomainMaturity.js +2 -0
- package/dist/hooks/useEntitlements.js +2 -0
- package/dist/hooks/useGatedImages.js +2 -0
- package/dist/hooks/useGenerationResources.js +2 -0
- package/dist/hooks/useGoodPurchase.js +2 -0
- package/dist/hooks/useHostOrigin.js +2 -0
- package/dist/hooks/useImageUpload.js +2 -0
- package/dist/hooks/useNestedDocument.js +2 -0
- package/dist/hooks/usePrepareTrainingDataset.js +2 -0
- package/dist/hooks/usePublishGenerationOutputs.js +2 -0
- package/dist/hooks/useRequestConsent.js +2 -0
- package/dist/hooks/useRequestSignIn.js +2 -0
- package/dist/hooks/useResourcePicker.js +2 -0
- package/dist/hooks/useRunConfirmedStep.d.ts +209 -0
- package/dist/hooks/useRunConfirmedStep.js +289 -0
- package/dist/hooks/useRunTraining.js +2 -0
- package/dist/hooks/useSaveImage.js +2 -0
- package/dist/hooks/useSharedStorage.js +2 -0
- package/dist/hooks/useTip.js +2 -0
- package/dist/hooks/useTipAllowance.js +2 -0
- package/dist/hooks/useTransportConnection.d.ts +43 -0
- package/dist/hooks/useTransportConnection.js +59 -0
- package/dist/hooks/useUploadImageBytes.js +2 -0
- package/dist/hooks/useViewer.js +2 -0
- package/dist/hooks/useWildcardPack.js +2 -0
- package/dist/hooks/useWorkflowBatch.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/internal/hostSurface.d.ts +37 -0
- package/dist/internal/hostSurface.js +38 -0
- package/dist/internal/liveHost.d.ts +15 -6
- package/dist/internal/liveHost.js +151 -69
- package/dist/internal/mockHost.d.ts +123 -10
- package/dist/internal/mockHost.js +377 -14
- package/dist/internal/mockWorkflowGraph.d.ts +23 -10
- package/dist/internal/mockWorkflowGraph.js +34 -11
- package/dist/testing.d.ts +1 -1
- package/dist/transport/iframeTransport.js +13 -0
- package/dist/transport/requestTimeouts.js +6 -0
- package/dist/transport/singleton.d.ts +6 -0
- package/dist/transport/singleton.js +20 -0
- package/dist/transport/validate.d.ts +13 -0
- package/dist/transport/validate.js +76 -0
- package/package.json +4 -4
|
@@ -289,29 +289,52 @@ function checkStepInput(stepType, input, depth, sources, state) {
|
|
|
289
289
|
state.loopVars.add(forClause.as);
|
|
290
290
|
return checkStepInput(template.$type, template.input, depth + 2, new Set([...sources, forClause.as]), state);
|
|
291
291
|
}
|
|
292
|
-
/** The host's refusal text for an unquoted training step (`UNQUOTED_TRAINING_ERROR`). */
|
|
293
|
-
export const MOCK_UNQUOTED_TRAINING_ERROR = 'Training needs a price quote and none could be obtained; try again.';
|
|
294
292
|
/**
|
|
295
|
-
* The
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
* the code for "no usable answer"), then a `repeat` anywhere
|
|
300
|
-
* (`workflow_repeat_unbounded`, naming the first such step).
|
|
293
|
+
* The host's `quoteFailureCause`: why there is no quote, as the clause that
|
|
294
|
+
* completes "…needs a price quote and ". Only `'unavailable'` says "try again".
|
|
295
|
+
* The mock has no orchestrator message to pass on, so `'rejected'` is the host's
|
|
296
|
+
* wording for a rejection with no reason safe to show.
|
|
301
297
|
*/
|
|
302
|
-
|
|
298
|
+
const MOCK_QUOTE_FAILURE_CAUSE = {
|
|
299
|
+
rejected: 'the orchestrator rejected the request; check the step inputs and references ' +
|
|
300
|
+
'(retrying the same body will not help)',
|
|
301
|
+
unavailable: 'none could be obtained; try again',
|
|
302
|
+
unpriced: 'the orchestrator answered without one',
|
|
303
|
+
};
|
|
304
|
+
/** The host's refusal text for an unquoted training step (`unquotedTrainingRefusal`). */
|
|
305
|
+
export const mockUnquotedTrainingError = (failure) => `Training needs a price quote and ${MOCK_QUOTE_FAILURE_CAUSE[failure]}.`;
|
|
306
|
+
/**
|
|
307
|
+
* The refusal, on BOTH the estimate and the submit, for a body
|
|
308
|
+
* {@link mockWorkflowBodyRefusal} ACCEPTED when the host has no price quote for
|
|
309
|
+
* it, or `null` when the submit would proceed (reserved at the ceiling). In the
|
|
310
|
+
* host's order: a training step anywhere (`training-quote-<failure>`), then a
|
|
311
|
+
* `repeat` anywhere (`workflow_repeat_unbounded`, naming the first such step).
|
|
312
|
+
* The message states the cause.
|
|
313
|
+
*/
|
|
314
|
+
export function mockUnpricedWorkflowRefusal(body, failure) {
|
|
303
315
|
const types = body.steps.map((step) => collectStepTypes(step.$type, step.input) ?? [step.$type]);
|
|
304
316
|
if (types.some((ts) => ts.some((t) => t === 'training' || t === 'imageResourceTraining'))) {
|
|
305
|
-
return { error:
|
|
317
|
+
return { error: mockUnquotedTrainingError(failure), errorCode: `training-quote-${failure}` };
|
|
306
318
|
}
|
|
307
319
|
const index = types.findIndex((ts) => ts.some(isRepeat));
|
|
308
320
|
if (index === -1)
|
|
309
321
|
return null;
|
|
310
322
|
return {
|
|
311
|
-
error: `workflow step ${index}: a workflow with a repeat needs a price quote and
|
|
323
|
+
error: `workflow step ${index}: a workflow with a repeat needs a price quote and ${MOCK_QUOTE_FAILURE_CAUSE[failure]}`,
|
|
312
324
|
errorCode: 'workflow_repeat_unbounded',
|
|
313
325
|
};
|
|
314
326
|
}
|
|
327
|
+
/**
|
|
328
|
+
* The host's `unquotedWorkflowEstimateRefusal`: what an ESTIMATE of a workflow
|
|
329
|
+
* with no price quote fails with when {@link mockUnpricedWorkflowRefusal} did
|
|
330
|
+
* not already refuse it. Estimate only — the submit of the same body proceeds.
|
|
331
|
+
*/
|
|
332
|
+
export function mockUnquotedWorkflowEstimateRefusal(failure) {
|
|
333
|
+
return {
|
|
334
|
+
error: `No price quote for this workflow: ${MOCK_QUOTE_FAILURE_CAUSE[failure]}`,
|
|
335
|
+
errorCode: `workflow_quote_${failure}`,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
315
338
|
/** The host's wire schema, mirrored: exact keys, types and sizes. No `errorCode`. */
|
|
316
339
|
function isWellFormedBody(body) {
|
|
317
340
|
if (!isPlainObject(body) || !Object.keys(body).every((key) => BODY_KEYS.has(key)))
|
package/dist/testing.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ import { __resetTransport } from './transport/singleton.js';
|
|
|
21
21
|
import { type MockHostOptions } from './internal/mockHost.js';
|
|
22
22
|
export { __resetTransport as resetTransport };
|
|
23
23
|
export { installPopoverShim, type PopoverShimHandle, type PopoverShimOptions, } from './internal/popoverShim.js';
|
|
24
|
-
export { createMockHost, readMockHostUrlOptions, type MockHost, type MockHostOptions, type MockHostFailMode, type MockHostScenarioPatch, type MockGenerationScenario, type MockBuzzScenario, type MockBuzzBalance, type MockBuzzHandle, type MockStorageScenario, type MockSharedScenario, type MockSharedSeed, type MockCannedImageScan, type MockWorkflowStepInfo, type CostSpec, type ImageSpec, type CannedPick, } from './internal/mockHost.js';
|
|
24
|
+
export { createMockHost, readMockHostUrlOptions, type MockHost, type MockHostOptions, type MockHostFailMode, type MockHostScenarioPatch, type MockGenerationScenario, type MockBuzzScenario, type MockBuzzBalance, type MockBuzzHandle, type MockStorageScenario, type MockSharedScenario, type MockSharedSeed, type MockCannedImageScan, type MockWorkflowStepInfo, type MockWorkflowQuoteFailure, type CostSpec, type ImageSpec, type CannedPick, } from './internal/mockHost.js';
|
|
25
25
|
/**
|
|
26
26
|
* Props for the dev {@link Harness}.
|
|
27
27
|
*/
|
|
@@ -130,6 +130,19 @@ export class IframeTransport {
|
|
|
130
130
|
this.resolveInit = resolve;
|
|
131
131
|
this.rejectInit = reject;
|
|
132
132
|
});
|
|
133
|
+
// 🔴 THE TRANSPORT HANDLES ITS OWN INIT TIMEOUT. Every hook connects the
|
|
134
|
+
// transport at mount, and most blocks never call `waitForInit()`, so without
|
|
135
|
+
// a handler here the 10s timeout is an UNHANDLED rejection. That fails the
|
|
136
|
+
// Vitest run of any block app whose tests mount a hook with no host. This
|
|
137
|
+
// handler makes the rejection handled and keeps the diagnostic (it names the
|
|
138
|
+
// configured and observed origins) on the console as a warning. It is a
|
|
139
|
+
// separate branch of the promise: `waitForInit()` still returns
|
|
140
|
+
// `initPromise` itself, so its callers still receive the rejection.
|
|
141
|
+
// Pinned by `test/initTimeoutUnhandled.test.tsx`.
|
|
142
|
+
this.initPromise.catch((err) => {
|
|
143
|
+
// eslint-disable-next-line no-console -- developer-facing diagnostic; the host shows its own fallback
|
|
144
|
+
console.warn(err instanceof Error ? err.message : err);
|
|
145
|
+
});
|
|
133
146
|
this.initTimeoutId = setTimeout(() => {
|
|
134
147
|
if (!this.initResolved) {
|
|
135
148
|
this.initResolved = true;
|
|
@@ -94,6 +94,12 @@ const REQUEST_TIMEOUT_CLASS = {
|
|
|
94
94
|
// viewer who then clicked Train would start a CHARGED run the block had
|
|
95
95
|
// already reported as failed.
|
|
96
96
|
RUN_TRAINING: 'human',
|
|
97
|
+
// 🔴 `'human'`, same reason as RUN_TRAINING directly above: the host shows the
|
|
98
|
+
// viewer the job's price in its own confirm and replies only on their click or
|
|
99
|
+
// dismiss. At the 30s default the request would reject with the dialog still
|
|
100
|
+
// open, and a viewer who then confirmed would start a CHARGED job the block
|
|
101
|
+
// had already reported as failed.
|
|
102
|
+
RUN_CONFIRMED_STEP: 'human',
|
|
97
103
|
// ── Fire-and-forget: no requestId, so no pending promise to time out ────
|
|
98
104
|
BLOCK_ERROR: 'no-reply',
|
|
99
105
|
BLOCK_HELLO: 'no-reply',
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { type DetectOptions } from './detector.js';
|
|
2
2
|
import type { BlockTransport } from './transport.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns true the FIRST time it is called in this transport lifecycle, false
|
|
5
|
+
* after. Internal — used by `useTransportConnection` to log a failed connect
|
|
6
|
+
* once instead of once per hook instance.
|
|
7
|
+
*/
|
|
8
|
+
export declare function claimConnectFailureReport(): boolean;
|
|
3
9
|
/**
|
|
4
10
|
* Returns the process-wide transport, instantiating it on first call.
|
|
5
11
|
*
|
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import { BlockTransportDetector } from './detector.js';
|
|
2
2
|
let cached = null;
|
|
3
|
+
/**
|
|
4
|
+
* Whether a failed MOUNT-TIME connect (`useTransportConnection`) has already been
|
|
5
|
+
* logged. Lives here, not in the hook, so `__resetTransport()` clears it with the
|
|
6
|
+
* transport it describes: one log per transport lifecycle — once per page in
|
|
7
|
+
* production, once per reset in tests. A latch that outlived the reset would
|
|
8
|
+
* silence every misconfigured case in a test worker after the first.
|
|
9
|
+
*/
|
|
10
|
+
let connectFailureReported = false;
|
|
11
|
+
/**
|
|
12
|
+
* Returns true the FIRST time it is called in this transport lifecycle, false
|
|
13
|
+
* after. Internal — used by `useTransportConnection` to log a failed connect
|
|
14
|
+
* once instead of once per hook instance.
|
|
15
|
+
*/
|
|
16
|
+
export function claimConnectFailureReport() {
|
|
17
|
+
if (connectFailureReported)
|
|
18
|
+
return false;
|
|
19
|
+
connectFailureReported = true;
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
3
22
|
/**
|
|
4
23
|
* Returns the process-wide transport, instantiating it on first call.
|
|
5
24
|
*
|
|
@@ -24,5 +43,6 @@ export function __resetTransport() {
|
|
|
24
43
|
const disposable = cached;
|
|
25
44
|
disposable?.dispose?.();
|
|
26
45
|
cached = null;
|
|
46
|
+
connectFailureReported = false;
|
|
27
47
|
}
|
|
28
48
|
//# sourceMappingURL=singleton.js.map
|
|
@@ -445,6 +445,19 @@ export declare function isValidTrainingDatasetResult(p: unknown): boolean;
|
|
|
445
445
|
* field. A dropped refusal would leave a Train button spinning for ten minutes.
|
|
446
446
|
*/
|
|
447
447
|
export declare function isValidTrainingResult(p: unknown): boolean;
|
|
448
|
+
/**
|
|
449
|
+
* Reply to `RUN_CONFIRMED_STEP`. A well-formed reply carries EITHER a `snapshot`
|
|
450
|
+
* (a valid {@link isValidWorkflowSnapshot} — the block polls its `workflowId`)
|
|
451
|
+
* OR an `error`; one with neither is malformed and dropped.
|
|
452
|
+
*
|
|
453
|
+
* 🔴 `error` IS SHAPE-CHECKED ONLY, for the reason given on
|
|
454
|
+
* {@link isValidTrainingResult}: this request carries the same TEN-MINUTE
|
|
455
|
+
* consent bound, and the host forwards server refusals (an expired or used
|
|
456
|
+
* quote, a changed body or price, the feature flag) in the same field as its own
|
|
457
|
+
* codes. A membership check would drop those and leave a Run button spinning for
|
|
458
|
+
* ten minutes.
|
|
459
|
+
*/
|
|
460
|
+
export declare function isValidConfirmedStepResult(p: unknown): boolean;
|
|
448
461
|
/**
|
|
449
462
|
* Reply to `APP_STORAGE_GET`. `value` is arbitrary JSON (incl. `null` for an
|
|
450
463
|
* unset key / anon viewer), so there is nothing to type-check on it — the guard
|
|
@@ -334,10 +334,56 @@ export function isValidWorkflowSnapshot(s) {
|
|
|
334
334
|
return false;
|
|
335
335
|
if (s.trainingQuote !== undefined && !isValidTrainingQuote(s.trainingQuote))
|
|
336
336
|
return false;
|
|
337
|
+
if (s.stepQuote !== undefined && !isValidStepQuote(s.stepQuote))
|
|
338
|
+
return false;
|
|
339
|
+
if (s.model3dOutputs !== undefined && !isValidModel3dOutputs(s.model3dOutputs))
|
|
340
|
+
return false;
|
|
337
341
|
if (s.steps !== undefined && !isValidWorkflowSteps(s.steps))
|
|
338
342
|
return false;
|
|
339
343
|
return true;
|
|
340
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Shape check for `stepQuote` — the viewer-confirmable quote a pass-through
|
|
347
|
+
* `step` estimate returns when its fixed price is above the per-call budget. The
|
|
348
|
+
* block passes `quoteId` back verbatim, renders `total` on its confirm button
|
|
349
|
+
* and may show `stepType`, so all three are pinned to their types.
|
|
350
|
+
*
|
|
351
|
+
* `quoteId`'s `sq_…` FORMAT is deliberately not pinned HERE, for the reason
|
|
352
|
+
* given on {@link isValidTrainingQuote}: a host changing the handle's format
|
|
353
|
+
* must not turn every such estimate reply into a dropped one. The format is
|
|
354
|
+
* checked where it is an instruction rather than an observation — on the way
|
|
355
|
+
* OUT, in `useRunConfirmedStep()`.
|
|
356
|
+
*/
|
|
357
|
+
function isValidStepQuote(q) {
|
|
358
|
+
if (!isObject(q))
|
|
359
|
+
return false;
|
|
360
|
+
if (!isNonEmptyString(q.quoteId))
|
|
361
|
+
return false;
|
|
362
|
+
if (!isFiniteNumber(q.total))
|
|
363
|
+
return false;
|
|
364
|
+
if (typeof q.stepType !== 'string')
|
|
365
|
+
return false;
|
|
366
|
+
return typeof q.expiresAt === 'string';
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Shape check for `model3dOutputs` — shared by {@link isValidWorkflowSnapshot}
|
|
370
|
+
* and the `AppWorkflow` row guard, which carry the same field. A block matches
|
|
371
|
+
* an entry's `url` against its image list and loads it, and branches on
|
|
372
|
+
* `format` / `variant`, so each is pinned to a string. `format` and `variant`
|
|
373
|
+
* are OPEN sets (the orchestrator's own format names and output field paths)
|
|
374
|
+
* and are never checked against a list; `variant` may be the empty string.
|
|
375
|
+
*/
|
|
376
|
+
function isValidModel3dOutputs(outputs) {
|
|
377
|
+
if (!Array.isArray(outputs))
|
|
378
|
+
return false;
|
|
379
|
+
for (const o of outputs) {
|
|
380
|
+
if (!isObject(o) || !isNonEmptyString(o.url))
|
|
381
|
+
return false;
|
|
382
|
+
if (typeof o.format !== 'string' || typeof o.variant !== 'string')
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
341
387
|
/**
|
|
342
388
|
* Shape check for `steps` — the per-step view of a `kind: 'workflow'` run.
|
|
343
389
|
* OPTIONAL like its neighbours, and a PRESENT but malformed value rejects the
|
|
@@ -1033,6 +1079,8 @@ function isValidAppWorkflow(w) {
|
|
|
1033
1079
|
return false;
|
|
1034
1080
|
if (w.trainedEpochs !== undefined && !isValidTrainedEpochs(w.trainedEpochs))
|
|
1035
1081
|
return false;
|
|
1082
|
+
if (w.model3dOutputs !== undefined && !isValidModel3dOutputs(w.model3dOutputs))
|
|
1083
|
+
return false;
|
|
1036
1084
|
return true;
|
|
1037
1085
|
}
|
|
1038
1086
|
/**
|
|
@@ -1435,6 +1483,31 @@ export function isValidTrainingResult(p) {
|
|
|
1435
1483
|
return false;
|
|
1436
1484
|
return true;
|
|
1437
1485
|
}
|
|
1486
|
+
/**
|
|
1487
|
+
* Reply to `RUN_CONFIRMED_STEP`. A well-formed reply carries EITHER a `snapshot`
|
|
1488
|
+
* (a valid {@link isValidWorkflowSnapshot} — the block polls its `workflowId`)
|
|
1489
|
+
* OR an `error`; one with neither is malformed and dropped.
|
|
1490
|
+
*
|
|
1491
|
+
* 🔴 `error` IS SHAPE-CHECKED ONLY, for the reason given on
|
|
1492
|
+
* {@link isValidTrainingResult}: this request carries the same TEN-MINUTE
|
|
1493
|
+
* consent bound, and the host forwards server refusals (an expired or used
|
|
1494
|
+
* quote, a changed body or price, the feature flag) in the same field as its own
|
|
1495
|
+
* codes. A membership check would drop those and leave a Run button spinning for
|
|
1496
|
+
* ten minutes.
|
|
1497
|
+
*/
|
|
1498
|
+
export function isValidConfirmedStepResult(p) {
|
|
1499
|
+
if (!isObject(p))
|
|
1500
|
+
return false;
|
|
1501
|
+
if (!isWireRequestIdShape(p.requestId))
|
|
1502
|
+
return false;
|
|
1503
|
+
if (p.error !== undefined && typeof p.error !== 'string')
|
|
1504
|
+
return false;
|
|
1505
|
+
if (p.snapshot !== undefined && !isValidWorkflowSnapshot(p.snapshot))
|
|
1506
|
+
return false;
|
|
1507
|
+
if (p.snapshot === undefined && p.error === undefined)
|
|
1508
|
+
return false;
|
|
1509
|
+
return true;
|
|
1510
|
+
}
|
|
1438
1511
|
// ============================================================
|
|
1439
1512
|
// App-storage (per-viewer KV) reply validators
|
|
1440
1513
|
// ============================================================
|
|
@@ -2044,6 +2117,9 @@ export function payloadValidatorFor(type) {
|
|
|
2044
2117
|
return isValidTrainingDatasetResult;
|
|
2045
2118
|
case 'TRAINING_RESULT':
|
|
2046
2119
|
return isValidTrainingResult;
|
|
2120
|
+
// Settles a charged job, like TRAINING_RESULT directly above.
|
|
2121
|
+
case 'CONFIRMED_STEP_RESULT':
|
|
2122
|
+
return isValidConfirmedStepResult;
|
|
2047
2123
|
case 'IMAGE_UPLOAD_RESULT':
|
|
2048
2124
|
return isValidImageUploadResult;
|
|
2049
2125
|
case 'IMAGE_SCAN_RESOLVED':
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@civitai/blocks-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.72.2",
|
|
4
4
|
"description": "React hooks and iframe transport for Civitai Apps. Pairs with @civitai/app-sdk/blocks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"node": ">=20"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@civitai/
|
|
41
|
-
"@civitai/
|
|
40
|
+
"@civitai/components": "^0.9.3",
|
|
41
|
+
"@civitai/theme": "^0.5.2"
|
|
42
42
|
},
|
|
43
43
|
"comment-peerDependencies": "This floor is DERIVED, not chosen — the lowest published app-sdk that exports every symbol this package imports. Do not edit it without reading ./PEER_FLOOR.md (in-repo, unpublished) and tests/guards/blocks-react-peer-floor.test.mjs.",
|
|
44
44
|
"peerDependencies": {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"typescript": "^5.9.2",
|
|
59
59
|
"vite": "^8.0.14",
|
|
60
60
|
"vitest": "^4.1.11",
|
|
61
|
-
"@civitai/app-sdk": "^0.
|
|
61
|
+
"@civitai/app-sdk": "^0.68.0"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
64
64
|
"access": "public"
|