@panneau/fields 4.1.0 → 5.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -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 +40 -0
- package/dist/relation/RelationField.d.ts.map +1 -0
- package/dist/relation/RelationField.js +293 -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 +37 -0
- package/dist/shared/relation.d.ts.map +1 -0
- package/dist/shared/relation.js +49 -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 @@
|
|
|
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";
|
package/package.json
CHANGED
|
@@ -1,101 +1,130 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panneau/fields",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "",
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
],
|
|
8
|
-
"homepage": "https://github.com/folkloreinc/panneau-js",
|
|
3
|
+
"version": "5.0.0-alpha.0",
|
|
4
|
+
"description": "Controlled field components of Panneau for the protocol's built-in field types, one subpath per field.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
9
7
|
"repository": {
|
|
10
8
|
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/folkloreinc/panneau-js.git"
|
|
9
|
+
"url": "git+https://github.com/folkloreinc/panneau-js.git",
|
|
10
|
+
"directory": "packages/fields"
|
|
12
11
|
},
|
|
13
|
-
"license": "ISC",
|
|
14
|
-
"author": {
|
|
15
|
-
"name": "Folklore",
|
|
16
|
-
"email": "info@folklore.email"
|
|
17
|
-
},
|
|
18
|
-
"contributors": [
|
|
19
|
-
{
|
|
20
|
-
"name": "David Mongeau-Petitpas",
|
|
21
|
-
"email": "dmp@folklore.email"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"name": "Nicolas Roy-Bourdages",
|
|
25
|
-
"email": "nrb@folklore.email"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"name": "Julien Carignan",
|
|
29
|
-
"email": "jc@folklore.email"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"name": "Théo Gjini",
|
|
33
|
-
"email": "tg@folklore.email"
|
|
34
|
-
}
|
|
35
|
-
],
|
|
36
12
|
"sideEffects": [
|
|
37
|
-
"
|
|
13
|
+
"*.css"
|
|
38
14
|
],
|
|
39
|
-
"type": "module",
|
|
40
15
|
"exports": {
|
|
41
16
|
".": {
|
|
17
|
+
"@panneau/source": "./src/index.ts",
|
|
42
18
|
"types": "./dist/index.d.ts",
|
|
43
|
-
"style": "./assets/css/styles.css",
|
|
44
19
|
"default": "./dist/index.js"
|
|
45
20
|
},
|
|
46
|
-
"./
|
|
47
|
-
|
|
21
|
+
"./text": {
|
|
22
|
+
"@panneau/source": "./src/text/index.ts",
|
|
23
|
+
"types": "./dist/text/index.d.ts",
|
|
24
|
+
"default": "./dist/text/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./textarea": {
|
|
27
|
+
"@panneau/source": "./src/textarea/index.ts",
|
|
28
|
+
"types": "./dist/textarea/index.d.ts",
|
|
29
|
+
"default": "./dist/textarea/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./number": {
|
|
32
|
+
"@panneau/source": "./src/number/index.ts",
|
|
33
|
+
"types": "./dist/number/index.d.ts",
|
|
34
|
+
"default": "./dist/number/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./boolean": {
|
|
37
|
+
"@panneau/source": "./src/boolean/index.ts",
|
|
38
|
+
"types": "./dist/boolean/index.d.ts",
|
|
39
|
+
"default": "./dist/boolean/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./date": {
|
|
42
|
+
"@panneau/source": "./src/date/index.ts",
|
|
43
|
+
"types": "./dist/date/index.d.ts",
|
|
44
|
+
"default": "./dist/date/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./datetime": {
|
|
47
|
+
"@panneau/source": "./src/datetime/index.ts",
|
|
48
|
+
"types": "./dist/datetime/index.d.ts",
|
|
49
|
+
"default": "./dist/datetime/index.js"
|
|
50
|
+
},
|
|
51
|
+
"./time": {
|
|
52
|
+
"@panneau/source": "./src/time/index.ts",
|
|
53
|
+
"types": "./dist/time/index.d.ts",
|
|
54
|
+
"default": "./dist/time/index.js"
|
|
55
|
+
},
|
|
56
|
+
"./select": {
|
|
57
|
+
"@panneau/source": "./src/select/index.ts",
|
|
58
|
+
"types": "./dist/select/index.d.ts",
|
|
59
|
+
"default": "./dist/select/index.js"
|
|
60
|
+
},
|
|
61
|
+
"./email": {
|
|
62
|
+
"@panneau/source": "./src/email/index.ts",
|
|
63
|
+
"types": "./dist/email/index.d.ts",
|
|
64
|
+
"default": "./dist/email/index.js"
|
|
65
|
+
},
|
|
66
|
+
"./url": {
|
|
67
|
+
"@panneau/source": "./src/url/index.ts",
|
|
68
|
+
"types": "./dist/url/index.d.ts",
|
|
69
|
+
"default": "./dist/url/index.js"
|
|
70
|
+
},
|
|
71
|
+
"./color": {
|
|
72
|
+
"@panneau/source": "./src/color/index.ts",
|
|
73
|
+
"types": "./dist/color/index.d.ts",
|
|
74
|
+
"default": "./dist/color/index.js"
|
|
75
|
+
},
|
|
76
|
+
"./slug": {
|
|
77
|
+
"@panneau/source": "./src/slug/index.ts",
|
|
78
|
+
"types": "./dist/slug/index.d.ts",
|
|
79
|
+
"default": "./dist/slug/index.js"
|
|
80
|
+
},
|
|
81
|
+
"./localized": {
|
|
82
|
+
"@panneau/source": "./src/localized/index.ts",
|
|
83
|
+
"types": "./dist/localized/index.d.ts",
|
|
84
|
+
"default": "./dist/localized/index.js"
|
|
85
|
+
},
|
|
86
|
+
"./group": {
|
|
87
|
+
"@panneau/source": "./src/group/index.ts",
|
|
88
|
+
"types": "./dist/group/index.d.ts",
|
|
89
|
+
"default": "./dist/group/index.js"
|
|
90
|
+
},
|
|
91
|
+
"./repeater": {
|
|
92
|
+
"@panneau/source": "./src/repeater/index.ts",
|
|
93
|
+
"types": "./dist/repeater/index.d.ts",
|
|
94
|
+
"default": "./dist/repeater/index.js"
|
|
95
|
+
},
|
|
96
|
+
"./relation": {
|
|
97
|
+
"@panneau/source": "./src/relation/index.ts",
|
|
98
|
+
"types": "./dist/relation/index.d.ts",
|
|
99
|
+
"default": "./dist/relation/index.js"
|
|
100
|
+
},
|
|
101
|
+
"./locales": {
|
|
102
|
+
"@panneau/source": "./src/locales/index.ts",
|
|
103
|
+
"types": "./dist/locales/index.d.ts",
|
|
104
|
+
"default": "./dist/locales/index.js"
|
|
105
|
+
},
|
|
106
|
+
"./package.json": "./package.json"
|
|
48
107
|
},
|
|
49
|
-
"module": "dist/index.js",
|
|
50
|
-
"types": "dist/index.d.ts",
|
|
51
|
-
"style": "assets/css/styles.css",
|
|
52
108
|
"files": [
|
|
53
|
-
"dist"
|
|
54
|
-
"assets"
|
|
109
|
+
"dist"
|
|
55
110
|
],
|
|
56
111
|
"scripts": {
|
|
57
|
-
"build": "
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
},
|
|
61
|
-
"dependencies": {
|
|
62
|
-
"@babel/runtime": "^7.28.6",
|
|
63
|
-
"@panneau/core": "^4.1.0",
|
|
64
|
-
"@panneau/field-autocomplete": "^4.1.0",
|
|
65
|
-
"@panneau/field-checkboxes": "^4.1.0",
|
|
66
|
-
"@panneau/field-color": "^4.1.0",
|
|
67
|
-
"@panneau/field-date": "^4.1.0",
|
|
68
|
-
"@panneau/field-display": "^4.1.0",
|
|
69
|
-
"@panneau/field-embed": "^4.1.0",
|
|
70
|
-
"@panneau/field-fields": "^4.1.0",
|
|
71
|
-
"@panneau/field-html": "^4.1.0",
|
|
72
|
-
"@panneau/field-import": "^4.1.0",
|
|
73
|
-
"@panneau/field-input-group": "^4.1.0",
|
|
74
|
-
"@panneau/field-item": "^4.1.0",
|
|
75
|
-
"@panneau/field-items": "^4.1.0",
|
|
76
|
-
"@panneau/field-localized": "^4.1.0",
|
|
77
|
-
"@panneau/field-media": "^4.1.0",
|
|
78
|
-
"@panneau/field-number": "^4.1.0",
|
|
79
|
-
"@panneau/field-radios": "^4.1.0",
|
|
80
|
-
"@panneau/field-resource-item": "^4.1.0",
|
|
81
|
-
"@panneau/field-select": "^4.1.0",
|
|
82
|
-
"@panneau/field-text": "^4.1.0",
|
|
83
|
-
"@panneau/field-toggle": "^4.1.0",
|
|
84
|
-
"@panneau/field-toggles": "^4.1.0",
|
|
85
|
-
"@panneau/field-upload": "^4.1.0",
|
|
86
|
-
"@panneau/field-url": "^4.1.0",
|
|
87
|
-
"lodash-es": "^4.17.21"
|
|
112
|
+
"build": "vite build && tsc -p tsconfig.build.json",
|
|
113
|
+
"typecheck": "tsc --noEmit",
|
|
114
|
+
"api": "tsc -p tsconfig.build.json && node ../../scripts/api-report.js"
|
|
88
115
|
},
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"react-dom": "^19.0.0"
|
|
116
|
+
"publishConfig": {
|
|
117
|
+
"access": "public"
|
|
92
118
|
},
|
|
93
119
|
"peerDependencies": {
|
|
94
120
|
"react": "^19.2.0",
|
|
95
|
-
"react-
|
|
121
|
+
"react-intl": "^12.0.0"
|
|
96
122
|
},
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
|
|
100
|
-
|
|
123
|
+
"dependencies": {
|
|
124
|
+
"@internationalized/date": "^3.12.4",
|
|
125
|
+
"@panneau/intl": "5.0.0-alpha.0",
|
|
126
|
+
"@panneau/protocol": "5.0.0-alpha.0",
|
|
127
|
+
"@panneau/ui": "5.0.0-alpha.0",
|
|
128
|
+
"lucide-react": "^1.57.0"
|
|
129
|
+
}
|
|
101
130
|
}
|
package/assets/css/styles.css
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
@import url('@panneau/field-autocomplete');
|
|
2
|
-
@import url('@panneau/field-checkboxes');
|
|
3
|
-
@import url('@panneau/field-color');
|
|
4
|
-
@import url('@panneau/field-date');
|
|
5
|
-
@import url('@panneau/field-html');
|
|
6
|
-
@import url('@panneau/field-import');
|
|
7
|
-
@import url('@panneau/field-input-group');
|
|
8
|
-
@import url('@panneau/field-media');
|
|
9
|
-
@import url('@panneau/field-number');
|
|
10
|
-
@import url('@panneau/field-text');
|
|
11
|
-
@import url('@panneau/field-toggle');
|
|
12
|
-
@import url('@panneau/field-toggles');
|
|
13
|
-
@import url('@panneau/field-upload');
|
|
14
|
-
|