@xemahq/ui-kernel 0.6.1 → 0.7.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 (71) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/ui/capture/document-preview.d.ts +12 -0
  6. package/dist/ui/capture/document-preview.d.ts.map +1 -0
  7. package/dist/ui/capture/document-preview.js +31 -0
  8. package/dist/ui/capture/document-preview.js.map +1 -0
  9. package/dist/ui/capture/field-spec-to-zod.d.ts +5 -0
  10. package/dist/ui/capture/field-spec-to-zod.d.ts.map +1 -0
  11. package/dist/ui/capture/field-spec-to-zod.js +71 -0
  12. package/dist/ui/capture/field-spec-to-zod.js.map +1 -0
  13. package/dist/ui/capture/field-spec.d.ts +49 -0
  14. package/dist/ui/capture/field-spec.d.ts.map +1 -0
  15. package/dist/ui/capture/field-spec.js +59 -0
  16. package/dist/ui/capture/field-spec.js.map +1 -0
  17. package/dist/ui/capture/index.d.ts +11 -0
  18. package/dist/ui/capture/index.d.ts.map +1 -0
  19. package/dist/ui/capture/index.js +31 -0
  20. package/dist/ui/capture/index.js.map +1 -0
  21. package/dist/ui/capture/schema-field-input.d.ts +20 -0
  22. package/dist/ui/capture/schema-field-input.d.ts.map +1 -0
  23. package/dist/ui/capture/schema-field-input.js +64 -0
  24. package/dist/ui/capture/schema-field-input.js.map +1 -0
  25. package/dist/ui/capture/schema-form.d.ts +18 -0
  26. package/dist/ui/capture/schema-form.d.ts.map +1 -0
  27. package/dist/ui/capture/schema-form.js +26 -0
  28. package/dist/ui/capture/schema-form.js.map +1 -0
  29. package/dist/ui/capture/use-prefill.d.ts +18 -0
  30. package/dist/ui/capture/use-prefill.d.ts.map +1 -0
  31. package/dist/ui/capture/use-prefill.js +94 -0
  32. package/dist/ui/capture/use-prefill.js.map +1 -0
  33. package/dist/ui/capture/use-schema-validation.d.ts +11 -0
  34. package/dist/ui/capture/use-schema-validation.d.ts.map +1 -0
  35. package/dist/ui/capture/use-schema-validation.js +69 -0
  36. package/dist/ui/capture/use-schema-validation.js.map +1 -0
  37. package/dist/ui/capture/use-wizard.d.ts +28 -0
  38. package/dist/ui/capture/use-wizard.d.ts.map +1 -0
  39. package/dist/ui/capture/use-wizard.js +63 -0
  40. package/dist/ui/capture/use-wizard.js.map +1 -0
  41. package/dist/ui/capture/value-format.d.ts +4 -0
  42. package/dist/ui/capture/value-format.d.ts.map +1 -0
  43. package/dist/ui/capture/value-format.js +23 -0
  44. package/dist/ui/capture/value-format.js.map +1 -0
  45. package/dist/ui/capture/wizard.d.ts +19 -0
  46. package/dist/ui/capture/wizard.d.ts.map +1 -0
  47. package/dist/ui/capture/wizard.js +34 -0
  48. package/dist/ui/capture/wizard.js.map +1 -0
  49. package/dist/ui/index.d.ts +1 -0
  50. package/dist/ui/index.d.ts.map +1 -1
  51. package/dist/ui/index.js +1 -0
  52. package/dist/ui/index.js.map +1 -1
  53. package/dist/ui/primitives/badge.d.ts +1 -1
  54. package/dist/ui/primitives/button.d.ts +1 -1
  55. package/dist/ui/primitives/sheet.d.ts +1 -1
  56. package/package.json +4 -3
  57. package/src/index.ts +5 -0
  58. package/src/ui/capture/document-preview.tsx +101 -0
  59. package/src/ui/capture/field-spec-to-zod.test.ts +59 -0
  60. package/src/ui/capture/field-spec-to-zod.ts +93 -0
  61. package/src/ui/capture/field-spec.test.ts +49 -0
  62. package/src/ui/capture/field-spec.ts +160 -0
  63. package/src/ui/capture/index.ts +43 -0
  64. package/src/ui/capture/schema-field-input.tsx +186 -0
  65. package/src/ui/capture/schema-form.tsx +108 -0
  66. package/src/ui/capture/use-prefill.ts +150 -0
  67. package/src/ui/capture/use-schema-validation.ts +113 -0
  68. package/src/ui/capture/use-wizard.ts +134 -0
  69. package/src/ui/capture/value-format.ts +22 -0
  70. package/src/ui/capture/wizard.tsx +100 -0
  71. package/src/ui/index.ts +3 -0
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usePrefill = usePrefill;
4
+ const react_1 = require("react");
5
+ function usePrefill(options) {
6
+ const { fetchDefaults, initialValues, enabled = true } = options;
7
+ const [values, setValuesState] = (0, react_1.useState)(() => ({ ...(initialValues ?? {}) }));
8
+ const [suggested, setSuggested] = (0, react_1.useState)(() => new Set());
9
+ const [loading, setLoading] = (0, react_1.useState)(false);
10
+ const [error, setError] = (0, react_1.useState)(null);
11
+ const touched = (0, react_1.useRef)(new Set());
12
+ const requestId = (0, react_1.useRef)(0);
13
+ const setValue = (0, react_1.useCallback)((key, value) => {
14
+ touched.current.add(key);
15
+ setValuesState((prev) => ({ ...prev, [key]: value }));
16
+ setSuggested((prev) => {
17
+ if (!prev.has(key))
18
+ return prev;
19
+ const next = new Set(prev);
20
+ next.delete(key);
21
+ return next;
22
+ });
23
+ }, []);
24
+ const setValues = (0, react_1.useCallback)((updater) => {
25
+ setValuesState((prev) => {
26
+ const next = typeof updater === 'function' ? updater(prev) : { ...prev, ...updater };
27
+ const changed = new Set();
28
+ for (const k of Object.keys(next)) {
29
+ if (next[k] !== prev[k]) {
30
+ touched.current.add(k);
31
+ changed.add(k);
32
+ }
33
+ }
34
+ if (changed.size > 0) {
35
+ setSuggested((prevSug) => {
36
+ if (![...changed].some((k) => prevSug.has(k)))
37
+ return prevSug;
38
+ const n = new Set(prevSug);
39
+ for (const k of changed)
40
+ n.delete(k);
41
+ return n;
42
+ });
43
+ }
44
+ return next;
45
+ });
46
+ }, []);
47
+ const run = (0, react_1.useCallback)(() => {
48
+ const id = ++requestId.current;
49
+ setLoading(true);
50
+ setError(null);
51
+ void fetchDefaults()
52
+ .then((defaults) => {
53
+ if (id !== requestId.current)
54
+ return;
55
+ const applied = [];
56
+ setValuesState((prev) => {
57
+ const next = { ...prev };
58
+ for (const [key, value] of Object.entries(defaults)) {
59
+ const current = prev[key];
60
+ const isEmpty = current === undefined || current === null || current === '';
61
+ if (!touched.current.has(key) && isEmpty && value !== undefined) {
62
+ next[key] = value;
63
+ applied.push(key);
64
+ }
65
+ }
66
+ return next;
67
+ });
68
+ setSuggested((prev) => {
69
+ if (applied.length === 0)
70
+ return prev;
71
+ const n = new Set(prev);
72
+ for (const k of applied)
73
+ n.add(k);
74
+ return n;
75
+ });
76
+ })
77
+ .catch((e) => {
78
+ if (id !== requestId.current)
79
+ return;
80
+ setError(e);
81
+ })
82
+ .finally(() => {
83
+ if (id === requestId.current)
84
+ setLoading(false);
85
+ });
86
+ }, [fetchDefaults]);
87
+ (0, react_1.useEffect)(() => {
88
+ if (enabled)
89
+ run();
90
+ }, [enabled]);
91
+ const isSuggested = (0, react_1.useCallback)((key) => suggested.has(key), [suggested]);
92
+ return { values, setValue, setValues, suggestedKeys: suggested, isSuggested, loading, error, reload: run };
93
+ }
94
+ //# sourceMappingURL=use-prefill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prefill.js","sourceRoot":"","sources":["../../../src/ui/capture/use-prefill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import { type CaptureFieldSpec, type CaptureSchema, type CaptureSection, type CaptureValues } from './field-spec';
3
+ export interface SchemaValidationResult {
4
+ readonly errors: Readonly<Record<string, string>>;
5
+ readonly missingRequired: readonly string[];
6
+ readonly isValid: boolean;
7
+ }
8
+ type ValidationInput = z.ZodType | CaptureSchema | readonly CaptureFieldSpec[] | readonly CaptureSection[];
9
+ export declare function useSchemaValidation(input: ValidationInput, values: CaptureValues): SchemaValidationResult;
10
+ export {};
11
+ //# sourceMappingURL=use-schema-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-schema-validation.d.ts","sourceRoot":"","sources":["../../../src/ui/capture/use-schema-validation.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAe,MAAM,cAAc,CAAC;AAGjJ,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAElD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAE5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,KAAK,eAAe,GAChB,CAAC,CAAC,OAAO,GACT,aAAa,GACb,SAAS,gBAAgB,EAAE,GAC3B,SAAS,cAAc,EAAE,CAAC;AA4C9B,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,GAAG,sBAAsB,CAwCzG"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSchemaValidation = useSchemaValidation;
4
+ const react_1 = require("react");
5
+ const field_spec_1 = require("./field-spec");
6
+ const field_spec_to_zod_1 = require("./field-spec-to-zod");
7
+ function isZodSchema(input) {
8
+ return typeof input?.safeParse === 'function';
9
+ }
10
+ function sweepMissing(fields, values, prefix = '') {
11
+ const missing = [];
12
+ for (const field of fields) {
13
+ const path = prefix ? `${prefix}.${field.key}` : field.key;
14
+ const value = values?.[field.key];
15
+ if (field.type === field_spec_1.CaptureFieldType.Object) {
16
+ if (field.required && (0, field_spec_to_zod_1.isEmptyValue)(value))
17
+ missing.push(path);
18
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
19
+ missing.push(...sweepMissing(field.fields ?? [], value, path));
20
+ }
21
+ continue;
22
+ }
23
+ if (field.type === field_spec_1.CaptureFieldType.List) {
24
+ if (field.required && (0, field_spec_to_zod_1.isEmptyValue)(value))
25
+ missing.push(path);
26
+ if (Array.isArray(value)) {
27
+ value.forEach((item, i) => {
28
+ if (item && typeof item === 'object') {
29
+ missing.push(...sweepMissing(field.fields ?? [], item, `${path}.${i}`));
30
+ }
31
+ });
32
+ }
33
+ continue;
34
+ }
35
+ if (field.required && (0, field_spec_to_zod_1.isEmptyValue)(value))
36
+ missing.push(path);
37
+ }
38
+ return missing;
39
+ }
40
+ function useSchemaValidation(input, values) {
41
+ const fields = (0, react_1.useMemo)(() => (isZodSchema(input) ? null : (0, field_spec_1.toFieldList)(input)), [input]);
42
+ const schema = (0, react_1.useMemo)(() => (isZodSchema(input) ? input : (0, field_spec_to_zod_1.fieldSpecToZod)(input)), [input]);
43
+ return (0, react_1.useMemo)(() => {
44
+ const errors = {};
45
+ const result = schema.safeParse(values);
46
+ if (!result.success) {
47
+ for (const issue of result.error.issues) {
48
+ const path = issue.path.map(String).join('.');
49
+ if (!(path in errors))
50
+ errors[path] = issue.message;
51
+ }
52
+ }
53
+ const missingRequired = fields
54
+ ? sweepMissing(fields, values)
55
+ : Object.keys(errors).filter((path) => {
56
+ const segments = path.split('.');
57
+ let cur = values;
58
+ for (const seg of segments)
59
+ cur = cur?.[seg];
60
+ return (0, field_spec_to_zod_1.isEmptyValue)(cur);
61
+ });
62
+ return {
63
+ errors,
64
+ missingRequired,
65
+ isValid: Object.keys(errors).length === 0 && missingRequired.length === 0,
66
+ };
67
+ }, [schema, fields, values]);
68
+ }
69
+ //# sourceMappingURL=use-schema-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-schema-validation.js","sourceRoot":"","sources":["../../../src/ui/capture/use-schema-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { FormStepStatus } from '../primitives/form-stepper';
2
+ export interface WizardStepDef {
3
+ readonly key: string;
4
+ readonly label: string;
5
+ readonly hint?: string;
6
+ }
7
+ export interface UseWizardOptions {
8
+ readonly steps: readonly WizardStepDef[];
9
+ readonly canAdvance?: (index: number) => boolean;
10
+ readonly initialStep?: number;
11
+ readonly step?: number;
12
+ readonly onStepChange?: (index: number) => void;
13
+ }
14
+ export interface WizardApi {
15
+ readonly steps: readonly WizardStepDef[];
16
+ readonly activeIndex: number;
17
+ readonly activeStep: WizardStepDef;
18
+ readonly isFirst: boolean;
19
+ readonly isLast: boolean;
20
+ readonly canAdvance: boolean;
21
+ readonly progress: number;
22
+ readonly next: () => void;
23
+ readonly prev: () => void;
24
+ readonly goTo: (index: number) => void;
25
+ readonly status: (index: number) => FormStepStatus;
26
+ }
27
+ export declare function useWizard(options: UseWizardOptions): WizardApi;
28
+ //# sourceMappingURL=use-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-wizard.d.ts","sourceRoot":"","sources":["../../../src/ui/capture/use-wizard.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IAMzC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAEjD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAE1B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,cAAc,CAAC;CACpD;AAaD,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAsE9D"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useWizard = useWizard;
4
+ const react_1 = require("react");
5
+ const form_stepper_1 = require("../primitives/form-stepper");
6
+ function useWizard(options) {
7
+ const { steps, canAdvance, initialStep = 0, step, onStepChange } = options;
8
+ const count = steps.length;
9
+ const clamp = (0, react_1.useCallback)((i) => Math.max(0, Math.min(count - 1, i)), [count]);
10
+ const isControlled = step !== undefined;
11
+ const [internal, setInternal] = (0, react_1.useState)(() => clamp(initialStep));
12
+ const activeIndex = clamp(isControlled ? step : internal);
13
+ const gate = (0, react_1.useCallback)((i) => (canAdvance ? canAdvance(i) : true), [canAdvance]);
14
+ const request = (0, react_1.useCallback)((target) => {
15
+ const next = clamp(target);
16
+ if (next === activeIndex)
17
+ return;
18
+ onStepChange?.(next);
19
+ if (!isControlled)
20
+ setInternal(next);
21
+ }, [activeIndex, clamp, isControlled, onStepChange]);
22
+ const goTo = (0, react_1.useCallback)((index) => {
23
+ const target = clamp(index);
24
+ if (target <= activeIndex) {
25
+ request(target);
26
+ return;
27
+ }
28
+ for (let i = activeIndex; i < target; i += 1) {
29
+ if (!gate(i))
30
+ return;
31
+ }
32
+ request(target);
33
+ }, [activeIndex, clamp, gate, request]);
34
+ const next = (0, react_1.useCallback)(() => {
35
+ if (activeIndex >= count - 1)
36
+ return;
37
+ if (!gate(activeIndex))
38
+ return;
39
+ request(activeIndex + 1);
40
+ }, [activeIndex, count, gate, request]);
41
+ const prev = (0, react_1.useCallback)(() => request(activeIndex - 1), [activeIndex, request]);
42
+ const status = (0, react_1.useCallback)((index) => {
43
+ if (index < activeIndex)
44
+ return form_stepper_1.FormStepStatus.DONE;
45
+ if (index === activeIndex)
46
+ return form_stepper_1.FormStepStatus.ACTIVE;
47
+ return form_stepper_1.FormStepStatus.PENDING;
48
+ }, [activeIndex]);
49
+ return (0, react_1.useMemo)(() => ({
50
+ steps,
51
+ activeIndex,
52
+ activeStep: steps[activeIndex],
53
+ isFirst: activeIndex === 0,
54
+ isLast: activeIndex === count - 1,
55
+ canAdvance: gate(activeIndex),
56
+ progress: count <= 1 ? 1 : activeIndex / (count - 1),
57
+ next,
58
+ prev,
59
+ goTo,
60
+ status,
61
+ }), [steps, activeIndex, count, gate, next, prev, goTo, status]);
62
+ }
63
+ //# sourceMappingURL=use-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-wizard.js","sourceRoot":"","sources":["../../../src/ui/capture/use-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type CaptureFieldSpec } from './field-spec';
2
+ export declare function asString(value: unknown): string;
3
+ export declare function formatScalar(field: CaptureFieldSpec, value: unknown, emptyText: string): string;
4
+ //# sourceMappingURL=value-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-format.d.ts","sourceRoot":"","sources":["../../../src/ui/capture/value-format.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGvE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI/C;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ/F"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.asString = asString;
4
+ exports.formatScalar = formatScalar;
5
+ const field_spec_1 = require("./field-spec");
6
+ function asString(value) {
7
+ if (typeof value === 'string')
8
+ return value;
9
+ if (value === undefined || value === null)
10
+ return '';
11
+ return String(value);
12
+ }
13
+ function formatScalar(field, value, emptyText) {
14
+ if (value === undefined || value === null || value === '')
15
+ return emptyText;
16
+ switch (field.type) {
17
+ case field_spec_1.CaptureFieldType.Boolean:
18
+ return value === true ? 'Yes' : 'No';
19
+ default:
20
+ return asString(value);
21
+ }
22
+ }
23
+ //# sourceMappingURL=value-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-format.js","sourceRoot":"","sources":["../../../src/ui/capture/value-format.ts"],"names":[],"mappings":";;AAMA,4BAIC;AAGD,oCAQC;AAlBD,6CAAuE;AAGvE,SAAgB,QAAQ,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAGD,SAAgB,YAAY,CAAC,KAAuB,EAAE,KAAc,EAAE,SAAiB;IACrF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,6BAAgB,CAAC,OAAO;YAC3B,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC;YACE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { WizardApi } from './use-wizard';
3
+ export interface WizardStepProps {
4
+ readonly stepKey: string;
5
+ readonly children: ReactNode;
6
+ }
7
+ export declare function WizardStep(_props: WizardStepProps): null;
8
+ export interface WizardProps {
9
+ readonly api: WizardApi;
10
+ readonly children: ReactNode;
11
+ readonly onFinish?: () => void;
12
+ readonly nextLabel?: string;
13
+ readonly backLabel?: string;
14
+ readonly finishLabel?: string;
15
+ readonly hideNav?: boolean;
16
+ readonly className?: string;
17
+ }
18
+ export declare function Wizard({ api, children, onFinish, nextLabel, backLabel, finishLabel, hideNav, className, }: WizardProps): import("react").JSX.Element;
19
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/ui/capture/wizard.tsx"],"names":[],"mappings":"AAQA,OAAO,EAA+C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAMD,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAGxD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAE7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAaD,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,SAAsB,EACtB,SAAkB,EAClB,WAAsB,EACtB,OAAe,EACf,SAAS,GACV,EAAE,WAAW,+BAmCb"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WizardStep = WizardStep;
4
+ exports.Wizard = Wizard;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const cn_1 = require("../cn");
8
+ const button_1 = require("../primitives/button");
9
+ const form_stepper_1 = require("../primitives/form-stepper");
10
+ function WizardStep(_props) {
11
+ return null;
12
+ }
13
+ function stepBodies(children) {
14
+ const map = new Map();
15
+ react_1.Children.forEach(children, (child) => {
16
+ if ((0, react_1.isValidElement)(child) && child.props?.stepKey) {
17
+ const p = child.props;
18
+ map.set(p.stepKey, p.children);
19
+ }
20
+ });
21
+ return map;
22
+ }
23
+ function Wizard({ api, children, onFinish, nextLabel = 'Continue', backLabel = 'Back', finishLabel = 'Finish', hideNav = false, className, }) {
24
+ const bodies = stepBodies(children);
25
+ const formSteps = api.steps.map((step, index) => ({
26
+ key: step.key,
27
+ label: step.label,
28
+ hint: step.hint,
29
+ status: api.status(index),
30
+ children: index === api.activeIndex ? bodies.get(step.key) ?? null : null,
31
+ }));
32
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)('space-y-5', className), children: [(0, jsx_runtime_1.jsx)(form_stepper_1.FormStepper, { steps: formSteps }), !hideNav && ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between gap-2 border-t border-rule pt-4", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { variant: "ghost", onClick: api.prev, disabled: api.isFirst, children: backLabel }), api.isLast ? ((0, jsx_runtime_1.jsx)(button_1.Button, { onClick: onFinish, disabled: !api.canAdvance, children: finishLabel })) : ((0, jsx_runtime_1.jsx)(button_1.Button, { onClick: api.next, disabled: !api.canAdvance, children: nextLabel }))] }))] }));
33
+ }
34
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/ui/capture/wizard.tsx"],"names":[],"mappings":";;AA0BA,gCAGC;AA0BD,wBA4CC;;AA3FD,iCAAoF;AAEpF,8BAA2B;AAC3B,iDAA8C;AAC9C,6DAAwE;AAcxE,SAAgB,UAAU,CAAC,MAAuB;IAEhD,OAAO,IAAI,CAAC;AACd,CAAC;AAeD,SAAS,UAAU,CAAC,QAAmB;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,gBAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAK,KAAuC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACrF,MAAM,CAAC,GAAI,KAAuC,CAAC,KAAK,CAAC;YACzD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,MAAM,CAAC,EACrB,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,SAAS,GAAG,UAAU,EACtB,SAAS,GAAG,MAAM,EAClB,WAAW,GAAG,QAAQ,EACtB,OAAO,GAAG,KAAK,EACf,SAAS,GACG;IACZ,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAe,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5D,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAGzB,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;KAC1E,CAAC,CAAC,CAAC;IAEJ,OAAO,CACL,iCAAK,SAAS,EAAE,IAAA,OAAE,EAAC,WAAW,EAAE,SAAS,CAAC,aACxC,uBAAC,0BAAW,IAAC,KAAK,EAAE,SAAS,GAAI,EAEhC,CAAC,OAAO,IAAI,CACX,iCAAK,SAAS,EAAC,mEAAmE,aAChF,uBAAC,eAAM,IAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,YAC7D,SAAS,GACH,EACR,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CACZ,uBAAC,eAAM,IAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,UAAU,YACjD,WAAW,GACL,CACV,CAAC,CAAC,CAAC,CACF,uBAAC,eAAM,IAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,UAAU,YACjD,SAAS,GACH,CACV,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -44,4 +44,5 @@ export { default as PageHeader, PageToolbar } from './chrome/PageHeader';
44
44
  export { default as LoadingState, type LoadingStateVariant } from './chrome/LoadingState';
