@panneau/fields 5.0.0-alpha.2 → 5.0.0-alpha.20
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 +186 -20
- package/dist/address/AddressField.css +44 -0
- package/dist/address/AddressField.d.ts +37 -0
- package/dist/address/AddressField.d.ts.map +1 -0
- package/dist/address/AddressField.js +411 -0
- package/dist/address/AddressField.js.map +1 -0
- package/dist/address/AddressField.module.js +22 -0
- package/dist/address/AddressField.module.js.map +1 -0
- package/dist/address/address.d.ts +23 -0
- package/dist/address/address.d.ts.map +1 -0
- package/dist/address/address.js +58 -0
- package/dist/address/address.js.map +1 -0
- package/dist/address/index.d.ts +3 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/address/index.js +3 -0
- package/dist/boolean/BooleanField.d.ts +1 -1
- package/dist/boolean/BooleanField.js +78 -17
- package/dist/boolean/BooleanField.js.map +1 -1
- package/dist/boolean/index.d.ts +1 -1
- package/dist/color/ColorField.css +9 -0
- package/dist/color/ColorField.d.ts +12 -5
- package/dist/color/ColorField.d.ts.map +1 -1
- package/dist/color/ColorField.js +341 -81
- package/dist/color/ColorField.js.map +1 -1
- package/dist/color/ColorField.module.js +4 -2
- package/dist/color/ColorField.module.js.map +1 -1
- package/dist/color/index.d.ts +2 -1
- package/dist/color/index.d.ts.map +1 -1
- package/dist/color/index.js +3 -1
- package/dist/color/palette.d.ts +23 -0
- package/dist/color/palette.d.ts.map +1 -0
- package/dist/color/palette.js +34 -0
- package/dist/color/palette.js.map +1 -0
- package/dist/compound/Compound.css +26 -0
- package/dist/compound/Compound.module.js +16 -0
- package/dist/compound/Compound.module.js.map +1 -0
- package/dist/compound/compound.d.ts +56 -0
- package/dist/compound/compound.d.ts.map +1 -0
- package/dist/compound/compound.js +186 -0
- package/dist/compound/compound.js.map +1 -0
- package/dist/country/CountryField.css +42 -0
- package/dist/country/CountryField.d.ts +32 -0
- package/dist/country/CountryField.d.ts.map +1 -0
- package/dist/country/CountryField.js +424 -0
- package/dist/country/CountryField.js.map +1 -0
- package/dist/country/CountryField.module.js +20 -0
- package/dist/country/CountryField.module.js.map +1 -0
- package/dist/country/codes.d.ts +6 -0
- package/dist/country/codes.d.ts.map +1 -0
- package/dist/country/codes.js +261 -0
- package/dist/country/codes.js.map +1 -0
- package/dist/country/countries.d.ts +32 -0
- package/dist/country/countries.d.ts.map +1 -0
- package/dist/country/countries.js +60 -0
- package/dist/country/countries.js.map +1 -0
- package/dist/country/index.d.ts +3 -0
- package/dist/country/index.d.ts.map +1 -0
- package/dist/country/index.js +4 -0
- package/dist/credits/CreditsField.d.ts +15 -0
- package/dist/credits/CreditsField.d.ts.map +1 -0
- package/dist/credits/CreditsField.js +58 -0
- package/dist/credits/CreditsField.js.map +1 -0
- package/dist/credits/credits.d.ts +18 -0
- package/dist/credits/credits.d.ts.map +1 -0
- package/dist/credits/credits.js +33 -0
- package/dist/credits/credits.js.map +1 -0
- package/dist/credits/index.d.ts +5 -0
- package/dist/credits/index.d.ts.map +1 -0
- package/dist/credits/index.js +3 -0
- package/dist/date/DateField.d.ts +1 -1
- package/dist/date/DateField.js.map +1 -1
- package/dist/date/index.d.ts +1 -1
- package/dist/daterange/DateRangeField.css +9 -0
- package/dist/daterange/DateRangeField.d.ts +31 -0
- package/dist/daterange/DateRangeField.d.ts.map +1 -0
- package/dist/daterange/DateRangeField.js +372 -0
- package/dist/daterange/DateRangeField.js.map +1 -0
- package/dist/daterange/DateRangeField.module.js +12 -0
- package/dist/daterange/DateRangeField.module.js.map +1 -0
- package/dist/daterange/index.d.ts +3 -0
- package/dist/daterange/index.d.ts.map +1 -0
- package/dist/daterange/index.js +3 -0
- package/dist/daterange/range.d.ts +61 -0
- package/dist/daterange/range.d.ts.map +1 -0
- package/dist/daterange/range.js +119 -0
- package/dist/daterange/range.js.map +1 -0
- package/dist/datetime/DateTimeField.d.ts +1 -1
- package/dist/datetime/DateTimeField.js +107 -20
- package/dist/datetime/DateTimeField.js.map +1 -1
- package/dist/datetime/index.d.ts +1 -1
- package/dist/duration/DurationField.css +11 -0
- package/dist/duration/DurationField.d.ts +67 -0
- package/dist/duration/DurationField.d.ts.map +1 -0
- package/dist/duration/DurationField.js +260 -0
- package/dist/duration/DurationField.js.map +1 -0
- package/dist/duration/DurationField.module.js +12 -0
- package/dist/duration/DurationField.module.js.map +1 -0
- package/dist/duration/index.d.ts +2 -0
- package/dist/duration/index.d.ts.map +1 -0
- package/dist/duration/index.js +1 -0
- package/dist/email/EmailField.d.ts +2 -2
- package/dist/email/EmailField.js.map +1 -1
- package/dist/email/index.d.ts +1 -1
- package/dist/embed/EmbedField.css +60 -0
- package/dist/embed/EmbedField.d.ts +29 -0
- package/dist/embed/EmbedField.d.ts.map +1 -0
- package/dist/embed/EmbedField.js +309 -0
- package/dist/embed/EmbedField.js.map +1 -0
- package/dist/embed/EmbedField.module.js +22 -0
- package/dist/embed/EmbedField.module.js.map +1 -0
- package/dist/embed/index.d.ts +3 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +3 -0
- package/dist/file/FileField.css +54 -0
- package/dist/file/FileField.d.ts +50 -0
- package/dist/file/FileField.d.ts.map +1 -0
- package/dist/file/FileField.js +288 -0
- package/dist/file/FileField.js.map +1 -0
- package/dist/file/FileField.module.js +22 -0
- package/dist/file/FileField.module.js.map +1 -0
- package/dist/file/index.d.ts +3 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +1 -0
- package/dist/group/GroupField.css +20 -3
- package/dist/group/GroupField.d.ts +10 -4
- package/dist/group/GroupField.d.ts.map +1 -1
- package/dist/group/GroupField.js +71 -66
- package/dist/group/GroupField.js.map +1 -1
- package/dist/group/GroupField.module.js +10 -2
- package/dist/group/GroupField.module.js.map +1 -1
- package/dist/group/index.d.ts +1 -1
- package/dist/index.d.ts +21 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/json/JsonField.css +7 -0
- package/dist/json/JsonField.d.ts +22 -0
- package/dist/json/JsonField.d.ts.map +1 -0
- package/dist/json/JsonField.js +207 -0
- package/dist/json/JsonField.js.map +1 -0
- package/dist/json/JsonField.module.js +8 -0
- package/dist/json/JsonField.module.js.map +1 -0
- package/dist/json/index.d.ts +2 -0
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +1 -0
- package/dist/link/LinkField.css +12 -0
- package/dist/link/LinkField.d.ts +38 -0
- package/dist/link/LinkField.d.ts.map +1 -0
- package/dist/link/LinkField.js +742 -0
- package/dist/link/LinkField.js.map +1 -0
- package/dist/link/LinkField.module.js +8 -0
- package/dist/link/LinkField.module.js.map +1 -0
- package/dist/link/index.d.ts +3 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +3 -0
- package/dist/link/link.d.ts +30 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +63 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/pages.d.ts +17 -0
- package/dist/link/pages.d.ts.map +1 -0
- package/dist/link/pages.js +104 -0
- package/dist/link/pages.js.map +1 -0
- package/dist/locales/index.js.map +1 -1
- package/dist/localized/LocalizedField.css +27 -6
- package/dist/localized/LocalizedField.d.ts +19 -8
- package/dist/localized/LocalizedField.d.ts.map +1 -1
- package/dist/localized/LocalizedField.js +238 -105
- package/dist/localized/LocalizedField.js.map +1 -1
- package/dist/localized/LocalizedField.module.js +10 -4
- package/dist/localized/LocalizedField.module.js.map +1 -1
- package/dist/localized/index.d.ts +1 -1
- package/dist/location/LocationField.css +54 -0
- package/dist/location/LocationField.d.ts +31 -0
- package/dist/location/LocationField.d.ts.map +1 -0
- package/dist/location/LocationField.js +487 -0
- package/dist/location/LocationField.js.map +1 -0
- package/dist/location/LocationField.module.js +22 -0
- package/dist/location/LocationField.module.js.map +1 -0
- package/dist/location/LocationMap.d.ts +25 -0
- package/dist/location/LocationMap.d.ts.map +1 -0
- package/dist/location/LocationMap.js +205 -0
- package/dist/location/LocationMap.js.map +1 -0
- package/dist/location/index.d.ts +5 -0
- package/dist/location/index.d.ts.map +1 -0
- package/dist/location/index.js +4 -0
- package/dist/location/leafletCss.d.ts +2 -0
- package/dist/location/leafletCss.d.ts.map +1 -0
- package/dist/location/leafletCss.js +6 -0
- package/dist/location/leafletCss.js.map +1 -0
- package/dist/location/nominatim.d.ts +23 -0
- package/dist/location/nominatim.d.ts.map +1 -0
- package/dist/location/nominatim.js +79 -0
- package/dist/location/nominatim.js.map +1 -0
- package/dist/location/search.d.ts +10 -0
- package/dist/location/search.d.ts.map +1 -0
- package/dist/location/search.js +83 -0
- package/dist/location/search.js.map +1 -0
- package/dist/location/types.d.ts +46 -0
- package/dist/location/types.d.ts.map +1 -0
- package/dist/missing/MissingField.d.ts +4 -3
- package/dist/missing/MissingField.d.ts.map +1 -1
- package/dist/missing/MissingField.js +3 -2
- package/dist/missing/MissingField.js.map +1 -1
- package/dist/money/MoneyField.d.ts +28 -0
- package/dist/money/MoneyField.d.ts.map +1 -0
- package/dist/money/MoneyField.js +269 -0
- package/dist/money/MoneyField.js.map +1 -0
- package/dist/money/index.d.ts +3 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/index.js +3 -0
- package/dist/money/money.d.ts +27 -0
- package/dist/money/money.d.ts.map +1 -0
- package/dist/money/money.js +56 -0
- package/dist/money/money.js.map +1 -0
- package/dist/number/NumberField.d.ts +1 -1
- package/dist/number/NumberField.js.map +1 -1
- package/dist/number/index.d.ts +1 -1
- package/dist/range/RangeField.d.ts +22 -0
- package/dist/range/RangeField.d.ts.map +1 -0
- package/dist/range/RangeField.js +203 -0
- package/dist/range/RangeField.js.map +1 -0
- package/dist/range/index.d.ts +2 -0
- package/dist/range/index.d.ts.map +1 -0
- package/dist/range/index.js +1 -0
- package/dist/region/RegionField.d.ts +23 -0
- package/dist/region/RegionField.d.ts.map +1 -0
- package/dist/region/RegionField.js +174 -0
- package/dist/region/RegionField.js.map +1 -0
- package/dist/region/RegionFlag.css +9 -0
- package/dist/region/RegionFlag.d.ts +20 -0
- package/dist/region/RegionFlag.d.ts.map +1 -0
- package/dist/region/RegionFlag.js +61 -0
- package/dist/region/RegionFlag.js.map +1 -0
- package/dist/region/RegionFlag.module.js +8 -0
- package/dist/region/RegionFlag.module.js.map +1 -0
- package/dist/region/data.d.ts +5 -0
- package/dist/region/data.d.ts.map +1 -0
- package/dist/region/data.js +513 -0
- package/dist/region/data.js.map +1 -0
- package/dist/region/flags/CA.d.ts +4 -0
- package/dist/region/flags/CA.d.ts.map +1 -0
- package/dist/region/flags/CA.js +21 -0
- package/dist/region/flags/CA.js.map +1 -0
- package/dist/region/flags/US.d.ts +4 -0
- package/dist/region/flags/US.d.ts.map +1 -0
- package/dist/region/flags/US.js +65 -0
- package/dist/region/flags/US.js.map +1 -0
- package/dist/region/flags.d.ts +17 -0
- package/dist/region/flags.d.ts.map +1 -0
- package/dist/region/flags.js +84 -0
- package/dist/region/flags.js.map +1 -0
- package/dist/region/index.d.ts +5 -0
- package/dist/region/index.d.ts.map +1 -0
- package/dist/region/index.js +5 -0
- package/dist/region/regions.d.ts +15 -0
- package/dist/region/regions.d.ts.map +1 -0
- package/dist/region/regions.js +29 -0
- package/dist/region/regions.js.map +1 -0
- package/dist/relation/RelationField.d.ts +2 -2
- package/dist/relation/RelationField.d.ts.map +1 -1
- package/dist/relation/RelationField.js +511 -171
- package/dist/relation/RelationField.js.map +1 -1
- package/dist/relation/index.d.ts +2 -2
- package/dist/repeater/RepeaterField.d.ts +13 -2
- package/dist/repeater/RepeaterField.d.ts.map +1 -1
- package/dist/repeater/RepeaterField.js +138 -50
- package/dist/repeater/RepeaterField.js.map +1 -1
- package/dist/repeater/index.d.ts +1 -1
- package/dist/select/SelectField.d.ts +1 -1
- package/dist/select/SelectField.js.map +1 -1
- package/dist/select/index.d.ts +1 -1
- package/dist/sessions/SessionsField.d.ts +15 -0
- package/dist/sessions/SessionsField.d.ts.map +1 -0
- package/dist/sessions/SessionsField.js +49 -0
- package/dist/sessions/SessionsField.js.map +1 -0
- package/dist/sessions/index.d.ts +4 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +1 -0
- package/dist/shared/CodeComboBox.d.ts +21 -0
- package/dist/shared/CodeComboBox.d.ts.map +1 -0
- package/dist/shared/CodeComboBox.js +238 -0
- package/dist/shared/CodeComboBox.js.map +1 -0
- package/dist/shared/DefinitionField.d.ts +9 -4
- package/dist/shared/DefinitionField.d.ts.map +1 -1
- package/dist/shared/DefinitionField.js +98 -78
- package/dist/shared/DefinitionField.js.map +1 -1
- package/dist/shared/builtIn.d.ts +7 -3
- package/dist/shared/builtIn.d.ts.map +1 -1
- package/dist/shared/builtIn.js +39 -7
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/check.d.ts +27 -0
- package/dist/shared/check.d.ts.map +1 -0
- package/dist/shared/check.js +18 -0
- package/dist/shared/check.js.map +1 -0
- package/dist/shared/context.d.ts +33 -5
- package/dist/shared/context.d.ts.map +1 -1
- package/dist/shared/context.js +36 -20
- package/dist/shared/context.js.map +1 -1
- package/dist/shared/cx.js.map +1 -1
- package/dist/shared/dates.js +2 -2
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/embed.d.ts +19 -0
- package/dist/shared/embed.d.ts.map +1 -0
- package/dist/shared/embed.js +14 -0
- package/dist/shared/embed.js.map +1 -0
- package/dist/shared/entry.d.ts +13 -4
- package/dist/shared/entry.d.ts.map +1 -1
- package/dist/shared/entry.js +24 -7
- package/dist/shared/entry.js.map +1 -1
- package/dist/shared/flow.d.ts +8 -0
- package/dist/shared/flow.d.ts.map +1 -0
- package/dist/shared/flow.js +38 -0
- package/dist/shared/flow.js.map +1 -0
- package/dist/shared/part.d.ts +26 -0
- package/dist/shared/part.d.ts.map +1 -0
- package/dist/shared/part.js +64 -0
- package/dist/shared/part.js.map +1 -0
- package/dist/shared/relation.js.map +1 -1
- package/dist/shared/reveal.d.ts +16 -0
- package/dist/shared/reveal.d.ts.map +1 -0
- package/dist/shared/reveal.js +46 -0
- package/dist/shared/reveal.js.map +1 -0
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/slug/SlugField.css +18 -0
- package/dist/slug/SlugField.d.ts +33 -5
- package/dist/slug/SlugField.d.ts.map +1 -1
- package/dist/slug/SlugField.js +346 -126
- package/dist/slug/SlugField.js.map +1 -1
- package/dist/slug/SlugField.module.js +14 -0
- package/dist/slug/SlugField.module.js.map +1 -0
- package/dist/slug/index.d.ts +1 -1
- package/dist/slug/index.d.ts.map +1 -1
- package/dist/slug/index.js +1 -1
- package/dist/tags/TagsField.d.ts +17 -0
- package/dist/tags/TagsField.d.ts.map +1 -0
- package/dist/tags/TagsField.js +120 -0
- package/dist/tags/TagsField.js.map +1 -0
- package/dist/tags/index.d.ts +2 -0
- package/dist/tags/index.d.ts.map +1 -0
- package/dist/tags/index.js +1 -0
- package/dist/tel/TelField.css +25 -0
- package/dist/tel/TelField.d.ts +34 -0
- package/dist/tel/TelField.d.ts.map +1 -0
- package/dist/tel/TelField.js +390 -0
- package/dist/tel/TelField.js.map +1 -0
- package/dist/tel/TelField.module.js +12 -0
- package/dist/tel/TelField.module.js.map +1 -0
- package/dist/tel/index.d.ts +3 -0
- package/dist/tel/index.d.ts.map +1 -0
- package/dist/tel/index.js +3 -0
- package/dist/tel/phone.d.ts +59 -0
- package/dist/tel/phone.d.ts.map +1 -0
- package/dist/tel/phone.js +107 -0
- package/dist/tel/phone.js.map +1 -0
- package/dist/text/TextField.d.ts +12 -4
- package/dist/text/TextField.d.ts.map +1 -1
- package/dist/text/TextField.js +104 -60
- package/dist/text/TextField.js.map +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/textarea/TextAreaField.d.ts +1 -1
- package/dist/textarea/TextAreaField.js.map +1 -1
- package/dist/textarea/index.d.ts +1 -1
- package/dist/time/TimeField.d.ts +1 -1
- package/dist/time/TimeField.js +64 -10
- package/dist/time/TimeField.js.map +1 -1
- package/dist/time/index.d.ts +1 -1
- package/dist/upload/FilePicker.css +24 -0
- package/dist/upload/FilePicker.d.ts +14 -0
- package/dist/upload/FilePicker.d.ts.map +1 -0
- package/dist/upload/FilePicker.js +130 -0
- package/dist/upload/FilePicker.js.map +1 -0
- package/dist/upload/FilePicker.module.js +12 -0
- package/dist/upload/FilePicker.module.js.map +1 -0
- package/dist/upload/UploadList.css +93 -0
- package/dist/upload/UploadList.d.ts +18 -0
- package/dist/upload/UploadList.d.ts.map +1 -0
- package/dist/upload/UploadList.js +144 -0
- package/dist/upload/UploadList.js.map +1 -0
- package/dist/upload/UploadList.module.js +32 -0
- package/dist/upload/UploadList.module.js.map +1 -0
- package/dist/upload/files.d.ts +5 -0
- package/dist/upload/files.d.ts.map +1 -0
- package/dist/upload/files.js +26 -0
- package/dist/upload/files.js.map +1 -0
- package/dist/upload/types.d.ts +58 -0
- package/dist/upload/types.d.ts.map +1 -0
- package/dist/upload/useRejectionMessage.d.ts +4 -0
- package/dist/upload/useRejectionMessage.d.ts.map +1 -0
- package/dist/upload/useRejectionMessage.js +25 -0
- package/dist/upload/useRejectionMessage.js.map +1 -0
- package/dist/upload/useUploads.d.ts +30 -0
- package/dist/upload/useUploads.d.ts.map +1 -0
- package/dist/upload/useUploads.js +115 -0
- package/dist/upload/useUploads.js.map +1 -0
- package/dist/uppy/index.d.ts +3 -0
- package/dist/uppy/index.d.ts.map +1 -0
- package/dist/uppy/index.js +1 -0
- package/dist/uppy/uploader.d.ts +44 -0
- package/dist/uppy/uploader.d.ts.map +1 -0
- package/dist/uppy/uploader.js +139 -0
- package/dist/uppy/uploader.js.map +1 -0
- package/dist/url/UrlField.d.ts +2 -2
- package/dist/url/UrlField.d.ts.map +1 -1
- package/dist/url/UrlField.js +69 -14
- package/dist/url/UrlField.js.map +1 -1
- package/dist/url/index.d.ts +1 -1
- package/package.json +110 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailField.js","names":["
|
|
1
|
+
{"version":3,"file":"EmailField.js","names":["getFieldProps","isString","FieldEntryProps","TextField","TextFieldProps","EmailFieldProps","Omit","EmailField","t0","$","_c","onBlur","onChange","props","value","t1","trimmed","trim","t2","EmailFieldEntry","_c"],"sources":["../../src/email/EmailField.tsx"],"sourcesContent":["import { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\n\nexport type EmailFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;\n\n/** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */\nexport function EmailField({ value, onChange, onBlur, ...props }: EmailFieldProps) {\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"email\"\n inputMode=\"email\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n const trimmed = value?.trim() ?? null;\n if (trimmed !== value) {\n onChange?.(trimmed === '' ? null : trimmed);\n }\n onBlur?.();\n }}\n />\n );\n}\n\n/** The `email` type. */\nexport function EmailFieldEntry(props: FieldEntryProps) {\n return (\n <EmailField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":";;;;;;AAOA,SAAOO,WAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAL,EAAA,OAAAD,IAAA;EAAoB,CAAA,CAAAM,OAAAF,UAAAD,QAAA,GAAAE,SAAAL;EAAsDC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAA;EAAAH,SAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,QAAAL,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,UAAAF,EAAA,OAAAG,YAAAH,EAAA,OAAAK,OAAA;EAS7DC,WAAA;GACJ,MAAAC,UAAgBF,OAAKG,KAAe,KAApB;GAChB,IAAID,YAAYF,OACZF,WAAWI,YAAY,KAAZ,OAAAA,OAA+B;GAE9CL,SAAS;EAAC;EACbF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,YAAAH,EAAA,QAAAI,SAAAJ,EAAA,QAAAM,MAAAN,EAAA,QAAAK,OAAA;EAbLI,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACdL;GACC,MAAA;GACK,WAAA;GACHC;GACGF;GACF,QAAAG;EAMP,CAAA;EACHN,EAAA,KAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAM;EAAAN,EAAA,MAAAK;EAAAL,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAdFS;AAcE;;AAKV,SAAOC,gBAAAN,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAR,cAAca,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAM,KAAAd,SAASY,MAAKC,KAA2B,IAAjBD,MAAKC,QAA7B;CAA0C,IAAAI;CAAA,IAAAT,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAM,IAAA;EAFrDG,KAAA,oBAAC,YAAD;GAAW,GACHV;GACG,OAAAO;GACG,UAAAF,MAAKD;EAAS,CAAA;EAC1BH,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJFS;AAIE"}
|
package/dist/email/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { EmailField, EmailFieldEntry, type EmailFieldProps } from './EmailField';
|
|
1
|
+
export { EmailField, EmailFieldEntry, type EmailFieldProps } from './EmailField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* The URL, then the preview of what it embeds. */
|
|
2
|
+
.panneau-embed-field-embed {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--panneau-space-2);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.panneau-embed-field-status {
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: var(--panneau-space-2);
|
|
12
|
+
font-size: var(--panneau-font-size-sm);
|
|
13
|
+
color: var(--panneau-color-text-muted);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.panneau-embed-field-preview {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
gap: var(--panneau-space-3);
|
|
20
|
+
padding: var(--panneau-space-2);
|
|
21
|
+
color: var(--panneau-color-text);
|
|
22
|
+
text-decoration: none;
|
|
23
|
+
background-color: var(--panneau-color-surface-sunken);
|
|
24
|
+
border: var(--panneau-border-width) solid var(--panneau-color-border);
|
|
25
|
+
border-radius: var(--panneau-radius-md);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.panneau-embed-field-preview:hover {
|
|
29
|
+
border-color: var(--panneau-color-border-control);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.panneau-embed-field-preview:focus-visible {
|
|
33
|
+
outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
|
|
34
|
+
outline-offset: 1px;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.panneau-embed-field-thumbnail {
|
|
38
|
+
flex: none;
|
|
39
|
+
width: 7rem;
|
|
40
|
+
aspect-ratio: 16 / 9;
|
|
41
|
+
object-fit: cover;
|
|
42
|
+
border-radius: var(--panneau-radius-sm);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.panneau-embed-field-text {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
gap: 0.125rem;
|
|
49
|
+
min-width: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.panneau-embed-field-title {
|
|
53
|
+
font-weight: var(--panneau-font-weight-medium);
|
|
54
|
+
overflow-wrap: anywhere;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.panneau-embed-field-provider {
|
|
58
|
+
font-size: var(--panneau-font-size-sm);
|
|
59
|
+
color: var(--panneau-color-text-muted);
|
|
60
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { EmbedValue } from '@panneau/protocol';
|
|
2
|
+
import type { EmbedSource } from '../shared/embed.js';
|
|
3
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
4
|
+
export type { EmbedValue };
|
|
5
|
+
export interface EmbedFieldProps extends FieldProps<EmbedValue> {
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
/** Where the preview comes from. Defaults to that of the `FieldsProvider`. */
|
|
8
|
+
embedSource?: EmbedSource | null;
|
|
9
|
+
/**
|
|
10
|
+
* The providers an embed may come from (`YouTube`), compared without case: the `providers`
|
|
11
|
+
* rule (decision 0058). The field names them under its help, and refuses an embed of another
|
|
12
|
+
* provider as soon as its preview comes back. The form's errors, once shown, replace that one.
|
|
13
|
+
*/
|
|
14
|
+
providers?: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/** Whether a value is an embed: an object with a `url`. */
|
|
17
|
+
export declare function isEmbed(value: unknown): value is EmbedValue;
|
|
18
|
+
/**
|
|
19
|
+
* A URL of a video, a sound or a post, with the preview the backend gets from its provider's
|
|
20
|
+
* oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
|
|
21
|
+
* preview follows. Without an embed source, the value is the URL alone.
|
|
22
|
+
*/
|
|
23
|
+
export declare function EmbedField({ value, onChange, onBlur, embedSource: embedSourceProp, providers, errors, disabled, readOnly, required, description, ...props }: EmbedFieldProps): import("react").JSX.Element;
|
|
24
|
+
/**
|
|
25
|
+
* The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its
|
|
26
|
+
* `providers` rule names the providers it allows.
|
|
27
|
+
*/
|
|
28
|
+
export declare function EmbedFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=EmbedField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbedField.d.ts","sourceRoot":"","sources":["../../src/embed/EmbedField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,MAAM,WAAW,eAAgB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAM3D;AAgBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,SAAS,EACT,MAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,GAAG,KAAK,EACX,EAAE,eAAe,+BAmGjB;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAUrD"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { findRule, getFieldProps, isString } from "../shared/entry.js";
|
|
2
|
+
import { useFieldsContext } from "../shared/context.js";
|
|
3
|
+
import { messages } from "../shared/messages.js";
|
|
4
|
+
import EmbedField_module_default from "./EmbedField.module.js";
|
|
5
|
+
import { c } from "react/compiler-runtime";
|
|
6
|
+
import { Spinner, TextInput, usePanneauIntl } from "@panneau/ui";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { useEffect, useEffectEvent, useState } from "react";
|
|
9
|
+
import { formsMessages } from "@panneau/intl";
|
|
10
|
+
//#region src/embed/EmbedField.tsx
|
|
11
|
+
var RESOLVE_DELAY = 500;
|
|
12
|
+
/** Whether a value is an embed: an object with a `url`. */
|
|
13
|
+
function isEmbed(value) {
|
|
14
|
+
return value !== null && typeof value === "object" && isString(value.url);
|
|
15
|
+
}
|
|
16
|
+
/** Whether an embed comes from one of the providers. One without a provider is left to the backend. */
|
|
17
|
+
function isAllowed(value, providers) {
|
|
18
|
+
if (providers === void 0 || providers.length === 0 || value.provider === void 0) return true;
|
|
19
|
+
const provider = value.provider.toLowerCase();
|
|
20
|
+
return providers.some((allowed) => allowed.toLowerCase() === provider);
|
|
21
|
+
}
|
|
22
|
+
/** Whether a value has been resolved: it has more than its URL. */
|
|
23
|
+
function isResolved(value) {
|
|
24
|
+
return Object.keys(value).some((key) => key !== "url");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A URL of a video, a sound or a post, with the preview the backend gets from its provider's
|
|
28
|
+
* oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
|
|
29
|
+
* preview follows. Without an embed source, the value is the URL alone.
|
|
30
|
+
*/
|
|
31
|
+
function EmbedField(t0) {
|
|
32
|
+
const $ = c(60);
|
|
33
|
+
let description;
|
|
34
|
+
let disabled;
|
|
35
|
+
let embedSourceProp;
|
|
36
|
+
let onBlur;
|
|
37
|
+
let onChange;
|
|
38
|
+
let props;
|
|
39
|
+
let providers;
|
|
40
|
+
let readOnly;
|
|
41
|
+
let required;
|
|
42
|
+
let t1;
|
|
43
|
+
let value;
|
|
44
|
+
if ($[0] !== t0) {
|
|
45
|
+
({value, onChange, onBlur, embedSource: embedSourceProp, providers, errors: t1, disabled, readOnly, required, description, ...props} = t0);
|
|
46
|
+
$[0] = t0;
|
|
47
|
+
$[1] = description;
|
|
48
|
+
$[2] = disabled;
|
|
49
|
+
$[3] = embedSourceProp;
|
|
50
|
+
$[4] = onBlur;
|
|
51
|
+
$[5] = onChange;
|
|
52
|
+
$[6] = props;
|
|
53
|
+
$[7] = providers;
|
|
54
|
+
$[8] = readOnly;
|
|
55
|
+
$[9] = required;
|
|
56
|
+
$[10] = t1;
|
|
57
|
+
$[11] = value;
|
|
58
|
+
} else {
|
|
59
|
+
description = $[1];
|
|
60
|
+
disabled = $[2];
|
|
61
|
+
embedSourceProp = $[3];
|
|
62
|
+
onBlur = $[4];
|
|
63
|
+
onChange = $[5];
|
|
64
|
+
props = $[6];
|
|
65
|
+
providers = $[7];
|
|
66
|
+
readOnly = $[8];
|
|
67
|
+
required = $[9];
|
|
68
|
+
t1 = $[10];
|
|
69
|
+
value = $[11];
|
|
70
|
+
}
|
|
71
|
+
let t2;
|
|
72
|
+
if ($[12] !== t1) {
|
|
73
|
+
t2 = t1 === void 0 ? [] : t1;
|
|
74
|
+
$[12] = t1;
|
|
75
|
+
$[13] = t2;
|
|
76
|
+
} else t2 = $[13];
|
|
77
|
+
const errors = t2;
|
|
78
|
+
const intl = usePanneauIntl();
|
|
79
|
+
const context = useFieldsContext();
|
|
80
|
+
const embedSource = embedSourceProp === void 0 ? context.embedSource : embedSourceProp;
|
|
81
|
+
const url = value?.url ?? "";
|
|
82
|
+
const [status, setStatus] = useState(null);
|
|
83
|
+
const pending = value !== null && value !== void 0 && !isResolved(value) ? value.url : null;
|
|
84
|
+
let t3;
|
|
85
|
+
if ($[14] !== onChange) {
|
|
86
|
+
t3 = (embed) => onChange?.(embed);
|
|
87
|
+
$[14] = onChange;
|
|
88
|
+
$[15] = t3;
|
|
89
|
+
} else t3 = $[15];
|
|
90
|
+
const resolved = useEffectEvent(t3);
|
|
91
|
+
let t4;
|
|
92
|
+
if ($[16] !== embedSource || $[17] !== pending || $[18] !== resolved) {
|
|
93
|
+
t4 = () => {
|
|
94
|
+
if (embedSource === null || pending === null || !URL.canParse(pending)) return;
|
|
95
|
+
const controller = new AbortController();
|
|
96
|
+
const timeout = window.setTimeout(() => {
|
|
97
|
+
setStatus({
|
|
98
|
+
url: pending,
|
|
99
|
+
state: "loading"
|
|
100
|
+
});
|
|
101
|
+
embedSource.resolve(pending, { signal: controller.signal }).then((embed_0) => {
|
|
102
|
+
setStatus(null);
|
|
103
|
+
resolved({
|
|
104
|
+
...embed_0,
|
|
105
|
+
url: pending
|
|
106
|
+
});
|
|
107
|
+
}).catch(() => {
|
|
108
|
+
if (!controller.signal.aborted) setStatus({
|
|
109
|
+
url: pending,
|
|
110
|
+
state: "failed"
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}, RESOLVE_DELAY);
|
|
114
|
+
return () => {
|
|
115
|
+
window.clearTimeout(timeout);
|
|
116
|
+
controller.abort();
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
$[16] = embedSource;
|
|
120
|
+
$[17] = pending;
|
|
121
|
+
$[18] = resolved;
|
|
122
|
+
$[19] = t4;
|
|
123
|
+
} else t4 = $[19];
|
|
124
|
+
let t5;
|
|
125
|
+
if ($[20] !== embedSource || $[21] !== pending) {
|
|
126
|
+
t5 = [embedSource, pending];
|
|
127
|
+
$[20] = embedSource;
|
|
128
|
+
$[21] = pending;
|
|
129
|
+
$[22] = t5;
|
|
130
|
+
} else t5 = $[22];
|
|
131
|
+
useEffect(t4, t5);
|
|
132
|
+
const current = status !== null && status.url === url ? status.state : null;
|
|
133
|
+
let providerList;
|
|
134
|
+
let t6;
|
|
135
|
+
if ($[23] !== current || $[24] !== intl || $[25] !== providers || $[26] !== value) {
|
|
136
|
+
providerList = providers !== void 0 && providers.length > 0 ? intl.formatList(providers, { type: "disjunction" }) : null;
|
|
137
|
+
t6 = current === "failed" ? intl.formatMessage(messages.embedFailed) : value !== null && value !== void 0 && providerList !== null && !isAllowed(value, providers) ? intl.formatMessage(formsMessages.rule.providers, { providers: providerList }) : null;
|
|
138
|
+
$[23] = current;
|
|
139
|
+
$[24] = intl;
|
|
140
|
+
$[25] = providers;
|
|
141
|
+
$[26] = value;
|
|
142
|
+
$[27] = providerList;
|
|
143
|
+
$[28] = t6;
|
|
144
|
+
} else {
|
|
145
|
+
providerList = $[27];
|
|
146
|
+
t6 = $[28];
|
|
147
|
+
}
|
|
148
|
+
const ownError = t6;
|
|
149
|
+
let t7;
|
|
150
|
+
if ($[29] !== errors || $[30] !== ownError) {
|
|
151
|
+
t7 = ownError !== null && errors.length === 0 ? [ownError] : errors;
|
|
152
|
+
$[29] = errors;
|
|
153
|
+
$[30] = ownError;
|
|
154
|
+
$[31] = t7;
|
|
155
|
+
} else t7 = $[31];
|
|
156
|
+
const shownErrors = t7;
|
|
157
|
+
let t8;
|
|
158
|
+
if ($[32] !== description || $[33] !== intl || $[34] !== providerList || $[35] !== providers) {
|
|
159
|
+
t8 = providerList !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [description !== void 0 && description !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [description, " "] }) : null, intl.formatMessage(messages.embedProviders, { providers: intl.formatList(providers ?? [], { type: "conjunction" }) })] }) : description;
|
|
160
|
+
$[32] = description;
|
|
161
|
+
$[33] = intl;
|
|
162
|
+
$[34] = providerList;
|
|
163
|
+
$[35] = providers;
|
|
164
|
+
$[36] = t8;
|
|
165
|
+
} else t8 = $[36];
|
|
166
|
+
const help = t8;
|
|
167
|
+
let t9;
|
|
168
|
+
if ($[37] !== onChange) {
|
|
169
|
+
t9 = (next) => onChange?.(next.trim() === "" ? null : { url: next.trim() });
|
|
170
|
+
$[37] = onChange;
|
|
171
|
+
$[38] = t9;
|
|
172
|
+
} else t9 = $[38];
|
|
173
|
+
let t10;
|
|
174
|
+
if ($[39] !== onBlur) {
|
|
175
|
+
t10 = () => onBlur?.();
|
|
176
|
+
$[39] = onBlur;
|
|
177
|
+
$[40] = t10;
|
|
178
|
+
} else t10 = $[40];
|
|
179
|
+
let t11;
|
|
180
|
+
if ($[41] !== disabled || $[42] !== help || $[43] !== props || $[44] !== readOnly || $[45] !== required || $[46] !== shownErrors || $[47] !== t10 || $[48] !== t9 || $[49] !== url) {
|
|
181
|
+
t11 = /* @__PURE__ */ jsx(TextInput, {
|
|
182
|
+
...props,
|
|
183
|
+
type: "url",
|
|
184
|
+
inputMode: "url",
|
|
185
|
+
autoComplete: "off",
|
|
186
|
+
value: url,
|
|
187
|
+
onChange: t9,
|
|
188
|
+
onBlur: t10,
|
|
189
|
+
errors: shownErrors,
|
|
190
|
+
description: help,
|
|
191
|
+
isDisabled: disabled,
|
|
192
|
+
isReadOnly: readOnly,
|
|
193
|
+
isRequired: required
|
|
194
|
+
});
|
|
195
|
+
$[41] = disabled;
|
|
196
|
+
$[42] = help;
|
|
197
|
+
$[43] = props;
|
|
198
|
+
$[44] = readOnly;
|
|
199
|
+
$[45] = required;
|
|
200
|
+
$[46] = shownErrors;
|
|
201
|
+
$[47] = t10;
|
|
202
|
+
$[48] = t9;
|
|
203
|
+
$[49] = url;
|
|
204
|
+
$[50] = t11;
|
|
205
|
+
} else t11 = $[50];
|
|
206
|
+
let t12;
|
|
207
|
+
if ($[51] !== current || $[52] !== intl) {
|
|
208
|
+
t12 = current === "loading" ? /* @__PURE__ */ jsxs("div", {
|
|
209
|
+
className: EmbedField_module_default.status,
|
|
210
|
+
role: "status",
|
|
211
|
+
children: [/* @__PURE__ */ jsx(Spinner, { size: "sm" }), intl.formatMessage(messages.embedLoading)]
|
|
212
|
+
}) : null;
|
|
213
|
+
$[51] = current;
|
|
214
|
+
$[52] = intl;
|
|
215
|
+
$[53] = t12;
|
|
216
|
+
} else t12 = $[53];
|
|
217
|
+
let t13;
|
|
218
|
+
if ($[54] !== value) {
|
|
219
|
+
t13 = value !== null && value !== void 0 && isResolved(value) ? /* @__PURE__ */ jsxs("a", {
|
|
220
|
+
className: EmbedField_module_default.preview,
|
|
221
|
+
href: value.url,
|
|
222
|
+
target: "_blank",
|
|
223
|
+
rel: "noreferrer",
|
|
224
|
+
children: [value.thumbnailUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
|
|
225
|
+
className: EmbedField_module_default.thumbnail,
|
|
226
|
+
src: value.thumbnailUrl,
|
|
227
|
+
alt: ""
|
|
228
|
+
}) : null, /* @__PURE__ */ jsxs("span", {
|
|
229
|
+
className: EmbedField_module_default.text,
|
|
230
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
231
|
+
className: EmbedField_module_default.title,
|
|
232
|
+
children: value.title ?? value.url
|
|
233
|
+
}), value.provider !== void 0 ? /* @__PURE__ */ jsx("span", {
|
|
234
|
+
className: EmbedField_module_default.provider,
|
|
235
|
+
children: value.provider
|
|
236
|
+
}) : null]
|
|
237
|
+
})]
|
|
238
|
+
}) : null;
|
|
239
|
+
$[54] = value;
|
|
240
|
+
$[55] = t13;
|
|
241
|
+
} else t13 = $[55];
|
|
242
|
+
let t14;
|
|
243
|
+
if ($[56] !== t11 || $[57] !== t12 || $[58] !== t13) {
|
|
244
|
+
t14 = /* @__PURE__ */ jsxs("div", {
|
|
245
|
+
className: EmbedField_module_default.embed,
|
|
246
|
+
children: [
|
|
247
|
+
t11,
|
|
248
|
+
t12,
|
|
249
|
+
t13
|
|
250
|
+
]
|
|
251
|
+
});
|
|
252
|
+
$[56] = t11;
|
|
253
|
+
$[57] = t12;
|
|
254
|
+
$[58] = t13;
|
|
255
|
+
$[59] = t14;
|
|
256
|
+
} else t14 = $[59];
|
|
257
|
+
return t14;
|
|
258
|
+
}
|
|
259
|
+
/** The providers of a `providers` rule, if the field has one. */
|
|
260
|
+
function getProviders(field) {
|
|
261
|
+
const rule = findRule(field, "providers");
|
|
262
|
+
return rule !== void 0 && "value" in rule && Array.isArray(rule.value) ? rule.value.filter(isString) : void 0;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its
|
|
266
|
+
* `providers` rule names the providers it allows.
|
|
267
|
+
*/
|
|
268
|
+
function EmbedFieldEntry(props) {
|
|
269
|
+
const $ = c(11);
|
|
270
|
+
let t0;
|
|
271
|
+
if ($[0] !== props.field) {
|
|
272
|
+
t0 = getProviders(props.field);
|
|
273
|
+
$[0] = props.field;
|
|
274
|
+
$[1] = t0;
|
|
275
|
+
} else t0 = $[1];
|
|
276
|
+
const providers = t0;
|
|
277
|
+
let t1;
|
|
278
|
+
if ($[2] !== props) {
|
|
279
|
+
t1 = getFieldProps(props);
|
|
280
|
+
$[2] = props;
|
|
281
|
+
$[3] = t1;
|
|
282
|
+
} else t1 = $[3];
|
|
283
|
+
const t2 = isEmbed(props.value) ? props.value : null;
|
|
284
|
+
let t3;
|
|
285
|
+
if ($[4] !== providers) {
|
|
286
|
+
t3 = providers !== void 0 ? { providers } : {};
|
|
287
|
+
$[4] = providers;
|
|
288
|
+
$[5] = t3;
|
|
289
|
+
} else t3 = $[5];
|
|
290
|
+
let t4;
|
|
291
|
+
if ($[6] !== props.onChange || $[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
|
|
292
|
+
t4 = /* @__PURE__ */ jsx(EmbedField, {
|
|
293
|
+
...t1,
|
|
294
|
+
value: t2,
|
|
295
|
+
onChange: props.onChange,
|
|
296
|
+
...t3
|
|
297
|
+
});
|
|
298
|
+
$[6] = props.onChange;
|
|
299
|
+
$[7] = t1;
|
|
300
|
+
$[8] = t2;
|
|
301
|
+
$[9] = t3;
|
|
302
|
+
$[10] = t4;
|
|
303
|
+
} else t4 = $[10];
|
|
304
|
+
return t4;
|
|
305
|
+
}
|
|
306
|
+
//#endregion
|
|
307
|
+
export { EmbedField, EmbedFieldEntry, isEmbed };
|
|
308
|
+
|
|
309
|
+
//# sourceMappingURL=EmbedField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbedField.js","names":["ReactNode","useEffect","useEffectEvent","useState","formsMessages","EmbedValue","Spinner","TextInput","usePanneauIntl","useFieldsContext","EmbedSource","findRule","getFieldProps","isString","messages","FieldEntryProps","FieldProps","styles","RESOLVE_DELAY","EmbedFieldProps","placeholder","embedSource","providers","isEmbed","value","Record","url","isAllowed","undefined","length","provider","toLowerCase","some","allowed","isResolved","Object","keys","key","EmbedField","t0","$","_c","description","disabled","embedSourceProp","onBlur","onChange","props","readOnly","required","t1","errors","t2","intl","context","status","setStatus","pending","t3","embed","resolved","t4","URL","canParse","controller","AbortController","timeout","window","setTimeout","state","resolve","signal","then","embed_0","catch","aborted","clearTimeout","abort","t5","current","providerList","t6","formatList","type","formatMessage","embedFailed","rule","ownError","t7","shownErrors","t8","embedProviders","help","t9","next","trim","t10","t11","t12","embedLoading","t13","preview","thumbnailUrl","thumbnail","text","title","t14","getProviders","field","Array","isArray","filter","EmbedFieldEntry","_c","_Fragment","styles"],"sources":["../../src/embed/EmbedField.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useEffectEvent, useState } from 'react';\n\nimport { formsMessages } from '@panneau/intl';\nimport type { EmbedValue } from '@panneau/protocol';\nimport { Spinner, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport type { EmbedSource } from '../shared/embed';\nimport { findRule, getFieldProps, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './EmbedField.module.css';\n\nexport type { EmbedValue };\n\nconst RESOLVE_DELAY = 500;\n\nexport interface EmbedFieldProps extends FieldProps<EmbedValue> {\n placeholder?: string;\n /** Where the preview comes from. Defaults to that of the `FieldsProvider`. */\n embedSource?: EmbedSource | null;\n /**\n * The providers an embed may come from (`YouTube`), compared without case: the `providers`\n * rule (decision 0058). The field names them under its help, and refuses an embed of another\n * provider as soon as its preview comes back. The form's errors, once shown, replace that one.\n */\n providers?: readonly string[];\n}\n\n/** Whether a value is an embed: an object with a `url`. */\nexport function isEmbed(value: unknown): value is EmbedValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url)\n );\n}\n\n/** Whether an embed comes from one of the providers. One without a provider is left to the backend. */\nfunction isAllowed(value: EmbedValue, providers: readonly string[] | undefined): boolean {\n if (providers === undefined || providers.length === 0 || value.provider === undefined) {\n return true;\n }\n const provider = value.provider.toLowerCase();\n return providers.some((allowed) => allowed.toLowerCase() === provider);\n}\n\n/** Whether a value has been resolved: it has more than its URL. */\nfunction isResolved(value: EmbedValue): boolean {\n return Object.keys(value).some((key) => key !== 'url');\n}\n\n/**\n * A URL of a video, a sound or a post, with the preview the backend gets from its provider's\n * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its\n * preview follows. Without an embed source, the value is the URL alone.\n */\nexport function EmbedField({\n value,\n onChange,\n onBlur,\n embedSource: embedSourceProp,\n providers,\n errors = [],\n disabled,\n readOnly,\n required,\n description,\n ...props\n}: EmbedFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const embedSource = embedSourceProp === undefined ? context.embedSource : embedSourceProp;\n const url = value?.url ?? '';\n const [status, setStatus] = useState<{ url: string; state: 'loading' | 'failed' } | null>(null);\n\n // Resolves a URL that hasn't been, after a pause in typing\n const pending = value !== null && value !== undefined && !isResolved(value) ? value.url : null;\n // `onChange` changes on every render of a form: the latest one gets the preview\n const resolved = useEffectEvent((embed: EmbedValue) => onChange?.(embed));\n useEffect(() => {\n if (embedSource === null || pending === null || !URL.canParse(pending)) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setStatus({ url: pending, state: 'loading' });\n embedSource\n .resolve(pending, { signal: controller.signal })\n .then((embed) => {\n setStatus(null);\n resolved({ ...embed, url: pending });\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setStatus({ url: pending, state: 'failed' });\n }\n });\n }, RESOLVE_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [embedSource, pending]);\n\n const current = status !== null && status.url === url ? status.state : null;\n const providerList =\n providers !== undefined && providers.length > 0\n ? intl.formatList(providers, { type: 'disjunction' })\n : null;\n const ownError =\n current === 'failed'\n ? intl.formatMessage(messages.embedFailed)\n : value !== null &&\n value !== undefined &&\n providerList !== null &&\n !isAllowed(value, providers)\n ? intl.formatMessage(formsMessages.rule.providers, { providers: providerList })\n : null;\n const shownErrors = ownError !== null && errors.length === 0 ? [ownError] : errors;\n const help: ReactNode =\n providerList !== null ? (\n <>\n {description !== undefined && description !== null ? <>{description} </> : null}\n {intl.formatMessage(messages.embedProviders, {\n providers: intl.formatList(providers ?? [], { type: 'conjunction' }),\n })}\n </>\n ) : (\n description\n );\n return (\n <div className={styles.embed}>\n <TextInput\n {...props}\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n value={url}\n onChange={(next) => onChange?.(next.trim() === '' ? null : { url: next.trim() })}\n onBlur={() => onBlur?.()}\n errors={shownErrors}\n description={help}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n {current === 'loading' ? (\n <div className={styles.status} role=\"status\">\n <Spinner size=\"sm\" />\n {intl.formatMessage(messages.embedLoading)}\n </div>\n ) : null}\n {value !== null && value !== undefined && isResolved(value) ? (\n <a className={styles.preview} href={value.url} target=\"_blank\" rel=\"noreferrer\">\n {value.thumbnailUrl !== undefined ? (\n <img className={styles.thumbnail} src={value.thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n <span className={styles.title}>{value.title ?? value.url}</span>\n {value.provider !== undefined ? (\n <span className={styles.provider}>{value.provider}</span>\n ) : null}\n </span>\n </a>\n ) : null}\n </div>\n );\n}\n\n/** The providers of a `providers` rule, if the field has one. */\nfunction getProviders(field: FieldEntryProps['field']): string[] | undefined {\n const rule = findRule(field, 'providers');\n return rule !== undefined && 'value' in rule && Array.isArray(rule.value)\n ? rule.value.filter(isString)\n : undefined;\n}\n\n/**\n * The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its\n * `providers` rule names the providers it allows.\n */\nexport function EmbedFieldEntry(props: FieldEntryProps) {\n const providers = getProviders(props.field);\n return (\n <EmbedField\n {...getFieldProps(props)}\n value={isEmbed(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(providers !== undefined ? { providers } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAMkB,gBAAgB;;AAetB,SAAgBK,QAAQC,OAAqC;CACzD,OACIA,UAAU,QACV,OAAOA,UAAU,YACjBX,SAAUW,MAAkCE,GAAG;AAEvD;;AAGA,SAASC,UAAUH,OAAmBF,WAAmD;CACrF,IAAIA,cAAcM,KAAAA,KAAaN,UAAUO,WAAW,KAAKL,MAAMM,aAAaF,KAAAA,GACxE,OAAO;CAEX,MAAME,WAAWN,MAAMM,SAASC,YAAY;CAC5C,OAAOT,UAAUU,MAAMC,YAAYA,QAAQF,YAAY,MAAMD,QAAQ;AACzE;;AAGA,SAASI,WAAWV,OAA4B;CAC5C,OAAOW,OAAOC,KAAKZ,KAAK,CAAC,CAACQ,MAAMK,QAAQA,QAAQ,KAAK;AACzD;;;;;;AAOA,SAAOC,WAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAzB;CAAA,IAAA0B;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAA1B;CAAA,IAAAgB,EAAA,OAAAD,IAAA;EAAoB,CAAA,CAAAf,OAAAsB,UAAAD,QAAAxB,aAAAuB,iBAAAtB,WAAA6B,QAAAD,IAAAP,UAAAK,UAAAC,UAAAP,aAAA,GAAAK,SAAAR;EAYTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAlB;EAAAkB,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,MAAAU;EAAAV,EAAA,MAAAhB;CAAA,OAAA;EAAAkB,cAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,kBAAAJ,EAAA;EAAAK,SAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,QAAAP,EAAA;EAAAlB,YAAAkB,EAAA;EAAAQ,WAAAR,EAAA;EAAAS,WAAAT,EAAA;EAAAU,KAAAV,EAAA;EAAAhB,QAAAgB,EAAA;CAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAU,IAAA;EANdE,KAAAF,OAAAtB,KAAAA,IAAA,CAAA,IAAAsB;EAAWV,EAAA,MAAAU;EAAAV,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAX,MAAAW,SAAAC;CAOA,MAAAC,OAAa7C,eAAe;CAC5B,MAAA8C,UAAgB7C,iBAAiB;CACjC,MAAAY,cAAoBuB,oBAAoBhB,KAAAA,IAAY0B,QAAOjC,cAAvCuB;CACpB,MAAAlB,MAAYF,OAAKE,OAAL;CACZ,MAAA,CAAA6B,QAAAC,aAA4BrD,SAA8D,IAAI;CAG9F,MAAAsD,UAAgBjC,UAAU,QAAQA,UAAUI,KAAAA,KAA5B,CAA0CM,WAAWV,KAAK,IAAIA,MAAKE,MAAnE;CAA+E,IAAAgC;CAAA,IAAAlB,EAAA,QAAAM,UAAA;EAE/DY,MAAAC,UAAuBb,WAAWa,KAAK;EAACnB,EAAA,MAAAM;EAAAN,EAAA,MAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAAxE,MAAAoB,WAAiB1D,eAAewD,EAAwC;CAAE,IAAAG;CAAA,IAAArB,EAAA,QAAAnB,eAAAmB,EAAA,QAAAiB,WAAAjB,EAAA,QAAAoB,UAAA;EAChEC,WAAA;GACN,IAAIxC,gBAAgB,QAAQoC,YAAY,QAApC,CAA6CK,IAAGC,SAAUN,OAAO,GAAC;GAGtE,MAAAO,aAAmB,IAAIC,gBAAgB;GACvC,MAAAC,UAAgBC,OAAMC,iBAAY;IAC9BZ,UAAU;KAAA9B,KAAO+B;KAAOY,OAAS;IAAU,CAAC;IAC5ChD,YAAWiD,QACEb,SAAS,EAAAc,QAAUP,WAAUO,OAAQ,CAAC,CAAC,CAAAC,MAC1CC,YAAA;KACFjB,UAAU,IAAI;KACdI,SAAS;MAAA,GAAKD;MAAKjC,KAAO+B;KAAQ,CAAC;IAAC,CACvC,CAAC,CAAAiB,YACK;KACH,IAAI,CAACV,WAAUO,OAAOI,SAClBnB,UAAU;MAAA9B,KAAO+B;MAAOY,OAAS;KAAS,CAAC;IAC9C,CACJ;GAAC,GACPnD,aAAa;GAAE,aACX;IACHiD,OAAMS,aAAcV,OAAO;IAC3BF,WAAUa,MAAO;GAAC;EACrB;EACJrC,EAAA,MAAAnB;EAAAmB,EAAA,MAAAiB;EAAAjB,EAAA,MAAAoB;EAAApB,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,IAAAsC;CAAA,IAAAtC,EAAA,QAAAnB,eAAAmB,EAAA,QAAAiB,SAAA;EAAEqB,KAAA,CAACzD,aAAaoC,OAAO;EAACjB,EAAA,MAAAnB;EAAAmB,EAAA,MAAAiB;EAAAjB,EAAA,MAAAsC;CAAA,OAAAA,KAAAtC,EAAA;CAvBzBvC,UAAU4D,IAuBPiB,EAAsB;CAEzB,MAAAC,UAAgBxB,WAAW,QAAQA,OAAM7B,QAASA,MAAM6B,OAAMc,QAA9C;CAA4D,IAAAW;CAAA,IAAAC;CAAA,IAAAzC,EAAA,QAAAuC,WAAAvC,EAAA,QAAAa,QAAAb,EAAA,QAAAlB,aAAAkB,EAAA,QAAAhB,OAAA;EAC5EwD,eACI1D,cAAcM,KAAAA,KAAaN,UAASO,SAAU,IACxCwB,KAAI6B,WAAY5D,WAAW,EAAA6D,MAAQ,cAAc,CAC9C,IAFT;EAIAF,KAAAF,YAAY,WACN1B,KAAI+B,cAAetE,SAAQuE,WAMtB,IALL7D,UAAU,QACRA,UAAUI,KAAAA,KACVoD,iBAAiB,QAFnB,CAGGrD,UAAUH,OAAOF,SAAS,IAC3B+B,KAAI+B,cAAehF,cAAakF,KAAKhE,WAAY,EAAAA,WAAa0D,aAAa,CACxE,IALL;EAKMxC,EAAA,MAAAuC;EAAAvC,EAAA,MAAAa;EAAAb,EAAA,MAAAlB;EAAAkB,EAAA,MAAAhB;EAAAgB,EAAA,MAAAwC;EAAAxC,EAAA,MAAAyC;CAAA,OAAA;EAAAD,eAAAxC,EAAA;EAAAyC,KAAAzC,EAAA;CAAA;CARhB,MAAA+C,WACIN;CAOa,IAAAO;CAAA,IAAAhD,EAAA,QAAAW,UAAAX,EAAA,QAAA+C,UAAA;EACGC,KAAAD,aAAa,QAAQpC,OAAMtB,WAAY,IAAvC,CAA4C0D,QAAQ,IAApDpC;EAA8DX,EAAA,MAAAW;EAAAX,EAAA,MAAA+C;EAAA/C,EAAA,MAAAgD;CAAA,OAAAA,KAAAhD,EAAA;CAAlF,MAAAiD,cAAoBD;CAA+D,IAAAE;CAAA,IAAAlD,EAAA,QAAAE,eAAAF,EAAA,QAAAa,QAAAb,EAAA,QAAAwC,gBAAAxC,EAAA,QAAAlB,WAAA;EAE/EoE,KAAAV,iBAAiB,OAAjB,qBAAAkC,UAAA,EAAA,UAAA,CAESxE,gBAAgBd,KAAAA,KAAac,gBAAgB,OAA7C,qBAAAwE,UAAA,EAAA,UAAA,CAAuDxE,aAAY,GAAC,EAAA,CAAA,IAApE,MACAW,KAAI+B,cAAetE,SAAQ6E,gBAAiB,EAAArE,WAC9B+B,KAAI6B,WAAY5D,aAAA,CAAA,GAAiB,EAAA6D,MAAQ,cAAc,CAAC,EACvE,CAAC,CAAC,EAAA,CAAA,IALVzC;EASCF,EAAA,MAAAE;EAAAF,EAAA,MAAAa;EAAAb,EAAA,MAAAwC;EAAAxC,EAAA,MAAAlB;EAAAkB,EAAA,MAAAkD;CAAA,OAAAA,KAAAlD,EAAA;CAVL,MAAAoD,OACIF;CASE,IAAAG;CAAA,IAAArD,EAAA,QAAAM,UAAA;EASgB+C,MAAAC,SAAUhD,WAAWgD,KAAIC,KAAM,MAAM,KAAhB,OAAA,EAAArE,KAAmCoE,KAAIC,KAAM,EAAE,CAAC;EAACvD,EAAA,MAAAM;EAAAN,EAAA,MAAAqD;CAAA,OAAAA,KAAArD,EAAA;CAAA,IAAAwD;CAAA,IAAAxD,EAAA,QAAAK,QAAA;EACxEmD,YAAMnD,SAAS;EAACL,EAAA,MAAAK;EAAAL,EAAA,MAAAwD;CAAA,OAAAA,MAAAxD,EAAA;CAAA,IAAAyD;CAAA,IAAAzD,EAAA,QAAAG,YAAAH,EAAA,QAAAoD,QAAApD,EAAA,QAAAO,SAAAP,EAAA,QAAAQ,YAAAR,EAAA,QAAAS,YAAAT,EAAA,QAAAiD,eAAAjD,EAAA,QAAAwD,OAAAxD,EAAA,QAAAqD,MAAArD,EAAA,QAAAd,KAAA;EAP5BuE,MAAA,oBAAC,WAAD;GAAU,GACFlD;GACC,MAAA;GACK,WAAA;GACG,cAAA;GACNrB,OAAAA;GACG,UAAAmE;GACF,QAAAG;GACAP,QAAAA;GACKG,aAAAA;GACDjD,YAAAA;GACAK,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBT,EAAA,MAAAG;EAAAH,EAAA,MAAAoD;EAAApD,EAAA,MAAAO;EAAAP,EAAA,MAAAQ;EAAAR,EAAA,MAAAS;EAAAT,EAAA,MAAAiD;EAAAjD,EAAA,MAAAwD;EAAAxD,EAAA,MAAAqD;EAAArD,EAAA,MAAAd;EAAAc,EAAA,MAAAyD;CAAA,OAAAA,MAAAzD,EAAA;CAAA,IAAA0D;CAAA,IAAA1D,EAAA,QAAAuC,WAAAvC,EAAA,QAAAa,MAAA;EACD6C,MAAAnB,YAAY,YACT,qBAAA,OAAA;GAAgB,WAAA9D,0BAAMsC;GAAc,MAAA;GAApC,UAAA,CACI,oBAAC,SAAD,EAAc,MAAA,KAAI,CAAA,GACjBF,KAAI+B,cAAetE,SAAQqF,YAAa,CACvC;EAJT,CAAA,IAAA;EAKO3D,EAAA,MAAAuC;EAAAvC,EAAA,MAAAa;EAAAb,EAAA,MAAA0D;CAAA,OAAAA,MAAA1D,EAAA;CAAA,IAAA4D;CAAA,IAAA5D,EAAA,QAAAhB,OAAA;EACP4E,MAAA5E,UAAU,QAAQA,UAAUI,KAAAA,KAAaM,WAAWV,KAAK,IACtD,qBAAA,KAAA;GAAc,WAAAP,0BAAMoF;GAAgB,MAAA7E,MAAKE;GAAa,QAAA;GAAa,KAAA;GAAnE,UAAA,CACKF,MAAK8E,iBAAkB1E,KAAAA,IACpB,oBAAA,OAAA;IAAgB,WAAAX,0BAAMsF;IAAiB,KAAA/E,MAAK8E;IAAmB,KAAA;GAAE,CAAA,IADpE,MAGD,qBAAA,QAAA;IAAiB,WAAArF,0BAAMuF;IAAvB,UAAA,CACI,oBAAA,QAAA;KAAiB,WAAAvF,0BAAMwF;KAASjF,UAAAA,MAAKiF,SAAUjF,MAAKE;IAAY,CAAA,GAC/DF,MAAKM,aAAcF,KAAAA,IAChB,oBAAA,QAAA;KAAiB,WAAAX,0BAAMa;KAAYN,UAAAA,MAAKM;IAAiB,CAAA,IAD5D,IAGE;GACP,CAAA,CAAA;EAXP,CAAA,IAAA;EAYOU,EAAA,MAAAhB;EAAAgB,EAAA,MAAA4D;CAAA,OAAAA,MAAA5D,EAAA;CAAA,IAAAkE;CAAA,IAAAlE,EAAA,QAAAyD,OAAAzD,EAAA,QAAA0D,OAAA1D,EAAA,QAAA4D,KAAA;EAjCZM,MAAA,qBAAA,OAAA;GAAgB,WAAAzF,0BAAM0C;GAAtB,UAAA;IACIsC;IAcCC;IAMAE;GAaC;;EAAA5D,EAAA,MAAAyD;EAAAzD,EAAA,MAAA0D;EAAA1D,EAAA,MAAA4D;EAAA5D,EAAA,MAAAkE;CAAA,OAAAA,MAAAlE,EAAA;CAAA,OAlCNkE;AAkCM;;AAKd,SAASC,aAAaC,OAAuD;CACzE,MAAMtB,OAAO3E,SAASiG,OAAO,WAAW;CACxC,OAAOtB,SAAS1D,KAAAA,KAAa,WAAW0D,QAAQuB,MAAMC,QAAQxB,KAAK9D,KAAK,IAClE8D,KAAK9D,MAAMuF,OAAOlG,QAAQ,IAC1Be,KAAAA;AACV;;;;;AAMA,SAAOoF,gBAAAjE,OAAA;CAAA,MAAAP,IAAAC,EAAA,EAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAO,MAAA6D,OAAA;EACerE,KAAAoE,aAAa5D,MAAK6D,KAAM;EAACpE,EAAA,KAAAO,MAAA6D;EAAApE,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CAA3C,MAAAlB,YAAkBiB;CAA0B,IAAAW;CAAA,IAAAV,EAAA,OAAAO,OAAA;EAGhCG,KAAAtC,cAAcmC,KAAK;EAACP,EAAA,KAAAO;EAAAP,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CACjB,MAAAY,KAAA7B,QAAQwB,MAAKvB,KAA2B,IAAjBuB,MAAKvB,QAA5B;CAAyC,IAAAkC;CAAA,IAAAlB,EAAA,OAAAlB,WAAA;EAE3CoC,KAAApC,cAAcM,KAAAA,IAAd,EAAAN,UAA2C,IAA3C,CAA2C;EAACkB,EAAA,KAAAlB;EAAAkB,EAAA,KAAAkB;CAAA,OAAAA,KAAAlB,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,OAAAO,MAAAD,YAAAN,EAAA,OAAAU,MAAAV,EAAA,OAAAY,MAAAZ,EAAA,OAAAkB,IAAA;EAJrDG,KAAA,oBAAC,YAAD;GAAW,GACHX;GACG,OAAAE;GACG,UAAAL,MAAKD;GAAS,GACnBY;EAA4C,CAAA;EACnDlB,EAAA,KAAAO,MAAAD;EAAAN,EAAA,KAAAU;EAAAV,EAAA,KAAAY;EAAAZ,EAAA,KAAAkB;EAAAlB,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,OALFqB;AAKE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "./EmbedField.css";
|
|
2
|
+
//#region src/embed/EmbedField.module.css
|
|
3
|
+
var embed = "panneau-embed-field-embed";
|
|
4
|
+
var status = "panneau-embed-field-status";
|
|
5
|
+
var preview = "panneau-embed-field-preview";
|
|
6
|
+
var thumbnail = "panneau-embed-field-thumbnail";
|
|
7
|
+
var text = "panneau-embed-field-text";
|
|
8
|
+
var title = "panneau-embed-field-title";
|
|
9
|
+
var provider = "panneau-embed-field-provider";
|
|
10
|
+
var EmbedField_module_default = {
|
|
11
|
+
embed,
|
|
12
|
+
status,
|
|
13
|
+
preview,
|
|
14
|
+
thumbnail,
|
|
15
|
+
text,
|
|
16
|
+
title,
|
|
17
|
+
provider
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { EmbedField_module_default as default, embed, preview, provider, status, text, thumbnail, title };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=EmbedField.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbedField.module.js","names":[],"sources":["../../src/embed/EmbedField.module.css"],"sourcesContent":["/* The URL, then the preview of what it embeds. */\n.embed {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n}\n\n.status {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.preview {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-2);\n color: var(--panneau-color-text);\n text-decoration: none;\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n.preview:hover {\n border-color: var(--panneau-color-border-control);\n}\n\n.preview:focus-visible {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.thumbnail {\n flex: none;\n width: 7rem;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n border-radius: var(--panneau-radius-sm);\n}\n\n.text {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.title {\n font-weight: var(--panneau-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.provider {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embed/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,OAAO,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
.panneau-file-field-field {
|
|
2
|
+
display: grid;
|
|
3
|
+
gap: var(--panneau-space-2);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.panneau-file-field-files {
|
|
7
|
+
display: grid;
|
|
8
|
+
gap: var(--panneau-space-1);
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
list-style: none;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.panneau-file-field-file {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: var(--panneau-space-2);
|
|
18
|
+
min-height: var(--panneau-control-height-sm);
|
|
19
|
+
padding-inline: var(--panneau-space-2) var(--panneau-space-1);
|
|
20
|
+
background-color: var(--panneau-color-surface-sunken);
|
|
21
|
+
border: var(--panneau-border-width) solid var(--panneau-color-border);
|
|
22
|
+
border-radius: var(--panneau-radius-md);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.panneau-file-field-icon {
|
|
26
|
+
flex: none;
|
|
27
|
+
width: 1rem;
|
|
28
|
+
height: 1rem;
|
|
29
|
+
color: var(--panneau-color-text-muted);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.panneau-file-field-name {
|
|
33
|
+
flex: 1 1 auto;
|
|
34
|
+
min-width: 0;
|
|
35
|
+
overflow: hidden;
|
|
36
|
+
font-size: var(--panneau-font-size-sm);
|
|
37
|
+
text-overflow: ellipsis;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
a.panneau-file-field-name {
|
|
42
|
+
color: var(--panneau-color-link);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.panneau-file-field-size {
|
|
46
|
+
flex: none;
|
|
47
|
+
font-size: var(--panneau-font-size-sm);
|
|
48
|
+
color: var(--panneau-color-text-muted);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.panneau-file-field-none {
|
|
52
|
+
font-size: var(--panneau-font-size-md);
|
|
53
|
+
color: var(--panneau-color-text-muted);
|
|
54
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { StoredFile } from '@panneau/protocol';
|
|
2
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
|
+
import type { UploadSource, UploadedFile } from '../upload/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the
|
|
6
|
+
* file to storage; or the file itself, sent in a multipart request without direct uploads.
|
|
7
|
+
*/
|
|
8
|
+
export type FileValue = StoredFile | UploadedFile | File;
|
|
9
|
+
export interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {
|
|
10
|
+
/** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */
|
|
11
|
+
accept?: readonly string[] | null;
|
|
12
|
+
/** Largest file, in bytes. Larger ones are refused before they are sent. */
|
|
13
|
+
maxSize?: number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Where files are uploaded directly to storage. Defaults to the one of the fields context.
|
|
16
|
+
* Without one, the value holds the files themselves, which the adapter sends in
|
|
17
|
+
* `multipart/form-data`.
|
|
18
|
+
*/
|
|
19
|
+
uploadSource?: UploadSource | null;
|
|
20
|
+
}
|
|
21
|
+
export interface SingleFileFieldProps extends FileFieldBaseProps {
|
|
22
|
+
multiple?: false;
|
|
23
|
+
value?: FileValue | null;
|
|
24
|
+
onChange?: (value: FileValue | null) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface MultipleFileFieldProps extends FileFieldBaseProps {
|
|
27
|
+
multiple: true;
|
|
28
|
+
value?: readonly FileValue[] | null;
|
|
29
|
+
/** Called with the files. An empty list is `null`. */
|
|
30
|
+
onChange?: (value: FileValue[] | null) => void;
|
|
31
|
+
}
|
|
32
|
+
export type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;
|
|
33
|
+
/** Whether a value is a file of a `file` value. */
|
|
34
|
+
export declare function isFileValue(value: unknown): value is FileValue;
|
|
35
|
+
/** The files of a value, single or multiple. */
|
|
36
|
+
export declare function toFiles(value: unknown): FileValue[];
|
|
37
|
+
/**
|
|
38
|
+
* Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the
|
|
39
|
+
* `file` type). With an upload source, files go directly to storage, and the value references
|
|
40
|
+
* each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items
|
|
41
|
+
* give stored files, which the field shows with a link. A new file replaces the file of a single
|
|
42
|
+
* value, and is added to a multiple one.
|
|
43
|
+
*/
|
|
44
|
+
export declare function FileField(props: FileFieldProps): import("react").JSX.Element;
|
|
45
|
+
/**
|
|
46
|
+
* The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)
|
|
47
|
+
* and `maxSize` rule, with the upload source of the fields context.
|
|
48
|
+
*/
|
|
49
|
+
export declare function FileFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
50
|
+
//# sourceMappingURL=FileField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAiI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}
|