@panneau/fields 5.0.0-alpha.15 → 5.0.0-alpha.16

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.
Files changed (139) hide show
  1. package/README.md +53 -3
  2. package/dist/address/AddressField.css +44 -0
  3. package/dist/address/AddressField.d.ts +37 -0
  4. package/dist/address/AddressField.d.ts.map +1 -0
  5. package/dist/address/AddressField.js +411 -0
  6. package/dist/address/AddressField.js.map +1 -0
  7. package/dist/address/AddressField.module.js +22 -0
  8. package/dist/address/AddressField.module.js.map +1 -0
  9. package/dist/address/address.d.ts +23 -0
  10. package/dist/address/address.d.ts.map +1 -0
  11. package/dist/address/address.js +58 -0
  12. package/dist/address/address.js.map +1 -0
  13. package/dist/address/index.d.ts +3 -0
  14. package/dist/address/index.d.ts.map +1 -0
  15. package/dist/address/index.js +3 -0
  16. package/dist/color/ColorField.css +9 -0
  17. package/dist/color/ColorField.d.ts +10 -3
  18. package/dist/color/ColorField.d.ts.map +1 -1
  19. package/dist/color/ColorField.js +341 -81
  20. package/dist/color/ColorField.js.map +1 -1
  21. package/dist/color/ColorField.module.js +4 -2
  22. package/dist/color/ColorField.module.js.map +1 -1
  23. package/dist/color/index.d.ts +1 -0
  24. package/dist/color/index.d.ts.map +1 -1
  25. package/dist/color/index.js +3 -1
  26. package/dist/color/palette.d.ts +23 -0
  27. package/dist/color/palette.d.ts.map +1 -0
  28. package/dist/color/palette.js +34 -0
  29. package/dist/color/palette.js.map +1 -0
  30. package/dist/country/CountryField.css +42 -0
  31. package/dist/country/CountryField.d.ts +19 -4
  32. package/dist/country/CountryField.d.ts.map +1 -1
  33. package/dist/country/CountryField.js +355 -82
  34. package/dist/country/CountryField.js.map +1 -1
  35. package/dist/country/CountryField.module.js +20 -0
  36. package/dist/country/CountryField.module.js.map +1 -0
  37. package/dist/country/index.d.ts +1 -1
  38. package/dist/country/index.d.ts.map +1 -1
  39. package/dist/daterange/DateRangeField.css +9 -0
  40. package/dist/daterange/DateRangeField.d.ts +31 -0
  41. package/dist/daterange/DateRangeField.d.ts.map +1 -0
  42. package/dist/daterange/DateRangeField.js +372 -0
  43. package/dist/daterange/DateRangeField.js.map +1 -0
  44. package/dist/daterange/DateRangeField.module.js +12 -0
  45. package/dist/daterange/DateRangeField.module.js.map +1 -0
  46. package/dist/daterange/index.d.ts +3 -0
  47. package/dist/daterange/index.d.ts.map +1 -0
  48. package/dist/daterange/index.js +3 -0
  49. package/dist/daterange/range.d.ts +61 -0
  50. package/dist/daterange/range.d.ts.map +1 -0
  51. package/dist/daterange/range.js +119 -0
  52. package/dist/daterange/range.js.map +1 -0
  53. package/dist/duration/DurationField.css +1 -1
  54. package/dist/duration/DurationField.d.ts +54 -13
  55. package/dist/duration/DurationField.d.ts.map +1 -1
  56. package/dist/duration/DurationField.js +205 -159
  57. package/dist/duration/DurationField.js.map +1 -1
  58. package/dist/duration/DurationField.module.js.map +1 -1
  59. package/dist/duration/index.d.ts +1 -1
  60. package/dist/duration/index.d.ts.map +1 -1
  61. package/dist/duration/index.js +1 -1
  62. package/dist/embed/EmbedField.d.ts +11 -2
  63. package/dist/embed/EmbedField.d.ts.map +1 -1
  64. package/dist/embed/EmbedField.js +179 -116
  65. package/dist/embed/EmbedField.js.map +1 -1
  66. package/dist/link/LinkField.css +12 -0
  67. package/dist/link/LinkField.d.ts +38 -0
  68. package/dist/link/LinkField.d.ts.map +1 -0
  69. package/dist/link/LinkField.js +742 -0
  70. package/dist/link/LinkField.js.map +1 -0
  71. package/dist/link/LinkField.module.js +8 -0
  72. package/dist/link/LinkField.module.js.map +1 -0
  73. package/dist/link/index.d.ts +3 -0
  74. package/dist/link/index.d.ts.map +1 -0
  75. package/dist/link/index.js +3 -0
  76. package/dist/link/link.d.ts +30 -0
  77. package/dist/link/link.d.ts.map +1 -0
  78. package/dist/link/link.js +63 -0
  79. package/dist/link/link.js.map +1 -0
  80. package/dist/link/pages.d.ts +17 -0
  81. package/dist/link/pages.d.ts.map +1 -0
  82. package/dist/link/pages.js +104 -0
  83. package/dist/link/pages.js.map +1 -0
  84. package/dist/location/LocationField.d.ts.map +1 -1
  85. package/dist/location/LocationField.js +9 -85
  86. package/dist/location/LocationField.js.map +1 -1
  87. package/dist/location/nominatim.d.ts +8 -2
  88. package/dist/location/nominatim.d.ts.map +1 -1
  89. package/dist/location/nominatim.js +32 -3
  90. package/dist/location/nominatim.js.map +1 -1
  91. package/dist/location/search.d.ts +10 -0
  92. package/dist/location/search.d.ts.map +1 -0
  93. package/dist/location/search.js +83 -0
  94. package/dist/location/search.js.map +1 -0
  95. package/dist/location/types.d.ts +8 -2
  96. package/dist/location/types.d.ts.map +1 -1
  97. package/dist/money/MoneyField.d.ts +28 -0
  98. package/dist/money/MoneyField.d.ts.map +1 -0
  99. package/dist/money/MoneyField.js +269 -0
  100. package/dist/money/MoneyField.js.map +1 -0
  101. package/dist/money/index.d.ts +3 -0
  102. package/dist/money/index.d.ts.map +1 -0
  103. package/dist/money/index.js +3 -0
  104. package/dist/money/money.d.ts +27 -0
  105. package/dist/money/money.d.ts.map +1 -0
  106. package/dist/money/money.js +56 -0
  107. package/dist/money/money.js.map +1 -0
  108. package/dist/region/RegionField.js +1 -1
  109. package/dist/shared/builtIn.d.ts +3 -1
  110. package/dist/shared/builtIn.d.ts.map +1 -1
  111. package/dist/shared/builtIn.js +18 -8
  112. package/dist/shared/builtIn.js.map +1 -1
  113. package/dist/shared/dates.js +2 -2
  114. package/dist/shared/dates.js.map +1 -1
  115. package/dist/shared/flow.d.ts.map +1 -1
  116. package/dist/shared/flow.js +1 -0
  117. package/dist/shared/flow.js.map +1 -1
  118. package/dist/shared/part.d.ts +26 -0
  119. package/dist/shared/part.d.ts.map +1 -0
  120. package/dist/shared/part.js +64 -0
  121. package/dist/shared/part.js.map +1 -0
  122. package/dist/tel/TelField.css +25 -0
  123. package/dist/tel/TelField.d.ts +14 -2
  124. package/dist/tel/TelField.d.ts.map +1 -1
  125. package/dist/tel/TelField.js +246 -145
  126. package/dist/tel/TelField.js.map +1 -1
  127. package/dist/tel/TelField.module.js +12 -0
  128. package/dist/tel/TelField.module.js.map +1 -0
  129. package/dist/tel/index.d.ts +1 -1
  130. package/dist/tel/index.d.ts.map +1 -1
  131. package/dist/tel/index.js +2 -2
  132. package/dist/tel/phone.d.ts +28 -0
  133. package/dist/tel/phone.d.ts.map +1 -1
  134. package/dist/tel/phone.js +48 -1
  135. package/dist/tel/phone.js.map +1 -1
  136. package/dist/url/UrlField.d.ts.map +1 -1
  137. package/dist/url/UrlField.js +1 -1
  138. package/dist/url/UrlField.js.map +1 -1
  139. package/package.json +24 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkField.js","names":["File","FileIcon","FileText","Globe","Hash","Mail","Phone","ReactNode","useState","Field","LinkValue","LinkNewTab","LinkType","getLinkNewTab","getLinkTypes","Checkbox","ComboBox","Fieldset","IconComponent","SegmentedControl","TextInput","usePanneauIntl","EmailField","LocalizedField","LocalizedValue","DefinitionField","useFieldsContext","getFieldProps","getSetting","isString","messages","BoundPart","BoundPartProps","FieldEntryProps","FieldProps","TelField","TextField","UrlField","styles","LinkPage","cleanLink","getLinkPage","isLink","usePageSearch","LinkLabelMode","LinkFieldProps","path","types","pages","libraries","newTab","labelMode","singleLabel","DEFAULT_TYPES","id","TYPE_ICONS","Readonly","Record","url","page","email","tel","file","withoutScheme","scheme","undefined","toLowerCase","startsWith","slice","length","LinkField","t0","$","_c","value","onChange","onBlur","name","typesProp","t1","t2","t3","t4","label","description","errors","disabled","readOnly","required","className","t5","intl","locales","relationSource","defaultType","t6","type","find","candidate","base","t7","part","partPath","editable","t8","next","link","change","t9","setUrl","t10","candidate_0","formatMessage","linkTypeUrl","linkTypePage","linkTypeEmail","linkTypeTel","linkTypeFile","typeName","t11","bound","shared","t12","partName","partType","render","part_0","input","bb0","t13","bound_5","linkUrl","t14","bound_4","linkEmail","bound_3","linkTel","number","bound_2","linkPage","linkFile","resource","t15","fileField","t16","bound_1","t17","bound_0","placeholder","linkLabel","labelText","labelRequired","bound_6","text","next_0","localeInput","text_0","labelInput","linkType","map","candidate_1","icon","next_1","selected","linkNewTab","t18","PagePickerProps","resources","PagePicker","query","setQuery","enabled","items","isLoading","item","keyOf","T0","current","shown","some","item_0","item_1","key","found","item_2","search","noResults","isLabelMode","isCodes","Array","isArray","every","LinkFieldEntry","props","field","fieldProps","_placeholder","locale","FileIcon","_c","styles"],"sources":["../../src/link/LinkField.tsx"],"sourcesContent":["import { File as FileIcon, FileText, Globe, Hash, Mail, Phone } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport type { Field, LinkValue } from '@panneau/protocol';\nimport {\n type LinkNewTab,\n type LinkType,\n getLinkNewTab,\n getLinkTypes,\n} from '@panneau/protocol/runtime';\nimport {\n Checkbox,\n ComboBox,\n Fieldset,\n type IconComponent,\n SegmentedControl,\n TextInput,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { EmailField } from '../email/EmailField';\nimport { LocalizedField, type LocalizedValue } from '../localized/LocalizedField';\nimport { DefinitionField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport { BoundPart, type BoundPartProps } from '../shared/part';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { TelField } from '../tel/TelField';\nimport { TextField } from '../text/TextField';\nimport { UrlField } from '../url/UrlField';\nimport styles from './LinkField.module.css';\nimport { type LinkPage, cleanLink, getLinkPage, isLink } from './link';\nimport { usePageSearch } from './pages';\n\n/** Whether links have a label: optional, required, or none. */\nexport type LinkLabelMode = 'optional' | 'required' | 'none';\n\nexport interface LinkFieldProps extends FieldProps<LinkValue> {\n /** Dot path of the value, the prefix of the paths of its parts. Defaults to `name`. */\n path?: string;\n /** The types offered, in order. Defaults to `url`, `email` and `tel`. */\n types?: readonly LinkType[];\n /** The resources of `page` links. */\n pages?: readonly string[];\n /** The media libraries of `file` links. Defaults to every library. */\n libraries?: readonly string[];\n /** Which links open in a new tab. Defaults to `choose`, a checkbox. */\n newTab?: LinkNewTab;\n /** Whether links have a label. Defaults to `optional`. */\n labelMode?: LinkLabelMode;\n /**\n * The label is a string, not a value per locale: in a `localized` link field, where the whole\n * link is per locale already.\n */\n singleLabel?: boolean;\n}\n\nconst DEFAULT_TYPES: readonly LinkType[] = [{ id: 'url' }, { id: 'email' }, { id: 'tel' }];\n\nconst TYPE_ICONS: Readonly<Record<string, IconComponent>> = {\n url: Globe,\n page: FileText,\n email: Mail,\n tel: Phone,\n file: FileIcon,\n};\n\n/** The text of a URL after its scheme: `info@example.com` in `mailto:info@example.com`. */\nfunction withoutScheme(url: string | undefined, scheme: string): string | null {\n if (url === undefined || url === '') {\n return null;\n }\n return url.toLowerCase().startsWith(scheme) ? url.slice(scheme.length) : url;\n}\n\n/**\n * A link (decision 0055): its type, in a segmented control, then the input of the type (a URL, a\n * page searched in the resources of `pages`, an email address, a phone number, a media, or the\n * text of a type of the site), its label per locale, and whether it opens in a new tab. Each part\n * shows the errors of its own path (`link.url`) in a form.\n */\nexport function LinkField({\n value,\n onChange,\n onBlur,\n path,\n name,\n types: typesProp,\n pages = [],\n libraries,\n newTab = 'choose',\n labelMode = 'optional',\n singleLabel = false,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n}: LinkFieldProps) {\n const intl = usePanneauIntl();\n const { locales, relationSource } = useFieldsContext();\n const types = typesProp !== undefined && typesProp.length > 0 ? typesProp : DEFAULT_TYPES;\n const defaultType = types[0]?.id;\n const type = types.find((candidate) => candidate.id === value?.type) ?? types[0];\n const base = path ?? name ?? '';\n const partPath = (part: string) => (base !== '' ? `${base}.${part}` : part);\n const editable = disabled !== true && readOnly !== true;\n\n const change = (next: Partial<LinkValue>) => {\n const link = { ...value, type: value?.type ?? defaultType ?? 'url', ...next };\n onChange?.(cleanLink(link, { newTab, defaultType }));\n };\n const setUrl = (url: string | null) => change({ url: url ?? undefined });\n\n const typeName = (candidate: LinkType) => {\n switch (candidate.id) {\n case 'url':\n return intl.formatMessage(messages.linkTypeUrl);\n case 'page':\n return intl.formatMessage(messages.linkTypePage);\n case 'email':\n return intl.formatMessage(messages.linkTypeEmail);\n case 'tel':\n return intl.formatMessage(messages.linkTypeTel);\n case 'file':\n return intl.formatMessage(messages.linkTypeFile);\n default:\n return candidate.label ?? candidate.id;\n }\n };\n const shared = (bound: BoundPartProps) => ({\n errors: bound.errors ?? [],\n ...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n required: required === true || (value ?? null) !== null,\n });\n const part = (\n partName: string,\n partType: string,\n render: (bound: BoundPartProps) => ReactNode,\n ) => (\n <BoundPart\n field={{ name: partName, type: partType }}\n path={partPath(partName)}\n {...(onBlur !== undefined ? { onBlur } : {})}\n render={render}\n />\n );\n\n let input: ReactNode = null;\n if (type !== undefined) {\n switch (type.id) {\n case 'url':\n input = part('url', 'url', (bound) => (\n <UrlField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkUrl)}\n value={value?.url ?? null}\n onChange={setUrl}\n />\n ));\n break;\n case 'email':\n input = part('url', 'email', (bound) => (\n <EmailField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkEmail)}\n value={withoutScheme(value?.url, 'mailto:')}\n onChange={(email) => setUrl(email !== null ? `mailto:${email}` : null)}\n />\n ));\n break;\n case 'tel':\n input = part('url', 'tel', (bound) => (\n <TelField\n {...shared(bound)}\n label={intl.formatMessage(messages.linkTel)}\n value={withoutScheme(value?.url, 'tel:')}\n onChange={(number) => setUrl(number !== null ? `tel:${number}` : null)}\n />\n ));\n break;\n case 'page':\n input = part('page', 'relation', (bound) => (\n <PagePicker\n {...shared(bound)}\n label={intl.formatMessage(messages.linkPage)}\n resources={pages}\n page={getLinkPage(value)}\n editable={editable && relationSource !== null}\n onChange={(page) =>\n change({ page: page !== null ? { ...page } : undefined })\n }\n />\n ));\n break;\n case 'file': {\n const fileField: Field = {\n name: 'file',\n type: 'media',\n label: intl.formatMessage(messages.linkFile),\n ...(libraries !== undefined && libraries.length > 0\n ? { resource: [...libraries] }\n : {}),\n };\n // The media entry of the fields context, set as a part of the link\n input = part('file', 'media', (bound) => (\n <DefinitionField\n field={fileField}\n path={partPath('file')}\n value={value?.file ?? null}\n onChange={(file) =>\n change({ file: (file ?? undefined) as LinkValue['file'] })\n }\n errors={bound.errors ?? []}\n {...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {})}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ));\n break;\n }\n default:\n input = part('url', 'text', (bound) => (\n <TextField\n {...shared(bound)}\n label={typeName(type)}\n autoComplete=\"off\"\n {...(type.placeholder !== undefined\n ? { placeholder: type.placeholder }\n : {})}\n value={value?.url ?? null}\n onChange={setUrl}\n />\n ));\n }\n }\n\n const labelText = intl.formatMessage(messages.linkLabel);\n const labelRequired = labelMode === 'required';\n const labelInput =\n labelMode === 'none'\n ? null\n : part('label', 'text', (bound) =>\n singleLabel || locales.length === 0 ? (\n <TextField\n {...shared(bound)}\n label={labelText}\n required={labelRequired}\n value={typeof value?.label === 'string' ? value.label : null}\n onChange={(text) => change({ label: text })}\n />\n ) : (\n <LocalizedField<string>\n label={labelText}\n errors={bound.errors ?? []}\n required={labelRequired}\n locales={locales}\n value={\n value?.label !== null && typeof value?.label === 'object'\n ? (value.label as LocalizedValue<string>)\n : {}\n }\n onChange={(next) =>\n change({ label: (next ?? null) as LinkValue['label'] })\n }\n >\n {(localeInput) => (\n <TextInput\n aria-label={`${labelText} (${localeInput.label})`}\n value={localeInput.value ?? ''}\n onChange={(text) =>\n localeInput.onChange(text === '' ? null : text)\n }\n {...(bound.onBlur !== undefined ? { onBlur: bound.onBlur } : {})}\n isDisabled={disabled === true}\n isReadOnly={readOnly === true}\n />\n )}\n </LocalizedField>\n ),\n );\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n >\n <div className={styles.link}>\n {types.length > 1 ? (\n <SegmentedControl\n aria-label={intl.formatMessage(messages.linkType)}\n size=\"sm\"\n isDisabled={!editable}\n options={types.map((candidate) => ({\n value: candidate.id,\n label: typeName(candidate),\n icon: TYPE_ICONS[candidate.id] ?? Hash,\n }))}\n {...(type !== undefined ? { value: type.id } : {})}\n onChange={(next) => {\n if (next !== type?.id) {\n // A new type keeps the label only\n onChange?.(\n cleanLink(\n {\n type: next,\n label: value?.label ?? null,\n newTab: value?.newTab ?? false,\n },\n { newTab, defaultType },\n ),\n );\n }\n }}\n />\n ) : null}\n {input}\n {labelInput}\n {newTab === 'choose' ? (\n <Checkbox\n isSelected={value?.newTab === true}\n onChange={(selected) => change({ newTab: selected })}\n isDisabled={!editable}\n >\n {intl.formatMessage(messages.linkNewTab)}\n </Checkbox>\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\ninterface PagePickerProps {\n label: string;\n resources: readonly string[];\n page: LinkPage | null;\n onChange: (page: LinkPage | null) => void;\n editable: boolean;\n errors: readonly string[];\n onBlur?: () => void;\n required: boolean;\n}\n\n/** The page of a link: searched in every resource of `pages`, with the relation source. */\nfunction PagePicker({\n label,\n resources,\n page,\n onChange,\n editable,\n errors,\n onBlur,\n required,\n}: PagePickerProps) {\n const intl = usePanneauIntl();\n const { relationSource } = useFieldsContext();\n const [query, setQuery] = useState<string | null>(null);\n const { items, isLoading } = usePageSearch(relationSource, resources, query ?? '', {\n enabled: editable,\n });\n const keyOf = (item: { id: string; resource?: string }) =>\n `${item.resource ?? resources[0] ?? ''}\\u0000${item.id}`;\n const current = page !== null ? { ...page, label: page.label ?? page.id } : null;\n const shown =\n current !== null && !items.some((item) => keyOf(item) === keyOf(current))\n ? [current, ...items]\n : items;\n return (\n <ComboBox\n label={label}\n errors={errors}\n isRequired={required}\n isDisabled={!editable}\n items={shown.map((item) => ({ id: keyOf(item), label: item.label }))}\n value={current !== null ? keyOf(current) : null}\n inputValue={query ?? current?.label ?? ''}\n onInputChange={(text) => {\n setQuery(text);\n if (text === '' && current !== null) {\n onChange(null);\n }\n }}\n onChange={(key) => {\n setQuery(null);\n const found = shown.find((item) => keyOf(item) === key);\n if (found !== undefined) {\n onChange({\n id: found.id,\n label: found.label,\n ...(found.resource !== undefined\n ? { resource: found.resource }\n : resources[0] !== undefined\n ? { resource: resources[0] }\n : {}),\n });\n }\n }}\n isLoading={isLoading}\n placeholder={intl.formatMessage(messages.search)}\n emptyMessage={intl.formatMessage(messages.noResults)}\n {...(onBlur !== undefined ? { onBlur: () => onBlur() } : {})}\n />\n );\n}\n\nconst isLabelMode = (value: unknown): value is LinkLabelMode =>\n value === 'optional' || value === 'required' || value === 'none';\nconst isCodes = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\n/**\n * The `link` type: its `resource` (the resources of `page` links), and settings `types`,\n * `newTab`, `label` and `libraries`. In a localized field, the label of each locale's link is a\n * string.\n */\nexport function LinkFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const labelMode = getSetting(field, 'label', isLabelMode);\n const libraries = getSetting(field, 'libraries', isCodes);\n const pages =\n field.resource === undefined\n ? []\n : typeof field.resource === 'string'\n ? [field.resource]\n : field.resource;\n const { placeholder: _placeholder, ...fieldProps } = getFieldProps(props);\n return (\n <LinkField\n {...fieldProps}\n path={props.path}\n value={isLink(props.value) ? props.value : null}\n onChange={props.onChange}\n types={getLinkTypes(field)}\n pages={pages}\n newTab={getLinkNewTab(field)}\n singleLabel={props.locale !== undefined}\n {...(labelMode !== undefined ? { labelMode } : {})}\n {...(libraries !== undefined ? { libraries } : {})}\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import "./LinkField.css";
2
+ //#region src/link/LinkField.module.css
3
+ var link = "panneau-link-field-link";
4
+ var LinkField_module_default = { link };
5
+ //#endregion
6
+ export { LinkField_module_default as default, link };
7
+
8
+ //# sourceMappingURL=LinkField.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkField.module.js","names":[],"sources":["../../src/link/LinkField.module.css"],"sourcesContent":["/* The type, its input, the label, then the new tab. */\n.link {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--panneau-space-3);\n}\n\n.link > :first-child {\n align-self: flex-start;\n max-width: 100%;\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { LinkField, LinkFieldEntry, type LinkFieldProps, type LinkLabelMode } from './LinkField.js';
2
+ export { type LinkPage, type LinkValue, cleanLink, getLinkLabel, getLinkPage, getLinkText, isLink, } from './link.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/link/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACX,MAAM,GACT,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { cleanLink, getLinkLabel, getLinkPage, getLinkText, isLink } from "./link.js";
2
+ import { LinkField, LinkFieldEntry } from "./LinkField.js";
3
+ export { LinkField, LinkFieldEntry, cleanLink, getLinkLabel, getLinkPage, getLinkText, isLink };
@@ -0,0 +1,30 @@
1
+ import type { LinkValue } from '@panneau/protocol';
2
+ import { type LinkNewTab } from '@panneau/protocol/runtime';
3
+ export type { LinkValue };
4
+ /** A page of a link: its id, its resource, and its label. */
5
+ export interface LinkPage {
6
+ id: string;
7
+ resource?: string;
8
+ label?: string;
9
+ }
10
+ /** Whether a value is a link: an object with a `type`. */
11
+ export declare function isLink(value: unknown): value is LinkValue;
12
+ /** The page of a link, as a reference: an id alone (`"12"`) has no label. */
13
+ export declare function getLinkPage(link: LinkValue | null | undefined): LinkPage | null;
14
+ /** The label of a link in a locale: that locale's, the first filled one, or a string label. */
15
+ export declare function getLinkLabel(link: LinkValue | null | undefined, locale?: string): string | null;
16
+ /**
17
+ * What a link shows: its label in the locale, or the label of its page, or its URL without its
18
+ * scheme (`example.com`, `info@example.com`, `+15145550199`).
19
+ */
20
+ export declare function getLinkText(link: LinkValue | null | undefined, locale?: string): string | null;
21
+ /**
22
+ * A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,
23
+ * and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,
24
+ * without a URL, a page, a file or a label.
25
+ */
26
+ export declare function cleanLink(link: LinkValue, { newTab, defaultType }: {
27
+ newTab: LinkNewTab;
28
+ defaultType: string | undefined;
29
+ }): LinkValue | null;
30
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/link/link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,2BAA2B,CAAC;AAE/E,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAOzD;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAY/E;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB/F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa9F;AAYD;;;;GAIG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,SAAS,EACf,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACjF,SAAS,GAAG,IAAI,CAiBlB"}
@@ -0,0 +1,63 @@
1
+ import { resolveLinkNewTab } from "@panneau/protocol/runtime";
2
+ //#region src/link/link.ts
3
+ /** Whether a value is a link: an object with a `type`. */
4
+ function isLink(value) {
5
+ return value !== null && typeof value === "object" && !Array.isArray(value) && typeof value.type === "string";
6
+ }
7
+ /** The page of a link, as a reference: an id alone (`"12"`) has no label. */
8
+ function getLinkPage(link) {
9
+ const page = link?.page;
10
+ if (typeof page === "string") return page !== "" ? { id: page } : null;
11
+ return page !== void 0 && page !== null && typeof page.id === "string" ? {
12
+ id: page.id,
13
+ ...typeof page.resource === "string" ? { resource: page.resource } : {},
14
+ ...typeof page.label === "string" ? { label: page.label } : {}
15
+ } : null;
16
+ }
17
+ /** The label of a link in a locale: that locale's, the first filled one, or a string label. */
18
+ function getLinkLabel(link, locale) {
19
+ const label = link?.label;
20
+ if (typeof label === "string") return label.trim() !== "" ? label : null;
21
+ if (label === null || label === void 0) return null;
22
+ const language = locale?.split("-")[0];
23
+ const own = (locale !== void 0 ? label[locale] : void 0) ?? (language !== void 0 ? label[language] : void 0);
24
+ if (typeof own === "string" && own.trim() !== "") return own;
25
+ return Object.values(label).find((text) => typeof text === "string" && text.trim() !== "") ?? null;
26
+ }
27
+ /**
28
+ * What a link shows: its label in the locale, or the label of its page, or its URL without its
29
+ * scheme (`example.com`, `info@example.com`, `+15145550199`).
30
+ */
31
+ function getLinkText(link, locale) {
32
+ const label = getLinkLabel(link, locale);
33
+ if (label !== null) return label;
34
+ const page = getLinkPage(link);
35
+ if (page !== null) return page.label ?? page.id;
36
+ const url = link?.url;
37
+ return typeof url === "string" && url !== "" ? url.replace(/^(https?:\/\/|mailto:|tel:)/i, "").replace(/\/$/, "") : null;
38
+ }
39
+ function isEmptyLabel(label) {
40
+ if (label === null || label === void 0) return true;
41
+ if (typeof label === "string") return label.trim() === "";
42
+ return !Object.values(label).some((text) => typeof text === "string" && text.trim() !== "");
43
+ }
44
+ /**
45
+ * A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,
46
+ * and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,
47
+ * without a URL, a page, a file or a label.
48
+ */
49
+ function cleanLink(link, { newTab, defaultType }) {
50
+ const { type } = link;
51
+ const next = { type };
52
+ if (type === "page" || type === "file") {
53
+ const target = link[type];
54
+ if (target !== void 0 && target !== null && target !== "") next[type] = target;
55
+ } else if (typeof link.url === "string" && link.url !== "") next.url = link.url;
56
+ if (!isEmptyLabel(link.label)) next.label = link.label ?? null;
57
+ next.newTab = resolveLinkNewTab(newTab, link);
58
+ return next.url === void 0 && next.page === void 0 && next.file === void 0 && next.label === void 0 && type === defaultType ? null : next;
59
+ }
60
+ //#endregion
61
+ export { cleanLink, getLinkLabel, getLinkPage, getLinkText, isLink };
62
+
63
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","names":["LinkValue","LinkNewTab","resolveLinkNewTab","LinkPage","id","resource","label","isLink","value","Array","isArray","type","getLinkPage","link","page","undefined","getLinkLabel","locale","trim","language","split","own","Object","values","find","text","getLinkText","url","replace","isEmptyLabel","some","cleanLink","newTab","defaultType","next","target","empty","file"],"sources":["../../src/link/link.ts"],"sourcesContent":["import type { LinkValue } from '@panneau/protocol';\nimport { type LinkNewTab, resolveLinkNewTab } from '@panneau/protocol/runtime';\n\nexport type { LinkValue };\n\n/** A page of a link: its id, its resource, and its label. */\nexport interface LinkPage {\n id: string;\n resource?: string;\n label?: string;\n}\n\n/** Whether a value is a link: an object with a `type`. */\nexport function isLink(value: unknown): value is LinkValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof (value as { type?: unknown }).type === 'string'\n );\n}\n\n/** The page of a link, as a reference: an id alone (`\"12\"`) has no label. */\nexport function getLinkPage(link: LinkValue | null | undefined): LinkPage | null {\n const page = link?.page;\n if (typeof page === 'string') {\n return page !== '' ? { id: page } : null;\n }\n return page !== undefined && page !== null && typeof page.id === 'string'\n ? {\n id: page.id,\n ...(typeof page.resource === 'string' ? { resource: page.resource } : {}),\n ...(typeof page.label === 'string' ? { label: page.label } : {}),\n }\n : null;\n}\n\n/** The label of a link in a locale: that locale's, the first filled one, or a string label. */\nexport function getLinkLabel(link: LinkValue | null | undefined, locale?: string): string | null {\n const label = link?.label;\n if (typeof label === 'string') {\n return label.trim() !== '' ? label : null;\n }\n if (label === null || label === undefined) {\n return null;\n }\n const language = locale?.split('-')[0];\n const own =\n (locale !== undefined ? label[locale] : undefined) ??\n (language !== undefined ? label[language] : undefined);\n if (typeof own === 'string' && own.trim() !== '') {\n return own;\n }\n return (\n Object.values(label).find((text) => typeof text === 'string' && text.trim() !== '') ?? null\n );\n}\n\n/**\n * What a link shows: its label in the locale, or the label of its page, or its URL without its\n * scheme (`example.com`, `info@example.com`, `+15145550199`).\n */\nexport function getLinkText(link: LinkValue | null | undefined, locale?: string): string | null {\n const label = getLinkLabel(link, locale);\n if (label !== null) {\n return label;\n }\n const page = getLinkPage(link);\n if (page !== null) {\n return page.label ?? page.id;\n }\n const url = link?.url;\n return typeof url === 'string' && url !== ''\n ? url.replace(/^(https?:\\/\\/|mailto:|tel:)/i, '').replace(/\\/$/, '')\n : null;\n}\n\nfunction isEmptyLabel(label: LinkValue['label']): boolean {\n if (label === null || label === undefined) {\n return true;\n }\n if (typeof label === 'string') {\n return label.trim() === '';\n }\n return !Object.values(label).some((text) => typeof text === 'string' && text.trim() !== '');\n}\n\n/**\n * A link with the parts of its type only (`url`, or `page`, or `file`), its label when it has one,\n * and its `newTab` as the setting sets it. `null` when the link is of the first type of its field,\n * without a URL, a page, a file or a label.\n */\nexport function cleanLink(\n link: LinkValue,\n { newTab, defaultType }: { newTab: LinkNewTab; defaultType: string | undefined },\n): LinkValue | null {\n const { type } = link;\n const next: LinkValue = { type };\n if (type === 'page' || type === 'file') {\n const target = link[type];\n if (target !== undefined && target !== null && target !== '') {\n next[type] = target as never;\n }\n } else if (typeof link.url === 'string' && link.url !== '') {\n next.url = link.url;\n }\n if (!isEmptyLabel(link.label)) {\n next.label = link.label ?? null;\n }\n next.newTab = resolveLinkNewTab(newTab, link);\n const empty = next.url === undefined && next.page === undefined && next.file === undefined;\n return empty && next.label === undefined && type === defaultType ? null : next;\n}\n"],"mappings":";;;AAaA,SAAgBO,OAAOC,OAAoC;CACvD,OACIA,UAAU,QACV,OAAOA,UAAU,YACjB,CAACC,MAAMC,QAAQF,KAAK,KACpB,OAAQA,MAA6BG,SAAS;AAEtD;;AAGA,SAAgBC,YAAYC,MAAqD;CAC7E,MAAMC,OAAOD,MAAMC;CACnB,IAAI,OAAOA,SAAS,UAChB,OAAOA,SAAS,KAAK,EAAEV,IAAIU,KAAK,IAAI;CAExC,OAAOA,SAASC,KAAAA,KAAaD,SAAS,QAAQ,OAAOA,KAAKV,OAAO,WAC3D;EACIA,IAAIU,KAAKV;EACT,GAAI,OAAOU,KAAKT,aAAa,WAAW,EAAEA,UAAUS,KAAKT,SAAS,IAAI,CAAC;EACvE,GAAI,OAAOS,KAAKR,UAAU,WAAW,EAAEA,OAAOQ,KAAKR,MAAM,IAAI,CAAC;CAClE,IACA;AACV;;AAGA,SAAgBU,aAAaH,MAAoCI,QAAgC;CAC7F,MAAMX,QAAQO,MAAMP;CACpB,IAAI,OAAOA,UAAU,UACjB,OAAOA,MAAMY,KAAK,MAAM,KAAKZ,QAAQ;CAEzC,IAAIA,UAAU,QAAQA,UAAUS,KAAAA,GAC5B,OAAO;CAEX,MAAMI,WAAWF,QAAQG,MAAM,GAAG,CAAC,CAAC;CACpC,MAAMC,OACDJ,WAAWF,KAAAA,IAAYT,MAAMW,UAAUF,KAAAA,OACvCI,aAAaJ,KAAAA,IAAYT,MAAMa,YAAYJ,KAAAA;CAChD,IAAI,OAAOM,QAAQ,YAAYA,IAAIH,KAAK,MAAM,IAC1C,OAAOG;CAEX,OACIC,OAAOC,OAAOjB,KAAK,CAAC,CAACkB,MAAMC,SAAS,OAAOA,SAAS,YAAYA,KAAKP,KAAK,MAAM,EAAE,KAAK;AAE/F;;;;;AAMA,SAAgBQ,YAAYb,MAAoCI,QAAgC;CAC5F,MAAMX,QAAQU,aAAaH,MAAMI,MAAM;CACvC,IAAIX,UAAU,MACV,OAAOA;CAEX,MAAMQ,OAAOF,YAAYC,IAAI;CAC7B,IAAIC,SAAS,MACT,OAAOA,KAAKR,SAASQ,KAAKV;CAE9B,MAAMuB,MAAMd,MAAMc;CAClB,OAAO,OAAOA,QAAQ,YAAYA,QAAQ,KACpCA,IAAIC,QAAQ,gCAAgC,EAAE,CAAC,CAACA,QAAQ,OAAO,EAAE,IACjE;AACV;AAEA,SAASC,aAAavB,OAAoC;CACtD,IAAIA,UAAU,QAAQA,UAAUS,KAAAA,GAC5B,OAAO;CAEX,IAAI,OAAOT,UAAU,UACjB,OAAOA,MAAMY,KAAK,MAAM;CAE5B,OAAO,CAACI,OAAOC,OAAOjB,KAAK,CAAC,CAACwB,MAAML,SAAS,OAAOA,SAAS,YAAYA,KAAKP,KAAK,MAAM,EAAE;AAC9F;;;;;;AAOA,SAAgBa,UACZlB,MACA,EAAEmB,QAAQC,eACM;CAChB,MAAM,EAAEtB,SAASE;CACjB,MAAMqB,OAAkB,EAAEvB,KAAK;CAC/B,IAAIA,SAAS,UAAUA,SAAS,QAAQ;EACpC,MAAMwB,SAAStB,KAAKF;EACpB,IAAIwB,WAAWpB,KAAAA,KAAaoB,WAAW,QAAQA,WAAW,IACtDD,KAAKvB,QAAQwB;CAErB,OAAO,IAAI,OAAOtB,KAAKc,QAAQ,YAAYd,KAAKc,QAAQ,IACpDO,KAAKP,MAAMd,KAAKc;CAEpB,IAAI,CAACE,aAAahB,KAAKP,KAAK,GACxB4B,KAAK5B,QAAQO,KAAKP,SAAS;CAE/B4B,KAAKF,SAAS9B,kBAAkB8B,QAAQnB,IAAI;CAE5C,OADcqB,KAAKP,QAAQZ,KAAAA,KAAamB,KAAKpB,SAASC,KAAAA,KAAamB,KAAKG,SAAStB,KAAAA,KACjEmB,KAAK5B,UAAUS,KAAAA,KAAaJ,SAASsB,cAAc,OAAOC;AAC9E"}
@@ -0,0 +1,17 @@
1
+ import type { RelationReference, RelationSource } from '../shared/relation.js';
2
+ /** A page found: its reference, and its resource. */
3
+ export interface FoundPage extends RelationReference {
4
+ resource: string;
5
+ }
6
+ /**
7
+ * The pages of several resources that match a text, as it is typed: the results of each resource,
8
+ * in the order of the resources.
9
+ */
10
+ export declare function usePageSearch(source: RelationSource | null, resources: readonly string[], query: string, { enabled, delay }?: {
11
+ enabled?: boolean;
12
+ delay?: number;
13
+ }): {
14
+ items: FoundPage[];
15
+ isLoading: boolean;
16
+ };
17
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/link/pages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5E,qDAAqD;AACrD,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IAChD,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,EAAE,OAAc,EAAE,KAAW,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5E;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAqC5C"}
@@ -0,0 +1,104 @@
1
+ import { c } from "react/compiler-runtime";
2
+ import { useEffect, useState } from "react";
3
+ //#region src/link/pages.ts
4
+ /**
5
+ * The pages of several resources that match a text, as it is typed: the results of each resource,
6
+ * in the order of the resources.
7
+ */
8
+ function usePageSearch(source, resources, query, t0) {
9
+ const $ = c(14);
10
+ let t1;
11
+ if ($[0] !== t0) {
12
+ t1 = t0 === void 0 ? {} : t0;
13
+ $[0] = t0;
14
+ $[1] = t1;
15
+ } else t1 = $[1];
16
+ const { enabled: t2, delay: t3 } = t1;
17
+ const enabled = t2 === void 0 ? true : t2;
18
+ const delay = t3 === void 0 ? 250 : t3;
19
+ let t4;
20
+ if ($[2] !== resources) {
21
+ t4 = resources.join("\0");
22
+ $[2] = resources;
23
+ $[3] = t4;
24
+ } else t4 = $[3];
25
+ const key = `${t4}\u0001${query}`;
26
+ let t5;
27
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
28
+ t5 = {
29
+ key: "",
30
+ items: [],
31
+ isLoading: false
32
+ };
33
+ $[4] = t5;
34
+ } else t5 = $[4];
35
+ const [state, setState] = useState(t5);
36
+ let t6;
37
+ let t7;
38
+ if ($[5] !== delay || $[6] !== enabled || $[7] !== key || $[8] !== source) {
39
+ t6 = () => {
40
+ if (source === null || !enabled) return;
41
+ const controller = new AbortController();
42
+ const timer = setTimeout(() => {
43
+ setState((current) => ({
44
+ ...current,
45
+ key,
46
+ isLoading: true
47
+ }));
48
+ const [t8, t9] = key.split("");
49
+ const joined = t8 === void 0 ? "" : t8;
50
+ const text = t9 === void 0 ? "" : t9;
51
+ Promise.all(joined.split("\0").map((resource) => source.search(resource, text, { signal: controller.signal }).then((items) => items.map((item) => ({
52
+ ...item,
53
+ resource
54
+ }))).catch(_temp))).then((lists) => {
55
+ if (!controller.signal.aborted) setState({
56
+ key,
57
+ items: lists.flat(),
58
+ isLoading: false
59
+ });
60
+ }).catch(_temp2);
61
+ }, delay);
62
+ return () => {
63
+ clearTimeout(timer);
64
+ controller.abort();
65
+ };
66
+ };
67
+ t7 = [
68
+ source,
69
+ key,
70
+ enabled,
71
+ delay
72
+ ];
73
+ $[5] = delay;
74
+ $[6] = enabled;
75
+ $[7] = key;
76
+ $[8] = source;
77
+ $[9] = t6;
78
+ $[10] = t7;
79
+ } else {
80
+ t6 = $[9];
81
+ t7 = $[10];
82
+ }
83
+ useEffect(t6, t7);
84
+ const t8 = state.isLoading || state.key !== key;
85
+ let t9;
86
+ if ($[11] !== state.items || $[12] !== t8) {
87
+ t9 = {
88
+ items: state.items,
89
+ isLoading: t8
90
+ };
91
+ $[11] = state.items;
92
+ $[12] = t8;
93
+ $[13] = t9;
94
+ } else t9 = $[13];
95
+ return t9;
96
+ }
97
+ function _temp2() {}
98
+ function _temp() {
99
+ return [];
100
+ }
101
+ //#endregion
102
+ export { usePageSearch };
103
+
104
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","names":["useEffect","useState","RelationReference","RelationSource","FoundPage","resource","usePageSearch","source","resources","query","t0","$","_c","t1","undefined","enabled","t2","delay","t3","t4","join","key","t5","Symbol","for","items","isLoading","state","setState","t6","t7","controller","AbortController","timer","setTimeout","current","t8","t9","split","joined","text","Promise","all","map","search","signal","then","item","catch","_temp","lists","aborted","flat","_temp2","clearTimeout","abort","_c"],"sources":["../../src/link/pages.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { RelationReference, RelationSource } from '../shared/relation';\n\n/** A page found: its reference, and its resource. */\nexport interface FoundPage extends RelationReference {\n resource: string;\n}\n\n/**\n * The pages of several resources that match a text, as it is typed: the results of each resource,\n * in the order of the resources.\n */\nexport function usePageSearch(\n source: RelationSource | null,\n resources: readonly string[],\n query: string,\n { enabled = true, delay = 250 }: { enabled?: boolean; delay?: number } = {},\n): { items: FoundPage[]; isLoading: boolean } {\n const key = `${resources.join('\\u0000')}\\u0001${query}`;\n const [state, setState] = useState<{ key: string; items: FoundPage[]; isLoading: boolean }>({\n key: '',\n items: [],\n isLoading: false,\n });\n useEffect(() => {\n if (source === null || !enabled) {\n return undefined;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setState((current) => ({ ...current, key, isLoading: true }));\n // The resources and the query, from the key that stands for them\n const [joined = '', text = ''] = key.split('\\u0001');\n Promise.all(\n joined.split('\\u0000').map((resource) =>\n source\n .search(resource, text, { signal: controller.signal })\n .then((items) => items.map((item) => ({ ...item, resource })))\n .catch(() => [] as FoundPage[]),\n ),\n )\n .then((lists) => {\n if (!controller.signal.aborted) {\n setState({ key, items: lists.flat(), isLoading: false });\n }\n })\n .catch(() => undefined);\n }, delay);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [source, key, enabled, delay]);\n return { items: state.items, isLoading: state.isLoading || state.key !== key };\n}\n"],"mappings":";;;;;;;AAaA,SAAOM,cAAAC,QAAAC,WAAAC,OAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,IAAA;EAIHG,KAAAH,OAAAI,KAAAA,IAAA,CAA0E,IAA1EJ;EAA2EC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAA3E,MAAA,EAAAI,SAAAC,IAAAC,OAAAC,OAAAL;CAAE,MAAAE,UAAAC,OAAAF,KAAAA,IAAA,OAAAE;CAAgB,MAAAC,QAAAC,OAAAJ,KAAAA,IAAA,MAAAI;CAAW,IAAAC;CAAA,IAAAR,EAAA,OAAAH,WAAA;EAEdW,KAAAX,UAASY,KAAM,IAAQ;EAACT,EAAA,KAAAH;EAAAG,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAvC,MAAAU,MAAY,GAAGF,GAAwB,QAASV;CAAQ,IAAAa;CAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EACoCF,KAAA;GAAAD,KACnF;GAAEI,OACA,CAAA;GAAEC,WACE;EACf;EAACf,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAJD,MAAA,CAAAgB,OAAAC,YAA0B3B,SAAkEqB,EAI3F;CAAE,IAAAO;CAAA,IAAAC;CAAA,IAAAnB,EAAA,OAAAM,SAAAN,EAAA,OAAAI,WAAAJ,EAAA,OAAAU,OAAAV,EAAA,OAAAJ,QAAA;EACOsB,WAAA;GACN,IAAItB,WAAW,QAAX,CAAoBQ,SAAO;GAG/B,MAAAgB,aAAmB,IAAIC,gBAAgB;GACvC,MAAAC,QAAcC,iBAAW;IACrBN,UAASO,aAAc;KAAA,GAAKA;KAAOd;KAAAK,WAAkB;IAAK,EAAE;IAE5D,MAAA,CAAAU,IAAAC,MAAiChB,IAAGiB,MAAO,GAAQ;IAA5C,MAAAC,SAAAH,OAAAtB,KAAAA,IAAA,KAAAsB;IAAa,MAAAI,OAAAH,OAAAvB,KAAAA,IAAA,KAAAuB;IACpBI,QAAOC,IACHH,OAAMD,MAAO,IAAQ,CAAC,CAAAK,KAAKtC,aACvBE,OAAMqC,OACMvC,UAAUmC,MAAM,EAAAK,QAAUd,WAAUc,OAAQ,CAAC,CAAC,CAAAC,MAChDrB,UAAWA,MAAKkB,KAAKI,UAAW;KAAA,GAAKA;KAAI1C;IAAW,EAAE,CAAC,CAAC,CAAA2C,MACvDC,KAAuB,CACtC,CACJ,CAAC,CAAAH,MACSI,UAAA;KACF,IAAI,CAACnB,WAAUc,OAAOM,SAClBvB,SAAS;MAAAP;MAAAI,OAAcyB,MAAKE,KAAM;MAAC1B,WAAa;KAAM,CAAC;IAC1D,CACJ,CAAC,CAAAsB,MACKK,MAAe;GAAC,GAC5BpC,KAAK;GAAE,aACH;IACHqC,aAAarB,KAAK;IAClBF,WAAUwB,MAAO;GAAC;EACrB;EACFzB,KAAA;GAACvB;GAAQc;GAAKN;GAASE;EAAK;EAACN,EAAA,KAAAM;EAAAN,EAAA,KAAAI;EAAAJ,EAAA,KAAAU;EAAAV,EAAA,KAAAJ;EAAAI,EAAA,KAAAkB;EAAAlB,EAAA,MAAAmB;CAAA,OAAA;EAAAD,KAAAlB,EAAA;EAAAmB,KAAAnB,EAAA;CAAA;CA5BhCX,UAAU6B,IA4BPC,EAA6B;CACQ,MAAAM,KAAAT,MAAKD,aAAcC,MAAKN,QAASA;CAAG,IAAAgB;CAAA,IAAA1B,EAAA,QAAAgB,MAAAF,SAAAd,EAAA,QAAAyB,IAAA;EAArEC,KAAA;GAAAZ,OAASE,MAAKF;GAAMC,WAAaU;EAAqC;EAACzB,EAAA,MAAAgB,MAAAF;EAAAd,EAAA,MAAAyB;EAAAzB,EAAA,MAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAA,OAAvE0B;AAAuE;AAzC3E,SAAAgB,SAAA,CAAA;AAAA,SAAAJ,QAAA;CAAA,OA0B8B,CAAA;AAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAMF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAkCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
1
+ {"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAIF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
@@ -3,9 +3,10 @@ import { getFieldProps, getSetting, isNumber, isString } from "../shared/entry.j
3
3
  import { messages } from "../shared/messages.js";
4
4
  import LocationField_module_default from "./LocationField.module.js";
5
5
  import { LocationMap } from "./LocationMap.js";
6
+ import { useAddressSearch } from "./search.js";
6
7
  import { c } from "react/compiler-runtime";
7
8
  import { X } from "lucide-react";
8
- import { useEffect, useRef, useState } from "react";
9
+ import { useRef, useState } from "react";
9
10
  import { ComboBox, Fieldset, IconButton, NumberInput, TextInput, usePanneauIntl } from "@panneau/ui";
10
11
  import { jsx, jsxs } from "react/jsx-runtime";
11
12
  //#region src/location/LocationField.tsx
@@ -15,8 +16,6 @@ var OPEN_STREET_MAP_TILES = {
15
16
  attribution: "&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors",
16
17
  maxZoom: 19
17
18
  };
18
- var SEARCH_DELAY = 400;
19
- var SEARCH_MIN_LENGTH = 3;
20
19
  var DEFAULT_CENTER = {
21
20
  lat: 20,
22
21
  lng: 0
@@ -25,86 +24,11 @@ var DEFAULT_CENTER = {
25
24
  function isLocation(value) {
26
25
  return value !== null && typeof value === "object" && isNumber(value.lat) && isNumber(value.lng);
27
26
  }
28
- /** The search of addresses: results of the text typed, after a pause. */
29
- function useAddressSearch(geocoding, query, locale) {
30
- const $ = c(9);
31
- let t0;
32
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
33
- t0 = {
34
- query: "",
35
- results: [],
36
- loading: false
37
- };
38
- $[0] = t0;
39
- } else t0 = $[0];
40
- const [state, setState] = useState(t0);
41
- let t1;
42
- let t2;
43
- if ($[1] !== geocoding || $[2] !== locale || $[3] !== query) {
44
- t1 = () => {
45
- const text = query.trim();
46
- if (geocoding === null || text.length < SEARCH_MIN_LENGTH) return;
47
- const controller = new AbortController();
48
- const timeout = window.setTimeout(() => {
49
- setState(_temp);
50
- geocoding.search(text, {
51
- signal: controller.signal,
52
- locale
53
- }).then((results) => setState({
54
- query: text,
55
- results,
56
- loading: false
57
- })).catch(() => {
58
- if (!controller.signal.aborted) setState({
59
- query: text,
60
- results: [],
61
- loading: false
62
- });
63
- });
64
- }, SEARCH_DELAY);
65
- return () => {
66
- window.clearTimeout(timeout);
67
- controller.abort();
68
- };
69
- };
70
- t2 = [
71
- geocoding,
72
- query,
73
- locale
74
- ];
75
- $[1] = geocoding;
76
- $[2] = locale;
77
- $[3] = query;
78
- $[4] = t1;
79
- $[5] = t2;
80
- } else {
81
- t1 = $[4];
82
- t2 = $[5];
83
- }
84
- useEffect(t1, t2);
85
- let t3;
86
- if ($[6] !== query || $[7] !== state) {
87
- t3 = query.trim().length >= SEARCH_MIN_LENGTH ? state : {
88
- ...state,
89
- results: []
90
- };
91
- $[6] = query;
92
- $[7] = state;
93
- $[8] = t3;
94
- } else t3 = $[8];
95
- return t3;
96
- }
97
27
  /**
98
28
  * A point on a map, and its address. Clicking the map or dragging the marker places the point,
99
29
  * and its latitude and longitude can be typed. With an address search, a place found sets the
100
30
  * point and the address; with a reverse search, placing a point fills an empty address.
101
31
  */
102
- function _temp(current) {
103
- return {
104
- ...current,
105
- loading: true
106
- };
107
- }
108
32
  function LocationField(t0) {
109
33
  const $ = c(100);
110
34
  const { value, onChange, onBlur, geocoding: geocodingProp, tiles: tilesProp, center: t1, zoom: t2, label, description, errors, disabled, readOnly, required, className } = t0;
@@ -174,7 +98,7 @@ function LocationField(t0) {
174
98
  ...next,
175
99
  address: place.label
176
100
  });
177
- }).catch(_temp2);
101
+ }).catch(_temp);
178
102
  }
179
103
  };