45
45
  export { default as AsyncBoundary } from './chrome/AsyncBoundary';
46
46
  export { PdfPreview, type PdfPreviewProps } from './pdf/pdf-preview';
47
+ export * from './capture';
47
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,cAAc,iBAAiB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,mCAAmC,CAAC;AAG3C,cAAc,UAAU,CAAC;AAGzB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EACL,OAAO,IAAI,mBAAmB,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,cAAc,iBAAiB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,mCAAmC,CAAC;AAG3C,cAAc,UAAU,CAAC;AAGzB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EACL,OAAO,IAAI,mBAAmB,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGrE,cAAc,WAAW,CAAC"}
package/dist/ui/index.js CHANGED
@@ -84,4 +84,5 @@ var AsyncBoundary_1 = require("./chrome/AsyncBoundary");
84
84
  Object.defineProperty(exports, "AsyncBoundary", { enumerable: true, get: function () { return __importDefault(AsyncBoundary_1).default; } });
85
85
  var pdf_preview_1 = require("./pdf/pdf-preview");
86
86
  Object.defineProperty(exports, "PdfPreview", { enumerable: true, get: function () { return pdf_preview_1.PdfPreview; } });
87
+ __exportStar(require("./capture"), exports);
87
88
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,2BAA0B;AAAjB,wFAAA,EAAE,OAAA;AAGX,kDAAgC;AAGhC,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA;AAG1B,mEAAgE;AAAvD,wHAAA,iBAAiB,OAAA;AAC1B,uDAAoD;AAA3C,4GAAA,WAAW,OAAA;AAGpB,sDAAoC;AACpC,qDAAmC;AACnC,qDAAmC;AACnC,qDAAmC;AACnC,sDAAoC;AACpC,sDAAoC;AACpC,oDAAkC;AAClC,wDAAsC;AACtC,oDAAkC;AAClC,6DAA2C;AAC3C,wDAAsC;AACtC,wDAAsC;AACtC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,yDAAuC;AACvC,2DAAyC;AACzC,4DAA0C;AAC1C,uDAAqC;AACrC,2DAAyC;AACzC,yDAAuC;AACvC,2DAAyC;AACzC,6DAA2C;AAC3C,gEAA8C;AAC9C,qDAAmC;AACnC,4DAA0C;AAC1C,8DAA4C;AAC5C,0EAG2C;AAFzC,0HAAA,kBAAkB,OAAA;AAKpB,2CAAyB;AAGzB,0EAM0C;AALxC,4HAAA,mBAAmB,OAAA;AACnB,uHAAA,cAAc,OAAA;AACd,8HAAA,qBAAqB,OAAA;AAMvB,gDAAsF;AAA7E,uHAAA,OAAO,OAAa;AAC7B,sDAA4G;AAAnG,4HAAA,OAAO,OAAe;AAC/B,oDAAmF;AAA1E,0HAAA,OAAO,OAAc;AAC9B,wEAGwC;AAFtC,6IAAA,OAAO,OAAuB;AAGhC,kDAA2D;AAAlD,wHAAA,OAAO,OAAa;AAC7B,kDAK6B;AAJ3B,yHAAA,OAAO,OAAc;AAKvB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,kDAAyE;AAAhE,yHAAA,OAAO,OAAc;AAAE,yGAAA,WAAW,OAAA;AAC3C,sDAA0F;AAAjF,6HAAA,OAAO,OAAgB;AAChC,wDAAkE;AAAzD,+HAAA,OAAO,OAAiB;AAEjC,iDAAqE;AAA5D,yGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,2BAA0B;AAAjB,wFAAA,EAAE,OAAA;AAGX,kDAAgC;AAGhC,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA;AAG1B,mEAAgE;AAAvD,wHAAA,iBAAiB,OAAA;AAC1B,uDAAoD;AAA3C,4GAAA,WAAW,OAAA;AAGpB,sDAAoC;AACpC,qDAAmC;AACnC,qDAAmC;AACnC,qDAAmC;AACnC,sDAAoC;AACpC,sDAAoC;AACpC,oDAAkC;AAClC,wDAAsC;AACtC,oDAAkC;AAClC,6DAA2C;AAC3C,wDAAsC;AACtC,wDAAsC;AACtC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,yDAAuC;AACvC,2DAAyC;AACzC,4DAA0C;AAC1C,uDAAqC;AACrC,2DAAyC;AACzC,yDAAuC;AACvC,2DAAyC;AACzC,6DAA2C;AAC3C,gEAA8C;AAC9C,qDAAmC;AACnC,4DAA0C;AAC1C,8DAA4C;AAC5C,0EAG2C;AAFzC,0HAAA,kBAAkB,OAAA;AAKpB,2CAAyB;AAGzB,0EAM0C;AALxC,4HAAA,mBAAmB,OAAA;AACnB,uHAAA,cAAc,OAAA;AACd,8HAAA,qBAAqB,OAAA;AAMvB,gDAAsF;AAA7E,uHAAA,OAAO,OAAa;AAC7B,sDAA4G;AAAnG,4HAAA,OAAO,OAAe;AAC/B,oDAAmF;AAA1E,0HAAA,OAAO,OAAc;AAC9B,wEAGwC;AAFtC,6IAAA,OAAO,OAAuB;AAGhC,kDAA2D;AAAlD,wHAAA,OAAO,OAAa;AAC7B,kDAK6B;AAJ3B,yHAAA,OAAO,OAAc;AAKvB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,kDAAyE;AAAhE,yHAAA,OAAO,OAAc;AAAE,yGAAA,WAAW,OAAA;AAC3C,sDAA0F;AAAjF,6HAAA,OAAO,OAAgB;AAChC,wDAAkE;AAAzD,+HAAA,OAAO,OAAiB;AAEjC,iDAAqE;AAA5D,yGAAA,UAAU,OAAA;AAGnB,4CAA0B"}
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
2
  import * as React from "react";
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "default" | "outline" | "destructive" | "secondary" | null | undefined;
4
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
2
  import * as React from "react";
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "outline" | "destructive" | "ghost" | "secondary" | null | undefined;
4
+ variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  size?: "icon" | "default" | "sm" | "lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
@@ -7,7 +7,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
7
7
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
8
8
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
9
  declare const sheetVariants: (props?: ({
10
- side?: "left" | "right" | "bottom" | "top" | null | undefined;
10
+ side?: "bottom" | "left" | "right" | "top" | null | undefined;
11
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
12
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/ui-kernel",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Host-framework-agnostic UI kernel for the Xema OS. Defines the SystemBus orchestration contract (capability.invoke, cross-biome intents, command palette, xema:// deeplinks, window manager) AND the biome-host contract surface (FrontendBiome/FrontendBiomeFactory, HostBridge, the singleton biomeRegistry, session contributions) that every frontend biome composes against. No Vite, Next.js, or React-Router — React itself IS allowed as the shared component model (the contracts traffic in ReactNode/ComponentType and a React context). Concrete host adapters (router/auth/toast wiring) live in separate packages that consume this kernel. The SystemBus is pure orchestration: it never authorizes, the backend capability-router enforces all policy.",
5
5
  "keywords": [
6
6
  "xema",
@@ -55,7 +55,8 @@
55
55
  "lucide-react": "^0.462.0",
56
56
  "react-pdf": "^9.1.1",
57
57
  "react-resizable-panels": "^4.9.0",
58
- "tailwind-merge": "^2.5.4"
58
+ "tailwind-merge": "^2.5.4",
59
+ "zod": "^4.4.3"
59
60
  },
60
61
  "peerDependencies": {
61
62
  "@tanstack/react-query": "^5.0.0",
@@ -74,7 +75,7 @@
74
75
  "prettier": "3.6.2",
75
76
  "react": "^18.3.1",
76
77
  "typescript": "5.9.3",
77
- "@xemahq/kernel-contracts": "^0.36.0"
78
+ "@xemahq/kernel-contracts": "^0.39.0"
78
79
  },
79
80
  "exports": {
80
81
  ".": {
package/src/index.ts CHANGED
@@ -1,3 +1,8 @@
1
1
  export * from './lib/system-bus';
2
2
  export * from './lib/biome-host';
3
3
  export * from './lib/capabilities';
4
+
5
+ // Guided-capture UX kit (B5). Also available at the `@xemahq/ui-kernel/ui`
6
+ // subpath alongside the rest of the shared UI surface; re-exported here so the
7
+ // capture primitives are reachable from the package root too.
8
+ export * from './ui/capture';
@@ -0,0 +1,101 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════
2
+ // <DocumentPreview> — read-only "final document" view for the review step
3
+ //
4
+ // Renders a structured record as the document it will become — grouped by
5
+ // section, one labelled row per field, nested objects/lists expanded inline.
6
+ // Presentational + theme-aware (semantic tokens, light/dark) + responsive.
7
+ // Feed it the SAME schema you gave `<SchemaForm>` so the review mirrors input.
8
+ // ═══════════════════════════════════════════════════════════════════════════
9
+ import { type ReactNode } from 'react';
10
+
11
+ import { cn } from '../cn';
12
+
13
+ import { CaptureFieldType, type CaptureFieldSpec, type CaptureSchema, type CaptureSection, type CaptureValues, toSections } from './field-spec';
14
+ import { formatScalar } from './value-format';
15
+
16
+ export interface DocumentPreviewProps {
17
+ readonly fields?: readonly CaptureFieldSpec[];
18
+ readonly sections?: readonly CaptureSection[];
19
+ readonly schema?: CaptureSchema;
20
+ readonly values: CaptureValues;
21
+ readonly title?: string;
22
+ /** Text shown for an unset field (default "—"). */
23
+ readonly emptyText?: string;
24
+ readonly className?: string;
25
+ }
26
+
27
+ /**
28
+ * @example
29
+ * <DocumentPreview title="Review" sections={sections} values={values} />
30
+ */
31
+ export function DocumentPreview({ fields, sections, schema, values, title, emptyText = '—', className }: DocumentPreviewProps) {
32
+ const resolved = toSections(sections ?? (fields ? fields : schema) ?? []);
33
+ return (
34
+ <article className={cn('rounded-xl border border-border bg-card p-5 text-card-foreground shadow-sm sm:p-6', className)}>
35
+ {title ? <h2 className="mb-4 text-title font-semibold tracking-tight text-ink">{title}</h2> : null}
36
+ <div className="space-y-6">
37
+ {resolved.map((section) => (
38
+ <section key={section.key}>
39
+ {section.title ? <h3 className="mb-2 border-b border-rule pb-1 text-caption font-semibold uppercase tracking-wider text-ink-3">{section.title}</h3> : null}
40
+ <dl className="grid grid-cols-1 gap-x-6 gap-y-3 sm:grid-cols-[minmax(8rem,12rem)_1fr]">
41
+ {section.fields.map((field) => (
42
+ <FieldRow key={field.key} field={field} value={values[field.key]} emptyText={emptyText} />
43
+ ))}
44
+ </dl>
45
+ </section>
46
+ ))}
47
+ </div>
48
+ </article>
49
+ );
50
+ }
51
+
52
+ function FieldRow({ field, value, emptyText }: { field: CaptureFieldSpec; value: unknown; emptyText: string }) {
53
+ return (
54
+ <>
55
+ <dt className="text-body-1 font-medium text-ink-3 sm:text-right">{field.label}</dt>
56
+ <dd className="min-w-0 text-body-1 text-ink">{renderValue(field, value, emptyText)}</dd>
57
+ </>
58
+ );
59
+ }
60
+
61
+ function renderValue(field: CaptureFieldSpec, value: unknown, emptyText: string): ReactNode {
62
+ if (field.type === CaptureFieldType.Object) {
63
+ const record = (value && typeof value === 'object' && !Array.isArray(value) ? value : null) as CaptureValues | null;
64
+ if (!record) return <span className="text-ink-3">{emptyText}</span>;
65
+ return (
66
+ <dl className="space-y-1 rounded-md border border-rule bg-paper-elev/40 p-2">
67
+ {(field.fields ?? []).map((child) => (
68
+ <div key={child.key} className="flex flex-wrap gap-2">
69
+ <dt className="text-caption font-medium text-ink-3">{child.label}:</dt>
70
+ <dd className="text-caption text-ink">{renderValue(child, record[child.key], emptyText)}</dd>
71
+ </div>
72
+ ))}
73
+ </dl>
74
+ );
75
+ }
76
+ if (field.type === CaptureFieldType.List) {
77
+ const items = (Array.isArray(value) ? value : []) as CaptureValues[];
78
+ if (items.length === 0) return <span className="text-ink-3">{emptyText}</span>;
79
+ return (
80
+ <ol className="space-y-2">
81
+ {items.map((item, index) => (
82
+ <li key={index} className="rounded-md border border-rule bg-paper-elev/40 p-2">
83
+ <p className="mb-1 text-caption font-medium text-ink-3">
84
+ {field.label} #{index + 1}
85
+ </p>
86
+ <dl className="space-y-1">
87
+ {(field.fields ?? []).map((child) => (
88
+ <div key={child.key} className="flex flex-wrap gap-2">
89
+ <dt className="text-caption font-medium text-ink-3">{child.label}:</dt>
90
+ <dd className="text-caption text-ink">{renderValue(child, item[child.key], emptyText)}</dd>
91
+ </div>
92
+ ))}
93
+ </dl>
94
+ </li>
95
+ ))}
96
+ </ol>
97
+ );
98
+ }
99
+ const text = formatScalar(field, value, emptyText);
100
+ return <span className={cn(text === emptyText && 'text-ink-3')}>{text}</span>;
101
+ }