@pipe0/react 0.2.0 → 0.2.1

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 (98) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/components/compound/pipe-form/errors.d.mts.map +1 -1
  3. package/dist/components/compound/pipe-form/errors.mjs +5 -4
  4. package/dist/components/compound/pipe-form/errors.mjs.map +1 -1
  5. package/dist/components/compound/pipe-form/root.d.mts +3 -1
  6. package/dist/components/compound/pipe-form/root.d.mts.map +1 -1
  7. package/dist/components/compound/pipe-form/root.mjs +5 -3
  8. package/dist/components/compound/pipe-form/root.mjs.map +1 -1
  9. package/dist/components/compound/search-form/errors.d.mts.map +1 -1
  10. package/dist/components/compound/search-form/errors.mjs +5 -4
  11. package/dist/components/compound/search-form/errors.mjs.map +1 -1
  12. package/dist/components/compound/search-form/root.d.mts +3 -1
  13. package/dist/components/compound/search-form/root.d.mts.map +1 -1
  14. package/dist/components/compound/search-form/root.mjs +5 -3
  15. package/dist/components/compound/search-form/root.mjs.map +1 -1
  16. package/dist/components/defaults/adapters/context-select-input.mjs +1 -1
  17. package/dist/components/defaults/adapters/context-select-input.mjs.map +1 -1
  18. package/dist/components/defaults/adapters/index.d.mts.map +1 -1
  19. package/dist/components/defaults/adapters/index.mjs +8 -5
  20. package/dist/components/defaults/adapters/index.mjs.map +1 -1
  21. package/dist/components/defaults/adapters/int-input.mjs.map +1 -1
  22. package/dist/components/defaults/adapters/loose-object-input.mjs +111 -0
  23. package/dist/components/defaults/adapters/loose-object-input.mjs.map +1 -0
  24. package/dist/components/defaults/adapters/pipes-run-if-input.mjs +68 -55
  25. package/dist/components/defaults/adapters/pipes-run-if-input.mjs.map +1 -1
  26. package/dist/components/defaults/adapters/providers-input.mjs.map +1 -1
  27. package/dist/components/defaults/adapters/search-payload-input.mjs +18 -0
  28. package/dist/components/defaults/adapters/search-payload-input.mjs.map +1 -0
  29. package/dist/components/defaults/adapters/select-input.mjs +46 -27
  30. package/dist/components/defaults/adapters/select-input.mjs.map +1 -1
  31. package/dist/components/defaults/catalog/card-derived.d.mts +1 -1
  32. package/dist/components/defaults/catalog/card-derived.d.mts.map +1 -1
  33. package/dist/components/defaults/catalog/card-derived.mjs +6 -2
  34. package/dist/components/defaults/catalog/card-derived.mjs.map +1 -1
  35. package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -1
  36. package/dist/components/defaults/layout/field-wrapper.mjs +11 -5
  37. package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -1
  38. package/dist/components/defaults/layout/group.mjs +1 -1
  39. package/dist/components/internal/LiquidEditor/LiquidEditor.mjs.map +1 -1
  40. package/dist/components/internal/form-level-errors.mjs +4 -3
  41. package/dist/components/internal/form-level-errors.mjs.map +1 -1
  42. package/dist/components/internal/icons.mjs +27 -1
  43. package/dist/components/internal/icons.mjs.map +1 -1
  44. package/dist/components/ui/alert.d.mts +47 -0
  45. package/dist/components/ui/alert.d.mts.map +1 -0
  46. package/dist/components/ui/alert.mjs +66 -0
  47. package/dist/components/ui/alert.mjs.map +1 -0
  48. package/dist/context/form-context.d.mts +21 -0
  49. package/dist/context/form-context.d.mts.map +1 -0
  50. package/dist/context/form-context.mjs +11 -1
  51. package/dist/context/form-context.mjs.map +1 -1
  52. package/dist/context/form-provider.d.mts +3 -1
  53. package/dist/context/form-provider.d.mts.map +1 -1
  54. package/dist/context/form-provider.mjs +8 -2
  55. package/dist/context/form-provider.mjs.map +1 -1
  56. package/dist/hooks/use-effect-catalog-table.d.mts.map +1 -1
  57. package/dist/hooks/use-effect-catalog-table.mjs +2 -2
  58. package/dist/hooks/use-effect-catalog-table.mjs.map +1 -1
  59. package/dist/hooks/use-form-core.mjs +7 -4
  60. package/dist/hooks/use-form-core.mjs.map +1 -1
  61. package/dist/hooks/use-pipe-catalog-table.d.mts +8 -8
  62. package/dist/hooks/use-pipe-catalog-table.d.mts.map +1 -1
  63. package/dist/hooks/use-pipe-catalog-table.mjs +2 -2
  64. package/dist/hooks/use-pipe-catalog-table.mjs.map +1 -1
  65. package/dist/hooks/use-pipe-form.d.mts.map +1 -1
  66. package/dist/hooks/use-pipe-form.mjs +18 -19
  67. package/dist/hooks/use-pipe-form.mjs.map +1 -1
  68. package/dist/hooks/use-search-catalog-table.d.mts +6 -6
  69. package/dist/hooks/use-search-form.d.mts.map +1 -1
  70. package/dist/hooks/use-search-form.mjs +18 -18
  71. package/dist/hooks/use-search-form.mjs.map +1 -1
  72. package/dist/hooks/use-sheet-effect-form.d.mts.map +1 -1
  73. package/dist/hooks/use-sheet-effect-form.mjs +18 -19
  74. package/dist/hooks/use-sheet-effect-form.mjs.map +1 -1
  75. package/dist/index.d.mts +4 -2
  76. package/dist/index.mjs +3 -1
  77. package/dist/styles/pipe0-form.css +1 -1
  78. package/dist/types/adapters.d.mts +22 -1
  79. package/dist/types/adapters.d.mts.map +1 -1
  80. package/dist/types/catalog-adapters.d.mts +1 -1
  81. package/dist/types/field-props.d.mts +15 -13
  82. package/dist/types/field-props.d.mts.map +1 -1
  83. package/dist/types/form-customization.d.mts +2 -25
  84. package/dist/utils/build-section-handlers.mjs +7 -73
  85. package/dist/utils/build-section-handlers.mjs.map +1 -1
  86. package/dist/widgets/token-pricing-badge.d.mts +1 -0
  87. package/dist/widgets/token-pricing-badge.mjs +55 -0
  88. package/dist/widgets/token-pricing-badge.mjs.map +1 -0
  89. package/dist/widgets/widget-strip.d.mts.map +1 -1
  90. package/dist/widgets/widget-strip.mjs +1 -0
  91. package/dist/widgets/widget-strip.mjs.map +1 -1
  92. package/dist/widgets/widget-view.d.mts.map +1 -1
  93. package/dist/widgets/widget-view.mjs +6 -0
  94. package/dist/widgets/widget-view.mjs.map +1 -1
  95. package/package.json +2 -2
  96. package/dist/components/defaults/adapters/key-value-list-input.mjs +0 -102
  97. package/dist/components/defaults/adapters/key-value-list-input.mjs.map +0 -1
  98. package/dist/types/form-customization.d.mts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @pipe0/elements-react
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 436c852: New agent promps plus fix append pipes
8
+ - Updated dependencies [436c852]
9
+ - @pipe0/base@0.5.1
10
+
3
11
  ## 0.2.0
4
12
 
5
13
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/components/compound/pipe-form/errors.tsx"],"mappings":";;;;;;UAQiB,mBAAA;EACf,mBAAA;EACA,UAAA,EAAY,GAAA;EACZ,IAAA,EAAM,UAAA,CAAW,WAAA;AAAA;AAAA,UAGF,mBAAA,SAA4B,SAAA,CAAU,cAAA,QAAsB,mBAAA;;;;;;;iBAQ7D,cAAA,CAAA;EAAiB,QAAA;EAAU,SAAA;EAAW,MAAA;EAAA,GAAW;AAAA,GAAS,mBAAA,GAAmB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA"}
1
+ {"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/components/compound/pipe-form/errors.tsx"],"mappings":";;;;;;UASiB,mBAAA;EACf,mBAAA;EACA,UAAA,EAAY,GAAA;EACZ,IAAA,EAAM,UAAA,CAAW,WAAA;AAAA;AAAA,UAGF,mBAAA,SAA4B,SAAA,CAAU,cAAA,QAAsB,mBAAA;;;;;;;iBAQ7D,cAAA,CAAA;EAAiB,QAAA;EAAU,SAAA;EAAW,MAAA;EAAA,GAAW;AAAA,GAAS,mBAAA,GAAmB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA"}
@@ -1,4 +1,5 @@
1
1
  import { usePipeFormContext } from "../../../context/pipe-form-context.mjs";
2
+ import { useFormAlert } from "../../../context/form-context.mjs";
2
3
  import { asInternalForm } from "../../../utils/internal-form.mjs";
3
4
  import { FormLevelErrors } from "../../internal/form-level-errors.mjs";
4
5
  import { mergeProps } from "@base-ui/react/merge-props";
@@ -14,11 +15,11 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
15
  */
