@panneau/fields 4.1.1 → 5.0.0-alpha.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.
- package/README.md +74 -0
- package/dist/boolean/BooleanField.d.ts +11 -0
- package/dist/boolean/BooleanField.d.ts.map +1 -0
- package/dist/boolean/BooleanField.js +67 -0
- package/dist/boolean/BooleanField.js.map +1 -0
- package/dist/boolean/index.d.ts +2 -0
- package/dist/boolean/index.d.ts.map +1 -0
- package/dist/boolean/index.js +1 -0
- package/dist/color/ColorField.css +33 -0
- package/dist/color/ColorField.d.ts +16 -0
- package/dist/color/ColorField.d.ts.map +1 -0
- package/dist/color/ColorField.js +187 -0
- package/dist/color/ColorField.js.map +1 -0
- package/dist/color/ColorField.module.js +14 -0
- package/dist/color/ColorField.module.js.map +1 -0
- package/dist/color/index.d.ts +2 -0
- package/dist/color/index.d.ts.map +1 -0
- package/dist/color/index.js +1 -0
- package/dist/date/DateField.d.ts +16 -0
- package/dist/date/DateField.d.ts.map +1 -0
- package/dist/date/DateField.js +132 -0
- package/dist/date/DateField.js.map +1 -0
- package/dist/date/index.d.ts +2 -0
- package/dist/date/index.d.ts.map +1 -0
- package/dist/date/index.js +1 -0
- package/dist/datetime/DateTimeField.d.ts +22 -0
- package/dist/datetime/DateTimeField.d.ts.map +1 -0
- package/dist/datetime/DateTimeField.js +78 -0
- package/dist/datetime/DateTimeField.js.map +1 -0
- package/dist/datetime/index.d.ts +2 -0
- package/dist/datetime/index.d.ts.map +1 -0
- package/dist/datetime/index.js +1 -0
- package/dist/email/EmailField.d.ts +8 -0
- package/dist/email/EmailField.d.ts.map +1 -0
- package/dist/email/EmailField.js +84 -0
- package/dist/email/EmailField.js.map +1 -0
- package/dist/email/index.d.ts +2 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +1 -0
- package/dist/group/GroupField.css +14 -0
- package/dist/group/GroupField.d.ts +19 -0
- package/dist/group/GroupField.d.ts.map +1 -0
- package/dist/group/GroupField.js +140 -0
- package/dist/group/GroupField.js.map +1 -0
- package/dist/group/GroupField.module.js +8 -0
- package/dist/group/GroupField.module.js.map +1 -0
- package/dist/group/index.d.ts +2 -0
- package/dist/group/index.d.ts.map +1 -0
- package/dist/group/index.js +1 -0
- package/dist/index.d.ts +8 -12
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -134
- package/dist/locales/index.d.ts +15 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/index.js +21 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/localized/LocalizedField.css +9 -0
- package/dist/localized/LocalizedField.d.ts +36 -0
- package/dist/localized/LocalizedField.d.ts.map +1 -0
- package/dist/localized/LocalizedField.js +207 -0
- package/dist/localized/LocalizedField.js.map +1 -0
- package/dist/localized/LocalizedField.module.js +12 -0
- package/dist/localized/LocalizedField.module.js.map +1 -0
- package/dist/localized/index.d.ts +2 -0
- package/dist/localized/index.d.ts.map +1 -0
- package/dist/localized/index.js +1 -0
- package/dist/missing/MissingField.css +18 -0
- package/dist/missing/MissingField.d.ts +7 -0
- package/dist/missing/MissingField.d.ts.map +1 -0
- package/dist/missing/MissingField.js +68 -0
- package/dist/missing/MissingField.js.map +1 -0
- package/dist/missing/MissingField.module.js +14 -0
- package/dist/missing/MissingField.module.js.map +1 -0
- package/dist/number/NumberField.d.ts +23 -0
- package/dist/number/NumberField.d.ts.map +1 -0
- package/dist/number/NumberField.js +175 -0
- package/dist/number/NumberField.js.map +1 -0
- package/dist/number/index.d.ts +2 -0
- package/dist/number/index.d.ts.map +1 -0
- package/dist/number/index.js +1 -0
- package/dist/relation/RelationField.css +43 -0
- package/dist/relation/RelationField.d.ts +48 -0
- package/dist/relation/RelationField.d.ts.map +1 -0
- package/dist/relation/RelationField.js +328 -0
- package/dist/relation/RelationField.js.map +1 -0
- package/dist/relation/RelationField.module.js +20 -0
- package/dist/relation/RelationField.module.js.map +1 -0
- package/dist/relation/index.d.ts +3 -0
- package/dist/relation/index.d.ts.map +1 -0
- package/dist/relation/index.js +3 -0
- package/dist/repeater/RepeaterField.css +80 -0
- package/dist/repeater/RepeaterField.d.ts +29 -0
- package/dist/repeater/RepeaterField.d.ts.map +1 -0
- package/dist/repeater/RepeaterField.js +220 -0
- package/dist/repeater/RepeaterField.js.map +1 -0
- package/dist/repeater/RepeaterField.module.js +26 -0
- package/dist/repeater/RepeaterField.module.js.map +1 -0
- package/dist/repeater/index.d.ts +2 -0
- package/dist/repeater/index.d.ts.map +1 -0
- package/dist/repeater/index.js +1 -0
- package/dist/select/SelectField.css +5 -0
- package/dist/select/SelectField.d.ts +38 -0
- package/dist/select/SelectField.d.ts.map +1 -0
- package/dist/select/SelectField.js +434 -0
- package/dist/select/SelectField.js.map +1 -0
- package/dist/select/SelectField.module.js +8 -0
- package/dist/select/SelectField.module.js.map +1 -0
- package/dist/select/index.d.ts +2 -0
- package/dist/select/index.d.ts.map +1 -0
- package/dist/select/index.js +1 -0
- package/dist/shared/DefinitionField.d.ts +32 -0
- package/dist/shared/DefinitionField.d.ts.map +1 -0
- package/dist/shared/DefinitionField.js +153 -0
- package/dist/shared/DefinitionField.js.map +1 -0
- package/dist/shared/builtIn.d.ts +17 -0
- package/dist/shared/builtIn.d.ts.map +1 -0
- package/dist/shared/builtIn.js +52 -0
- package/dist/shared/builtIn.js.map +1 -0
- package/dist/shared/context.d.ts +55 -0
- package/dist/shared/context.d.ts.map +1 -0
- package/dist/shared/context.js +72 -0
- package/dist/shared/context.js.map +1 -0
- package/dist/shared/cx.d.ts +3 -0
- package/dist/shared/cx.d.ts.map +1 -0
- package/dist/shared/cx.js +9 -0
- package/dist/shared/cx.js.map +1 -0
- package/dist/shared/dates.d.ts +15 -0
- package/dist/shared/dates.d.ts.map +1 -0
- package/dist/shared/dates.js +49 -0
- package/dist/shared/dates.js.map +1 -0
- package/dist/shared/entry.d.ts +23 -0
- package/dist/shared/entry.d.ts.map +1 -0
- package/dist/shared/entry.js +45 -0
- package/dist/shared/entry.js.map +1 -0
- package/dist/shared/messages.d.ts +2 -0
- package/dist/shared/messages.d.ts.map +1 -0
- package/dist/shared/messages.js +1 -0
- package/dist/shared/relation.d.ts +73 -0
- package/dist/shared/relation.d.ts.map +1 -0
- package/dist/shared/relation.js +156 -0
- package/dist/shared/relation.js.map +1 -0
- package/dist/shared/types.d.ts +50 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/slug/SlugField.d.ts +24 -0
- package/dist/slug/SlugField.d.ts.map +1 -0
- package/dist/slug/SlugField.js +216 -0
- package/dist/slug/SlugField.js.map +1 -0
- package/dist/slug/index.d.ts +2 -0
- package/dist/slug/index.d.ts.map +1 -0
- package/dist/slug/index.js +1 -0
- package/dist/text/TextField.d.ts +24 -0
- package/dist/text/TextField.d.ts.map +1 -0
- package/dist/text/TextField.js +179 -0
- package/dist/text/TextField.js.map +1 -0
- package/dist/text/index.d.ts +2 -0
- package/dist/text/index.d.ts.map +1 -0
- package/dist/text/index.js +1 -0
- package/dist/textarea/TextAreaField.d.ts +14 -0
- package/dist/textarea/TextAreaField.d.ts.map +1 -0
- package/dist/textarea/TextAreaField.js +126 -0
- package/dist/textarea/TextAreaField.js.map +1 -0
- package/dist/textarea/index.d.ts +2 -0
- package/dist/textarea/index.d.ts.map +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/time/TimeField.d.ts +13 -0
- package/dist/time/TimeField.d.ts.map +1 -0
- package/dist/time/TimeField.js +49 -0
- package/dist/time/TimeField.js.map +1 -0
- package/dist/time/index.d.ts +2 -0
- package/dist/time/index.d.ts.map +1 -0
- package/dist/time/index.js +1 -0
- package/dist/url/UrlField.css +11 -0
- package/dist/url/UrlField.d.ts +16 -0
- package/dist/url/UrlField.d.ts.map +1 -0
- package/dist/url/UrlField.js +94 -0
- package/dist/url/UrlField.js.map +1 -0
- package/dist/url/UrlField.module.js +8 -0
- package/dist/url/UrlField.module.js.map +1 -0
- package/dist/url/index.d.ts +2 -0
- package/dist/url/index.d.ts.map +1 -0
- package/dist/url/index.js +1 -0
- package/package.json +108 -79
- package/assets/css/styles.css +0 -14
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { getFieldProps, getRuleNumber, getSetting, isString } from "../shared/entry.js";
|
|
2
|
+
import { messages } from "../shared/messages.js";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import { TextInput, usePanneauIntl } from "@panneau/ui";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/text/TextField.tsx
|
|
7
|
+
/** The description of a text field, with its character count. */
|
|
8
|
+
function useCountedDescription(description, value, maxLength) {
|
|
9
|
+
const $ = c(9);
|
|
10
|
+
const intl = usePanneauIntl();
|
|
11
|
+
if (maxLength === void 0) return description;
|
|
12
|
+
let t0;
|
|
13
|
+
if ($[0] !== intl || $[1] !== maxLength || $[2] !== value) {
|
|
14
|
+
t0 = intl.formatMessage(messages.characterCount, {
|
|
15
|
+
count: (value ?? "").length,
|
|
16
|
+
max: maxLength
|
|
17
|
+
});
|
|
18
|
+
$[0] = intl;
|
|
19
|
+
$[1] = maxLength;
|
|
20
|
+
$[2] = value;
|
|
21
|
+
$[3] = t0;
|
|
22
|
+
} else t0 = $[3];
|
|
23
|
+
const count = t0;
|
|
24
|
+
if (description === void 0 || description === null) return count;
|
|
25
|
+
let t1;
|
|
26
|
+
if ($[4] !== count) {
|
|
27
|
+
t1 = /* @__PURE__ */ jsx("span", { children: count });
|
|
28
|
+
$[4] = count;
|
|
29
|
+
$[5] = t1;
|
|
30
|
+
} else t1 = $[5];
|
|
31
|
+
let t2;
|
|
32
|
+
if ($[6] !== description || $[7] !== t1) {
|
|
33
|
+
t2 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
34
|
+
description,
|
|
35
|
+
" ",
|
|
36
|
+
t1
|
|
37
|
+
] });
|
|
38
|
+
$[6] = description;
|
|
39
|
+
$[7] = t1;
|
|
40
|
+
$[8] = t2;
|
|
41
|
+
} else t2 = $[8];
|
|
42
|
+
return t2;
|
|
43
|
+
}
|
|
44
|
+
/** A single-line text. An empty text is `null`. */
|
|
45
|
+
function TextField(t0) {
|
|
46
|
+
const $ = c(19);
|
|
47
|
+
let description;
|
|
48
|
+
let disabled;
|
|
49
|
+
let maxLength;
|
|
50
|
+
let onChange;
|
|
51
|
+
let props;
|
|
52
|
+
let readOnly;
|
|
53
|
+
let required;
|
|
54
|
+
let value;
|
|
55
|
+
if ($[0] !== t0) {
|
|
56
|
+
({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
|
|
57
|
+
$[0] = t0;
|
|
58
|
+
$[1] = description;
|
|
59
|
+
$[2] = disabled;
|
|
60
|
+
$[3] = maxLength;
|
|
61
|
+
$[4] = onChange;
|
|
62
|
+
$[5] = props;
|
|
63
|
+
$[6] = readOnly;
|
|
64
|
+
$[7] = required;
|
|
65
|
+
$[8] = value;
|
|
66
|
+
} else {
|
|
67
|
+
description = $[1];
|
|
68
|
+
disabled = $[2];
|
|
69
|
+
maxLength = $[3];
|
|
70
|
+
onChange = $[4];
|
|
71
|
+
props = $[5];
|
|
72
|
+
readOnly = $[6];
|
|
73
|
+
required = $[7];
|
|
74
|
+
value = $[8];
|
|
75
|
+
}
|
|
76
|
+
const shownDescription = useCountedDescription(description, value, maxLength);
|
|
77
|
+
const t1 = value ?? "";
|
|
78
|
+
let t2;
|
|
79
|
+
if ($[9] !== onChange) {
|
|
80
|
+
t2 = (next) => onChange?.(next === "" ? null : next);
|
|
81
|
+
$[9] = onChange;
|
|
82
|
+
$[10] = t2;
|
|
83
|
+
} else t2 = $[10];
|
|
84
|
+
let t3;
|
|
85
|
+
if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
|
|
86
|
+
t3 = /* @__PURE__ */ jsx(TextInput, {
|
|
87
|
+
...props,
|
|
88
|
+
value: t1,
|
|
89
|
+
onChange: t2,
|
|
90
|
+
description: shownDescription,
|
|
91
|
+
isDisabled: disabled,
|
|
92
|
+
isReadOnly: readOnly,
|
|
93
|
+
isRequired: required
|
|
94
|
+
});
|
|
95
|
+
$[11] = disabled;
|
|
96
|
+
$[12] = props;
|
|
97
|
+
$[13] = readOnly;
|
|
98
|
+
$[14] = required;
|
|
99
|
+
$[15] = shownDescription;
|
|
100
|
+
$[16] = t1;
|
|
101
|
+
$[17] = t2;
|
|
102
|
+
$[18] = t3;
|
|
103
|
+
} else t3 = $[18];
|
|
104
|
+
return t3;
|
|
105
|
+
}
|
|
106
|
+
/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
|
|
107
|
+
function TextFieldEntry(props) {
|
|
108
|
+
const $ = c(21);
|
|
109
|
+
const { field } = props;
|
|
110
|
+
let t0;
|
|
111
|
+
if ($[0] !== field) {
|
|
112
|
+
t0 = getSetting(field, "prefix", isString);
|
|
113
|
+
$[0] = field;
|
|
114
|
+
$[1] = t0;
|
|
115
|
+
} else t0 = $[1];
|
|
116
|
+
const prefix = t0;
|
|
117
|
+
let t1;
|
|
118
|
+
if ($[2] !== field) {
|
|
119
|
+
t1 = getSetting(field, "suffix", isString);
|
|
120
|
+
$[2] = field;
|
|
121
|
+
$[3] = t1;
|
|
122
|
+
} else t1 = $[3];
|
|
123
|
+
const suffix = t1;
|
|
124
|
+
let t2;
|
|
125
|
+
if ($[4] !== field) {
|
|
126
|
+
t2 = getRuleNumber(field, "max");
|
|
127
|
+
$[4] = field;
|
|
128
|
+
$[5] = t2;
|
|
129
|
+
} else t2 = $[5];
|
|
130
|
+
const max = t2;
|
|
131
|
+
let t3;
|
|
132
|
+
if ($[6] !== props) {
|
|
133
|
+
t3 = getFieldProps(props);
|
|
134
|
+
$[6] = props;
|
|
135
|
+
$[7] = t3;
|
|
136
|
+
} else t3 = $[7];
|
|
137
|
+
const t4 = isString(props.value) ? props.value : null;
|
|
138
|
+
let t5;
|
|
139
|
+
if ($[8] !== max) {
|
|
140
|
+
t5 = max !== void 0 ? { maxLength: max } : {};
|
|
141
|
+
$[8] = max;
|
|
142
|
+
$[9] = t5;
|
|
143
|
+
} else t5 = $[9];
|
|
144
|
+
let t6;
|
|
145
|
+
if ($[10] !== prefix) {
|
|
146
|
+
t6 = prefix !== void 0 ? { prefix } : {};
|
|
147
|
+
$[10] = prefix;
|
|
148
|
+
$[11] = t6;
|
|
149
|
+
} else t6 = $[11];
|
|
150
|
+
let t7;
|
|
151
|
+
if ($[12] !== suffix) {
|
|
152
|
+
t7 = suffix !== void 0 ? { suffix } : {};
|
|
153
|
+
$[12] = suffix;
|
|
154
|
+
$[13] = t7;
|
|
155
|
+
} else t7 = $[13];
|
|
156
|
+
let t8;
|
|
157
|
+
if ($[14] !== props.onChange || $[15] !== t3 || $[16] !== t4 || $[17] !== t5 || $[18] !== t6 || $[19] !== t7) {
|
|
158
|
+
t8 = /* @__PURE__ */ jsx(TextField, {
|
|
159
|
+
...t3,
|
|
160
|
+
value: t4,
|
|
161
|
+
onChange: props.onChange,
|
|
162
|
+
...t5,
|
|
163
|
+
...t6,
|
|
164
|
+
...t7
|
|
165
|
+
});
|
|
166
|
+
$[14] = props.onChange;
|
|
167
|
+
$[15] = t3;
|
|
168
|
+
$[16] = t4;
|
|
169
|
+
$[17] = t5;
|
|
170
|
+
$[18] = t6;
|
|
171
|
+
$[19] = t7;
|
|
172
|
+
$[20] = t8;
|
|
173
|
+
} else t8 = $[20];
|
|
174
|
+
return t8;
|
|
175
|
+
}
|
|
176
|
+
//#endregion
|
|
177
|
+
export { TextField, TextFieldEntry, useCountedDescription };
|
|
178
|
+
|
|
179
|
+
//# sourceMappingURL=TextField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.js","names":["count","description","shownDescription","disabled","readOnly","required","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextInput\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TextField, TextFieldEntry } from "./TextField.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
2
|
+
export interface TextAreaFieldProps extends FieldProps<string> {
|
|
3
|
+
placeholder?: string;
|
|
4
|
+
/** Shows a count of characters against this maximum. It doesn't stop typing. */
|
|
5
|
+
maxLength?: number;
|
|
6
|
+
/** Visible lines. Defaults to 4. */
|
|
7
|
+
rows?: number;
|
|
8
|
+
textAreaClassName?: string;
|
|
9
|
+
}
|
|
10
|
+
/** A text of several lines. An empty text is `null`. */
|
|
11
|
+
export declare function TextAreaField({ value, onChange, description, maxLength, disabled, readOnly, required, ...props }: TextAreaFieldProps): import("react").JSX.Element;
|
|
12
|
+
/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */
|
|
13
|
+
export declare function TextAreaFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=TextAreaField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAreaField.d.ts","sourceRoot":"","sources":["../../src/textarea/TextAreaField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,kBAAkB,+BAapB;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAYxD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from "../shared/entry.js";
|
|
2
|
+
import { useCountedDescription } from "../text/TextField.js";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import { TextArea } from "@panneau/ui";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/textarea/TextAreaField.tsx
|
|
7
|
+
/** A text of several lines. An empty text is `null`. */
|
|
8
|
+
function TextAreaField(t0) {
|
|
9
|
+
const $ = c(19);
|
|
10
|
+
let description;
|
|
11
|
+
let disabled;
|
|
12
|
+
let maxLength;
|
|
13
|
+
let onChange;
|
|
14
|
+
let props;
|
|
15
|
+
let readOnly;
|
|
16
|
+
let required;
|
|
17
|
+
let value;
|
|
18
|
+
if ($[0] !== t0) {
|
|
19
|
+
({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
|
|
20
|
+
$[0] = t0;
|
|
21
|
+
$[1] = description;
|
|
22
|
+
$[2] = disabled;
|
|
23
|
+
$[3] = maxLength;
|
|
24
|
+
$[4] = onChange;
|
|
25
|
+
$[5] = props;
|
|
26
|
+
$[6] = readOnly;
|
|
27
|
+
$[7] = required;
|
|
28
|
+
$[8] = value;
|
|
29
|
+
} else {
|
|
30
|
+
description = $[1];
|
|
31
|
+
disabled = $[2];
|
|
32
|
+
maxLength = $[3];
|
|
33
|
+
onChange = $[4];
|
|
34
|
+
props = $[5];
|
|
35
|
+
readOnly = $[6];
|
|
36
|
+
required = $[7];
|
|
37
|
+
value = $[8];
|
|
38
|
+
}
|
|
39
|
+
const shownDescription = useCountedDescription(description, value, maxLength);
|
|
40
|
+
const t1 = value ?? "";
|
|
41
|
+
let t2;
|
|
42
|
+
if ($[9] !== onChange) {
|
|
43
|
+
t2 = (next) => onChange?.(next === "" ? null : next);
|
|
44
|
+
$[9] = onChange;
|
|
45
|
+
$[10] = t2;
|
|
46
|
+
} else t2 = $[10];
|
|
47
|
+
let t3;
|
|
48
|
+
if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
|
|
49
|
+
t3 = /* @__PURE__ */ jsx(TextArea, {
|
|
50
|
+
...props,
|
|
51
|
+
value: t1,
|
|
52
|
+
onChange: t2,
|
|
53
|
+
description: shownDescription,
|
|
54
|
+
isDisabled: disabled,
|
|
55
|
+
isReadOnly: readOnly,
|
|
56
|
+
isRequired: required
|
|
57
|
+
});
|
|
58
|
+
$[11] = disabled;
|
|
59
|
+
$[12] = props;
|
|
60
|
+
$[13] = readOnly;
|
|
61
|
+
$[14] = required;
|
|
62
|
+
$[15] = shownDescription;
|
|
63
|
+
$[16] = t1;
|
|
64
|
+
$[17] = t2;
|
|
65
|
+
$[18] = t3;
|
|
66
|
+
} else t3 = $[18];
|
|
67
|
+
return t3;
|
|
68
|
+
}
|
|
69
|
+
/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */
|
|
70
|
+
function TextAreaFieldEntry(props) {
|
|
71
|
+
const $ = c(16);
|
|
72
|
+
let t0;
|
|
73
|
+
if ($[0] !== props.field) {
|
|
74
|
+
t0 = getRuleNumber(props.field, "max");
|
|
75
|
+
$[0] = props.field;
|
|
76
|
+
$[1] = t0;
|
|
77
|
+
} else t0 = $[1];
|
|
78
|
+
const max = t0;
|
|
79
|
+
let t1;
|
|
80
|
+
if ($[2] !== props.field) {
|
|
81
|
+
t1 = getSetting(props.field, "rows", isNumber);
|
|
82
|
+
$[2] = props.field;
|
|
83
|
+
$[3] = t1;
|
|
84
|
+
} else t1 = $[3];
|
|
85
|
+
const rows = t1;
|
|
86
|
+
let t2;
|
|
87
|
+
if ($[4] !== props) {
|
|
88
|
+
t2 = getFieldProps(props);
|
|
89
|
+
$[4] = props;
|
|
90
|
+
$[5] = t2;
|
|
91
|
+
} else t2 = $[5];
|
|
92
|
+
const t3 = isString(props.value) ? props.value : null;
|
|
93
|
+
let t4;
|
|
94
|
+
if ($[6] !== max) {
|
|
95
|
+
t4 = max !== void 0 ? { maxLength: max } : {};
|
|
96
|
+
$[6] = max;
|
|
97
|
+
$[7] = t4;
|
|
98
|
+
} else t4 = $[7];
|
|
99
|
+
let t5;
|
|
100
|
+
if ($[8] !== rows) {
|
|
101
|
+
t5 = rows !== void 0 ? { rows } : {};
|
|
102
|
+
$[8] = rows;
|
|
103
|
+
$[9] = t5;
|
|
104
|
+
} else t5 = $[9];
|
|
105
|
+
let t6;
|
|
106
|
+
if ($[10] !== props.onChange || $[11] !== t2 || $[12] !== t3 || $[13] !== t4 || $[14] !== t5) {
|
|
107
|
+
t6 = /* @__PURE__ */ jsx(TextAreaField, {
|
|
108
|
+
...t2,
|
|
109
|
+
value: t3,
|
|
110
|
+
onChange: props.onChange,
|
|
111
|
+
...t4,
|
|
112
|
+
...t5
|
|
113
|
+
});
|
|
114
|
+
$[10] = props.onChange;
|
|
115
|
+
$[11] = t2;
|
|
116
|
+
$[12] = t3;
|
|
117
|
+
$[13] = t4;
|
|
118
|
+
$[14] = t5;
|
|
119
|
+
$[15] = t6;
|
|
120
|
+
} else t6 = $[15];
|
|
121
|
+
return t6;
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
export { TextAreaField, TextAreaFieldEntry };
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=TextAreaField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAreaField.js","names":["shownDescription","disabled","readOnly","required","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/textarea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TextAreaField, TextAreaFieldEntry } from "./TextAreaField.js";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types';
|
|
2
|
+
export interface TimeFieldProps extends FieldProps<string> {
|
|
3
|
+
/** Shows and writes seconds (`09:30:15`). */
|
|
4
|
+
withSeconds?: boolean;
|
|
5
|
+
/** Defaults to the locale's. */
|
|
6
|
+
hourCycle?: 12 | 24;
|
|
7
|
+
controlClassName?: string;
|
|
8
|
+
}
|
|
9
|
+
/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
|
|
10
|
+
export declare function TimeField({ value, onChange, withSeconds, disabled, readOnly, required, ...props }: TimeFieldProps): import("react").JSX.Element;
|
|
11
|
+
/** The `time` type: setting `withSeconds`. */
|
|
12
|
+
export declare function TimeFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=TimeField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeField.d.ts","sourceRoot":"","sources":["../../src/time/TimeField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAYhB;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BASpD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { getFieldProps, isString } from "../shared/entry.js";
|
|
2
|
+
import { fromTime, toTime } from "../shared/dates.js";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import { TimeInput } from "@panneau/ui";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/time/TimeField.tsx
|
|
7
|
+
/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
|
|
8
|
+
function TimeField({ value, onChange, withSeconds = false, disabled, readOnly, required, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx(TimeInput, {
|
|
10
|
+
...props,
|
|
11
|
+
granularity: withSeconds ? "second" : "minute",
|
|
12
|
+
value: toTime(value),
|
|
13
|
+
onChange: (next) => onChange?.(next === null ? null : fromTime(next, withSeconds)),
|
|
14
|
+
isDisabled: disabled,
|
|
15
|
+
isReadOnly: readOnly,
|
|
16
|
+
isRequired: required
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/** The `time` type: setting `withSeconds`. */
|
|
20
|
+
function TimeFieldEntry(props) {
|
|
21
|
+
const $ = c(7);
|
|
22
|
+
let t0;
|
|
23
|
+
if ($[0] !== props) {
|
|
24
|
+
t0 = getFieldProps(props);
|
|
25
|
+
$[0] = props;
|
|
26
|
+
$[1] = t0;
|
|
27
|
+
} else t0 = $[1];
|
|
28
|
+
const t1 = isString(props.value) ? props.value : null;
|
|
29
|
+
const t2 = props.field.settings?.withSeconds === true;
|
|
30
|
+
let t3;
|
|
31
|
+
if ($[2] !== props.onChange || $[3] !== t0 || $[4] !== t1 || $[5] !== t2) {
|
|
32
|
+
t3 = /* @__PURE__ */ jsx(TimeField, {
|
|
33
|
+
...t0,
|
|
34
|
+
value: t1,
|
|
35
|
+
onChange: props.onChange,
|
|
36
|
+
withSeconds: t2
|
|
37
|
+
});
|
|
38
|
+
$[2] = props.onChange;
|
|
39
|
+
$[3] = t0;
|
|
40
|
+
$[4] = t1;
|
|
41
|
+
$[5] = t2;
|
|
42
|
+
$[6] = t3;
|
|
43
|
+
} else t3 = $[6];
|
|
44
|
+
return t3;
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { TimeField, TimeFieldEntry };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=TimeField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeField.js","names":["_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,UAAU,EACtB,OACA,UACA,cAAc,OACd,UACA,UACA,UACA,GAAG,SACY;CACf,OACI,oBAAC,WAAD;EACI,GAAI;EACJ,aAAa,cAAc,WAAW;EACtC,OAAO,OAAO,KAAK;EACnB,WAAW,SAAS,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,WAAW,CAAC;EACjF,YAAY;EACZ,YAAY;EACZ,YAAY;CAAS,CAAA;AAGjC;;AAGA,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGS,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAEM,MAAA,KAAA,MAAK,MAAM,UAAsB,gBAAK;CAAI,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJ3D,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GACF,aAAA;EAA0C,CAAA;EACzD,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/time/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TimeField, TimeFieldEntry } from "./TimeField.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
.panneau-open-bOtJNo {
|
|
2
|
+
display: inline-flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
padding: var(--panneau-space-1);
|
|
5
|
+
color: var(--panneau-color-text-muted);
|
|
6
|
+
border-radius: var(--panneau-radius-sm);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.panneau-open-bOtJNo:hover {
|
|
10
|
+
color: var(--panneau-color-text);
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FieldEntryProps } from '../shared/types';
|
|
2
|
+
import { type TextFieldProps } from '../text/TextField';
|
|
3
|
+
export interface UrlFieldProps extends Omit<TextFieldProps, 'type' | 'inputMode' | 'suffix'> {
|
|
4
|
+
/** Scheme added on blur to a URL without one (`example.com`). Defaults to `https://`. */
|
|
5
|
+
defaultScheme?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Adds a scheme to a URL that has none, and isn't a path or an anchor. */
|
|
8
|
+
export declare function withScheme(url: string, scheme?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme
|
|
11
|
+
* gets `https://` on blur, as v4 did.
|
|
12
|
+
*/
|
|
13
|
+
export declare function UrlField({ value, onChange, onBlur, defaultScheme, ...props }: UrlFieldProps): import("react").JSX.Element;
|
|
14
|
+
/** The `url` type: setting `defaultScheme`. */
|
|
15
|
+
export declare function UrlFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=UrlField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UrlField.d.ts","sourceRoot":"","sources":["../../src/url/UrlField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnE,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACxF,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAa,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACrB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,aAA0B,EAC1B,GAAG,KAAK,EACX,EAAE,aAAa,+BAmCf;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,+BAUnD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getFieldProps, getSetting, isString } from "../shared/entry.js";
|
|
2
|
+
import { messages } from "../shared/messages.js";
|
|
3
|
+
import { TextField } from "../text/TextField.js";
|
|
4
|
+
import UrlField_module_default from "./UrlField.module.js";
|
|
5
|
+
import { c } from "react/compiler-runtime";
|
|
6
|
+
import { Icon, usePanneauIntl } from "@panneau/ui";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { ExternalLink } from "lucide-react";
|
|
9
|
+
//#region src/url/UrlField.tsx
|
|
10
|
+
var SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
11
|
+
/** Adds a scheme to a URL that has none, and isn't a path or an anchor. */
|
|
12
|
+
function withScheme(url, scheme = "https://") {
|
|
13
|
+
const trimmed = url.trim();
|
|
14
|
+
if (trimmed.startsWith("//")) return `${scheme}${trimmed.slice(2)}`;
|
|
15
|
+
if (trimmed === "" || SCHEME.test(trimmed) || /^[/#?]/.test(trimmed)) return trimmed;
|
|
16
|
+
return `${scheme}${trimmed}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme
|
|
20
|
+
* gets `https://` on blur, as v4 did.
|
|
21
|
+
*/
|
|
22
|
+
function UrlField({ value, onChange, onBlur, defaultScheme = "https://", ...props }) {
|
|
23
|
+
const intl = usePanneauIntl();
|
|
24
|
+
const openable = value !== null && value !== void 0 && /^https?:\/\//i.test(value);
|
|
25
|
+
return /* @__PURE__ */ jsx(TextField, {
|
|
26
|
+
autoComplete: "off",
|
|
27
|
+
...props,
|
|
28
|
+
type: "url",
|
|
29
|
+
inputMode: "url",
|
|
30
|
+
value,
|
|
31
|
+
onChange,
|
|
32
|
+
onBlur: () => {
|
|
33
|
+
if (value !== null && value !== void 0) {
|
|
34
|
+
const next = withScheme(value, defaultScheme);
|
|
35
|
+
if (next !== value) onChange?.(next === "" ? null : next);
|
|
36
|
+
}
|
|
37
|
+
onBlur?.();
|
|
38
|
+
},
|
|
39
|
+
suffix: openable ? /* @__PURE__ */ jsx("a", {
|
|
40
|
+
href: value,
|
|
41
|
+
target: "_blank",
|
|
42
|
+
rel: "noopener noreferrer",
|
|
43
|
+
className: UrlField_module_default.open,
|
|
44
|
+
title: intl.formatMessage(messages.openLink),
|
|
45
|
+
children: /* @__PURE__ */ jsx(Icon, {
|
|
46
|
+
icon: ExternalLink,
|
|
47
|
+
label: intl.formatMessage(messages.openLink)
|
|
48
|
+
})
|
|
49
|
+
}) : void 0
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** The `url` type: setting `defaultScheme`. */
|
|
53
|
+
function UrlFieldEntry(props) {
|
|
54
|
+
const $ = c(11);
|
|
55
|
+
let t0;
|
|
56
|
+
if ($[0] !== props.field) {
|
|
57
|
+
t0 = getSetting(props.field, "defaultScheme", isString);
|
|
58
|
+
$[0] = props.field;
|
|
59
|
+
$[1] = t0;
|
|
60
|
+
} else t0 = $[1];
|
|
61
|
+
const defaultScheme = t0;
|
|
62
|
+
let t1;
|
|
63
|
+
if ($[2] !== props) {
|
|
64
|
+
t1 = getFieldProps(props);
|
|
65
|
+
$[2] = props;
|
|
66
|
+
$[3] = t1;
|
|
67
|
+
} else t1 = $[3];
|
|
68
|
+
const t2 = isString(props.value) ? props.value : null;
|
|
69
|
+
let t3;
|
|
70
|
+
if ($[4] !== defaultScheme) {
|
|
71
|
+
t3 = defaultScheme !== void 0 ? { defaultScheme } : {};
|
|
72
|
+
$[4] = defaultScheme;
|
|
73
|
+
$[5] = t3;
|
|
74
|
+
} else t3 = $[5];
|
|
75
|
+
let t4;
|
|
76
|
+
if ($[6] !== props.onChange || $[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
|
|
77
|
+
t4 = /* @__PURE__ */ jsx(UrlField, {
|
|
78
|
+
...t1,
|
|
79
|
+
value: t2,
|
|
80
|
+
onChange: props.onChange,
|
|
81
|
+
...t3
|
|
82
|
+
});
|
|
83
|
+
$[6] = props.onChange;
|
|
84
|
+
$[7] = t1;
|
|
85
|
+
$[8] = t2;
|
|
86
|
+
$[9] = t3;
|
|
87
|
+
$[10] = t4;
|
|
88
|
+
} else t4 = $[10];
|
|
89
|
+
return t4;
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { UrlField, UrlFieldEntry, withScheme };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=UrlField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UrlField.js","names":["styles","_c"],"sources":["../../src/url/UrlField.tsx"],"sourcesContent":["import { ExternalLink } from 'lucide-react';\n\nimport { Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\nimport styles from './UrlField.module.css';\n\nexport interface UrlFieldProps extends Omit<TextFieldProps, 'type' | 'inputMode' | 'suffix'> {\n /** Scheme added on blur to a URL without one (`example.com`). Defaults to `https://`. */\n defaultScheme?: string;\n}\n\nconst SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** Adds a scheme to a URL that has none, and isn't a path or an anchor. */\nexport function withScheme(url: string, scheme = 'https://'): string {\n const trimmed = url.trim();\n if (trimmed.startsWith('//')) {\n return `${scheme}${trimmed.slice(2)}`;\n }\n if (trimmed === '' || SCHEME.test(trimmed) || /^[/#?]/.test(trimmed)) {\n return trimmed;\n }\n return `${scheme}${trimmed}`;\n}\n\n/**\n * A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme\n * gets `https://` on blur, as v4 did.\n */\nexport function UrlField({\n value,\n onChange,\n onBlur,\n defaultScheme = 'https://',\n ...props\n}: UrlFieldProps) {\n const intl = usePanneauIntl();\n const openable = value !== null && value !== undefined && /^https?:\\/\\//i.test(value);\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"url\"\n inputMode=\"url\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = withScheme(value, defaultScheme);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n openable ? (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.open}\n title={intl.formatMessage(messages.openLink)}\n >\n <Icon icon={ExternalLink} label={intl.formatMessage(messages.openLink)} />\n </a>\n ) : undefined\n }\n />\n );\n}\n\n/** The `url` type: setting `defaultScheme`. */\nexport function UrlFieldEntry(props: FieldEntryProps) {\n const defaultScheme = getSetting(props.field, 'defaultScheme', isString);\n return (\n <UrlField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(defaultScheme !== undefined ? { defaultScheme } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAeA,IAAM,SAAS;;AAGf,SAAgB,WAAW,KAAa,SAAS,YAAoB;CACjE,MAAM,UAAU,IAAI,KAAK;CACzB,IAAI,QAAQ,WAAW,IAAI,GACvB,OAAO,GAAG,SAAS,QAAQ,MAAM,CAAC;CAEtC,IAAI,YAAY,MAAM,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,GAC/D,OAAO;CAEX,OAAO,GAAG,SAAS;AACvB;;;;;AAMA,SAAgB,SAAS,EACrB,OACA,UACA,QACA,gBAAgB,YAChB,GAAG,SACW;CACd,MAAM,OAAO,eAAe;CAC5B,MAAM,WAAW,UAAU,QAAQ,UAAU,KAAA,KAAa,gBAAgB,KAAK,KAAK;CACpF,OACI,oBAAC,WAAD;EACI,cAAa;EACb,GAAI;EACJ,MAAK;EACL,WAAU;EACH;EACG;EACV,cAAc;GACV,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW;IACvC,MAAM,OAAO,WAAW,OAAO,aAAa;IAC5C,IAAI,SAAS,OACT,WAAW,SAAS,KAAK,OAAO,IAAI;GAE5C;GACA,SAAS;EACb;EACA,QACI,WACI,oBAAC,KAAD;GACI,MAAM;GACN,QAAO;GACP,KAAI;GACJ,WAAWA,wBAAO;GAClB,OAAO,KAAK,cAAc,SAAS,QAAQ;GAE3C,UAAA,oBAAC,MAAD;IAAM,MAAM;IAAc,OAAO,KAAK,cAAc,SAAS,QAAQ;GAAE,CAAA;EACxE,CAAA,IACH,KAAA;CACP,CAAA;AAGb;;AAGA,SAAO,cAAA,OAAA;CAAA,MAAA,IAAAC,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,OAAA;EACmB,KAAA,WAAW,MAAK,OAAQ,iBAAiB,QAAQ;EAAC,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAxE,MAAA,gBAAsB;CAAmD,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAG7D,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAA0C,IAAA;CAAA,IAAA,EAAA,OAAA,eAAA;EAE5C,KAAA,kBAAkB,KAAA,IAAlB,EAAA,cAAmD,IAAnD,CAAmD;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJ7D,KAAA,oBAAC,UAAD;GAAS,GACD;GACG,OAAA;GACG,UAAA,MAAK;GAAS,GACnB;EAAoD,CAAA;EAC3D,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UrlField.module.js","names":[],"sources":["../../src/url/UrlField.module.css"],"sourcesContent":[".open {\n display: inline-flex;\n align-items: center;\n padding: var(--panneau-space-1);\n color: var(--panneau-color-text-muted);\n border-radius: var(--panneau-radius-sm);\n}\n\n.open:hover {\n color: var(--panneau-color-text);\n}\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/url/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { UrlField, UrlFieldEntry, withScheme } from "./UrlField.js";
|