@k2b/ui 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/base.css +147 -2
- package/dist/browser/actions/ContextMenu.js +35 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/DragAndDrop.js +89 -0
- package/dist/browser/actions/DragAndDrop.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +184 -158
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +95 -139
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +379 -48
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/drag-and-drop-messages.js +75 -0
- package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/browser/actions/drag-and-drop.js +692 -0
- package/dist/browser/actions/drag-and-drop.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/actions/menu-rows.js +15 -0
- package/dist/browser/actions/menu-rows.js.map +1 -0
- package/dist/browser/actions/menu-sheet.js +154 -0
- package/dist/browser/actions/menu-sheet.js.map +1 -0
- package/dist/browser/actions/toolbar-messages.js +20 -0
- package/dist/browser/actions/toolbar-messages.js.map +1 -0
- package/dist/browser/chart-inspection.js +3 -0
- package/dist/browser/chart-inspection.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +714 -410
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +778 -0
- package/dist/browser/chat/ChatDecision.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +34 -28
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +25 -1
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +13 -3
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +8 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/reaction-people.js +15 -0
- package/dist/browser/chat/reaction-people.js.map +1 -0
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +3 -3
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +60 -86
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +7 -10
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +2 -2
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +42 -36
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileTypeIcon.js +72 -0
- package/dist/browser/content/FileTypeIcon.js.map +1 -0
- package/dist/browser/content/FileView.js +2 -2
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MessageRow.js +330 -448
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/ReactionBar.js +419 -0
- package/dist/browser/content/ReactionBar.js.map +1 -0
- package/dist/browser/content/ReferenceChip.js +162 -0
- package/dist/browser/content/ReferenceChip.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +9 -0
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +6 -3
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +557 -0
- package/dist/browser/content/chart-inspection-core.js.map +1 -0
- package/dist/browser/content/chart-inspection.js +10 -445
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -1
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/index.js +3 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +135 -23
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/index.js +1 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/input-mode.js +40 -0
- package/dist/browser/input-mode.js.map +1 -0
- package/dist/browser/inputs/FileDropTarget.js +24 -9
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +2 -2
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +9 -0
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
- package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/layout/AppOverview.js +1 -1
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +644 -445
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +283 -197
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +233 -185
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +88 -86
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/ResizeSeparator.js +81 -0
- package/dist/browser/layout/ResizeSeparator.js.map +1 -0
- package/dist/browser/layout/SidebarSwitcher.js +9 -2
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +15 -12
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/TableOfContents.js +10 -2
- package/dist/browser/layout/TableOfContents.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +130 -17
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/detail-panel-messages.js +35 -0
- package/dist/browser/layout/detail-panel-messages.js.map +1 -0
- package/dist/browser/layout/index.js +3 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/resize-separator.js +90 -0
- package/dist/browser/layout/resize-separator.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +12 -2
- package/dist/browser/layout/workspace-messages.js.map +1 -1
- package/dist/browser/surfaces/Avatar.js +50 -20
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/AvatarStack.js +406 -0
- package/dist/browser/surfaces/AvatarStack.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +1 -1
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +14 -3
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +23 -0
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +8 -2
- package/dist/browser/surfaces/avatar-messages.js.map +1 -1
- package/dist/browser/surfaces/index.js +1 -0
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/widgets/Widget.js +1 -1
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +26 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/DragAndDrop.js +63 -0
- package/dist/ssr/actions/DragAndDrop.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +140 -72
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +76 -107
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +294 -14
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
- package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
- package/dist/ssr/actions/drag-and-drop.js +692 -0
- package/dist/ssr/actions/drag-and-drop.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/actions/menu-rows.js +15 -0
- package/dist/ssr/actions/menu-rows.js.map +1 -0
- package/dist/ssr/actions/menu-sheet.js +138 -0
- package/dist/ssr/actions/menu-sheet.js.map +1 -0
- package/dist/ssr/actions/toolbar-messages.js +20 -0
- package/dist/ssr/actions/toolbar-messages.js.map +1 -0
- package/dist/ssr/chart-inspection.js +3 -0
- package/dist/ssr/chart-inspection.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +393 -102
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +465 -0
- package/dist/ssr/chat/ChatDecision.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +2 -2
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +25 -1
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +13 -3
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +8 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/reaction-people.js +15 -0
- package/dist/ssr/chat/reaction-people.js.map +1 -0
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +3 -3
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +25 -38
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +7 -10
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +2 -2
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +21 -14
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileTypeIcon.js +50 -0
- package/dist/ssr/content/FileTypeIcon.js.map +1 -0
- package/dist/ssr/content/FileView.js +2 -2
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +98 -152
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/ReactionBar.js +304 -0
- package/dist/ssr/content/ReactionBar.js.map +1 -0
- package/dist/ssr/content/ReferenceChip.js +121 -0
- package/dist/ssr/content/ReferenceChip.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +9 -0
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +6 -3
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +557 -0
- package/dist/ssr/content/chart-inspection-core.js.map +1 -0
- package/dist/ssr/content/chart-inspection.js +10 -445
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -1
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/index.js +3 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +135 -23
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/index.js +1 -0
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/input-mode.js +40 -0
- package/dist/ssr/input-mode.js.map +1 -0
- package/dist/ssr/inputs/FileDropTarget.js +17 -5
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +2 -2
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +9 -0
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
- package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/layout/AppOverview.js +1 -1
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +272 -95
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +112 -58
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +63 -36
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +7 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/ResizeSeparator.js +45 -0
- package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
- package/dist/ssr/layout/SidebarSwitcher.js +9 -2
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +1 -1
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/TableOfContents.js +10 -2
- package/dist/ssr/layout/TableOfContents.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +130 -17
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/detail-panel-messages.js +35 -0
- package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +3 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/resize-separator.js +90 -0
- package/dist/ssr/layout/resize-separator.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +12 -2
- package/dist/ssr/layout/workspace-messages.js.map +1 -1
- package/dist/ssr/surfaces/Avatar.js +20 -2
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/AvatarStack.js +286 -0
- package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +1 -1
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +4 -2
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +23 -0
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +8 -2
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
- package/dist/ssr/surfaces/index.js +1 -0
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/widgets/Widget.js +1 -1
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/ContextMenu.d.ts +9 -0
- package/dist/types/actions/DragAndDrop.d.ts +29 -0
- package/dist/types/actions/Dropdown.d.ts +12 -5
- package/dist/types/actions/GestureMenu.d.ts +6 -4
- package/dist/types/actions/Toolbar.d.ts +20 -0
- package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
- package/dist/types/actions/drag-and-drop.d.ts +36 -0
- package/dist/types/actions/index.d.ts +3 -1
- package/dist/types/actions/menu-rows.d.ts +5 -0
- package/dist/types/actions/menu-sheet.d.ts +22 -0
- package/dist/types/actions/toolbar-messages.d.ts +8 -0
- package/dist/types/chart-inspection.d.ts +2 -0
- package/dist/types/chat/ChatComposer.d.ts +26 -1
- package/dist/types/chat/ChatDecision.d.ts +133 -0
- package/dist/types/chat/ChatPrimitives.d.ts +4 -1
- package/dist/types/chat/ChatTimeline.d.ts +2 -1
- package/dist/types/chat/chat-messages.d.ts +13 -2
- package/dist/types/chat/command-search.d.ts +5 -0
- package/dist/types/chat/index.d.ts +25 -1
- package/dist/types/chat/reaction-people.d.ts +9 -0
- package/dist/types/chat/types.d.ts +54 -1
- package/dist/types/content/Chart.d.ts +11 -5
- package/dist/types/content/FileTypeIcon.d.ts +27 -0
- package/dist/types/content/MessageRow.d.ts +3 -10
- package/dist/types/content/ReactionBar.d.ts +32 -0
- package/dist/types/content/ReferenceChip.d.ts +49 -0
- package/dist/types/content/calendar-pointer.d.ts +6 -0
- package/dist/types/content/chart-inspection-core.d.ts +61 -0
- package/dist/types/content/chart-inspection.d.ts +4 -20
- package/dist/types/content/chart-snapshot.d.ts +1 -1
- package/dist/types/content/index.d.ts +5 -1
- package/dist/types/feedback/dialog-core.d.ts +16 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/input-mode.d.ts +7 -0
- package/dist/types/inputs/FileDropTarget.d.ts +6 -3
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/file-drop.d.ts +2 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -3
- package/dist/types/layout/DetailPanel.d.ts +11 -0
- package/dist/types/layout/Discussion.d.ts +8 -0
- package/dist/types/layout/ResizeSeparator.d.ts +9 -0
- package/dist/types/layout/TabBar.d.ts +7 -0
- package/dist/types/layout/TableOfContents.d.ts +2 -0
- package/dist/types/layout/app-workspace-controller.d.ts +2 -0
- package/dist/types/layout/detail-panel-messages.d.ts +15 -0
- package/dist/types/layout/index.d.ts +3 -1
- package/dist/types/layout/resize-separator.d.ts +18 -0
- package/dist/types/layout/workspace-messages.d.ts +5 -0
- package/dist/types/surfaces/Avatar.d.ts +12 -0
- package/dist/types/surfaces/AvatarStack.d.ts +41 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -0
- package/dist/types/surfaces/avatar-messages.d.ts +3 -0
- package/dist/types/surfaces/index.d.ts +3 -1
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/FileInputs.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, mergeProps, onCleanup, onMount, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { fileDropTarget } from \"./FileDropTarget\";\nimport type { FieldProps, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { fileDropEngine, liveDocument } from \"./file-drop\";\nimport { useFileDropMessages } from \"./file-drop-messages\";\nimport { useFileInputMessages } from \"./file-input-messages\";\nimport {\n clampImageCropRect,\n getInitialImageCropRect,\n type ImageCropAspect,\n type ImageCropRect,\n type ImageCropResizeHandle,\n type ImageCropRotation,\n type ImageCropSource,\n type ImageCropState,\n resizeImageCropFromCorner,\n rotateImageCropRight,\n} from \"./image-crop\";\n\nexport type FileDropzoneProps = FieldProps & {\n accept?: string;\n multiple?: boolean;\n busy?: boolean;\n /** Full icon class list, for example `\"ti ti-photo-plus\"`. Defaults to `\"ti ti-cloud-upload\"`. */\n icon?: string;\n title?: JSX.Element;\n subtitle?: JSX.Element;\n hint?: JSX.Element;\n /** One sentence that says what dropping does, shown while files are over the zone. Defaults to \"Drop to upload\". */\n dropLabel?: string;\n /**\n * Chooses files when the zone is clicked, instead of the device's file dialog, for example to offer other sources as\n * well. Called within the click, so it may still open the device's dialog; resolve `[]` when the user cancels. A\n * rejection shows its message as the field's error.\n */\n choose?: () => Promise<readonly File[]>;\n onDrop: (files: File[]) => void | Promise<void>;\n};\n\nexport function FileDropzone(props: FileDropzoneProps): JSX.Element {\n const fileInputMessages = useFileInputMessages();\n const fileDropMessages = useFileDropMessages();\n const meta = createFieldMeta(props.id);\n const disabled = () => Boolean(props.disabled || props.busy);\n const [chooseError, setChooseError] = createSignal<string>();\n const error = () => resolveMaybeAccessor(props.error) ?? chooseError();\n let input: HTMLInputElement | undefined;\n const [button, setButton] = createSignal<HTMLButtonElement>();\n const emit = (files: File[]) => {\n if (disabled() || files.length === 0) return;\n setChooseError();\n void props.onDrop(props.multiple === false ? files.slice(0, 1) : files);\n };\n const choose = (chooseFiles: () => Promise<readonly File[]>) => {\n setChooseError();\n chooseFiles().then(\n (files) => emit([...files]),\n (cause: unknown) => setChooseError(cause instanceof Error && cause.message ? cause.message : fileInputMessages().failedLoadFiles),\n );\n };\n // Drops take the same path as every other file drop target: files only, the most specific target wins, and files\n // that do not fit `accept` are left out with a message.\n const dropLabel = () => props.dropLabel ?? fileInputMessages().dropToUpload;\n const dropRef = fileDropTarget({\n get label() {\n return dropLabel();\n },\n get accept() {\n return props.accept;\n },\n get multiple() {\n return props.multiple;\n },\n get disabled() {\n return disabled();\n },\n onDrop: emit,\n });\n const [engine, setEngine] = createSignal<ReturnType<typeof fileDropEngine>>();\n onMount(() => {\n const element = button();\n if (element) setEngine(fileDropEngine(liveDocument(element)));\n });\n const dragState = createMemo(() => {\n const element = button();\n const hover = engine()?.session()?.hover;\n if (!hover || hover.element !== element) return undefined;\n return hover.invalid ? \"invalid\" : \"over\";\n });\n const title = () =>\n props.busy\n ? fileInputMessages().uploading\n : dragState() === \"invalid\"\n ? fileDropMessages().fileTypeNotAccepted\n : dragState() === \"over\"\n ? dropLabel()\n : (props.title ?? fileInputMessages().dropFiles);\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <button\n id={meta.controlId}\n type=\"button\"\n ref={(element) => {\n setButton(element);\n dropRef(element);\n }}\n class=\"k2b-dropzone\"\n data-invalid={error() ? \"true\" : undefined}\n disabled={disabled()}\n {...fieldControlAria(meta, mergeProps(props, { error }))}\n onClick={() => {\n if (props.choose) choose(props.choose);\n else input?.click();\n }}\n >\n <span class=\"k2b-dropzone__icon\" aria-hidden=\"true\">\n <i class={props.busy ? \"ti ti-loader-2 k2b-spin\" : (props.icon ?? \"ti ti-cloud-upload\")} />\n </span>\n <span class=\"k2b-dropzone__copy\">\n <strong>{title()}</strong>\n <Show\n when={dragState() === \"invalid\"}\n fallback={\n <Show when={props.subtitle}>\n <span class=\"k2b-dropzone__subtitle\">{props.subtitle}</span>\n </Show>\n }\n >\n <span class=\"k2b-dropzone__subtitle\">{fileInputMessages().chooseMatchingFile}</span>\n </Show>\n <Show when={props.hint}>\n <span class=\"k2b-dropzone__hint\">{props.hint}</span>\n </Show>\n </span>\n </button>\n {/* With `choose`, the zone is the only control: a native input would take a dialog's first focus and open the\n device's dialog past the chooser. */}\n <Show when={!props.choose}>\n <input\n ref={input}\n class=\"k2b-sr-only\"\n type=\"file\"\n aria-label={\n props[\"aria-label\"] ??\n (typeof props.label === \"string\"\n ? props.label\n : props.multiple === false\n ? fileInputMessages().chooseFile\n : fileInputMessages().chooseFiles)\n }\n accept={props.accept}\n multiple={props.multiple ?? true}\n disabled={disabled()}\n tabIndex={-1}\n onChange={(event) => {\n const files = Array.from(event.currentTarget.files ?? []);\n // Reset before emitting so re-picking the same file still fires change,\n // even when onDrop throws.\n event.currentTarget.value = \"\";\n emit(files);\n }}\n />\n </Show>\n </Field>\n );\n}\n\nexport type ImageInputProps = ValueFieldProps<string | null> & {\n round?: boolean;\n variant?: \"default\" | \"small\";\n transform?: (file: File) => Promise<string>;\n accept?: string;\n fallbackMarker?: string;\n};\n\nconst DEFAULT_IMAGE_ACCEPT = \"image/jpeg,image/png,image/gif,image/webp,image/svg+xml,.jpg,.jpeg,.png,.gif,.webp,.svg\";\n\nconst defaultImageTransform = async (file: File): Promise<string> => {\n const { img } = await import(\"@k2b/stdlib/browser\");\n return img.presets.avatar(file);\n};\n\nexport function ImageInput(props: ImageInputProps): JSX.Element {\n const messages = useUiMessages();\n const fileInputMessages = useFileInputMessages();\n const meta = createFieldMeta(props.id);\n const [busy, setBusy] = createSignal(false);\n const [localError, setLocalError] = createSignal<string>();\n let input: HTMLInputElement | undefined;\n const disabled = () => Boolean(props.disabled || busy() || !props.onValueChange);\n const error = () => resolveMaybeAccessor(props.error) ?? localError();\n const value = () => {\n const current = resolveMaybeAccessor(props.value);\n return current && !current.includes(props.fallbackMarker ?? \"?fallback\") ? current : null;\n };\n const compact = () => props.variant === \"small\";\n const changeLabel = () => (value() ? fileInputMessages().changeImage : fileInputMessages().addImage);\n const changeIcon = () => (value() ? \"ti ti-pencil\" : \"ti ti-photo-plus\");\n const select = async (file: File | undefined) => {\n if (!file || disabled()) return;\n setBusy(true);\n setLocalError();\n try {\n const transformed = await (props.transform ?? defaultImageTransform)(file);\n commitFieldValue(props, transformed);\n } catch (error) {\n setLocalError(error instanceof Error ? error.message : fileInputMessages().imageProcessingFailed);\n } finally {\n setBusy(false);\n if (input) input.value = \"\";\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <div\n class=\"k2b-image-input\"\n data-round={props.round ? \"true\" : undefined}\n data-variant={props.variant ?? \"default\"}\n role=\"group\"\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-label={!props.label ? props[\"aria-label\"] : undefined}\n aria-describedby={fieldControlAria(meta, { ...props, error })[\"aria-describedby\"]}\n >\n <div class=\"k2b-image-input__preview\">\n <Show when={value()} fallback={<i class=\"ti ti-photo-off\" aria-hidden=\"true\" />}>\n {(source) => <img src={source()} alt={typeof props.label === \"string\" ? props.label : fileInputMessages().selectedImage} />}\n </Show>\n </div>\n <div class=\"k2b-image-input__actions\">\n <Show\n when={compact()}\n fallback={\n <Button\n variant=\"secondary\"\n loading={busy()}\n loadingLabel={fileInputMessages().processingImage}\n disabled={disabled()}\n onClick={() => input?.click()}\n >\n <i class={changeIcon()} aria-hidden=\"true\" />\n {value() ? messages().change : messages().add}\n </Button>\n }\n >\n <IconButton\n label={changeLabel()}\n loading={busy()}\n loadingLabel={fileInputMessages().processingImage}\n disabled={disabled()}\n onClick={() => input?.click()}\n >\n <i class={changeIcon()} aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={value()}>\n <Show\n when={compact()}\n fallback={\n <Button variant=\"ghost\" disabled={disabled()} onClick={() => commitFieldValue(props, null)}>\n <i class=\"ti ti-trash\" aria-hidden=\"true\" /> Remove\n </Button>\n }\n >\n <IconButton label={fileInputMessages().removeImage} disabled={disabled()} onClick={() => commitFieldValue(props, null)}>\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n </Show>\n </div>\n <input\n ref={input}\n id={meta.controlId}\n class=\"k2b-sr-only\"\n type=\"file\"\n accept={props.accept ?? DEFAULT_IMAGE_ACCEPT}\n disabled={disabled()}\n required={props.required && !value()}\n {...fieldControlAria(meta, { ...props, error })}\n onChange={(event) => void select(event.currentTarget.files?.[0])}\n />\n </div>\n </Field>\n );\n}\n\ntype PreviewState = {\n url: string;\n objectUrl: boolean;\n sourceWidth: number;\n sourceHeight: number;\n};\n\ntype DragHandle = \"move\" | ImageCropResizeHandle;\ntype DragState = {\n handle: DragHandle;\n pointerId: number;\n startX: number;\n startY: number;\n startCrop: ImageCropRect;\n};\n\nexport type ImageCropperProps = {\n source: ImageCropSource;\n aspect?: ImageCropAspect;\n previewShape?: \"rect\" | \"circle\";\n disabled?: boolean;\n onValueChange?: (state: ImageCropState | null) => void;\n class?: string;\n};\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nconst imageElementReady = async (image: HTMLImageElement): Promise<void> => {\n if (image.complete && image.naturalWidth > 0) return;\n await new Promise<void>((resolve, reject) => {\n image.addEventListener(\"load\", () => resolve(), { once: true });\n image.addEventListener(\"error\", () => reject(new Error(\"Failed to load image.\")), { once: true });\n });\n};\n\nconst loadPreviewState = async (source: ImageCropSource): Promise<PreviewState> => {\n const sourceImage =\n source instanceof HTMLImageElement\n ? source\n : Object.assign(new Image(), {\n crossOrigin: source instanceof Blob ? undefined : \"anonymous\",\n src:\n source instanceof HTMLCanvasElement\n ? source.toDataURL(\"image/png\")\n : source instanceof Blob\n ? URL.createObjectURL(source)\n : source,\n });\n\n try {\n await imageElementReady(sourceImage);\n return {\n url: source instanceof HTMLImageElement ? source.currentSrc || source.src : sourceImage.src,\n objectUrl: source instanceof Blob,\n sourceWidth: sourceImage.naturalWidth || sourceImage.width,\n sourceHeight: sourceImage.naturalHeight || sourceImage.height,\n };\n } catch (error) {\n if (source instanceof Blob) URL.revokeObjectURL(sourceImage.src);\n throw error;\n }\n};\n\nexport function ImageCropper(props: ImageCropperProps): JSX.Element {\n const fileInputMessages = useFileInputMessages();\n let frame: HTMLDivElement | undefined;\n let activePreview: PreviewState | null = null;\n const aspect = () => props.aspect ?? \"free\";\n const previewShape = () => props.previewShape ?? \"rect\";\n const disabled = () => props.disabled ?? false;\n const [preview, setPreview] = createSignal<PreviewState | null>(null);\n const [crop, setCrop] = createSignal<ImageCropRect | null>(null);\n const [rotation, setRotation] = createSignal<ImageCropRotation>(0);\n const [loading, setLoading] = createSignal(true);\n const [error, setError] = createSignal<string | null>(null);\n const [drag, setDrag] = createSignal<DragState | null>(null);\n\n const previewSize = (): { width: number; height: number } | null => {\n const currentPreview = preview();\n if (!currentPreview) return null;\n const swapsDimensions = rotation() === 90 || rotation() === 270;\n return {\n width: swapsDimensions ? currentPreview.sourceHeight : currentPreview.sourceWidth,\n height: swapsDimensions ? currentPreview.sourceWidth : currentPreview.sourceHeight,\n };\n };\n\n const replacePreview = (next: PreviewState | null) => {\n if (activePreview?.objectUrl) URL.revokeObjectURL(activePreview.url);\n activePreview = next;\n setPreview(next);\n };\n\n onCleanup(() => {\n if (activePreview?.objectUrl) URL.revokeObjectURL(activePreview.url);\n });\n\n createEffect(() => {\n props.source;\n setRotation(0);\n setCrop(null);\n });\n\n createEffect(() => {\n const source = props.source;\n let disposed = false;\n replacePreview(null);\n setLoading(true);\n setError(null);\n\n void (async () => {\n try {\n const nextPreview = await loadPreviewState(source);\n if (disposed) {\n if (nextPreview.objectUrl) URL.revokeObjectURL(nextPreview.url);\n return;\n }\n replacePreview(nextPreview);\n } catch {\n if (disposed) return;\n replacePreview(null);\n setCrop(null);\n setError(fileInputMessages().failedLoadImage);\n } finally {\n if (!disposed) setLoading(false);\n }\n })();\n\n onCleanup(() => {\n disposed = true;\n });\n });\n\n createEffect(() => {\n const currentSize = previewSize();\n const currentAspect = aspect();\n if (!currentSize) return;\n setCrop((current) => clampImageCropRect(current ?? getInitialImageCropRect(currentSize, currentAspect), currentSize, currentAspect));\n });\n\n createEffect(() => {\n const currentCrop = crop();\n const currentPreview = preview();\n props.onValueChange?.(currentCrop && currentPreview ? { crop: currentCrop, rotation: rotation() } : null);\n });\n\n const readPointerPosition = (event: PointerEvent) => {\n if (!frame) return { x: 0, y: 0 };\n const rect = frame.getBoundingClientRect();\n return {\n x: (event.clientX - rect.left) / Math.max(1, rect.width),\n y: (event.clientY - rect.top) / Math.max(1, rect.height),\n };\n };\n\n const moveCrop = (event: PointerEvent) => {\n const state = drag();\n const currentSize = previewSize();\n if (!state || !currentSize || state.pointerId !== event.pointerId) return;\n event.preventDefault();\n const point = readPointerPosition(event);\n const dx = point.x - state.startX;\n const dy = point.y - state.startY;\n const start = state.startCrop;\n\n if (state.handle === \"move\") {\n setCrop(\n clampImageCropRect(\n {\n ...start,\n x: start.x + dx,\n y: start.y + dy,\n },\n currentSize,\n aspect(),\n ),\n );\n return;\n }\n\n setCrop(resizeImageCropFromCorner(start, currentSize, aspect(), state.handle, dx, dy));\n };\n\n let releaseTextSelection: (() => void) | undefined;\n const endDrag = (event: PointerEvent) => {\n const state = drag();\n if (!state || state.pointerId !== event.pointerId) return;\n window.removeEventListener(\"pointermove\", moveCrop);\n window.removeEventListener(\"pointerup\", endDrag);\n window.removeEventListener(\"pointercancel\", endDrag);\n releaseTextSelection?.();\n setDrag(null);\n };\n\n const startDrag = (handle: DragHandle, event: PointerEvent) => {\n const currentCrop = crop();\n if (!currentCrop || disabled() || event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n (event.currentTarget as Element).setPointerCapture?.(event.pointerId);\n releaseTextSelection = suppressTextSelection(event.pointerId);\n const point = readPointerPosition(event);\n setDrag({\n handle,\n pointerId: event.pointerId,\n startX: point.x,\n startY: point.y,\n startCrop: currentCrop,\n });\n window.addEventListener(\"pointermove\", moveCrop);\n window.addEventListener(\"pointerup\", endDrag);\n window.addEventListener(\"pointercancel\", endDrag);\n };\n\n onCleanup(() => {\n if (typeof window === \"undefined\") return;\n window.removeEventListener(\"pointermove\", moveCrop);\n window.removeEventListener(\"pointerup\", endDrag);\n window.removeEventListener(\"pointercancel\", endDrag);\n releaseTextSelection?.();\n });\n\n const rotateRight = () => {\n if (disabled()) return;\n setRotation((current) => rotateImageCropRight(current));\n };\n\n const nudgeCrop = (handle: DragHandle, event: KeyboardEvent) => {\n if (disabled() || ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return;\n const current = crop();\n const currentSize = previewSize();\n if (!current || !currentSize) return;\n event.preventDefault();\n const step = event.shiftKey ? 0.05 : 0.01;\n const dx = event.key === \"ArrowLeft\" ? -step : event.key === \"ArrowRight\" ? step : 0;\n const dy = event.key === \"ArrowUp\" ? -step : event.key === \"ArrowDown\" ? step : 0;\n setCrop(\n handle === \"move\"\n ? clampImageCropRect({ ...current, x: current.x + dx, y: current.y + dy }, currentSize, aspect())\n : resizeImageCropFromCorner(current, currentSize, aspect(), handle, dx, dy),\n );\n };\n\n const previewFrameStyle = (): JSX.CSSProperties => {\n const currentSize = previewSize();\n if (!currentSize) return {};\n return {\n \"aspect-ratio\": `${currentSize.width} / ${currentSize.height}`,\n \"max-width\": `min(100%, calc(min(58vh, 24rem) * ${currentSize.width} / ${currentSize.height}))`,\n };\n };\n\n const previewImageStyle = (): JSX.CSSProperties => {\n const currentPreview = preview();\n const currentSize = previewSize();\n if (!currentPreview || !currentSize) return {};\n const swapsDimensions = rotation() === 90 || rotation() === 270;\n return {\n left: \"50%\",\n top: \"50%\",\n width: swapsDimensions ? `${(currentPreview.sourceWidth / currentSize.width) * 100}%` : \"100%\",\n height: swapsDimensions ? `${(currentPreview.sourceHeight / currentSize.height) * 100}%` : \"100%\",\n \"max-width\": \"none\",\n \"object-fit\": \"fill\",\n transform: `translate(-50%, -50%) rotate(${rotation()}deg)`,\n };\n };\n\n const cropStyle = (): JSX.CSSProperties => {\n const currentCrop = crop();\n if (!currentCrop) return {};\n return {\n left: `${currentCrop.x * 100}%`,\n top: `${currentCrop.y * 100}%`,\n width: `${currentCrop.width * 100}%`,\n height: `${currentCrop.height * 100}%`,\n \"box-shadow\": \"0 0 0 9999px rgba(0,0,0,.42)\",\n };\n };\n\n const showResizeHandles = () => previewShape() !== \"circle\";\n\n return (\n <div class={`k2b-image-cropper ${props.class ?? \"\"}`}>\n <div class=\"k2b-image-cropper__stage\">\n <Show when={!loading()} fallback={<small>{fileInputMessages().preparingImage}</small>}>\n <Show when={!error()} fallback={<small class=\"k2b-image-cropper__error\">{error()}</small>}>\n <Show when={preview() && crop()}>\n <div ref={frame} class=\"k2b-image-cropper__frame\" style={previewFrameStyle()}>\n <img src={preview()!.url} alt={fileInputMessages().cropPreview} draggable={false} style={previewImageStyle()} />\n <div\n class=\"k2b-image-cropper__selection\"\n data-shape={previewShape()}\n style={cropStyle()}\n role=\"group\"\n tabIndex={disabled() ? undefined : 0}\n aria-label={fileInputMessages().cropArea}\n onPointerDown={(event) => startDrag(\"move\", event)}\n onKeyDown={(event) => nudgeCrop(\"move\", event)}\n >\n <Show when={showResizeHandles()}>\n <For each={[\"nw\", \"ne\", \"sw\", \"se\"] as const}>\n {(handle) => (\n <button\n type=\"button\"\n class=\"k2b-image-cropper__handle\"\n data-handle={handle}\n aria-label={fileInputMessages().resizeCrop({ handle })}\n disabled={disabled()}\n onPointerDown={(event) => startDrag(handle, event)}\n onKeyDown={(event) => nudgeCrop(handle, event)}\n />\n )}\n </For>\n </Show>\n </div>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-image-cropper__rotate\"\n content={fileInputMessages().rotateRight}\n aria-label={fileInputMessages().rotateRight}\n disabled={disabled() || !crop() || Boolean(error())}\n onClick={rotateRight}\n >\n <i class=\"ti ti-rotate-clockwise\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </div>\n </Show>\n </Show>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/FileInputs.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, mergeProps, onCleanup, onMount, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { labelledFileDropTarget } from \"./FileDropTarget\";\nimport type { FieldProps, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { fileDropEngine, liveDocument } from \"./file-drop\";\nimport { useFileDropMessages } from \"./file-drop-messages\";\nimport { useFileInputMessages } from \"./file-input-messages\";\nimport {\n clampImageCropRect,\n getInitialImageCropRect,\n type ImageCropAspect,\n type ImageCropRect,\n type ImageCropResizeHandle,\n type ImageCropRotation,\n type ImageCropSource,\n type ImageCropState,\n resizeImageCropFromCorner,\n rotateImageCropRight,\n} from \"./image-crop\";\n\nexport type FileDropzoneProps = FieldProps & {\n accept?: string;\n multiple?: boolean;\n busy?: boolean;\n /** Full icon class list, for example `\"ti ti-photo-plus\"`. Defaults to `\"ti ti-cloud-upload\"`. */\n icon?: string;\n title?: JSX.Element;\n subtitle?: JSX.Element;\n hint?: JSX.Element;\n /** One sentence that says what dropping does, shown while files are over the zone. Defaults to \"Drop to upload\". */\n dropLabel?: string;\n /**\n * Chooses files when the zone is clicked, instead of the device's file dialog, for example to offer other sources as\n * well. Called within the click, so it may still open the device's dialog; resolve `[]` when the user cancels. A\n * rejection shows its message as the field's error.\n */\n choose?: () => Promise<readonly File[]>;\n onDrop: (files: File[]) => void | Promise<void>;\n};\n\nexport function FileDropzone(props: FileDropzoneProps): JSX.Element {\n const fileInputMessages = useFileInputMessages();\n const fileDropMessages = useFileDropMessages();\n const meta = createFieldMeta(props.id);\n const disabled = () => Boolean(props.disabled || props.busy);\n const [chooseError, setChooseError] = createSignal<string>();\n const error = () => resolveMaybeAccessor(props.error) ?? chooseError();\n let input: HTMLInputElement | undefined;\n const [button, setButton] = createSignal<HTMLButtonElement>();\n const emit = (files: File[]) => {\n if (disabled() || files.length === 0) return;\n setChooseError();\n void props.onDrop(props.multiple === false ? files.slice(0, 1) : files);\n };\n const choose = (chooseFiles: () => Promise<readonly File[]>) => {\n setChooseError();\n chooseFiles().then(\n (files) => emit([...files]),\n (cause: unknown) => setChooseError(cause instanceof Error && cause.message ? cause.message : fileInputMessages().failedLoadFiles),\n );\n };\n // Drops take the same path as every other file drop target: files only, the most specific target wins, and files\n // that do not fit `accept` are left out with a message.\n const dropLabel = () => props.dropLabel ?? fileInputMessages().dropToUpload;\n const dropRef = labelledFileDropTarget({\n get label() {\n return dropLabel();\n },\n get accept() {\n return props.accept;\n },\n get multiple() {\n return props.multiple;\n },\n get disabled() {\n return disabled();\n },\n onDrop: emit,\n });\n const [engine, setEngine] = createSignal<ReturnType<typeof fileDropEngine>>();\n onMount(() => {\n const element = button();\n if (element) setEngine(fileDropEngine(liveDocument(element)));\n });\n const dragState = createMemo(() => {\n const element = button();\n const hover = engine()?.session()?.hover;\n if (!hover || hover.element !== element) return undefined;\n return hover.invalid ? \"invalid\" : \"over\";\n });\n const title = () =>\n props.busy\n ? fileInputMessages().uploading\n : dragState() === \"invalid\"\n ? fileDropMessages().fileTypeNotAccepted\n : dragState() === \"over\"\n ? dropLabel()\n : (props.title ?? fileInputMessages().dropFiles);\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <button\n id={meta.controlId}\n type=\"button\"\n ref={(element) => {\n setButton(element);\n dropRef(element);\n }}\n class=\"k2b-dropzone\"\n data-invalid={error() ? \"true\" : undefined}\n disabled={disabled()}\n {...fieldControlAria(meta, mergeProps(props, { error }))}\n onClick={() => {\n if (props.choose) choose(props.choose);\n else input?.click();\n }}\n >\n <span class=\"k2b-dropzone__icon\" aria-hidden=\"true\">\n <i class={props.busy ? \"ti ti-loader-2 k2b-spin\" : (props.icon ?? \"ti ti-cloud-upload\")} />\n </span>\n <span class=\"k2b-dropzone__copy\">\n <strong>{title()}</strong>\n <Show\n when={dragState() === \"invalid\"}\n fallback={\n <Show when={props.subtitle}>\n <span class=\"k2b-dropzone__subtitle\">{props.subtitle}</span>\n </Show>\n }\n >\n <span class=\"k2b-dropzone__subtitle\">{fileInputMessages().chooseMatchingFile}</span>\n </Show>\n <Show when={props.hint}>\n <span class=\"k2b-dropzone__hint\">{props.hint}</span>\n </Show>\n </span>\n </button>\n {/* With `choose`, the zone is the only control: a native input would take a dialog's first focus and open the\n device's dialog past the chooser. */}\n <Show when={!props.choose}>\n <input\n ref={input}\n class=\"k2b-sr-only\"\n type=\"file\"\n aria-label={\n props[\"aria-label\"] ??\n (typeof props.label === \"string\"\n ? props.label\n : props.multiple === false\n ? fileInputMessages().chooseFile\n : fileInputMessages().chooseFiles)\n }\n accept={props.accept}\n multiple={props.multiple ?? true}\n disabled={disabled()}\n tabIndex={-1}\n onChange={(event) => {\n const files = Array.from(event.currentTarget.files ?? []);\n // Reset before emitting so re-picking the same file still fires change,\n // even when onDrop throws.\n event.currentTarget.value = \"\";\n emit(files);\n }}\n />\n </Show>\n </Field>\n );\n}\n\nexport type ImageInputProps = ValueFieldProps<string | null> & {\n round?: boolean;\n variant?: \"default\" | \"small\";\n transform?: (file: File) => Promise<string>;\n accept?: string;\n fallbackMarker?: string;\n};\n\nconst DEFAULT_IMAGE_ACCEPT = \"image/jpeg,image/png,image/gif,image/webp,image/svg+xml,.jpg,.jpeg,.png,.gif,.webp,.svg\";\n\nconst defaultImageTransform = async (file: File): Promise<string> => {\n const { img } = await import(\"@k2b/stdlib/browser\");\n return img.presets.avatar(file);\n};\n\nexport function ImageInput(props: ImageInputProps): JSX.Element {\n const messages = useUiMessages();\n const fileInputMessages = useFileInputMessages();\n const meta = createFieldMeta(props.id);\n const [busy, setBusy] = createSignal(false);\n const [localError, setLocalError] = createSignal<string>();\n let input: HTMLInputElement | undefined;\n const disabled = () => Boolean(props.disabled || busy() || !props.onValueChange);\n const error = () => resolveMaybeAccessor(props.error) ?? localError();\n const value = () => {\n const current = resolveMaybeAccessor(props.value);\n return current && !current.includes(props.fallbackMarker ?? \"?fallback\") ? current : null;\n };\n const compact = () => props.variant === \"small\";\n const changeLabel = () => (value() ? fileInputMessages().changeImage : fileInputMessages().addImage);\n const changeIcon = () => (value() ? \"ti ti-pencil\" : \"ti ti-photo-plus\");\n const select = async (file: File | undefined) => {\n if (!file || disabled()) return;\n setBusy(true);\n setLocalError();\n try {\n const transformed = await (props.transform ?? defaultImageTransform)(file);\n commitFieldValue(props, transformed);\n } catch (error) {\n setLocalError(error instanceof Error ? error.message : fileInputMessages().imageProcessingFailed);\n } finally {\n setBusy(false);\n if (input) input.value = \"\";\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <div\n class=\"k2b-image-input\"\n data-round={props.round ? \"true\" : undefined}\n data-variant={props.variant ?? \"default\"}\n role=\"group\"\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-label={!props.label ? props[\"aria-label\"] : undefined}\n aria-describedby={fieldControlAria(meta, { ...props, error })[\"aria-describedby\"]}\n >\n <div class=\"k2b-image-input__preview\">\n <Show when={value()} fallback={<i class=\"ti ti-photo-off\" aria-hidden=\"true\" />}>\n {(source) => <img src={source()} alt={typeof props.label === \"string\" ? props.label : fileInputMessages().selectedImage} />}\n </Show>\n </div>\n <div class=\"k2b-image-input__actions\">\n <Show\n when={compact()}\n fallback={\n <Button\n variant=\"secondary\"\n loading={busy()}\n loadingLabel={fileInputMessages().processingImage}\n disabled={disabled()}\n onClick={() => input?.click()}\n >\n <i class={changeIcon()} aria-hidden=\"true\" />\n {value() ? messages().change : messages().add}\n </Button>\n }\n >\n <IconButton\n label={changeLabel()}\n loading={busy()}\n loadingLabel={fileInputMessages().processingImage}\n disabled={disabled()}\n onClick={() => input?.click()}\n >\n <i class={changeIcon()} aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={value()}>\n <Show\n when={compact()}\n fallback={\n <Button variant=\"ghost\" disabled={disabled()} onClick={() => commitFieldValue(props, null)}>\n <i class=\"ti ti-trash\" aria-hidden=\"true\" /> Remove\n </Button>\n }\n >\n <IconButton label={fileInputMessages().removeImage} disabled={disabled()} onClick={() => commitFieldValue(props, null)}>\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n </Show>\n </div>\n <input\n ref={input}\n id={meta.controlId}\n class=\"k2b-sr-only\"\n type=\"file\"\n accept={props.accept ?? DEFAULT_IMAGE_ACCEPT}\n disabled={disabled()}\n required={props.required && !value()}\n {...fieldControlAria(meta, { ...props, error })}\n onChange={(event) => void select(event.currentTarget.files?.[0])}\n />\n </div>\n </Field>\n );\n}\n\ntype PreviewState = {\n url: string;\n objectUrl: boolean;\n sourceWidth: number;\n sourceHeight: number;\n};\n\ntype DragHandle = \"move\" | ImageCropResizeHandle;\ntype DragState = {\n handle: DragHandle;\n pointerId: number;\n startX: number;\n startY: number;\n startCrop: ImageCropRect;\n};\n\nexport type ImageCropperProps = {\n source: ImageCropSource;\n aspect?: ImageCropAspect;\n previewShape?: \"rect\" | \"circle\";\n disabled?: boolean;\n onValueChange?: (state: ImageCropState | null) => void;\n class?: string;\n};\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nconst imageElementReady = async (image: HTMLImageElement): Promise<void> => {\n if (image.complete && image.naturalWidth > 0) return;\n await new Promise<void>((resolve, reject) => {\n image.addEventListener(\"load\", () => resolve(), { once: true });\n image.addEventListener(\"error\", () => reject(new Error(\"Failed to load image.\")), { once: true });\n });\n};\n\nconst loadPreviewState = async (source: ImageCropSource): Promise<PreviewState> => {\n const sourceImage =\n source instanceof HTMLImageElement\n ? source\n : Object.assign(new Image(), {\n crossOrigin: source instanceof Blob ? undefined : \"anonymous\",\n src:\n source instanceof HTMLCanvasElement\n ? source.toDataURL(\"image/png\")\n : source instanceof Blob\n ? URL.createObjectURL(source)\n : source,\n });\n\n try {\n await imageElementReady(sourceImage);\n return {\n url: source instanceof HTMLImageElement ? source.currentSrc || source.src : sourceImage.src,\n objectUrl: source instanceof Blob,\n sourceWidth: sourceImage.naturalWidth || sourceImage.width,\n sourceHeight: sourceImage.naturalHeight || sourceImage.height,\n };\n } catch (error) {\n if (source instanceof Blob) URL.revokeObjectURL(sourceImage.src);\n throw error;\n }\n};\n\nexport function ImageCropper(props: ImageCropperProps): JSX.Element {\n const fileInputMessages = useFileInputMessages();\n let frame: HTMLDivElement | undefined;\n let activePreview: PreviewState | null = null;\n const aspect = () => props.aspect ?? \"free\";\n const previewShape = () => props.previewShape ?? \"rect\";\n const disabled = () => props.disabled ?? false;\n const [preview, setPreview] = createSignal<PreviewState | null>(null);\n const [crop, setCrop] = createSignal<ImageCropRect | null>(null);\n const [rotation, setRotation] = createSignal<ImageCropRotation>(0);\n const [loading, setLoading] = createSignal(true);\n const [error, setError] = createSignal<string | null>(null);\n const [drag, setDrag] = createSignal<DragState | null>(null);\n\n const previewSize = (): { width: number; height: number } | null => {\n const currentPreview = preview();\n if (!currentPreview) return null;\n const swapsDimensions = rotation() === 90 || rotation() === 270;\n return {\n width: swapsDimensions ? currentPreview.sourceHeight : currentPreview.sourceWidth,\n height: swapsDimensions ? currentPreview.sourceWidth : currentPreview.sourceHeight,\n };\n };\n\n const replacePreview = (next: PreviewState | null) => {\n if (activePreview?.objectUrl) URL.revokeObjectURL(activePreview.url);\n activePreview = next;\n setPreview(next);\n };\n\n onCleanup(() => {\n if (activePreview?.objectUrl) URL.revokeObjectURL(activePreview.url);\n });\n\n createEffect(() => {\n props.source;\n setRotation(0);\n setCrop(null);\n });\n\n createEffect(() => {\n const source = props.source;\n let disposed = false;\n replacePreview(null);\n setLoading(true);\n setError(null);\n\n void (async () => {\n try {\n const nextPreview = await loadPreviewState(source);\n if (disposed) {\n if (nextPreview.objectUrl) URL.revokeObjectURL(nextPreview.url);\n return;\n }\n replacePreview(nextPreview);\n } catch {\n if (disposed) return;\n replacePreview(null);\n setCrop(null);\n setError(fileInputMessages().failedLoadImage);\n } finally {\n if (!disposed) setLoading(false);\n }\n })();\n\n onCleanup(() => {\n disposed = true;\n });\n });\n\n createEffect(() => {\n const currentSize = previewSize();\n const currentAspect = aspect();\n if (!currentSize) return;\n setCrop((current) => clampImageCropRect(current ?? getInitialImageCropRect(currentSize, currentAspect), currentSize, currentAspect));\n });\n\n createEffect(() => {\n const currentCrop = crop();\n const currentPreview = preview();\n props.onValueChange?.(currentCrop && currentPreview ? { crop: currentCrop, rotation: rotation() } : null);\n });\n\n const readPointerPosition = (event: PointerEvent) => {\n if (!frame) return { x: 0, y: 0 };\n const rect = frame.getBoundingClientRect();\n return {\n x: (event.clientX - rect.left) / Math.max(1, rect.width),\n y: (event.clientY - rect.top) / Math.max(1, rect.height),\n };\n };\n\n const moveCrop = (event: PointerEvent) => {\n const state = drag();\n const currentSize = previewSize();\n if (!state || !currentSize || state.pointerId !== event.pointerId) return;\n event.preventDefault();\n const point = readPointerPosition(event);\n const dx = point.x - state.startX;\n const dy = point.y - state.startY;\n const start = state.startCrop;\n\n if (state.handle === \"move\") {\n setCrop(\n clampImageCropRect(\n {\n ...start,\n x: start.x + dx,\n y: start.y + dy,\n },\n currentSize,\n aspect(),\n ),\n );\n return;\n }\n\n setCrop(resizeImageCropFromCorner(start, currentSize, aspect(), state.handle, dx, dy));\n };\n\n let releaseTextSelection: (() => void) | undefined;\n const endDrag = (event: PointerEvent) => {\n const state = drag();\n if (!state || state.pointerId !== event.pointerId) return;\n window.removeEventListener(\"pointermove\", moveCrop);\n window.removeEventListener(\"pointerup\", endDrag);\n window.removeEventListener(\"pointercancel\", endDrag);\n releaseTextSelection?.();\n setDrag(null);\n };\n\n const startDrag = (handle: DragHandle, event: PointerEvent) => {\n const currentCrop = crop();\n if (!currentCrop || disabled() || event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n (event.currentTarget as Element).setPointerCapture?.(event.pointerId);\n releaseTextSelection = suppressTextSelection(event.pointerId);\n const point = readPointerPosition(event);\n setDrag({\n handle,\n pointerId: event.pointerId,\n startX: point.x,\n startY: point.y,\n startCrop: currentCrop,\n });\n window.addEventListener(\"pointermove\", moveCrop);\n window.addEventListener(\"pointerup\", endDrag);\n window.addEventListener(\"pointercancel\", endDrag);\n };\n\n onCleanup(() => {\n if (typeof window === \"undefined\") return;\n window.removeEventListener(\"pointermove\", moveCrop);\n window.removeEventListener(\"pointerup\", endDrag);\n window.removeEventListener(\"pointercancel\", endDrag);\n releaseTextSelection?.();\n });\n\n const rotateRight = () => {\n if (disabled()) return;\n setRotation((current) => rotateImageCropRight(current));\n };\n\n const nudgeCrop = (handle: DragHandle, event: KeyboardEvent) => {\n if (disabled() || ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return;\n const current = crop();\n const currentSize = previewSize();\n if (!current || !currentSize) return;\n event.preventDefault();\n const step = event.shiftKey ? 0.05 : 0.01;\n const dx = event.key === \"ArrowLeft\" ? -step : event.key === \"ArrowRight\" ? step : 0;\n const dy = event.key === \"ArrowUp\" ? -step : event.key === \"ArrowDown\" ? step : 0;\n setCrop(\n handle === \"move\"\n ? clampImageCropRect({ ...current, x: current.x + dx, y: current.y + dy }, currentSize, aspect())\n : resizeImageCropFromCorner(current, currentSize, aspect(), handle, dx, dy),\n );\n };\n\n const previewFrameStyle = (): JSX.CSSProperties => {\n const currentSize = previewSize();\n if (!currentSize) return {};\n return {\n \"aspect-ratio\": `${currentSize.width} / ${currentSize.height}`,\n \"max-width\": `min(100%, calc(min(58vh, 24rem) * ${currentSize.width} / ${currentSize.height}))`,\n };\n };\n\n const previewImageStyle = (): JSX.CSSProperties => {\n const currentPreview = preview();\n const currentSize = previewSize();\n if (!currentPreview || !currentSize) return {};\n const swapsDimensions = rotation() === 90 || rotation() === 270;\n return {\n left: \"50%\",\n top: \"50%\",\n width: swapsDimensions ? `${(currentPreview.sourceWidth / currentSize.width) * 100}%` : \"100%\",\n height: swapsDimensions ? `${(currentPreview.sourceHeight / currentSize.height) * 100}%` : \"100%\",\n \"max-width\": \"none\",\n \"object-fit\": \"fill\",\n transform: `translate(-50%, -50%) rotate(${rotation()}deg)`,\n };\n };\n\n const cropStyle = (): JSX.CSSProperties => {\n const currentCrop = crop();\n if (!currentCrop) return {};\n return {\n left: `${currentCrop.x * 100}%`,\n top: `${currentCrop.y * 100}%`,\n width: `${currentCrop.width * 100}%`,\n height: `${currentCrop.height * 100}%`,\n \"box-shadow\": \"0 0 0 9999px rgba(0,0,0,.42)\",\n };\n };\n\n const showResizeHandles = () => previewShape() !== \"circle\";\n\n return (\n <div class={`k2b-image-cropper ${props.class ?? \"\"}`}>\n <div class=\"k2b-image-cropper__stage\">\n <Show when={!loading()} fallback={<small>{fileInputMessages().preparingImage}</small>}>\n <Show when={!error()} fallback={<small class=\"k2b-image-cropper__error\">{error()}</small>}>\n <Show when={preview() && crop()}>\n <div ref={frame} class=\"k2b-image-cropper__frame\" style={previewFrameStyle()}>\n <img src={preview()!.url} alt={fileInputMessages().cropPreview} draggable={false} style={previewImageStyle()} />\n <div\n class=\"k2b-image-cropper__selection\"\n data-shape={previewShape()}\n style={cropStyle()}\n role=\"group\"\n tabIndex={disabled() ? undefined : 0}\n aria-label={fileInputMessages().cropArea}\n onPointerDown={(event) => startDrag(\"move\", event)}\n onKeyDown={(event) => nudgeCrop(\"move\", event)}\n >\n <Show when={showResizeHandles()}>\n <For each={[\"nw\", \"ne\", \"sw\", \"se\"] as const}>\n {(handle) => (\n <button\n type=\"button\"\n class=\"k2b-image-cropper__handle\"\n data-handle={handle}\n aria-label={fileInputMessages().resizeCrop({ handle })}\n disabled={disabled()}\n onPointerDown={(event) => startDrag(handle, event)}\n onKeyDown={(event) => nudgeCrop(handle, event)}\n />\n )}\n </For>\n </Show>\n </div>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-image-cropper__rotate\"\n content={fileInputMessages().rotateRight}\n aria-label={fileInputMessages().rotateRight}\n disabled={disabled() || !crop() || Boolean(error())}\n onClick={rotateRight}\n >\n <i class=\"ti ti-rotate-clockwise\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </div>\n </Show>\n </Show>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -75,6 +75,15 @@ export function SelectChip(props) {
|
|
|
75
75
|
},
|
|
76
76
|
get children() {
|
|
77
77
|
return [_$createComponent(Dropdown.Root, {
|
|
78
|
+
get open() {
|
|
79
|
+
return _$memo(() => props.open === undefined)() ? undefined : _$memo(() => !!props.open)() && !disabled();
|
|
80
|
+
},
|
|
81
|
+
get onOpenChange() {
|
|
82
|
+
return props.onOpenChange;
|
|
83
|
+
},
|
|
84
|
+
get disabled() {
|
|
85
|
+
return disabled();
|
|
86
|
+
},
|
|
78
87
|
get position() {
|
|
79
88
|
return props.position ?? "bottom-right";
|
|
80
89
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createComputed, createEffect, createMemo, type JSX, on, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectChipOption<T extends string | number = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n image?: string;\n disabled?: boolean;\n};\n\nexport type SelectChipProps<T extends string | number = string> = ValueFieldProps<T> & {\n value: MaybeAccessor<T>;\n options: SelectChipOption<T>[];\n icon?: string;\n iconOnly?: boolean;\n size?: ButtonSize;\n placeholder?: string;\n position?: DropdownPosition;\n /** Exact menu width as a CSS length. Without it the menu sizes to its options, at least `10rem`. */\n menuWidth?: string;\n name?: string;\n /** Shows that a change from this chip is saving: the chip stays in place with\n * its size, cannot be opened, is marked busy, and shows a spinner where its\n * chevron (or, icon-only, its icon) is. */\n loading?: boolean;\n};\n\nexport function SelectChip<T extends string | number = string>(props: SelectChipProps<T>): JSX.Element {\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value)!;\n const selected = () => props.options.find((option) => option.value === value());\n const disabled = createMemo(() => Boolean(props.disabled || props.loading));\n // A disabled button loses focus, so a chip disabled while a change saves (its own or one elsewhere) would leave\n // keyboard focus on the page. Focus returns to the chip once it is enabled again, unless it has moved on\n // meanwhile. The check runs as a computation, before the DOM update disables the button.\n let trigger: HTMLButtonElement | undefined;\n let refocus = false;\n createComputed(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled) refocus = trigger !== undefined && document.activeElement === trigger;\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled || !refocus) return;\n refocus = false;\n const active = document.activeElement;\n if (trigger?.isConnected && (active === null || active === document.body)) trigger.focus();\n },\n { defer: true },\n ),\n );\n const triggerLabel = () => props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : selectMessages().chooseOption);\n const items = createMemo<DropdownItem[]>(() =>\n props.options.map((option) => ({\n action: () => commitFieldValue(props, option.value),\n checked: () => option.value === value(),\n choice: \"radio\" as const,\n class: \"k2b-select-chip__option\",\n description: option.description,\n disabled: option.disabled,\n icon: option.icon,\n image: option.image,\n label: option.label,\n })),\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <Dropdown.Root\n position={props.position ?? \"bottom-right\"}\n /* Cloud opens this menu at `w-40`; the stylesheet keeps that as its floor. */\n width={props.menuWidth}\n menuClass=\"k2b-select-chip__menu\"\n label={triggerLabel()}\n items={items()}\n >\n <Dropdown.Trigger\n appearance={props.iconOnly ? \"button\" : \"plain\"}\n id={meta.controlId}\n ref={(element: HTMLButtonElement) => {\n trigger = element;\n }}\n class={props.iconOnly ? undefined : \"k2b-select-chip\"}\n disabled={disabled()}\n aria-busy={props.loading ? \"true\" : undefined}\n iconOnly={props.iconOnly}\n loading={props.iconOnly ? props.loading : undefined}\n label={triggerLabel()}\n size={props.iconOnly ? props.size : undefined}\n title={props.iconOnly ? triggerLabel() : undefined}\n {...fieldControlAria(meta, props)}\n >\n <Show\n when={selected()?.image}\n fallback={<Show when={selected()?.icon ?? props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(image) => <img src={image()} alt=\"\" />}\n </Show>\n <Show when={!props.iconOnly}>\n <span data-placeholder={selected() ? undefined : \"true\"}>{selected()?.label ?? props.placeholder ?? \"\"}</span>\n {/* Both glyphs are one icon wide, so a saving chip keeps its size. */}\n <i class={props.loading ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value()} />}</Show>\n </Field>\n );\n}\n\nexport default SelectChip;\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,cAAc,EAAE,YAAY,EAAE,UAAU,EAAY,EAAE,EAAE,IAAI,QAAQ,UAAU;AAEvF,SAAS,QAAQ,QAAkD,qBAAqB;AACxF,SAAS,eAAe,EAAE,KAAK,EAAE,gBAAgB,QAAQ,mBAAmB;AAE5E,SAAS,gBAAgB,EAAE,oBAAoB,QAAQ,kBAAkB;AACzE,SAAS,iBAAiB,QAAQ,mBAAmB;
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createComputed, createEffect, createMemo, type JSX, on, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectChipOption<T extends string | number = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n image?: string;\n disabled?: boolean;\n};\n\nexport type SelectChipProps<T extends string | number = string> = ValueFieldProps<T> & {\n value: MaybeAccessor<T>;\n options: SelectChipOption<T>[];\n icon?: string;\n iconOnly?: boolean;\n size?: ButtonSize;\n placeholder?: string;\n position?: DropdownPosition;\n /** Exact menu width as a CSS length. Without it the menu sizes to its options, at least `10rem`. */\n menuWidth?: string;\n name?: string;\n /** Shows that a change from this chip is saving: the chip stays in place with\n * its size, cannot be opened, is marked busy, and shows a spinner where its\n * chevron (or, icon-only, its icon) is. */\n loading?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport function SelectChip<T extends string | number = string>(props: SelectChipProps<T>): JSX.Element {\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value)!;\n const selected = () => props.options.find((option) => option.value === value());\n const disabled = createMemo(() => Boolean(props.disabled || props.loading));\n // A disabled button loses focus, so a chip disabled while a change saves (its own or one elsewhere) would leave\n // keyboard focus on the page. Focus returns to the chip once it is enabled again, unless it has moved on\n // meanwhile. The check runs as a computation, before the DOM update disables the button.\n let trigger: HTMLButtonElement | undefined;\n let refocus = false;\n createComputed(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled) refocus = trigger !== undefined && document.activeElement === trigger;\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled || !refocus) return;\n refocus = false;\n const active = document.activeElement;\n if (trigger?.isConnected && (active === null || active === document.body)) trigger.focus();\n },\n { defer: true },\n ),\n );\n const triggerLabel = () => props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : selectMessages().chooseOption);\n const items = createMemo<DropdownItem[]>(() =>\n props.options.map((option) => ({\n action: () => commitFieldValue(props, option.value),\n checked: () => option.value === value(),\n choice: \"radio\" as const,\n class: \"k2b-select-chip__option\",\n description: option.description,\n disabled: option.disabled,\n icon: option.icon,\n image: option.image,\n label: option.label,\n })),\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <Dropdown.Root\n // A controlled `open` cannot bypass a disabled or saving chip.\n open={props.open === undefined ? undefined : props.open && !disabled()}\n onOpenChange={props.onOpenChange}\n disabled={disabled()}\n position={props.position ?? \"bottom-right\"}\n /* Cloud opens this menu at `w-40`; the stylesheet keeps that as its floor. */\n width={props.menuWidth}\n menuClass=\"k2b-select-chip__menu\"\n label={triggerLabel()}\n items={items()}\n >\n <Dropdown.Trigger\n appearance={props.iconOnly ? \"button\" : \"plain\"}\n id={meta.controlId}\n ref={(element: HTMLButtonElement) => {\n trigger = element;\n }}\n class={props.iconOnly ? undefined : \"k2b-select-chip\"}\n disabled={disabled()}\n aria-busy={props.loading ? \"true\" : undefined}\n iconOnly={props.iconOnly}\n loading={props.iconOnly ? props.loading : undefined}\n label={triggerLabel()}\n size={props.iconOnly ? props.size : undefined}\n title={props.iconOnly ? triggerLabel() : undefined}\n {...fieldControlAria(meta, props)}\n >\n <Show\n when={selected()?.image}\n fallback={<Show when={selected()?.icon ?? props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(image) => <img src={image()} alt=\"\" />}\n </Show>\n <Show when={!props.iconOnly}>\n <span data-placeholder={selected() ? undefined : \"true\"}>{selected()?.label ?? props.placeholder ?? \"\"}</span>\n {/* Both glyphs are one icon wide, so a saving chip keeps its size. */}\n <i class={props.loading ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value()} />}</Show>\n </Field>\n );\n}\n\nexport default SelectChip;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -673,6 +673,12 @@ function EmojiPickerPopover(props) {
|
|
|
673
673
|
/** An anchor pressed while the picker was open closes it; the same click must not open it again. */
|
|
674
674
|
let pressedAnchor;
|
|
675
675
|
const [shown, setShown] = createSignal();
|
|
676
|
+
let expandedAnchor;
|
|
677
|
+
let previousExpanded = null;
|
|
678
|
+
const restoreExpanded = () => {
|
|
679
|
+
if (previousExpanded === null) expandedAnchor?.removeAttribute("aria-expanded");else expandedAnchor?.setAttribute("aria-expanded", previousExpanded);
|
|
680
|
+
expandedAnchor = undefined;
|
|
681
|
+
};
|
|
676
682
|
const place = () => {
|
|
677
683
|
const anchor = shown();
|
|
678
684
|
if (!surface || !anchor) return;
|
|
@@ -708,6 +714,7 @@ function EmojiPickerPopover(props) {
|
|
|
708
714
|
if (previous?.isConnected) returnFocus(previous, ring);
|
|
709
715
|
};
|
|
710
716
|
const hide = () => {
|
|
717
|
+
restoreExpanded();
|
|
711
718
|
restoreFocus();
|
|
712
719
|
if (surface?.matches(":popover-open")) surface.hidePopover();
|
|
713
720
|
setShown(undefined);
|
|
@@ -744,6 +751,10 @@ function EmojiPickerPopover(props) {
|
|
|
744
751
|
previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
745
752
|
ring = ringOnReturn(previous ?? anchor);
|
|
746
753
|
}
|
|
754
|
+
restoreExpanded();
|
|
755
|
+
expandedAnchor = anchor;
|
|
756
|
+
previousExpanded = anchor.getAttribute("aria-expanded");
|
|
757
|
+
anchor.setAttribute("aria-expanded", "true");
|
|
747
758
|
setShown(anchor);
|
|
748
759
|
if (!surface.matches(":popover-open")) surface.showPopover();
|
|
749
760
|
place();
|
|
@@ -772,6 +783,7 @@ function EmojiPickerPopover(props) {
|
|
|
772
783
|
window.visualViewport?.removeEventListener("scroll", place);
|
|
773
784
|
document.removeEventListener("pointerdown", pressed, true);
|
|
774
785
|
document.removeEventListener("click", clicked, true);
|
|
786
|
+
restoreExpanded();
|
|
775
787
|
if (surface?.matches(":popover-open")) hide();
|
|
776
788
|
});
|
|
777
789
|
});
|
|
@@ -782,6 +794,7 @@ function EmojiPickerPopover(props) {
|
|
|
782
794
|
if (event.newState === "open") return;
|
|
783
795
|
// Light dismissal by the browser: a click outside, Escape, or another popover.
|
|
784
796
|
if (shown()) {
|
|
797
|
+
restoreExpanded();
|
|
785
798
|
setShown(undefined);
|
|
786
799
|
restoreFocus();
|
|
787
800
|
props.onClose();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/emoji/EmojiPicker.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSelector,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Button } from \"../../actions/Button\";\nimport { returnFocus, ringOnReturn } from \"../../internal/focus-return\";\nimport { useLocale } from \"../../intl/locale\";\nimport { useUiMessages } from \"../../intl/messages\";\nimport {\n EMOJI_GROUPS,\n EMOJI_SKIN_TONES,\n type EmojiEntry,\n type EmojiGroupKey,\n type EmojiIndex,\n type EmojiSkinTone,\n emojiInTone,\n emojiName,\n findEmoji,\n loadEmojiIndex,\n RECENT_EMOJI_LIMIT,\n searchEmoji,\n} from \"./emoji-index\";\nimport { type EmojiMessages, useEmojiMessages } from \"./emoji-messages\";\n\n/** Emoji per row. Keyboard navigation moves by rows of this length. */\nconst COLUMNS = 8;\n/** Search results render in blocks of this many rows, so the browser lays out only the blocks in view. */\nconst RESULT_BLOCK = 8 * COLUMNS;\nconst TONE_SAMPLE = \"✋\";\nconst TONE_SAMPLE_LIGHT = \"✋\\u{1F3FB}\";\n\nexport type EmojiPickerProps = {\n /** Called with the chosen emoji, in the chosen skin tone where it has one. */\n onPick: (emoji: string) => void;\n /** Recently used emoji, most recent first, shown as the first group. The application stores them; see `rememberEmoji`. */\n recent?: readonly string[];\n /** The skin tone for emoji that have one. Defaults to `0`, the default yellow. */\n skinTone?: EmojiSkinTone;\n /** Shows the skin-tone choice. The application stores the tone and passes it back as `skinTone`. */\n onSkinToneChange?: (tone: EmojiSkinTone) => void;\n /** Escape in an empty search field asks to close the surface the picker sits in. */\n onClose?: () => void;\n /** Moves focus into the search field once the picker is shown. */\n autofocus?: boolean;\n /** The picker's accessible name. Defaults to \"Emoji\". */\n label?: string;\n class?: string;\n};\n\ntype Section = { key: EmojiGroupKey | \"recent\"; items: readonly Item[] };\ntype Item = { emoji: string; entry?: EmojiEntry };\n\nconst groupTitle = (messages: EmojiMessages, key: Section[\"key\"]): string => {\n switch (key) {\n case \"recent\":\n return messages.emojiRecent;\n case \"smileys\":\n return messages.emojiSmileys;\n case \"people\":\n return messages.emojiPeople;\n case \"animals\":\n return messages.emojiAnimals;\n case \"food\":\n return messages.emojiFood;\n case \"travel\":\n return messages.emojiTravel;\n case \"activities\":\n return messages.emojiActivities;\n case \"objects\":\n return messages.emojiObjects;\n case \"symbols\":\n return messages.emojiSymbols;\n case \"flags\":\n return messages.emojiFlags;\n }\n};\n\nconst toneLabel = (messages: EmojiMessages, tone: EmojiSkinTone): string =>\n [\n messages.emojiToneDefault,\n messages.emojiToneLight,\n messages.emojiToneMediumLight,\n messages.emojiToneMedium,\n messages.emojiToneMediumDark,\n messages.emojiToneDark,\n ][tone]!;\n\nconst toneSample = (tone: EmojiSkinTone): string =>\n tone === 0 ? TONE_SAMPLE : TONE_SAMPLE_LIGHT.replace(\"\\u{1F3FB}\", String.fromCodePoint(0x1f3fb + tone - 1));\n\n/** Where `index` moves for an arrow key in rows of `COLUMNS`, where every section starts a new row. */\nexport const nextEmojiIndex = (\n sizes: readonly number[],\n index: number,\n key: \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\",\n): number => {\n const total = sizes.reduce((sum, size) => sum + size, 0);\n if (total === 0) return -1;\n if (index < 0) return 0;\n if (key === \"ArrowLeft\") return Math.max(0, index - 1);\n if (key === \"ArrowRight\") return Math.min(total - 1, index + 1);\n const starts: number[] = [];\n sizes.reduce((start, size) => (starts.push(start), start + size), 0);\n const section = starts.findLastIndex((start, position) => start <= index && sizes[position]! > 0);\n const offset = index - starts[section]!;\n const column = offset % COLUMNS;\n const size = sizes[section]!;\n if (key === \"ArrowUp\") {\n if (offset >= COLUMNS) return index - COLUMNS;\n for (let previous = section - 1; previous >= 0; previous--) {\n if (!sizes[previous]) continue;\n const lastRow = Math.floor((sizes[previous]! - 1) / COLUMNS) * COLUMNS;\n return starts[previous]! + Math.min(lastRow + column, sizes[previous]! - 1);\n }\n return index;\n }\n if (offset + COLUMNS < size) return index + COLUMNS;\n // A shorter last row: the last emoji of the section is below.\n if (Math.floor(offset / COLUMNS) < Math.floor((size - 1) / COLUMNS)) return starts[section]! + size - 1;\n for (let next = section + 1; next < sizes.length; next++) {\n if (sizes[next]) return starts[next]! + Math.min(column, sizes[next]! - 1);\n }\n return index;\n};\n\n/**\n * A search field, the groups, and a grid of emoji. Search finds English and German names, keywords and GitHub\n * shortcodes. The focus stays in the search field: arrow keys move through the grid, Enter picks.\n */\nfunction EmojiPickerPanel(props: EmojiPickerProps): JSX.Element {\n const messages = useUiMessages();\n const text = useEmojiMessages();\n const locale = useLocale();\n const id = `k2b-emoji-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const [index, setIndex] = createSignal<EmojiIndex>();\n const [failed, setFailed] = createSignal(false);\n const [query, setQuery] = createSignal(\"\");\n const [active, setActive] = createSignal(0);\n const isActive = createSelector(active);\n const [tonesOpen, setTonesOpen] = createSignal(false);\n const [currentGroup, setCurrentGroup] = createSignal<Section[\"key\"]>();\n /** Up or down moved into the grid; from then on, left and right move there too, until the search changes. */\n const [gridEntered, setGridEntered] = createSignal(false);\n let searchRef: HTMLInputElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let toneButtonRef: HTMLButtonElement | undefined;\n let tonesRef: HTMLDivElement | undefined;\n let groupsRef: HTMLDivElement | undefined;\n /** Keyboard moves scroll the active emoji into view; the pointer does not. */\n let revealActive = false;\n\n const load = () => {\n setFailed(false);\n loadEmojiIndex().then(setIndex, () => setFailed(true));\n };\n onMount(load);\n\n const tone = () => props.skinTone ?? 0;\n const searching = () => query().trim().length > 0;\n // The groups render once and stay while a search shows its results above them, so clearing a search is instant.\n const groups = createMemo((): readonly Section[] => {\n const data = index();\n if (!data) return [];\n const recent: Section = {\n key: \"recent\",\n items: (props.recent ?? []).slice(0, RECENT_EMOJI_LIMIT).map((emoji) => ({ emoji, entry: findEmoji(data, emoji) })),\n };\n const all = EMOJI_GROUPS.map(\n (group): Section => ({\n key: group.key,\n items: data.entries.filter((entry) => entry.group === group.id).map((entry) => ({ emoji: emojiInTone(entry, tone()), entry })),\n }),\n );\n return recent.items.length ? [recent, ...all] : all;\n });\n const groupStarts = createMemo(() => {\n const starts: number[] = [];\n groups().reduce((start, section) => (starts.push(start), start + section.items.length), 0);\n return starts;\n });\n const results = createMemo((): readonly Item[] => {\n const data = index();\n if (!data || !searching()) return [];\n return searchEmoji(data, query()).map((entry) => ({ emoji: emojiInTone(entry, tone()), entry }));\n });\n const resultBlocks = createMemo(() =>\n Array.from({ length: Math.ceil(results().length / RESULT_BLOCK) }, (_, block) =>\n results().slice(block * RESULT_BLOCK, (block + 1) * RESULT_BLOCK),\n ),\n );\n /** The sizes of the visible sections, for the arrow keys. */\n const sizes = () => (searching() ? [results().length] : groups().map((section) => section.items.length));\n const items = createMemo(() => (searching() ? results() : groups().flatMap((section) => section.items)));\n const activeItem = () => items()[active()];\n const optionId = (position: number, list = searching() ? \"r\" : \"g\") => `${id}-${list}${position}`;\n const nameOf = (item: Item) => (item.entry ? emojiName(item.entry, locale()) : item.emoji);\n /** Where an element sits in the list, from its top. */\n const offsetOf = (element: Element) =>\n element.getBoundingClientRect().top - scrollRef!.getBoundingClientRect().top + scrollRef!.scrollTop;\n\n // A new search starts at its best match; the groups at their top.\n createEffect(\n on([query, index], () => {\n setActive(0);\n if (scrollRef) scrollRef.scrollTop = 0;\n }),\n );\n\n createEffect(() => {\n const position = active();\n if (!revealActive) return;\n revealActive = false;\n const option = document.getElementById(optionId(position));\n if (!option || !scrollRef) return;\n // Sticky group titles cover the top of the list; an emoji in a first row scrolls with its title.\n const covered = option.closest(\"[role='group']\")?.querySelector<HTMLElement>(\"[data-emoji-heading]\")?.offsetHeight ?? 0;\n const top = offsetOf(option) - covered;\n const bottom = offsetOf(option) + option.offsetHeight;\n if (top < scrollRef.scrollTop) scrollRef.scrollTop = top;\n else if (bottom > scrollRef.scrollTop + scrollRef.clientHeight) scrollRef.scrollTop = bottom - scrollRef.clientHeight;\n });\n\n /** The group whose title sits at the top of the list, for the group bar. */\n const syncGroup = () => {\n if (!scrollRef || searching()) return;\n const top = scrollRef.scrollTop + 1;\n let current: Section[\"key\"] | undefined;\n for (const group of scrollRef.querySelectorAll<HTMLElement>(\"[data-emoji-group]\")) {\n if (offsetOf(group) <= top) current = group.dataset.emojiGroup as Section[\"key\"];\n }\n setCurrentGroup(current ?? groups()[0]?.key);\n };\n createEffect(on([groups, searching], () => queueMicrotask(syncGroup)));\n\n onMount(() => {\n if (props.autofocus) queueMicrotask(() => searchRef?.focus({ preventScroll: true }));\n });\n\n const pick = (item: Item | undefined) => {\n if (item) props.onPick(item.emoji);\n };\n\n const showGroup = (key: Section[\"key\"]) => {\n setQuery(\"\");\n queueMicrotask(() => {\n const group = scrollRef?.querySelector<HTMLElement>(`[data-emoji-group=\"${key}\"]`);\n if (!group || !scrollRef) return;\n scrollRef.scrollTop = offsetOf(group);\n const position = groups().findIndex((section) => section.key === key);\n if (position >= 0) setActive(groupStarts()[position]!);\n syncGroup();\n });\n };\n\n const onSearchKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229) return;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\" || event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n // Left and right edit a search until up or down enters the grid.\n if ((event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") && query() && !gridEntered()) return;\n event.preventDefault();\n revealActive = true;\n setGridEntered(true);\n setActive(nextEmojiIndex(sizes(), active(), event.key));\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n pick(activeItem());\n return;\n }\n if (event.key === \"Escape\") {\n if (query()) {\n event.preventDefault();\n event.stopPropagation();\n setQuery(\"\");\n return;\n }\n if (props.onClose) {\n event.preventDefault();\n event.stopPropagation();\n props.onClose();\n }\n }\n };\n\n const openTones = () => {\n setTonesOpen(true);\n queueMicrotask(() => tonesRef?.querySelector<HTMLElement>(\"[aria-checked='true']\")?.focus());\n };\n const closeTones = (focusButton: boolean) => {\n setTonesOpen(false);\n if (focusButton) queueMicrotask(() => toneButtonRef?.focus());\n };\n /** As in any radio group, the arrow keys choose; Enter, Space, a click or Escape close the choice. */\n const onTonesKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\" || event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const step = event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n const next = EMOJI_SKIN_TONES[(tone() + step + EMOJI_SKIN_TONES.length) % EMOJI_SKIN_TONES.length]!;\n props.onSkinToneChange?.(next);\n queueMicrotask(() => tonesRef?.querySelector<HTMLElement>(`[data-tone=\"${next}\"]`)?.focus());\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n closeTones(true);\n }\n };\n\n /** The group bar is one tab stop; arrow keys move along it. */\n const onGroupsKeyDown = (event: KeyboardEvent) => {\n const buttons = [...(groupsRef?.querySelectorAll<HTMLButtonElement>(\"button\") ?? [])];\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const target =\n event.key === \"ArrowLeft\"\n ? current - 1\n : event.key === \"ArrowRight\"\n ? current + 1\n : event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : undefined;\n if (target === undefined) return;\n event.preventDefault();\n buttons[(target + buttons.length) % buttons.length]?.focus();\n };\n const groupKeys = createMemo((): Section[\"key\"][] => [\n ...(props.recent?.length ? ([\"recent\"] as const) : []),\n ...EMOJI_GROUPS.map((group) => group.key),\n ]);\n const groupIcon = (key: Section[\"key\"]) =>\n key === \"recent\" ? \"ti ti-clock\" : (EMOJI_GROUPS.find((group) => group.key === key)?.icon ?? \"ti ti-mood-smile\");\n const tabStop = () => currentGroup() ?? groupKeys()[0];\n\n /** The grid shares its pointer listeners; the target's position says which emoji it is. */\n const itemAt = (event: Event): number | undefined => {\n const option = (event.target as Element | null)?.closest<HTMLElement>(\"[data-emoji-index]\");\n return option ? Number(option.dataset.emojiIndex) : undefined;\n };\n\n // A button, so that a tap is a click on every engine; the focus stays in the search field.\n const option = (item: Item, list: \"r\" | \"g\", position: () => number) => (\n <button\n id={optionId(position(), list)}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n class=\"k2b-emoji-picker__option\"\n aria-selected={isActive(position())}\n aria-label={nameOf(item)}\n data-emoji-index={position()}\n data-active={isActive(position()) ? \"true\" : undefined}\n onClick={() => pick(item)}\n >\n {item.emoji}\n </button>\n );\n\n return (\n <div class={`k2b-emoji-picker ${props.class ?? \"\"}`} role=\"group\" aria-label={props.label ?? text().emojiPicker}>\n <div class=\"k2b-emoji-picker__header\">\n <div class=\"k2b-emoji-picker__search\" inert={tonesOpen()}>\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n role=\"combobox\"\n aria-label={text().emojiSearch}\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem() ? optionId(active()) : undefined}\n placeholder={text().emojiSearch}\n autocomplete=\"off\"\n spellcheck={false}\n enterkeyhint=\"done\"\n value={query()}\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n setGridEntered(false);\n }}\n onKeyDown={onSearchKeyDown}\n />\n </div>\n <Show when={props.onSkinToneChange}>\n <button\n ref={toneButtonRef}\n type=\"button\"\n class=\"k2b-emoji-picker__tone-button\"\n aria-label={text().emojiSkinTone}\n aria-haspopup=\"true\"\n aria-expanded={tonesOpen()}\n title={`${text().emojiSkinTone}: ${toneLabel(text(), tone())}`}\n inert={tonesOpen()}\n onClick={openTones}\n >\n <span aria-hidden=\"true\">{toneSample(tone())}</span>\n </button>\n {/* The tones cover the header in place, so nothing below moves. */}\n <Show when={tonesOpen()}>\n <div\n ref={tonesRef}\n class=\"k2b-emoji-picker__tones\"\n role=\"radiogroup\"\n aria-label={text().emojiSkinTone}\n onKeyDown={onTonesKeyDown}\n onFocusOut={(event) => {\n if (!tonesRef?.contains(event.relatedTarget as Node | null)) closeTones(false);\n }}\n >\n <For each={EMOJI_SKIN_TONES}>\n {(value) => (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={value === tone()}\n aria-label={toneLabel(text(), value)}\n title={toneLabel(text(), value)}\n tabIndex={value === tone() ? 0 : -1}\n data-tone={value}\n onClick={() => {\n props.onSkinToneChange?.(value);\n closeTones(true);\n }}\n >\n <span aria-hidden=\"true\">{toneSample(value)}</span>\n </button>\n )}\n </For>\n </div>\n </Show>\n </Show>\n </div>\n\n <div ref={groupsRef} class=\"k2b-emoji-picker__groups\" role=\"toolbar\" aria-label={text().emojiGroups} onKeyDown={onGroupsKeyDown}>\n <For each={groupKeys()}>\n {(key) => (\n <button\n type=\"button\"\n aria-label={groupTitle(text(), key)}\n title={groupTitle(text(), key)}\n aria-current={!searching() && currentGroup() === key ? \"true\" : undefined}\n tabIndex={key === tabStop() ? 0 : -1}\n disabled={!index()}\n onClick={() => showGroup(key)}\n >\n <i class={groupIcon(key)} aria-hidden=\"true\" />\n </button>\n )}\n </For>\n </div>\n\n <div ref={scrollRef} class=\"k2b-emoji-picker__scroll\" onScroll={syncGroup}>\n <Show\n when={index()}\n fallback={\n <div class=\"k2b-emoji-picker__state\" role=\"status\">\n <Show\n when={failed()}\n fallback={\n <>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n </>\n }\n >\n <span>{text().emojiLoadFailed}</span>\n <Button size=\"sm\" variant=\"subtle\" onClick={load}>\n {messages().retry}\n </Button>\n </Show>\n </div>\n }\n >\n <div\n id={`${id}-list`}\n role=\"listbox\"\n class=\"k2b-emoji-picker__list\"\n aria-label={props.label ?? text().emojiPicker}\n onPointerMove={(event) => {\n const position = itemAt(event);\n if (position !== undefined && !isActive(position) && event.pointerType === \"mouse\") setActive(position);\n }}\n onMouseDown={(event) => {\n // The focus stays in the search field, where the keyboard works.\n if (itemAt(event) !== undefined) event.preventDefault();\n }}\n >\n <Show when={searching()}>\n <div role=\"group\" aria-label={messages().searchResults}>\n <For each={resultBlocks()}>\n {(block, blockIndex) => (\n <div\n class=\"k2b-emoji-picker__grid k2b-emoji-picker__block\"\n style={{ \"--k2b-emoji-rows\": String(Math.ceil(block.length / COLUMNS)) }}\n >\n <For each={block}>{(item, itemIndex) => option(item, \"r\", () => blockIndex() * RESULT_BLOCK + itemIndex())}</For>\n </div>\n )}\n </For>\n </div>\n </Show>\n <div class=\"k2b-emoji-picker__all\" hidden={searching()}>\n <For each={groups()}>\n {(section, sectionIndex) => (\n <div\n role=\"group\"\n class=\"k2b-emoji-picker__section\"\n data-emoji-group={section.key}\n aria-labelledby={`${id}-${section.key}`}\n style={{ \"--k2b-emoji-rows\": String(Math.ceil(section.items.length / COLUMNS)) }}\n >\n <div id={`${id}-${section.key}`} class=\"k2b-emoji-picker__heading\" data-emoji-heading>\n {groupTitle(text(), section.key)}\n </div>\n <div class=\"k2b-emoji-picker__grid\">\n <For each={section.items}>\n {(item, itemIndex) => option(item, \"g\", () => groupStarts()[sectionIndex()]! + itemIndex())}\n </For>\n </div>\n </div>\n )}\n </For>\n </div>\n </div>\n <Show when={searching() && results().length === 0}>\n <div class=\"k2b-emoji-picker__state\" role=\"status\">\n {text().emojiNoResults}\n </div>\n </Show>\n </Show>\n </div>\n\n <div class=\"k2b-emoji-picker__preview\" aria-hidden=\"true\">\n <Show when={activeItem()}>\n {(item) => (\n <>\n <span class=\"k2b-emoji-picker__preview-emoji\">{item().emoji}</span>\n <span class=\"k2b-emoji-picker__preview-name\">{nameOf(item())}</span>\n <Show when={item().entry?.shortcodes[0]}>{(code) => <span class=\"k2b-emoji-picker__preview-code\">:{code()}:</span>}</Show>\n </>\n )}\n </Show>\n </div>\n </div>\n );\n}\n\nexport type EmojiPickerPopoverProps = Omit<EmojiPickerProps, \"onClose\" | \"autofocus\"> & {\n /** The control the picker opens next to. The picker is open while this is set. */\n anchor: HTMLElement | null | undefined;\n /** Called after a pick, on Escape, on a click outside, and on another press of the anchor. */\n onClose: () => void;\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst GAP = 6;\nconst MARGIN = 8;\n\n/**\n * The picker next to a control, such as the composer's emoji button or a message's \"Add reaction\". It opens above the\n * control where there is room and below it otherwise, closes after a pick, and returns the focus to where it was.\n */\nfunction EmojiPickerPopover(props: EmojiPickerPopoverProps): JSX.Element {\n let surface: HTMLDivElement | undefined;\n /** Where the focus was when the picker opened, and whether a keyboard opened it. */\n let previous: HTMLElement | null = null;\n let ring = false;\n /** An anchor pressed while the picker was open closes it; the same click must not open it again. */\n let pressedAnchor: HTMLElement | undefined;\n const [shown, setShown] = createSignal<HTMLElement>();\n\n const place = () => {\n const anchor = shown();\n if (!surface || !anchor) return;\n // An anchor that left the page, such as a row a virtual list recycled, takes the picker with it.\n if (!anchor.isConnected) {\n hide();\n props.onClose();\n return;\n }\n // The visible part of the page: a phone's keyboard shrinks only the visual viewport.\n const viewport = window.visualViewport;\n const view = {\n top: (viewport?.offsetTop ?? 0) + MARGIN,\n bottom: (viewport ? viewport.offsetTop + viewport.height : window.innerHeight) - MARGIN,\n left: (viewport?.offsetLeft ?? 0) + MARGIN,\n right: (viewport ? viewport.offsetLeft + viewport.width : window.innerWidth) - MARGIN,\n };\n surface.style.setProperty(\"--k2b-emoji-popover-height\", `${Math.round(view.bottom - view.top)}px`);\n const box = anchor.getBoundingClientRect();\n const size = surface.getBoundingClientRect();\n const above = box.top - GAP - size.height;\n const below = box.bottom + GAP;\n const top = above >= view.top || below + size.height > view.bottom ? above : below;\n // Aligned with the anchor's end, like a menu at the end of a composer.\n const left = box.right - size.width;\n surface.style.left = `${Math.round(Math.max(view.left, Math.min(left, view.right - size.width)))}px`;\n surface.style.top = `${Math.round(Math.max(view.top, Math.min(top, view.bottom - size.height)))}px`;\n };\n\n const restoreFocus = () => {\n // A pick that moved the focus on purpose, such as into a composer, keeps it there.\n const focused = document.activeElement;\n if (focused && focused !== document.body && !surface?.contains(focused)) return;\n if (previous?.isConnected) returnFocus(previous, ring);\n };\n\n const hide = () => {\n restoreFocus();\n if (surface?.matches(\":popover-open\")) surface.hidePopover();\n setShown(undefined);\n };\n\n const pressed = (event: PointerEvent) => {\n const anchor = shown();\n pressedAnchor = anchor && event.target instanceof Node && anchor.contains(event.target) ? anchor : undefined;\n };\n\n /** A key press on the anchor dismisses nothing on its way, unlike a pointer: its click closes the open picker. */\n const clicked = (event: MouseEvent) => {\n const anchor = shown();\n if (!anchor || !(event.target instanceof Node) || !anchor.contains(event.target)) return;\n pressedAnchor = anchor;\n hide();\n props.onClose();\n };\n\n createEffect(() => {\n const anchor = props.anchor ?? undefined;\n untrack(() => {\n if (!anchor) {\n if (shown()) hide();\n return;\n }\n if (anchor === pressedAnchor) {\n // The press that closed the picker also asked to open it: it stays closed.\n pressedAnchor = undefined;\n props.onClose();\n return;\n }\n if (shown() === anchor || !surface) return;\n // Moving to another anchor keeps the picker open and the focus to return to.\n if (!shown()) {\n previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n ring = ringOnReturn(previous ?? anchor);\n }\n setShown(anchor);\n if (!surface.matches(\":popover-open\")) surface.showPopover();\n place();\n });\n });\n\n /** The page scrolled under the anchor; the picker's own list scrolling moves nothing. */\n const scrolled = (event: Event) => {\n if (!(event.target instanceof Node && surface?.contains(event.target))) place();\n };\n\n onMount(() => {\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", scrolled, true);\n window.visualViewport?.addEventListener(\"resize\", place);\n window.visualViewport?.addEventListener(\"scroll\", place);\n document.addEventListener(\"pointerdown\", pressed, true);\n document.addEventListener(\"click\", clicked, true);\n // The picker renders into the open surface after it is shown; its size places it.\n const observer = typeof ResizeObserver === \"function\" && surface ? new ResizeObserver(place) : undefined;\n if (surface) observer?.observe(surface);\n onCleanup(() => {\n observer?.disconnect();\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", scrolled, true);\n window.visualViewport?.removeEventListener(\"resize\", place);\n window.visualViewport?.removeEventListener(\"scroll\", place);\n document.removeEventListener(\"pointerdown\", pressed, true);\n document.removeEventListener(\"click\", clicked, true);\n if (surface?.matches(\":popover-open\")) hide();\n });\n });\n\n const touchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n\n return (\n <div\n ref={surface}\n popover=\"auto\"\n class=\"k2b-emoji-picker-popover\"\n onToggle={(event) => {\n if ((event as ToggleEvent).newState === \"open\") return;\n // Light dismissal by the browser: a click outside, Escape, or another popover.\n if (shown()) {\n setShown(undefined);\n restoreFocus();\n props.onClose();\n }\n // The pressed anchor is forgotten once its click has had the chance to reopen the picker.\n setTimeout(() => {\n pressedAnchor = undefined;\n });\n }}\n >\n <Show when={shown()}>\n <EmojiPickerPanel\n onPick={(emoji) => {\n props.onPick(emoji);\n hide();\n props.onClose();\n }}\n recent={props.recent}\n skinTone={props.skinTone}\n onSkinToneChange={props.onSkinToneChange}\n label={props.label}\n class={props.class}\n // A phone's keyboard would cover the emoji; a touch-only device searches after a tap on the field.\n autofocus={!touchOnly()}\n onClose={() => {\n hide();\n props.onClose();\n }}\n />\n </Show>\n </div>\n );\n}\n\n/** The emoji picker. `EmojiPicker.Popover` opens it next to a control. */\nexport const EmojiPicker = Object.assign(EmojiPickerPanel, { Popover: EmojiPickerPopover });\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/emoji/EmojiPicker.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSelector,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Button } from \"../../actions/Button\";\nimport { returnFocus, ringOnReturn } from \"../../internal/focus-return\";\nimport { useLocale } from \"../../intl/locale\";\nimport { useUiMessages } from \"../../intl/messages\";\nimport {\n EMOJI_GROUPS,\n EMOJI_SKIN_TONES,\n type EmojiEntry,\n type EmojiGroupKey,\n type EmojiIndex,\n type EmojiSkinTone,\n emojiInTone,\n emojiName,\n findEmoji,\n loadEmojiIndex,\n RECENT_EMOJI_LIMIT,\n searchEmoji,\n} from \"./emoji-index\";\nimport { type EmojiMessages, useEmojiMessages } from \"./emoji-messages\";\n\n/** Emoji per row. Keyboard navigation moves by rows of this length. */\nconst COLUMNS = 8;\n/** Search results render in blocks of this many rows, so the browser lays out only the blocks in view. */\nconst RESULT_BLOCK = 8 * COLUMNS;\nconst TONE_SAMPLE = \"✋\";\nconst TONE_SAMPLE_LIGHT = \"✋\\u{1F3FB}\";\n\nexport type EmojiPickerProps = {\n /** Called with the chosen emoji, in the chosen skin tone where it has one. */\n onPick: (emoji: string) => void;\n /** Recently used emoji, most recent first, shown as the first group. The application stores them; see `rememberEmoji`. */\n recent?: readonly string[];\n /** The skin tone for emoji that have one. Defaults to `0`, the default yellow. */\n skinTone?: EmojiSkinTone;\n /** Shows the skin-tone choice. The application stores the tone and passes it back as `skinTone`. */\n onSkinToneChange?: (tone: EmojiSkinTone) => void;\n /** Escape in an empty search field asks to close the surface the picker sits in. */\n onClose?: () => void;\n /** Moves focus into the search field once the picker is shown. */\n autofocus?: boolean;\n /** The picker's accessible name. Defaults to \"Emoji\". */\n label?: string;\n class?: string;\n};\n\ntype Section = { key: EmojiGroupKey | \"recent\"; items: readonly Item[] };\ntype Item = { emoji: string; entry?: EmojiEntry };\n\nconst groupTitle = (messages: EmojiMessages, key: Section[\"key\"]): string => {\n switch (key) {\n case \"recent\":\n return messages.emojiRecent;\n case \"smileys\":\n return messages.emojiSmileys;\n case \"people\":\n return messages.emojiPeople;\n case \"animals\":\n return messages.emojiAnimals;\n case \"food\":\n return messages.emojiFood;\n case \"travel\":\n return messages.emojiTravel;\n case \"activities\":\n return messages.emojiActivities;\n case \"objects\":\n return messages.emojiObjects;\n case \"symbols\":\n return messages.emojiSymbols;\n case \"flags\":\n return messages.emojiFlags;\n }\n};\n\nconst toneLabel = (messages: EmojiMessages, tone: EmojiSkinTone): string =>\n [\n messages.emojiToneDefault,\n messages.emojiToneLight,\n messages.emojiToneMediumLight,\n messages.emojiToneMedium,\n messages.emojiToneMediumDark,\n messages.emojiToneDark,\n ][tone]!;\n\nconst toneSample = (tone: EmojiSkinTone): string =>\n tone === 0 ? TONE_SAMPLE : TONE_SAMPLE_LIGHT.replace(\"\\u{1F3FB}\", String.fromCodePoint(0x1f3fb + tone - 1));\n\n/** Where `index` moves for an arrow key in rows of `COLUMNS`, where every section starts a new row. */\nexport const nextEmojiIndex = (\n sizes: readonly number[],\n index: number,\n key: \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\",\n): number => {\n const total = sizes.reduce((sum, size) => sum + size, 0);\n if (total === 0) return -1;\n if (index < 0) return 0;\n if (key === \"ArrowLeft\") return Math.max(0, index - 1);\n if (key === \"ArrowRight\") return Math.min(total - 1, index + 1);\n const starts: number[] = [];\n sizes.reduce((start, size) => (starts.push(start), start + size), 0);\n const section = starts.findLastIndex((start, position) => start <= index && sizes[position]! > 0);\n const offset = index - starts[section]!;\n const column = offset % COLUMNS;\n const size = sizes[section]!;\n if (key === \"ArrowUp\") {\n if (offset >= COLUMNS) return index - COLUMNS;\n for (let previous = section - 1; previous >= 0; previous--) {\n if (!sizes[previous]) continue;\n const lastRow = Math.floor((sizes[previous]! - 1) / COLUMNS) * COLUMNS;\n return starts[previous]! + Math.min(lastRow + column, sizes[previous]! - 1);\n }\n return index;\n }\n if (offset + COLUMNS < size) return index + COLUMNS;\n // A shorter last row: the last emoji of the section is below.\n if (Math.floor(offset / COLUMNS) < Math.floor((size - 1) / COLUMNS)) return starts[section]! + size - 1;\n for (let next = section + 1; next < sizes.length; next++) {\n if (sizes[next]) return starts[next]! + Math.min(column, sizes[next]! - 1);\n }\n return index;\n};\n\n/**\n * A search field, the groups, and a grid of emoji. Search finds English and German names, keywords and GitHub\n * shortcodes. The focus stays in the search field: arrow keys move through the grid, Enter picks.\n */\nfunction EmojiPickerPanel(props: EmojiPickerProps): JSX.Element {\n const messages = useUiMessages();\n const text = useEmojiMessages();\n const locale = useLocale();\n const id = `k2b-emoji-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const [index, setIndex] = createSignal<EmojiIndex>();\n const [failed, setFailed] = createSignal(false);\n const [query, setQuery] = createSignal(\"\");\n const [active, setActive] = createSignal(0);\n const isActive = createSelector(active);\n const [tonesOpen, setTonesOpen] = createSignal(false);\n const [currentGroup, setCurrentGroup] = createSignal<Section[\"key\"]>();\n /** Up or down moved into the grid; from then on, left and right move there too, until the search changes. */\n const [gridEntered, setGridEntered] = createSignal(false);\n let searchRef: HTMLInputElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let toneButtonRef: HTMLButtonElement | undefined;\n let tonesRef: HTMLDivElement | undefined;\n let groupsRef: HTMLDivElement | undefined;\n /** Keyboard moves scroll the active emoji into view; the pointer does not. */\n let revealActive = false;\n\n const load = () => {\n setFailed(false);\n loadEmojiIndex().then(setIndex, () => setFailed(true));\n };\n onMount(load);\n\n const tone = () => props.skinTone ?? 0;\n const searching = () => query().trim().length > 0;\n // The groups render once and stay while a search shows its results above them, so clearing a search is instant.\n const groups = createMemo((): readonly Section[] => {\n const data = index();\n if (!data) return [];\n const recent: Section = {\n key: \"recent\",\n items: (props.recent ?? []).slice(0, RECENT_EMOJI_LIMIT).map((emoji) => ({ emoji, entry: findEmoji(data, emoji) })),\n };\n const all = EMOJI_GROUPS.map(\n (group): Section => ({\n key: group.key,\n items: data.entries.filter((entry) => entry.group === group.id).map((entry) => ({ emoji: emojiInTone(entry, tone()), entry })),\n }),\n );\n return recent.items.length ? [recent, ...all] : all;\n });\n const groupStarts = createMemo(() => {\n const starts: number[] = [];\n groups().reduce((start, section) => (starts.push(start), start + section.items.length), 0);\n return starts;\n });\n const results = createMemo((): readonly Item[] => {\n const data = index();\n if (!data || !searching()) return [];\n return searchEmoji(data, query()).map((entry) => ({ emoji: emojiInTone(entry, tone()), entry }));\n });\n const resultBlocks = createMemo(() =>\n Array.from({ length: Math.ceil(results().length / RESULT_BLOCK) }, (_, block) =>\n results().slice(block * RESULT_BLOCK, (block + 1) * RESULT_BLOCK),\n ),\n );\n /** The sizes of the visible sections, for the arrow keys. */\n const sizes = () => (searching() ? [results().length] : groups().map((section) => section.items.length));\n const items = createMemo(() => (searching() ? results() : groups().flatMap((section) => section.items)));\n const activeItem = () => items()[active()];\n const optionId = (position: number, list = searching() ? \"r\" : \"g\") => `${id}-${list}${position}`;\n const nameOf = (item: Item) => (item.entry ? emojiName(item.entry, locale()) : item.emoji);\n /** Where an element sits in the list, from its top. */\n const offsetOf = (element: Element) =>\n element.getBoundingClientRect().top - scrollRef!.getBoundingClientRect().top + scrollRef!.scrollTop;\n\n // A new search starts at its best match; the groups at their top.\n createEffect(\n on([query, index], () => {\n setActive(0);\n if (scrollRef) scrollRef.scrollTop = 0;\n }),\n );\n\n createEffect(() => {\n const position = active();\n if (!revealActive) return;\n revealActive = false;\n const option = document.getElementById(optionId(position));\n if (!option || !scrollRef) return;\n // Sticky group titles cover the top of the list; an emoji in a first row scrolls with its title.\n const covered = option.closest(\"[role='group']\")?.querySelector<HTMLElement>(\"[data-emoji-heading]\")?.offsetHeight ?? 0;\n const top = offsetOf(option) - covered;\n const bottom = offsetOf(option) + option.offsetHeight;\n if (top < scrollRef.scrollTop) scrollRef.scrollTop = top;\n else if (bottom > scrollRef.scrollTop + scrollRef.clientHeight) scrollRef.scrollTop = bottom - scrollRef.clientHeight;\n });\n\n /** The group whose title sits at the top of the list, for the group bar. */\n const syncGroup = () => {\n if (!scrollRef || searching()) return;\n const top = scrollRef.scrollTop + 1;\n let current: Section[\"key\"] | undefined;\n for (const group of scrollRef.querySelectorAll<HTMLElement>(\"[data-emoji-group]\")) {\n if (offsetOf(group) <= top) current = group.dataset.emojiGroup as Section[\"key\"];\n }\n setCurrentGroup(current ?? groups()[0]?.key);\n };\n createEffect(on([groups, searching], () => queueMicrotask(syncGroup)));\n\n onMount(() => {\n if (props.autofocus) queueMicrotask(() => searchRef?.focus({ preventScroll: true }));\n });\n\n const pick = (item: Item | undefined) => {\n if (item) props.onPick(item.emoji);\n };\n\n const showGroup = (key: Section[\"key\"]) => {\n setQuery(\"\");\n queueMicrotask(() => {\n const group = scrollRef?.querySelector<HTMLElement>(`[data-emoji-group=\"${key}\"]`);\n if (!group || !scrollRef) return;\n scrollRef.scrollTop = offsetOf(group);\n const position = groups().findIndex((section) => section.key === key);\n if (position >= 0) setActive(groupStarts()[position]!);\n syncGroup();\n });\n };\n\n const onSearchKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229) return;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\" || event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n // Left and right edit a search until up or down enters the grid.\n if ((event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") && query() && !gridEntered()) return;\n event.preventDefault();\n revealActive = true;\n setGridEntered(true);\n setActive(nextEmojiIndex(sizes(), active(), event.key));\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n pick(activeItem());\n return;\n }\n if (event.key === \"Escape\") {\n if (query()) {\n event.preventDefault();\n event.stopPropagation();\n setQuery(\"\");\n return;\n }\n if (props.onClose) {\n event.preventDefault();\n event.stopPropagation();\n props.onClose();\n }\n }\n };\n\n const openTones = () => {\n setTonesOpen(true);\n queueMicrotask(() => tonesRef?.querySelector<HTMLElement>(\"[aria-checked='true']\")?.focus());\n };\n const closeTones = (focusButton: boolean) => {\n setTonesOpen(false);\n if (focusButton) queueMicrotask(() => toneButtonRef?.focus());\n };\n /** As in any radio group, the arrow keys choose; Enter, Space, a click or Escape close the choice. */\n const onTonesKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\" || event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const step = event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n const next = EMOJI_SKIN_TONES[(tone() + step + EMOJI_SKIN_TONES.length) % EMOJI_SKIN_TONES.length]!;\n props.onSkinToneChange?.(next);\n queueMicrotask(() => tonesRef?.querySelector<HTMLElement>(`[data-tone=\"${next}\"]`)?.focus());\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n closeTones(true);\n }\n };\n\n /** The group bar is one tab stop; arrow keys move along it. */\n const onGroupsKeyDown = (event: KeyboardEvent) => {\n const buttons = [...(groupsRef?.querySelectorAll<HTMLButtonElement>(\"button\") ?? [])];\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const target =\n event.key === \"ArrowLeft\"\n ? current - 1\n : event.key === \"ArrowRight\"\n ? current + 1\n : event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : undefined;\n if (target === undefined) return;\n event.preventDefault();\n buttons[(target + buttons.length) % buttons.length]?.focus();\n };\n const groupKeys = createMemo((): Section[\"key\"][] => [\n ...(props.recent?.length ? ([\"recent\"] as const) : []),\n ...EMOJI_GROUPS.map((group) => group.key),\n ]);\n const groupIcon = (key: Section[\"key\"]) =>\n key === \"recent\" ? \"ti ti-clock\" : (EMOJI_GROUPS.find((group) => group.key === key)?.icon ?? \"ti ti-mood-smile\");\n const tabStop = () => currentGroup() ?? groupKeys()[0];\n\n /** The grid shares its pointer listeners; the target's position says which emoji it is. */\n const itemAt = (event: Event): number | undefined => {\n const option = (event.target as Element | null)?.closest<HTMLElement>(\"[data-emoji-index]\");\n return option ? Number(option.dataset.emojiIndex) : undefined;\n };\n\n // A button, so that a tap is a click on every engine; the focus stays in the search field.\n const option = (item: Item, list: \"r\" | \"g\", position: () => number) => (\n <button\n id={optionId(position(), list)}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n class=\"k2b-emoji-picker__option\"\n aria-selected={isActive(position())}\n aria-label={nameOf(item)}\n data-emoji-index={position()}\n data-active={isActive(position()) ? \"true\" : undefined}\n onClick={() => pick(item)}\n >\n {item.emoji}\n </button>\n );\n\n return (\n <div class={`k2b-emoji-picker ${props.class ?? \"\"}`} role=\"group\" aria-label={props.label ?? text().emojiPicker}>\n <div class=\"k2b-emoji-picker__header\">\n <div class=\"k2b-emoji-picker__search\" inert={tonesOpen()}>\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n role=\"combobox\"\n aria-label={text().emojiSearch}\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem() ? optionId(active()) : undefined}\n placeholder={text().emojiSearch}\n autocomplete=\"off\"\n spellcheck={false}\n enterkeyhint=\"done\"\n value={query()}\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n setGridEntered(false);\n }}\n onKeyDown={onSearchKeyDown}\n />\n </div>\n <Show when={props.onSkinToneChange}>\n <button\n ref={toneButtonRef}\n type=\"button\"\n class=\"k2b-emoji-picker__tone-button\"\n aria-label={text().emojiSkinTone}\n aria-haspopup=\"true\"\n aria-expanded={tonesOpen()}\n title={`${text().emojiSkinTone}: ${toneLabel(text(), tone())}`}\n inert={tonesOpen()}\n onClick={openTones}\n >\n <span aria-hidden=\"true\">{toneSample(tone())}</span>\n </button>\n {/* The tones cover the header in place, so nothing below moves. */}\n <Show when={tonesOpen()}>\n <div\n ref={tonesRef}\n class=\"k2b-emoji-picker__tones\"\n role=\"radiogroup\"\n aria-label={text().emojiSkinTone}\n onKeyDown={onTonesKeyDown}\n onFocusOut={(event) => {\n if (!tonesRef?.contains(event.relatedTarget as Node | null)) closeTones(false);\n }}\n >\n <For each={EMOJI_SKIN_TONES}>\n {(value) => (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={value === tone()}\n aria-label={toneLabel(text(), value)}\n title={toneLabel(text(), value)}\n tabIndex={value === tone() ? 0 : -1}\n data-tone={value}\n onClick={() => {\n props.onSkinToneChange?.(value);\n closeTones(true);\n }}\n >\n <span aria-hidden=\"true\">{toneSample(value)}</span>\n </button>\n )}\n </For>\n </div>\n </Show>\n </Show>\n </div>\n\n <div ref={groupsRef} class=\"k2b-emoji-picker__groups\" role=\"toolbar\" aria-label={text().emojiGroups} onKeyDown={onGroupsKeyDown}>\n <For each={groupKeys()}>\n {(key) => (\n <button\n type=\"button\"\n aria-label={groupTitle(text(), key)}\n title={groupTitle(text(), key)}\n aria-current={!searching() && currentGroup() === key ? \"true\" : undefined}\n tabIndex={key === tabStop() ? 0 : -1}\n disabled={!index()}\n onClick={() => showGroup(key)}\n >\n <i class={groupIcon(key)} aria-hidden=\"true\" />\n </button>\n )}\n </For>\n </div>\n\n <div ref={scrollRef} class=\"k2b-emoji-picker__scroll\" onScroll={syncGroup}>\n <Show\n when={index()}\n fallback={\n <div class=\"k2b-emoji-picker__state\" role=\"status\">\n <Show\n when={failed()}\n fallback={\n <>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n </>\n }\n >\n <span>{text().emojiLoadFailed}</span>\n <Button size=\"sm\" variant=\"subtle\" onClick={load}>\n {messages().retry}\n </Button>\n </Show>\n </div>\n }\n >\n <div\n id={`${id}-list`}\n role=\"listbox\"\n class=\"k2b-emoji-picker__list\"\n aria-label={props.label ?? text().emojiPicker}\n onPointerMove={(event) => {\n const position = itemAt(event);\n if (position !== undefined && !isActive(position) && event.pointerType === \"mouse\") setActive(position);\n }}\n onMouseDown={(event) => {\n // The focus stays in the search field, where the keyboard works.\n if (itemAt(event) !== undefined) event.preventDefault();\n }}\n >\n <Show when={searching()}>\n <div role=\"group\" aria-label={messages().searchResults}>\n <For each={resultBlocks()}>\n {(block, blockIndex) => (\n <div\n class=\"k2b-emoji-picker__grid k2b-emoji-picker__block\"\n style={{ \"--k2b-emoji-rows\": String(Math.ceil(block.length / COLUMNS)) }}\n >\n <For each={block}>{(item, itemIndex) => option(item, \"r\", () => blockIndex() * RESULT_BLOCK + itemIndex())}</For>\n </div>\n )}\n </For>\n </div>\n </Show>\n <div class=\"k2b-emoji-picker__all\" hidden={searching()}>\n <For each={groups()}>\n {(section, sectionIndex) => (\n <div\n role=\"group\"\n class=\"k2b-emoji-picker__section\"\n data-emoji-group={section.key}\n aria-labelledby={`${id}-${section.key}`}\n style={{ \"--k2b-emoji-rows\": String(Math.ceil(section.items.length / COLUMNS)) }}\n >\n <div id={`${id}-${section.key}`} class=\"k2b-emoji-picker__heading\" data-emoji-heading>\n {groupTitle(text(), section.key)}\n </div>\n <div class=\"k2b-emoji-picker__grid\">\n <For each={section.items}>\n {(item, itemIndex) => option(item, \"g\", () => groupStarts()[sectionIndex()]! + itemIndex())}\n </For>\n </div>\n </div>\n )}\n </For>\n </div>\n </div>\n <Show when={searching() && results().length === 0}>\n <div class=\"k2b-emoji-picker__state\" role=\"status\">\n {text().emojiNoResults}\n </div>\n </Show>\n </Show>\n </div>\n\n <div class=\"k2b-emoji-picker__preview\" aria-hidden=\"true\">\n <Show when={activeItem()}>\n {(item) => (\n <>\n <span class=\"k2b-emoji-picker__preview-emoji\">{item().emoji}</span>\n <span class=\"k2b-emoji-picker__preview-name\">{nameOf(item())}</span>\n <Show when={item().entry?.shortcodes[0]}>{(code) => <span class=\"k2b-emoji-picker__preview-code\">:{code()}:</span>}</Show>\n </>\n )}\n </Show>\n </div>\n </div>\n );\n}\n\nexport type EmojiPickerPopoverProps = Omit<EmojiPickerProps, \"onClose\" | \"autofocus\"> & {\n /** The control the picker opens next to. The picker is open while this is set. */\n anchor: HTMLElement | null | undefined;\n /** Called after a pick, on Escape, on a click outside, and on another press of the anchor. */\n onClose: () => void;\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst GAP = 6;\nconst MARGIN = 8;\n\n/**\n * The picker next to a control, such as the composer's emoji button or a message's \"Add reaction\". It opens above the\n * control where there is room and below it otherwise, closes after a pick, and returns the focus to where it was.\n */\nfunction EmojiPickerPopover(props: EmojiPickerPopoverProps): JSX.Element {\n let surface: HTMLDivElement | undefined;\n /** Where the focus was when the picker opened, and whether a keyboard opened it. */\n let previous: HTMLElement | null = null;\n let ring = false;\n /** An anchor pressed while the picker was open closes it; the same click must not open it again. */\n let pressedAnchor: HTMLElement | undefined;\n const [shown, setShown] = createSignal<HTMLElement>();\n let expandedAnchor: HTMLElement | undefined;\n let previousExpanded: string | null = null;\n const restoreExpanded = () => {\n if (previousExpanded === null) expandedAnchor?.removeAttribute(\"aria-expanded\");\n else expandedAnchor?.setAttribute(\"aria-expanded\", previousExpanded);\n expandedAnchor = undefined;\n };\n\n const place = () => {\n const anchor = shown();\n if (!surface || !anchor) return;\n // An anchor that left the page, such as a row a virtual list recycled, takes the picker with it.\n if (!anchor.isConnected) {\n hide();\n props.onClose();\n return;\n }\n // The visible part of the page: a phone's keyboard shrinks only the visual viewport.\n const viewport = window.visualViewport;\n const view = {\n top: (viewport?.offsetTop ?? 0) + MARGIN,\n bottom: (viewport ? viewport.offsetTop + viewport.height : window.innerHeight) - MARGIN,\n left: (viewport?.offsetLeft ?? 0) + MARGIN,\n right: (viewport ? viewport.offsetLeft + viewport.width : window.innerWidth) - MARGIN,\n };\n surface.style.setProperty(\"--k2b-emoji-popover-height\", `${Math.round(view.bottom - view.top)}px`);\n const box = anchor.getBoundingClientRect();\n const size = surface.getBoundingClientRect();\n const above = box.top - GAP - size.height;\n const below = box.bottom + GAP;\n const top = above >= view.top || below + size.height > view.bottom ? above : below;\n // Aligned with the anchor's end, like a menu at the end of a composer.\n const left = box.right - size.width;\n surface.style.left = `${Math.round(Math.max(view.left, Math.min(left, view.right - size.width)))}px`;\n surface.style.top = `${Math.round(Math.max(view.top, Math.min(top, view.bottom - size.height)))}px`;\n };\n\n const restoreFocus = () => {\n // A pick that moved the focus on purpose, such as into a composer, keeps it there.\n const focused = document.activeElement;\n if (focused && focused !== document.body && !surface?.contains(focused)) return;\n if (previous?.isConnected) returnFocus(previous, ring);\n };\n\n const hide = () => {\n restoreExpanded();\n restoreFocus();\n if (surface?.matches(\":popover-open\")) surface.hidePopover();\n setShown(undefined);\n };\n\n const pressed = (event: PointerEvent) => {\n const anchor = shown();\n pressedAnchor = anchor && event.target instanceof Node && anchor.contains(event.target) ? anchor : undefined;\n };\n\n /** A key press on the anchor dismisses nothing on its way, unlike a pointer: its click closes the open picker. */\n const clicked = (event: MouseEvent) => {\n const anchor = shown();\n if (!anchor || !(event.target instanceof Node) || !anchor.contains(event.target)) return;\n pressedAnchor = anchor;\n hide();\n props.onClose();\n };\n\n createEffect(() => {\n const anchor = props.anchor ?? undefined;\n untrack(() => {\n if (!anchor) {\n if (shown()) hide();\n return;\n }\n if (anchor === pressedAnchor) {\n // The press that closed the picker also asked to open it: it stays closed.\n pressedAnchor = undefined;\n props.onClose();\n return;\n }\n if (shown() === anchor || !surface) return;\n // Moving to another anchor keeps the picker open and the focus to return to.\n if (!shown()) {\n previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n ring = ringOnReturn(previous ?? anchor);\n }\n restoreExpanded();\n expandedAnchor = anchor;\n previousExpanded = anchor.getAttribute(\"aria-expanded\");\n anchor.setAttribute(\"aria-expanded\", \"true\");\n setShown(anchor);\n if (!surface.matches(\":popover-open\")) surface.showPopover();\n place();\n });\n });\n\n /** The page scrolled under the anchor; the picker's own list scrolling moves nothing. */\n const scrolled = (event: Event) => {\n if (!(event.target instanceof Node && surface?.contains(event.target))) place();\n };\n\n onMount(() => {\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", scrolled, true);\n window.visualViewport?.addEventListener(\"resize\", place);\n window.visualViewport?.addEventListener(\"scroll\", place);\n document.addEventListener(\"pointerdown\", pressed, true);\n document.addEventListener(\"click\", clicked, true);\n // The picker renders into the open surface after it is shown; its size places it.\n const observer = typeof ResizeObserver === \"function\" && surface ? new ResizeObserver(place) : undefined;\n if (surface) observer?.observe(surface);\n onCleanup(() => {\n observer?.disconnect();\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", scrolled, true);\n window.visualViewport?.removeEventListener(\"resize\", place);\n window.visualViewport?.removeEventListener(\"scroll\", place);\n document.removeEventListener(\"pointerdown\", pressed, true);\n document.removeEventListener(\"click\", clicked, true);\n restoreExpanded();\n if (surface?.matches(\":popover-open\")) hide();\n });\n });\n\n const touchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n\n return (\n <div\n ref={surface}\n popover=\"auto\"\n class=\"k2b-emoji-picker-popover\"\n onToggle={(event) => {\n if ((event as ToggleEvent).newState === \"open\") return;\n // Light dismissal by the browser: a click outside, Escape, or another popover.\n if (shown()) {\n restoreExpanded();\n setShown(undefined);\n restoreFocus();\n props.onClose();\n }\n // The pressed anchor is forgotten once its click has had the chance to reopen the picker.\n setTimeout(() => {\n pressedAnchor = undefined;\n });\n }}\n >\n <Show when={shown()}>\n <EmojiPickerPanel\n onPick={(emoji) => {\n props.onPick(emoji);\n hide();\n props.onClose();\n }}\n recent={props.recent}\n skinTone={props.skinTone}\n onSkinToneChange={props.onSkinToneChange}\n label={props.label}\n class={props.class}\n // A phone's keyboard would cover the emoji; a touch-only device searches after a tap on the field.\n autofocus={!touchOnly()}\n onClose={() => {\n hide();\n props.onClose();\n }}\n />\n </Show>\n </div>\n );\n}\n\n/** The emoji picker. `EmojiPicker.Popover` opens it next to a control. */\nexport const EmojiPicker = Object.assign(EmojiPickerPanel, { Popover: EmojiPickerPopover });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SACE,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,GAAG,EAEH,EAAE,EACF,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,QACF,UAAU;AACjB,SAAS,MAAM,QAAQ,sBAAsB;AAC7C,SAAS,WAAW,EAAE,YAAY,QAAQ,6BAA6B;AACvE,SAAS,SAAS,QAAQ,mBAAmB;AAC7C,SAAS,aAAa,QAAQ,qBAAqB;AACnD,SACE,YAAY,EACZ,gBAAgB,EAKhB,WAAW,EACX,SAAS,EACT,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,WAAW,QACN,eAAe;AACtB,SAA6B,gBAAgB,QAAQ,kBAAkB;;AAEvE;AACA,MAAM,OAAO,GAAG,CAAC;AACjB;AACA,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO;AAChC,MAAM,WAAW,GAAG,GAAG;AACvB,MAAM,iBAAiB,GAAG,YAAY;AAuBtC,MAAM,UAAU,GAAG,CAAC,QAAuB,EAAE,GAAmB,KAAa;EAC3E,QAAQ,GAAG;IACT,KAAK,QAAQ;MACX,OAAO,QAAQ,CAAC,WAAW;IAC7B,KAAK,SAAS;MACZ,OAAO,QAAQ,CAAC,YAAY;IAC9B,KAAK,QAAQ;MACX,OAAO,QAAQ,CAAC,WAAW;IAC7B,KAAK,SAAS;MACZ,OAAO,QAAQ,CAAC,YAAY;IAC9B,KAAK,MAAM;MACT,OAAO,QAAQ,CAAC,SAAS;IAC3B,KAAK,QAAQ;MACX,OAAO,QAAQ,CAAC,WAAW;IAC7B,KAAK,YAAY;MACf,OAAO,QAAQ,CAAC,eAAe;IACjC,KAAK,SAAS;MACZ,OAAO,QAAQ,CAAC,YAAY;IAC9B,KAAK,SAAS;MACZ,OAAO,QAAQ,CAAC,YAAY;IAC9B,KAAK,OAAO;MACV,OAAO,QAAQ,CAAC,UAAU;EAC9B;AACF,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,QAAuB,EAAE,IAAmB,KAC7D,CACE,QAAQ,CAAC,gBAAgB,EACzB,QAAQ,CAAC,cAAc,EACvB,QAAQ,CAAC,oBAAoB,EAC7B,QAAQ,CAAC,eAAe,EACxB,QAAQ,CAAC,mBAAmB,EAC5B,QAAQ,CAAC,aAAa,CACvB,CAAC,IAAI,CAAE;AAEV,MAAM,UAAU,GAAI,IAAmB,IACrC,IAAI,KAAK,CAAC,GAAG,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;;AAE7G;AACA,OAAO,MAAM,cAAc,GAAG,CAC5B,KAAwB,EACxB,KAAa,EACb,GAAyD,KAC9C;EACX,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;EACxD,IAAI,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;EAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC;EACvB,IAAI,GAAG,KAAK,WAAW,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;EACtD,IAAI,GAAG,KAAK,YAAY,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;EAC/D,MAAM,MAAgB,GAAG,EAAE;EAC3B,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;EACpE,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAI,CAAC,CAAC;EACjG,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,CAAE;EACvC,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO;EAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAE;EAC5B,IAAI,GAAG,KAAK,SAAS,EAAE;IACrB,IAAI,MAAM,IAAI,OAAO,EAAE,OAAO,KAAK,GAAG,OAAO;IAC7C,KAAK,IAAI,QAAQ,GAAG,OAAO,GAAG,CAAC,EAAE,QAAQ,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;MAC1D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;MACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAI,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO;MACtE,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAI,CAAC,CAAC;IAC7E;IACA,OAAO,KAAK;EACd;EACA,IAAI,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,OAAO,KAAK,GAAG,OAAO;EACnD;EACA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAI,IAAI,GAAG,CAAC;EACvG,KAAK,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IACxD,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC;EAC5E;EACA,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,KAAuB,EAAe;EAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC;EAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,EAAE,GAAG,aAAa,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAAE;EAC1E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAa,CAAC;EACpD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;EAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC;EACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACrD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,YAAY,CAAiB,CAAC;EACtE;EACA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACzD,IAAI,SAAuC;EAC3C,IAAI,SAAqC;EACzC,IAAI,aAA4C;EAChD,IAAI,QAAoC;EACxC,IAAI,SAAqC;EACzC;EACA,IAAI,YAAY,GAAG,KAAK;EAExB,MAAM,IAAI,GAAG,MAAM;IACjB,SAAS,CAAC,KAAK,CAAC;IAChB,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;EACxD,CAAC;EACD,OAAO,CAAC,IAAI,CAAC;EAEb,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;EACtC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;EACjD;EACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAA0B;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC;IACpB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;IACpB,MAAM,MAAe,GAAG;MACtB,GAAG,EAAE,QAAQ;MACb,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAE,KAAK,KAAM;QAAE,KAAK;QAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK;MAAE,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CACzB,KAAK,KAAe;MACnB,GAAG,EAAE,KAAK,CAAC,GAAG;MACd,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAE,KAAK,IAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAE,KAAK,KAAM;QAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAAE;MAAM,CAAC,CAAC;IAC/H,CAAC,CACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG;EACrD,CAAC,CAAC;EACF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM;IACnC,MAAM,MAAgB,GAAG,EAAE;IAC3B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1F,OAAO,MAAM;EACf,CAAC,CAAC;EACF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAuB;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC;IACpB,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE;IACpC,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAE,KAAK,KAAM;MAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;MAAE;IAAM,CAAC,CAAC,CAAC;EAClG,CAAC,CAAC;EACF,MAAM,YAAY,GAAG,UAAU,CAAC,MAC9B,KAAK,CAAC,IAAI,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,YAAY;EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAC1E,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,YAAY,CAClE,CACF,CAAC;EACD;EACA,MAAM,KAAK,GAAG,MAAO,SAAS,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAE,OAAO,IAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAE;EACxG,MAAM,KAAK,GAAG,UAAU,CAAC,MAAO,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAE,OAAO,IAAK,OAAO,CAAC,KAAK,CAAE,CAAC;EACxG,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;EAC1C,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,IAAI,IAAI,GAAG,QAAQ,EAAE;EACjG,MAAM,MAAM,GAAI,IAAU,IAAM,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAM;EAC1F;EACA,MAAM,QAAQ,GAAI,OAAgB,IAChC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAE,SAAS;;EAErG;EACA,YAAY,CACV,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM;IACvB,SAAS,CAAC,CAAC,CAAC;IACZ,IAAI,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,CAAC;EACxC,CAAC,CACH,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,YAAY,EAAE;IACnB,YAAY,GAAG,KAAK;IACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE;IAC3B;IACA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAc,sBAAsB,CAAC,EAAE,YAAY,IAAI,CAAC;IACvH,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY;IACrD,IAAI,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,KACpD,IAAI,MAAM,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC,YAAY;EACvH,CAAC,CAAC;;EAEF;EACA,MAAM,SAAS,GAAG,MAAM;IACtB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE;IAC/B,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,GAAG,CAAC;IACnC,IAAI,OAAmC;IACvC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,gBAAgB,CAAc,oBAAoB,CAAC,EAAE;MACjF,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAA4B;IAClF;IACA,eAAe,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;EAC9C,CAAC;EACD,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;EAEtE,OAAO,CAAC,MAAM;IACZ,IAAI,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC;MAAE,aAAa,EAAE;IAAK,CAAC,CAAC,CAAC;EACtF,CAAC,CAAC;EAEF,MAAM,IAAI,GAAI,IAAsB,IAAK;IACvC,IAAI,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;EACpC,CAAC;EAED,MAAM,SAAS,GAAI,GAAmB,IAAK;IACzC,QAAQ,CAAC,EAAE,CAAC;IACZ,cAAc,CAAC,MAAM;MACnB,MAAM,KAAK,GAAG,SAAS,EAAE,aAAa,CAAc,sBAAsB,GAAG,IAAI,CAAC;MAClF,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE;MAC1B,SAAS,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;MACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAE,OAAO,IAAK,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC;MACrE,IAAI,QAAQ,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC;MACtD,SAAS,CAAC,CAAC;IACb,CAAC,CAAC;EACJ,CAAC;EAED,MAAM,eAAe,GAAI,KAAoB,IAAK;IAChD;IACA,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,EAAE;IAChD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;MACnH;MACA,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;MAC5F,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,YAAY,GAAG,IAAI;MACnB,cAAc,CAAC,IAAI,CAAC;MACpB,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;MACvD;IACF;IACA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;MACzB,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;MAClB;IACF;IACA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;MAC1B,IAAI,KAAK,CAAC,CAAC,EAAE;QACX,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC;QACZ;MACF;MACA,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,KAAK,CAAC,cAAc,CAAC,CAAC;QACtB,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;MACjB;IACF;EACF,CAAC;EAED,MAAM,SAAS,GAAG,MAAM;IACtB,YAAY,CAAC,IAAI,CAAC;IAClB,cAAc,CAAC,MAAM,QAAQ,EAAE,aAAa,CAAc,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;EAC9F,CAAC;EACD,MAAM,UAAU,GAAI,WAAoB,IAAK;IAC3C,YAAY,CAAC,KAAK,CAAC;IACnB,IAAI,WAAW,EAAE,cAAc,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;EAC/D,CAAC;EACD;EACA,MAAM,cAAc,GAAI,KAAoB,IAAK;IAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;MACnH,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC;MAC1E,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAE;MACnG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;MAC9B,cAAc,CAAC,MAAM,QAAQ,EAAE,aAAa,CAAc,eAAe,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9F,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;MACjC,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,eAAe,CAAC,CAAC;MACvB,UAAU,CAAC,IAAI,CAAC;IAClB;EACF,CAAC;;EAED;EACA,MAAM,eAAe,GAAI,KAAoB,IAAK;IAChD,MAAM,OAAO,GAAG,CAAC,IAAI,SAAS,EAAE,gBAAgB,CAAoB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAkC,CAAC;IAC5E,MAAM,MAAM,GACV,KAAK,CAAC,GAAG,KAAK,WAAW,GACrB,OAAO,GAAG,CAAC,GACX,KAAK,CAAC,GAAG,KAAK,YAAY,GACxB,OAAO,GAAG,CAAC,GACX,KAAK,CAAC,GAAG,KAAK,MAAM,GAClB,CAAC,GACD,KAAK,CAAC,GAAG,KAAK,KAAK,GACjB,OAAO,CAAC,MAAM,GAAG,CAAC,GAClB,SAAS;IACrB,IAAI,MAAM,KAAK,SAAS,EAAE;IAC1B,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,OAAO,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;EAC9D,CAAC;EACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAwB,CACnD,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAI,CAAC,QAAQ,CAAC,GAAa,EAAE,CAAC,EACtD,GAAG,YAAY,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,GAAG,CAAC,CAC1C,CAAC;EACF,MAAM,SAAS,GAAI,GAAmB,IACpC,GAAG,KAAK,QAAQ,GAAG,aAAa,GAAI,YAAY,CAAC,IAAI,CAAE,KAAK,IAAK,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,kBAAmB;EAClH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;EAEtD;EACA,MAAM,MAAM,GAAI,KAAY,IAAyB;IACnD,MAAM,MAAM,GAAI,KAAK,CAAC,MAAM,EAAqB,OAAO,CAAc,oBAAoB,CAAC;IAC3F,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS;EAC/D,CAAC;;EAED;EACA,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,IAAe,EAAE,QAAsB;IAAA;IAAA,eAWtD,MAAM,IAAI,CAAC,IAAI,CAAC;IAAA,qBAExB,IAAI,CAAC,KAAK;IAAA;MAAA,UAXP,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;QAAA,OAKf,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAA,OACvB,MAAM,CAAC,IAAI,CAAC;QAAA,OACN,QAAQ,CAAC,CAAC;QAAA,OACf,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;IAAA;EAAA,IAKzD;EAED;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA,kBAuBqB,eAAe;IAAA,gBAJhB,KAAK,IAAK;MAClB,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;MACnC,cAAc,CAAC,KAAK,CAAC;IACvB,CAAC;IAAA,YAhBI,SAAS;IAAA,oDAAT,SAAS;IAAA,uCAKC,GAAG,EAAE,OAAO;IAAA,oCAKf,KAAK;IAAA,kCAUpB,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,gBAAgB;MAAA;MAAA;QAAA;UAAA;YAAA;UAAA,gBAUrB,SAAS;UAAA,aARb,aAAa;UAAA,sDAAb,aAAa;UAAA,sBAUQ,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;UAAA;YAAA,WAPhC,IAAI,CAAC,CAAC,CAAC,aAAa;cAAA,OAEjB,SAAS,CAAC,CAAC;cAAA,OACnB,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE;cAAA,OACvD,SAAS,CAAC,CAAC;YAAA;YAAA;YAAA;YAAA;YAAA;UAAA;YAAA;YAAA;YAAA;YAAA;UAAA;UAAA;UAAA;QAAA,wBAMnB,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,SAAS,CAAC,CAAC;UAAA;UAAA;YAAA;YAAA,mBAON,KAAK,IAAK;cACrB,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;YAChF,CAAC;YAAA,kBAHU,cAAc;YAAA,aAJpB,QAAQ;YAAA,sDAAR,QAAQ;YAAA,kCASZ,GAAG;cAAC,IAAI,EAAE,gBAAgB;cAAA,UACvB,KAAK;gBAAA;kBAAA;gBAAA,iBASM,MAAM;kBACb,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;kBAC/B,UAAU,CAAC,IAAI,CAAC;gBAClB,CAAC;gBAAA,oCAJU,KAAK;gBAAA,uBAMU,UAAU,CAAC,KAAK,CAAC;gBAAA;kBAAA,YAV7B,KAAK,KAAK,IAAI,CAAC,CAAC;oBAAA,QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;oBAAA,QAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;oBAAA,QACrB,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;kBAAA;kBAAA;kBAAA;kBAAA;kBAAA;gBAAA;kBAAA;kBAAA;kBAAA;kBAAA;gBAAA;gBAAA;gBAAA;cAAA;YAStC;YAAA,mDAvBS,IAAI,CAAC,CAAC,CAAC,aAAa;YAAA;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,mBA8BwE,eAAe;IAAA,aAArH,SAAS;IAAA,uDAAT,SAAS;IAAA,mCAChB,GAAG;MAAA,IAAC,IAAI;QAAA,OAAE,SAAS,CAAC,CAAC;MAAA;MAAA,UAClB,GAAG;QAAA;UAAA;QAAA,iBAQQ,MAAM,SAAS,CAAC,GAAG,CAAC;QAAA;UAAA,YALjB,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;YAAA,QAC5B,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;YAAA,QAChB,CAAC,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,GAAG,GAAG,MAAM,GAAG,SAAS;YAAA,QAC/D,GAAG,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAA,QAC1B,CAAC,KAAK,CAAC,CAAC;YAAA,QAGR,SAAS,CAAC,GAAG,CAAC;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA;QAAA;QAAA;MAAA;IAE3B;IAAA,kCAI2D,SAAS;IAAA,aAA/D,SAAS;IAAA,uDAAT,SAAS;IAAA,mCAChB,IAAI;MAAA,IACH,IAAI;QAAA,OAAE,KAAK,CAAC,CAAC;MAAA;MAAA,IACb,QAAQ;QAAA;UAAA;UAAA,mCAEH,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,MAAM,CAAC,CAAC;YAAA;YAAA,IACd,QAAQ;cAAA;gBAAA;gBAAA,uBAGuB,QAAQ,CAAC,CAAC,CAAC,OAAO;gBAAA;cAAA;YAAA;YAAA;cAAA;gBAAA;gBAAA,uBAI1C,IAAI,CAAC,CAAC,CAAC,eAAe;gBAAA;cAAA,wBAC5B,MAAM;gBAAC,IAAI;gBAAM,OAAO;gBAAU,OAAO,EAAE,IAAI;gBAAA;kBAAA,OAC7C,QAAQ,CAAC,CAAC,CAAC,KAAK;gBAAA;cAAA;YAAA;UAAA;UAAA;QAAA;MAAA;MAAA;QAAA;UAAA;YAAA;YAAA;YAAA;UAAA,qBAeT,KAAK,IAAK;YACtB;YACA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;UACzD,CAAC;UAAA,uBAPe,KAAK,IAAK;YACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;UACzG,CAAC;UAAA,6BAPG,GAAG,EAAE,OAAO;UAAA,mCAaf,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,SAAS,CAAC,CAAC;YAAA;YAAA;cAAA;cAAA,mCAElB,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,YAAY,CAAC,CAAC;gBAAA;gBAAA,UACtB,CAAC,KAAK,EAAE,UAAU;kBAAA;kBAAA,mCAKd,GAAG;oBAAC,IAAI,EAAE,KAAK;oBAAA,UAAG,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC,CAAC,GAAG,YAAY,GAAG,SAAS,CAAC,CAAC;kBAAC;kBAAA,+DAF7E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;kBAAA;gBAAA;cAIzE;cAAA,oDATyB,QAAQ,CAAC,CAAC,CAAC,aAAa;cAAA;YAAA;UAAA;UAAA,mCAcrD,GAAG;YAAA,IAAC,IAAI;cAAA,OAAE,MAAM,CAAC,CAAC;YAAA;YAAA,UAChB,CAAC,OAAO,EAAE,YAAY;cAAA;gBAAA;gBAAA;cAAA,uBAShB,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;cAAA,mCAG/B,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,KAAK;gBAAA;gBAAA,UACrB,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAI,SAAS,CAAC,CAAC;cAAC;cAAA;gBAAA,YAT7E,OAAO,CAAC,GAAG;kBAAA,QACZ,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE;kBAAA,QACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;kBAAA,QAErE,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA;cAAA;YAAA;UASlC;UAAA;YAAA,WA3CO,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW;cAAA,OAwBF,SAAS,CAAC,CAAC;YAAA;YAAA;YAAA;UAAA;YAAA;YAAA;UAAA;UAAA;UAAA;QAAA,wBAuBvD,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,wBAAS,CAAC,CAAC,OAAI,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;UAAA;UAAA;YAAA;YAAA,uBAE5C,IAAI,CAAC,CAAC,CAAC,cAAc;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,mCAO3B,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,UAAU,CAAC,CAAC;MAAA;MAAA,UACpB,IAAI;QAAA;QAAA,uBAE6C,IAAI,CAAC,CAAC,CAAC,KAAK;QAAA;MAAA;QAAA;QAAA,uBACb,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAA;MAAA,wBAC3D,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;QAAA;QAAA,UAAI,IAAI;UAAA;YAAA;YAAA;YAAA;YAAA;UAAA,iBAAoD,IAAI;UAAA;QAAA;MAAW;IAErH;IAAA;MAAA,YAtLK,oBAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,QAA2B,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW;QAAA,QAE9D,SAAS,CAAC,CAAC;QAAA,QAMxC,IAAI,CAAC,CAAC,CAAC,WAAW;QAAA,QAIP,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;QAAA,QACvD,IAAI,CAAC,CAAC,CAAC,WAAW;QAAA,QA8D4C,IAAI,CAAC,CAAC,CAAC,WAAW;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA,6CA1DtF,KAAK,CAAC,CAAC;IAAA;IAAA;EAAA;AA0K1B;AASA,MAAM,cAAc,GAAG,qDAAqD;AAC5E,MAAM,GAAG,GAAG,CAAC;AACb,MAAM,MAAM,GAAG,CAAC;;AAEhB;AACA;AACA;AACA;AACA,SAAS,kBAAkB,CAAC,KAA8B,EAAe;EACvE,IAAI,OAAmC;EACvC;EACA,IAAI,QAA4B,GAAG,IAAI;EACvC,IAAI,IAAI,GAAG,KAAK;EAChB;EACA,IAAI,aAAsC;EAC1C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAc,CAAC;EACrD,IAAI,cAAuC;EAC3C,IAAI,gBAA+B,GAAG,IAAI;EAC1C,MAAM,eAAe,GAAG,MAAM;IAC5B,IAAI,gBAAgB,KAAK,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,KAC3E,cAAc,EAAE,YAAY,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACpE,cAAc,GAAG,SAAS;EAC5B,CAAC;EAED,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE;IACzB;IACA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;MACvB,IAAI,CAAC,CAAC;MACN,KAAK,CAAC,OAAO,CAAC,CAAC;MACf;IACF;IACA;IACA,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc;IACtC,MAAM,IAAI,GAAG;MACX,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,IAAI,MAAM;MACxC,MAAM,EAAE,CAAC,QAAQ,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM;MACvF,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,IAAI,MAAM;MAC1C,KAAK,EAAE,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI;IACjF,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,4BAA4B,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAClG,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG;IAC9B,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK;IAClF;IACA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;IACnC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;IACpG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;EACrG,CAAC;EAED,MAAM,YAAY,GAAG,MAAM;IACzB;IACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa;IACtC,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;IACzE,IAAI,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC;EACxD,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,eAAe,CAAC,CAAC;IACjB,YAAY,CAAC,CAAC;IACd,IAAI,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,QAAQ,CAAC,SAAS,CAAC;EACrB,CAAC;EAED,MAAM,OAAO,GAAI,KAAmB,IAAK;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;IACtB,aAAa,GAAG,MAAM,IAAI,KAAK,CAAC,MAAM,YAAY,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS;EAC9G,CAAC;;EAED;EACA,MAAM,OAAO,GAAI,KAAiB,IAAK;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;IAClF,aAAa,GAAG,MAAM;IACtB,IAAI,CAAC,CAAC;IACN,KAAK,CAAC,OAAO,CAAC,CAAC;EACjB,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS;IACxC,OAAO,CAAC,MAAM;MACZ,IAAI,CAAC,MAAM,EAAE;QACX,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnB;MACF;MACA,IAAI,MAAM,KAAK,aAAa,EAAE;QAC5B;QACA,aAAa,GAAG,SAAS;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf;MACF;MACA,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE;MACpC;MACA,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;QACZ,QAAQ,GAAG,QAAQ,CAAC,aAAa,YAAY,WAAW,GAAG,QAAQ,CAAC,aAAa,GAAG,IAAI;QACxF,IAAI,GAAG,YAAY,CAAC,QAAQ,IAAI,MAAM,CAAC;MACzC;MACA,eAAe,CAAC,CAAC;MACjB,cAAc,GAAG,MAAM;MACvB,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC;MACvD,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;MAC5C,QAAQ,CAAC,MAAM,CAAC;MAChB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;MAC5D,KAAK,CAAC,CAAC;IACT,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACA,MAAM,QAAQ,GAAI,KAAY,IAAK;IACjC,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,IAAI,IAAI,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;EACjF,CAAC;EAED,OAAO,CAAC,MAAM;IACZ,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACxC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACxD,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACxD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;IACvD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;IACjD;IACA,MAAM,QAAQ,GAAG,OAAO,cAAc,KAAK,UAAU,IAAI,OAAO,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS;IACxG,IAAI,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC;IACvC,SAAS,CAAC,MAAM;MACd,QAAQ,EAAE,UAAU,CAAC,CAAC;MACtB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;MAC3C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;MACpD,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;MAC3D,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;MAC3D,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;MAC1D,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;MACpD,eAAe,CAAC,CAAC;MACjB,IAAI,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO;EAE9F;IAAA;IAAA,kCAKe,KAAK,IAAK;MACnB,IAAK,KAAK,CAAiB,QAAQ,KAAK,MAAM,EAAE;MAChD;MACA,IAAI,KAAK,CAAC,CAAC,EAAE;QACX,eAAe,CAAC,CAAC;QACjB,QAAQ,CAAC,SAAS,CAAC;QACnB,YAAY,CAAC,CAAC;QACd,KAAK,CAAC,OAAO,CAAC,CAAC;MACjB;MACA;MACA,UAAU,CAAC,MAAM;QACf,aAAa,GAAG,SAAS;MAC3B,CAAC,CAAC;IACJ,CAAC;IAAA,aAhBI,OAAO;IAAA,uDAAP,OAAO;IAAA,mCAkBX,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,CAAC;MAAA;MAAA;QAAA,yBAChB,gBAAgB;UACf,MAAM,EAAG,KAAK,IAAK;YACjB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YACnB,IAAI,CAAC,CAAC;YACN,KAAK,CAAC,OAAO,CAAC,CAAC;UACjB,CAAC;UAAA,IACD,MAAM;YAAA,OAAE,KAAK,CAAC,MAAM;UAAA;UAAA,IACpB,QAAQ;YAAA,OAAE,KAAK,CAAC,QAAQ;UAAA;UAAA,IACxB,gBAAgB;YAAA,OAAE,KAAK,CAAC,gBAAgB;UAAA;UAAA,IACxC,KAAK;YAAA,OAAE,KAAK,CAAC,KAAK;UAAA;UAAA;YAAA,OACX,KAAK,CAAC,KAAK;UAAA;UAAA,IAElB,SAAS;YAAA,OAAE,CAAC,SAAS,CAAC,CAAC;UAAA;UACvB,OAAO,EAAE,MAAM;YACb,IAAI,CAAC,CAAC;YACN,KAAK,CAAC,OAAO,CAAC,CAAC;UACjB;QAAC;MAAA;IAAA;IAAA;EAAA;AAKX;;AAEA;AACA,OAAO,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;EAAE,OAAO,EAAE;AAAmB,CAAC,CAAC;AAAC","ignoreList":[]}
|