15
16
  function PipeFormErrors({ children, className, render, ...props }) {
16
17
  const { hasFieldLoaderError, fieldPaths, form } = usePipeFormContext();
17
- const defaultBody = /* @__PURE__ */ jsxs(Fragment, { children: [hasFieldLoaderError && /* @__PURE__ */ jsx("div", {
18
+ const Alert = useFormAlert();
19
+ const defaultBody = /* @__PURE__ */ jsxs(Fragment, { children: [hasFieldLoaderError && /* @__PURE__ */ jsx(Alert, {
20
+ variant: "error",
18
21
  "data-p0": "store-error",
19
- role: "alert",
20
- className: "pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium",
21
- children: /* @__PURE__ */ jsx("span", { children: "Failed to load options for one or more fields. Check that your connection is valid." })
22
+ children: "Failed to load options for one or more fields. Check that your connection is valid."
22
23
  }), /* @__PURE__ */ jsx(FormLevelErrors, {
23
24
  control: asInternalForm(form).control,
24
25
  fieldPaths
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../../../../src/components/compound/pipe-form/errors.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type { PipePayload } from \"@pipe0/base\";\nimport { usePipeFormContext } from \"../../../context/pipe-form-context.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { asInternalForm } from \"../../../utils/internal-form.js\";\nimport { FormLevelErrors } from \"../../internal/form-level-errors.js\";\n\nexport interface PipeFormErrorsState {\n hasFieldLoaderError: boolean;\n fieldPaths: Set<string>;\n form: FormHandle<PipePayload>;\n}\n\nexport interface PipeFormErrorsProps extends useRender.ComponentProps<\"div\", PipeFormErrorsState> {}\n\n/**\n * Renders form-wide errors that don't belong to a specific visible field:\n * the field-loader banner (when a resolver fails to load options for a\n * field) and form-level validation errors (errors not attached to any\n * rendered field).\n */\nexport function PipeFormErrors({ children, className, render, ...props }: PipeFormErrorsProps) {\n const { hasFieldLoaderError, fieldPaths, form } = usePipeFormContext();\n\n const defaultBody = (\n <>\n {hasFieldLoaderError && (\n <div\n data-p0=\"store-error\"\n role=\"alert\"\n className=\"pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium\"\n >\n <span>\n Failed to load options for one or more fields. Check that your connection is valid.\n </span>\n </div>\n )}\n <FormLevelErrors control={asInternalForm(form).control} fieldPaths={fieldPaths} />\n </>\n );\n\n return useRender({\n defaultTagName: \"div\",\n render,\n state: { hasFieldLoaderError, fieldPaths, form },\n stateAttributesMapping: {\n fieldPaths: () => null,\n form: () => null,\n },\n props: mergeProps<\"div\">(\n {\n className,\n children: children ?? defaultBody,\n ...({ \"data-p0\": \"form-errors\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAsBA,SAAgB,eAAe,EAAE,UAAU,WAAW,QAAQ,GAAG,SAA8B;CAC7F,MAAM,EAAE,qBAAqB,YAAY,SAAS,oBAAoB;CAEtE,MAAM,cACJ,4CACG,uBACC,oBAAC,OAAD;EACE,WAAQ;EACR,MAAK;EACL,WAAU;YAEV,oBAAC,QAAD,YAAM,uFAEC;EACH,GAER,oBAAC,iBAAD;EAAiB,SAAS,eAAe,KAAK,CAAC;EAAqB;EAAc,EACjF;AAGL,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO;GAAE;GAAqB;GAAY;GAAM;EAChD,wBAAwB;GACtB,kBAAkB;GAClB,YAAY;GACb;EACD,OAAO,WACL;GACE;GACA,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC"}
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../../../../src/components/compound/pipe-form/errors.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type { PipePayload } from \"@pipe0/base\";\nimport { useFormAlert } from \"../../../context/form-context.js\";\nimport { usePipeFormContext } from \"../../../context/pipe-form-context.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { asInternalForm } from \"../../../utils/internal-form.js\";\nimport { FormLevelErrors } from \"../../internal/form-level-errors.js\";\n\nexport interface PipeFormErrorsState {\n hasFieldLoaderError: boolean;\n fieldPaths: Set<string>;\n form: FormHandle<PipePayload>;\n}\n\nexport interface PipeFormErrorsProps extends useRender.ComponentProps<\"div\", PipeFormErrorsState> {}\n\n/**\n * Renders form-wide errors that don't belong to a specific visible field:\n * the field-loader banner (when a resolver fails to load options for a\n * field) and form-level validation errors (errors not attached to any\n * rendered field).\n */\nexport function PipeFormErrors({ children, className, render, ...props }: PipeFormErrorsProps) {\n const { hasFieldLoaderError, fieldPaths, form } = usePipeFormContext();\n const Alert = useFormAlert();\n\n const defaultBody = (\n <>\n {hasFieldLoaderError && (\n <Alert variant=\"error\" data-p0=\"store-error\">\n Failed to load options for one or more fields. Check that your connection is valid.\n </Alert>\n )}\n <FormLevelErrors control={asInternalForm(form).control} fieldPaths={fieldPaths} />\n </>\n );\n\n return useRender({\n defaultTagName: \"div\",\n render,\n state: { hasFieldLoaderError, fieldPaths, form },\n stateAttributesMapping: {\n fieldPaths: () => null,\n form: () => null,\n },\n props: mergeProps<\"div\">(\n {\n className,\n children: children ?? defaultBody,\n ...({ \"data-p0\": \"form-errors\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,SAAgB,eAAe,EAAE,UAAU,WAAW,QAAQ,GAAG,SAA8B;CAC7F,MAAM,EAAE,qBAAqB,YAAY,SAAS,oBAAoB;CACtE,MAAM,QAAQ,cAAc;CAE5B,MAAM,cACJ,4CACG,uBACC,oBAAC,OAAD;EAAO,SAAQ;EAAQ,WAAQ;YAAc;EAErC,GAEV,oBAAC,iBAAD;EAAiB,SAAS,eAAe,KAAK,CAAC;EAAqB;EAAc,EACjF;AAGL,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO;GAAE;GAAqB;GAAY;GAAM;EAChD,wBAAwB;GACtB,kBAAkB;GAClB,YAAY;GACb;EACD,OAAO,WACL;GACE;GACA,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { FormHandle } from "../../../types/form-handle.mjs";
2
2
  import { PipeFormContext } from "../../../context/pipe-form-context.mjs";
3
- import { FieldAdapterMap, FormClassNames } from "../../../types/adapters.mjs";
3
+ import { FieldAdapterMap, FormClassNames, FormComponents } from "../../../types/adapters.mjs";
4
4
  import { GroupMap, PathMap, SectionMap } from "../../../types/form-customization.mjs";
5
5
  import { ReactNode } from "react";
6
6
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
@@ -13,6 +13,8 @@ type PipeFormSubmitHandler = (payload: PipePayload, ctx: {
13
13
  interface RenderingProps {
14
14
  classNames?: FormClassNames;
15
15
  adapters?: FieldAdapterMap;
16
+ /** Whole-component overrides (e.g. `alert`). Forwarded to `FormProvider`. */
17
+ components?: FormComponents;
16
18
  className?: string;
17
19
  }
18
20
  interface PipeFormInstanceProps extends RenderingProps {
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.mts","names":[],"sources":["../../../../src/components/compound/pipe-form/root.tsx"],"mappings":";;;;;;;;;KAoBY,qBAAA,IACV,OAAA,EAAS,WAAA,EACT,GAAA;EAAO,IAAA,EAAM,UAAA,CAAW,WAAA;AAAA,aACd,OAAA;AAAA,UAEF,cAAA;EACR,UAAA,GAAa,cAAA;EACb,QAAA,GAAW,eAAA;EACX,SAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,cAAA;EAC7C,OAAA,EAAS,eAAA;EACT,QAAA,EAAU,qBAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,uBAAA,SAAgC,cAAA;EAC/C,MAAA,EAAQ,MAAA;EACR,SAAA;EACA,QAAA,EAAU,qBAAA;EACV,aAAA,GAAgB,WAAA;EAChB,iBAAA,GAAoB,iBAAA;EACpB,SAAA,GAAY,aAAA;EApBK;AAAO;;;;EA0BxB,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,OAAA;EAxBC;;;;EA6BX,MAAA;EAzBqC;;;;EA8BrC,MAAA;EACA,QAAA,GAAW,SAAA;AAAA;AAAA,KAGD,aAAA,GAAgB,qBAAA,GAAwB,uBAAA;;;;;;;;;;iBAWpC,QAAA,CAAS,KAAA,EAAO,aAAA,GAAa,oBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"root.d.mts","names":[],"sources":["../../../../src/components/compound/pipe-form/root.tsx"],"mappings":";;;;;;;;;KAoBY,qBAAA,IACV,OAAA,EAAS,WAAA,EACT,GAAA;EAAO,IAAA,EAAM,UAAA,CAAW,WAAA;AAAA,aACd,OAAA;AAAA,UAEF,cAAA;EACR,UAAA,GAAa,cAAA;EACb,QAAA,GAAW,eAAA;EANF;EAQT,UAAA,GAAa,cAAA;EACb,SAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,cAAA;EAC7C,OAAA,EAAS,eAAA;EACT,QAAA,EAAU,qBAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,uBAAA,SAAgC,cAAA;EAC/C,MAAA,EAAQ,MAAA;EACR,SAAA;EACA,QAAA,EAAU,qBAAA;EACV,aAAA,GAAgB,WAAA;EAChB,iBAAA,GAAoB,iBAAA;EACpB,SAAA,GAAY,aAAA;EApBU;;;;;EA0BtB,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,OAAA;EA3BG;;;;EAgCb,MAAA;EA5BA;;;AAGF;EA8BE,MAAA;EACA,QAAA,GAAW,SAAA;AAAA;AAAA,KAGD,aAAA,GAAgB,qBAAA,GAAwB,uBAAA;;;;;;;;;;iBAWpC,QAAA,CAAS,KAAA,EAAO,aAAA,GAAa,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -27,7 +27,7 @@ function PipeFormZeroConfig({ pipeId, publicKey, defaultValues, onSubmit, resolv
27
27
  config: { environment: "production" },
28
28
  pipes: [],
29
29
  input: []
30
- }), children, classNames, adapters, className }) {
30
+ }), children, classNames, adapters, components, className }) {
31
31
  return /* @__PURE__ */ jsx(PipeFormWithContext, {
32
32
  context: usePipeForm({
33
33
  pipeId,
@@ -45,11 +45,12 @@ function PipeFormZeroConfig({ pipeId, publicKey, defaultValues, onSubmit, resolv
45
45
  className,
46
46
  classNames,
47
47
  adapters,
48
+ components,
48
49
  children
49
50
  });
50
51
  }
51
- function PipeFormWithContext({ context, onSubmit, children, className, classNames, adapters }) {
52
- const hasLocalOverrides = classNames || adapters;
52
+ function PipeFormWithContext({ context, onSubmit, children, className, classNames, adapters, components }) {
53
+ const hasLocalOverrides = classNames || adapters || components;
53
54
  const inner = /* @__PURE__ */ jsx(PipeFormContext.Provider, {
54
55
  value: context,
55
56
  children: /* @__PURE__ */ jsx(PipeFormShell, {
@@ -61,6 +62,7 @@ function PipeFormWithContext({ context, onSubmit, children, className, className
61
62
  if (hasLocalOverrides) return /* @__PURE__ */ jsx(FormRoot, { children: /* @__PURE__ */ jsx(FormProvider, {
62
63
  classNames,
63
64
  adapters,
65
+ components,
64
66
  children: inner
65
67
  }) });
66
68
  return /* @__PURE__ */ jsx(FormRoot, { children: inner });
@@ -1 +1 @@
1
- {"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/pipe-form/root.tsx"],"sourcesContent":["import {\n type FormResolvers,\n type PipeId,\n type PipePayload,\n type ValidationContext,\n validatePipesOrError,\n} from \"@pipe0/base\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { FormProvider, FormRoot } from \"../../../context/form-provider.js\";\nimport type { PipeFormContext as PipeFormContextValue } from \"../../../context/pipe-form-context.js\";\nimport { PipeFormContext, usePipeFormContext } from \"../../../context/pipe-form-context.js\";\nimport { PortalContainerContext } from \"../../../context/portal-container-context.js\";\nimport { usePipeForm } from \"../../../hooks/use-pipe-form.js\";\nimport type { FieldAdapterMap, FormClassNames } from \"../../../types/adapters.js\";\nimport type { GroupMap, PathMap, SectionMap } from \"../../../types/form-customization.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { DefaultForm } from \"../../defaults/layout/form.js\";\nimport { PipeFormContent } from \"./content.js\";\nimport { PipeFormSubmitButton } from \"./submit-button.js\";\n\nexport type PipeFormSubmitHandler = (\n payload: PipePayload,\n ctx: { form: FormHandle<PipePayload> },\n) => void | Promise<void>;\n\ninterface RenderingProps {\n classNames?: FormClassNames;\n adapters?: FieldAdapterMap;\n className?: string;\n}\n\nexport interface PipeFormInstanceProps extends RenderingProps {\n context: PipeFormContextValue;\n onSubmit: PipeFormSubmitHandler;\n children?: ReactNode;\n}\n\nexport interface PipeFormZeroConfigProps extends RenderingProps {\n pipeId: PipeId;\n publicKey: string;\n onSubmit: PipeFormSubmitHandler;\n defaultValues?: PipePayload;\n validationContext?: ValidationContext;\n resolvers?: FormResolvers;\n /**\n * Hide / relabel / reorder sections by section key. `null` hides a section.\n * Forwarded to the internal `usePipeForm` call. For `<PipeForm context={...}>`,\n * pass these to `usePipeForm` directly instead.\n */\n sectionMap?: SectionMap;\n groupMap?: GroupMap;\n pathMap?: PathMap;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes.\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to this team only.\n */\n teamId?: string;\n children?: ReactNode;\n}\n\nexport type PipeFormProps = PipeFormInstanceProps | PipeFormZeroConfigProps;\n\n/**\n * Compound root for pipe forms.\n *\n * Two modes:\n * - Compound: `<PipeForm context={ctx} onSubmit={...}>...</PipeForm>` — pass the context from `usePipeForm`.\n * Visibility customization (`sectionMap`/`groupMap`/`pathMap`) lives on the hook in this mode.\n * - Zero-config: `<PipeForm pipeId=\"...\" publicKey=\"...\" onSubmit={...} />` — fresh hook created\n * internally; visibility maps may be passed as props and forward to that hook.\n */\nexport function PipeForm(props: PipeFormProps) {\n if (\"context\" in props) {\n return <PipeFormWithContext {...props} />;\n }\n return <PipeFormZeroConfig {...props} />;\n}\n\nfunction PipeFormZeroConfig({\n pipeId,\n publicKey,\n defaultValues,\n onSubmit,\n resolvers,\n scopes,\n teamId,\n sectionMap,\n groupMap,\n pathMap,\n validationContext = validatePipesOrError({\n config: { environment: \"production\" },\n pipes: [],\n input: [],\n }),\n children,\n classNames,\n adapters,\n className,\n}: PipeFormZeroConfigProps) {\n const context = usePipeForm({\n pipeId,\n publicKey,\n defaultValues,\n resolvers,\n scopes,\n teamId,\n validationContext,\n sectionMap,\n groupMap,\n pathMap,\n });\n\n return (\n <PipeFormWithContext\n context={context}\n onSubmit={onSubmit}\n className={className}\n classNames={classNames}\n adapters={adapters}\n >\n {children}\n </PipeFormWithContext>\n );\n}\n\nfunction PipeFormWithContext({\n context,\n onSubmit,\n children,\n className,\n classNames,\n adapters,\n}: PipeFormInstanceProps) {\n const hasLocalOverrides = classNames || adapters;\n\n const inner = (\n <PipeFormContext.Provider value={context}>\n <PipeFormShell className={className} onSubmit={onSubmit}>\n {children}\n </PipeFormShell>\n </PipeFormContext.Provider>\n );\n\n if (hasLocalOverrides) {\n return (\n <FormRoot>\n <FormProvider classNames={classNames} adapters={adapters}>\n {inner}\n </FormProvider>\n </FormRoot>\n );\n }\n\n return <FormRoot>{inner}</FormRoot>;\n}\n\nfunction PipeFormShell({\n children,\n className,\n onSubmit,\n}: {\n children?: ReactNode;\n className?: string;\n onSubmit: PipeFormSubmitHandler;\n}) {\n const context = usePipeFormContext();\n\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const portalRef = useCallback((node: HTMLElement | null) => {\n setPortalContainer(node);\n }, []);\n\n const body = children ?? (\n <>\n <PipeFormContent />\n <PipeFormSubmitButton />\n </>\n );\n\n const handleFormSubmit = context.form.handleSubmit(async (values) => {\n await onSubmit(values, { form: context.form });\n });\n\n return (\n <DefaultForm\n onSubmit={handleFormSubmit}\n ref={portalRef}\n data-p0=\"form\"\n data-p0-pipe={context.id}\n className={className}\n >\n <PortalContainerContext.Provider value={portalContainer}>\n {body}\n </PortalContainerContext.Provider>\n </DefaultForm>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4EA,SAAgB,SAAS,OAAsB;AAC7C,KAAI,aAAa,MACf,QAAO,oBAAC,qBAAD,EAAqB,GAAI,OAAS;AAE3C,QAAO,oBAAC,oBAAD,EAAoB,GAAI,OAAS;;AAG1C,SAAS,mBAAmB,EAC1B,QACA,WACA,eACA,UACA,WACA,QACA,QACA,YACA,UACA,SACA,oBAAoB,qBAAqB;CACvC,QAAQ,EAAE,aAAa,cAAc;CACrC,OAAO,EAAE;CACT,OAAO,EAAE;CACV,CAAC,EACF,UACA,YACA,UACA,aAC0B;AAc1B,QACE,oBAAC,qBAAD;EACE,SAfY,YAAY;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAKY;EACC;EACC;EACF;EAET;EACmB;;AAI1B,SAAS,oBAAoB,EAC3B,SACA,UACA,UACA,WACA,YACA,YACwB;CACxB,MAAM,oBAAoB,cAAc;CAExC,MAAM,QACJ,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,oBAAC,eAAD;GAA0B;GAAqB;GAC5C;GACa;EACS;AAG7B,KAAI,kBACF,QACE,oBAAC,UAAD,YACE,oBAAC,cAAD;EAA0B;EAAsB;YAC7C;EACY,GACN;AAIf,QAAO,oBAAC,UAAD,YAAW,OAAiB;;AAGrC,SAAS,cAAc,EACrB,UACA,WACA,YAKC;CACD,MAAM,UAAU,oBAAoB;CAEpC,MAAM,CAAC,iBAAiB,sBAAsB,SAA6B,KAAK;CAChF,MAAM,YAAY,aAAa,SAA6B;AAC1D,qBAAmB,KAAK;IACvB,EAAE,CAAC;CAEN,MAAM,OAAO,YACX,8CACE,oBAAC,iBAAD,EAAmB,GACnB,oBAAC,sBAAD,EAAwB,EACvB;AAOL,QACE,oBAAC,aAAD;EACE,UANqB,QAAQ,KAAK,aAAa,OAAO,WAAW;AACnE,SAAM,SAAS,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;IAC9C;EAKE,KAAK;EACL,WAAQ;EACR,gBAAc,QAAQ;EACX;YAEX,oBAAC,uBAAuB,UAAxB;GAAiC,OAAO;aACrC;GAC+B;EACtB"}
1
+ {"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/pipe-form/root.tsx"],"sourcesContent":["import {\n type FormResolvers,\n type PipeId,\n type PipePayload,\n type ValidationContext,\n validatePipesOrError,\n} from \"@pipe0/base\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { FormProvider, FormRoot } from \"../../../context/form-provider.js\";\nimport type { PipeFormContext as PipeFormContextValue } from \"../../../context/pipe-form-context.js\";\nimport { PipeFormContext, usePipeFormContext } from \"../../../context/pipe-form-context.js\";\nimport { PortalContainerContext } from \"../../../context/portal-container-context.js\";\nimport { usePipeForm } from \"../../../hooks/use-pipe-form.js\";\nimport type { FieldAdapterMap, FormClassNames, FormComponents } from \"../../../types/adapters.js\";\nimport type { GroupMap, PathMap, SectionMap } from \"../../../types/form-customization.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { DefaultForm } from \"../../defaults/layout/form.js\";\nimport { PipeFormContent } from \"./content.js\";\nimport { PipeFormSubmitButton } from \"./submit-button.js\";\n\nexport type PipeFormSubmitHandler = (\n payload: PipePayload,\n ctx: { form: FormHandle<PipePayload> },\n) => void | Promise<void>;\n\ninterface RenderingProps {\n classNames?: FormClassNames;\n adapters?: FieldAdapterMap;\n /** Whole-component overrides (e.g. `alert`). Forwarded to `FormProvider`. */\n components?: FormComponents;\n className?: string;\n}\n\nexport interface PipeFormInstanceProps extends RenderingProps {\n context: PipeFormContextValue;\n onSubmit: PipeFormSubmitHandler;\n children?: ReactNode;\n}\n\nexport interface PipeFormZeroConfigProps extends RenderingProps {\n pipeId: PipeId;\n publicKey: string;\n onSubmit: PipeFormSubmitHandler;\n defaultValues?: PipePayload;\n validationContext?: ValidationContext;\n resolvers?: FormResolvers;\n /**\n * Hide / relabel / reorder sections by section key. `null` hides a section.\n * Forwarded to the internal `usePipeForm` call. For `<PipeForm context={...}>`,\n * pass these to `usePipeForm` directly instead.\n */\n sectionMap?: SectionMap;\n groupMap?: GroupMap;\n pathMap?: PathMap;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes.\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to this team only.\n */\n teamId?: string;\n children?: ReactNode;\n}\n\nexport type PipeFormProps = PipeFormInstanceProps | PipeFormZeroConfigProps;\n\n/**\n * Compound root for pipe forms.\n *\n * Two modes:\n * - Compound: `<PipeForm context={ctx} onSubmit={...}>...</PipeForm>` — pass the context from `usePipeForm`.\n * Visibility customization (`sectionMap`/`groupMap`/`pathMap`) lives on the hook in this mode.\n * - Zero-config: `<PipeForm pipeId=\"...\" publicKey=\"...\" onSubmit={...} />` — fresh hook created\n * internally; visibility maps may be passed as props and forward to that hook.\n */\nexport function PipeForm(props: PipeFormProps) {\n if (\"context\" in props) {\n return <PipeFormWithContext {...props} />;\n }\n return <PipeFormZeroConfig {...props} />;\n}\n\nfunction PipeFormZeroConfig({\n pipeId,\n publicKey,\n defaultValues,\n onSubmit,\n resolvers,\n scopes,\n teamId,\n sectionMap,\n groupMap,\n pathMap,\n validationContext = validatePipesOrError({\n config: { environment: \"production\" },\n pipes: [],\n input: [],\n }),\n children,\n classNames,\n adapters,\n components,\n className,\n}: PipeFormZeroConfigProps) {\n const context = usePipeForm({\n pipeId,\n publicKey,\n defaultValues,\n resolvers,\n scopes,\n teamId,\n validationContext,\n sectionMap,\n groupMap,\n pathMap,\n });\n\n return (\n <PipeFormWithContext\n context={context}\n onSubmit={onSubmit}\n className={className}\n classNames={classNames}\n adapters={adapters}\n components={components}\n >\n {children}\n </PipeFormWithContext>\n );\n}\n\nfunction PipeFormWithContext({\n context,\n onSubmit,\n children,\n className,\n classNames,\n adapters,\n components,\n}: PipeFormInstanceProps) {\n const hasLocalOverrides = classNames || adapters || components;\n\n const inner = (\n <PipeFormContext.Provider value={context}>\n <PipeFormShell className={className} onSubmit={onSubmit}>\n {children}\n </PipeFormShell>\n </PipeFormContext.Provider>\n );\n\n if (hasLocalOverrides) {\n return (\n <FormRoot>\n <FormProvider classNames={classNames} adapters={adapters} components={components}>\n {inner}\n </FormProvider>\n </FormRoot>\n );\n }\n\n return <FormRoot>{inner}</FormRoot>;\n}\n\nfunction PipeFormShell({\n children,\n className,\n onSubmit,\n}: {\n children?: ReactNode;\n className?: string;\n onSubmit: PipeFormSubmitHandler;\n}) {\n const context = usePipeFormContext();\n\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const portalRef = useCallback((node: HTMLElement | null) => {\n setPortalContainer(node);\n }, []);\n\n const body = children ?? (\n <>\n <PipeFormContent />\n <PipeFormSubmitButton />\n </>\n );\n\n const handleFormSubmit = context.form.handleSubmit(async (values) => {\n await onSubmit(values, { form: context.form });\n });\n\n return (\n <DefaultForm\n onSubmit={handleFormSubmit}\n ref={portalRef}\n data-p0=\"form\"\n data-p0-pipe={context.id}\n className={className}\n >\n <PortalContainerContext.Provider value={portalContainer}>\n {body}\n </PortalContainerContext.Provider>\n </DefaultForm>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8EA,SAAgB,SAAS,OAAsB;AAC7C,KAAI,aAAa,MACf,QAAO,oBAAC,qBAAD,EAAqB,GAAI,OAAS;AAE3C,QAAO,oBAAC,oBAAD,EAAoB,GAAI,OAAS;;AAG1C,SAAS,mBAAmB,EAC1B,QACA,WACA,eACA,UACA,WACA,QACA,QACA,YACA,UACA,SACA,oBAAoB,qBAAqB;CACvC,QAAQ,EAAE,aAAa,cAAc;CACrC,OAAO,EAAE;CACT,OAAO,EAAE;CACV,CAAC,EACF,UACA,YACA,UACA,YACA,aAC0B;AAc1B,QACE,oBAAC,qBAAD;EACE,SAfY,YAAY;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAKY;EACC;EACC;EACF;EACE;EAEX;EACmB;;AAI1B,SAAS,oBAAoB,EAC3B,SACA,UACA,UACA,WACA,YACA,UACA,cACwB;CACxB,MAAM,oBAAoB,cAAc,YAAY;CAEpD,MAAM,QACJ,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,oBAAC,eAAD;GAA0B;GAAqB;GAC5C;GACa;EACS;AAG7B,KAAI,kBACF,QACE,oBAAC,UAAD,YACE,oBAAC,cAAD;EAA0B;EAAsB;EAAsB;YACnE;EACY,GACN;AAIf,QAAO,oBAAC,UAAD,YAAW,OAAiB;;AAGrC,SAAS,cAAc,EACrB,UACA,WACA,YAKC;CACD,MAAM,UAAU,oBAAoB;CAEpC,MAAM,CAAC,iBAAiB,sBAAsB,SAA6B,KAAK;CAChF,MAAM,YAAY,aAAa,SAA6B;AAC1D,qBAAmB,KAAK;IACvB,EAAE,CAAC;CAEN,MAAM,OAAO,YACX,8CACE,oBAAC,iBAAD,EAAmB,GACnB,oBAAC,sBAAD,EAAwB,EACvB;AAOL,QACE,oBAAC,aAAD;EACE,UANqB,QAAQ,KAAK,aAAa,OAAO,WAAW;AACnE,SAAM,SAAS,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;IAC9C;EAKE,KAAK;EACL,WAAQ;EACR,gBAAc,QAAQ;EACX;YAEX,oBAAC,uBAAuB,UAAxB;GAAiC,OAAO;aACrC;GAC+B;EACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/components/compound/search-form/errors.tsx"],"mappings":";;;;;;UAQiB,qBAAA;EACf,mBAAA;EACA,UAAA,EAAY,GAAA;EACZ,IAAA,EAAM,UAAA,CAAW,aAAA;AAAA;AAAA,UAGF,qBAAA,SACP,SAAA,CAAU,cAAA,QAAsB,qBAAA;;;;;;;iBAQ1B,gBAAA,CAAA;EAAmB,QAAA;EAAU,SAAA;EAAW,MAAA;EAAA,GAAW;AAAA,GAAS,qBAAA,GAAqB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA"}
1
+ {"version":3,"file":"errors.d.mts","names":[],"sources":["../../../../src/components/compound/search-form/errors.tsx"],"mappings":";;;;;;UASiB,qBAAA;EACf,mBAAA;EACA,UAAA,EAAY,GAAA;EACZ,IAAA,EAAM,UAAA,CAAW,aAAA;AAAA;AAAA,UAGF,qBAAA,SACP,SAAA,CAAU,cAAA,QAAsB,qBAAA;;;;;;;iBAQ1B,gBAAA,CAAA;EAAmB,QAAA;EAAU,SAAA;EAAW,MAAA;EAAA,GAAW;AAAA,GAAS,qBAAA,GAAqB,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA"}
@@ -1,3 +1,4 @@
1
+ import { useFormAlert } from "../../../context/form-context.mjs";
1
2
  import { asInternalForm } from "../../../utils/internal-form.mjs";
2
3
  import { FormLevelErrors } from "../../internal/form-level-errors.mjs";
3
4
  import { useSearchFormContext } from "../../../context/search-form-context.mjs";
@@ -14,11 +15,11 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
15
  */
15
16
  function SearchFormErrors({ children, className, render, ...props }) {
16
17
  const { hasFieldLoaderError, fieldPaths, form } = useSearchFormContext();
17
- const defaultBody = /* @__PURE__ */ jsxs(Fragment, { children: [hasFieldLoaderError && /* @__PURE__ */ jsx("div", {
18
+ const Alert = useFormAlert();
19
+ const defaultBody = /* @__PURE__ */ jsxs(Fragment, { children: [hasFieldLoaderError && /* @__PURE__ */ jsx(Alert, {
20
+ variant: "error",
18
21
  "data-p0": "store-error",
19
- role: "alert",
20
- className: "pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium",
21
- children: /* @__PURE__ */ jsx("span", { children: "Failed to load options for one or more fields. Check that your connection is valid." })
22
+ children: "Failed to load options for one or more fields. Check that your connection is valid."
22
23
  }), /* @__PURE__ */ jsx(FormLevelErrors, {
23
24
  control: asInternalForm(form).control,
24
25
  fieldPaths
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../../../../src/components/compound/search-form/errors.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type { SearchPayload } from \"@pipe0/base\";\nimport { useSearchFormContext } from \"../../../context/search-form-context.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { asInternalForm } from \"../../../utils/internal-form.js\";\nimport { FormLevelErrors } from \"../../internal/form-level-errors.js\";\n\nexport interface SearchFormErrorsState {\n hasFieldLoaderError: boolean;\n fieldPaths: Set<string>;\n form: FormHandle<SearchPayload>;\n}\n\nexport interface SearchFormErrorsProps\n extends useRender.ComponentProps<\"div\", SearchFormErrorsState> {}\n\n/**\n * Renders form-wide errors that don't belong to a specific visible field:\n * the field-loader banner (when a resolver fails to load options for a\n * field) and form-level validation errors (errors not attached to any\n * rendered field).\n */\nexport function SearchFormErrors({ children, className, render, ...props }: SearchFormErrorsProps) {\n const { hasFieldLoaderError, fieldPaths, form } = useSearchFormContext();\n\n const defaultBody = (\n <>\n {hasFieldLoaderError && (\n <div\n data-p0=\"store-error\"\n role=\"alert\"\n className=\"pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium\"\n >\n <span>\n Failed to load options for one or more fields. Check that your connection is valid.\n </span>\n </div>\n )}\n <FormLevelErrors control={asInternalForm(form).control} fieldPaths={fieldPaths} />\n </>\n );\n\n return useRender({\n defaultTagName: \"div\",\n render,\n state: { hasFieldLoaderError, fieldPaths, form },\n stateAttributesMapping: {\n fieldPaths: () => null,\n form: () => null,\n },\n props: mergeProps<\"div\">(\n {\n className,\n children: children ?? defaultBody,\n ...({ \"data-p0\": \"form-errors\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,SAAgB,iBAAiB,EAAE,UAAU,WAAW,QAAQ,GAAG,SAAgC;CACjG,MAAM,EAAE,qBAAqB,YAAY,SAAS,sBAAsB;CAExE,MAAM,cACJ,4CACG,uBACC,oBAAC,OAAD;EACE,WAAQ;EACR,MAAK;EACL,WAAU;YAEV,oBAAC,QAAD,YAAM,uFAEC;EACH,GAER,oBAAC,iBAAD;EAAiB,SAAS,eAAe,KAAK,CAAC;EAAqB;EAAc,EACjF;AAGL,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO;GAAE;GAAqB;GAAY;GAAM;EAChD,wBAAwB;GACtB,kBAAkB;GAClB,YAAY;GACb;EACD,OAAO,WACL;GACE;GACA,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC"}
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../../../../src/components/compound/search-form/errors.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport type { SearchPayload } from \"@pipe0/base\";\nimport { useFormAlert } from \"../../../context/form-context.js\";\nimport { useSearchFormContext } from \"../../../context/search-form-context.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { asInternalForm } from \"../../../utils/internal-form.js\";\nimport { FormLevelErrors } from \"../../internal/form-level-errors.js\";\n\nexport interface SearchFormErrorsState {\n hasFieldLoaderError: boolean;\n fieldPaths: Set<string>;\n form: FormHandle<SearchPayload>;\n}\n\nexport interface SearchFormErrorsProps\n extends useRender.ComponentProps<\"div\", SearchFormErrorsState> {}\n\n/**\n * Renders form-wide errors that don't belong to a specific visible field:\n * the field-loader banner (when a resolver fails to load options for a\n * field) and form-level validation errors (errors not attached to any\n * rendered field).\n */\nexport function SearchFormErrors({ children, className, render, ...props }: SearchFormErrorsProps) {\n const { hasFieldLoaderError, fieldPaths, form } = useSearchFormContext();\n const Alert = useFormAlert();\n\n const defaultBody = (\n <>\n {hasFieldLoaderError && (\n <Alert variant=\"error\" data-p0=\"store-error\">\n Failed to load options for one or more fields. Check that your connection is valid.\n </Alert>\n )}\n <FormLevelErrors control={asInternalForm(form).control} fieldPaths={fieldPaths} />\n </>\n );\n\n return useRender({\n defaultTagName: \"div\",\n render,\n state: { hasFieldLoaderError, fieldPaths, form },\n stateAttributesMapping: {\n fieldPaths: () => null,\n form: () => null,\n },\n props: mergeProps<\"div\">(\n {\n className,\n children: children ?? defaultBody,\n ...({ \"data-p0\": \"form-errors\" } as Record<string, string>),\n },\n props,\n ),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,SAAgB,iBAAiB,EAAE,UAAU,WAAW,QAAQ,GAAG,SAAgC;CACjG,MAAM,EAAE,qBAAqB,YAAY,SAAS,sBAAsB;CACxE,MAAM,QAAQ,cAAc;CAE5B,MAAM,cACJ,4CACG,uBACC,oBAAC,OAAD;EAAO,SAAQ;EAAQ,WAAQ;YAAc;EAErC,GAEV,oBAAC,iBAAD;EAAiB,SAAS,eAAe,KAAK,CAAC;EAAqB;EAAc,EACjF;AAGL,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO;GAAE;GAAqB;GAAY;GAAM;EAChD,wBAAwB;GACtB,kBAAkB;GAClB,YAAY;GACb;EACD,OAAO,WACL;GACE;GACA,UAAU,YAAY;GAChB,WAAW;GAClB,EACD,MACD;EACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { FormHandle } from "../../../types/form-handle.mjs";
2
- import { FieldAdapterMap, FormClassNames } from "../../../types/adapters.mjs";
2
+ import { FieldAdapterMap, FormClassNames, FormComponents } from "../../../types/adapters.mjs";
3
3
  import { GroupMap, PathMap, SectionMap } from "../../../types/form-customization.mjs";
4
4
  import { SearchFormContext } from "../../../context/search-form-context.mjs";
5
5
  import { ReactNode } from "react";
@@ -13,6 +13,8 @@ type SearchFormSubmitHandler = (payload: SearchPayload, ctx: {
13
13
  interface RenderingProps {
14
14
  classNames?: FormClassNames;
15
15
  adapters?: FieldAdapterMap;
16
+ /** Whole-component overrides (e.g. `alert`). Forwarded to `FormProvider`. */
17
+ components?: FormComponents;
16
18
  className?: string;
17
19
  }
18
20
  interface SearchFormInstanceProps extends RenderingProps {
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.mts","names":[],"sources":["../../../../src/components/compound/search-form/root.tsx"],"mappings":";;;;;;;;;KAcY,uBAAA,IACV,OAAA,EAAS,aAAA,EACT,GAAA;EAAO,IAAA,EAAM,UAAA,CAAW,aAAA;AAAA,aACd,OAAA;AAAA,UAEF,cAAA;EACR,UAAA,GAAa,cAAA;EACb,QAAA,GAAW,eAAA;EACX,SAAA;AAAA;AAAA,UAGe,uBAAA,SAAgC,cAAA;EAC/C,OAAA,EAAS,iBAAA;EACT,QAAA,EAAU,uBAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,yBAAA,SAAkC,cAAA;EACjD,QAAA,EAAU,QAAA;EACV,SAAA;EACA,QAAA,EAAU,uBAAA;EACV,aAAA,GAAgB,aAAA;EAChB,SAAA,GAAY,aAAA;EACZ,WAAA,GAAc,gBAAA;EApBG;AAAO;;;;EA0BxB,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,OAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,KAGD,eAAA,GAAkB,uBAAA,GAA0B,yBAAA;;AAxBxD;;;;;;;iBAkCgB,UAAA,CAAW,KAAA,EAAO,eAAA,GAAe,oBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"root.d.mts","names":[],"sources":["../../../../src/components/compound/search-form/root.tsx"],"mappings":";;;;;;;;;KAcY,uBAAA,IACV,OAAA,EAAS,aAAA,EACT,GAAA;EAAO,IAAA,EAAM,UAAA,CAAW,aAAA;AAAA,aACd,OAAA;AAAA,UAEF,cAAA;EACR,UAAA,GAAa,cAAA;EACb,QAAA,GAAW,eAAA;EANF;EAQT,UAAA,GAAa,cAAA;EACb,SAAA;AAAA;AAAA,UAGe,uBAAA,SAAgC,cAAA;EAC/C,OAAA,EAAS,iBAAA;EACT,QAAA,EAAU,uBAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,yBAAA,SAAkC,cAAA;EACjD,QAAA,EAAU,QAAA;EACV,SAAA;EACA,QAAA,EAAU,uBAAA;EACV,aAAA,GAAgB,aAAA;EAChB,SAAA,GAAY,aAAA;EACZ,WAAA,GAAc,gBAAA;EApBQ;;;;;EA0BtB,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,OAAA;EACV,QAAA,GAAW,SAAA;AAAA;AAAA,KAGD,eAAA,GAAkB,uBAAA,GAA0B,yBAAA;;;;;;AAxBxD;;;iBAkCgB,UAAA,CAAW,KAAA,EAAO,eAAA,GAAe,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -21,7 +21,7 @@ function SearchForm(props) {
21
21
  if ("context" in props) return /* @__PURE__ */ jsx(SearchFormWithContext, { ...props });
22
22
  return /* @__PURE__ */ jsx(SearchFormZeroConfig, { ...props });
23
23
  }
24
- function SearchFormZeroConfig({ searchId, publicKey, defaultValues, onSubmit, resolvers, environment, sectionMap, groupMap, pathMap, children, classNames, adapters, className }) {
24
+ function SearchFormZeroConfig({ searchId, publicKey, defaultValues, onSubmit, resolvers, environment, sectionMap, groupMap, pathMap, children, classNames, adapters, components, className }) {
25
25
  return /* @__PURE__ */ jsx(SearchFormWithContext, {
26
26
  context: useSearchForm({
27
27
  searchId,
@@ -37,11 +37,12 @@ function SearchFormZeroConfig({ searchId, publicKey, defaultValues, onSubmit, re
37
37
  className,
38
38
  classNames,
39
39
  adapters,
40
+ components,
40
41
  children
41
42
  });
42
43
  }
43
- function SearchFormWithContext({ context, onSubmit, children, className, classNames, adapters }) {
44
- const hasLocalOverrides = classNames || adapters;
44
+ function SearchFormWithContext({ context, onSubmit, children, className, classNames, adapters, components }) {
45
+ const hasLocalOverrides = classNames || adapters || components;
45
46
  const inner = /* @__PURE__ */ jsx(SearchFormContext.Provider, {
46
47
  value: context,
47
48
  children: /* @__PURE__ */ jsx(SearchFormShell, {
@@ -53,6 +54,7 @@ function SearchFormWithContext({ context, onSubmit, children, className, classNa
53
54
  if (hasLocalOverrides) return /* @__PURE__ */ jsx(FormRoot, { children: /* @__PURE__ */ jsx(FormProvider, {
54
55
  classNames,
55
56
  adapters,
57
+ components,
56
58
  children: inner
57
59
  }) });
58
60
  return /* @__PURE__ */ jsx(FormRoot, { children: inner });
@@ -1 +1 @@
1
- {"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/search-form/root.tsx"],"sourcesContent":["import type { FormResolvers, PipesEnvironment, SearchId, SearchPayload } from \"@pipe0/base\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { FormProvider, FormRoot } from \"../../../context/form-provider.js\";\nimport { PortalContainerContext } from \"../../../context/portal-container-context.js\";\nimport type { SearchFormContext as SearchFormContextValue } from \"../../../context/search-form-context.js\";\nimport { SearchFormContext, useSearchFormContext } from \"../../../context/search-form-context.js\";\nimport { useSearchForm } from \"../../../hooks/use-search-form.js\";\nimport type { FieldAdapterMap, FormClassNames } from \"../../../types/adapters.js\";\nimport type { GroupMap, PathMap, SectionMap } from \"../../../types/form-customization.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { DefaultForm } from \"../../defaults/layout/form.js\";\nimport { SearchFormContent } from \"./content.js\";\nimport { SearchFormSubmitButton } from \"./submit-button.js\";\n\nexport type SearchFormSubmitHandler = (\n payload: SearchPayload,\n ctx: { form: FormHandle<SearchPayload> },\n) => void | Promise<void>;\n\ninterface RenderingProps {\n classNames?: FormClassNames;\n adapters?: FieldAdapterMap;\n className?: string;\n}\n\nexport interface SearchFormInstanceProps extends RenderingProps {\n context: SearchFormContextValue;\n onSubmit: SearchFormSubmitHandler;\n children?: ReactNode;\n}\n\nexport interface SearchFormZeroConfigProps extends RenderingProps {\n searchId: SearchId;\n publicKey: string;\n onSubmit: SearchFormSubmitHandler;\n defaultValues?: SearchPayload;\n resolvers?: FormResolvers;\n environment?: PipesEnvironment;\n /**\n * Hide / relabel / reorder sections by section key. `null` hides a section.\n * Forwarded to the internal `useSearchForm` call. For `<SearchForm context={...}>`,\n * pass these to `useSearchForm` directly instead.\n */\n sectionMap?: SectionMap;\n groupMap?: GroupMap;\n pathMap?: PathMap;\n children?: ReactNode;\n}\n\nexport type SearchFormProps = SearchFormInstanceProps | SearchFormZeroConfigProps;\n\n/**\n * Compound root for search forms.\n *\n * - Compound: `<SearchForm context={ctx} onSubmit={...}>...</SearchForm>` — pass the context from\n * `useSearchForm`. Visibility customization lives on the hook in this mode.\n * - Zero-config: `<SearchForm searchId=\"...\" publicKey=\"...\" onSubmit={...} />` — fresh hook\n * created internally; visibility maps may be passed as props and forward to that hook.\n */\nexport function SearchForm(props: SearchFormProps) {\n if (\"context\" in props) {\n return <SearchFormWithContext {...props} />;\n }\n return <SearchFormZeroConfig {...props} />;\n}\n\nfunction SearchFormZeroConfig({\n searchId,\n publicKey,\n defaultValues,\n onSubmit,\n resolvers,\n environment,\n sectionMap,\n groupMap,\n pathMap,\n children,\n classNames,\n adapters,\n className,\n}: SearchFormZeroConfigProps) {\n const context = useSearchForm({\n searchId,\n publicKey,\n defaultValues,\n resolvers,\n environment,\n sectionMap,\n groupMap,\n pathMap,\n });\n\n return (\n <SearchFormWithContext\n context={context}\n onSubmit={onSubmit}\n className={className}\n classNames={classNames}\n adapters={adapters}\n >\n {children}\n </SearchFormWithContext>\n );\n}\n\nfunction SearchFormWithContext({\n context,\n onSubmit,\n children,\n className,\n classNames,\n adapters,\n}: SearchFormInstanceProps) {\n const hasLocalOverrides = classNames || adapters;\n\n const inner = (\n <SearchFormContext.Provider value={context}>\n <SearchFormShell className={className} onSubmit={onSubmit}>\n {children}\n </SearchFormShell>\n </SearchFormContext.Provider>\n );\n\n if (hasLocalOverrides) {\n return (\n <FormRoot>\n <FormProvider classNames={classNames} adapters={adapters}>\n {inner}\n </FormProvider>\n </FormRoot>\n );\n }\n\n return <FormRoot>{inner}</FormRoot>;\n}\n\nfunction SearchFormShell({\n children,\n className,\n onSubmit,\n}: {\n children?: ReactNode;\n className?: string;\n onSubmit: SearchFormSubmitHandler;\n}) {\n const context = useSearchFormContext();\n\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const portalRef = useCallback((node: HTMLElement | null) => {\n setPortalContainer(node);\n }, []);\n\n const body = children ?? (\n <>\n <SearchFormContent />\n <SearchFormSubmitButton />\n </>\n );\n\n const handleFormSubmit = context.form.handleSubmit(async (values) => {\n await onSubmit(values, { form: context.form });\n });\n\n return (\n <DefaultForm\n onSubmit={handleFormSubmit}\n ref={portalRef}\n data-p0=\"form\"\n data-p0-search={context.id}\n className={className}\n >\n <PortalContainerContext.Provider value={portalContainer}>\n {body}\n </PortalContainerContext.Provider>\n </DefaultForm>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA2DA,SAAgB,WAAW,OAAwB;AACjD,KAAI,aAAa,MACf,QAAO,oBAAC,uBAAD,EAAuB,GAAI,OAAS;AAE7C,QAAO,oBAAC,sBAAD,EAAsB,GAAI,OAAS;;AAG5C,SAAS,qBAAqB,EAC5B,UACA,WACA,eACA,UACA,WACA,aACA,YACA,UACA,SACA,UACA,YACA,UACA,aAC4B;AAY5B,QACE,oBAAC,uBAAD;EACE,SAbY,cAAc;GAC5B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAKY;EACC;EACC;EACF;EAET;EACqB;;AAI5B,SAAS,sBAAsB,EAC7B,SACA,UACA,UACA,WACA,YACA,YAC0B;CAC1B,MAAM,oBAAoB,cAAc;CAExC,MAAM,QACJ,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;YACjC,oBAAC,iBAAD;GAA4B;GAAqB;GAC9C;GACe;EACS;AAG/B,KAAI,kBACF,QACE,oBAAC,UAAD,YACE,oBAAC,cAAD;EAA0B;EAAsB;YAC7C;EACY,GACN;AAIf,QAAO,oBAAC,UAAD,YAAW,OAAiB;;AAGrC,SAAS,gBAAgB,EACvB,UACA,WACA,YAKC;CACD,MAAM,UAAU,sBAAsB;CAEtC,MAAM,CAAC,iBAAiB,sBAAsB,SAA6B,KAAK;CAChF,MAAM,YAAY,aAAa,SAA6B;AAC1D,qBAAmB,KAAK;IACvB,EAAE,CAAC;CAEN,MAAM,OAAO,YACX,8CACE,oBAAC,mBAAD,EAAqB,GACrB,oBAAC,wBAAD,EAA0B,EACzB;AAOL,QACE,oBAAC,aAAD;EACE,UANqB,QAAQ,KAAK,aAAa,OAAO,WAAW;AACnE,SAAM,SAAS,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;IAC9C;EAKE,KAAK;EACL,WAAQ;EACR,kBAAgB,QAAQ;EACb;YAEX,oBAAC,uBAAuB,UAAxB;GAAiC,OAAO;aACrC;GAC+B;EACtB"}
1
+ {"version":3,"file":"root.mjs","names":[],"sources":["../../../../src/components/compound/search-form/root.tsx"],"sourcesContent":["import type { FormResolvers, PipesEnvironment, SearchId, SearchPayload } from \"@pipe0/base\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport { FormProvider, FormRoot } from \"../../../context/form-provider.js\";\nimport { PortalContainerContext } from \"../../../context/portal-container-context.js\";\nimport type { SearchFormContext as SearchFormContextValue } from \"../../../context/search-form-context.js\";\nimport { SearchFormContext, useSearchFormContext } from \"../../../context/search-form-context.js\";\nimport { useSearchForm } from \"../../../hooks/use-search-form.js\";\nimport type { FieldAdapterMap, FormClassNames, FormComponents } from \"../../../types/adapters.js\";\nimport type { GroupMap, PathMap, SectionMap } from \"../../../types/form-customization.js\";\nimport type { FormHandle } from \"../../../types/form-handle.js\";\nimport { DefaultForm } from \"../../defaults/layout/form.js\";\nimport { SearchFormContent } from \"./content.js\";\nimport { SearchFormSubmitButton } from \"./submit-button.js\";\n\nexport type SearchFormSubmitHandler = (\n payload: SearchPayload,\n ctx: { form: FormHandle<SearchPayload> },\n) => void | Promise<void>;\n\ninterface RenderingProps {\n classNames?: FormClassNames;\n adapters?: FieldAdapterMap;\n /** Whole-component overrides (e.g. `alert`). Forwarded to `FormProvider`. */\n components?: FormComponents;\n className?: string;\n}\n\nexport interface SearchFormInstanceProps extends RenderingProps {\n context: SearchFormContextValue;\n onSubmit: SearchFormSubmitHandler;\n children?: ReactNode;\n}\n\nexport interface SearchFormZeroConfigProps extends RenderingProps {\n searchId: SearchId;\n publicKey: string;\n onSubmit: SearchFormSubmitHandler;\n defaultValues?: SearchPayload;\n resolvers?: FormResolvers;\n environment?: PipesEnvironment;\n /**\n * Hide / relabel / reorder sections by section key. `null` hides a section.\n * Forwarded to the internal `useSearchForm` call. For `<SearchForm context={...}>`,\n * pass these to `useSearchForm` directly instead.\n */\n sectionMap?: SectionMap;\n groupMap?: GroupMap;\n pathMap?: PathMap;\n children?: ReactNode;\n}\n\nexport type SearchFormProps = SearchFormInstanceProps | SearchFormZeroConfigProps;\n\n/**\n * Compound root for search forms.\n *\n * - Compound: `<SearchForm context={ctx} onSubmit={...}>...</SearchForm>` — pass the context from\n * `useSearchForm`. Visibility customization lives on the hook in this mode.\n * - Zero-config: `<SearchForm searchId=\"...\" publicKey=\"...\" onSubmit={...} />` — fresh hook\n * created internally; visibility maps may be passed as props and forward to that hook.\n */\nexport function SearchForm(props: SearchFormProps) {\n if (\"context\" in props) {\n return <SearchFormWithContext {...props} />;\n }\n return <SearchFormZeroConfig {...props} />;\n}\n\nfunction SearchFormZeroConfig({\n searchId,\n publicKey,\n defaultValues,\n onSubmit,\n resolvers,\n environment,\n sectionMap,\n groupMap,\n pathMap,\n children,\n classNames,\n adapters,\n components,\n className,\n}: SearchFormZeroConfigProps) {\n const context = useSearchForm({\n searchId,\n publicKey,\n defaultValues,\n resolvers,\n environment,\n sectionMap,\n groupMap,\n pathMap,\n });\n\n return (\n <SearchFormWithContext\n context={context}\n onSubmit={onSubmit}\n className={className}\n classNames={classNames}\n adapters={adapters}\n components={components}\n >\n {children}\n </SearchFormWithContext>\n );\n}\n\nfunction SearchFormWithContext({\n context,\n onSubmit,\n children,\n className,\n classNames,\n adapters,\n components,\n}: SearchFormInstanceProps) {\n const hasLocalOverrides = classNames || adapters || components;\n\n const inner = (\n <SearchFormContext.Provider value={context}>\n <SearchFormShell className={className} onSubmit={onSubmit}>\n {children}\n </SearchFormShell>\n </SearchFormContext.Provider>\n );\n\n if (hasLocalOverrides) {\n return (\n <FormRoot>\n <FormProvider classNames={classNames} adapters={adapters} components={components}>\n {inner}\n </FormProvider>\n </FormRoot>\n );\n }\n\n return <FormRoot>{inner}</FormRoot>;\n}\n\nfunction SearchFormShell({\n children,\n className,\n onSubmit,\n}: {\n children?: ReactNode;\n className?: string;\n onSubmit: SearchFormSubmitHandler;\n}) {\n const context = useSearchFormContext();\n\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const portalRef = useCallback((node: HTMLElement | null) => {\n setPortalContainer(node);\n }, []);\n\n const body = children ?? (\n <>\n <SearchFormContent />\n <SearchFormSubmitButton />\n </>\n );\n\n const handleFormSubmit = context.form.handleSubmit(async (values) => {\n await onSubmit(values, { form: context.form });\n });\n\n return (\n <DefaultForm\n onSubmit={handleFormSubmit}\n ref={portalRef}\n data-p0=\"form\"\n data-p0-search={context.id}\n className={className}\n >\n <PortalContainerContext.Provider value={portalContainer}>\n {body}\n </PortalContainerContext.Provider>\n </DefaultForm>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6DA,SAAgB,WAAW,OAAwB;AACjD,KAAI,aAAa,MACf,QAAO,oBAAC,uBAAD,EAAuB,GAAI,OAAS;AAE7C,QAAO,oBAAC,sBAAD,EAAsB,GAAI,OAAS;;AAG5C,SAAS,qBAAqB,EAC5B,UACA,WACA,eACA,UACA,WACA,aACA,YACA,UACA,SACA,UACA,YACA,UACA,YACA,aAC4B;AAY5B,QACE,oBAAC,uBAAD;EACE,SAbY,cAAc;GAC5B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAKY;EACC;EACC;EACF;EACE;EAEX;EACqB;;AAI5B,SAAS,sBAAsB,EAC7B,SACA,UACA,UACA,WACA,YACA,UACA,cAC0B;CAC1B,MAAM,oBAAoB,cAAc,YAAY;CAEpD,MAAM,QACJ,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;YACjC,oBAAC,iBAAD;GAA4B;GAAqB;GAC9C;GACe;EACS;AAG/B,KAAI,kBACF,QACE,oBAAC,UAAD,YACE,oBAAC,cAAD;EAA0B;EAAsB;EAAsB;YACnE;EACY,GACN;AAIf,QAAO,oBAAC,UAAD,YAAW,OAAiB;;AAGrC,SAAS,gBAAgB,EACvB,UACA,WACA,YAKC;CACD,MAAM,UAAU,sBAAsB;CAEtC,MAAM,CAAC,iBAAiB,sBAAsB,SAA6B,KAAK;CAChF,MAAM,YAAY,aAAa,SAA6B;AAC1D,qBAAmB,KAAK;IACvB,EAAE,CAAC;CAEN,MAAM,OAAO,YACX,8CACE,oBAAC,mBAAD,EAAqB,GACrB,oBAAC,wBAAD,EAA0B,EACzB;AAOL,QACE,oBAAC,aAAD;EACE,UANqB,QAAQ,KAAK,aAAa,OAAO,WAAW;AACnE,SAAM,SAAS,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC;IAC9C;EAKE,KAAK;EACL,WAAQ;EACR,kBAAgB,QAAQ;EACb;YAEX,oBAAC,uBAAuB,UAAxB;GAAiC,OAAO;aACrC;GAC+B;EACtB"}
@@ -7,7 +7,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  function ContextSelectInputAdapter(field) {
8
8
  const hasOptions = field.options.length > 0;
9
9
  const selectedOption = field.options.find((o) => o.value === field.selectedValue);
10
- const placeholder = field.pending ? "Loading…" : field.meta.placeholder ?? (field.suggestionsDisabled ? "Select" : "— Select —");
10
+ const placeholder = field.pending ? "Loading…" : field.meta.placeholder ?? "";
11
11
  return /* @__PURE__ */ jsxs("div", {
12
12
  "data-p0": "input",
13
13
  className: cn("pz:flex pz:flex-col pz:gap-1", field.pending && "pz:opacity-60"),
@@ -1 +1 @@
1
- {"version":3,"file":"context-select-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/context-select-input.tsx"],"sourcesContent":["import type { StoreOption } from \"@pipe0/base\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { WidgetStrip } from \"../../../widgets/widget-strip.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select.js\";\n\nexport function ContextSelectInputAdapter(field: FieldHandle<\"context_select_input\">) {\n const hasOptions = field.options.length > 0;\n const selectedOption = field.options.find((o) => o.value === field.selectedValue);\n\n // ONE always-controlled Select across every state (loading / gated / ready).\n // Rendering a separate <Select> tree per state — or using\n // `value={... || undefined}` — flips Base UI between uncontrolled and\n // controlled, which warns and now actually fires on the loading→ready\n // transition (the field finally re-renders through it). `null` is Base UI's\n // controlled \"no selection\" sentinel (cf. connector-input + the `v === null`\n // guard below), so the value is never `undefined` and the control stays\n // controlled for its whole lifetime. State differences are expressed only via\n // `disabled` / `placeholder` / the helper line below — not via remounting.\n const placeholder = field.pending\n ? \"Loading…\"\n : (field.meta.placeholder ?? (field.suggestionsDisabled ? \"Select\" : \"— Select —\"));\n\n return (\n <div\n data-p0=\"input\"\n className={cn(\"pz:flex pz:flex-col pz:gap-1\", field.pending && \"pz:opacity-60\")}\n >\n <Select\n value={field.selectedValue || null}\n onValueChange={(v) => {\n if (v === null) return;\n field.onSelect(v);\n }}\n name={field.path}\n disabled={field.pending || field.suggestionsDisabled || !hasOptions}\n >\n <SelectTrigger id={field.id} aria-invalid={!!field.error} className=\"pz:w-full\">\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"pz:flex pz:items-center pz:gap-2\">\n <WidgetStrip widgets={selectedOption.widgets} />\n <span>{selectedOption.label}</span>\n </span>\n ) : undefined}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {field.options.map((opt: StoreOption) => (\n <SelectItem key={opt.value} value={opt.value} label={opt.label}>\n <span className=\"pz:flex pz:items-center pz:gap-2\">\n <WidgetStrip widgets={opt.widgets} />\n <span>{opt.label}</span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.suggestionsDisabled ? (\n <div className=\"pz:text-xs pz:gap-y-1 pz:text-muted-foreground pz:italic\">\n {field.suggestionsDisabledReason ?? \"Suggestions unavailable\"}{\" \"}\n </div>\n ) : !field.pending && !hasOptions ? (\n <span className=\"pz:text-xs pz:text-muted-foreground\">No fields available</span>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,0BAA0B,OAA4C;CACpF,MAAM,aAAa,MAAM,QAAQ,SAAS;CAC1C,MAAM,iBAAiB,MAAM,QAAQ,MAAM,MAAM,EAAE,UAAU,MAAM,cAAc;CAWjF,MAAM,cAAc,MAAM,UACtB,aACC,MAAM,KAAK,gBAAgB,MAAM,sBAAsB,WAAW;AAEvE,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GAAG,gCAAgC,MAAM,WAAW,gBAAgB;YAFjF,CAIE,qBAAC,QAAD;GACE,OAAO,MAAM,iBAAiB;GAC9B,gBAAgB,MAAM;AACpB,QAAI,MAAM,KAAM;AAChB,UAAM,SAAS,EAAE;;GAEnB,MAAM,MAAM;GACZ,UAAU,MAAM,WAAW,MAAM,uBAAuB,CAAC;aAP3D,CASE,oBAAC,eAAD;IAAe,IAAI,MAAM;IAAI,gBAAc,CAAC,CAAC,MAAM;IAAO,WAAU;cAClE,oBAAC,aAAD;KAA0B;eACvB,iBACC,qBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,oBAAC,aAAD,EAAa,SAAS,eAAe,SAAW,GAChD,oBAAC,QAAD,YAAO,eAAe,OAAa,EAC9B;UACL;KACQ;IACA,GAChB,oBAAC,eAAD,YACG,MAAM,QAAQ,KAAK,QAClB,oBAAC,YAAD;IAA4B,OAAO,IAAI;IAAO,OAAO,IAAI;cACvD,qBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,oBAAC,aAAD,EAAa,SAAS,IAAI,SAAW,GACrC,oBAAC,QAAD,YAAO,IAAI,OAAa,EACnB;;IACI,EALI,IAAI,MAKR,CACb,EACY,EACT;MACR,MAAM,sBACL,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,6BAA6B,2BAA2B,IAC3D;OACJ,CAAC,MAAM,WAAW,CAAC,aACrB,oBAAC,QAAD;GAAM,WAAU;aAAsC;GAA0B,IAC9E,KACA"}
1
+ {"version":3,"file":"context-select-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/context-select-input.tsx"],"sourcesContent":["import type { StoreOption } from \"@pipe0/base\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { WidgetStrip } from \"../../../widgets/widget-strip.js\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select.js\";\n\nexport function ContextSelectInputAdapter(field: FieldHandle<\"context_select_input\">) {\n const hasOptions = field.options.length > 0;\n const selectedOption = field.options.find((o) => o.value === field.selectedValue);\n\n // ONE always-controlled Select across every state (loading / gated / ready).\n // Rendering a separate <Select> tree per state — or using\n // `value={... || undefined}` — flips Base UI between uncontrolled and\n // controlled, which warns and now actually fires on the loading→ready\n // transition (the field finally re-renders through it). `null` is Base UI's\n // controlled \"no selection\" sentinel (cf. connector-input + the `v === null`\n // guard below), so the value is never `undefined` and the control stays\n // controlled for its whole lifetime. State differences are expressed only via\n // `disabled` / `placeholder` / the helper line below — not via remounting.\n const placeholder = field.pending ? \"Loading…\" : (field.meta.placeholder ?? \"\");\n\n return (\n <div\n data-p0=\"input\"\n className={cn(\"pz:flex pz:flex-col pz:gap-1\", field.pending && \"pz:opacity-60\")}\n >\n <Select\n value={field.selectedValue || null}\n onValueChange={(v) => {\n if (v === null) return;\n field.onSelect(v);\n }}\n name={field.path}\n disabled={field.pending || field.suggestionsDisabled || !hasOptions}\n >\n <SelectTrigger id={field.id} aria-invalid={!!field.error} className=\"pz:w-full\">\n <SelectValue placeholder={placeholder}>\n {selectedOption ? (\n <span className=\"pz:flex pz:items-center pz:gap-2\">\n <WidgetStrip widgets={selectedOption.widgets} />\n <span>{selectedOption.label}</span>\n </span>\n ) : undefined}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {field.options.map((opt: StoreOption) => (\n <SelectItem key={opt.value} value={opt.value} label={opt.label}>\n <span className=\"pz:flex pz:items-center pz:gap-2\">\n <WidgetStrip widgets={opt.widgets} />\n <span>{opt.label}</span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.suggestionsDisabled ? (\n <div className=\"pz:text-xs pz:gap-y-1 pz:text-muted-foreground pz:italic\">\n {field.suggestionsDisabledReason ?? \"Suggestions unavailable\"}{\" \"}\n </div>\n ) : !field.pending && !hasOptions ? (\n <span className=\"pz:text-xs pz:text-muted-foreground\">No fields available</span>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,0BAA0B,OAA4C;CACpF,MAAM,aAAa,MAAM,QAAQ,SAAS;CAC1C,MAAM,iBAAiB,MAAM,QAAQ,MAAM,MAAM,EAAE,UAAU,MAAM,cAAc;CAWjF,MAAM,cAAc,MAAM,UAAU,aAAc,MAAM,KAAK,eAAe;AAE5E,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,GAAG,gCAAgC,MAAM,WAAW,gBAAgB;YAFjF,CAIE,qBAAC,QAAD;GACE,OAAO,MAAM,iBAAiB;GAC9B,gBAAgB,MAAM;AACpB,QAAI,MAAM,KAAM;AAChB,UAAM,SAAS,EAAE;;GAEnB,MAAM,MAAM;GACZ,UAAU,MAAM,WAAW,MAAM,uBAAuB,CAAC;aAP3D,CASE,oBAAC,eAAD;IAAe,IAAI,MAAM;IAAI,gBAAc,CAAC,CAAC,MAAM;IAAO,WAAU;cAClE,oBAAC,aAAD;KAA0B;eACvB,iBACC,qBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,oBAAC,aAAD,EAAa,SAAS,eAAe,SAAW,GAChD,oBAAC,QAAD,YAAO,eAAe,OAAa,EAC9B;UACL;KACQ;IACA,GAChB,oBAAC,eAAD,YACG,MAAM,QAAQ,KAAK,QAClB,oBAAC,YAAD;IAA4B,OAAO,IAAI;IAAO,OAAO,IAAI;cACvD,qBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,oBAAC,aAAD,EAAa,SAAS,IAAI,SAAW,GACrC,oBAAC,QAAD,YAAO,IAAI,OAAa,EACnB;;IACI,EALI,IAAI,MAKR,CACb,EACY,EACT;MACR,MAAM,sBACL,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,6BAA6B,2BAA2B,IAC3D;OACJ,CAAC,MAAM,WAAW,CAAC,aACrB,oBAAC,QAAD;GAAM,WAAU;aAAsC;GAA0B,IAC9E,KACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"mappings":";;;;;AAqCA;;cAAa,eAAA,EAiC2B,OAAA,CAAQ,eAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"mappings":";;;;;AAsCA;;cAAa,eAAA,EAoC2B,OAAA,CAAQ,eAAA"}
@@ -12,19 +12,20 @@ import { IncludeExcludeSelectInputAdapter } from "./include-exclude-select-input
12
12
  import { IntInputAdapter } from "./int-input.mjs";
13
13
  import { JsonExtractionInputAdapter } from "./json-extraction-input.mjs";
14
14
  import { JsonSchemaInputAdapter } from "./json-schema-input.mjs";
15
- import { KeyValueListInputAdapter } from "./key-value-list-input.mjs";
15
+ import { LooseObjectInputAdapter } from "./loose-object-input.mjs";
16
16
  import { MinMaxIntInputAdapter } from "./min-max-int-input.mjs";
17
17
  import { MultiCreateInputAdapter } from "./multi-create-input.mjs";
18
18
  import { MultiSelectInputAdapter } from "./multi-select-input.mjs";
19
19
  import { NumberInputAdapter } from "./number-input.mjs";
20
20
  import { OrderedMultiCreateInputAdapter } from "./ordered-multi-create-input.mjs";
21
- import { TaggedOrderedMultiCreateInputAdapter } from "./tagged-ordered-multi-create-input.mjs";
22
21
  import { OutputFieldInputAdapter } from "./output-field-input.mjs";
23
- import { PipesRunIfInputAdapter } from "./pipes-run-if-input.mjs";
22
+ import { ConditionBlockInputAdapter, PipesRunIfInputAdapter } from "./pipes-run-if-input.mjs";
24
23
  import { PromptInputAdapter } from "./prompt-input.mjs";
25
24
  import { ProvidersInputAdapter } from "./providers-input.mjs";
26
25
  import { RangeInputAdapter } from "./range-input.mjs";
26
+ import { SearchPayloadInputAdapter } from "./search-payload-input.mjs";
27
27
  import { SelectInputAdapter } from "./select-input.mjs";
28
+ import { TaggedOrderedMultiCreateInputAdapter } from "./tagged-ordered-multi-create-input.mjs";
28
29
  import { TaggedTextInputAdapter } from "./tagged-text-input.mjs";
29
30
  import { TemplateInputAdapter } from "./template-input.mjs";
30
31
  import { TextInputAdapter } from "./text-input.mjs";
@@ -59,15 +60,17 @@ const defaultAdapters = {
59
60
  prompt_input: PromptInputAdapter,
60
61
  template_input: TemplateInputAdapter,
61
62
  tagged_text_input: TaggedTextInputAdapter,
62
- key_value_list_input: KeyValueListInputAdapter,
63
+ loose_object_input: LooseObjectInputAdapter,
63
64
  json_schema_input: JsonSchemaInputAdapter,
64
65
  json_extraction_input: JsonExtractionInputAdapter,
65
66
  pipes_run_if_input: PipesRunIfInputAdapter,
67
+ condition_block_input: ConditionBlockInputAdapter,
66
68
  connector_input: ConnectorInputAdapter,
67
69
  providers_input: ProvidersInputAdapter,
68
70
  fields_select_input: FieldsSelectInputAdapter,
69
71
  output_field_input: OutputFieldInputAdapter,
70
- cursor_pagination_metadata: CursorPaginationInputAdapter
72
+ cursor_pagination_metadata: CursorPaginationInputAdapter,
73
+ search_payload_input: SearchPayloadInputAdapter
71
74
  };
72
75
 
73
76
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"sourcesContent":["import type { FieldAdapterMap } from \"../../../types/adapters.js\";\nimport { AsyncIncludeExcludeSelectInputAdapter } from \"./async-include-exclude-select-input.js\";\nimport { AsyncMultiSelectInputAdapter } from \"./async-multi-select-input.js\";\nimport { BooleanInputAdapter } from \"./boolean-input.js\";\nimport { ConnectorInputAdapter } from \"./connector-input.js\";\nimport { ContextSelectInputAdapter } from \"./context-select-input.js\";\nimport { CursorPaginationInputAdapter } from \"./cursor-pagination-input.js\";\nimport { DateRangeInputAdapter } from \"./date-range-input.js\";\nimport { ExactRangeInputAdapter } from \"./exact-range-input.js\";\nimport { FieldsSelectInputAdapter } from \"./fields-select-input.js\";\nimport { IncludeExcludeInputAdapter } from \"./include-exclude-input.js\";\nimport { IncludeExcludeSelectInputAdapter } from \"./include-exclude-select-input.js\";\nimport { IntInputAdapter } from \"./int-input.js\";\nimport { JsonExtractionInputAdapter } from \"./json-extraction-input.js\";\nimport { JsonSchemaInputAdapter } from \"./json-schema-input.js\";\nimport { KeyValueListInputAdapter } from \"./key-value-list-input.js\";\nimport { MinMaxIntInputAdapter } from \"./min-max-int-input.js\";\nimport { MultiCreateInputAdapter } from \"./multi-create-input.js\";\nimport { MultiSelectInputAdapter } from \"./multi-select-input.js\";\nimport { NumberInputAdapter } from \"./number-input.js\";\nimport { OrderedMultiCreateInputAdapter } from \"./ordered-multi-create-input.js\";\nimport { TaggedOrderedMultiCreateInputAdapter } from \"./tagged-ordered-multi-create-input.js\";\nimport { OutputFieldInputAdapter } from \"./output-field-input.js\";\nimport { PipesRunIfInputAdapter } from \"./pipes-run-if-input.js\";\nimport { PromptInputAdapter } from \"./prompt-input.js\";\nimport { ProvidersInputAdapter } from \"./providers-input.js\";\nimport { RangeInputAdapter } from \"./range-input.js\";\nimport { SelectInputAdapter } from \"./select-input.js\";\nimport { TaggedTextInputAdapter } from \"./tagged-text-input.js\";\nimport { TemplateInputAdapter } from \"./template-input.js\";\nimport { TextInputAdapter } from \"./text-input.js\";\nimport { TextareaInputAdapter } from \"./textarea-input.js\";\n\n/**\n * Default field adapters for all known field kinds.\n * Users can override any of these via `<FormProvider adapters={...}>`.\n */\nexport const defaultAdapters = {\n text_input: TextInputAdapter,\n textarea_input: TextareaInputAdapter,\n int_input: IntInputAdapter,\n number_input: NumberInputAdapter,\n select_input: SelectInputAdapter,\n boolean_input: BooleanInputAdapter,\n nullable_boolean_input: BooleanInputAdapter,\n range_input: RangeInputAdapter,\n date_range_input: DateRangeInputAdapter,\n multi_select_input: MultiSelectInputAdapter,\n include_exclude_input: IncludeExcludeInputAdapter,\n multi_create_input: MultiCreateInputAdapter,\n context_select_input: ContextSelectInputAdapter,\n async_multi_select_input: AsyncMultiSelectInputAdapter,\n async_include_exclude_select_input: AsyncIncludeExcludeSelectInputAdapter,\n include_exclude_select_input: IncludeExcludeSelectInputAdapter,\n exact_range_input: ExactRangeInputAdapter,\n min_max_int_input: MinMaxIntInputAdapter,\n ordered_multi_create_input: OrderedMultiCreateInputAdapter,\n tagged_ordered_multi_create_input: TaggedOrderedMultiCreateInputAdapter,\n prompt_input: PromptInputAdapter,\n template_input: TemplateInputAdapter,\n tagged_text_input: TaggedTextInputAdapter,\n key_value_list_input: KeyValueListInputAdapter,\n json_schema_input: JsonSchemaInputAdapter,\n json_extraction_input: JsonExtractionInputAdapter,\n pipes_run_if_input: PipesRunIfInputAdapter,\n connector_input: ConnectorInputAdapter,\n providers_input: ProvidersInputAdapter,\n fields_select_input: FieldsSelectInputAdapter,\n output_field_input: OutputFieldInputAdapter,\n cursor_pagination_metadata: CursorPaginationInputAdapter,\n} satisfies Partial<FieldAdapterMap> as Partial<FieldAdapterMap>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAa,kBAAkB;CAC7B,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;CACd,eAAe;CACf,wBAAwB;CACxB,aAAa;CACb,kBAAkB;CAClB,oBAAoB;CACpB,uBAAuB;CACvB,oBAAoB;CACpB,sBAAsB;CACtB,0BAA0B;CAC1B,oCAAoC;CACpC,8BAA8B;CAC9B,mBAAmB;CACnB,mBAAmB;CACnB,4BAA4B;CAC5B,mCAAmC;CACnC,cAAc;CACd,gBAAgB;CAChB,mBAAmB;CACnB,sBAAsB;CACtB,mBAAmB;CACnB,uBAAuB;CACvB,oBAAoB;CACpB,iBAAiB;CACjB,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,4BAA4B;CAC7B"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"sourcesContent":["import type { FieldAdapterMap } from \"../../../types/adapters.js\";\nimport { AsyncIncludeExcludeSelectInputAdapter } from \"./async-include-exclude-select-input.js\";\nimport { AsyncMultiSelectInputAdapter } from \"./async-multi-select-input.js\";\nimport { BooleanInputAdapter } from \"./boolean-input.js\";\nimport { ConnectorInputAdapter } from \"./connector-input.js\";\nimport { ContextSelectInputAdapter } from \"./context-select-input.js\";\nimport { CursorPaginationInputAdapter } from \"./cursor-pagination-input.js\";\nimport { DateRangeInputAdapter } from \"./date-range-input.js\";\nimport { ExactRangeInputAdapter } from \"./exact-range-input.js\";\nimport { FieldsSelectInputAdapter } from \"./fields-select-input.js\";\nimport { IncludeExcludeInputAdapter } from \"./include-exclude-input.js\";\nimport { IncludeExcludeSelectInputAdapter } from \"./include-exclude-select-input.js\";\nimport { IntInputAdapter } from \"./int-input.js\";\nimport { JsonExtractionInputAdapter } from \"./json-extraction-input.js\";\nimport { JsonSchemaInputAdapter } from \"./json-schema-input.js\";\nimport { LooseObjectInputAdapter } from \"./loose-object-input.js\";\nimport { MinMaxIntInputAdapter } from \"./min-max-int-input.js\";\nimport { MultiCreateInputAdapter } from \"./multi-create-input.js\";\nimport { MultiSelectInputAdapter } from \"./multi-select-input.js\";\nimport { NumberInputAdapter } from \"./number-input.js\";\nimport { OrderedMultiCreateInputAdapter } from \"./ordered-multi-create-input.js\";\nimport { OutputFieldInputAdapter } from \"./output-field-input.js\";\nimport { ConditionBlockInputAdapter, PipesRunIfInputAdapter } from \"./pipes-run-if-input.js\";\nimport { PromptInputAdapter } from \"./prompt-input.js\";\nimport { ProvidersInputAdapter } from \"./providers-input.js\";\nimport { RangeInputAdapter } from \"./range-input.js\";\nimport { SearchPayloadInputAdapter } from \"./search-payload-input.js\";\nimport { SelectInputAdapter } from \"./select-input.js\";\nimport { TaggedOrderedMultiCreateInputAdapter } from \"./tagged-ordered-multi-create-input.js\";\nimport { TaggedTextInputAdapter } from \"./tagged-text-input.js\";\nimport { TemplateInputAdapter } from \"./template-input.js\";\nimport { TextInputAdapter } from \"./text-input.js\";\nimport { TextareaInputAdapter } from \"./textarea-input.js\";\n\n/**\n * Default field adapters for all known field kinds.\n * Users can override any of these via `<FormProvider adapters={...}>`.\n */\nexport const defaultAdapters = {\n text_input: TextInputAdapter,\n textarea_input: TextareaInputAdapter,\n int_input: IntInputAdapter,\n number_input: NumberInputAdapter,\n select_input: SelectInputAdapter,\n boolean_input: BooleanInputAdapter,\n nullable_boolean_input: BooleanInputAdapter,\n range_input: RangeInputAdapter,\n date_range_input: DateRangeInputAdapter,\n multi_select_input: MultiSelectInputAdapter,\n include_exclude_input: IncludeExcludeInputAdapter,\n multi_create_input: MultiCreateInputAdapter,\n context_select_input: ContextSelectInputAdapter,\n async_multi_select_input: AsyncMultiSelectInputAdapter,\n async_include_exclude_select_input: AsyncIncludeExcludeSelectInputAdapter,\n include_exclude_select_input: IncludeExcludeSelectInputAdapter,\n exact_range_input: ExactRangeInputAdapter,\n min_max_int_input: MinMaxIntInputAdapter,\n ordered_multi_create_input: OrderedMultiCreateInputAdapter,\n tagged_ordered_multi_create_input: TaggedOrderedMultiCreateInputAdapter,\n prompt_input: PromptInputAdapter,\n template_input: TemplateInputAdapter,\n tagged_text_input: TaggedTextInputAdapter,\n loose_object_input: LooseObjectInputAdapter,\n json_schema_input: JsonSchemaInputAdapter,\n json_extraction_input: JsonExtractionInputAdapter,\n pipes_run_if_input: PipesRunIfInputAdapter,\n condition_block_input: ConditionBlockInputAdapter,\n connector_input: ConnectorInputAdapter,\n providers_input: ProvidersInputAdapter,\n fields_select_input: FieldsSelectInputAdapter,\n output_field_input: OutputFieldInputAdapter,\n cursor_pagination_metadata: CursorPaginationInputAdapter,\n // Renders nothing by default — consumers (e.g. apps/dash) override this.\n search_payload_input: SearchPayloadInputAdapter,\n} satisfies Partial<FieldAdapterMap> as Partial<FieldAdapterMap>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAa,kBAAkB;CAC7B,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;CACd,eAAe;CACf,wBAAwB;CACxB,aAAa;CACb,kBAAkB;CAClB,oBAAoB;CACpB,uBAAuB;CACvB,oBAAoB;CACpB,sBAAsB;CACtB,0BAA0B;CAC1B,oCAAoC;CACpC,8BAA8B;CAC9B,mBAAmB;CACnB,mBAAmB;CACnB,4BAA4B;CAC5B,mCAAmC;CACnC,cAAc;CACd,gBAAgB;CAChB,mBAAmB;CACnB,oBAAoB;CACpB,mBAAmB;CACnB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,qBAAqB;CACrB,oBAAoB;CACpB,4BAA4B;CAE5B,sBAAsB;CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"int-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/int-input.tsx"],"sourcesContent":["import type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { Input } from \"../../ui/input.js\";\n\nexport function IntInputAdapter(field: FieldHandle<\"int_input\">) {\n return <Input {...field.inputProps} step={1} data-p0=\"input\" aria-invalid={!!field.error} />;\n}\n"],"mappings":";;;;AAGA,SAAgB,gBAAgB,OAAiC;AAC/D,QAAO,oBAAC,OAAD;EAAO,GAAI,MAAM;EAAY,MAAM;EAAG,WAAQ;EAAQ,gBAAc,CAAC,CAAC,MAAM;EAAS"}
1
+ {"version":3,"file":"int-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/int-input.tsx"],"sourcesContent":["import type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { Input } from \"../../ui/input.js\";\n\nexport function IntInputAdapter(field: FieldHandle<\"int_input\">) {\n // Optional ints (`sheetEffectsOptionalIntInput`) clear themselves: the int\n // handle maps an empty input to `null`, so no extra affordance is needed.\n return <Input {...field.inputProps} step={1} data-p0=\"input\" aria-invalid={!!field.error} />;\n}\n"],"mappings":";;;;AAGA,SAAgB,gBAAgB,OAAiC;AAG/D,QAAO,oBAAC,OAAD;EAAO,GAAI,MAAM;EAAY,MAAM;EAAG,WAAQ;EAAQ,gBAAc,CAAC,CAAC,MAAM;EAAS"}
@@ -0,0 +1,111 @@
1
+ import { Button } from "../../ui/button.mjs";
2
+ import { Input } from "../../ui/input.mjs";
3
+ import { FieldLegend } from "../../internal/field-legend.mjs";
4
+ import { LiquidEditor } from "../../internal/LiquidEditor/LiquidEditor.mjs";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Plus, X } from "lucide-react";
7
+
8
+ //#region src/components/defaults/adapters/loose-object-input.tsx
9
+ /**
10
+ * Adapter for `pipesLooseObjectInput`. The form value is a plain
11
+ * `Record<string, string>`; each entry renders as a row. The key is the
12
+ * object key, so it's a literal text input (committed on blur, which is when
13
+ * the row's React key — the object key — changes). The value cell uses
14
+ * `LiquidEditor` so it supports `/` references (input fields + secrets +
15
+ * constants). Empty and duplicate keys aren't meaningful for an object and
16
+ * aren't supported; `maxKeys` bounds the number of entries.
17
+ *
18
+ * The per-cell legend would otherwise render once per value cell — too noisy.
19
+ * The value editors run with `hideLegend`; a single legend renders below the
20
+ * list.
21
+ */
22
+ function LooseObjectInputAdapter(field) {
23
+ const { value, setObject, searchSecrets, searchConstants, meta } = field;
24
+ const entries = Object.entries(value);
25
+ const maxKeys = meta.maxKeys ?? 50;
26
+ const canAdd = entries.length < maxKeys;
27
+ const renameKey = (oldKey, newKey) => {
28
+ if (newKey === oldKey) return;
29
+ const next = {};
30
+ for (const [k, v] of Object.entries(value)) next[k === oldKey ? newKey : k] = v;
31
+ setObject(next);
32
+ };
33
+ const setEntryValue = (key, v) => setObject({
34
+ ...value,
35
+ [key]: v
36
+ });
37
+ const removeKey = (key) => {
38
+ const { [key]: _removed, ...rest } = value;
39
+ setObject(rest);
40
+ };
41
+ const addEntry = () => {
42
+ if (Object.hasOwn(value, "")) return;
43
+ setObject({
44
+ ...value,
45
+ "": ""
46
+ });
47
+ };
48
+ return /* @__PURE__ */ jsxs("div", {
49
+ "data-p0": "input",
50
+ className: "pz:flex pz:flex-col pz:gap-2",
51
+ children: [
52
+ entries.length === 0 && /* @__PURE__ */ jsx("p", {
53
+ className: "pz:text-xs pz:text-muted-foreground",
54
+ children: meta.keyLabel ? `No ${meta.keyLabel.toLowerCase()}s yet.` : "No entries yet."
55
+ }),
56
+ entries.map(([key, val]) => /* @__PURE__ */ jsxs("div", {
57
+ className: "pz:flex pz:items-start pz:gap-2",
58
+ children: [
59
+ /* @__PURE__ */ jsx("div", {
60
+ className: "pz:basis-1/3",
61
+ children: /* @__PURE__ */ jsx(Input, {
62
+ defaultValue: key,
63
+ onBlur: (e) => renameKey(key, e.target.value),
64
+ placeholder: meta.keyPlaceholder ?? meta.keyLabel ?? "Key"
65
+ })
66
+ }),
67
+ /* @__PURE__ */ jsx("div", {
68
+ className: "pz:flex-1 pz:rounded-md pz:border pz:border-input pz:bg-transparent",
69
+ children: /* @__PURE__ */ jsx(LiquidEditor, {
70
+ value: val,
71
+ onChange: (v) => setEntryValue(key, v),
72
+ inputFields: meta.inputFields ?? [],
73
+ searchSecrets,
74
+ searchConstants,
75
+ placeholder: meta.valuePlaceholder ?? meta.valueLabel ?? "Value",
76
+ hideLegend: true
77
+ })
78
+ }),
79
+ /* @__PURE__ */ jsx(Button, {
80
+ type: "button",
81
+ variant: "ghost",
82
+ size: "icon",
83
+ "aria-label": "Remove row",
84
+ onClick: () => removeKey(key),
85
+ children: /* @__PURE__ */ jsx(X, { className: "pz:size-4" })
86
+ })
87
+ ]
88
+ }, key)),
89
+ entries.length > 0 && /* @__PURE__ */ jsx(FieldLegend, { entries: [{
90
+ key: "/",
91
+ label: "to insert a reference"
92
+ }] }),
93
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(Button, {
94
+ type: "button",
95
+ variant: "outline",
96
+ size: "sm",
97
+ onClick: addEntry,
98
+ disabled: !canAdd,
99
+ children: [
100
+ /* @__PURE__ */ jsx(Plus, { className: "pz:size-4 pz:mr-1" }),
101
+ "Add ",
102
+ meta.keyLabel ?? "row"
103
+ ]
104
+ }) })
105
+ ]
106
+ });
107
+ }
108
+
109
+ //#endregion
110
+ export { LooseObjectInputAdapter };
111
+ //# sourceMappingURL=loose-object-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loose-object-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/loose-object-input.tsx"],"sourcesContent":["import { Plus, X } from \"lucide-react\";\nimport type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { FieldLegend } from \"../../internal/field-legend.js\";\nimport { LiquidEditor } from \"../../internal/LiquidEditor/LiquidEditor.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\n\n/**\n * Adapter for `pipesLooseObjectInput`. The form value is a plain\n * `Record<string, string>`; each entry renders as a row. The key is the\n * object key, so it's a literal text input (committed on blur, which is when\n * the row's React key — the object key — changes). The value cell uses\n * `LiquidEditor` so it supports `/` references (input fields + secrets +\n * constants). Empty and duplicate keys aren't meaningful for an object and\n * aren't supported; `maxKeys` bounds the number of entries.\n *\n * The per-cell legend would otherwise render once per value cell — too noisy.\n * The value editors run with `hideLegend`; a single legend renders below the\n * list.\n */\nexport function LooseObjectInputAdapter(field: FieldHandle<\"loose_object_input\">) {\n const { value, setObject, searchSecrets, searchConstants, meta } = field;\n const entries = Object.entries(value);\n const maxKeys = meta.maxKeys ?? 50;\n const canAdd = entries.length < maxKeys;\n\n // Rebuild the object, renaming `oldKey`→`newKey` in place (order preserved).\n const renameKey = (oldKey: string, newKey: string) => {\n if (newKey === oldKey) return;\n const next: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) next[k === oldKey ? newKey : k] = v;\n setObject(next);\n };\n const setEntryValue = (key: string, v: string) => setObject({ ...value, [key]: v });\n const removeKey = (key: string) => {\n const { [key]: _removed, ...rest } = value;\n setObject(rest);\n };\n // One blank slot at a time — fill its key before adding another.\n const addEntry = () => {\n if (Object.hasOwn(value, \"\")) return;\n setObject({ ...value, \"\": \"\" });\n };\n\n return (\n <div data-p0=\"input\" className=\"pz:flex pz:flex-col pz:gap-2\">\n {entries.length === 0 && (\n <p className=\"pz:text-xs pz:text-muted-foreground\">\n {meta.keyLabel ? `No ${meta.keyLabel.toLowerCase()}s yet.` : \"No entries yet.\"}\n </p>\n )}\n {entries.map(([key, val]) => (\n <div key={key} className=\"pz:flex pz:items-start pz:gap-2\">\n <div className=\"pz:basis-1/3\">\n <Input\n defaultValue={key}\n onBlur={(e) => renameKey(key, e.target.value)}\n placeholder={meta.keyPlaceholder ?? meta.keyLabel ?? \"Key\"}\n />\n </div>\n <div className=\"pz:flex-1 pz:rounded-md pz:border pz:border-input pz:bg-transparent\">\n <LiquidEditor\n value={val}\n onChange={(v) => setEntryValue(key, v)}\n inputFields={meta.inputFields ?? []}\n searchSecrets={searchSecrets}\n searchConstants={searchConstants}\n placeholder={meta.valuePlaceholder ?? meta.valueLabel ?? \"Value\"}\n hideLegend\n />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Remove row\"\n onClick={() => removeKey(key)}\n >\n <X className=\"pz:size-4\" />\n </Button>\n </div>\n ))}\n {entries.length > 0 && (\n <FieldLegend entries={[{ key: \"/\", label: \"to insert a reference\" }]} />\n )}\n <div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addEntry} disabled={!canAdd}>\n <Plus className=\"pz:size-4 pz:mr-1\" />\n Add {meta.keyLabel ?? \"row\"}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,wBAAwB,OAA0C;CAChF,MAAM,EAAE,OAAO,WAAW,eAAe,iBAAiB,SAAS;CACnE,MAAM,UAAU,OAAO,QAAQ,MAAM;CACrC,MAAM,UAAU,KAAK,WAAW;CAChC,MAAM,SAAS,QAAQ,SAAS;CAGhC,MAAM,aAAa,QAAgB,WAAmB;AACpD,MAAI,WAAW,OAAQ;EACvB,MAAM,OAA+B,EAAE;AACvC,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,CAAE,MAAK,MAAM,SAAS,SAAS,KAAK;AAC9E,YAAU,KAAK;;CAEjB,MAAM,iBAAiB,KAAa,MAAc,UAAU;EAAE,GAAG;GAAQ,MAAM;EAAG,CAAC;CACnF,MAAM,aAAa,QAAgB;EACjC,MAAM,GAAG,MAAM,UAAU,GAAG,SAAS;AACrC,YAAU,KAAK;;CAGjB,MAAM,iBAAiB;AACrB,MAAI,OAAO,OAAO,OAAO,GAAG,CAAE;AAC9B,YAAU;GAAE,GAAG;GAAO,IAAI;GAAI,CAAC;;AAGjC,QACE,qBAAC,OAAD;EAAK,WAAQ;EAAQ,WAAU;YAA/B;GACG,QAAQ,WAAW,KAClB,oBAAC,KAAD;IAAG,WAAU;cACV,KAAK,WAAW,MAAM,KAAK,SAAS,aAAa,CAAC,UAAU;IAC3D;GAEL,QAAQ,KAAK,CAAC,KAAK,SAClB,qBAAC,OAAD;IAAe,WAAU;cAAzB;KACE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,OAAD;OACE,cAAc;OACd,SAAS,MAAM,UAAU,KAAK,EAAE,OAAO,MAAM;OAC7C,aAAa,KAAK,kBAAkB,KAAK,YAAY;OACrD;MACE;KACN,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,cAAD;OACE,OAAO;OACP,WAAW,MAAM,cAAc,KAAK,EAAE;OACtC,aAAa,KAAK,eAAe,EAAE;OACpB;OACE;OACjB,aAAa,KAAK,oBAAoB,KAAK,cAAc;OACzD;OACA;MACE;KACN,oBAAC,QAAD;MACE,MAAK;MACL,SAAQ;MACR,MAAK;MACL,cAAW;MACX,eAAe,UAAU,IAAI;gBAE7B,oBAAC,GAAD,EAAG,WAAU,aAAc;MACpB;KACL;MA5BI,IA4BJ,CACN;GACD,QAAQ,SAAS,KAChB,oBAAC,aAAD,EAAa,SAAS,CAAC;IAAE,KAAK;IAAK,OAAO;IAAyB,CAAC,EAAI;GAE1E,oBAAC,OAAD,YACE,qBAAC,QAAD;IAAQ,MAAK;IAAS,SAAQ;IAAU,MAAK;IAAK,SAAS;IAAU,UAAU,CAAC;cAAhF;KACE,oBAAC,MAAD,EAAM,WAAU,qBAAsB;;KACjC,KAAK,YAAY;KACf;OACL;GACF"}