180
104
  $[9] = geocoding;
@@ -220,10 +144,10 @@ function LocationField(t0) {
220
144
  "aria-label": intl.formatMessage(messages.searchAddress),
221
145
  placeholder: intl.formatMessage(messages.searchAddress),
222
146
  onInputChange: setQuery,
223
- items: places.map(_temp3),
147
+ items: places.map(_temp2),
224
148
  isLoading: search.loading,
225
149
  menuTrigger: "input",
226
- emptyMessage: query.trim().length < SEARCH_MIN_LENGTH ? intl.formatMessage(messages.searchAddressHint, { count: SEARCH_MIN_LENGTH }) : intl.formatMessage(messages.noPlaces),
150
+ emptyMessage: query.trim().length < 3 ? intl.formatMessage(messages.searchAddressHint, { count: 3 }) : intl.formatMessage(messages.noPlaces),
227
151
  value: chosen !== null && query === chosen.label ? "0" : null,
228
152
  onChange: (id) => {
229
153
  const result_0 = id !== null ? places[Number(id)] : void 0;
@@ -464,13 +388,13 @@ function LocationField(t0) {
464
388
  } else t30 = $[99];
465
389
  return t30;
466
390
  }
467
- function _temp3(result, index) {
391
+ function _temp2(result, index) {
468
392
  return {
469
393
  id: String(index),
470
394
  label: result.label
471
395
  };
472
396
  }
473
- function _temp2() {}
397
+ function _temp() {}
474
398
  function isPoint(value) {
475
399
  return isLocation(value);
476
400
  }
@@ -497,7 +421,7 @@ function LocationFieldEntry(props) {
497
421
  const center = t1;
498
422
  let t2;
499
423
  if ($[4] !== field) {
500
- t2 = getSetting(field, "tiles", _temp4);
424
+ t2 = getSetting(field, "tiles", _temp3);
501
425
  $[4] = field;
502
426
  $[5] = t2;
503
427
  } else t2 = $[5];
@@ -554,7 +478,7 @@ function LocationFieldEntry(props) {
554
478
  } else t8 = $[22];
555
479
  return t8;
556
480
  }
557
- function _temp4(value) {
481
+ function _temp3(value) {
558
482
  return value !== null && typeof value === "object" && isString(value.url) && isString(value.attribution);
559
483
  }
560
484
  //#endregion