@pilotiq/pilotiq 0.3.0 → 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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +6 -0
- package/CLAUDE.md +1 -1
- package/dist/pageData.d.ts +11 -0
- package/dist/pageData.d.ts.map +1 -1
- package/dist/pageData.js +31 -0
- package/dist/pageData.js.map +1 -1
- package/dist/react/FieldLabelSlotRegistry.d.ts +26 -0
- package/dist/react/FieldLabelSlotRegistry.d.ts.map +1 -0
- package/dist/react/FieldLabelSlotRegistry.js +16 -0
- package/dist/react/FieldLabelSlotRegistry.js.map +1 -0
- package/dist/react/SchemaRenderer.d.ts.map +1 -1
- package/dist/react/SchemaRenderer.js +15 -5
- package/dist/react/SchemaRenderer.js.map +1 -1
- package/dist/react/fields/FieldShell.d.ts +4 -1
- package/dist/react/fields/FieldShell.d.ts.map +1 -1
- package/dist/react/fields/FieldShell.js +2 -2
- package/dist/react/fields/FieldShell.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/src/pageData.ts +33 -0
- package/src/react/FieldLabelSlotRegistry.ts +30 -0
- package/src/react/SchemaRenderer.tsx +22 -8
- package/src/react/fields/FieldShell.tsx +5 -1
- package/src/react/index.ts +1 -0
|
@@ -26,6 +26,9 @@ export interface FieldShellProps {
|
|
|
26
26
|
/** Right-of-input counterpart. Used by `revealable() / copyable() /
|
|
27
27
|
* suffixAction()`. Renders after the passive `suffix` decoration. */
|
|
28
28
|
after?: React.ReactNode;
|
|
29
|
+
/** Optional ReactNode rendered inline next to the label — used by
|
|
30
|
+
* plugins that register via `registerFieldLabelSlot()`. */
|
|
31
|
+
labelSlot?: React.ReactNode;
|
|
29
32
|
}
|
|
30
|
-
export declare function FieldShell({ el, name, label, required, children, before, after }: FieldShellProps): React.ReactElement;
|
|
33
|
+
export declare function FieldShell({ el, name, label, required, children, before, after, labelSlot }: FieldShellProps): React.ReactElement;
|
|
31
34
|
//# sourceMappingURL=FieldShell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldShell.d.ts","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAG1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAS,WAAW,CAAA;IACtB,IAAI,EAAO,MAAM,CAAA;IACjB,KAAK,EAAM,MAAM,CAAA;IACjB,QAAQ,EAAG,OAAO,CAAA;IAClB,QAAQ,EAAG,KAAK,CAAC,SAAS,CAAA;IAC1B;;;0DAGsD;IACtD,MAAM,CAAC,EAAI,KAAK,CAAC,SAAS,CAAA;IAC1B;0EACsE;IACtE,KAAK,CAAC,EAAK,KAAK,CAAC,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"FieldShell.d.ts","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAG1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAS,WAAW,CAAA;IACtB,IAAI,EAAO,MAAM,CAAA;IACjB,KAAK,EAAM,MAAM,CAAA;IACjB,QAAQ,EAAG,OAAO,CAAA;IAClB,QAAQ,EAAG,KAAK,CAAC,SAAS,CAAA;IAC1B;;;0DAGsD;IACtD,MAAM,CAAC,EAAI,KAAK,CAAC,SAAS,CAAA;IAC1B;0EACsE;IACtE,KAAK,CAAC,EAAK,KAAK,CAAC,SAAS,CAAA;IAC1B;gEAC4D;IAC5D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAsDjI"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { getIcon } from '../../icons/registry.js';
|
|
3
|
-
export function FieldShell({ el, name, label, required, children, before, after }) {
|
|
3
|
+
export function FieldShell({ el, name, label, required, children, before, after, labelSlot }) {
|
|
4
4
|
const prefix = el['prefix'];
|
|
5
5
|
const suffix = el['suffix'];
|
|
6
6
|
const helperText = el['helperText'];
|
|
@@ -10,7 +10,7 @@ export function FieldShell({ el, name, label, required, children, before, after
|
|
|
10
10
|
const labelClass = hiddenLabel
|
|
11
11
|
? 'sr-only'
|
|
12
12
|
: 'text-sm font-medium leading-none';
|
|
13
|
-
const labelEl = label !== '' ? (_jsxs("label", { htmlFor: name, className: labelClass, children: [label, required && _jsx("span", { className: "text-destructive ml-0.5", children: "*" })] })) : null;
|
|
13
|
+
const labelEl = label !== '' ? (_jsxs("label", { htmlFor: name, className: labelClass, children: [label, required && _jsx("span", { className: "text-destructive ml-0.5", children: "*" }), labelSlot] })) : null;
|
|
14
14
|
const hasDecoration = !!(prefix || suffix || before || after);
|
|
15
15
|
const input = hasDecoration
|
|
16
16
|
? (_jsxs("div", { className: "flex items-center gap-2", children: [before, prefix && _jsx(Decoration, { content: prefix, side: "prefix" }), _jsx("div", { className: "flex-1 min-w-0", children: children }), suffix && _jsx(Decoration, { content: suffix, side: "suffix" }), after] }))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldShell.js","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"FieldShell.js","sourceRoot":"","sources":["../../../src/react/fields/FieldShell.tsx"],"names":[],"mappings":"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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { AppShell, type AppShellProps } from './AppShell.js';
|
|
|
2
2
|
export { ComponentRegistryProvider, useComponentRegistry, useIconFor, type ComponentRegistry, } from './icon-context.js';
|
|
3
3
|
export { SchemaRenderer, type SchemaRendererProps, FormFields, type FormFieldsProps, } from './SchemaRenderer.js';
|
|
4
4
|
export { registerFieldRenderer, getFieldRenderer, type FieldRendererProps } from './registry.js';
|
|
5
|
+
export { registerFieldLabelSlot, getFieldLabelSlot, type FieldLabelSlotProps } from './FieldLabelSlotRegistry.js';
|
|
5
6
|
export { registerWidgetRenderer, getWidgetRenderer, type WidgetRendererProps, } from './widgetRegistry.js';
|
|
6
7
|
export { FormStateProvider, useFieldState, useFormState, type FormStateApi, type FormStateProviderProps, type UseFieldStateResult, } from './FormStateContext.js';
|
|
7
8
|
export { parseFormDataToNested } from './formStateHelpers.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,EACV,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAChG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAExD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,yBAAyB,GAC/B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAW,gBAAgB,CAAA;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,KAAK,aAAa,IAAI,eAAe,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,EACV,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjH,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAExD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,yBAAyB,GAC/B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAW,gBAAgB,CAAA;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,KAAK,aAAa,IAAI,eAAe,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/react/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { AppShell } from './AppShell.js';
|
|
|
2
2
|
export { ComponentRegistryProvider, useComponentRegistry, useIconFor, } from './icon-context.js';
|
|
3
3
|
export { SchemaRenderer, FormFields, } from './SchemaRenderer.js';
|
|
4
4
|
export { registerFieldRenderer, getFieldRenderer } from './registry.js';
|
|
5
|
+
export { registerFieldLabelSlot, getFieldLabelSlot } from './FieldLabelSlotRegistry.js';
|
|
5
6
|
export { registerWidgetRenderer, getWidgetRenderer, } from './widgetRegistry.js';
|
|
6
7
|
export { FormStateProvider, useFieldState, useFormState, } from './FormStateContext.js';
|
|
7
8
|
export { parseFormDataToNested } from './formStateHelpers.js';
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GAEX,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,cAAc,EAEd,UAAU,GAEX,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAA2B,MAAM,eAAe,CAAA;AAChG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAElB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,GAIb,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAExD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,GAId,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,uBAAuB,GAGxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,YAAY,GAEb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,iBAAiB,EACjB,eAAe,GAGhB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAW,gBAAgB,CAAA;AAE/C,iHAAiH;AACjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,mBAAmB;AACnB,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAyC,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GAEX,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,cAAc,EAEd,UAAU,GAEX,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAA2B,MAAM,eAAe,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAA4B,MAAM,6BAA6B,CAAA;AACjH,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAElB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,GAIb,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAA;AAE9E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAExD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,GAId,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,uBAAuB,GAGxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,YAAY,GAEb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EACL,iBAAiB,EACjB,eAAe,GAGhB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAW,gBAAgB,CAAA;AAE/C,iHAAiH;AACjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,mBAAmB;AACnB,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAyC,MAAM,eAAe,CAAA"}
|
package/package.json
CHANGED
package/src/pageData.ts
CHANGED
|
@@ -955,6 +955,37 @@ export function tagFormWizardUrls(
|
|
|
955
955
|
}
|
|
956
956
|
}
|
|
957
957
|
|
|
958
|
+
/**
|
|
959
|
+
* Stamp `_agentRunBase` on every field element in the resolved
|
|
960
|
+
* `ElementMeta[]` tree that carries `aiActions`. Operates on the
|
|
961
|
+
* post-`resolveSchema` wire shape (plain objects) rather than on
|
|
962
|
+
* `Element` instances — `aiActions` is added by the `field-ai.ts`
|
|
963
|
+
* wrapper during `toMeta()`, so it isn't visible to pre-resolve walkers.
|
|
964
|
+
*
|
|
965
|
+
* Only called on edit pages where a `recordId` is known. Create pages
|
|
966
|
+
* deliberately skip it — field AI actions target existing content.
|
|
967
|
+
*/
|
|
968
|
+
export function tagFieldAiUrls(
|
|
969
|
+
elements: ReadonlyArray<Record<string, unknown>>,
|
|
970
|
+
agentBase: string,
|
|
971
|
+
): void {
|
|
972
|
+
for (const el of elements) {
|
|
973
|
+
if (Array.isArray(el['aiActions']) && (el['aiActions'] as unknown[]).length > 0) {
|
|
974
|
+
;(el as Record<string, unknown>)['_agentRunBase'] = agentBase
|
|
975
|
+
}
|
|
976
|
+
const children = el['children']
|
|
977
|
+
if (Array.isArray(children)) tagFieldAiUrls(children as Record<string, unknown>[], agentBase)
|
|
978
|
+
// Repeater rows
|
|
979
|
+
const rows = el['rows']
|
|
980
|
+
if (Array.isArray(rows)) {
|
|
981
|
+
for (const row of rows as Record<string, unknown>[]) {
|
|
982
|
+
const rowChildren = row['children']
|
|
983
|
+
if (Array.isArray(rowChildren)) tagFieldAiUrls(rowChildren as Record<string, unknown>[], agentBase)
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
958
989
|
/**
|
|
959
990
|
* Audit row 2026-05-07 cont'd⁸ — stamp the inline-create-option endpoint
|
|
960
991
|
* URL on every `SelectField` that has called `createOptionForm()`. Walks
|
|
@@ -1860,6 +1891,8 @@ export async function resourceEditData(
|
|
|
1860
1891
|
editRoute,
|
|
1861
1892
|
)
|
|
1862
1893
|
|
|
1894
|
+
tagFieldAiUrls(schemaData as Record<string, unknown>[], `${resourceBase}/${recordId}/_agents`)
|
|
1895
|
+
|
|
1863
1896
|
return {
|
|
1864
1897
|
panel: await panelInfo(pilotiq, req, editRoute),
|
|
1865
1898
|
page: PageClass.toMeta(),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ComponentType } from 'react'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props the field label slot component receives from `SchemaRenderer`.
|
|
5
|
+
* For AI actions this carries the field name, action list, and the
|
|
6
|
+
* pre-composed agent-run base URL stamped by `tagFieldAiUrls`.
|
|
7
|
+
*/
|
|
8
|
+
export interface FieldLabelSlotProps {
|
|
9
|
+
fieldName: string
|
|
10
|
+
actions: Array<{ slug: string; label: string; icon?: string }>
|
|
11
|
+
agentRunBase: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let _component: ComponentType<FieldLabelSlotProps> | null = null
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Register a component to render inline next to every field label that
|
|
18
|
+
* has `aiActions` stamped on its meta. Called once at boot by a plugin's
|
|
19
|
+
* `register(panel)` step (e.g. `@pilotiq-pro/ai`). No-op when no plugin
|
|
20
|
+
* registers — `getFieldLabelSlot()` returns `null` and `SchemaRenderer`
|
|
21
|
+
* skips the slot.
|
|
22
|
+
*/
|
|
23
|
+
export function registerFieldLabelSlot(C: ComponentType<FieldLabelSlotProps>): void {
|
|
24
|
+
_component = C
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Returns the registered field label slot component, or `null`. */
|
|
28
|
+
export function getFieldLabelSlot(): ComponentType<FieldLabelSlotProps> | null {
|
|
29
|
+
return _component
|
|
30
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useRef, useState } from 'react'
|
|
2
2
|
import type { ElementMeta } from '../schema/Element.js'
|
|
3
3
|
import { getFieldRenderer } from './registry.js'
|
|
4
|
+
import { getFieldLabelSlot } from './FieldLabelSlotRegistry.js'
|
|
4
5
|
import { FormStateProvider, useFormState, FormIdContext } from './FormStateContext.js'
|
|
5
6
|
import { Checkbox } from './ui/checkbox.js'
|
|
6
7
|
import { Input } from './ui/input.js'
|
|
@@ -185,6 +186,16 @@ function renderField(el: ElementMeta, index: number): React.ReactNode {
|
|
|
185
186
|
return <HiddenInput key={index} name={name} defaultValue={defaultValue} />
|
|
186
187
|
}
|
|
187
188
|
|
|
189
|
+
// Field label slot — rendered next to the label when a plugin registered
|
|
190
|
+
// a component via registerFieldLabelSlot() and the field has aiActions +
|
|
191
|
+
// _agentRunBase stamped on its meta (set by tagFieldAiUrls in pageData).
|
|
192
|
+
const LabelSlot = getFieldLabelSlot()
|
|
193
|
+
const aiActions = Array.isArray(el['aiActions']) ? el['aiActions'] as Array<{ slug: string; label: string; icon?: string }> : undefined
|
|
194
|
+
const agentRunBase = typeof el['_agentRunBase'] === 'string' ? el['_agentRunBase'] : undefined
|
|
195
|
+
const labelSlot = (LabelSlot && aiActions?.length && agentRunBase)
|
|
196
|
+
? <LabelSlot fieldName={name} actions={aiActions} agentRunBase={agentRunBase} />
|
|
197
|
+
: undefined
|
|
198
|
+
|
|
188
199
|
const autofocus = el['autofocus'] === true
|
|
189
200
|
const extraInput = el['extraInputAttributes'] as Record<string, string | number | boolean> | undefined
|
|
190
201
|
const common = {
|
|
@@ -204,7 +215,7 @@ function renderField(el: ElementMeta, index: number): React.ReactNode {
|
|
|
204
215
|
const Custom = getFieldRenderer(fieldType)
|
|
205
216
|
if (Custom) {
|
|
206
217
|
return (
|
|
207
|
-
<FieldShell key={index} el={el} name={name} label={label} required={required}>
|
|
218
|
+
<FieldShell key={index} el={el} name={name} label={label} required={required} labelSlot={labelSlot}>
|
|
208
219
|
<Custom
|
|
209
220
|
el={el}
|
|
210
221
|
name={name}
|
|
@@ -230,6 +241,7 @@ function renderField(el: ElementMeta, index: number): React.ReactNode {
|
|
|
230
241
|
label={label}
|
|
231
242
|
required={required}
|
|
232
243
|
common={common}
|
|
244
|
+
labelSlot={labelSlot}
|
|
233
245
|
/>
|
|
234
246
|
)
|
|
235
247
|
}
|
|
@@ -237,7 +249,7 @@ function renderField(el: ElementMeta, index: number): React.ReactNode {
|
|
|
237
249
|
const input = renderFieldInput(fieldType, el, name, defaultValue, defaultStr, common, disabled, required, placeholder)
|
|
238
250
|
|
|
239
251
|
return (
|
|
240
|
-
<FieldShell key={index} el={el} name={name} label={label} required={required}>
|
|
252
|
+
<FieldShell key={index} el={el} name={name} label={label} required={required} labelSlot={labelSlot}>
|
|
241
253
|
{input}
|
|
242
254
|
</FieldShell>
|
|
243
255
|
)
|
|
@@ -249,13 +261,14 @@ function renderField(el: ElementMeta, index: number): React.ReactNode {
|
|
|
249
261
|
* Keeps `renderField` itself hook-free.
|
|
250
262
|
*/
|
|
251
263
|
function TextFieldShell({
|
|
252
|
-
el, name, label, required, common,
|
|
264
|
+
el, name, label, required, common, labelSlot,
|
|
253
265
|
}: {
|
|
254
|
-
el:
|
|
255
|
-
name:
|
|
256
|
-
label:
|
|
257
|
-
required:
|
|
258
|
-
common:
|
|
266
|
+
el: ElementMeta
|
|
267
|
+
name: string
|
|
268
|
+
label: string
|
|
269
|
+
required: boolean
|
|
270
|
+
common: Record<string, unknown>
|
|
271
|
+
labelSlot?: React.ReactNode
|
|
259
272
|
}): React.ReactElement {
|
|
260
273
|
const controls = useTextInputControls(el, name, (m) => renderElement(m, 0))
|
|
261
274
|
|
|
@@ -297,6 +310,7 @@ function TextFieldShell({
|
|
|
297
310
|
required={required}
|
|
298
311
|
before={controls.before}
|
|
299
312
|
after={controls.after}
|
|
313
|
+
labelSlot={labelSlot}
|
|
300
314
|
>
|
|
301
315
|
{input}
|
|
302
316
|
</FieldShell>
|
|
@@ -28,9 +28,12 @@ export interface FieldShellProps {
|
|
|
28
28
|
/** Right-of-input counterpart. Used by `revealable() / copyable() /
|
|
29
29
|
* suffixAction()`. Renders after the passive `suffix` decoration. */
|
|
30
30
|
after?: React.ReactNode
|
|
31
|
+
/** Optional ReactNode rendered inline next to the label — used by
|
|
32
|
+
* plugins that register via `registerFieldLabelSlot()`. */
|
|
33
|
+
labelSlot?: React.ReactNode
|
|
31
34
|
}
|
|
32
35
|
|
|
33
|
-
export function FieldShell({ el, name, label, required, children, before, after }: FieldShellProps): React.ReactElement {
|
|
36
|
+
export function FieldShell({ el, name, label, required, children, before, after, labelSlot }: FieldShellProps): React.ReactElement {
|
|
34
37
|
const prefix = el['prefix'] as string | { icon: string } | undefined
|
|
35
38
|
const suffix = el['suffix'] as string | { icon: string } | undefined
|
|
36
39
|
const helperText = el['helperText'] as string | undefined
|
|
@@ -44,6 +47,7 @@ export function FieldShell({ el, name, label, required, children, before, after
|
|
|
44
47
|
const labelEl = label !== '' ? (
|
|
45
48
|
<label htmlFor={name} className={labelClass}>
|
|
46
49
|
{label}{required && <span className="text-destructive ml-0.5">*</span>}
|
|
50
|
+
{labelSlot}
|
|
47
51
|
</label>
|
|
48
52
|
) : null
|
|
49
53
|
|
package/src/react/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ export {
|
|
|
13
13
|
type FormFieldsProps,
|
|
14
14
|
} from './SchemaRenderer.js'
|
|
15
15
|
export { registerFieldRenderer, getFieldRenderer, type FieldRendererProps } from './registry.js'
|
|
16
|
+
export { registerFieldLabelSlot, getFieldLabelSlot, type FieldLabelSlotProps } from './FieldLabelSlotRegistry.js'
|
|
16
17
|
export {
|
|
17
18
|
registerWidgetRenderer,
|
|
18
19
|
getWidgetRenderer,
|