@panneau/fields 5.0.0-alpha.2 → 5.0.0-alpha.21
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":"SlugField.js","names":["next","WandSparkles","value","onChange","disabled","readOnly","_c"],"sources":["../../src/slug/SlugField.tsx"],"sourcesContent":["import { WandSparkles } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\n\nimport { IconButton, 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';\n\n/**\n * Turns a text into a slug: lowercase ASCII letters and digits separated by dashes, without\n * accents (`Été à Montréal` gives `ete-a-montreal`).\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport interface SlugFieldProps extends Omit<TextFieldProps, 'type' | 'suffix'> {\n /**\n * The text the slug is made from (a title). While the slug is empty or still matches it, the\n * slug follows it.\n */\n source?: string | null;\n /** Name of the source, for the button that generates the slug from it. */\n sourceLabel?: string;\n}\n\n/**\n * A slug for URLs. Typed text is cleaned up on blur. With a `source`, the slug follows it until\n * it is edited, and a button generates it again.\n */\nexport function SlugField({\n value,\n onChange,\n onBlur,\n source,\n sourceLabel,\n disabled,\n readOnly,\n ...props\n}: SlugFieldProps) {\n const intl = usePanneauIntl();\n const previousSource = useRef(source);\n const editable = disabled !== true && readOnly !== true;\n\n useEffect(() => {\n const previous = previousSource.current;\n previousSource.current = source;\n if (!editable || source === previous || source === undefined) {\n return;\n }\n const current = value ?? '';\n if (current === '' || current === slugify(previous ?? '')) {\n const next = slugify(source ?? '');\n if (next !== current) {\n onChange?.(next === '' ? null : next);\n }\n }\n }, [source, value, onChange, editable]);\n\n const generated = slugify(source ?? '');\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly}\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = slugify(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n source !== undefined && editable ? (\n <IconButton\n icon={WandSparkles}\n size=\"sm\"\n label={intl.formatMessage(messages.generateSlug, {\n field: sourceLabel ?? '',\n })}\n isDisabled={generated === '' || generated === value}\n onPress={() => onChange?.(generated === '' ? null : generated)}\n />\n ) : undefined\n }\n />\n );\n}\n\nfunction sourceText(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n }\n // A localized source: its first locale.\n if (value !== null && typeof value === 'object') {\n const first = Object.values(value as Record<string, unknown>).find(isString);\n return first ?? null;\n }\n return null;\n}\n\n/** The `slug` type: `from` names the field it follows, and setting `prefix` shows a URL prefix. */\nexport function SlugFieldEntry(props: FieldEntryProps) {\n const { field, parentValue } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const source =\n field.from !== undefined && parentValue !== null && typeof parentValue === 'object'\n ? sourceText((parentValue as Record<string, unknown>)[field.from])\n : undefined;\n return (\n <SlugField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(source !== undefined ? { source, sourceLabel: field.from ?? '' } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,QAAQ,MAAsB;CAC1C,OAAO,KACF,UAAU,MAAM,CAAC,CACjB,QAAQ,UAAU,EAAE,CAAC,CACrB,YAAY,CAAC,CACb,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,YAAY,EAAE;AAC/B;;;;;AAgBA,SAAO,UAAA,IAAA;CAAA,MAAA,IAAAM,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAmB,CAAA,CAAA,OAAA,UAAA,QAAA,QAAA,aAAA,UAAA,UAAA,GAAA,SAAA;EAST,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,WAAA,EAAA;EAAA,SAAA,EAAA;EAAA,WAAA,EAAA;EAAA,QAAA,EAAA;EAAA,WAAA,EAAA;EAAA,SAAA,EAAA;EAAA,cAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CACb,MAAA,OAAa,eAAe;CAC5B,MAAA,iBAAuB,OAAO,MAAM;CACpC,MAAA,WAAiB,aAAa,QAAQ,aAAa;CAAK,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA,EAAA,QAAA,YAAA,EAAA,QAAA,UAAA,EAAA,QAAA,OAAA;EAE9C,WAAA;GACN,MAAA,WAAiB,eAAc;GAC/B,eAAc,UAAW;GACzB,IAAI,CAAC,YAAY,WAAW,YAAY,WAAW,KAAA,GAAS;GAG5D,MAAA,UAAgB,SAAA;GAChB,IAAI,YAAY,MAAM,YAAY,QAAQ,YAAA,EAAc,GAAC;IACrD,MAAA,OAAa,QAAQ,UAAA,EAAY;IACjC,IAAI,SAAS,SACT,WAAW,SAAS,KAAT,OAAA,IAAyB;GACvC;EACJ;EACF,KAAA;GAAC;GAAQ;GAAO;GAAU;EAAQ;EAAC,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA;EAAA,KAAA,EAAA;EAAA,KAAA,EAAA;CAAA;CAbtC,UAAU,IAaP,EAAmC;CAEZ,MAAA,KAAA,UAAA;CAAY,IAAA;CAAA,IAAA,EAAA,QAAA,IAAA;EAApB,KAAA,QAAQ,EAAY;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAvC,MAAA,YAAkB;CAAsB,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA,EAAA,QAAA,YAAA,EAAA,QAAA,OAAA;EASxB,WAAA;GACJ,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAS;IACrC,MAAA,SAAa,QAAQ,KAAK;IAC1B,IAAIN,WAAS,OACT,WAAWA,WAAS,KAAT,OAAA,MAAyB;GACvC;GAEL,SAAS;EAAC;EACb,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,YAAA,EAAA,QAAA,aAAA,EAAA,QAAA,QAAA,EAAA,QAAA,YAAA,EAAA,QAAA,UAAA,EAAA,QAAA,eAAA,EAAA,QAAA,OAAA;EAEG,KAAA,WAAW,KAAA,KAAX,WACI,oBAAC,YAAD;GACUC,MAAA;GACD,MAAA;GACE,OAAA,KAAI,cAAe,SAAQ,cAAe,EAAA,OACtC,eAAA,GACX,CAAC;GACW,YAAA,cAAc,MAAM,cAAc;GACrC,eAAM,WAAW,cAAc,KAAd,OAAA,SAAmC;EAAC,CAAA,IARtE,KAAA;EAUa,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,YAAA,EAAA,QAAA,YAAA,EAAA,QAAA,SAAA,EAAA,QAAA,YAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,OAAA;EA3BrB,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACd;GACG;GACG;GACA;GACA;GACF,QAAA;GAUJ,QAAA;EAUa,CAAA;EAEnB,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OA7BF;AA6BE;AAIV,SAAS,WAAW,OAA+B;CAC/C,IAAI,OAAO,UAAU,UACjB,OAAO;CAGX,IAAI,UAAU,QAAQ,OAAO,UAAU,UAEnC,OADc,OAAO,OAAO,KAAgC,CAAC,CAAC,KAAK,QAC5D,KAAS;CAEpB,OAAO;AACX;;AAGA,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAK,EAAA,EAAA;CACH,MAAA,EAAA,OAAA,gBAA+B;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACtB,KAAA,WAAW,OAAO,UAAU,QAAQ;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAApD,MAAA,SAAe;CAAsC,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,QAAA,EAAA,OAAA,aAAA;EAEjD,KAAA,MAAK,SAAU,KAAA,KAAa,gBAAgB,QAAQ,OAAO,gBAAgB,WACrE,WAAY,YAAwC,MAAK,KACjD,IAFd,KAAA;EAEe,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAHnB,MAAA,SACI;CAEgB,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGR,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,MAAA,QAAA,EAAA,OAAA,QAAA;EAE5C,KAAA,WAAW,KAAA,IAAX;GAAA;GAAA,aAA8C,MAAK,QAAL;EAAsB,IAApE,CAAoE;EAAC,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA;EACrE,KAAA,WAAW,KAAA,IAAX,EAAA,OAAqC,IAArC,CAAqC;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,MAAA,YAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAL/C,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GAAS,GACnB;GAAqE,GACrE;EAAsC,CAAA;EAC7C,EAAA,MAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OANF;AAME"}
|
|
1
|
+
{"version":3,"file":"SlugField.js","names":["WandSparkles","useEffect","useRef","useState","FieldCheckResponse","Button","IconButton","usePanneauIntl","useFieldsContext","getFieldProps","getSetting","isString","messages","FieldEntryProps","TextField","TextFieldProps","styles","suggestionMessage","useSuggestion","slugify","text","normalize","replace","toLowerCase","SlugCheck","value","options","signal","AbortSignal","Promise","SlugFieldProps","Omit","source","sourceLabel","onCheck","checkDelay","checkKey","useSlugCheck","delay","key","$","_c","result","setResult","latest","t0","current","enabled","undefined","t1","controller","AbortController","timer","setTimeout","check","then","check_0","aborted","catch","_temp","clearTimeout","abort","t2","SlugField","description","disabled","errors","onBlur","onChange","prefix","props","readOnly","intl","previousSource","disabledByBackend","editable","t3","t4","previous","next","t5","t6","generated","taken","available","t7","suggestion","t8","url","t9","t10","t11","t12","formatMessage","slugTaken","t13","next_0","t14","generateSlug","field","t15","sourceText","locale","record","Record","Object","values","find","checkKeyOf","name","_slug","others","JSON","stringify","SlugFieldEntry","parentValue","path","locales","checkSource","from","topLevel","_c","styles"],"sources":["../../src/slug/SlugField.tsx"],"sourcesContent":["import { WandSparkles } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { FieldCheckResponse } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\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 './SlugField.module.css';\n\n// Read outside the component: the React Compiler takes any `use…` name for a hook.\nconst suggestionMessage = messages.useSuggestion;\n\n/**\n * Turns a text into a slug: lowercase ASCII letters and digits separated by dashes, without\n * accents (`Été à Montréal` gives `ete-a-montreal`).\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** Checks a slug with the backend: whether it is available, and its URL. */\nexport type SlugCheck = (\n value: string,\n options: { signal: AbortSignal },\n) => Promise<FieldCheckResponse>;\n\nexport interface SlugFieldProps extends Omit<TextFieldProps, 'type' | 'suffix'> {\n /**\n * The text the slug is made from (a title). While the slug is empty or still matches it, the\n * slug follows it.\n */\n source?: string | null;\n /** Name of the source, for the button that generates the slug from it. */\n sourceLabel?: string;\n /**\n * Checks the slug as it is typed, and once when the field shows: the field then shows the\n * URL the backend gives, and says when the slug is taken, with a free one to use instead.\n */\n onCheck?: SlugCheck | null;\n /** How long typing must pause before a check, in milliseconds. Defaults to 300. */\n checkDelay?: number;\n /**\n * What the check depends on besides the slug, such as the form's values: the slug is checked\n * again when it changes. `onCheck` itself can change on every render.\n */\n checkKey?: string;\n}\n\n/**\n * Checks a slug after a pause in typing, and keeps the latest answer for it. A check that\n * fails leaves the field as it is: saving still validates the slug.\n */\nfunction useSlugCheck(\n value: string,\n onCheck: SlugCheck | null | undefined,\n delay: number,\n key: string,\n): FieldCheckResponse | null {\n const [result, setResult] = useState<{ value: string; check: FieldCheckResponse } | null>(null);\n const latest = useRef(onCheck);\n useEffect(() => {\n latest.current = onCheck;\n });\n const enabled = onCheck !== null && onCheck !== undefined;\n useEffect(() => {\n if (!enabled || value === '') {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n const check = latest.current;\n if (check === null || check === undefined) {\n return;\n }\n check(value, { signal: controller.signal })\n .then((check) => {\n if (!controller.signal.aborted) {\n setResult({ value, check });\n }\n })\n .catch(() => undefined);\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [value, enabled, delay, key]);\n return result !== null && result.value === value ? result.check : null;\n}\n\n/**\n * A slug for URLs. Typed text is cleaned up on blur. With a `source`, the slug follows it until\n * it is edited, and a button generates it again. With `onCheck`, the backend says whether the\n * slug is taken, and gives its URL.\n */\nexport function SlugField({\n value,\n onChange,\n onBlur,\n source,\n sourceLabel,\n onCheck,\n checkDelay = 300,\n checkKey = '',\n disabled,\n readOnly,\n prefix,\n errors,\n description,\n ...props\n}: SlugFieldProps) {\n const intl = usePanneauIntl();\n const previousSource = useRef(source);\n const check = useSlugCheck(value ?? '', onCheck, checkDelay, checkKey);\n const disabledByBackend = check?.disabled === true;\n const editable = disabled !== true && readOnly !== true && !disabledByBackend;\n\n useEffect(() => {\n const previous = previousSource.current;\n previousSource.current = source;\n if (!editable || source === previous || source === undefined) {\n return;\n }\n const current = value ?? '';\n if (current === '' || current === slugify(previous ?? '')) {\n const next = slugify(source ?? '');\n if (next !== current) {\n onChange?.(next === '' ? null : next);\n }\n }\n }, [source, value, onChange, editable]);\n\n const generated = slugify(source ?? '');\n const taken = check !== null && !check.available;\n const suggestion = taken && isString(check.suggestion) ? check.suggestion : null;\n const url = check !== null && isString(check.url) && !taken ? check.url : null;\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly === true || disabledByBackend}\n {...(check !== null && isString(check.prefix)\n ? { prefix: check.prefix }\n : prefix !== undefined\n ? { prefix }\n : {})}\n {...(errors !== undefined ? { errors } : {})}\n description={\n taken || url !== null || description !== undefined ? (\n <span className={styles.description}>\n {description !== undefined ? <span>{description}</span> : null}\n {url !== null ? (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className={styles.url}>\n {url}\n </a>\n ) : null}\n {taken ? (\n <span className={styles.taken} role=\"status\">\n {intl.formatMessage(messages.slugTaken)}\n {suggestion !== null && editable ? (\n <Button\n size=\"sm\"\n appearance=\"ghost\"\n onPress={() => onChange?.(suggestion)}\n >\n {intl.formatMessage(suggestionMessage, {\n suggestion,\n })}\n </Button>\n ) : null}\n </span>\n ) : null}\n </span>\n ) : undefined\n }\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = slugify(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n source !== undefined && editable ? (\n <IconButton\n icon={WandSparkles}\n size=\"sm\"\n label={intl.formatMessage(messages.generateSlug, {\n field: sourceLabel ?? '',\n })}\n isDisabled={generated === '' || generated === value}\n onPress={() => onChange?.(generated === '' ? null : generated)}\n />\n ) : undefined\n }\n />\n );\n}\n\n/**\n * The text of a source value: the value itself, or for a localized value, its value in `locale`.\n * Without a locale, the first locale that has a value.\n */\nexport function sourceText(value: unknown, locale?: string): string | null {\n if (typeof value === 'string') {\n return value;\n }\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n if (locale !== undefined) {\n const text = record[locale];\n return isString(text) ? text : null;\n }\n return Object.values(record).find(isString) ?? null;\n }\n return null;\n}\n\n/** The form's values that a check depends on: all but the slug itself. */\nfunction checkKeyOf(values: Record<string, unknown> | null, name: string): string {\n if (values === null) {\n return '';\n }\n const { [name]: _slug, ...others } = values;\n try {\n return JSON.stringify(others);\n } catch {\n return '';\n }\n}\n\n/**\n * The `slug` type: `from` names the field it follows, in the slug's own locale, or in the default\n * locale (the first of the fields context) for a slug that isn't localized. Setting `prefix`\n * shows a URL prefix. With `check`, the fields context's check source checks the slug of a field\n * at the top of the resource, with the form's values.\n */\nexport function SlugFieldEntry(props: FieldEntryProps) {\n const { field, parentValue, locale, path } = props;\n const { locales, checkSource } = useFieldsContext();\n const prefix = getSetting(field, 'prefix', isString);\n const values =\n parentValue !== null && typeof parentValue === 'object'\n ? (parentValue as Record<string, unknown>)\n : null;\n const source =\n field.from !== undefined && values !== null\n ? sourceText(values[field.from], locale ?? locales[0])\n : undefined;\n const topLevel = path === field.name || path === `${field.name}.${locale ?? ''}`;\n const onCheck: SlugCheck | null =\n field.check === true && checkSource !== null && topLevel\n ? (value, { signal }) =>\n checkSource.check(\n field.name,\n {\n value,\n ...(locale !== undefined ? { locale } : {}),\n values: values ?? {},\n },\n { signal },\n )\n : null;\n return (\n <SlugField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n onCheck={onCheck}\n checkKey={onCheck !== null ? checkKeyOf(values, field.name) : ''}\n {...(source !== undefined ? { source, sourceLabel: field.from ?? '' } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "./SlugField.css";
|
|
2
|
+
//#region src/slug/SlugField.module.css
|
|
3
|
+
var description = "panneau-slug-field-description";
|
|
4
|
+
var url = "panneau-slug-field-url";
|
|
5
|
+
var taken = "panneau-slug-field-taken";
|
|
6
|
+
var SlugField_module_default = {
|
|
7
|
+
description,
|
|
8
|
+
url,
|
|
9
|
+
taken
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { SlugField_module_default as default, description, taken, url };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=SlugField.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlugField.module.js","names":[],"sources":["../../src/slug/SlugField.module.css"],"sourcesContent":[".description {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n}\n\n.url {\n overflow-wrap: anywhere;\n color: var(--panneau-color-link);\n}\n\n.taken {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--panneau-space-2);\n color: var(--panneau-color-warning);\n}\n"],"mappings":""}
|
package/dist/slug/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SlugField, SlugFieldEntry, type SlugFieldProps, slugify } from './SlugField';
|
|
1
|
+
export { SlugField, SlugFieldEntry, type SlugCheck, type SlugFieldProps, slugify, sourceText, } from './SlugField.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/slug/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slug/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slug/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,cAAc,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,OAAO,EACP,UAAU,GACb,MAAM,aAAa,CAAC"}
|
package/dist/slug/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SlugField, SlugFieldEntry, slugify } from "./SlugField.js";
|
|
1
|
+
export { SlugField, SlugFieldEntry, slugify, sourceText } from "./SlugField.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type TagSuggestion } from '@panneau/ui';
|
|
2
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
3
|
+
export interface TagsFieldProps extends FieldProps<string[]> {
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
/** Tags offered as the user types. */
|
|
6
|
+
suggestions?: readonly TagSuggestion[];
|
|
7
|
+
/** Whether tags outside the suggestions are allowed. Defaults to true. */
|
|
8
|
+
allowCustom?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** A list of words, typed or picked among suggestions. An empty list is `null`. */
|
|
11
|
+
export declare function TagsField({ disabled, readOnly, required, ...props }: TagsFieldProps): import("react").JSX.Element;
|
|
12
|
+
/**
|
|
13
|
+
* The `tags` type: its `options` as suggestions, and setting `allowCustom` (true by default)
|
|
14
|
+
* for tags outside them.
|
|
15
|
+
*/
|
|
16
|
+
export declare function TagsFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=TagsField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagsField.d.ts","sourceRoot":"","sources":["../../src/tags/TagsField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,EAAE,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,WAAW,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACvC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAInF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAiBpD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { getFieldProps, getSetting, isString } from "../shared/entry.js";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import { TagsInput } from "@panneau/ui";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/tags/TagsField.tsx
|
|
6
|
+
/** A list of words, typed or picked among suggestions. An empty list is `null`. */
|
|
7
|
+
function TagsField(t0) {
|
|
8
|
+
const $ = c(10);
|
|
9
|
+
let disabled;
|
|
10
|
+
let props;
|
|
11
|
+
let readOnly;
|
|
12
|
+
let required;
|
|
13
|
+
if ($[0] !== t0) {
|
|
14
|
+
({disabled, readOnly, required, ...props} = t0);
|
|
15
|
+
$[0] = t0;
|
|
16
|
+
$[1] = disabled;
|
|
17
|
+
$[2] = props;
|
|
18
|
+
$[3] = readOnly;
|
|
19
|
+
$[4] = required;
|
|
20
|
+
} else {
|
|
21
|
+
disabled = $[1];
|
|
22
|
+
props = $[2];
|
|
23
|
+
readOnly = $[3];
|
|
24
|
+
required = $[4];
|
|
25
|
+
}
|
|
26
|
+
let t1;
|
|
27
|
+
if ($[5] !== disabled || $[6] !== props || $[7] !== readOnly || $[8] !== required) {
|
|
28
|
+
t1 = /* @__PURE__ */ jsx(TagsInput, {
|
|
29
|
+
...props,
|
|
30
|
+
isDisabled: disabled,
|
|
31
|
+
isReadOnly: readOnly,
|
|
32
|
+
isRequired: required
|
|
33
|
+
});
|
|
34
|
+
$[5] = disabled;
|
|
35
|
+
$[6] = props;
|
|
36
|
+
$[7] = readOnly;
|
|
37
|
+
$[8] = required;
|
|
38
|
+
$[9] = t1;
|
|
39
|
+
} else t1 = $[9];
|
|
40
|
+
return t1;
|
|
41
|
+
}
|
|
42
|
+
/** The options of a field as suggestions: their values as strings. */
|
|
43
|
+
function toSuggestions(options) {
|
|
44
|
+
return options.map((option) => ({
|
|
45
|
+
value: String(option.value),
|
|
46
|
+
label: option.label
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The `tags` type: its `options` as suggestions, and setting `allowCustom` (true by default)
|
|
51
|
+
* for tags outside them.
|
|
52
|
+
*/
|
|
53
|
+
function TagsFieldEntry(props) {
|
|
54
|
+
const $ = c(18);
|
|
55
|
+
const { field } = props;
|
|
56
|
+
let t0;
|
|
57
|
+
if ($[0] !== field) {
|
|
58
|
+
t0 = getSetting(field, "allowCustom", _temp);
|
|
59
|
+
$[0] = field;
|
|
60
|
+
$[1] = t0;
|
|
61
|
+
} else t0 = $[1];
|
|
62
|
+
const allowCustom = t0;
|
|
63
|
+
let t1;
|
|
64
|
+
if ($[2] !== props.value) {
|
|
65
|
+
t1 = Array.isArray(props.value) ? props.value.filter(isString) : null;
|
|
66
|
+
$[2] = props.value;
|
|
67
|
+
$[3] = t1;
|
|
68
|
+
} else t1 = $[3];
|
|
69
|
+
const value_0 = t1;
|
|
70
|
+
let t2;
|
|
71
|
+
if ($[4] !== props) {
|
|
72
|
+
t2 = getFieldProps(props);
|
|
73
|
+
$[4] = props;
|
|
74
|
+
$[5] = t2;
|
|
75
|
+
} else t2 = $[5];
|
|
76
|
+
const t3 = value_0 !== null && value_0.length > 0 ? value_0 : null;
|
|
77
|
+
const t4 = props.onChange;
|
|
78
|
+
let t5;
|
|
79
|
+
if ($[6] !== field.options) {
|
|
80
|
+
t5 = field.options ?? [];
|
|
81
|
+
$[6] = field.options;
|
|
82
|
+
$[7] = t5;
|
|
83
|
+
} else t5 = $[7];
|
|
84
|
+
let t6;
|
|
85
|
+
if ($[8] !== t5) {
|
|
86
|
+
t6 = toSuggestions(t5);
|
|
87
|
+
$[8] = t5;
|
|
88
|
+
$[9] = t6;
|
|
89
|
+
} else t6 = $[9];
|
|
90
|
+
let t7;
|
|
91
|
+
if ($[10] !== allowCustom) {
|
|
92
|
+
t7 = allowCustom !== void 0 ? { allowCustom } : {};
|
|
93
|
+
$[10] = allowCustom;
|
|
94
|
+
$[11] = t7;
|
|
95
|
+
} else t7 = $[11];
|
|
96
|
+
let t8;
|
|
97
|
+
if ($[12] !== props.onChange || $[13] !== t2 || $[14] !== t3 || $[15] !== t6 || $[16] !== t7) {
|
|
98
|
+
t8 = /* @__PURE__ */ jsx(TagsField, {
|
|
99
|
+
...t2,
|
|
100
|
+
value: t3,
|
|
101
|
+
onChange: t4,
|
|
102
|
+
suggestions: t6,
|
|
103
|
+
...t7
|
|
104
|
+
});
|
|
105
|
+
$[12] = props.onChange;
|
|
106
|
+
$[13] = t2;
|
|
107
|
+
$[14] = t3;
|
|
108
|
+
$[15] = t6;
|
|
109
|
+
$[16] = t7;
|
|
110
|
+
$[17] = t8;
|
|
111
|
+
} else t8 = $[17];
|
|
112
|
+
return t8;
|
|
113
|
+
}
|
|
114
|
+
function _temp(value) {
|
|
115
|
+
return typeof value === "boolean";
|
|
116
|
+
}
|
|
117
|
+
//#endregion
|
|
118
|
+
export { TagsField, TagsFieldEntry };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=TagsField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagsField.js","names":["Option","TagSuggestion","TagsInput","getFieldProps","getSetting","isString","FieldEntryProps","FieldProps","TagsFieldProps","placeholder","suggestions","allowCustom","TagsField","t0","$","_c","disabled","props","readOnly","required","t1","toSuggestions","options","map","option","value","String","label","TagsFieldEntry","field","_temp","Array","isArray","filter","value_0","t2","t3","length","t4","onChange","t5","t6","t7","undefined","t8","_c"],"sources":["../../src/tags/TagsField.tsx"],"sourcesContent":["import type { Option } from '@panneau/protocol';\nimport { type TagSuggestion, TagsInput } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TagsFieldProps extends FieldProps<string[]> {\n placeholder?: string;\n /** Tags offered as the user types. */\n suggestions?: readonly TagSuggestion[];\n /** Whether tags outside the suggestions are allowed. Defaults to true. */\n allowCustom?: boolean;\n}\n\n/** A list of words, typed or picked among suggestions. An empty list is `null`. */\nexport function TagsField({ disabled, readOnly, required, ...props }: TagsFieldProps) {\n return (\n <TagsInput {...props} isDisabled={disabled} isReadOnly={readOnly} isRequired={required} />\n );\n}\n\n/** The options of a field as suggestions: their values as strings. */\nfunction toSuggestions(options: readonly Option[]): TagSuggestion[] {\n return options.map((option) => ({ value: String(option.value), label: option.label }));\n}\n\n/**\n * The `tags` type: its `options` as suggestions, and setting `allowCustom` (true by default)\n * for tags outside them.\n */\nexport function TagsFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const allowCustom = getSetting(\n field,\n 'allowCustom',\n (value): value is boolean => typeof value === 'boolean',\n );\n const value = Array.isArray(props.value) ? props.value.filter(isString) : null;\n return (\n <TagsField\n {...getFieldProps(props)}\n value={value !== null && value.length > 0 ? value : null}\n onChange={props.onChange}\n suggestions={toSuggestions(field.options ?? [])}\n {...(allowCustom !== undefined ? { allowCustom } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tags/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { TagsField, TagsFieldEntry } from "./TagsField.js";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* The extension, after the number, in the same box. */
|
|
2
|
+
.panneau-tel-field-extension {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--panneau-space-1);
|
|
6
|
+
align-self: stretch;
|
|
7
|
+
padding-inline-start: var(--panneau-space-2);
|
|
8
|
+
border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border-control);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.panneau-tel-field-extension-input {
|
|
12
|
+
width: 6ch;
|
|
13
|
+
min-width: 0;
|
|
14
|
+
padding: 0;
|
|
15
|
+
font: inherit;
|
|
16
|
+
color: var(--panneau-color-text);
|
|
17
|
+
background: transparent;
|
|
18
|
+
border: 0;
|
|
19
|
+
outline: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.panneau-tel-field-extension-input:read-only,
|
|
23
|
+
.panneau-tel-field-extension-input:disabled {
|
|
24
|
+
cursor: inherit;
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FieldEntryProps } from '../shared/types.js';
|
|
2
|
+
import { type TextFieldProps } from '../text/TextField.js';
|
|
3
|
+
export interface TelFieldProps extends Omit<TextFieldProps, 'type' | 'inputMode' | 'prefix' | 'maxLength' | 'secret'> {
|
|
4
|
+
/**
|
|
5
|
+
* The country of a new number (`CA`). Without it, the region of the user's locale (`fr-CA`
|
|
6
|
+
* gives `CA`).
|
|
7
|
+
*/
|
|
8
|
+
country?: string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Adds an input for the extension, after the number. The value is then the number with its
|
|
11
|
+
* extension after `;ext=`, as in a `tel:` URI: `+15145550199;ext=123`.
|
|
12
|
+
*/
|
|
13
|
+
extension?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A phone number, in E.164 (`+15145550199`). The country of the number, its flag and its calling
|
|
17
|
+
* code, is in a menu at the start of the input, and the number shows in the format of its country
|
|
18
|
+
* as it is typed. The country follows the number: typing `+33…` picks France.
|
|
19
|
+
*
|
|
20
|
+
* Until a number is complete, the value is the text as typed, which the `tel` rule refuses. A value
|
|
21
|
+
* that isn't E.164, kept from before, shows as it is, and becomes E.164 when the field is left, if
|
|
22
|
+
* it reads as a number of the chosen country.
|
|
23
|
+
*
|
|
24
|
+
* With `extension`, an input after the number takes the digits of an extension, kept after `;ext=`
|
|
25
|
+
* (`+15145550199;ext=123`). An extension typed or pasted after the number (`ext. 123`, `x123`,
|
|
26
|
+
* `poste 123`) moves to that input when the field is left.
|
|
27
|
+
*/
|
|
28
|
+
export declare function TelField({ value, onChange, onBlur, country: defaultCountry, extension: allowsExtension, suffix, disabled, readOnly, ...props }: TelFieldProps): import("react").JSX.Element;
|
|
29
|
+
/**
|
|
30
|
+
* The `tel` type: `settings.country` is the country of a new number, and `settings.extension` adds
|
|
31
|
+
* an input for an extension.
|
|
32
|
+
*/
|
|
33
|
+
export declare function TelFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=TelField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelField.d.ts","sourceRoot":"","sources":["../../src/tel/TelField.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAcnE,MAAM,WAAW,aAAc,SAAQ,IAAI,CACvC,cAAc,EACd,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAC3D;IACG;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,EACrB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,eAAuB,EAClC,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,aAAa,+BAgJf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,+BAYnD"}
|