@flanksource/clicky-ui 0.2.8 → 0.2.10
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/dist/components/Combobox.cjs +89 -49
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +3 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +91 -51
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/FilterBar.cjs +42 -44
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +19 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +43 -45
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +48 -0
- package/dist/components/JsonSchemaForm.cjs.map +1 -0
- package/dist/components/JsonSchemaForm.d.ts +3 -0
- package/dist/components/JsonSchemaForm.d.ts.map +1 -0
- package/dist/components/JsonSchemaForm.js +48 -0
- package/dist/components/JsonSchemaForm.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +169 -0
- package/dist/components/json-schema-form-array.cjs.map +1 -0
- package/dist/components/json-schema-form-array.d.ts +8 -0
- package/dist/components/json-schema-form-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-array.js +169 -0
- package/dist/components/json-schema-form-array.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +374 -0
- package/dist/components/json-schema-form-fields.cjs.map +1 -0
- package/dist/components/json-schema-form-fields.d.ts +19 -0
- package/dist/components/json-schema-form-fields.d.ts.map +1 -0
- package/dist/components/json-schema-form-fields.js +374 -0
- package/dist/components/json-schema-form-fields.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +154 -0
- package/dist/components/json-schema-form-render.cjs.map +1 -0
- package/dist/components/json-schema-form-render.d.ts +40 -0
- package/dist/components/json-schema-form-render.d.ts.map +1 -0
- package/dist/components/json-schema-form-render.js +154 -0
- package/dist/components/json-schema-form-render.js.map +1 -0
- package/dist/components/json-schema-form-resolve.cjs +121 -0
- package/dist/components/json-schema-form-resolve.cjs.map +1 -0
- package/dist/components/json-schema-form-resolve.d.ts +19 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -0
- package/dist/components/json-schema-form-resolve.js +121 -0
- package/dist/components/json-schema-form-resolve.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +124 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -0
- package/dist/components.cjs +7 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +8 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +1 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +1 -1
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +16 -15
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +2 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +16 -15
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Icon.cjs +11 -0
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.d.ts +12 -1
- package/dist/data/Icon.d.ts.map +1 -1
- package/dist/data/Icon.js +12 -1
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +277 -0
- package/dist/data/LogDetails.cjs.map +1 -0
- package/dist/data/LogDetails.d.ts +5 -0
- package/dist/data/LogDetails.d.ts.map +1 -0
- package/dist/data/LogDetails.js +277 -0
- package/dist/data/LogDetails.js.map +1 -0
- package/dist/data/LogsTable.cjs +6 -202
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +4 -200
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/Properties.cjs +2 -2
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.js +2 -2
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/cells/TagList.cjs +19 -3
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +11 -1
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +19 -3
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +17 -2
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +2 -0
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +17 -2
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/log-utils.cjs +7 -0
- package/dist/data/log-utils.cjs.map +1 -0
- package/dist/data/log-utils.d.ts +2 -0
- package/dist/data/log-utils.d.ts.map +1 -0
- package/dist/data/log-utils.js +7 -0
- package/dist/data/log-utils.js.map +1 -0
- package/dist/data.cjs +3 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +2 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +5 -2
- package/dist/index.cjs +13 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +3 -2
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +3 -2
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionDialog.cjs +1 -1
- package/dist/rpc/OperationActionDialog.cjs.map +1 -1
- package/dist/rpc/OperationActionDialog.js +1 -1
- package/dist/rpc/OperationActionDialog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +21 -14
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +21 -14
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/apiClient.cjs +316 -0
- package/dist/rpc/apiClient.cjs.map +1 -0
- package/dist/rpc/apiClient.d.ts +44 -0
- package/dist/rpc/apiClient.d.ts.map +1 -0
- package/dist/rpc/apiClient.js +316 -0
- package/dist/rpc/apiClient.js.map +1 -0
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +2 -1
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.cjs +3 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +3 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
require("react");
|
|
5
|
+
const utils = require("../lib/utils.cjs");
|
|
6
|
+
const Icon = require("../data/Icon.cjs");
|
|
7
|
+
const Timestamp = require("../data/cells/Timestamp.cjs");
|
|
8
|
+
const button = require("./button.cjs");
|
|
9
|
+
const Combobox = require("./Combobox.cjs");
|
|
10
|
+
const DateTimePicker = require("./DateTimePicker.cjs");
|
|
11
|
+
const jsonSchemaFormArray = require("./json-schema-form-array.cjs");
|
|
12
|
+
const jsonSchemaFormRender = require("./json-schema-form-render.cjs");
|
|
13
|
+
const UiTrash = require("../icons/components/UiTrash.cjs");
|
|
14
|
+
const UiAdd = require("../icons/components/UiAdd.cjs");
|
|
15
|
+
const inputClassName = "h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring";
|
|
16
|
+
function FieldWrapper({
|
|
17
|
+
label,
|
|
18
|
+
value,
|
|
19
|
+
helper,
|
|
20
|
+
error,
|
|
21
|
+
layout
|
|
22
|
+
}) {
|
|
23
|
+
if (layout.mode === "inline") {
|
|
24
|
+
const labelMaxWidth = layout.labelMaxWidth ?? "40ch";
|
|
25
|
+
const valueMaxWidth = layout.valueMaxWidth ?? "400px";
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: "grid items-start gap-x-3 gap-y-0.5",
|
|
30
|
+
style: { gridTemplateColumns: `minmax(0, ${labelMaxWidth}) minmax(0, ${valueMaxWidth})` },
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-9 min-w-0 items-center", children: label }),
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: value }),
|
|
34
|
+
helper && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "col-start-2 text-xs text-muted-foreground", children: helper }),
|
|
35
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "col-start-2 text-xs text-destructive", children: error })
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
41
|
+
label,
|
|
42
|
+
value,
|
|
43
|
+
helper && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: helper }),
|
|
44
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-destructive", children: error })
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
function FieldLabel({ field, fieldId }) {
|
|
48
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: fieldId, className: "flex items-center gap-2 text-sm font-medium", children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.LabelIcon, { icon: field.labelIcon, className: "text-[15px] text-muted-foreground" }),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { title: field.label !== field.key ? field.key : void 0, children: field.label }),
|
|
51
|
+
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive", children: "*" }),
|
|
52
|
+
field.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground", children: field.badge })
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
function fieldInputId(key) {
|
|
56
|
+
return `jsf-${key.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
|
|
57
|
+
}
|
|
58
|
+
function renderValueControl(field, ctx) {
|
|
59
|
+
const fieldId = fieldInputId(field.key);
|
|
60
|
+
if (field.readOnly && field.kind !== "array" && field.kind !== "object" && field.kind !== "string-map") {
|
|
61
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ReadOnlyValue, { field, fieldId });
|
|
62
|
+
}
|
|
63
|
+
const readOnly = ctx.readOnly;
|
|
64
|
+
switch (field.kind) {
|
|
65
|
+
case "enum":
|
|
66
|
+
return /* @__PURE__ */ jsxRuntime.jsx(EnumControl, { field, fieldId, readOnly });
|
|
67
|
+
case "boolean":
|
|
68
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BooleanControl, { field, fieldId, readOnly });
|
|
69
|
+
case "number":
|
|
70
|
+
return /* @__PURE__ */ jsxRuntime.jsx(NumberControl, { field, fieldId, readOnly });
|
|
71
|
+
case "date":
|
|
72
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DateControl, { field, fieldId, readOnly });
|
|
73
|
+
case "array":
|
|
74
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormArray.ArrayControl, { field, fieldId, ctx });
|
|
75
|
+
case "object":
|
|
76
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ObjectControl, { field, ctx });
|
|
77
|
+
case "string-map":
|
|
78
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StringMapControl, { field, ctx });
|
|
79
|
+
default:
|
|
80
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StringControl, { field, fieldId, readOnly });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function ReadOnlyValue({ field, fieldId }) {
|
|
84
|
+
const text = toText(field.value);
|
|
85
|
+
const display = field.kind === "date" && text ? Timestamp.formatDateTimeRelative(text) : text;
|
|
86
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
87
|
+
"span",
|
|
88
|
+
{
|
|
89
|
+
id: fieldId,
|
|
90
|
+
"data-jsf-input": true,
|
|
91
|
+
"data-jsf-readonly": true,
|
|
92
|
+
className: "flex h-9 items-center text-sm text-foreground",
|
|
93
|
+
title: text || void 0,
|
|
94
|
+
children: display || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "—" })
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function StringControl({
|
|
99
|
+
field,
|
|
100
|
+
fieldId,
|
|
101
|
+
readOnly
|
|
102
|
+
}) {
|
|
103
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
104
|
+
"input",
|
|
105
|
+
{
|
|
106
|
+
id: fieldId,
|
|
107
|
+
type: "text",
|
|
108
|
+
"data-jsf-input": true,
|
|
109
|
+
className: inputClassName,
|
|
110
|
+
value: toText(field.value),
|
|
111
|
+
disabled: readOnly,
|
|
112
|
+
placeholder: defaultPlaceholder(field.schema),
|
|
113
|
+
onChange: (e) => field.onChange(e.target.value)
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
function NumberControl({
|
|
118
|
+
field,
|
|
119
|
+
fieldId,
|
|
120
|
+
readOnly
|
|
121
|
+
}) {
|
|
122
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
123
|
+
"input",
|
|
124
|
+
{
|
|
125
|
+
id: fieldId,
|
|
126
|
+
type: "text",
|
|
127
|
+
inputMode: "decimal",
|
|
128
|
+
"data-jsf-input": true,
|
|
129
|
+
className: inputClassName,
|
|
130
|
+
value: toText(field.value),
|
|
131
|
+
disabled: readOnly,
|
|
132
|
+
placeholder: defaultPlaceholder(field.schema),
|
|
133
|
+
onChange: (e) => {
|
|
134
|
+
const raw = e.target.value;
|
|
135
|
+
const coerce = field.coerceNumber !== false;
|
|
136
|
+
if (coerce && raw.trim() !== "" && Number.isFinite(Number(raw))) {
|
|
137
|
+
field.onChange(Number(raw));
|
|
138
|
+
} else {
|
|
139
|
+
field.onChange(raw);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
function DateControl({
|
|
146
|
+
field,
|
|
147
|
+
fieldId,
|
|
148
|
+
readOnly
|
|
149
|
+
}) {
|
|
150
|
+
const text = toText(field.value);
|
|
151
|
+
if (readOnly) {
|
|
152
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
153
|
+
"div",
|
|
154
|
+
{
|
|
155
|
+
id: fieldId,
|
|
156
|
+
"data-jsf-input": true,
|
|
157
|
+
className: "flex h-9 items-center text-sm text-foreground",
|
|
158
|
+
title: text || void 0,
|
|
159
|
+
children: text ? Timestamp.formatDateTimeRelative(text) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "—" })
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
164
|
+
DateTimePicker.DateTimePicker,
|
|
165
|
+
{
|
|
166
|
+
id: fieldId,
|
|
167
|
+
"aria-label": field.label,
|
|
168
|
+
"data-jsf-input": true,
|
|
169
|
+
inputClassName: utils.cn(inputClassName, "pr-8"),
|
|
170
|
+
value: text,
|
|
171
|
+
onChange: (next) => field.onChange(next),
|
|
172
|
+
placeholder: defaultPlaceholder(field.schema)
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
function BooleanControl({
|
|
177
|
+
field,
|
|
178
|
+
fieldId,
|
|
179
|
+
readOnly
|
|
180
|
+
}) {
|
|
181
|
+
if (typeof field.value === "boolean" || field.value === void 0 || field.value === null) {
|
|
182
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-9 items-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
183
|
+
"input",
|
|
184
|
+
{
|
|
185
|
+
id: fieldId,
|
|
186
|
+
type: "checkbox",
|
|
187
|
+
className: "h-4 w-4 accent-primary",
|
|
188
|
+
checked: field.value === true,
|
|
189
|
+
disabled: readOnly,
|
|
190
|
+
onChange: (e) => field.onChange(e.target.checked)
|
|
191
|
+
}
|
|
192
|
+
) });
|
|
193
|
+
}
|
|
194
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StringControl, { field, fieldId, readOnly });
|
|
195
|
+
}
|
|
196
|
+
function EnumControl({
|
|
197
|
+
field,
|
|
198
|
+
fieldId,
|
|
199
|
+
readOnly
|
|
200
|
+
}) {
|
|
201
|
+
const value = toText(field.value);
|
|
202
|
+
const options = withSyntheticValue(field.options ?? [], value);
|
|
203
|
+
if (field.display === "radio") {
|
|
204
|
+
return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupControl, { field, fieldId, readOnly, options, value });
|
|
205
|
+
}
|
|
206
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
207
|
+
Combobox.Combobox,
|
|
208
|
+
{
|
|
209
|
+
id: fieldId,
|
|
210
|
+
options,
|
|
211
|
+
value,
|
|
212
|
+
disabled: readOnly,
|
|
213
|
+
allowCustomValue: field.allowCustomValue ?? false,
|
|
214
|
+
onChange: (v) => field.onChange(v),
|
|
215
|
+
...defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {}
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
function RadioGroupControl({
|
|
220
|
+
field,
|
|
221
|
+
fieldId,
|
|
222
|
+
readOnly,
|
|
223
|
+
options,
|
|
224
|
+
value
|
|
225
|
+
}) {
|
|
226
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
227
|
+
"div",
|
|
228
|
+
{
|
|
229
|
+
role: "radiogroup",
|
|
230
|
+
"aria-label": field.label,
|
|
231
|
+
id: fieldId,
|
|
232
|
+
"data-jsf-input": true,
|
|
233
|
+
className: "inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5",
|
|
234
|
+
children: options.map((opt) => {
|
|
235
|
+
const checked = opt.value === value;
|
|
236
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
237
|
+
"label",
|
|
238
|
+
{
|
|
239
|
+
className: utils.cn(
|
|
240
|
+
"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1 text-sm",
|
|
241
|
+
checked ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
242
|
+
readOnly && "cursor-not-allowed opacity-60"
|
|
243
|
+
),
|
|
244
|
+
children: [
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
246
|
+
"input",
|
|
247
|
+
{
|
|
248
|
+
type: "radio",
|
|
249
|
+
name: fieldId,
|
|
250
|
+
className: "sr-only",
|
|
251
|
+
value: opt.value,
|
|
252
|
+
checked,
|
|
253
|
+
disabled: readOnly,
|
|
254
|
+
onChange: () => field.onChange(opt.value)
|
|
255
|
+
}
|
|
256
|
+
),
|
|
257
|
+
opt.label
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
opt.value
|
|
261
|
+
);
|
|
262
|
+
})
|
|
263
|
+
}
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
function ObjectControl({ field, ctx }) {
|
|
267
|
+
const obj = isPlainObject(field.value) ? field.value : {};
|
|
268
|
+
const subSchema = {
|
|
269
|
+
properties: field.objectProperties ?? {},
|
|
270
|
+
...field.objectRequired ? { required: field.objectRequired } : {},
|
|
271
|
+
...Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {}
|
|
272
|
+
};
|
|
273
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: jsonSchemaFormRender.renderObjectFields(subSchema, obj, (next) => field.onChange(next), {
|
|
274
|
+
...ctx,
|
|
275
|
+
readOnly: ctx.readOnly || field.readOnly === true,
|
|
276
|
+
depth: ctx.depth + 1
|
|
277
|
+
}) });
|
|
278
|
+
}
|
|
279
|
+
function StringMapControl({ field, ctx }) {
|
|
280
|
+
const readOnly = ctx.readOnly || field.readOnly === true;
|
|
281
|
+
const map = isPlainObject(field.value) ? field.value : {};
|
|
282
|
+
const known = field.knownProperties ?? {};
|
|
283
|
+
const knownKeys = Object.keys(known);
|
|
284
|
+
const extraKeys = Object.keys(map).filter((k) => !(k in known));
|
|
285
|
+
const childCtx = { ...ctx, readOnly, depth: ctx.depth + 1 };
|
|
286
|
+
function setEntry(key, next) {
|
|
287
|
+
field.onChange({ ...map, [key]: next });
|
|
288
|
+
}
|
|
289
|
+
function renameEntry(oldKey, newKey) {
|
|
290
|
+
if (newKey === oldKey) return;
|
|
291
|
+
const next = {};
|
|
292
|
+
for (const [k, v] of Object.entries(map)) next[k === oldKey ? newKey : k] = v;
|
|
293
|
+
field.onChange(next);
|
|
294
|
+
}
|
|
295
|
+
function removeEntry(key) {
|
|
296
|
+
const next = { ...map };
|
|
297
|
+
delete next[key];
|
|
298
|
+
field.onChange(next);
|
|
299
|
+
}
|
|
300
|
+
function addEntry() {
|
|
301
|
+
if ("" in map) return;
|
|
302
|
+
field.onChange({ ...map, "": "" });
|
|
303
|
+
}
|
|
304
|
+
function valueControlFor(key, valueSchema) {
|
|
305
|
+
const nodes = jsonSchemaFormRender.renderFieldNodes(
|
|
306
|
+
{
|
|
307
|
+
key,
|
|
308
|
+
prop: valueSchema,
|
|
309
|
+
required: false,
|
|
310
|
+
value: map[key] ?? "",
|
|
311
|
+
onChange: (next) => setEntry(key, next)
|
|
312
|
+
},
|
|
313
|
+
childCtx
|
|
314
|
+
);
|
|
315
|
+
return (nodes == null ? void 0 : nodes.value) ?? null;
|
|
316
|
+
}
|
|
317
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 rounded-md border border-input p-2", children: [
|
|
318
|
+
knownKeys.map((key) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[10rem_1fr] items-center gap-2", children: [
|
|
319
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: fieldInputId(key), className: "truncate text-xs text-muted-foreground", title: key, children: key }),
|
|
320
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: valueControlFor(key, known[key] ?? { type: "string" }) })
|
|
321
|
+
] }, `known-${key}`)),
|
|
322
|
+
extraKeys.map((key) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[10rem_1fr_auto] items-center gap-2", children: [
|
|
323
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
324
|
+
"input",
|
|
325
|
+
{
|
|
326
|
+
type: "text",
|
|
327
|
+
"aria-label": "Field name",
|
|
328
|
+
className: utils.cn(inputClassName, "h-8 font-mono text-xs"),
|
|
329
|
+
value: key,
|
|
330
|
+
disabled: readOnly,
|
|
331
|
+
onChange: (e) => renameEntry(key, e.target.value)
|
|
332
|
+
}
|
|
333
|
+
),
|
|
334
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: valueControlFor(key, field.valueSchema ?? { type: "string" }) }),
|
|
335
|
+
!readOnly && /* @__PURE__ */ jsxRuntime.jsx(
|
|
336
|
+
"button",
|
|
337
|
+
{
|
|
338
|
+
type: "button",
|
|
339
|
+
"aria-label": `Remove ${key}`,
|
|
340
|
+
className: "inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
341
|
+
onClick: () => removeEntry(key),
|
|
342
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiTrash.UiTrash, className: "text-sm" })
|
|
343
|
+
}
|
|
344
|
+
)
|
|
345
|
+
] }, `extra-${key}`)),
|
|
346
|
+
!readOnly && field.allowExtraKeys !== false && /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { type: "button", variant: "outline", size: "sm", onClick: addEntry, className: "gap-1.5", children: [
|
|
347
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-sm" }),
|
|
348
|
+
"Add field"
|
|
349
|
+
] })
|
|
350
|
+
] });
|
|
351
|
+
}
|
|
352
|
+
function withSyntheticValue(options, value) {
|
|
353
|
+
if (!value || options.some((o) => o.value === value)) return options;
|
|
354
|
+
return [{ value, label: value }, ...options];
|
|
355
|
+
}
|
|
356
|
+
function toText(value) {
|
|
357
|
+
if (value === void 0 || value === null) return "";
|
|
358
|
+
if (typeof value === "object") return "";
|
|
359
|
+
return String(value);
|
|
360
|
+
}
|
|
361
|
+
function isPlainObject(value) {
|
|
362
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
363
|
+
}
|
|
364
|
+
function defaultPlaceholder(schema) {
|
|
365
|
+
if (schema.default != null && typeof schema.default !== "object") return String(schema.default);
|
|
366
|
+
return "";
|
|
367
|
+
}
|
|
368
|
+
exports.FieldLabel = FieldLabel;
|
|
369
|
+
exports.FieldWrapper = FieldWrapper;
|
|
370
|
+
exports.defaultPlaceholder = defaultPlaceholder;
|
|
371
|
+
exports.fieldInputId = fieldInputId;
|
|
372
|
+
exports.inputClassName = inputClassName;
|
|
373
|
+
exports.renderValueControl = renderValueControl;
|
|
374
|
+
//# sourceMappingURL=json-schema-form-fields.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-fields.cjs","sources":["../../src/components/json-schema-form-fields.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, LabelIcon } from \"../data/Icon\";\nimport { formatDateTimeRelative } from \"../data/cells/Timestamp\";\nimport { UiAdd, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { Combobox } from \"./Combobox\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { ArrayControl } from \"./json-schema-form-array\";\nimport { renderFieldNodes, renderObjectFields, type RenderContext } from \"./json-schema-form-render\";\nimport type {\n FieldControl,\n FieldOption,\n FormLayout,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\nexport const inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n\n// FieldWrapper lays out a label + value (+ helper/error) either inline (2-col)\n// or stacked, mirroring the convention used elsewhere in the library. In inline\n// mode the label and value columns are capped (see FormLayout); the grid\n// template is set inline because Tailwind can't interpolate runtime widths.\nexport function FieldWrapper({\n label,\n value,\n helper,\n error,\n layout,\n}: {\n label: ReactNode;\n value: ReactNode;\n helper?: ReactNode;\n error?: ReactNode;\n layout: FormLayout;\n}) {\n if (layout.mode === \"inline\") {\n const labelMaxWidth = layout.labelMaxWidth ?? \"40ch\";\n const valueMaxWidth = layout.valueMaxWidth ?? \"400px\";\n return (\n <div\n className=\"grid items-start gap-x-3 gap-y-0.5\"\n style={{ gridTemplateColumns: `minmax(0, ${labelMaxWidth}) minmax(0, ${valueMaxWidth})` }}\n >\n <div className=\"flex min-h-9 min-w-0 items-center\">{label}</div>\n <div className=\"min-w-0\">{value}</div>\n {helper && <p className=\"col-start-2 text-xs text-muted-foreground\">{helper}</p>}\n {error && <p className=\"col-start-2 text-xs text-destructive\">{error}</p>}\n </div>\n );\n }\n return (\n <div className=\"space-y-1.5\">\n {label}\n {value}\n {helper && <p className=\"text-xs text-muted-foreground\">{helper}</p>}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n );\n}\n\nexport function FieldLabel({ field, fieldId }: { field: FieldControl; fieldId: string }) {\n return (\n <label htmlFor={fieldId} className=\"flex items-center gap-2 text-sm font-medium\">\n <LabelIcon icon={field.labelIcon} className=\"text-[15px] text-muted-foreground\" />\n <span title={field.label !== field.key ? field.key : undefined}>{field.label}</span>\n {field.required && <span className=\"text-destructive\">*</span>}\n {field.badge && (\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {field.badge}\n </span>\n )}\n </label>\n );\n}\n\nexport function fieldInputId(key: string): string {\n return `jsf-${key.replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n}\n\n// renderValueControl produces just the value node for a field, dispatching on\n// its resolved kind. The RenderContext carries readOnly + the pre/post stacks so\n// container controls (array/object/map) can recurse with full context.\nexport function renderValueControl(field: FieldControl, ctx: RenderContext): ReactNode {\n const fieldId = fieldInputId(field.key);\n // A field the schema marks `readOnly` is never editable: it shows its current\n // value as plain text, not a disabled input. (The form-level ctx.readOnly,\n // below, instead disables the real controls so the structure stays visible.)\n // Containers (array/object/map) still render structurally so nested read-only\n // values surface; their own children resolve their own readOnly.\n if (field.readOnly && field.kind !== \"array\" && field.kind !== \"object\" && field.kind !== \"string-map\") {\n return <ReadOnlyValue field={field} fieldId={fieldId} />;\n }\n const readOnly = ctx.readOnly;\n switch (field.kind) {\n case \"enum\":\n return <EnumControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n case \"boolean\":\n return <BooleanControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n case \"number\":\n return <NumberControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n case \"date\":\n return <DateControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n case \"array\":\n return <ArrayControl field={field} fieldId={fieldId} ctx={ctx} />;\n case \"object\":\n return <ObjectControl field={field} ctx={ctx} />;\n case \"string-map\":\n return <StringMapControl field={field} ctx={ctx} />;\n default:\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n }\n}\n\n// ReadOnlyValue renders a `readOnly` field's current value as static text — no\n// input, no border, just the value (date/date-time formatted human-readably).\n// An empty value shows an em-dash. Carries the same id + data-jsf-input as the\n// editable controls so layout and queries stay uniform.\nfunction ReadOnlyValue({ field, fieldId }: { field: FieldControl; fieldId: string }) {\n const text = toText(field.value);\n const display = field.kind === \"date\" && text ? formatDateTimeRelative(text) : text;\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className=\"flex h-9 items-center text-sm text-foreground\"\n title={text || undefined}\n >\n {display || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n}\n\nfunction StringControl({\n field,\n fieldId,\n readOnly,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n}) {\n return (\n <input\n id={fieldId}\n type=\"text\"\n data-jsf-input\n className={inputClassName}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n );\n}\n\nfunction NumberControl({\n field,\n fieldId,\n readOnly,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n}) {\n // type=\"text\" (not number) so non-numeric values a consumer permits — e.g.\n // template tokens — are not silently dropped by the browser.\n return (\n <input\n id={fieldId}\n type=\"text\"\n inputMode=\"decimal\"\n data-jsf-input\n className={inputClassName}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => {\n const raw = e.target.value;\n const coerce = field.coerceNumber !== false;\n if (coerce && raw.trim() !== \"\" && Number.isFinite(Number(raw))) {\n field.onChange(Number(raw));\n } else {\n field.onChange(raw);\n }\n }}\n />\n );\n}\n\n// DateControl edits a `format: date`/`date-time` string. Read-only, it shows the\n// human-readable absolute + relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h\n// ago)\"); editable, a DateTimePicker. The raw string is committed unchanged so a\n// consumer-permitted template token in the field is preserved.\nfunction DateControl({\n field,\n fieldId,\n readOnly,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <div\n id={fieldId}\n data-jsf-input\n className=\"flex h-9 items-center text-sm text-foreground\"\n title={text || undefined}\n >\n {text ? formatDateTimeRelative(text) : <span className=\"text-muted-foreground\">—</span>}\n </div>\n );\n }\n return (\n <DateTimePicker\n id={fieldId}\n aria-label={field.label}\n data-jsf-input\n inputClassName={cn(inputClassName, \"pr-8\")}\n value={text}\n onChange={(next) => field.onChange(next)}\n placeholder={defaultPlaceholder(field.schema)}\n />\n );\n}\n\nfunction BooleanControl({\n field,\n fieldId,\n readOnly,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n}) {\n // Only render a checkbox when the value is genuinely boolean (or unset).\n // A non-boolean value (e.g. a token a consumer left in place) renders as text\n // so it is preserved and editable.\n if (typeof field.value === \"boolean\" || field.value === undefined || field.value === null) {\n return (\n <div className=\"flex h-9 items-center\">\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={field.value === true}\n disabled={readOnly}\n onChange={(e) => field.onChange(e.target.checked)}\n />\n </div>\n );\n }\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n}\n\nfunction EnumControl({\n field,\n fieldId,\n readOnly,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n}) {\n const value = toText(field.value);\n const options = withSyntheticValue(field.options ?? [], value);\n if (field.display === \"radio\") {\n return <RadioGroupControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} />;\n }\n return (\n <Combobox\n id={fieldId}\n options={options}\n value={value}\n disabled={readOnly}\n allowCustomValue={field.allowCustomValue ?? false}\n onChange={(v) => field.onChange(v)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label.\nfunction RadioGroupControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n}) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className=\"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\"\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n return (\n <label\n key={opt.value}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1 text-sm\",\n checked\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n\n// ObjectControl renders a nested structured object as a sub-form: its own\n// properties, required markers, if/then, soft errors — all via the shared\n// recursive renderer, so pre/post extensions apply at this depth too.\nfunction ObjectControl({ field, ctx }: { field: FieldControl; ctx: RenderContext }) {\n const obj = isPlainObject(field.value) ? (field.value as Record<string, unknown>) : {};\n const subSchema: JsonSchemaObject = {\n type: \"object\",\n properties: field.objectProperties ?? {},\n ...(field.objectRequired ? { required: field.objectRequired } : {}),\n ...(Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {}),\n };\n // No border/box: nested objects render as flat headed sections (see\n // ObjectSection in renderFieldRow) rather than progressively indented\n // sub-forms, so deep schemas stay readable as a single column.\n // A read-only object marks its whole subtree non-editable: recurse with\n // form-level readOnly on so child inputs are disabled (and any child the\n // schema marks readOnly still renders as a value span).\n return (\n <div className=\"space-y-2\">\n {renderObjectFields(subSchema, obj, (next) => field.onChange(next), {\n ...ctx,\n readOnly: ctx.readOnly || field.readOnly === true,\n depth: ctx.depth + 1,\n })}\n </div>\n );\n}\n\n// StringMapControl edits an object as key/value rows. Known properties (from the\n// schema) render first with derived value controls; unknown keys render as\n// editable key/value pairs. \"Add field\" appears when extra keys are allowed.\n// Values recurse through the shared pipeline, so a value that is itself an object\n// or array renders structurally and pre/post extensions apply to it.\nfunction StringMapControl({ field, ctx }: { field: FieldControl; ctx: RenderContext }) {\n // A read-only map marks its whole subtree non-editable: no rename/remove/add\n // and value inputs disabled.\n const readOnly = ctx.readOnly || field.readOnly === true;\n const map = isPlainObject(field.value) ? (field.value as Record<string, unknown>) : {};\n const known = field.knownProperties ?? {};\n const knownKeys = Object.keys(known);\n const extraKeys = Object.keys(map).filter((k) => !(k in known));\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n function setEntry(key: string, next: unknown) {\n field.onChange({ ...map, [key]: next });\n }\n function renameEntry(oldKey: string, newKey: string) {\n if (newKey === oldKey) return;\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(map)) next[k === oldKey ? newKey : k] = v;\n field.onChange(next);\n }\n function removeEntry(key: string) {\n const next = { ...map };\n delete next[key];\n field.onChange(next);\n }\n function addEntry() {\n if (\"\" in map) return;\n field.onChange({ ...map, \"\": \"\" });\n }\n\n function valueControlFor(key: string, valueSchema: JsonSchemaProperty): ReactNode {\n const nodes = renderFieldNodes(\n {\n key,\n prop: valueSchema,\n required: false,\n value: map[key] ?? \"\",\n onChange: (next) => setEntry(key, next),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n return (\n <div className=\"space-y-2 rounded-md border border-input p-2\">\n {knownKeys.map((key) => (\n <div key={`known-${key}`} className=\"grid grid-cols-[10rem_1fr] items-center gap-2\">\n <label htmlFor={fieldInputId(key)} className=\"truncate text-xs text-muted-foreground\" title={key}>\n {key}\n </label>\n <div className=\"min-w-0\">{valueControlFor(key, known[key] ?? { type: \"string\" })}</div>\n </div>\n ))}\n {extraKeys.map((key) => (\n <div key={`extra-${key}`} className=\"grid grid-cols-[10rem_1fr_auto] items-center gap-2\">\n <input\n type=\"text\"\n aria-label=\"Field name\"\n className={cn(inputClassName, \"h-8 font-mono text-xs\")}\n value={key}\n disabled={readOnly}\n onChange={(e) => renameEntry(key, e.target.value)}\n />\n <div className=\"min-w-0\">\n {valueControlFor(key, field.valueSchema ?? { type: \"string\" })}\n </div>\n {!readOnly && (\n <button\n type=\"button\"\n aria-label={`Remove ${key}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={() => removeEntry(key)}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n )}\n </div>\n ))}\n {!readOnly && field.allowExtraKeys !== false && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addEntry} className=\"gap-1.5\">\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add field\n </Button>\n )}\n </div>\n );\n}\n\nfunction withSyntheticValue(\n options: { value: string; label: string }[],\n value: string,\n): { value: string; label: string }[] {\n if (!value || options.some((o) => o.value === value)) return options;\n return [{ value, label: value }, ...options];\n}\n\nfunction toText(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return \"\";\n return String(value);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function defaultPlaceholder(schema: JsonSchemaProperty): string {\n if (schema.default != null && typeof schema.default !== \"object\") return String(schema.default);\n return \"\";\n}\n"],"names":["jsxs","jsx","LabelIcon","ArrayControl","formatDateTimeRelative","DateTimePicker","cn","Combobox","renderObjectFields","renderFieldNodes","Icon","UiTrash","Button","UiAdd"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { RenderContext } from './json-schema-form-render';
|
|
3
|
+
import { FieldControl, FormLayout, JsonSchemaProperty } from './json-schema-form-types';
|
|
4
|
+
export declare const inputClassName = "h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring";
|
|
5
|
+
export declare function FieldWrapper({ label, value, helper, error, layout, }: {
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
value: ReactNode;
|
|
8
|
+
helper?: ReactNode;
|
|
9
|
+
error?: ReactNode;
|
|
10
|
+
layout: FormLayout;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function FieldLabel({ field, fieldId }: {
|
|
13
|
+
field: FieldControl;
|
|
14
|
+
fieldId: string;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function fieldInputId(key: string): string;
|
|
17
|
+
export declare function renderValueControl(field: FieldControl, ctx: RenderContext): ReactNode;
|
|
18
|
+
export declare function defaultPlaceholder(schema: JsonSchemaProperty): string;
|
|
19
|
+
//# sourceMappingURL=json-schema-form-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-fields.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-fields.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EACV,YAAY,EAEZ,UAAU,EAEV,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,cAAc,8OACkN,CAAC;AAM9O,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,GACP,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;CACpB,2CAwBA;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,2CAatF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,GAAG,SAAS,CA6BrF;AAgXD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAGrE"}
|