@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":"ColorField.js","names":["value","onChange","disabled","readOnly","_c","styles"],"sources":["../../src/color/ColorField.tsx"],"sourcesContent":["import { usePanneauIntl } from '@panneau/ui';\n\nimport { cx } from '../shared/cx';\nimport { getFieldProps, 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 './ColorField.module.css';\n\nexport type ColorFieldProps = Omit<TextFieldProps, 'type' | 'prefix' | 'maxLength'>;\n\n/**\n * Normalizes a hexadecimal color: `#` prefix, lowercase, and 3 digits expanded to 6. Returns the\n * text as is when it isn't a hexadecimal color.\n */\nexport function normalizeColor(value: string): string {\n const trimmed = value.trim().toLowerCase();\n const digits = trimmed.replace(/^#/, '');\n if (/^[0-9a-f]{3}$/.test(digits)) {\n return `#${[...digits].map((digit) => digit + digit).join('')}`;\n }\n if (/^[0-9a-f]{6}$/.test(digits) || /^[0-9a-f]{8}$/.test(digits)) {\n return `#${digits}`;\n }\n return trimmed;\n}\n\n/**\n * A color as a hexadecimal value (`#1d4ed8`): typed, or picked with the browser's color picker.\n * The value is normalized on blur.\n */\nexport function ColorField({\n value,\n onChange,\n onBlur,\n disabled,\n readOnly,\n inputClassName,\n ...props\n}: ColorFieldProps) {\n const intl = usePanneauIntl();\n const valid = value !== null && value !== undefined && /^#[0-9a-f]{6}$/i.test(value);\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly}\n inputClassName={cx(styles.input, inputClassName)}\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = normalizeColor(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n prefix={\n <span\n className={styles.swatch}\n style={{ backgroundColor: valid ? value : 'transparent' }}\n >\n <input\n type=\"color\"\n className={styles.picker}\n value={valid ? value.toLowerCase() : '#000000'}\n onChange={(event) => onChange?.(event.target.value)}\n disabled={disabled === true || readOnly === true}\n aria-label={intl.formatMessage(messages.pickColor)}\n />\n </span>\n }\n />\n );\n}\n\n/** The `color` type. */\nexport function ColorFieldEntry(props: FieldEntryProps) {\n return (\n <ColorField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColorField.js","names":["Select","SelectOption","usePanneauIntl","cx","getFieldProps","isString","messages","FieldEntryProps","TextField","TextFieldProps","styles","ColorPaletteEntry","getColorPalette","getSwatchColor","ColorFieldProps","Omit","palette","normalizeColor","value","trimmed","trim","toLowerCase","digits","replace","test","map","digit","join","ColorField","t0","$","_c","disabled","inputClassName","onBlur","onChange","props","readOnly","intl","undefined","length","t1","valid","t2","input","t3","next","t4","t5","backgroundColor","t6","t7","event","target","t8","t9","formatMessage","pickColor","t10","picker","t11","swatch","t12","Swatch","color","paletteSwatch","PaletteSelect","autoFocus","className","controlClassName","description","descriptionClassName","errors","errorsClassName","id","label","labelClassName","name","placeholder","required","current","some","entry","entries","_temp","options","triggerClassName","t13","entry_0","prefix","ColorFieldEntry","field","_c","styles"],"sources":["../../src/color/ColorField.tsx"],"sourcesContent":["import { Select, type SelectOption, usePanneauIntl } from '@panneau/ui';\n\nimport { cx } from '../shared/cx';\nimport { getFieldProps, 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 './ColorField.module.css';\nimport { type ColorPaletteEntry, getColorPalette, getSwatchColor } from './palette';\n\nexport interface ColorFieldProps extends Omit<TextFieldProps, 'type' | 'prefix' | 'maxLength'> {\n /**\n * The colors to pick from (decision 0058). With a palette, the field only offers its colors,\n * and the value is the `value` of one of them.\n */\n palette?: readonly ColorPaletteEntry[] | null;\n}\n\n/**\n * Normalizes a hexadecimal color: `#` prefix, lowercase, and 3 digits expanded to 6. Returns the\n * text as is when it isn't a hexadecimal color.\n */\nexport function normalizeColor(value: string): string {\n const trimmed = value.trim().toLowerCase();\n const digits = trimmed.replace(/^#/, '');\n if (/^[0-9a-f]{3}$/.test(digits)) {\n return `#${[...digits].map((digit) => digit + digit).join('')}`;\n }\n if (/^[0-9a-f]{6}$/.test(digits) || /^[0-9a-f]{8}$/.test(digits)) {\n return `#${digits}`;\n }\n return trimmed;\n}\n\n/**\n * A color as a hexadecimal value (`#1d4ed8`): typed, or picked with the browser's color picker.\n * The value is normalized on blur.\n */\nexport function ColorField({\n value,\n onChange,\n onBlur,\n disabled,\n readOnly,\n inputClassName,\n palette,\n ...props\n}: ColorFieldProps) {\n const intl = usePanneauIntl();\n if (palette !== undefined && palette !== null && palette.length > 0) {\n return (\n <PaletteSelect\n {...props}\n palette={palette}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n );\n }\n const valid = value !== null && value !== undefined && /^#[0-9a-f]{6}$/i.test(value);\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readOnly={readOnly}\n inputClassName={cx(styles.input, inputClassName)}\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = normalizeColor(value);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n prefix={\n <span\n className={styles.swatch}\n style={{ backgroundColor: valid ? value : 'transparent' }}\n >\n <input\n type=\"color\"\n className={styles.picker}\n value={valid ? value.toLowerCase() : '#000000'}\n onChange={(event) => onChange?.(event.target.value)}\n disabled={disabled === true || readOnly === true}\n aria-label={intl.formatMessage(messages.pickColor)}\n />\n </span>\n }\n />\n );\n}\n\n/** The swatch of a color, decorative: an empty box when it has no color to draw. */\nfunction Swatch({ color }: { color: string | null }) {\n return (\n <span\n className={styles.paletteSwatch}\n style={color !== null ? { backgroundColor: color } : undefined}\n />\n );\n}\n\n/**\n * The colors of a palette, as a select whose options show their swatches. It can be emptied\n * unless the field is required. A value outside the palette, kept from before, shows as it is.\n */\nfunction PaletteSelect({\n palette,\n value,\n onChange,\n onBlur,\n disabled,\n readOnly,\n required,\n label,\n description,\n errors,\n name,\n id,\n autoFocus,\n placeholder,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n ...props\n}: Omit<ColorFieldProps, 'palette' | 'inputClassName'> & {\n palette: readonly ColorPaletteEntry[];\n}) {\n const intl = usePanneauIntl();\n const current = value !== null && value !== undefined && value !== '' ? value : null;\n const entries =\n current !== null && !palette.some((entry) => entry.value === current)\n ? [...palette, { value: current }]\n : palette;\n const options = entries.map((entry): SelectOption => ({\n value: entry.value,\n label: entry.label ?? entry.value,\n prefix: <Swatch color={getSwatchColor(entry)} />,\n }));\n return (\n <Select\n options={options}\n value={current}\n onChange={(next) => onChange?.(typeof next === 'string' ? next : null)}\n label={label}\n description={description}\n errors={errors ?? []}\n isRequired={required}\n isDisabled={disabled === true || readOnly === true}\n placeholder={placeholder ?? intl.formatMessage(messages.pickColor)}\n className={className}\n labelClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n {...(props['aria-label'] !== undefined ? { 'aria-label': props['aria-label'] } : {})}\n {...(name !== undefined ? { name } : {})}\n {...(id !== undefined ? { id } : {})}\n {...(autoFocus !== undefined ? { autoFocus } : {})}\n {...(onBlur !== undefined ? { onBlur } : {})}\n {...(controlClassName !== undefined ? { triggerClassName: controlClassName } : {})}\n />\n );\n}\n\n/** The `color` type: `settings.palette`, the colors to pick from. */\nexport function ColorFieldEntry(props: FieldEntryProps) {\n const palette = getColorPalette(props.field);\n return (\n <ColorField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(palette !== null ? { palette } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -3,12 +3,14 @@ import "./ColorField.css";
|
|
|
3
3
|
var swatch = "panneau-color-field-swatch";
|
|
4
4
|
var picker = "panneau-color-field-picker";
|
|
5
5
|
var input = "panneau-color-field-input";
|
|
6
|
+
var paletteSwatch = "panneau-color-field-palette-swatch";
|
|
6
7
|
var ColorField_module_default = {
|
|
7
8
|
swatch,
|
|
8
9
|
picker,
|
|
9
|
-
input
|
|
10
|
+
input,
|
|
11
|
+
paletteSwatch
|
|
10
12
|
};
|
|
11
13
|
//#endregion
|
|
12
|
-
export { ColorField_module_default as default, input, picker, swatch };
|
|
14
|
+
export { ColorField_module_default as default, input, paletteSwatch, picker, swatch };
|
|
13
15
|
|
|
14
16
|
//# sourceMappingURL=ColorField.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorField.module.js","names":[],"sources":["../../src/color/ColorField.module.css"],"sourcesContent":[".swatch {\n position: relative;\n display: inline-flex;\n width: 1.5rem;\n height: 1.5rem;\n overflow: hidden;\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-sm);\n}\n\n.swatch:focus-within {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.picker {\n position: absolute;\n inset: -0.5rem;\n width: calc(100% + 1rem);\n height: calc(100% + 1rem);\n padding: 0;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n.picker:disabled {\n cursor: not-allowed;\n}\n\n.input {\n font-family: var(--panneau-font-family-mono);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ColorField.module.js","names":[],"sources":["../../src/color/ColorField.module.css"],"sourcesContent":[".swatch {\n position: relative;\n display: inline-flex;\n width: 1.5rem;\n height: 1.5rem;\n overflow: hidden;\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-sm);\n}\n\n.swatch:focus-within {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.picker {\n position: absolute;\n inset: -0.5rem;\n width: calc(100% + 1rem);\n height: calc(100% + 1rem);\n padding: 0;\n cursor: pointer;\n background: none;\n border: 0;\n}\n\n.picker:disabled {\n cursor: not-allowed;\n}\n\n.input {\n font-family: var(--panneau-font-family-mono);\n}\n\n.paletteSwatch {\n display: inline-block;\n width: 1rem;\n height: 1rem;\n vertical-align: middle;\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-sm);\n}\n"],"mappings":""}
|
package/dist/color/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { ColorField, ColorFieldEntry, type ColorFieldProps, normalizeColor } from './ColorField';
|
|
1
|
+
export { ColorField, ColorFieldEntry, type ColorFieldProps, normalizeColor } from './ColorField.js';
|
|
2
|
+
export { type ColorPaletteEntry, getColorPalette, getSwatchColor, isHexColor, toColorPalette, } from './palette.js';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/color/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/color/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EACH,KAAK,iBAAiB,EACtB,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,GACjB,MAAM,WAAW,CAAC"}
|
package/dist/color/index.js
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { getColorPalette, getSwatchColor, isHexColor, toColorPalette } from "./palette.js";
|
|
2
|
+
import { ColorField, ColorFieldEntry, normalizeColor } from "./ColorField.js";
|
|
3
|
+
export { ColorField, ColorFieldEntry, getColorPalette, getSwatchColor, isHexColor, normalizeColor, toColorPalette };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Field } from '@panneau/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* A color of a palette (`settings.palette` of a `color` field, decision 0058): `value` is what the
|
|
4
|
+
* field stores, `color` (hexadecimal) draws its swatch, and `label` names it. Without `color`,
|
|
5
|
+
* `value` is a hexadecimal color, which draws itself.
|
|
6
|
+
*/
|
|
7
|
+
export interface ColorPaletteEntry {
|
|
8
|
+
value: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
color?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Whether a value is a hexadecimal color: `#1d4ed8`, `#fff` or `#1d4ed880`. */
|
|
13
|
+
export declare function isHexColor(value: unknown): value is string;
|
|
14
|
+
/**
|
|
15
|
+
* The colors of a palette, from a field's `settings.palette`: entries with a `value`, and the
|
|
16
|
+
* `label` and `color` they have. `null` when it has none.
|
|
17
|
+
*/
|
|
18
|
+
export declare function toColorPalette(value: unknown): ColorPaletteEntry[] | null;
|
|
19
|
+
/** The palette of a `color` field (`settings.palette`), or `null` when it has none. */
|
|
20
|
+
export declare function getColorPalette(field: Field | null | undefined): ColorPaletteEntry[] | null;
|
|
21
|
+
/** The color that draws an entry's swatch: its `color`, or its value when it is hexadecimal. */
|
|
22
|
+
export declare function getSwatchColor(entry: ColorPaletteEntry): string | null;
|
|
23
|
+
//# sourceMappingURL=palette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/color/palette.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAgBzE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAE3F;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAEtE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/color/palette.ts
|
|
2
|
+
var HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
|
|
3
|
+
/** Whether a value is a hexadecimal color: `#1d4ed8`, `#fff` or `#1d4ed880`. */
|
|
4
|
+
function isHexColor(value) {
|
|
5
|
+
return typeof value === "string" && HEX.test(value);
|
|
6
|
+
}
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The colors of a palette, from a field's `settings.palette`: entries with a `value`, and the
|
|
12
|
+
* `label` and `color` they have. `null` when it has none.
|
|
13
|
+
*/
|
|
14
|
+
function toColorPalette(value) {
|
|
15
|
+
if (!Array.isArray(value)) return null;
|
|
16
|
+
const palette = value.flatMap((entry) => isRecord(entry) && typeof entry.value === "string" && entry.value !== "" ? [{
|
|
17
|
+
value: entry.value,
|
|
18
|
+
...typeof entry.label === "string" ? { label: entry.label } : {},
|
|
19
|
+
...isHexColor(entry.color) ? { color: entry.color } : {}
|
|
20
|
+
}] : []);
|
|
21
|
+
return palette.length > 0 ? palette : null;
|
|
22
|
+
}
|
|
23
|
+
/** The palette of a `color` field (`settings.palette`), or `null` when it has none. */
|
|
24
|
+
function getColorPalette(field) {
|
|
25
|
+
return toColorPalette(field?.settings?.palette);
|
|
26
|
+
}
|
|
27
|
+
/** The color that draws an entry's swatch: its `color`, or its value when it is hexadecimal. */
|
|
28
|
+
function getSwatchColor(entry) {
|
|
29
|
+
return entry.color ?? (isHexColor(entry.value) ? entry.value : null);
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { getColorPalette, getSwatchColor, isHexColor, toColorPalette };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"palette.js","names":["Field","ColorPaletteEntry","value","label","color","HEX","isHexColor","test","isRecord","Record","Array","isArray","toColorPalette","palette","flatMap","entry","length","getColorPalette","field","settings","getSwatchColor"],"sources":["../../src/color/palette.ts"],"sourcesContent":["import type { Field } from '@panneau/protocol';\n\n/**\n * A color of a palette (`settings.palette` of a `color` field, decision 0058): `value` is what the\n * field stores, `color` (hexadecimal) draws its swatch, and `label` names it. Without `color`,\n * `value` is a hexadecimal color, which draws itself.\n */\nexport interface ColorPaletteEntry {\n value: string;\n label?: string;\n color?: string;\n}\n\nconst HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/** Whether a value is a hexadecimal color: `#1d4ed8`, `#fff` or `#1d4ed880`. */\nexport function isHexColor(value: unknown): value is string {\n return typeof value === 'string' && HEX.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The colors of a palette, from a field's `settings.palette`: entries with a `value`, and the\n * `label` and `color` they have. `null` when it has none.\n */\nexport function toColorPalette(value: unknown): ColorPaletteEntry[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const palette = value.flatMap((entry): ColorPaletteEntry[] =>\n isRecord(entry) && typeof entry.value === 'string' && entry.value !== ''\n ? [\n {\n value: entry.value,\n ...(typeof entry.label === 'string' ? { label: entry.label } : {}),\n ...(isHexColor(entry.color) ? { color: entry.color } : {}),\n },\n ]\n : [],\n );\n return palette.length > 0 ? palette : null;\n}\n\n/** The palette of a `color` field (`settings.palette`), or `null` when it has none. */\nexport function getColorPalette(field: Field | null | undefined): ColorPaletteEntry[] | null {\n return toColorPalette(field?.settings?.palette);\n}\n\n/** The color that draws an entry's swatch: its `color`, or its value when it is hexadecimal. */\nexport function getSwatchColor(entry: ColorPaletteEntry): string | null {\n return entry.color ?? (isHexColor(entry.value) ? entry.value : null);\n}\n"],"mappings":";AAaA,IAAMK,MAAM;;AAGZ,SAAgBC,WAAWJ,OAAiC;CACxD,OAAO,OAAOA,UAAU,YAAYG,IAAIE,KAAKL,KAAK;AACtD;AAEA,SAASM,SAASN,OAAkD;CAChE,OAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACQ,MAAMC,QAAQT,KAAK;AAC9E;;;;;AAMA,SAAgBU,eAAeV,OAA4C;CACvE,IAAI,CAACQ,MAAMC,QAAQT,KAAK,GACpB,OAAO;CAEX,MAAMW,UAAUX,MAAMY,SAASC,UAC3BP,SAASO,KAAK,KAAK,OAAOA,MAAMb,UAAU,YAAYa,MAAMb,UAAU,KAChE,CACI;EACIA,OAAOa,MAAMb;EACb,GAAI,OAAOa,MAAMZ,UAAU,WAAW,EAAEA,OAAOY,MAAMZ,MAAM,IAAI,CAAC;EAChE,GAAIG,WAAWS,MAAMX,KAAK,IAAI,EAAEA,OAAOW,MAAMX,MAAM,IAAI,CAAC;CAC5D,CAAC,IAEL,CAAA,CACV;CACA,OAAOS,QAAQG,SAAS,IAAIH,UAAU;AAC1C;;AAGA,SAAgBI,gBAAgBC,OAA6D;CACzF,OAAON,eAAeM,OAAOC,UAAUN,OAAO;AAClD;;AAGA,SAAgBO,eAAeL,OAAyC;CACpE,OAAOA,MAAMX,UAAUE,WAAWS,MAAMb,KAAK,IAAIa,MAAMb,QAAQ;AACnE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* The layout of compound fields (decision 0065): their parts side by side, the wide ones on a row
|
|
2
|
+
of their own. */
|
|
3
|
+
.panneau-compound-row {
|
|
4
|
+
display: grid;
|
|
5
|
+
grid-template-columns: repeat(auto-fill, minmax(min(100%, 12rem), 1fr));
|
|
6
|
+
gap: var(--panneau-space-3) var(--panneau-space-4);
|
|
7
|
+
align-items: start;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.panneau-compound-part {
|
|
11
|
+
min-width: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* A part hidden by its condition renders nothing: its cell takes no column. */
|
|
15
|
+
.panneau-compound-part:empty {
|
|
16
|
+
display: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.panneau-compound-wide {
|
|
20
|
+
grid-column: 1 / -1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.panneau-compound-stack {
|
|
24
|
+
display: grid;
|
|
25
|
+
gap: var(--panneau-space-3);
|
|
26
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "./Compound.css";
|
|
2
|
+
//#region src/compound/Compound.module.css
|
|
3
|
+
var row = "panneau-compound-row";
|
|
4
|
+
var part = "panneau-compound-part";
|
|
5
|
+
var wide = "panneau-compound-wide";
|
|
6
|
+
var stack = "panneau-compound-stack";
|
|
7
|
+
var Compound_module_default = {
|
|
8
|
+
row,
|
|
9
|
+
part,
|
|
10
|
+
wide,
|
|
11
|
+
stack
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { Compound_module_default as default, part, row, stack, wide };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=Compound.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Compound.module.js","names":[],"sources":["../../src/compound/Compound.module.css"],"sourcesContent":["/* The layout of compound fields (decision 0065): their parts side by side, the wide ones on a row\n of their own. */\n.row {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(100%, 12rem), 1fr));\n gap: var(--panneau-space-3) var(--panneau-space-4);\n align-items: start;\n}\n\n.part {\n min-width: 0;\n}\n\n/* A part hidden by its condition renders nothing: its cell takes no column. */\n.part:empty {\n display: none;\n}\n\n.wide {\n grid-column: 1 / -1;\n}\n\n.stack {\n display: grid;\n gap: var(--panneau-space-3);\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { Field } from '@panneau/protocol';
|
|
3
|
+
import type { FieldEntry } from '../shared/types.js';
|
|
4
|
+
/** What a compound field's summary is given. */
|
|
5
|
+
export interface CompoundSummaryContext {
|
|
6
|
+
/** The compound field, as the definition describes it. */
|
|
7
|
+
field: Field;
|
|
8
|
+
/** The locale of the interface. */
|
|
9
|
+
locale: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A short text for one value of a compound field: its object, or an item of its list. `null` when
|
|
13
|
+
* there is nothing to say.
|
|
14
|
+
*/
|
|
15
|
+
export type CompoundSummary = (value: Readonly<Record<string, unknown>>, context: CompoundSummaryContext) => string | null;
|
|
16
|
+
/** What lays out the sub-fields of one value of a compound field. */
|
|
17
|
+
export interface CompoundLayoutProps {
|
|
18
|
+
/** The rendered sub-fields, by name. Those the definition doesn't have are missing. */
|
|
19
|
+
parts: Readonly<Record<string, ReactNode>>;
|
|
20
|
+
/** The value: the object, or the item of the list. */
|
|
21
|
+
value: Readonly<Record<string, unknown>>;
|
|
22
|
+
/** The compound field. */
|
|
23
|
+
field: Field;
|
|
24
|
+
}
|
|
25
|
+
export interface CompoundFieldOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Lays out the sub-fields of one value. Without it, they flow as in a group. Sub-fields that
|
|
28
|
+
* the layout doesn't place aren't shown: `restParts()` gives them.
|
|
29
|
+
*/
|
|
30
|
+
layout?: (props: CompoundLayoutProps) => ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Summarizes one value: the title of an item in the form, and the value in lists and details,
|
|
33
|
+
* where the items of a list are joined.
|
|
34
|
+
*/
|
|
35
|
+
summarize?: CompoundSummary;
|
|
36
|
+
}
|
|
37
|
+
/** The entry of a compound field type, with its summary for lists and details. */
|
|
38
|
+
export type CompoundFieldEntry = FieldEntry & {
|
|
39
|
+
summarize?: CompoundSummary;
|
|
40
|
+
};
|
|
41
|
+
/** The rendered sub-fields that aren't in `names`, in the order of the definition. */
|
|
42
|
+
export declare function restParts(parts: Readonly<Record<string, ReactNode>>, names: readonly string[]): ReactNode[];
|
|
43
|
+
/**
|
|
44
|
+
* Summarizes the value of a compound field with its entry's `summarize`: one text, or the texts of
|
|
45
|
+
* its items joined by commas. `null` without a summary, or when there is nothing to say.
|
|
46
|
+
*/
|
|
47
|
+
export declare function summarizeCompound(entry: unknown, value: unknown, context: CompoundSummaryContext): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Makes the entry of a compound field type (decision 0065): a type of a plugin that carries its
|
|
50
|
+
* sub-fields in `fields`. Its value is an object of them, or a list of objects with `multiple`,
|
|
51
|
+
* rendered as a `group` or a `repeater` with the layout and the summary given. The definition
|
|
52
|
+
* decides the sub-fields: the layout places those it knows by name. The README of
|
|
53
|
+
* `@panneau/fields` has an example.
|
|
54
|
+
*/
|
|
55
|
+
export declare function defineCompoundField(options?: CompoundFieldOptions): CompoundFieldEntry;
|
|
56
|
+
//# sourceMappingURL=compound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../src/compound/compound.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAO/C,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEnE,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACnC,0DAA0D;IAC1D,KAAK,EAAE,KAAK,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAC1B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,OAAO,EAAE,sBAAsB,KAC9B,MAAM,GAAG,IAAI,CAAC;AAEnB,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAChC,uFAAuF;IACvF,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3C,sDAAsD;IACtD,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,0BAA0B;IAC1B,KAAK,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG;IAAE,SAAS,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9E,sFAAsF;AACtF,wBAAgB,SAAS,CACrB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAC1C,KAAK,EAAE,SAAS,MAAM,EAAE,GACzB,SAAS,EAAE,CAIb;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,sBAAsB,GAChC,MAAM,GAAG,IAAI,CAcf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,kBAAkB,CA6C1F"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { getFieldProps, getRuleNumber } from "../shared/entry.js";
|
|
2
|
+
import { GroupField } from "../group/GroupField.js";
|
|
3
|
+
import { RepeaterField } from "../repeater/RepeaterField.js";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
5
|
+
import { getNestedShape } from "@panneau/protocol/runtime";
|
|
6
|
+
import { usePanneauIntl } from "@panneau/ui";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
//#region src/compound/compound.tsx
|
|
9
|
+
/** The rendered sub-fields that aren't in `names`, in the order of the definition. */
|
|
10
|
+
function restParts(parts, names) {
|
|
11
|
+
return Object.entries(parts).filter(([name]) => !names.includes(name)).map(([, part]) => part);
|
|
12
|
+
}
|
|
13
|
+
function isObject(value) {
|
|
14
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Summarizes the value of a compound field with its entry's `summarize`: one text, or the texts of
|
|
18
|
+
* its items joined by commas. `null` without a summary, or when there is nothing to say.
|
|
19
|
+
*/
|
|
20
|
+
function summarizeCompound(entry, value, context) {
|
|
21
|
+
const summarize = typeof entry === "function" && "summarize" in entry ? entry.summarize : void 0;
|
|
22
|
+
if (summarize === void 0) return null;
|
|
23
|
+
const texts = (Array.isArray(value) ? value.filter(isObject) : isObject(value) ? [value] : []).flatMap((item) => {
|
|
24
|
+
const text = summarize(item, context);
|
|
25
|
+
return text !== null && text !== "" ? [text] : [];
|
|
26
|
+
});
|
|
27
|
+
return texts.length > 0 ? texts.join(", ") : null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Makes the entry of a compound field type (decision 0065): a type of a plugin that carries its
|
|
31
|
+
* sub-fields in `fields`. Its value is an object of them, or a list of objects with `multiple`,
|
|
32
|
+
* rendered as a `group` or a `repeater` with the layout and the summary given. The definition
|
|
33
|
+
* decides the sub-fields: the layout places those it knows by name. The README of
|
|
34
|
+
* `@panneau/fields` has an example.
|
|
35
|
+
*/
|
|
36
|
+
function defineCompoundField(options = {}) {
|
|
37
|
+
const { layout, summarize } = options;
|
|
38
|
+
function CompoundField(props) {
|
|
39
|
+
const $ = c(44);
|
|
40
|
+
const intl = usePanneauIntl();
|
|
41
|
+
const { field, value } = props;
|
|
42
|
+
let t0;
|
|
43
|
+
if ($[0] !== field.fields) {
|
|
44
|
+
t0 = field.fields ?? [];
|
|
45
|
+
$[0] = field.fields;
|
|
46
|
+
$[1] = t0;
|
|
47
|
+
} else t0 = $[1];
|
|
48
|
+
const fields = t0;
|
|
49
|
+
let t1;
|
|
50
|
+
if ($[2] !== field || $[3] !== intl.locale) {
|
|
51
|
+
t1 = {
|
|
52
|
+
field,
|
|
53
|
+
locale: intl.locale
|
|
54
|
+
};
|
|
55
|
+
$[2] = field;
|
|
56
|
+
$[3] = intl.locale;
|
|
57
|
+
$[4] = t1;
|
|
58
|
+
} else t1 = $[4];
|
|
59
|
+
const context = t1;
|
|
60
|
+
let t2;
|
|
61
|
+
if ($[5] !== field) {
|
|
62
|
+
t2 = layout !== void 0 ? (parts, item) => layout({
|
|
63
|
+
parts,
|
|
64
|
+
value: item,
|
|
65
|
+
field
|
|
66
|
+
}) : void 0;
|
|
67
|
+
$[5] = field;
|
|
68
|
+
$[6] = t2;
|
|
69
|
+
} else t2 = $[6];
|
|
70
|
+
const renderFields = t2;
|
|
71
|
+
if (getNestedShape(field) === "repeater") {
|
|
72
|
+
let t3;
|
|
73
|
+
if ($[7] !== field) {
|
|
74
|
+
t3 = getRuleNumber(field, "min");
|
|
75
|
+
$[7] = field;
|
|
76
|
+
$[8] = t3;
|
|
77
|
+
} else t3 = $[8];
|
|
78
|
+
const min = t3;
|
|
79
|
+
let t4;
|
|
80
|
+
if ($[9] !== field) {
|
|
81
|
+
t4 = getRuleNumber(field, "max");
|
|
82
|
+
$[9] = field;
|
|
83
|
+
$[10] = t4;
|
|
84
|
+
} else t4 = $[10];
|
|
85
|
+
const max = t4;
|
|
86
|
+
let t5;
|
|
87
|
+
if ($[11] !== props) {
|
|
88
|
+
t5 = getFieldProps(props);
|
|
89
|
+
$[11] = props;
|
|
90
|
+
$[12] = t5;
|
|
91
|
+
} else t5 = $[12];
|
|
92
|
+
let t6;
|
|
93
|
+
if ($[13] !== value) {
|
|
94
|
+
t6 = Array.isArray(value) ? value.filter(isObject) : null;
|
|
95
|
+
$[13] = value;
|
|
96
|
+
$[14] = t6;
|
|
97
|
+
} else t6 = $[14];
|
|
98
|
+
let t7;
|
|
99
|
+
if ($[15] !== renderFields) {
|
|
100
|
+
t7 = renderFields !== void 0 ? { renderFields } : {};
|
|
101
|
+
$[15] = renderFields;
|
|
102
|
+
$[16] = t7;
|
|
103
|
+
} else t7 = $[16];
|
|
104
|
+
let t8;
|
|
105
|
+
if ($[17] !== context) {
|
|
106
|
+
t8 = summarize !== void 0 ? { itemTitle: (item_0) => summarize(item_0, context) } : {};
|
|
107
|
+
$[17] = context;
|
|
108
|
+
$[18] = t8;
|
|
109
|
+
} else t8 = $[18];
|
|
110
|
+
let t9;
|
|
111
|
+
if ($[19] !== min) {
|
|
112
|
+
t9 = min !== void 0 ? { min } : {};
|
|
113
|
+
$[19] = min;
|
|
114
|
+
$[20] = t9;
|
|
115
|
+
} else t9 = $[20];
|
|
116
|
+
let t10;
|
|
117
|
+
if ($[21] !== max) {
|
|
118
|
+
t10 = max !== void 0 ? { max } : {};
|
|
119
|
+
$[21] = max;
|
|
120
|
+
$[22] = t10;
|
|
121
|
+
} else t10 = $[22];
|
|
122
|
+
let t11;
|
|
123
|
+
if ($[23] !== fields || $[24] !== props.onChange || $[25] !== props.path || $[26] !== t10 || $[27] !== t5 || $[28] !== t6 || $[29] !== t7 || $[30] !== t8 || $[31] !== t9) {
|
|
124
|
+
t11 = /* @__PURE__ */ jsx(RepeaterField, {
|
|
125
|
+
...t5,
|
|
126
|
+
path: props.path,
|
|
127
|
+
fields,
|
|
128
|
+
value: t6,
|
|
129
|
+
onChange: props.onChange,
|
|
130
|
+
...t7,
|
|
131
|
+
...t8,
|
|
132
|
+
...t9,
|
|
133
|
+
...t10
|
|
134
|
+
});
|
|
135
|
+
$[23] = fields;
|
|
136
|
+
$[24] = props.onChange;
|
|
137
|
+
$[25] = props.path;
|
|
138
|
+
$[26] = t10;
|
|
139
|
+
$[27] = t5;
|
|
140
|
+
$[28] = t6;
|
|
141
|
+
$[29] = t7;
|
|
142
|
+
$[30] = t8;
|
|
143
|
+
$[31] = t9;
|
|
144
|
+
$[32] = t11;
|
|
145
|
+
} else t11 = $[32];
|
|
146
|
+
return t11;
|
|
147
|
+
}
|
|
148
|
+
let t3;
|
|
149
|
+
if ($[33] !== props) {
|
|
150
|
+
t3 = getFieldProps(props);
|
|
151
|
+
$[33] = props;
|
|
152
|
+
$[34] = t3;
|
|
153
|
+
} else t3 = $[34];
|
|
154
|
+
const t4 = isObject(value) ? value : null;
|
|
155
|
+
let t5;
|
|
156
|
+
if ($[35] !== renderFields) {
|
|
157
|
+
t5 = renderFields !== void 0 ? { renderFields } : {};
|
|
158
|
+
$[35] = renderFields;
|
|
159
|
+
$[36] = t5;
|
|
160
|
+
} else t5 = $[36];
|
|
161
|
+
let t6;
|
|
162
|
+
if ($[37] !== fields || $[38] !== props.onChange || $[39] !== props.path || $[40] !== t3 || $[41] !== t4 || $[42] !== t5) {
|
|
163
|
+
t6 = /* @__PURE__ */ jsx(GroupField, {
|
|
164
|
+
...t3,
|
|
165
|
+
fields,
|
|
166
|
+
path: props.path,
|
|
167
|
+
value: t4,
|
|
168
|
+
onChange: props.onChange,
|
|
169
|
+
...t5
|
|
170
|
+
});
|
|
171
|
+
$[37] = fields;
|
|
172
|
+
$[38] = props.onChange;
|
|
173
|
+
$[39] = props.path;
|
|
174
|
+
$[40] = t3;
|
|
175
|
+
$[41] = t4;
|
|
176
|
+
$[42] = t5;
|
|
177
|
+
$[43] = t6;
|
|
178
|
+
} else t6 = $[43];
|
|
179
|
+
return t6;
|
|
180
|
+
}
|
|
181
|
+
return Object.assign(CompoundField, summarize !== void 0 ? { summarize } : {});
|
|
182
|
+
}
|
|
183
|
+
//#endregion
|
|
184
|
+
export { defineCompoundField, restParts, summarizeCompound };
|
|
185
|
+
|
|
186
|
+
//# sourceMappingURL=compound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.js","names":["ReactNode","Field","getNestedShape","usePanneauIntl","GroupField","GroupValue","RepeaterField","RepeaterItem","getFieldProps","getRuleNumber","FieldEntry","FieldEntryProps","CompoundSummaryContext","field","locale","CompoundSummary","value","Readonly","Record","context","CompoundLayoutProps","parts","CompoundFieldOptions","layout","props","summarize","CompoundFieldEntry","restParts","names","Object","entries","filter","name","includes","map","part","isObject","Array","isArray","summarizeCompound","entry","undefined","values","texts","flatMap","item","text","length","join","defineCompoundField","options","CompoundField","$","_c","intl","t0","fields","t1","t2","renderFields","t3","min","t4","max","t5","t6","t7","t8","itemTitle","item_0","t9","t10","t11","onChange","path","assign","_c"],"sources":["../../src/compound/compound.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport type { Field } from '@panneau/protocol';\nimport { getNestedShape } from '@panneau/protocol/runtime';\nimport { usePanneauIntl } from '@panneau/ui';\n\nimport { GroupField, type GroupValue } from '../group/GroupField';\nimport { RepeaterField, type RepeaterItem } from '../repeater/RepeaterField';\nimport { getFieldProps, getRuleNumber } from '../shared/entry';\nimport type { FieldEntry, FieldEntryProps } from '../shared/types';\n\n/** What a compound field's summary is given. */\nexport interface CompoundSummaryContext {\n /** The compound field, as the definition describes it. */\n field: Field;\n /** The locale of the interface. */\n locale: string;\n}\n\n/**\n * A short text for one value of a compound field: its object, or an item of its list. `null` when\n * there is nothing to say.\n */\nexport type CompoundSummary = (\n value: Readonly<Record<string, unknown>>,\n context: CompoundSummaryContext,\n) => string | null;\n\n/** What lays out the sub-fields of one value of a compound field. */\nexport interface CompoundLayoutProps {\n /** The rendered sub-fields, by name. Those the definition doesn't have are missing. */\n parts: Readonly<Record<string, ReactNode>>;\n /** The value: the object, or the item of the list. */\n value: Readonly<Record<string, unknown>>;\n /** The compound field. */\n field: Field;\n}\n\nexport interface CompoundFieldOptions {\n /**\n * Lays out the sub-fields of one value. Without it, they flow as in a group. Sub-fields that\n * the layout doesn't place aren't shown: `restParts()` gives them.\n */\n layout?: (props: CompoundLayoutProps) => ReactNode;\n /**\n * Summarizes one value: the title of an item in the form, and the value in lists and details,\n * where the items of a list are joined.\n */\n summarize?: CompoundSummary;\n}\n\n/** The entry of a compound field type, with its summary for lists and details. */\nexport type CompoundFieldEntry = FieldEntry & { summarize?: CompoundSummary };\n\n/** The rendered sub-fields that aren't in `names`, in the order of the definition. */\nexport function restParts(\n parts: Readonly<Record<string, ReactNode>>,\n names: readonly string[],\n): ReactNode[] {\n return Object.entries(parts)\n .filter(([name]) => !names.includes(name))\n .map(([, part]) => part);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Summarizes the value of a compound field with its entry's `summarize`: one text, or the texts of\n * its items joined by commas. `null` without a summary, or when there is nothing to say.\n */\nexport function summarizeCompound(\n entry: unknown,\n value: unknown,\n context: CompoundSummaryContext,\n): string | null {\n const summarize =\n typeof entry === 'function' && 'summarize' in entry\n ? (entry.summarize as CompoundSummary | undefined)\n : undefined;\n if (summarize === undefined) {\n return null;\n }\n const values = Array.isArray(value) ? value.filter(isObject) : isObject(value) ? [value] : [];\n const texts = values.flatMap((item) => {\n const text = summarize(item, context);\n return text !== null && text !== '' ? [text] : [];\n });\n return texts.length > 0 ? texts.join(', ') : null;\n}\n\n/**\n * Makes the entry of a compound field type (decision 0065): a type of a plugin that carries its\n * sub-fields in `fields`. Its value is an object of them, or a list of objects with `multiple`,\n * rendered as a `group` or a `repeater` with the layout and the summary given. The definition\n * decides the sub-fields: the layout places those it knows by name. The README of\n * `@panneau/fields` has an example.\n */\nexport function defineCompoundField(options: CompoundFieldOptions = {}): CompoundFieldEntry {\n const { layout, summarize } = options;\n\n function CompoundField(props: FieldEntryProps) {\n const intl = usePanneauIntl();\n const { field, value } = props;\n const fields = field.fields ?? [];\n const context = { field, locale: intl.locale };\n const renderFields =\n layout !== undefined\n ? (parts: Readonly<Record<string, ReactNode>>, item: Record<string, unknown>) =>\n layout({ parts, value: item, field })\n : undefined;\n if (getNestedShape(field) === 'repeater') {\n const min = getRuleNumber(field, 'min');\n const max = getRuleNumber(field, 'max');\n return (\n <RepeaterField\n {...getFieldProps(props)}\n path={props.path}\n fields={fields}\n value={Array.isArray(value) ? value.filter(isObject) : null}\n onChange={props.onChange}\n {...(renderFields !== undefined ? { renderFields } : {})}\n {...(summarize !== undefined\n ? { itemTitle: (item: RepeaterItem) => summarize(item, context) }\n : {})}\n {...(min !== undefined ? { min } : {})}\n {...(max !== undefined ? { max } : {})}\n />\n );\n }\n return (\n <GroupField\n {...getFieldProps(props)}\n fields={fields}\n path={props.path}\n value={isObject(value) ? (value as GroupValue) : null}\n onChange={props.onChange}\n {...(renderFields !== undefined ? { renderFields } : {})}\n />\n );\n }\n\n return Object.assign(CompoundField, summarize !== undefined ? { summarize } : {});\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.panneau-country-field-multiple {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: var(--panneau-space-2);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.panneau-country-field-countries {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-wrap: wrap;
|
|
10
|
+
gap: var(--panneau-space-1) var(--panneau-space-2);
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding: 0;
|
|
13
|
+
list-style: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.panneau-country-field-country,
|
|
17
|
+
.panneau-country-field-fixed-country {
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: var(--panneau-space-1);
|
|
21
|
+
min-height: var(--panneau-control-height-sm);
|
|
22
|
+
max-width: 100%;
|
|
23
|
+
padding-inline: var(--panneau-space-3) var(--panneau-space-1);
|
|
24
|
+
font-size: var(--panneau-font-size-sm);
|
|
25
|
+
background-color: var(--panneau-color-surface-sunken);
|
|
26
|
+
border: var(--panneau-border-width) solid var(--panneau-color-border);
|
|
27
|
+
border-radius: var(--panneau-radius-full);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.panneau-country-field-fixed-country {
|
|
31
|
+
padding-inline-end: var(--panneau-space-3);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.panneau-country-field-flag {
|
|
35
|
+
flex: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.panneau-country-field-name {
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
text-overflow: ellipsis;
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
2
|
+
/** Props of both single and multiple country fields. */
|
|
3
|
+
export interface CountryFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {
|
|
4
|
+
/** The codes to offer. All countries without it. */
|
|
5
|
+
countries?: readonly string[];
|
|
6
|
+
/** Codes shown first, in their order, above the others: `['CA', 'US']`. */
|
|
7
|
+
preferred?: readonly string[];
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
controlClassName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SingleCountryFieldProps extends CountryFieldBaseProps {
|
|
12
|
+
multiple?: false;
|
|
13
|
+
value?: string | null;
|
|
14
|
+
onChange?: (value: string | null) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface MultipleCountryFieldProps extends CountryFieldBaseProps {
|
|
17
|
+
/** Several countries, in the order they were chosen (decision 0058). */
|
|
18
|
+
multiple: true;
|
|
19
|
+
value?: readonly string[] | null;
|
|
20
|
+
/** Called with the codes. An empty list is `null`. */
|
|
21
|
+
onChange?: (value: string[] | null) => void;
|
|
22
|
+
}
|
|
23
|
+
export type CountryFieldProps = SingleCountryFieldProps | MultipleCountryFieldProps;
|
|
24
|
+
/**
|
|
25
|
+
* A country, as its ISO 3166-1 alpha-2 code (`CA`): a combo box of the countries with their flags
|
|
26
|
+
* and their names in the user's locale. Typing filters them by name or by code. With `multiple`,
|
|
27
|
+
* several countries, each removable, in the order they were chosen, and the combo box adds one.
|
|
28
|
+
*/
|
|
29
|
+
export declare function CountryField(props: CountryFieldProps): import("react").JSX.Element;
|
|
30
|
+
/** The `country` type: `multiple`, `settings.countries` and `settings.preferred`. */
|
|
31
|
+
export declare function CountryFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=CountryField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CountryField.d.ts","sourceRoot":"","sources":["../../src/country/CountryField.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,wDAAwD;AACxD,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACxF,oDAAoD;IACpD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB;IACpE,wEAAwE;IACxE,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;AAEpF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BAoHpD;AAKD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,+BA0BvD"}
|