solid-panes 5.1.0-1 → 5.1.0-3
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 +6 -0
- package/dist/RDFXMLPane2.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/cake.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/camera.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/circle-user-round.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/folder-open.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/help-circle.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/layout-dashboard.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/mail.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/map-pin.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/pencil.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/phone.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/settings-2.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/user-round-plus.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/user.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/users.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/x.esm.js +1 -2
- package/dist/audio/audioPane.esm.js +1 -2
- package/dist/classInstancePane.esm.js +1 -2
- package/dist/components/editor-card/EditorCard.cjs.js +1 -1
- package/dist/components/editor-card/EditorCard.cjs.js.map +1 -1
- package/dist/components/editor-card/EditorCard.esm.js +6 -7
- package/dist/components/editor-card/EditorCard.styles.esm.js +1 -2
- package/dist/components/header/Header.cjs.js +1 -1
- package/dist/components/header/Header.cjs.js.map +1 -1
- package/dist/components/header/Header.esm.js +7 -8
- package/dist/components/header/Header.styles.esm.js +1 -2
- package/dist/components/navbar/Navbar.cjs.js +2 -2
- package/dist/components/navbar/Navbar.cjs.js.map +1 -1
- package/dist/components/navbar/Navbar.esm.js +8 -9
- package/dist/components/navbar/Navbar.styles.esm.js +1 -2
- package/dist/components/profile-heading/ProfileHeading.cjs.js +17 -17
- package/dist/components/profile-heading/ProfileHeading.cjs.js.map +1 -1
- package/dist/components/profile-heading/ProfileHeading.esm.js +28 -29
- package/dist/components/profile-heading/ProfileHeading.esm.js.map +1 -1
- package/dist/components/profile-heading/ProfileHeading.styles.cjs.js +1 -1
- package/dist/components/profile-heading/ProfileHeading.styles.cjs.js.map +1 -1
- package/dist/components/profile-heading/ProfileHeading.styles.esm.js +2 -3
- package/dist/components/profile-heading/ProfileHeading.styles.esm.js.map +1 -1
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.cjs.js +1 -1
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.esm.js +2 -3
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/heading/mutations.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.esm.js +0 -1
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/shared/rowState.esm.js +1 -2
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.esm.js +1 -2
- package/dist/components/profile-heading/editor/textUtils.esm.js +1 -2
- package/dist/components/profile-heading/editor/texts/dialogTexts.esm.js +1 -2
- package/dist/components/profile-heading/editor/texts/messageTexts.esm.js +1 -2
- package/dist/components/profile-heading/editor/ui/dialog2.cjs.js +3 -3
- package/dist/components/profile-heading/editor/ui/dialog2.cjs.js.map +1 -1
- package/dist/components/profile-heading/editor/ui/dialog2.esm.js +4 -19
- package/dist/components/profile-heading/editor/ui/dialog2.esm.js.map +1 -1
- package/dist/components/profile-heading/editor/ui/spinner.esm.js +1 -2
- package/dist/components/profile-heading/editor/utils/errorDisplay.esm.js +1 -2
- package/dist/components/profile-heading/friendActions.esm.js +1 -2
- package/dist/components/profile-heading/profileHeadingData.esm.js +1 -2
- package/dist/dashboard/basicPreferences.esm.js +1 -2
- package/dist/dashboard/dashboardPane.esm.js +0 -1
- package/dist/dashboard/homepage.esm.js +1 -2
- package/dist/dashboard/ontologyData.esm.js +1 -2
- package/dist/dashboard/preferencesFormText.esm.js +1 -2
- package/dist/dataContentPane2.cjs.js +1 -1
- package/dist/dataContentPane2.esm.js +2 -3
- package/dist/defaultPane2.cjs.js +1 -1
- package/dist/defaultPane2.esm.js +2 -3
- package/dist/dokieli/dokieliPane.cjs.js +1 -1
- package/dist/dokieli/dokieliPane.cjs.js.map +1 -1
- package/dist/dokieli/dokieliPane.esm.js +7 -12
- package/dist/dokieli/dokieliPane.esm.js.map +1 -1
- package/dist/dokieli/new.esm.js +1 -2
- package/dist/form/pane.esm.js +1 -2
- package/dist/home/homePane.esm.js +1 -2
- package/dist/humanReadablePane.d.ts +3 -0
- package/dist/humanReadablePane.d.ts.map +1 -1
- package/dist/humanReadablePane2.cjs.js +276 -1
- package/dist/humanReadablePane2.cjs.js.map +1 -1
- package/dist/humanReadablePane2.esm.js +428 -31
- package/dist/humanReadablePane2.esm.js.map +1 -1
- package/dist/icons/folder.esm.js +1 -2
- package/dist/icons/friends.esm.js +1 -2
- package/dist/icons/person.esm.js +1 -2
- package/dist/imagePane.d.ts.map +1 -1
- package/dist/imagePane2.cjs.js +1 -1
- package/dist/imagePane2.cjs.js.map +1 -1
- package/dist/imagePane2.esm.js +2 -3
- package/dist/imagePane2.esm.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +17 -17
- package/dist/index.esm.js.map +1 -1
- package/dist/internal/internalPane2.cjs.js +1 -1
- package/dist/internal/internalPane2.esm.js +2 -3
- package/dist/mainPage/header.esm.js +1 -2
- package/dist/mainPage/index.cjs.js +1 -1
- package/dist/mainPage/index.cjs.js.map +1 -1
- package/dist/mainPage/index.d.ts +1 -1
- package/dist/mainPage/index.d.ts.map +1 -1
- package/dist/mainPage/index.esm.js +42 -27
- package/dist/mainPage/index.esm.js.map +1 -1
- package/dist/mainPage/navbar.esm.js +1 -2
- package/dist/mainPage/navigation.cjs.js +1 -1
- package/dist/mainPage/navigation.cjs.js.map +1 -1
- package/dist/mainPage/navigation.d.ts.map +1 -1
- package/dist/mainPage/navigation.esm.js +14 -11
- package/dist/mainPage/navigation.esm.js.map +1 -1
- package/dist/mainPage/profileHeading.d.ts +2 -1
- package/dist/mainPage/profileHeading.d.ts.map +1 -1
- package/dist/mainPage/profileHeading2.cjs.js +1 -1
- package/dist/mainPage/profileHeading2.cjs.js.map +1 -1
- package/dist/mainPage/profileHeading2.esm.js +76 -77
- package/dist/mainPage/profileHeading2.esm.js.map +1 -1
- package/dist/n3Pane2.esm.js +1 -2
- package/dist/navigation/browserEvents.esm.js +1 -2
- package/dist/navigation/chrome.cjs.js +1 -1
- package/dist/navigation/chrome.cjs.js.map +1 -1
- package/dist/navigation/chrome.d.ts +20 -2
- package/dist/navigation/chrome.d.ts.map +1 -1
- package/dist/navigation/chrome.esm.js +15 -10
- package/dist/navigation/chrome.esm.js.map +1 -1
- package/dist/navigation/controller.cjs.js +1 -1
- package/dist/navigation/controller.cjs.js.map +1 -1
- package/dist/navigation/controller.d.ts +3 -0
- package/dist/navigation/controller.d.ts.map +1 -1
- package/dist/navigation/controller.esm.js +50 -30
- package/dist/navigation/controller.esm.js.map +1 -1
- package/dist/navigation/events.esm.js +1 -2
- package/dist/navigation/navbarVisibility.esm.js +1 -2
- package/dist/navigation/options.cjs.js +1 -1
- package/dist/navigation/options.cjs.js.map +1 -1
- package/dist/navigation/options.d.ts +12 -0
- package/dist/navigation/options.d.ts.map +1 -1
- package/dist/navigation/options.esm.js +5 -3
- package/dist/navigation/options.esm.js.map +1 -1
- package/dist/navigation/podContext.cjs.js +1 -1
- package/dist/navigation/podContext.cjs.js.map +1 -1
- package/dist/navigation/podContext.d.ts.map +1 -1
- package/dist/navigation/podContext.esm.js +15 -16
- package/dist/navigation/podContext.esm.js.map +1 -1
- package/dist/navigation/state.esm.js +1 -2
- package/dist/outline/context.esm.js +1 -2
- package/dist/outline/fileExplorerHelpers.cjs.js +2 -0
- package/dist/outline/fileExplorerHelpers.cjs.js.map +1 -0
- package/dist/outline/fileExplorerHelpers.d.ts +13 -0
- package/dist/outline/fileExplorerHelpers.d.ts.map +1 -0
- package/dist/outline/fileExplorerHelpers.esm.js +24 -0
- package/dist/outline/fileExplorerHelpers.esm.js.map +1 -0
- package/dist/outline/manager2.cjs.js +1 -1
- package/dist/outline/manager2.cjs.js.map +1 -1
- package/dist/outline/manager2.esm.js +457 -437
- package/dist/outline/manager2.esm.js.map +1 -1
- package/dist/outline/outlineDomHelpers.cjs.js +2 -0
- package/dist/outline/outlineDomHelpers.cjs.js.map +1 -0
- package/dist/outline/outlineDomHelpers.d.ts +30 -0
- package/dist/outline/outlineDomHelpers.d.ts.map +1 -0
- package/dist/outline/outlineDomHelpers.esm.js +79 -0
- package/dist/outline/outlineDomHelpers.esm.js.map +1 -0
- package/dist/outline/outlineIcons.esm.js +1 -2
- package/dist/outline/propertyViews.esm.js +1 -2
- package/dist/outline/queryByExample.cjs.js.map +1 -1
- package/dist/outline/queryByExample.esm.js +1 -2
- package/dist/outline/queryByExample.esm.js.map +1 -1
- package/dist/outline/userInput.cjs.js +9 -9
- package/dist/outline/userInput.cjs.js.map +1 -1
- package/dist/outline/userInput.esm.js +50 -40
- package/dist/outline/userInput.esm.js.map +1 -1
- package/dist/outline/viewAsImage.esm.js +1 -2
- package/dist/outline/viewAsMbox.esm.js +1 -2
- package/dist/pad/padPane2.cjs.js +1 -1
- package/dist/pad/padPane2.esm.js +2 -3
- package/dist/playlist/playlistPane.esm.js +1 -2
- package/dist/registerPanes.esm.js +1 -2
- package/dist/schedule/formsForSchedule.esm.js +1 -2
- package/dist/schedule/schedulePane.d.ts.map +1 -1
- package/dist/schedule/schedulePane2.cjs.js +1 -1
- package/dist/schedule/schedulePane2.cjs.js.map +1 -1
- package/dist/schedule/schedulePane2.esm.js +60 -59
- package/dist/schedule/schedulePane2.esm.js.map +1 -1
- package/dist/sharing/sharingPane.esm.js +1 -2
- package/dist/slideshow/slideshowPane.esm.js +1 -2
- package/dist/social/editProfileDetails.cjs.js +1 -1
- package/dist/social/editProfileDetails.esm.js +1 -2
- package/dist/social/icons.esm.js +1 -2
- package/dist/social/socialPane2.esm.js +1 -2
- package/dist/social/socialSections.esm.js +1 -2
- package/dist/social/triage.esm.js +1 -2
- package/dist/tabbed/tabbedPane.esm.js +1 -2
- package/dist/tableViewPane.esm.js +1 -2
- package/dist/transaction/pane.esm.js +1 -2
- package/dist/transaction/period.esm.js +1 -2
- package/dist/trip/tripPane.esm.js +1 -2
- package/dist/trustedApplications/trustedApplications.dom.esm.js +1 -2
- package/dist/trustedApplications/trustedApplications.utils.esm.js +1 -2
- package/dist/trustedApplications/trustedApplications.view.esm.js +1 -2
- package/dist/ui/pane.esm.js +1 -2
- package/dist/utils/paneUtils.cjs.js +1 -1
- package/dist/utils/paneUtils.cjs.js.map +1 -1
- package/dist/utils/paneUtils.d.ts +5 -3
- package/dist/utils/paneUtils.d.ts.map +1 -1
- package/dist/utils/paneUtils.esm.js +36 -29
- package/dist/utils/paneUtils.esm.js.map +1 -1
- package/dist/utils/podUtils.cjs.js +1 -1
- package/dist/utils/podUtils.cjs.js.map +1 -1
- package/dist/utils/podUtils.d.ts +9 -1
- package/dist/utils/podUtils.d.ts.map +1 -1
- package/dist/utils/podUtils.esm.js +22 -95
- package/dist/utils/podUtils.esm.js.map +1 -1
- package/dist/utils/viewerUtils.esm.js +1 -2
- package/dist/utils/webIdUtils.esm.js +1 -2
- package/dist/versionInfo.cjs.js +1 -1
- package/dist/versionInfo.cjs.js.map +1 -1
- package/dist/versionInfo.esm.js +4 -5
- package/dist/versionInfo.esm.js.map +1 -1
- package/dist/video/videoPane.esm.js +1 -2
- package/package.json +7 -6
- package/dist/_virtual/~icons/lucide/arrow-left.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/arrow-left.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/arrow-left.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/arrow-left.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/ellipsis-vertical.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/ellipsis-vertical.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/ellipsis-vertical.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/ellipsis-vertical.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/folder.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/folder.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/folder.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/folder.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/globe.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/globe.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/globe.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/globe.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/lock-keyhole.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/lock-keyhole.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/lock-keyhole.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/lock-keyhole.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/share-2.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/share-2.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/share-2.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/share-2.esm.js.map +0 -1
- package/dist/_virtual/~icons/lucide/user-round-cog.cjs.js +0 -2
- package/dist/_virtual/~icons/lucide/user-round-cog.cjs.js.map +0 -1
- package/dist/_virtual/~icons/lucide/user-round-cog.esm.js +0 -11
- package/dist/_virtual/~icons/lucide/user-round-cog.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js +0 -14
- package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.d.ts +0 -18
- package/dist/components/file-explorer-header/FileExplorerHeader.d.ts.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.esm.js +0 -292
- package/dist/components/file-explorer-header/FileExplorerHeader.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.styles.cjs.js +0 -2
- package/dist/components/file-explorer-header/FileExplorerHeader.styles.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.styles.esm.js +0 -7
- package/dist/components/file-explorer-header/FileExplorerHeader.styles.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +0 -32
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.d.ts +0 -21
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.d.ts.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +0 -294
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.cjs.js +0 -2
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.esm.js +0 -7
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +0 -34
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.d.ts +0 -20
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.d.ts.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +0 -346
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.cjs.js +0 -2
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.esm.js +0 -7
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js +0 -13
- package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.d.ts +0 -36
- package/dist/components/file-explorer-header/FileExplorerProvider.d.ts.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.esm.js +0 -470
- package/dist/components/file-explorer-header/FileExplorerProvider.esm.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.styles.cjs.js +0 -2
- package/dist/components/file-explorer-header/FileExplorerProvider.styles.cjs.js.map +0 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.styles.esm.js +0 -7
- package/dist/components/file-explorer-header/FileExplorerProvider.styles.esm.js.map +0 -1
- package/dist/components/file-explorer-header/index.cjs.js +0 -1
- package/dist/components/file-explorer-header/index.d.ts +0 -3
- package/dist/components/file-explorer-header/index.d.ts.map +0 -1
- package/dist/components/file-explorer-header/index.esm.js +0 -2
- package/dist/components/file-explorer-header/types.d.ts +0 -10
- package/dist/components/file-explorer-header/types.d.ts.map +0 -1
- package/dist/components/resource-actions-menu/DeleteResourceDialog.d.ts +0 -8
- package/dist/components/resource-actions-menu/DeleteResourceDialog.d.ts.map +0 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +0 -32
- package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +0 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts +0 -19
- package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts.map +0 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +0 -322
- package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js.map +0 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.cjs.js +0 -2
- package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.cjs.js.map +0 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.esm.js +0 -7
- package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.esm.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sanitizeTextValue as e } from "../../textUtils.esm.js";
|
|
2
|
-
|
|
2
|
+
// src/components/profile-heading/editor/sections/shared/sanitizeUtils.ts
|
|
3
3
|
function t(t) {
|
|
4
4
|
return e(t).replace(/\s+/g, "");
|
|
5
5
|
}
|
|
@@ -12,7 +12,6 @@ function r(t) {
|
|
|
12
12
|
function i(t) {
|
|
13
13
|
return e(t);
|
|
14
14
|
}
|
|
15
|
-
//#endregion
|
|
16
15
|
export { r as sanitizeAddressFieldValue, i as sanitizeBasicInputFieldValue, t as sanitizeEmailValue, n as sanitizePhoneLocalValue };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=sanitizeUtils.esm.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/components/profile-heading/editor/textUtils.ts
|
|
2
2
|
function e(e) {
|
|
3
3
|
if (!e) return "";
|
|
4
4
|
if (typeof e == "string") return e;
|
|
@@ -20,7 +20,6 @@ function n(e) {
|
|
|
20
20
|
function r(e) {
|
|
21
21
|
return !!(e && e.trim() !== "");
|
|
22
22
|
}
|
|
23
|
-
//#endregion
|
|
24
23
|
export { r as hasNonEmptyText, n as sanitizeTextValue, e as toText, t as toTypeLabel };
|
|
25
24
|
|
|
26
25
|
//# sourceMappingURL=textUtils.esm.js.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
// src/components/profile-heading/editor/texts/dialogTexts.ts
|
|
2
2
|
var e = "Edit Heading", t = "Save Changes", n = "Cancel";
|
|
3
|
-
//#endregion
|
|
4
3
|
export { n as dialogCancelLabelText, t as dialogSubmitLabelText, e as editHeadingDialogTitleText };
|
|
5
4
|
|
|
6
5
|
//# sourceMappingURL=dialogTexts.esm.js.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
// src/components/profile-heading/editor/texts/messageTexts.ts
|
|
2
2
|
var e = "You need to log in as the profile owner to save contact updates.", t = "Unable to save your heading information.", n = "Heading mutation save failed", r = "Store does not support updates", i = "Failed to save updates";
|
|
3
|
-
//#endregion
|
|
4
3
|
export { i as fallbackSaveUpdatesErrorMessageText, n as headingMutationSaveFailedDebugText, e as ownerLoginRequiredDialogMessageText, t as saveHeadingUpdatesFailedMessageText, r as updaterUnsupportedStoreErrorMessageText };
|
|
5
4
|
|
|
6
5
|
//# sourceMappingURL=messageTexts.esm.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`#profile-modal .modal:has(#modal-desc>.profile__edit-form solid-ui-combobox:focus-within) #modal-desc{padding-bottom:calc(var(--profile-modal-panel-inline-padding) + 30px)}@media (width<=576px){#profile-modal{--profile-modal-panel-max-height:calc(100dvh - 4 * 15px);padding-top:max(15px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(15px, env(safe-area-inset-bottom));place-items:center;padding-left:0}#profile-modal .modal{width:var(--profile-modal-panel-width);max-width:var(--profile-modal-panel-max-width);overscroll-behavior:contain;border-radius:5px;place-self:center;min-width:0;margin:0;padding:0}#profile-modal .modal .modal-header{gap:25px;padding:15px}#profile-modal .modal #modal-title{font-size:var(--solid-ui-font-size-lg,1.125rem);line-height:1.4}#profile-modal .modal #modal-desc{padding:15px 15px 25px}#profile-modal #modal-buttons{justify-content:flex-end;align-items:center;gap:var(--profile-modal-button-gap);padding:var(--profile-modal-compact-padding);flex-direction:row;width:100%}#profile-modal #modal-buttons>solid-ui-button{flex:1 0 0;width:auto;min-width:0}}html[data-layout=mobile] #profile-modal{--profile-modal-panel-max-height:calc(100dvh - 4 * 15px);padding-top:max(15px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(15px, env(safe-area-inset-bottom));place-items:center;padding-left:0}html[data-layout=mobile] #profile-modal .modal{width:var(--profile-modal-panel-width);height:auto;max-height:var(--profile-modal-panel-max-height);max-width:var(--profile-modal-panel-max-width);overscroll-behavior:contain;border-radius:5px;place-self:center;min-width:0;margin:0;padding:0}html[data-layout=mobile] #profile-modal .modal .modal-header{gap:25px;padding:15px}html[data-layout=mobile] #profile-modal .modal #modal-title{font-size:var(--solid-ui-font-size-lg,1.125rem);line-height:1.4}html[data-layout=mobile] #profile-modal .modal #modal-desc{padding:15px 15px 25px}html[data-layout=mobile] #profile-modal #modal-buttons{justify-content:flex-end;align-items:center;gap:var(--profile-modal-button-gap);padding:var(--profile-modal-compact-padding);flex-direction:row;width:100%}html[data-layout=mobile] #profile-modal #modal-buttons>solid-ui-button{flex:1 0 0;width:auto;min-width:0}#profile-modal{--profile-modal-backdrop:var(--overlay-bg-muted,#00000080);--profile-modal-panel-inline-padding:25px;--profile-modal-panel-block-padding:20px;--profile-modal-compact-padding:15px;--profile-modal-button-gap:15px;--profile-modal-error-padding:12px;--profile-modal-panel-width:min(600px, calc(100vw - 32px));--profile-modal-panel-max-width:600px;--profile-modal-panel-max-height:calc(100dvh - 32px);background:var(--profile-modal-backdrop);z-index:9999;overscroll-behavior:contain;width:100%;max-width:none;height:100%;max-height:none;padding:0;padding-top:max(25px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(25px, env(safe-area-inset-bottom));border:none;place-items:center;margin:0;padding-left:0;display:grid;position:fixed;inset:0;overflow:hidden}#profile-modal:not([open]){display:none}#profile-modal::backdrop{background:var(--profile-modal-backdrop)}#profile-modal .modal{box-sizing:border-box;background:var(--color-background);max-width:var(--profile-modal-panel-max-width);width:var(--profile-modal-panel-width);max-height:var(--profile-modal-panel-max-height);box-shadow:var(--box-shadow-modal,0 2px 10px #0000004d);border-radius:5px;grid-template-rows:auto minmax(0,1fr) auto auto;place-self:center;margin:0;display:grid;position:relative;overflow:hidden}#profile-modal .modal .modal-header{gap:var(--spacing-lg);width:100%;min-width:0;padding:var(--profile-modal-panel-block-padding) var(--profile-modal-panel-inline-padding);box-sizing:border-box;border-bottom:1px solid var(--solid-ui-color-slate-200,#e2e8f0);background:var(--solid-ui-color-slate-50,#f8fafc);border-radius:5px 5px 0 0}#profile-modal .modal #modal-desc{overscroll-behavior:contain;width:100%;min-width:0;min-height:0;padding:var(--profile-modal-panel-inline-padding);box-sizing:border-box;overflow:auto}#profile-modal .modal #modal-desc:has(>.profile__edit-form--projects){padding:10px var(--profile-modal-panel-inline-padding)}#profile-modal .modal #modal-desc:has(>#contacts-addressbook-picker-dialog){padding-top:0}#profile-modal #modal-desc>.profile__edit-form--projects{flex-direction:column;gap:10px;display:flex}#profile-modal .modal #modal-title{color:var(--color-text-subheading,var(--gray-900,#101828));margin:0}:is(#profile-modal .modal:has(#modal-desc>.profile__edit-form--projects) #modal-header-action,#profile-modal .modal:has(#modal-desc>.profile__edit-form--contact-info) #modal-header-action){display:none}#profile-modal #modal-buttons{width:100%;min-width:0;padding:var(--profile-modal-panel-block-padding) calc(var(--profile-modal-panel-inline-padding) + var(--spacing-xxs,.3125rem)) var(--profile-modal-compact-padding);gap:var(--profile-modal-button-gap);box-sizing:border-box;border-top:1px solid var(--solid-ui-color-slate-200,#e2e8f0);background:var(--color-surface-tertiary,var(--gray-50,#f9fafb));align-self:stretch}#profile-modal #modal-buttons[hidden]{display:none!important}#profile-modal #modal-buttons>solid-ui-button{width:10.8rem}#profile-modal .modal__error-section{margin-top:var(--spacing-sm);padding:var(--profile-modal-error-padding);border:1px solid var(--dialog-error-border,var(--pink-700,#ff98b3));background:var(--dialog-error-background,var(--pink-500,#ffdde6));color:var(--solid-ui-color-error,#b00020);text-align:center;white-space:pre-wrap;overflow-wrap:anywhere;border-radius:5px;margin-bottom:0}#profile-modal .modal__error-section[hidden]{display:none!important}#profile-modal #modal-saving-overlay{z-index:10;background:#ffffffc7;place-items:center;display:grid;position:absolute;inset:0}#profile-modal #modal-saving-overlay[hidden]{display:none}#profile-modal.modal--saving #modal-desc{opacity:.45;pointer-events:none}#profile-modal .modal__saving-indicator{gap:0}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();require("../../../../_virtual/~icons/lucide/x.cjs.js");const e=require("./spinner.cjs.js"),t=require("../utils/errorDisplay.cjs.js");require("
|
|
1
|
+
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`#profile-modal .modal:has(#modal-desc>.profile__edit-form solid-ui-combobox:focus-within) #modal-desc{padding-bottom:calc(var(--profile-modal-panel-inline-padding) + 30px)}@media (width<=576px){#profile-modal{--profile-modal-panel-max-height:calc(100dvh - 4 * 15px);padding-top:max(15px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(15px, env(safe-area-inset-bottom));place-items:center;padding-left:0}#profile-modal .modal{width:var(--profile-modal-panel-width);max-width:var(--profile-modal-panel-max-width);overscroll-behavior:contain;border-radius:5px;place-self:center;min-width:0;margin:0;padding:0}#profile-modal .modal .modal-header{gap:25px;padding:15px}#profile-modal .modal #modal-title{font-size:var(--solid-ui-font-size-lg,1.125rem);line-height:1.4}#profile-modal .modal #modal-desc{padding:15px 15px 25px}#profile-modal #modal-buttons{justify-content:flex-end;align-items:center;gap:var(--profile-modal-button-gap);padding:var(--profile-modal-compact-padding);flex-direction:row;width:100%}#profile-modal #modal-buttons>solid-ui-button{flex:1 0 0;width:auto;min-width:0}}html[data-layout=mobile] #profile-modal{--profile-modal-panel-max-height:calc(100dvh - 4 * 15px);padding-top:max(15px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(15px, env(safe-area-inset-bottom));place-items:center;padding-left:0}html[data-layout=mobile] #profile-modal .modal{width:var(--profile-modal-panel-width);height:auto;max-height:var(--profile-modal-panel-max-height);max-width:var(--profile-modal-panel-max-width);overscroll-behavior:contain;border-radius:5px;place-self:center;min-width:0;margin:0;padding:0}html[data-layout=mobile] #profile-modal .modal .modal-header{gap:25px;padding:15px}html[data-layout=mobile] #profile-modal .modal #modal-title{font-size:var(--solid-ui-font-size-lg,1.125rem);line-height:1.4}html[data-layout=mobile] #profile-modal .modal #modal-desc{padding:15px 15px 25px}html[data-layout=mobile] #profile-modal #modal-buttons{justify-content:flex-end;align-items:center;gap:var(--profile-modal-button-gap);padding:var(--profile-modal-compact-padding);flex-direction:row;width:100%}html[data-layout=mobile] #profile-modal #modal-buttons>solid-ui-button{flex:1 0 0;width:auto;min-width:0}#profile-modal{--profile-modal-backdrop:var(--overlay-bg-muted,#00000080);--profile-modal-panel-inline-padding:25px;--profile-modal-panel-block-padding:20px;--profile-modal-compact-padding:15px;--profile-modal-button-gap:15px;--profile-modal-error-padding:12px;--profile-modal-panel-width:min(600px, calc(100vw - 32px));--profile-modal-panel-max-width:600px;--profile-modal-panel-max-height:calc(100dvh - 32px);background:var(--profile-modal-backdrop);z-index:9999;overscroll-behavior:contain;width:100%;max-width:none;height:100%;max-height:none;padding:0;padding-top:max(25px, env(safe-area-inset-top));padding-right:0;padding-bottom:max(25px, env(safe-area-inset-bottom));border:none;place-items:center;margin:0;padding-left:0;display:grid;position:fixed;inset:0;overflow:hidden}#profile-modal:not([open]){display:none}#profile-modal::backdrop{background:var(--profile-modal-backdrop)}#profile-modal .modal{box-sizing:border-box;background:var(--color-background);max-width:var(--profile-modal-panel-max-width);width:var(--profile-modal-panel-width);max-height:var(--profile-modal-panel-max-height);box-shadow:var(--box-shadow-modal,0 2px 10px #0000004d);border-radius:5px;grid-template-rows:auto minmax(0,1fr) auto auto;place-self:center;margin:0;display:grid;position:relative;overflow:hidden}#profile-modal .modal .modal-header{gap:var(--spacing-lg);width:100%;min-width:0;padding:var(--profile-modal-panel-block-padding) var(--profile-modal-panel-inline-padding);box-sizing:border-box;border-bottom:1px solid var(--solid-ui-color-slate-200,#e2e8f0);background:var(--solid-ui-color-slate-50,#f8fafc);border-radius:5px 5px 0 0}#profile-modal .modal #modal-desc{overscroll-behavior:contain;width:100%;min-width:0;min-height:0;padding:var(--profile-modal-panel-inline-padding);box-sizing:border-box;overflow:auto}#profile-modal .modal #modal-desc:has(>.profile__edit-form--projects){padding:10px var(--profile-modal-panel-inline-padding)}#profile-modal .modal #modal-desc:has(>#contacts-addressbook-picker-dialog){padding-top:0}#profile-modal #modal-desc>.profile__edit-form--projects{flex-direction:column;gap:10px;display:flex}#profile-modal .modal #modal-title{color:var(--color-text-subheading,var(--gray-900,#101828));margin:0}:is(#profile-modal .modal:has(#modal-desc>.profile__edit-form--projects) #modal-header-action,#profile-modal .modal:has(#modal-desc>.profile__edit-form--contact-info) #modal-header-action){display:none}#profile-modal #modal-buttons{width:100%;min-width:0;padding:var(--profile-modal-panel-block-padding) calc(var(--profile-modal-panel-inline-padding) + var(--spacing-xxs,.3125rem)) var(--profile-modal-compact-padding);gap:var(--profile-modal-button-gap);box-sizing:border-box;border-top:1px solid var(--solid-ui-color-slate-200,#e2e8f0);background:var(--color-surface-tertiary,var(--gray-50,#f9fafb));align-self:stretch}#profile-modal #modal-buttons[hidden]{display:none!important}#profile-modal #modal-buttons>solid-ui-button{width:10.8rem}#profile-modal .modal__error-section{margin-top:var(--spacing-sm);padding:var(--profile-modal-error-padding);border:1px solid var(--dialog-error-border,var(--pink-700,#ff98b3));background:var(--dialog-error-background,var(--pink-500,#ffdde6));color:var(--solid-ui-color-error,#b00020);text-align:center;white-space:pre-wrap;overflow-wrap:anywhere;border-radius:5px;margin-bottom:0}#profile-modal .modal__error-section[hidden]{display:none!important}#profile-modal #modal-saving-overlay{z-index:10;background:#ffffffc7;place-items:center;display:grid;position:absolute;inset:0}#profile-modal #modal-saving-overlay[hidden]{display:none}#profile-modal.modal--saving #modal-desc{opacity:.45;pointer-events:none}#profile-modal .modal__saving-indicator{gap:0}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();require("../../../../_virtual/~icons/lucide/x.cjs.js");const e=require("./spinner.cjs.js"),t=require("../utils/errorDisplay.cjs.js");let n=require("lit-html");require("solid-ui/components/button");var r=n.html`<icon-lucide-x aria-hidden="true" focusable="false" style="width:12px;height:12px;color:#667085"></icon-lucide-x>`,i=null,a=new WeakMap;function o(e){return e instanceof HTMLElement?e:e instanceof Node?e.parentElement:null}function s(e){return typeof e.composedPath==`function`?e.composedPath():e.target?[e.target]:[]}function c(e){let t=s(e),n=i?.querySelector(`#modal-desc`);if(n&&t.includes(n)||i&&t.includes(i))return!0;let r=o(e.target);return!r||!i||!i.contains(r)?!1:!!r.closest(`#modal-desc`)}function l(e){let t=a.get(e);return t||(t={count:0,previousHtmlOverflow:e.documentElement.style.overflow,previousBodyOverflow:e.body.style.overflow,removeScrollGuard:null},a.set(e,t)),t}function u(e){let t=l(e);if(t.removeScrollGuard)return;let n=e=>{c(e)||e.preventDefault()};e.addEventListener(`wheel`,n,{capture:!0,passive:!1}),e.addEventListener(`touchmove`,n,{capture:!0,passive:!1}),t.removeScrollGuard=()=>{e.removeEventListener(`wheel`,n,!0),e.removeEventListener(`touchmove`,n,!0),t.removeScrollGuard=null}}function d(e){let t=l(e);t.count===0&&(t.previousHtmlOverflow=e.documentElement.style.overflow,t.previousBodyOverflow=e.body.style.overflow,e.documentElement.style.overflow=`hidden`,e.body.style.overflow=`hidden`,u(e)),t.count+=1}function f(e){let t=l(e);t.count!==0&&(--t.count,!(t.count>0)&&(e.documentElement.style.overflow=t.previousHtmlOverflow,e.body.style.overflow=t.previousBodyOverflow,t.removeScrollGuard?.(),t.removeScrollGuard=null))}function p(e){return e.body}function m(e){return e?.tagName===`SOLID-UI-BUTTON`}function h(e,t){e&&(e.disabled=t,e.toggleAttribute(`disabled`,t))}function g(e,t){e&&(m(e)&&(e.label=t,e.setAttribute(`label`,t)),e.textContent=t)}function _(e){return e.querySelector(`#modal-buttons [data-dialog-primary="true"]`)}function v(e){return e.querySelector(`#modal-buttons [data-cancel="true"]`)}function y(e){let t=p(e);return i&&e.body.contains(i)?(i.parentElement!==t&&t.appendChild(i),i):(i=null,i=e.createElement(`dialog`),i.id=`profile-modal`,i.setAttribute(`aria-modal`,`true`),i.setAttribute(`aria-labelledby`,`modal-title`),i.setAttribute(`aria-describedby`,`modal-desc`),i.innerHTML=`
|
|
2
2
|
<div class="modal">
|
|
3
3
|
<div class="modal-header flex-row align-center justify-between">
|
|
4
4
|
<h2 id="modal-title"></h2>
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
<div id="modal-buttons" class="flex-row align-center justify-end"></div>
|
|
10
10
|
<div id="modal-saving-overlay" hidden></div>
|
|
11
11
|
</div>
|
|
12
|
-
`,t.appendChild(i),i)}function b(e){return{dialog:e,title:e.querySelector(`#modal-title`),headerAction:e.querySelector(`#modal-header-action`),description:e.querySelector(`#modal-desc`),error:e.querySelector(`#modal-error`),buttons:e.querySelector(`#modal-buttons`),savingOverlay:e.querySelector(`#modal-saving-overlay`)}}function x(e){let t=`modal-desc`,n=e.error.hidden||!e.error.textContent?.trim()?t:`${t} modal-error`;e.dialog.setAttribute(`aria-describedby`,n)}function S(e){e.error.textContent=``,e.error.setAttribute(`aria-hidden`,`true`),e.error.hidden=!0,x(e)}function C(e,n,r){e.error.textContent=t.formatDisplayError(n,r),e.error.setAttribute(`aria-hidden`,`false`),e.error.hidden=!1,x(e)}function w(e){if(d(e.ownerDocument),typeof e.showModal==`function`)try{e.open||e.showModal();return}catch{}e.setAttribute(`open`,``)}function T(e){try{if(typeof e.close==`function`&&e.open){e.close();return}e.removeAttribute(`open`)}finally{f(e.ownerDocument)}}function E(e){return!!e.querySelector(`[data-layout='mobile']`)}function D(e){return!(e.hasAttribute(`disabled`)||e.getAttribute(`aria-hidden`)===`true`||e.getAttribute(`hidden`)!==null||e.tabIndex<0)}function O(e){let t=e.querySelectorAll(
|
|
12
|
+
`,t.appendChild(i),i)}function b(e){return{dialog:e,title:e.querySelector(`#modal-title`),headerAction:e.querySelector(`#modal-header-action`),description:e.querySelector(`#modal-desc`),error:e.querySelector(`#modal-error`),buttons:e.querySelector(`#modal-buttons`),savingOverlay:e.querySelector(`#modal-saving-overlay`)}}function x(e){let t=`modal-desc`,n=e.error.hidden||!e.error.textContent?.trim()?t:`${t} modal-error`;e.dialog.setAttribute(`aria-describedby`,n)}function S(e){e.error.textContent=``,e.error.setAttribute(`aria-hidden`,`true`),e.error.hidden=!0,x(e)}function C(e,n,r){e.error.textContent=t.formatDisplayError(n,r),e.error.setAttribute(`aria-hidden`,`false`),e.error.hidden=!1,x(e)}function w(e){if(d(e.ownerDocument),typeof e.showModal==`function`)try{e.open||e.showModal();return}catch{}e.setAttribute(`open`,``)}function T(e){try{if(typeof e.close==`function`&&e.open){e.close();return}e.removeAttribute(`open`)}finally{f(e.ownerDocument)}}function E(e){return!!e.querySelector(`[data-layout='mobile']`)}function D(e){return!(e.hasAttribute(`disabled`)||e.getAttribute(`aria-hidden`)===`true`||e.getAttribute(`hidden`)!==null||e.tabIndex<0)}function O(e){let t=e.querySelectorAll(`input:not([type="hidden"]):not([disabled]),textarea:not([disabled]),select:not([disabled]),solid-ui-select:not([disabled]),solid-ui-combobox:not([disabled]),[contenteditable="true"],button:not([disabled]),solid-ui-button:not([disabled]),[tabindex]:not([tabindex="-1"])`);for(let e of t)if(e instanceof HTMLElement&&D(e))return e;return null}function k(e,t,n){if(E(e.ownerDocument)){e.tabIndex=-1,e.focus();return}let r=O(t);if(r){r.focus(),(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement)&&r.select();return}let i=O(n);i&&i.focus()}function A(e){let t=new FormData(e),n={};return t.forEach((e,t)=>{n[t]=String(e)}),n}function j({title:e,message:t,buttons:i,headerAction:a,dom:o}){let s=y(o),c=b(s);return w(s),c.title.textContent=e||``,c.description.innerHTML=``,typeof t==`string`?c.description.textContent=t:t&&c.description.appendChild(t),c.buttons.innerHTML=``,S(c),new Promise(e=>{let t=t=>{M(t),e(t)},l=()=>{let e=v(s);e?e.click():t(!1)};s.oncancel=e=>{e.preventDefault(),l()},c.headerAction.innerHTML=``;let u=a||{type:`close`};if(u.type===`close`){let e=o.createElement(`solid-ui-button`);e.setAttribute(`variant`,`ghost`),e.setAttribute(`aria-label`,`Close dialog`);let t=o.createElement(`span`);t.setAttribute(`slot`,`icon`),(0,n.render)(r,t),e.appendChild(t),e.onclick=()=>l(),c.headerAction.appendChild(e)}else if(u.type===`button`){let e=o.createElement(`solid-ui-button`);e.setAttribute(`variant`,`tertiary`),e.className=u.className||``,e.textContent=u.label,e.setAttribute(`label`,u.label),e.setAttribute(`aria-label`,u.ariaLabel||u.label),e.onclick=async()=>{u.onClick&&await u.onClick()},c.headerAction.appendChild(e)}i.forEach(e=>{let n=o.createElement(`solid-ui-button`);n.setAttribute(`label`,e.label),n.setAttribute(`variant`,e.primary?`primary`:`secondary`),n.textContent=e.label,e.primary&&n.setAttribute(`data-dialog-primary`,`true`),e.cancel&&n.setAttribute(`data-cancel`,`true`),n.addEventListener(`click`,async()=>{(!e.beforeClose||await e.beforeClose())&&t(e.value)}),c.buttons.appendChild(n)}),(o.defaultView?.requestAnimationFrame?e=>o.defaultView?.requestAnimationFrame(()=>e()):e=>setTimeout(e,0))(()=>{k(s,c.description,c.buttons)})})}function M(e){if(i){S(b(i)),T(i),i.oncancel=null;let e=i.querySelector(`#modal-header-action button`);e&&(e.onclick=null)}}function N(t,r,i){let a=b(t),o=_(t),s=v(t);if(t.classList.toggle(`modal--saving`,i),t.setAttribute(`aria-busy`,String(i)),a.description.toggleAttribute(`inert`,i),i){let e=t.ownerDocument.activeElement;e&&t.contains(e)&&e.blur()}o&&(h(o,i),o.setAttribute(`aria-busy`,String(i)),g(o,r)),s&&h(s,i),a.savingOverlay.hidden=!i,i?(0,n.render)(n.html`
|
|
13
13
|
<div class="modal__saving-indicator inline-flex-row justify-center" aria-live="polite" aria-label="Saving changes">
|
|
14
14
|
${e.createSpinner()}
|
|
15
15
|
</div>
|
|
16
|
-
`,a.savingOverlay):(0,n.render)(n.html``,a.savingOverlay)}function P(e){let t=e.submitLabel||`Save Changes`,n=e.cancelLabel||`Cancel`,r=y(e.dom),i=b(r),a=e=>e.replace(/^\s*edit\s+/i,``).replace(/^\s*add\s+/i,``).replace(/^\s*create\s+/i,``).trim();(()=>{let t=a(e.title);if(!t)return;let n=Array.from(e.form.querySelectorAll(
|
|
16
|
+
`,a.savingOverlay):(0,n.render)(n.html``,a.savingOverlay)}function P(e){let t=e.submitLabel||`Save Changes`,n=e.cancelLabel||`Cancel`,r=y(e.dom),i=b(r),a=e=>e.replace(/^\s*edit\s+/i,``).replace(/^\s*add\s+/i,``).replace(/^\s*create\s+/i,``).trim();(()=>{let t=a(e.title);if(!t)return;let n=Array.from(e.form.querySelectorAll(`input:not([type="hidden"]),textarea,select`));if(n.length!==1)return;let[r]=n,i=r.hasAttribute(`aria-label`)||r.hasAttribute(`aria-labelledby`),o=!!r.closest(`label`);i||o||r.getAttribute(`type`)===`hidden`||r.getAttribute(`aria-label`)||r.setAttribute(`aria-label`,t)})();let o=e=>{e.preventDefault(),_(r)?.click()};e.form.addEventListener(`submit`,o);let s=j({title:e.title,message:e.form,headerAction:e.headerAction,buttons:[{label:n,value:null,cancel:!0},{label:t,value:`save`,primary:!0,beforeClose:async()=>{if(S(i),e.shouldCloseWithoutSave&&await e.shouldCloseWithoutSave())return!0;if(e.validate){let t=await e.validate();if(t)return C(i,t),!1}if(!e.onSave)return!0;try{return N(r,t,!0),await e.onSave(),!0}catch(n){N(r,t,!1);let a=e.formatSaveError?e.formatSaveError(n):void 0;return C(i,n,a),!1}}}],dom:e.dom}),c=e.dom.defaultView?.requestAnimationFrame?t=>e.dom.defaultView?.requestAnimationFrame(()=>t()):e=>setTimeout(e,0);return e.onOpen&&c(e.onOpen),i.buttons.hidden=!!e.hideFooterButtons,s.then(t=>t===`save`?A(e.form):null).finally(()=>{i.buttons.hidden=!1,N(r,t,!1),e.form.removeEventListener(`submit`,o)})}exports.getSharedDialogCancelButton=v,exports.getSharedDialogSaveButton=_,exports.openInputDialog=P;
|
|
17
17
|
//# sourceMappingURL=dialog2.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog2.cjs.js","names":["html","render","createSpinner","formatDisplayError","closeIcon","modalDialog","scrollLockState","WeakMap","getEventTargetElement","target","HTMLElement","Node","parentElement","getEventPath","event","composedPath","isDialogScrollRegionTarget","path","description","querySelector","includes","targetElement","contains","Boolean","closest","getDocumentScrollLockState","dom","state","get","count","previousHtmlOverflow","documentElement","style","overflow","previousBodyOverflow","body","removeScrollGuard","set","installDocumentScrollGuard","preventBackgroundScroll","preventDefault","addEventListener","capture","passive","removeEventListener","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","tagName","setDialogActionDisabled","disabled","toggleAttribute","setDialogActionLabel","label","setAttribute","textContent","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","appendChild","createElement","id","innerHTML","getDialogElements","dialog","title","headerAction","error","buttons","savingOverlay","syncDialogErrorDescription","elements","defaultDescription","describedBy","hidden","trim","clearModalError","setModalError","fallbackMessage","openDialogElement","ownerDocument","showModal","open","closeDialogElement","close","removeAttribute","isMobileDialogLayout","isFocusableElement","element","hasAttribute","getAttribute","tabIndex","findPreferredInitialFocusTarget","container","focusableControls","querySelectorAll","join","match","focusInitialDialogTarget","focus","initialTarget","HTMLInputElement","HTMLTextAreaElement","select","firstButton","collectFormValues","form","data","FormData","values","forEach","value","key","String","openModal","message","Promise","resolve","finish","closeModal","requestCancel","cancelBtn","click","oncancel","resolvedHeaderAction","type","closeButton","iconSlot","onclick","actionButton","className","ariaLabel","onClick","btn","b","primary","cancel","beforeClose","shouldClose","scheduleInitialFocus","defaultView","requestAnimationFrame","callback","setTimeout","_result","headerActionButton","closeSharedDialog","alertDialog","updateSavingUI","submitLabel","isSaving","saveButton","cancelButton","classList","toggle","activeElement","blur","setSharedDialogSavingState","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","replace","ensureFormControlsHaveAccessibleNames","titleLabel","controls","Array","from","length","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","shouldCloseWithoutSave","validate","validationMessage","onSave","fallback","formatSaveError","undefined","scheduleOpenCallback","onOpen","hideFooterButtons","then","result","finally","formatDisplayError","createSpinner","require_spinner","require_errorDisplay","lit_html","closeIcon","modalDialog","scrollLockState","getEventTargetElement","target","getEventPath","event","isDialogScrollRegionTarget","path","description","targetElement","getDocumentScrollLockState","state","dom","installDocumentScrollGuard","preventBackgroundScroll","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","setDialogActionDisabled","disabled","setDialogActionLabel","label","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","getDialogElements","dialog","syncDialogErrorDescription","defaultDescription","describedBy","elements","clearModalError","setModalError","error","fallbackMessage","openDialogElement","closeDialogElement","isMobileDialogLayout","isFocusableElement","element","findPreferredInitialFocusTarget","focusableControls","container","match","focusInitialDialogTarget","initialTarget","firstButton","buttons","collectFormValues","data","form","values","key","value","openModal","title","message","finish","closeModal","resolve","requestCancel","cancelBtn","resolvedHeaderAction","headerAction","closeButton","iconSlot","actionButton","b","btn","callback","headerActionButton","updateSavingUI","saveButton","cancelButton","isSaving","activeElement","submitLabel","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","titleLabel","controls","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","validationMessage","fallback","scheduleOpenCallback","result"],"sources":["../../../../../src/components/profile-heading/editor/ui/dialog.ts"],"sourcesContent":["import './dialog.css'\nimport 'solid-ui/components/button'\nimport '~icons/lucide/x'\nimport { html, render } from 'lit-html'\nimport { createSpinner } from './spinner'\nimport { formatDisplayError } from '../utils/errorDisplay'\n\nconst closeIcon = html`<icon-lucide-x aria-hidden=\"true\" focusable=\"false\" style=\"width:12px;height:12px;color:#667085\"></icon-lucide-x>`\n\n/* Copied from issue-pane, minor typescript adjustments */\n/* Changed modal from div to dialog element */\nlet modalDialog: HTMLDialogElement | null = null\n\nconst scrollLockState = new WeakMap<Document, {\n count: number,\n previousHtmlOverflow: string,\n previousBodyOverflow: string,\n removeScrollGuard: (() => void) | null\n}>()\n\nfunction getEventTargetElement (target: EventTarget | null): HTMLElement | null {\n if (target instanceof HTMLElement) return target\n if (target instanceof Node) return target.parentElement\n return null\n}\n\nfunction getEventPath (event: Event): EventTarget[] {\n if (typeof event.composedPath === 'function') {\n return event.composedPath()\n }\n\n return event.target ? [event.target] : []\n}\n\nfunction isDialogScrollRegionTarget (event: Event): boolean {\n const path = getEventPath(event)\n const description = modalDialog?.querySelector('#modal-desc')\n\n if (description && path.includes(description)) {\n return true\n }\n\n if (modalDialog && path.includes(modalDialog)) {\n return true\n }\n\n const targetElement = getEventTargetElement(event.target)\n if (!targetElement || !modalDialog || !modalDialog.contains(targetElement)) {\n return false\n }\n\n return Boolean(targetElement.closest('#modal-desc'))\n}\n\nfunction getDocumentScrollLockState (dom: Document) {\n let state = scrollLockState.get(dom)\n if (!state) {\n state = {\n count: 0,\n previousHtmlOverflow: dom.documentElement.style.overflow,\n previousBodyOverflow: dom.body.style.overflow,\n removeScrollGuard: null\n }\n scrollLockState.set(dom, state)\n }\n return state\n}\n\nfunction installDocumentScrollGuard (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.removeScrollGuard) return\n\n const preventBackgroundScroll = (event: Event) => {\n if (!isDialogScrollRegionTarget(event)) {\n event.preventDefault()\n }\n }\n\n dom.addEventListener('wheel', preventBackgroundScroll, { capture: true, passive: false })\n dom.addEventListener('touchmove', preventBackgroundScroll, { capture: true, passive: false })\n state.removeScrollGuard = () => {\n dom.removeEventListener('wheel', preventBackgroundScroll, true)\n dom.removeEventListener('touchmove', preventBackgroundScroll, true)\n state.removeScrollGuard = null\n }\n}\n\nfunction lockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n\n if (state.count === 0) {\n state.previousHtmlOverflow = dom.documentElement.style.overflow\n state.previousBodyOverflow = dom.body.style.overflow\n\n dom.documentElement.style.overflow = 'hidden'\n dom.body.style.overflow = 'hidden'\n installDocumentScrollGuard(dom)\n }\n\n state.count += 1\n}\n\nfunction unlockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.count === 0) return\n\n state.count -= 1\n if (state.count > 0) return\n\n dom.documentElement.style.overflow = state.previousHtmlOverflow\n dom.body.style.overflow = state.previousBodyOverflow\n state.removeScrollGuard?.()\n state.removeScrollGuard = null\n}\n\nfunction getDialogMountTarget (dom: Document): HTMLElement {\n return dom.body\n}\n\ntype DialogButtonValue = boolean | 'save' | null\ntype DialogButton = {\n label: string,\n value: DialogButtonValue,\n primary?: boolean,\n cancel?: boolean,\n beforeClose?: () => Promise<boolean> | boolean\n}\n\ntype DialogHeaderAction =\n | { type: 'close' }\n | { type: 'none' }\n | {\n type: 'button',\n label: string,\n ariaLabel?: string,\n className?: string,\n onClick?: () => Promise<void> | void\n }\n\ntype DialogElements = {\n dialog: HTMLDialogElement,\n title: HTMLHeadingElement,\n headerAction: HTMLDivElement,\n description: HTMLDivElement,\n error: HTMLElement,\n buttons: HTMLDivElement,\n savingOverlay: HTMLDivElement\n}\n\ntype DialogActionControl = HTMLElement & {\n disabled?: boolean,\n label?: string,\n click: () => void,\n shadowRoot?: ShadowRoot | null\n}\n\nfunction isSolidUiButton (control: Element | null): control is DialogActionControl {\n return control?.tagName === 'SOLID-UI-BUTTON'\n}\n\nfunction setDialogActionDisabled (control: DialogActionControl | null, disabled: boolean): void {\n if (!control) return\n control.disabled = disabled\n control.toggleAttribute('disabled', disabled)\n}\n\nfunction setDialogActionLabel (control: DialogActionControl | null, label: string): void {\n if (!control) return\n\n if (isSolidUiButton(control)) {\n control.label = label\n control.setAttribute('label', label)\n control.textContent = label\n return\n }\n\n ;(control as HTMLElement).textContent = label\n}\n\nexport function getSharedDialogSaveButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-dialog-primary=\"true\"]') as DialogActionControl | null\n}\n\nexport function getSharedDialogCancelButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-cancel=\"true\"]') as DialogActionControl | null\n}\n\nfunction ensureModalDialog (dom: Document): HTMLDialogElement {\n const mountTarget = getDialogMountTarget(dom)\n\n // if we previously created a dialog but it was removed from the document\n // (tests clear body), rebuild it. Checking presence ensures our reference\n // doesn't point at a detached element.\n if (modalDialog && dom.body.contains(modalDialog)) {\n if (modalDialog.parentElement !== mountTarget) {\n mountTarget.appendChild(modalDialog)\n }\n return modalDialog\n }\n\n modalDialog = null\n modalDialog = dom.createElement('dialog')\n modalDialog.id = 'profile-modal'\n modalDialog.setAttribute('aria-modal', 'true')\n modalDialog.setAttribute('aria-labelledby', 'modal-title')\n modalDialog.setAttribute('aria-describedby', 'modal-desc')\n\n modalDialog.innerHTML = `\n <div class=\"modal\">\n <div class=\"modal-header flex-row align-center justify-between\">\n <h2 id=\"modal-title\"></h2>\n <div id=\"modal-header-action\" class=\"flex-row align-center\"></div>\n </div>\n <div id=\"modal-desc\"></div>\n <section id=\"modal-error\" class=\"modal__error-section\" aria-live=\"assertive\" aria-atomic=\"true\" aria-hidden=\"true\" role=\"alert\" tabindex=\"-1\" hidden></section>\n <div id=\"modal-buttons\" class=\"flex-row align-center justify-end\"></div>\n <div id=\"modal-saving-overlay\" hidden></div>\n </div>\n `\n\n mountTarget.appendChild(modalDialog)\n return modalDialog\n}\n\nfunction getDialogElements (dialog: HTMLDialogElement): DialogElements {\n return {\n dialog,\n title: dialog.querySelector('#modal-title') as HTMLHeadingElement,\n headerAction: dialog.querySelector('#modal-header-action') as HTMLDivElement,\n description: dialog.querySelector('#modal-desc') as HTMLDivElement,\n error: dialog.querySelector('#modal-error') as HTMLElement,\n buttons: dialog.querySelector('#modal-buttons') as HTMLDivElement,\n savingOverlay: dialog.querySelector('#modal-saving-overlay') as HTMLDivElement\n }\n}\n\nfunction syncDialogErrorDescription (elements: DialogElements): void {\n const defaultDescription = 'modal-desc'\n const describedBy = elements.error.hidden || !elements.error.textContent?.trim()\n ? defaultDescription\n : `${defaultDescription} modal-error`\n\n elements.dialog.setAttribute('aria-describedby', describedBy)\n}\n\nfunction clearModalError (elements: DialogElements): void {\n elements.error.textContent = ''\n elements.error.setAttribute('aria-hidden', 'true')\n elements.error.hidden = true\n syncDialogErrorDescription(elements)\n}\n\nfunction setModalError (elements: DialogElements, error: unknown, fallbackMessage?: string): void {\n elements.error.textContent = formatDisplayError(error, fallbackMessage)\n elements.error.setAttribute('aria-hidden', 'false')\n elements.error.hidden = false\n syncDialogErrorDescription(elements)\n}\n\nfunction openDialogElement (dialog: HTMLDialogElement): void {\n lockDocumentScroll(dialog.ownerDocument)\n\n if (typeof dialog.showModal === 'function') {\n try {\n if (!dialog.open) dialog.showModal()\n return\n } catch {\n // Fall back for jsdom or partial dialog implementations.\n }\n }\n\n dialog.setAttribute('open', '')\n}\n\nfunction closeDialogElement (dialog: HTMLDialogElement): void {\n try {\n if (typeof dialog.close === 'function' && dialog.open) {\n dialog.close()\n return\n }\n\n dialog.removeAttribute('open')\n } finally {\n unlockDocumentScroll(dialog.ownerDocument)\n }\n}\n\nfunction isMobileDialogLayout (dom: Document): boolean {\n return Boolean(dom.querySelector('[data-layout=\\'mobile\\']'))\n}\n\nfunction isFocusableElement (element: HTMLElement): boolean {\n if (element.hasAttribute('disabled')) return false\n if (element.getAttribute('aria-hidden') === 'true') return false\n if (element.getAttribute('hidden') !== null) return false\n if (element.tabIndex < 0) return false\n return true\n}\n\nfunction findPreferredInitialFocusTarget (container: ParentNode): HTMLElement | null {\n const focusableControls = container.querySelectorAll([\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'solid-ui-select:not([disabled])',\n 'solid-ui-combobox:not([disabled])',\n '[contenteditable=\"true\"]',\n 'button:not([disabled])',\n 'solid-ui-button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(','))\n\n for (const match of focusableControls) {\n if (match instanceof HTMLElement && isFocusableElement(match)) return match\n }\n\n return null\n}\n\nfunction focusInitialDialogTarget (dialog: HTMLDialogElement, description: HTMLDivElement, buttons: HTMLDivElement): void {\n if (isMobileDialogLayout(dialog.ownerDocument)) {\n dialog.tabIndex = -1\n dialog.focus()\n return\n }\n\n const initialTarget = findPreferredInitialFocusTarget(description)\n if (initialTarget) {\n initialTarget.focus()\n if (initialTarget instanceof HTMLInputElement || initialTarget instanceof HTMLTextAreaElement) {\n initialTarget.select()\n }\n return\n }\n\n const firstButton = findPreferredInitialFocusTarget(buttons)\n if (firstButton) {\n firstButton.focus()\n }\n}\n\nfunction collectFormValues (form: HTMLFormElement): InputDialogValues {\n const data = new FormData(form)\n const values: InputDialogValues = {}\n data.forEach((value, key) => {\n values[key] = String(value)\n })\n return values\n}\n\nfunction openModal ({\n title,\n message,\n buttons,\n headerAction,\n dom\n}: {\n title?: string,\n message?: string | Node,\n buttons: DialogButton[],\n headerAction?: DialogHeaderAction,\n dom: Document\n}) {\n const dialog = ensureModalDialog(dom)\n const elements = getDialogElements(dialog)\n\n openDialogElement(dialog)\n\n elements.title.textContent = title || ''\n elements.description.innerHTML = ''\n if (typeof message === 'string') {\n elements.description.textContent = message\n } else if (message) {\n elements.description.appendChild(message)\n }\n\n elements.buttons.innerHTML = ''\n clearModalError(elements)\n\n return new Promise<DialogButtonValue>((resolve) => {\n const finish = (value: DialogButtonValue) => {\n closeModal(value)\n resolve(value)\n }\n\n const requestCancel = () => {\n const cancelBtn = getSharedDialogCancelButton(dialog)\n if (cancelBtn) {\n cancelBtn.click()\n return\n }\n\n finish(false)\n }\n\n dialog.oncancel = (event: Event) => {\n event.preventDefault()\n requestCancel()\n }\n\n elements.headerAction.innerHTML = ''\n const resolvedHeaderAction = headerAction || { type: 'close' as const }\n if (resolvedHeaderAction.type === 'close') {\n const closeButton = dom.createElement('solid-ui-button') as DialogActionControl\n closeButton.setAttribute('variant', 'ghost')\n closeButton.setAttribute('aria-label', 'Close dialog')\n const iconSlot = dom.createElement('span')\n iconSlot.setAttribute('slot', 'icon')\n render(closeIcon, iconSlot)\n closeButton.appendChild(iconSlot)\n closeButton.onclick = () => requestCancel()\n elements.headerAction.appendChild(closeButton)\n } else if (resolvedHeaderAction.type === 'button') {\n const actionButton = dom.createElement('solid-ui-button') as DialogActionControl\n actionButton.setAttribute('variant', 'tertiary')\n actionButton.className = resolvedHeaderAction.className || ''\n actionButton.textContent = resolvedHeaderAction.label\n actionButton.setAttribute('label', resolvedHeaderAction.label)\n actionButton.setAttribute('aria-label', resolvedHeaderAction.ariaLabel || resolvedHeaderAction.label)\n actionButton.onclick = async () => {\n if (resolvedHeaderAction.onClick) {\n await resolvedHeaderAction.onClick()\n }\n }\n elements.headerAction.appendChild(actionButton)\n }\n\n buttons.forEach((btn) => {\n const b = dom.createElement('solid-ui-button') as DialogActionControl\n b.setAttribute('label', btn.label)\n b.setAttribute('variant', btn.primary ? 'primary' : 'secondary')\n b.textContent = btn.label\n if (btn.primary) {\n b.setAttribute('data-dialog-primary', 'true')\n }\n if (btn.cancel) {\n b.setAttribute('data-cancel', 'true')\n }\n b.addEventListener('click', async () => {\n if (btn.beforeClose) {\n const shouldClose = await btn.beforeClose()\n if (!shouldClose) return\n }\n finish(btn.value)\n })\n elements.buttons.appendChild(b)\n })\n\n const scheduleInitialFocus = dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n scheduleInitialFocus(() => {\n focusInitialDialogTarget(dialog, elements.description, elements.buttons)\n })\n })\n}\n\nfunction closeModal (_result: DialogButtonValue): void {\n if (modalDialog) {\n const elements = getDialogElements(modalDialog)\n clearModalError(elements)\n closeDialogElement(modalDialog)\n modalDialog.oncancel = null\n const headerActionButton = modalDialog.querySelector('#modal-header-action button') as HTMLButtonElement | null\n if (headerActionButton) headerActionButton.onclick = null\n }\n}\n\nexport function closeSharedDialog (): void {\n closeModal(null)\n}\n\nexport function alertDialog (message: string, title = 'Information', dom: Document) {\n return openModal({\n title,\n message,\n buttons: [{ label: 'OK', value: true, primary: true }],\n dom\n })\n}\n\nfunction updateSavingUI (dialog: HTMLDialogElement, submitLabel: string, isSaving: boolean) {\n const elements = getDialogElements(dialog)\n const saveButton = getSharedDialogSaveButton(dialog)\n const cancelButton = getSharedDialogCancelButton(dialog)\n\n dialog.classList.toggle('modal--saving', isSaving)\n dialog.setAttribute('aria-busy', String(isSaving))\n elements.description.toggleAttribute('inert', isSaving)\n\n if (isSaving) {\n const activeElement = dialog.ownerDocument.activeElement as HTMLElement | null\n if (activeElement && dialog.contains(activeElement)) {\n activeElement.blur()\n }\n }\n\n if (saveButton) {\n setDialogActionDisabled(saveButton, isSaving)\n saveButton.setAttribute('aria-busy', String(isSaving))\n setDialogActionLabel(saveButton, submitLabel)\n }\n\n if (cancelButton) {\n setDialogActionDisabled(cancelButton, isSaving)\n }\n\n elements.savingOverlay.hidden = !isSaving\n if (isSaving) {\n render(html`\n <div class=\"modal__saving-indicator inline-flex-row justify-center\" aria-live=\"polite\" aria-label=\"Saving changes\">\n ${createSpinner()}\n </div>\n `, elements.savingOverlay)\n } else {\n render(html``, elements.savingOverlay)\n }\n}\n\nexport function setSharedDialogSavingState (dom: Document, isSaving: boolean, submitLabel = 'Saving Changes'): void {\n const dialog = ensureModalDialog(dom)\n updateSavingUI(dialog, submitLabel, isSaving)\n}\n\ntype OpenInputDialogCustom = {\n title: string,\n dom: Document,\n form: HTMLFormElement,\n submitLabel?: string,\n cancelLabel?: string,\n headerAction?: DialogHeaderAction,\n hideFooterButtons?: boolean,\n onOpen?: () => void,\n shouldCloseWithoutSave?: () => Promise<boolean> | boolean,\n validate?: () => Promise<string | null> | string | null,\n onSave?: () => Promise<void> | void,\n formatSaveError?: (error: unknown) => string\n}\n\ntype InputDialogValues = Record<string, string>\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a reusable function to open a dialog with a form and return the form values on submit.\nThe function should also support validation and display error messages in the dialog.\nIt should reuse the OpenModal function for consistency. Done in 2 passes */\nexport function openInputDialog (options: OpenInputDialogCustom): Promise<InputDialogValues | null> {\n const submitLabel = options.submitLabel || 'Save Changes'\n const cancelLabel = options.cancelLabel || 'Cancel'\n const dialog = ensureModalDialog(options.dom)\n const elements = getDialogElements(dialog)\n\n const deriveDefaultFieldLabel = (value: string): string => value\n .replace(/^\\s*edit\\s+/i, '')\n .replace(/^\\s*add\\s+/i, '')\n .replace(/^\\s*create\\s+/i, '')\n .trim()\n\n const ensureFormControlsHaveAccessibleNames = () => {\n const titleLabel = deriveDefaultFieldLabel(options.title)\n if (!titleLabel) return\n\n const controls = Array.from(options.form.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>([\n 'input:not([type=\"hidden\"])',\n 'textarea',\n 'select'\n ].join(',')))\n\n if (controls.length !== 1) return\n\n const [control] = controls\n const hasExplicitLabel = control.hasAttribute('aria-label') || control.hasAttribute('aria-labelledby')\n const hasNativeLabel = Boolean(control.closest('label'))\n if (hasExplicitLabel || hasNativeLabel || control.getAttribute('type') === 'hidden') {\n return\n }\n\n if (!control.getAttribute('aria-label')) {\n control.setAttribute('aria-label', titleLabel)\n }\n }\n\n ensureFormControlsHaveAccessibleNames()\n\n const handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n const saveButton = getSharedDialogSaveButton(dialog)\n saveButton?.click()\n }\n\n options.form.addEventListener('submit', handleSubmit)\n\n const dialogPromise = openModal({\n title: options.title,\n message: options.form,\n headerAction: options.headerAction,\n buttons: [\n { label: cancelLabel, value: null, cancel: true },\n {\n label: submitLabel,\n value: 'save',\n primary: true,\n beforeClose: async () => {\n clearModalError(elements)\n\n if (options.shouldCloseWithoutSave && await options.shouldCloseWithoutSave()) {\n return true\n }\n\n if (options.validate) {\n const validationMessage = await options.validate()\n if (validationMessage) {\n setModalError(elements, validationMessage)\n return false\n }\n }\n\n if (!options.onSave) return true\n\n try {\n updateSavingUI(dialog, submitLabel, true)\n\n await options.onSave()\n return true\n } catch (error) {\n updateSavingUI(dialog, submitLabel, false)\n const fallback = options.formatSaveError ? options.formatSaveError(error) : undefined\n setModalError(elements, error, fallback)\n return false\n }\n }\n }\n ],\n dom: options.dom\n })\n\n const scheduleOpenCallback = options.dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => options.dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n if (options.onOpen) {\n scheduleOpenCallback(options.onOpen)\n }\n\n elements.buttons.hidden = Boolean(options.hideFooterButtons)\n\n return dialogPromise\n .then((result) => {\n if (result !== 'save') return null\n return collectFormValues(options.form)\n })\n .finally(() => {\n elements.buttons.hidden = false\n updateSavingUI(dialog, submitLabel, false)\n options.form.removeEventListener('submit', handleSubmit)\n })\n}\n"],"mappings":"A,gOAOA,IAAMI,EAAYJ,EAAAA,IAAI,oHAIlBK,EAAwC,KAEtCC,EAAkB,IAAIC,QAO5B,SAASC,EAAuBC,EAAgD,CAG9E,OAFIA,aAAkBC,YAAoBD,EACtCA,aAAkBE,KAAaF,EAAOG,cACnC,IACT,CAEA,SAASC,EAAcC,EAA6B,CAKlD,OAJI,OAAOA,EAAMC,cAAiB,WACzBD,EAAMC,aAAa,EAGrBD,EAAML,OAAS,CAACK,EAAML,MAAM,EAAI,CAAA,CACzC,CAEA,SAASO,EAA4BF,EAAuB,CAC1D,IAAMG,EAAOJ,EAAaC,CAAK,EACzBI,EAAcb,GAAac,cAAc,aAAa,EAM5D,GAJID,GAAeD,EAAKG,SAASF,CAAW,GAIxCb,GAAeY,EAAKG,SAASf,CAAW,EAC1C,MAAO,GAGT,IAAMgB,EAAgBb,EAAsBM,EAAML,MAAM,EAKxD,MAJI,CAACY,GAAiB,CAAChB,GAAe,CAACA,EAAYiB,SAASD,CAAa,EAChE,GAGFE,EAAQF,EAAcG,QAAQ,aAAa,CACpD,CAEA,SAASC,EAA4BC,EAAe,CAClD,IAAIC,EAAQrB,EAAgBsB,IAAIF,CAAG,EAUnC,OATKC,IACHA,EAAQ,CACNE,MAAO,EACPC,qBAAsBJ,EAAIK,gBAAgBC,MAAMC,SAChDC,qBAAsBR,EAAIS,KAAKH,MAAMC,SACrCG,kBAAmB,IACrB,EACA9B,EAAgB+B,IAAIX,EAAKC,CAAK,GAEzBA,CACT,CAEA,SAASW,EAA4BZ,EAAqB,CACxD,IAAMC,EAAQF,EAA2BC,CAAG,EAC5C,GAAIC,EAAMS,kBAAmB,OAE7B,IAAMG,EAA2BzB,GAAiB,CAC3CE,EAA2BF,CAAK,GACnCA,EAAM0B,eAAe,CAEzB,EAEAd,EAAIe,iBAAiB,QAASF,EAAyB,CAAEG,QAAS,GAAMC,QAAS,EAAM,CAAC,EACxFjB,EAAIe,iBAAiB,YAAaF,EAAyB,CAAEG,QAAS,GAAMC,QAAS,EAAM,CAAC,EAC5FhB,EAAMS,sBAA0B,CAC9BV,EAAIkB,oBAAoB,QAASL,EAAyB,EAAI,EAC9Db,EAAIkB,oBAAoB,YAAaL,EAAyB,EAAI,EAClEZ,EAAMS,kBAAoB,IAC5B,CACF,CAEA,SAASS,EAAoBnB,EAAqB,CAChD,IAAMC,EAAQF,EAA2BC,CAAG,EAExCC,EAAME,QAAU,IAClBF,EAAMG,qBAAuBJ,EAAIK,gBAAgBC,MAAMC,SACvDN,EAAMO,qBAAuBR,EAAIS,KAAKH,MAAMC,SAE5CP,EAAIK,gBAAgBC,MAAMC,SAAW,SACrCP,EAAIS,KAAKH,MAAMC,SAAW,SAC1BK,EAA2BZ,CAAG,GAGhCC,EAAME,OAAS,CACjB,CAEA,SAASiB,EAAsBpB,EAAqB,CAClD,IAAMC,EAAQF,EAA2BC,CAAG,EACxCC,EAAME,QAAU,IAEpBF,IAAME,MACFF,IAAME,MAAQ,KAElBH,EAAIK,gBAAgBC,MAAMC,SAAWN,EAAMG,qBAC3CJ,EAAIS,KAAKH,MAAMC,SAAWN,EAAMO,qBAChCP,EAAMS,oBAAoB,EAC1BT,EAAMS,kBAAoB,MAC5B,CAEA,SAASW,EAAsBrB,EAA4B,CACzD,OAAOA,EAAIS,IACb,CAuCA,SAASa,EAAiBC,EAAyD,CACjF,OAAOA,GAASC,UAAY,iBAC9B,CAEA,SAASC,EAAyBF,EAAqCG,EAAyB,CACzFH,IACLA,EAAQG,SAAWA,EACnBH,EAAQI,gBAAgB,WAAYD,CAAQ,EAC9C,CAEA,SAASE,EAAsBL,EAAqCM,EAAqB,CAClFN,IAEDD,EAAgBC,CAAO,IACzBA,EAAQM,MAAQA,EAChBN,EAAQO,aAAa,QAASD,CAAK,GACnCN,EAAQQ,YAAcF,EAK1B,CAEA,SAAgBG,EAA2BC,EAA8C,CACvF,OAAOA,EAAKxC,cAAc,6CAA6C,CACzE,CAEA,SAAgByC,EAA6BD,EAA8C,CACzF,OAAOA,EAAKxC,cAAc,qCAAqC,CACjE,CAEA,SAAS0C,EAAmBnC,EAAkC,CAC5D,IAAMoC,EAAcf,EAAqBrB,CAAG,EAiC5C,OA5BIrB,GAAeqB,EAAIS,KAAKb,SAASjB,CAAW,GAC1CA,EAAYO,gBAAkBkD,GAChCA,EAAYC,YAAY1D,CAAW,EAE9BA,IAGTA,EAAc,KACdA,EAAcqB,EAAIsC,cAAc,QAAQ,EACxC3D,EAAY4D,GAAK,gBACjB5D,EAAYmD,aAAa,aAAc,MAAM,EAC7CnD,EAAYmD,aAAa,kBAAmB,aAAa,EACzDnD,EAAYmD,aAAa,mBAAoB,YAAY,EAEzDnD,EAAY6D,UAAY;;;;;;;;;;;IAaxBJ,EAAYC,YAAY1D,CAAW,EAC5BA,EACT,CAEA,SAAS8D,EAAmBC,EAA2C,CACrE,MAAO,CACLA,SACAC,MAAOD,EAAOjD,cAAc,cAAc,EAC1CmD,aAAcF,EAAOjD,cAAc,sBAAsB,EACzDD,YAAakD,EAAOjD,cAAc,aAAa,EAC/CoD,MAAOH,EAAOjD,cAAc,cAAc,EAC1CqD,QAASJ,EAAOjD,cAAc,gBAAgB,EAC9CsD,cAAeL,EAAOjD,cAAc,uBAAuB,CAC7D,CACF,CAEA,SAASuD,EAA4BC,EAAgC,CACnE,IAAMC,EAAqB,aACrBC,EAAcF,EAASJ,MAAMO,QAAU,CAACH,EAASJ,MAAMd,aAAasB,KAAK,EAC3EH,EACA,GAAGA,EAAkB,cAEzBD,EAASP,OAAOZ,aAAa,mBAAoBqB,CAAW,CAC9D,CAEA,SAASG,EAAiBL,EAAgC,CACxDA,EAASJ,MAAMd,YAAc,GAC7BkB,EAASJ,MAAMf,aAAa,cAAe,MAAM,EACjDmB,EAASJ,MAAMO,OAAS,GACxBJ,EAA2BC,CAAQ,CACrC,CAEA,SAASM,EAAeN,EAA0BJ,EAAgBW,EAAgC,CAChGP,EAASJ,MAAMd,YAActD,EAAAA,mBAAmBoE,EAAOW,CAAe,EACtEP,EAASJ,MAAMf,aAAa,cAAe,OAAO,EAClDmB,EAASJ,MAAMO,OAAS,GACxBJ,EAA2BC,CAAQ,CACrC,CAEA,SAASQ,EAAmBf,EAAiC,CAG3D,GAFAvB,EAAmBuB,EAAOgB,aAAa,EAEnC,OAAOhB,EAAOiB,WAAc,WAC9B,GAAI,CACGjB,EAAOkB,MAAMlB,EAAOiB,UAAU,EACnC,MACF,MAAQ,CACN,CAIJjB,EAAOZ,aAAa,OAAQ,EAAE,CAChC,CAEA,SAAS+B,EAAoBnB,EAAiC,CAC5D,GAAI,CACF,GAAI,OAAOA,EAAOoB,OAAU,YAAcpB,EAAOkB,KAAM,CACrDlB,EAAOoB,MAAM,EACb,MACF,CAEApB,EAAOqB,gBAAgB,MAAM,CAC/B,QAAU,CACR3C,EAAqBsB,EAAOgB,aAAa,CAC3C,CACF,CAEA,SAASM,EAAsBhE,EAAwB,CACrD,MAAOH,EAAQG,EAAIP,cAAc,wBAA0B,CAC7D,CAEA,SAASwE,EAAoBC,EAA+B,CAK1D,MADA,EAHIA,EAAQC,aAAa,UAAU,GAC/BD,EAAQE,aAAa,aAAa,IAAM,QACxCF,EAAQE,aAAa,QAAQ,IAAM,MACnCF,EAAQG,SAAW,EAEzB,CAEA,SAASC,EAAiCC,EAA2C,CACnF,IAAMC,EAAoBD,EAAUE,iBAAiB,CACnD,6CACA,2BACA,yBACA,kCACA,oCACA,2BACA,yBACA,kCACA,iCAAiC,CAClC,CAACC,KAAK,GAAG,CAAC,EAEX,IAAK,IAAMC,KAASH,EAClB,GAAIG,aAAiB3F,aAAeiF,EAAmBU,CAAK,EAAG,OAAOA,EAGxE,OAAO,IACT,CAEA,SAASC,EAA0BlC,EAA2BlD,EAA6BsD,EAA+B,CACxH,GAAIkB,EAAqBtB,EAAOgB,aAAa,EAAG,CAC9ChB,EAAO2B,SAAW,GAClB3B,EAAOmC,MAAM,EACb,MACF,CAEA,IAAMC,EAAgBR,EAAgC9E,CAAW,EACjE,GAAIsF,EAAe,CACjBA,EAAcD,MAAM,GAChBC,aAAyBC,kBAAoBD,aAAyBE,sBACxEF,EAAcG,OAAO,EAEvB,MACF,CAEA,IAAMC,EAAcZ,EAAgCxB,CAAO,EACvDoC,GACFA,EAAYL,MAAM,CAEtB,CAEA,SAASM,EAAmBC,EAA0C,CACpE,IAAMC,EAAO,IAAIC,SAASF,CAAI,EACxBG,EAA4B,CAAC,EAInC,OAHAF,EAAKG,SAASC,EAAOC,IAAQ,CAC3BH,EAAOG,GAAOC,OAAOF,CAAK,CAC5B,CAAC,EACMF,CACT,CAEA,SAASK,EAAW,CAClBjD,QACAkD,UACA/C,UACAF,eACA5C,OAOC,CACD,IAAM0C,EAASP,EAAkBnC,CAAG,EAC9BiD,EAAWR,EAAkBC,CAAM,EAezC,OAbAe,EAAkBf,CAAM,EAExBO,EAASN,MAAMZ,YAAcY,GAAS,GACtCM,EAASzD,YAAYgD,UAAY,GAC7B,OAAOqD,GAAY,SACrB5C,EAASzD,YAAYuC,YAAc8D,EAC1BA,GACT5C,EAASzD,YAAY6C,YAAYwD,CAAO,EAG1C5C,EAASH,QAAQN,UAAY,GAC7Bc,EAAgBL,CAAQ,EAEjB,IAAI6C,QAA4BC,GAAY,CACjD,IAAMC,EAAUP,GAA6B,CAC3CQ,EAAWR,CAAK,EAChBM,EAAQN,CAAK,CACf,EAEMS,MAAsB,CAC1B,IAAMC,EAAYjE,EAA4BQ,CAAM,EAChDyD,EACFA,EAAUC,MAAM,EAIlBJ,EAAO,EAAK,CACd,EAEAtD,EAAO2D,SAAYjH,GAAiB,CAClCA,EAAM0B,eAAe,EACrBoF,EAAc,CAChB,EAEAjD,EAASL,aAAaJ,UAAY,GAClC,IAAM8D,EAAuB1D,GAAgB,CAAE2D,KAAM,OAAiB,EACtE,GAAID,EAAqBC,OAAS,QAAS,CACzC,IAAMC,EAAcxG,EAAIsC,cAAc,iBAAiB,EACvDkE,EAAY1E,aAAa,UAAW,OAAO,EAC3C0E,EAAY1E,aAAa,aAAc,cAAc,EACrD,IAAM2E,EAAWzG,EAAIsC,cAAc,MAAM,EACzCmE,EAAS3E,aAAa,OAAQ,MAAM,GACpCvD,EAAAA,EAAAA,OAAAA,CAAOG,EAAW+H,CAAQ,EAC1BD,EAAYnE,YAAYoE,CAAQ,EAChCD,EAAYE,YAAgBR,EAAc,EAC1CjD,EAASL,aAAaP,YAAYmE,CAAW,CAC/C,MAAO,GAAIF,EAAqBC,OAAS,SAAU,CACjD,IAAMI,EAAe3G,EAAIsC,cAAc,iBAAiB,EACxDqE,EAAa7E,aAAa,UAAW,UAAU,EAC/C6E,EAAaC,UAAYN,EAAqBM,WAAa,GAC3DD,EAAa5E,YAAcuE,EAAqBzE,MAChD8E,EAAa7E,aAAa,QAASwE,EAAqBzE,KAAK,EAC7D8E,EAAa7E,aAAa,aAAcwE,EAAqBO,WAAaP,EAAqBzE,KAAK,EACpG8E,EAAaD,QAAU,SAAY,CAC7BJ,EAAqBQ,SACvB,MAAMR,EAAqBQ,QAAQ,CAEvC,EACA7D,EAASL,aAAaP,YAAYsE,CAAY,CAChD,CAEA7D,EAAQ0C,QAASuB,GAAQ,CACvB,IAAMC,EAAIhH,EAAIsC,cAAc,iBAAiB,EAC7C0E,EAAElF,aAAa,QAASiF,EAAIlF,KAAK,EACjCmF,EAAElF,aAAa,UAAWiF,EAAIE,QAAU,UAAY,WAAW,EAC/DD,EAAEjF,YAAcgF,EAAIlF,MAChBkF,EAAIE,SACND,EAAElF,aAAa,sBAAuB,MAAM,EAE1CiF,EAAIG,QACNF,EAAElF,aAAa,cAAe,MAAM,EAEtCkF,EAAEjG,iBAAiB,QAAS,SAAY,EAClCgG,GAAII,aAEDC,MADqBL,EAAII,YAAY,IAG5CnB,EAAOe,EAAItB,KAAK,CAClB,CAAC,EACDxC,EAASH,QAAQT,YAAY2E,CAAC,CAChC,CAAC,GAE4BhH,EAAIsH,aAAaC,sBACzCC,GAAyBxH,EAAIsH,aAAaC,0BAA4BC,EAAS,CAAC,EAChFA,GAAyBC,WAAWD,EAAU,CAAC,EAAA,KAEzB,CACzB5C,EAAyBlC,EAAQO,EAASzD,YAAayD,EAASH,OAAO,CACzE,CAAC,CACH,CAAC,CACH,CAEA,SAASmD,EAAYyB,EAAkC,CACrD,GAAI/I,EAAa,CAEf2E,EADiBb,EAAkB9D,CACnBsE,CAAQ,EACxBY,EAAmBlF,CAAW,EAC9BA,EAAY0H,SAAW,KACvB,IAAMsB,EAAqBhJ,EAAYc,cAAc,6BAA6B,EAC9EkI,IAAoBA,EAAmBjB,QAAU,KACvD,CACF,CAeA,SAASoB,EAAgBpF,EAA2BqF,EAAqBC,EAAmB,CAC1F,IAAM/E,EAAWR,EAAkBC,CAAM,EACnCuF,EAAajG,EAA0BU,CAAM,EAC7CwF,EAAehG,EAA4BQ,CAAM,EAMvD,GAJAA,EAAOyF,UAAUC,OAAO,gBAAiBJ,CAAQ,EACjDtF,EAAOZ,aAAa,YAAa6D,OAAOqC,CAAQ,CAAC,EACjD/E,EAASzD,YAAYmC,gBAAgB,QAASqG,CAAQ,EAElDA,EAAU,CACZ,IAAMK,EAAgB3F,EAAOgB,cAAc2E,cACvCA,GAAiB3F,EAAO9C,SAASyI,CAAa,GAChDA,EAAcC,KAAK,CAEvB,CAEIL,IACFxG,EAAwBwG,EAAYD,CAAQ,EAC5CC,EAAWnG,aAAa,YAAa6D,OAAOqC,CAAQ,CAAC,EACrDpG,EAAqBqG,EAAYF,CAAW,GAG1CG,GACFzG,EAAwByG,EAAcF,CAAQ,EAGhD/E,EAASF,cAAcK,OAAS,CAAC4E,EAC7BA,GACFzJ,EAAAA,EAAAA,OAAAA,CAAOD,EAAAA,IAAI;;UAELE,EAAAA,cAAc,EAAC;;MAElByE,EAASF,aAAa,GAEzBxE,EAAAA,EAAAA,OAAAA,CAAOD,EAAAA,IAAI,GAAI2E,EAASF,aAAa,CAEzC,CA2BA,SAAgByF,EAAiBC,EAAmE,CAClG,IAAMV,EAAcU,EAAQV,aAAe,eACrCW,EAAcD,EAAQC,aAAe,SACrChG,EAASP,EAAkBsG,EAAQzI,GAAG,EACtCiD,EAAWR,EAAkBC,CAAM,EAEnCiG,EAA2BlD,GAA0BA,EACxDmD,QAAQ,eAAgB,EAAE,CAAC,CAC3BA,QAAQ,cAAe,EAAE,CAAC,CAC1BA,QAAQ,iBAAkB,EAAE,CAAC,CAC7BvF,KAAK,OAE4C,CAClD,IAAMyF,EAAaH,EAAwBF,EAAQ9F,KAAK,EACxD,GAAI,CAACmG,EAAY,OAEjB,IAAMC,EAAWC,MAAMC,KAAKR,EAAQrD,KAAKX,iBAA6E,CACpH,6BACA,WACA,QAAQ,CACT,CAACC,KAAK,GAAG,CAAC,CAAC,EAEZ,GAAIqE,EAASG,SAAW,EAAG,OAE3B,GAAM,CAAC3H,GAAWwH,EACZI,EAAmB5H,EAAQ4C,aAAa,YAAY,GAAK5C,EAAQ4C,aAAa,iBAAiB,EAC/FiF,EAAiBvJ,EAAQ0B,EAAQzB,QAAQ,OAAO,EAClDqJ,GAAoBC,GAAkB7H,EAAQ6C,aAAa,MAAM,IAAM,UAItE7C,EAAQ6C,aAAa,YAAY,GACpC7C,EAAQO,aAAa,aAAcgH,CAAU,CAEjD,EAEAD,CAAsC,EAEtC,IAAMQ,EAAgBjK,GAAuB,CAC3CA,EAAM0B,eAAe,EAErBmH,EAD6CvF,CAC7CuF,CAAAA,EAAY7B,MAAM,CACpB,EAEAqC,EAAQrD,KAAKrE,iBAAiB,SAAUsI,CAAY,EAEpD,IAAMC,EAAgB1D,EAAU,CAC9BjD,MAAO8F,EAAQ9F,MACfkD,QAAS4C,EAAQrD,KACjBxC,aAAc6F,EAAQ7F,aACtBE,QAAS,CACP,CAAEjB,MAAO6G,EAAajD,MAAO,KAAMyB,OAAQ,EAAK,EAChD,CACErF,MAAOkG,EACPtC,MAAO,OACPwB,QAAS,GACTE,YAAa,SAAY,CAGvB,GAFA7D,EAAgBL,CAAQ,EAEpBwF,EAAQc,wBAA0B,MAAMd,EAAQc,uBAAuB,EACzE,MAAO,GAGT,GAAId,EAAQe,SAAU,CACpB,IAAMC,EAAoB,MAAMhB,EAAQe,SAAS,EACjD,GAAIC,EAEF,OADAlG,EAAcN,EAAUwG,CAAiB,EAClC,EAEX,CAEA,GAAI,CAAChB,EAAQiB,OAAQ,MAAO,GAE5B,GAAI,CAIF,OAHA5B,EAAepF,EAAQqF,EAAa,EAAI,EAExC,MAAMU,EAAQiB,OAAO,EACd,EACT,OAAS7G,EAAO,CACdiF,EAAepF,EAAQqF,EAAa,EAAK,EACzC,IAAM4B,EAAWlB,EAAQmB,gBAAkBnB,EAAQmB,gBAAgB/G,CAAK,EAAIgH,IAAAA,GAE5E,OADAtG,EAAcN,EAAUJ,EAAO8G,CAAQ,EAChC,EACT,CACF,CACF,CAAC,EAEH3J,IAAKyI,EAAQzI,GACf,CAAC,EAEK8J,EAAuBrB,EAAQzI,IAAIsH,aAAaC,sBACjDC,GAAyBiB,EAAQzI,IAAIsH,aAAaC,0BAA4BC,EAAS,CAAC,EACxFA,GAAyBC,WAAWD,EAAU,CAAC,EAQpD,OANIiB,EAAQsB,QACVD,EAAqBrB,EAAQsB,MAAM,EAGrC9G,EAASH,QAAQM,OAASvD,EAAQ4I,EAAQuB,kBAEnCV,EACJW,KAAMC,GACDA,IAAW,OACR/E,EAAkBsD,EAAQrD,IAAI,EADP,IAE/B,CAAC,CACD+E,YAAc,CACblH,EAASH,QAAQM,OAAS,GAC1B0E,EAAepF,EAAQqF,EAAa,EAAK,EACzCU,EAAQrD,KAAKlE,oBAAoB,SAAUmI,CAAY,CACzD,CAAC,CACL,C"}
|
|
1
|
+
{"version":3,"file":"dialog2.cjs.js","names":["html","render","createSpinner","formatDisplayError","closeIcon","modalDialog","scrollLockState","WeakMap","getEventTargetElement","target","HTMLElement","Node","parentElement","getEventPath","event","composedPath","isDialogScrollRegionTarget","path","description","querySelector","includes","targetElement","contains","Boolean","closest","getDocumentScrollLockState","dom","state","get","count","previousHtmlOverflow","documentElement","style","overflow","previousBodyOverflow","body","removeScrollGuard","set","installDocumentScrollGuard","preventBackgroundScroll","preventDefault","addEventListener","capture","passive","removeEventListener","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","tagName","setDialogActionDisabled","disabled","toggleAttribute","setDialogActionLabel","label","setAttribute","textContent","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","appendChild","createElement","id","innerHTML","getDialogElements","dialog","title","headerAction","error","buttons","savingOverlay","syncDialogErrorDescription","elements","defaultDescription","describedBy","hidden","trim","clearModalError","setModalError","fallbackMessage","openDialogElement","ownerDocument","showModal","open","closeDialogElement","close","removeAttribute","isMobileDialogLayout","isFocusableElement","element","hasAttribute","getAttribute","tabIndex","findPreferredInitialFocusTarget","container","focusableControls","querySelectorAll","join","match","focusInitialDialogTarget","focus","initialTarget","HTMLInputElement","HTMLTextAreaElement","select","firstButton","collectFormValues","form","data","FormData","values","forEach","value","key","String","openModal","message","Promise","resolve","finish","closeModal","requestCancel","cancelBtn","click","oncancel","resolvedHeaderAction","type","closeButton","iconSlot","onclick","actionButton","className","ariaLabel","onClick","btn","b","primary","cancel","beforeClose","shouldClose","scheduleInitialFocus","defaultView","requestAnimationFrame","callback","setTimeout","_result","headerActionButton","closeSharedDialog","alertDialog","updateSavingUI","submitLabel","isSaving","saveButton","cancelButton","classList","toggle","activeElement","blur","setSharedDialogSavingState","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","replace","ensureFormControlsHaveAccessibleNames","titleLabel","controls","Array","from","length","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","shouldCloseWithoutSave","validate","validationMessage","onSave","fallback","formatSaveError","undefined","scheduleOpenCallback","onOpen","hideFooterButtons","then","result","finally","formatDisplayError","createSpinner","require_spinner","require_errorDisplay","lit_html","closeIcon","modalDialog","scrollLockState","getEventTargetElement","target","getEventPath","event","isDialogScrollRegionTarget","path","description","targetElement","getDocumentScrollLockState","state","dom","installDocumentScrollGuard","preventBackgroundScroll","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","setDialogActionDisabled","disabled","setDialogActionLabel","label","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","getDialogElements","dialog","syncDialogErrorDescription","defaultDescription","describedBy","elements","clearModalError","setModalError","error","fallbackMessage","openDialogElement","closeDialogElement","isMobileDialogLayout","isFocusableElement","element","findPreferredInitialFocusTarget","focusableControls","container","match","focusInitialDialogTarget","initialTarget","firstButton","buttons","collectFormValues","data","form","values","key","value","openModal","title","message","finish","closeModal","resolve","requestCancel","cancelBtn","resolvedHeaderAction","headerAction","closeButton","iconSlot","actionButton","b","btn","callback","headerActionButton","updateSavingUI","saveButton","cancelButton","isSaving","activeElement","submitLabel","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","titleLabel","controls","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","validationMessage","fallback","scheduleOpenCallback","result"],"sources":["../../../../../src/components/profile-heading/editor/ui/dialog.ts"],"sourcesContent":["import './dialog.css'\nimport 'solid-ui/components/button'\nimport '~icons/lucide/x'\nimport { html, render } from 'lit-html'\nimport { createSpinner } from './spinner'\nimport { formatDisplayError } from '../utils/errorDisplay'\n\nconst closeIcon = html`<icon-lucide-x aria-hidden=\"true\" focusable=\"false\" style=\"width:12px;height:12px;color:#667085\"></icon-lucide-x>`\n\n/* Copied from issue-pane, minor typescript adjustments */\n/* Changed modal from div to dialog element */\nlet modalDialog: HTMLDialogElement | null = null\n\nconst scrollLockState = new WeakMap<Document, {\n count: number,\n previousHtmlOverflow: string,\n previousBodyOverflow: string,\n removeScrollGuard: (() => void) | null\n}>()\n\nfunction getEventTargetElement (target: EventTarget | null): HTMLElement | null {\n if (target instanceof HTMLElement) return target\n if (target instanceof Node) return target.parentElement\n return null\n}\n\nfunction getEventPath (event: Event): EventTarget[] {\n if (typeof event.composedPath === 'function') {\n return event.composedPath()\n }\n\n return event.target ? [event.target] : []\n}\n\nfunction isDialogScrollRegionTarget (event: Event): boolean {\n const path = getEventPath(event)\n const description = modalDialog?.querySelector('#modal-desc')\n\n if (description && path.includes(description)) {\n return true\n }\n\n if (modalDialog && path.includes(modalDialog)) {\n return true\n }\n\n const targetElement = getEventTargetElement(event.target)\n if (!targetElement || !modalDialog || !modalDialog.contains(targetElement)) {\n return false\n }\n\n return Boolean(targetElement.closest('#modal-desc'))\n}\n\nfunction getDocumentScrollLockState (dom: Document) {\n let state = scrollLockState.get(dom)\n if (!state) {\n state = {\n count: 0,\n previousHtmlOverflow: dom.documentElement.style.overflow,\n previousBodyOverflow: dom.body.style.overflow,\n removeScrollGuard: null\n }\n scrollLockState.set(dom, state)\n }\n return state\n}\n\nfunction installDocumentScrollGuard (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.removeScrollGuard) return\n\n const preventBackgroundScroll = (event: Event) => {\n if (!isDialogScrollRegionTarget(event)) {\n event.preventDefault()\n }\n }\n\n dom.addEventListener('wheel', preventBackgroundScroll, { capture: true, passive: false })\n dom.addEventListener('touchmove', preventBackgroundScroll, { capture: true, passive: false })\n state.removeScrollGuard = () => {\n dom.removeEventListener('wheel', preventBackgroundScroll, true)\n dom.removeEventListener('touchmove', preventBackgroundScroll, true)\n state.removeScrollGuard = null\n }\n}\n\nfunction lockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n\n if (state.count === 0) {\n state.previousHtmlOverflow = dom.documentElement.style.overflow\n state.previousBodyOverflow = dom.body.style.overflow\n\n dom.documentElement.style.overflow = 'hidden'\n dom.body.style.overflow = 'hidden'\n installDocumentScrollGuard(dom)\n }\n\n state.count += 1\n}\n\nfunction unlockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.count === 0) return\n\n state.count -= 1\n if (state.count > 0) return\n\n dom.documentElement.style.overflow = state.previousHtmlOverflow\n dom.body.style.overflow = state.previousBodyOverflow\n state.removeScrollGuard?.()\n state.removeScrollGuard = null\n}\n\nfunction getDialogMountTarget (dom: Document): HTMLElement {\n return dom.body\n}\n\ntype DialogButtonValue = boolean | 'save' | null\ntype DialogButton = {\n label: string,\n value: DialogButtonValue,\n primary?: boolean,\n cancel?: boolean,\n beforeClose?: () => Promise<boolean> | boolean\n}\n\ntype DialogHeaderAction =\n | { type: 'close' }\n | { type: 'none' }\n | {\n type: 'button',\n label: string,\n ariaLabel?: string,\n className?: string,\n onClick?: () => Promise<void> | void\n }\n\ntype DialogElements = {\n dialog: HTMLDialogElement,\n title: HTMLHeadingElement,\n headerAction: HTMLDivElement,\n description: HTMLDivElement,\n error: HTMLElement,\n buttons: HTMLDivElement,\n savingOverlay: HTMLDivElement\n}\n\ntype DialogActionControl = HTMLElement & {\n disabled?: boolean,\n label?: string,\n click: () => void,\n shadowRoot?: ShadowRoot | null\n}\n\nfunction isSolidUiButton (control: Element | null): control is DialogActionControl {\n return control?.tagName === 'SOLID-UI-BUTTON'\n}\n\nfunction setDialogActionDisabled (control: DialogActionControl | null, disabled: boolean): void {\n if (!control) return\n control.disabled = disabled\n control.toggleAttribute('disabled', disabled)\n}\n\nfunction setDialogActionLabel (control: DialogActionControl | null, label: string): void {\n if (!control) return\n\n if (isSolidUiButton(control)) {\n control.label = label\n control.setAttribute('label', label)\n control.textContent = label\n return\n }\n\n ;(control as HTMLElement).textContent = label\n}\n\nexport function getSharedDialogSaveButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-dialog-primary=\"true\"]') as DialogActionControl | null\n}\n\nexport function getSharedDialogCancelButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-cancel=\"true\"]') as DialogActionControl | null\n}\n\nfunction ensureModalDialog (dom: Document): HTMLDialogElement {\n const mountTarget = getDialogMountTarget(dom)\n\n // if we previously created a dialog but it was removed from the document\n // (tests clear body), rebuild it. Checking presence ensures our reference\n // doesn't point at a detached element.\n if (modalDialog && dom.body.contains(modalDialog)) {\n if (modalDialog.parentElement !== mountTarget) {\n mountTarget.appendChild(modalDialog)\n }\n return modalDialog\n }\n\n modalDialog = null\n modalDialog = dom.createElement('dialog')\n modalDialog.id = 'profile-modal'\n modalDialog.setAttribute('aria-modal', 'true')\n modalDialog.setAttribute('aria-labelledby', 'modal-title')\n modalDialog.setAttribute('aria-describedby', 'modal-desc')\n\n modalDialog.innerHTML = `\n <div class=\"modal\">\n <div class=\"modal-header flex-row align-center justify-between\">\n <h2 id=\"modal-title\"></h2>\n <div id=\"modal-header-action\" class=\"flex-row align-center\"></div>\n </div>\n <div id=\"modal-desc\"></div>\n <section id=\"modal-error\" class=\"modal__error-section\" aria-live=\"assertive\" aria-atomic=\"true\" aria-hidden=\"true\" role=\"alert\" tabindex=\"-1\" hidden></section>\n <div id=\"modal-buttons\" class=\"flex-row align-center justify-end\"></div>\n <div id=\"modal-saving-overlay\" hidden></div>\n </div>\n `\n\n mountTarget.appendChild(modalDialog)\n return modalDialog\n}\n\nfunction getDialogElements (dialog: HTMLDialogElement): DialogElements {\n return {\n dialog,\n title: dialog.querySelector('#modal-title') as HTMLHeadingElement,\n headerAction: dialog.querySelector('#modal-header-action') as HTMLDivElement,\n description: dialog.querySelector('#modal-desc') as HTMLDivElement,\n error: dialog.querySelector('#modal-error') as HTMLElement,\n buttons: dialog.querySelector('#modal-buttons') as HTMLDivElement,\n savingOverlay: dialog.querySelector('#modal-saving-overlay') as HTMLDivElement\n }\n}\n\nfunction syncDialogErrorDescription (elements: DialogElements): void {\n const defaultDescription = 'modal-desc'\n const describedBy = elements.error.hidden || !elements.error.textContent?.trim()\n ? defaultDescription\n : `${defaultDescription} modal-error`\n\n elements.dialog.setAttribute('aria-describedby', describedBy)\n}\n\nfunction clearModalError (elements: DialogElements): void {\n elements.error.textContent = ''\n elements.error.setAttribute('aria-hidden', 'true')\n elements.error.hidden = true\n syncDialogErrorDescription(elements)\n}\n\nfunction setModalError (elements: DialogElements, error: unknown, fallbackMessage?: string): void {\n elements.error.textContent = formatDisplayError(error, fallbackMessage)\n elements.error.setAttribute('aria-hidden', 'false')\n elements.error.hidden = false\n syncDialogErrorDescription(elements)\n}\n\nfunction openDialogElement (dialog: HTMLDialogElement): void {\n lockDocumentScroll(dialog.ownerDocument)\n\n if (typeof dialog.showModal === 'function') {\n try {\n if (!dialog.open) dialog.showModal()\n return\n } catch {\n // Fall back for jsdom or partial dialog implementations.\n }\n }\n\n dialog.setAttribute('open', '')\n}\n\nfunction closeDialogElement (dialog: HTMLDialogElement): void {\n try {\n if (typeof dialog.close === 'function' && dialog.open) {\n dialog.close()\n return\n }\n\n dialog.removeAttribute('open')\n } finally {\n unlockDocumentScroll(dialog.ownerDocument)\n }\n}\n\nfunction isMobileDialogLayout (dom: Document): boolean {\n return Boolean(dom.querySelector('[data-layout=\\'mobile\\']'))\n}\n\nfunction isFocusableElement (element: HTMLElement): boolean {\n if (element.hasAttribute('disabled')) return false\n if (element.getAttribute('aria-hidden') === 'true') return false\n if (element.getAttribute('hidden') !== null) return false\n if (element.tabIndex < 0) return false\n return true\n}\n\nfunction findPreferredInitialFocusTarget (container: ParentNode): HTMLElement | null {\n const focusableControls = container.querySelectorAll([\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'solid-ui-select:not([disabled])',\n 'solid-ui-combobox:not([disabled])',\n '[contenteditable=\"true\"]',\n 'button:not([disabled])',\n 'solid-ui-button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(','))\n\n for (const match of focusableControls) {\n if (match instanceof HTMLElement && isFocusableElement(match)) return match\n }\n\n return null\n}\n\nfunction focusInitialDialogTarget (dialog: HTMLDialogElement, description: HTMLDivElement, buttons: HTMLDivElement): void {\n if (isMobileDialogLayout(dialog.ownerDocument)) {\n dialog.tabIndex = -1\n dialog.focus()\n return\n }\n\n const initialTarget = findPreferredInitialFocusTarget(description)\n if (initialTarget) {\n initialTarget.focus()\n if (initialTarget instanceof HTMLInputElement || initialTarget instanceof HTMLTextAreaElement) {\n initialTarget.select()\n }\n return\n }\n\n const firstButton = findPreferredInitialFocusTarget(buttons)\n if (firstButton) {\n firstButton.focus()\n }\n}\n\nfunction collectFormValues (form: HTMLFormElement): InputDialogValues {\n const data = new FormData(form)\n const values: InputDialogValues = {}\n data.forEach((value, key) => {\n values[key] = String(value)\n })\n return values\n}\n\nfunction openModal ({\n title,\n message,\n buttons,\n headerAction,\n dom\n}: {\n title?: string,\n message?: string | Node,\n buttons: DialogButton[],\n headerAction?: DialogHeaderAction,\n dom: Document\n}) {\n const dialog = ensureModalDialog(dom)\n const elements = getDialogElements(dialog)\n\n openDialogElement(dialog)\n\n elements.title.textContent = title || ''\n elements.description.innerHTML = ''\n if (typeof message === 'string') {\n elements.description.textContent = message\n } else if (message) {\n elements.description.appendChild(message)\n }\n\n elements.buttons.innerHTML = ''\n clearModalError(elements)\n\n return new Promise<DialogButtonValue>((resolve) => {\n const finish = (value: DialogButtonValue) => {\n closeModal(value)\n resolve(value)\n }\n\n const requestCancel = () => {\n const cancelBtn = getSharedDialogCancelButton(dialog)\n if (cancelBtn) {\n cancelBtn.click()\n return\n }\n\n finish(false)\n }\n\n dialog.oncancel = (event: Event) => {\n event.preventDefault()\n requestCancel()\n }\n\n elements.headerAction.innerHTML = ''\n const resolvedHeaderAction = headerAction || { type: 'close' as const }\n if (resolvedHeaderAction.type === 'close') {\n const closeButton = dom.createElement('solid-ui-button') as DialogActionControl\n closeButton.setAttribute('variant', 'ghost')\n closeButton.setAttribute('aria-label', 'Close dialog')\n const iconSlot = dom.createElement('span')\n iconSlot.setAttribute('slot', 'icon')\n render(closeIcon, iconSlot)\n closeButton.appendChild(iconSlot)\n closeButton.onclick = () => requestCancel()\n elements.headerAction.appendChild(closeButton)\n } else if (resolvedHeaderAction.type === 'button') {\n const actionButton = dom.createElement('solid-ui-button') as DialogActionControl\n actionButton.setAttribute('variant', 'tertiary')\n actionButton.className = resolvedHeaderAction.className || ''\n actionButton.textContent = resolvedHeaderAction.label\n actionButton.setAttribute('label', resolvedHeaderAction.label)\n actionButton.setAttribute('aria-label', resolvedHeaderAction.ariaLabel || resolvedHeaderAction.label)\n actionButton.onclick = async () => {\n if (resolvedHeaderAction.onClick) {\n await resolvedHeaderAction.onClick()\n }\n }\n elements.headerAction.appendChild(actionButton)\n }\n\n buttons.forEach((btn) => {\n const b = dom.createElement('solid-ui-button') as DialogActionControl\n b.setAttribute('label', btn.label)\n b.setAttribute('variant', btn.primary ? 'primary' : 'secondary')\n b.textContent = btn.label\n if (btn.primary) {\n b.setAttribute('data-dialog-primary', 'true')\n }\n if (btn.cancel) {\n b.setAttribute('data-cancel', 'true')\n }\n b.addEventListener('click', async () => {\n if (btn.beforeClose) {\n const shouldClose = await btn.beforeClose()\n if (!shouldClose) return\n }\n finish(btn.value)\n })\n elements.buttons.appendChild(b)\n })\n\n const scheduleInitialFocus = dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n scheduleInitialFocus(() => {\n focusInitialDialogTarget(dialog, elements.description, elements.buttons)\n })\n })\n}\n\nfunction closeModal (_result: DialogButtonValue): void {\n if (modalDialog) {\n const elements = getDialogElements(modalDialog)\n clearModalError(elements)\n closeDialogElement(modalDialog)\n modalDialog.oncancel = null\n const headerActionButton = modalDialog.querySelector('#modal-header-action button') as HTMLButtonElement | null\n if (headerActionButton) headerActionButton.onclick = null\n }\n}\n\nexport function closeSharedDialog (): void {\n closeModal(null)\n}\n\nexport function alertDialog (message: string, title = 'Information', dom: Document) {\n return openModal({\n title,\n message,\n buttons: [{ label: 'OK', value: true, primary: true }],\n dom\n })\n}\n\nfunction updateSavingUI (dialog: HTMLDialogElement, submitLabel: string, isSaving: boolean) {\n const elements = getDialogElements(dialog)\n const saveButton = getSharedDialogSaveButton(dialog)\n const cancelButton = getSharedDialogCancelButton(dialog)\n\n dialog.classList.toggle('modal--saving', isSaving)\n dialog.setAttribute('aria-busy', String(isSaving))\n elements.description.toggleAttribute('inert', isSaving)\n\n if (isSaving) {\n const activeElement = dialog.ownerDocument.activeElement as HTMLElement | null\n if (activeElement && dialog.contains(activeElement)) {\n activeElement.blur()\n }\n }\n\n if (saveButton) {\n setDialogActionDisabled(saveButton, isSaving)\n saveButton.setAttribute('aria-busy', String(isSaving))\n setDialogActionLabel(saveButton, submitLabel)\n }\n\n if (cancelButton) {\n setDialogActionDisabled(cancelButton, isSaving)\n }\n\n elements.savingOverlay.hidden = !isSaving\n if (isSaving) {\n render(html`\n <div class=\"modal__saving-indicator inline-flex-row justify-center\" aria-live=\"polite\" aria-label=\"Saving changes\">\n ${createSpinner()}\n </div>\n `, elements.savingOverlay)\n } else {\n render(html``, elements.savingOverlay)\n }\n}\n\nexport function setSharedDialogSavingState (dom: Document, isSaving: boolean, submitLabel = 'Saving Changes'): void {\n const dialog = ensureModalDialog(dom)\n updateSavingUI(dialog, submitLabel, isSaving)\n}\n\ntype OpenInputDialogCustom = {\n title: string,\n dom: Document,\n form: HTMLFormElement,\n submitLabel?: string,\n cancelLabel?: string,\n headerAction?: DialogHeaderAction,\n hideFooterButtons?: boolean,\n onOpen?: () => void,\n shouldCloseWithoutSave?: () => Promise<boolean> | boolean,\n validate?: () => Promise<string | null> | string | null,\n onSave?: () => Promise<void> | void,\n formatSaveError?: (error: unknown) => string\n}\n\ntype InputDialogValues = Record<string, string>\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a reusable function to open a dialog with a form and return the form values on submit.\nThe function should also support validation and display error messages in the dialog.\nIt should reuse the OpenModal function for consistency. Done in 2 passes */\nexport function openInputDialog (options: OpenInputDialogCustom): Promise<InputDialogValues | null> {\n const submitLabel = options.submitLabel || 'Save Changes'\n const cancelLabel = options.cancelLabel || 'Cancel'\n const dialog = ensureModalDialog(options.dom)\n const elements = getDialogElements(dialog)\n\n const deriveDefaultFieldLabel = (value: string): string => value\n .replace(/^\\s*edit\\s+/i, '')\n .replace(/^\\s*add\\s+/i, '')\n .replace(/^\\s*create\\s+/i, '')\n .trim()\n\n const ensureFormControlsHaveAccessibleNames = () => {\n const titleLabel = deriveDefaultFieldLabel(options.title)\n if (!titleLabel) return\n\n const controls = Array.from(options.form.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>([\n 'input:not([type=\"hidden\"])',\n 'textarea',\n 'select'\n ].join(',')))\n\n if (controls.length !== 1) return\n\n const [control] = controls\n const hasExplicitLabel = control.hasAttribute('aria-label') || control.hasAttribute('aria-labelledby')\n const hasNativeLabel = Boolean(control.closest('label'))\n if (hasExplicitLabel || hasNativeLabel || control.getAttribute('type') === 'hidden') {\n return\n }\n\n if (!control.getAttribute('aria-label')) {\n control.setAttribute('aria-label', titleLabel)\n }\n }\n\n ensureFormControlsHaveAccessibleNames()\n\n const handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n const saveButton = getSharedDialogSaveButton(dialog)\n saveButton?.click()\n }\n\n options.form.addEventListener('submit', handleSubmit)\n\n const dialogPromise = openModal({\n title: options.title,\n message: options.form,\n headerAction: options.headerAction,\n buttons: [\n { label: cancelLabel, value: null, cancel: true },\n {\n label: submitLabel,\n value: 'save',\n primary: true,\n beforeClose: async () => {\n clearModalError(elements)\n\n if (options.shouldCloseWithoutSave && await options.shouldCloseWithoutSave()) {\n return true\n }\n\n if (options.validate) {\n const validationMessage = await options.validate()\n if (validationMessage) {\n setModalError(elements, validationMessage)\n return false\n }\n }\n\n if (!options.onSave) return true\n\n try {\n updateSavingUI(dialog, submitLabel, true)\n\n await options.onSave()\n return true\n } catch (error) {\n updateSavingUI(dialog, submitLabel, false)\n const fallback = options.formatSaveError ? options.formatSaveError(error) : undefined\n setModalError(elements, error, fallback)\n return false\n }\n }\n }\n ],\n dom: options.dom\n })\n\n const scheduleOpenCallback = options.dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => options.dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n if (options.onOpen) {\n scheduleOpenCallback(options.onOpen)\n }\n\n elements.buttons.hidden = Boolean(options.hideFooterButtons)\n\n return dialogPromise\n .then((result) => {\n if (result !== 'save') return null\n return collectFormValues(options.form)\n })\n .finally(() => {\n elements.buttons.hidden = false\n updateSavingUI(dialog, submitLabel, false)\n options.form.removeEventListener('submit', handleSubmit)\n })\n}\n"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import "../../../../_virtual/~icons/lucide/x.esm.js";
|
|
3
3
|
import { createSpinner as e } from "./spinner.esm.js";
|
|
4
4
|
import { formatDisplayError as t } from "../utils/errorDisplay.esm.js";
|
|
5
|
-
import "solid-ui/components/button";
|
|
6
5
|
import { html as n, render as r } from "lit-html";
|
|
7
|
-
|
|
6
|
+
import "solid-ui/components/button";
|
|
7
|
+
// src/components/profile-heading/editor/ui/dialog.ts
|
|
8
8
|
var i = n`<icon-lucide-x aria-hidden="true" focusable="false" style="width:12px;height:12px;color:#667085"></icon-lucide-x>`, a = null, o = /* @__PURE__ */ new WeakMap();
|
|
9
9
|
function s(e) {
|
|
10
10
|
return e instanceof HTMLElement ? e : e instanceof Node ? e.parentElement : null;
|
|
@@ -119,17 +119,7 @@ function O(e) {
|
|
|
119
119
|
return !(e.hasAttribute("disabled") || e.getAttribute("aria-hidden") === "true" || e.getAttribute("hidden") !== null || e.tabIndex < 0);
|
|
120
120
|
}
|
|
121
121
|
function k(e) {
|
|
122
|
-
let t = e.querySelectorAll([
|
|
123
|
-
"input:not([type=\"hidden\"]):not([disabled])",
|
|
124
|
-
"textarea:not([disabled])",
|
|
125
|
-
"select:not([disabled])",
|
|
126
|
-
"solid-ui-select:not([disabled])",
|
|
127
|
-
"solid-ui-combobox:not([disabled])",
|
|
128
|
-
"[contenteditable=\"true\"]",
|
|
129
|
-
"button:not([disabled])",
|
|
130
|
-
"solid-ui-button:not([disabled])",
|
|
131
|
-
"[tabindex]:not([tabindex=\"-1\"])"
|
|
132
|
-
].join(","));
|
|
122
|
+
let t = e.querySelectorAll("input:not([type=\"hidden\"]):not([disabled]),textarea:not([disabled]),select:not([disabled]),solid-ui-select:not([disabled]),solid-ui-combobox:not([disabled]),[contenteditable=\"true\"],button:not([disabled]),solid-ui-button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])");
|
|
133
123
|
for (let e of t) if (e instanceof HTMLElement && O(e)) return e;
|
|
134
124
|
return null;
|
|
135
125
|
}
|
|
@@ -210,11 +200,7 @@ function F(e) {
|
|
|
210
200
|
(() => {
|
|
211
201
|
let t = a(e.title);
|
|
212
202
|
if (!t) return;
|
|
213
|
-
let n = Array.from(e.form.querySelectorAll([
|
|
214
|
-
"input:not([type=\"hidden\"])",
|
|
215
|
-
"textarea",
|
|
216
|
-
"select"
|
|
217
|
-
].join(",")));
|
|
203
|
+
let n = Array.from(e.form.querySelectorAll("input:not([type=\"hidden\"]),textarea,select"));
|
|
218
204
|
if (n.length !== 1) return;
|
|
219
205
|
let [r] = n, i = r.hasAttribute("aria-label") || r.hasAttribute("aria-labelledby"), o = !!r.closest("label");
|
|
220
206
|
i || o || r.getAttribute("type") === "hidden" || r.getAttribute("aria-label") || r.setAttribute("aria-label", t);
|
|
@@ -257,7 +243,6 @@ function F(e) {
|
|
|
257
243
|
i.buttons.hidden = !1, P(r, t, !1), e.form.removeEventListener("submit", o);
|
|
258
244
|
});
|
|
259
245
|
}
|
|
260
|
-
//#endregion
|
|
261
246
|
export { y as getSharedDialogCancelButton, v as getSharedDialogSaveButton, F as openInputDialog };
|
|
262
247
|
|
|
263
248
|
//# sourceMappingURL=dialog2.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog2.esm.js","names":["html","render","createSpinner","formatDisplayError","closeIcon","modalDialog","scrollLockState","WeakMap","getEventTargetElement","target","HTMLElement","Node","parentElement","getEventPath","event","composedPath","isDialogScrollRegionTarget","path","description","querySelector","includes","targetElement","contains","Boolean","closest","getDocumentScrollLockState","dom","state","get","count","previousHtmlOverflow","documentElement","style","overflow","previousBodyOverflow","body","removeScrollGuard","set","installDocumentScrollGuard","preventBackgroundScroll","preventDefault","addEventListener","capture","passive","removeEventListener","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","tagName","setDialogActionDisabled","disabled","toggleAttribute","setDialogActionLabel","label","setAttribute","textContent","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","appendChild","createElement","id","innerHTML","getDialogElements","dialog","title","headerAction","error","buttons","savingOverlay","syncDialogErrorDescription","elements","defaultDescription","describedBy","hidden","trim","clearModalError","setModalError","fallbackMessage","openDialogElement","ownerDocument","showModal","open","closeDialogElement","close","removeAttribute","isMobileDialogLayout","isFocusableElement","element","hasAttribute","getAttribute","tabIndex","findPreferredInitialFocusTarget","container","focusableControls","querySelectorAll","join","match","focusInitialDialogTarget","focus","initialTarget","HTMLInputElement","HTMLTextAreaElement","select","firstButton","collectFormValues","form","data","FormData","values","forEach","value","key","String","openModal","message","Promise","resolve","finish","closeModal","requestCancel","cancelBtn","click","oncancel","resolvedHeaderAction","type","closeButton","iconSlot","onclick","actionButton","className","ariaLabel","onClick","btn","b","primary","cancel","beforeClose","shouldClose","scheduleInitialFocus","defaultView","requestAnimationFrame","callback","setTimeout","_result","headerActionButton","closeSharedDialog","alertDialog","updateSavingUI","submitLabel","isSaving","saveButton","cancelButton","classList","toggle","activeElement","blur","setSharedDialogSavingState","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","replace","ensureFormControlsHaveAccessibleNames","titleLabel","controls","Array","from","length","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","shouldCloseWithoutSave","validate","validationMessage","onSave","fallback","formatSaveError","undefined","scheduleOpenCallback","onOpen","hideFooterButtons","then","result","finally","closeIcon","modalDialog","scrollLockState","getEventTargetElement","target","getEventPath","event","isDialogScrollRegionTarget","path","description","targetElement","getDocumentScrollLockState","state","dom","installDocumentScrollGuard","preventBackgroundScroll","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","setDialogActionDisabled","disabled","setDialogActionLabel","label","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","getDialogElements","dialog","syncDialogErrorDescription","defaultDescription","describedBy","elements","clearModalError","setModalError","formatDisplayError","error","fallbackMessage","openDialogElement","closeDialogElement","isMobileDialogLayout","isFocusableElement","element","findPreferredInitialFocusTarget","focusableControls","container","match","focusInitialDialogTarget","initialTarget","firstButton","buttons","collectFormValues","data","form","values","key","value","openModal","title","message","finish","closeModal","resolve","requestCancel","cancelBtn","resolvedHeaderAction","headerAction","closeButton","iconSlot","render","actionButton","b","btn","callback","headerActionButton","updateSavingUI","saveButton","cancelButton","isSaving","activeElement","submitLabel","createSpinner","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","titleLabel","controls","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","validationMessage","fallback","scheduleOpenCallback","result"],"sources":["../../../../../src/components/profile-heading/editor/ui/dialog.ts"],"sourcesContent":["import './dialog.css'\nimport 'solid-ui/components/button'\nimport '~icons/lucide/x'\nimport { html, render } from 'lit-html'\nimport { createSpinner } from './spinner'\nimport { formatDisplayError } from '../utils/errorDisplay'\n\nconst closeIcon = html`<icon-lucide-x aria-hidden=\"true\" focusable=\"false\" style=\"width:12px;height:12px;color:#667085\"></icon-lucide-x>`\n\n/* Copied from issue-pane, minor typescript adjustments */\n/* Changed modal from div to dialog element */\nlet modalDialog: HTMLDialogElement | null = null\n\nconst scrollLockState = new WeakMap<Document, {\n count: number,\n previousHtmlOverflow: string,\n previousBodyOverflow: string,\n removeScrollGuard: (() => void) | null\n}>()\n\nfunction getEventTargetElement (target: EventTarget | null): HTMLElement | null {\n if (target instanceof HTMLElement) return target\n if (target instanceof Node) return target.parentElement\n return null\n}\n\nfunction getEventPath (event: Event): EventTarget[] {\n if (typeof event.composedPath === 'function') {\n return event.composedPath()\n }\n\n return event.target ? [event.target] : []\n}\n\nfunction isDialogScrollRegionTarget (event: Event): boolean {\n const path = getEventPath(event)\n const description = modalDialog?.querySelector('#modal-desc')\n\n if (description && path.includes(description)) {\n return true\n }\n\n if (modalDialog && path.includes(modalDialog)) {\n return true\n }\n\n const targetElement = getEventTargetElement(event.target)\n if (!targetElement || !modalDialog || !modalDialog.contains(targetElement)) {\n return false\n }\n\n return Boolean(targetElement.closest('#modal-desc'))\n}\n\nfunction getDocumentScrollLockState (dom: Document) {\n let state = scrollLockState.get(dom)\n if (!state) {\n state = {\n count: 0,\n previousHtmlOverflow: dom.documentElement.style.overflow,\n previousBodyOverflow: dom.body.style.overflow,\n removeScrollGuard: null\n }\n scrollLockState.set(dom, state)\n }\n return state\n}\n\nfunction installDocumentScrollGuard (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.removeScrollGuard) return\n\n const preventBackgroundScroll = (event: Event) => {\n if (!isDialogScrollRegionTarget(event)) {\n event.preventDefault()\n }\n }\n\n dom.addEventListener('wheel', preventBackgroundScroll, { capture: true, passive: false })\n dom.addEventListener('touchmove', preventBackgroundScroll, { capture: true, passive: false })\n state.removeScrollGuard = () => {\n dom.removeEventListener('wheel', preventBackgroundScroll, true)\n dom.removeEventListener('touchmove', preventBackgroundScroll, true)\n state.removeScrollGuard = null\n }\n}\n\nfunction lockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n\n if (state.count === 0) {\n state.previousHtmlOverflow = dom.documentElement.style.overflow\n state.previousBodyOverflow = dom.body.style.overflow\n\n dom.documentElement.style.overflow = 'hidden'\n dom.body.style.overflow = 'hidden'\n installDocumentScrollGuard(dom)\n }\n\n state.count += 1\n}\n\nfunction unlockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.count === 0) return\n\n state.count -= 1\n if (state.count > 0) return\n\n dom.documentElement.style.overflow = state.previousHtmlOverflow\n dom.body.style.overflow = state.previousBodyOverflow\n state.removeScrollGuard?.()\n state.removeScrollGuard = null\n}\n\nfunction getDialogMountTarget (dom: Document): HTMLElement {\n return dom.body\n}\n\ntype DialogButtonValue = boolean | 'save' | null\ntype DialogButton = {\n label: string,\n value: DialogButtonValue,\n primary?: boolean,\n cancel?: boolean,\n beforeClose?: () => Promise<boolean> | boolean\n}\n\ntype DialogHeaderAction =\n | { type: 'close' }\n | { type: 'none' }\n | {\n type: 'button',\n label: string,\n ariaLabel?: string,\n className?: string,\n onClick?: () => Promise<void> | void\n }\n\ntype DialogElements = {\n dialog: HTMLDialogElement,\n title: HTMLHeadingElement,\n headerAction: HTMLDivElement,\n description: HTMLDivElement,\n error: HTMLElement,\n buttons: HTMLDivElement,\n savingOverlay: HTMLDivElement\n}\n\ntype DialogActionControl = HTMLElement & {\n disabled?: boolean,\n label?: string,\n click: () => void,\n shadowRoot?: ShadowRoot | null\n}\n\nfunction isSolidUiButton (control: Element | null): control is DialogActionControl {\n return control?.tagName === 'SOLID-UI-BUTTON'\n}\n\nfunction setDialogActionDisabled (control: DialogActionControl | null, disabled: boolean): void {\n if (!control) return\n control.disabled = disabled\n control.toggleAttribute('disabled', disabled)\n}\n\nfunction setDialogActionLabel (control: DialogActionControl | null, label: string): void {\n if (!control) return\n\n if (isSolidUiButton(control)) {\n control.label = label\n control.setAttribute('label', label)\n control.textContent = label\n return\n }\n\n ;(control as HTMLElement).textContent = label\n}\n\nexport function getSharedDialogSaveButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-dialog-primary=\"true\"]') as DialogActionControl | null\n}\n\nexport function getSharedDialogCancelButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-cancel=\"true\"]') as DialogActionControl | null\n}\n\nfunction ensureModalDialog (dom: Document): HTMLDialogElement {\n const mountTarget = getDialogMountTarget(dom)\n\n // if we previously created a dialog but it was removed from the document\n // (tests clear body), rebuild it. Checking presence ensures our reference\n // doesn't point at a detached element.\n if (modalDialog && dom.body.contains(modalDialog)) {\n if (modalDialog.parentElement !== mountTarget) {\n mountTarget.appendChild(modalDialog)\n }\n return modalDialog\n }\n\n modalDialog = null\n modalDialog = dom.createElement('dialog')\n modalDialog.id = 'profile-modal'\n modalDialog.setAttribute('aria-modal', 'true')\n modalDialog.setAttribute('aria-labelledby', 'modal-title')\n modalDialog.setAttribute('aria-describedby', 'modal-desc')\n\n modalDialog.innerHTML = `\n <div class=\"modal\">\n <div class=\"modal-header flex-row align-center justify-between\">\n <h2 id=\"modal-title\"></h2>\n <div id=\"modal-header-action\" class=\"flex-row align-center\"></div>\n </div>\n <div id=\"modal-desc\"></div>\n <section id=\"modal-error\" class=\"modal__error-section\" aria-live=\"assertive\" aria-atomic=\"true\" aria-hidden=\"true\" role=\"alert\" tabindex=\"-1\" hidden></section>\n <div id=\"modal-buttons\" class=\"flex-row align-center justify-end\"></div>\n <div id=\"modal-saving-overlay\" hidden></div>\n </div>\n `\n\n mountTarget.appendChild(modalDialog)\n return modalDialog\n}\n\nfunction getDialogElements (dialog: HTMLDialogElement): DialogElements {\n return {\n dialog,\n title: dialog.querySelector('#modal-title') as HTMLHeadingElement,\n headerAction: dialog.querySelector('#modal-header-action') as HTMLDivElement,\n description: dialog.querySelector('#modal-desc') as HTMLDivElement,\n error: dialog.querySelector('#modal-error') as HTMLElement,\n buttons: dialog.querySelector('#modal-buttons') as HTMLDivElement,\n savingOverlay: dialog.querySelector('#modal-saving-overlay') as HTMLDivElement\n }\n}\n\nfunction syncDialogErrorDescription (elements: DialogElements): void {\n const defaultDescription = 'modal-desc'\n const describedBy = elements.error.hidden || !elements.error.textContent?.trim()\n ? defaultDescription\n : `${defaultDescription} modal-error`\n\n elements.dialog.setAttribute('aria-describedby', describedBy)\n}\n\nfunction clearModalError (elements: DialogElements): void {\n elements.error.textContent = ''\n elements.error.setAttribute('aria-hidden', 'true')\n elements.error.hidden = true\n syncDialogErrorDescription(elements)\n}\n\nfunction setModalError (elements: DialogElements, error: unknown, fallbackMessage?: string): void {\n elements.error.textContent = formatDisplayError(error, fallbackMessage)\n elements.error.setAttribute('aria-hidden', 'false')\n elements.error.hidden = false\n syncDialogErrorDescription(elements)\n}\n\nfunction openDialogElement (dialog: HTMLDialogElement): void {\n lockDocumentScroll(dialog.ownerDocument)\n\n if (typeof dialog.showModal === 'function') {\n try {\n if (!dialog.open) dialog.showModal()\n return\n } catch {\n // Fall back for jsdom or partial dialog implementations.\n }\n }\n\n dialog.setAttribute('open', '')\n}\n\nfunction closeDialogElement (dialog: HTMLDialogElement): void {\n try {\n if (typeof dialog.close === 'function' && dialog.open) {\n dialog.close()\n return\n }\n\n dialog.removeAttribute('open')\n } finally {\n unlockDocumentScroll(dialog.ownerDocument)\n }\n}\n\nfunction isMobileDialogLayout (dom: Document): boolean {\n return Boolean(dom.querySelector('[data-layout=\\'mobile\\']'))\n}\n\nfunction isFocusableElement (element: HTMLElement): boolean {\n if (element.hasAttribute('disabled')) return false\n if (element.getAttribute('aria-hidden') === 'true') return false\n if (element.getAttribute('hidden') !== null) return false\n if (element.tabIndex < 0) return false\n return true\n}\n\nfunction findPreferredInitialFocusTarget (container: ParentNode): HTMLElement | null {\n const focusableControls = container.querySelectorAll([\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'solid-ui-select:not([disabled])',\n 'solid-ui-combobox:not([disabled])',\n '[contenteditable=\"true\"]',\n 'button:not([disabled])',\n 'solid-ui-button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(','))\n\n for (const match of focusableControls) {\n if (match instanceof HTMLElement && isFocusableElement(match)) return match\n }\n\n return null\n}\n\nfunction focusInitialDialogTarget (dialog: HTMLDialogElement, description: HTMLDivElement, buttons: HTMLDivElement): void {\n if (isMobileDialogLayout(dialog.ownerDocument)) {\n dialog.tabIndex = -1\n dialog.focus()\n return\n }\n\n const initialTarget = findPreferredInitialFocusTarget(description)\n if (initialTarget) {\n initialTarget.focus()\n if (initialTarget instanceof HTMLInputElement || initialTarget instanceof HTMLTextAreaElement) {\n initialTarget.select()\n }\n return\n }\n\n const firstButton = findPreferredInitialFocusTarget(buttons)\n if (firstButton) {\n firstButton.focus()\n }\n}\n\nfunction collectFormValues (form: HTMLFormElement): InputDialogValues {\n const data = new FormData(form)\n const values: InputDialogValues = {}\n data.forEach((value, key) => {\n values[key] = String(value)\n })\n return values\n}\n\nfunction openModal ({\n title,\n message,\n buttons,\n headerAction,\n dom\n}: {\n title?: string,\n message?: string | Node,\n buttons: DialogButton[],\n headerAction?: DialogHeaderAction,\n dom: Document\n}) {\n const dialog = ensureModalDialog(dom)\n const elements = getDialogElements(dialog)\n\n openDialogElement(dialog)\n\n elements.title.textContent = title || ''\n elements.description.innerHTML = ''\n if (typeof message === 'string') {\n elements.description.textContent = message\n } else if (message) {\n elements.description.appendChild(message)\n }\n\n elements.buttons.innerHTML = ''\n clearModalError(elements)\n\n return new Promise<DialogButtonValue>((resolve) => {\n const finish = (value: DialogButtonValue) => {\n closeModal(value)\n resolve(value)\n }\n\n const requestCancel = () => {\n const cancelBtn = getSharedDialogCancelButton(dialog)\n if (cancelBtn) {\n cancelBtn.click()\n return\n }\n\n finish(false)\n }\n\n dialog.oncancel = (event: Event) => {\n event.preventDefault()\n requestCancel()\n }\n\n elements.headerAction.innerHTML = ''\n const resolvedHeaderAction = headerAction || { type: 'close' as const }\n if (resolvedHeaderAction.type === 'close') {\n const closeButton = dom.createElement('solid-ui-button') as DialogActionControl\n closeButton.setAttribute('variant', 'ghost')\n closeButton.setAttribute('aria-label', 'Close dialog')\n const iconSlot = dom.createElement('span')\n iconSlot.setAttribute('slot', 'icon')\n render(closeIcon, iconSlot)\n closeButton.appendChild(iconSlot)\n closeButton.onclick = () => requestCancel()\n elements.headerAction.appendChild(closeButton)\n } else if (resolvedHeaderAction.type === 'button') {\n const actionButton = dom.createElement('solid-ui-button') as DialogActionControl\n actionButton.setAttribute('variant', 'tertiary')\n actionButton.className = resolvedHeaderAction.className || ''\n actionButton.textContent = resolvedHeaderAction.label\n actionButton.setAttribute('label', resolvedHeaderAction.label)\n actionButton.setAttribute('aria-label', resolvedHeaderAction.ariaLabel || resolvedHeaderAction.label)\n actionButton.onclick = async () => {\n if (resolvedHeaderAction.onClick) {\n await resolvedHeaderAction.onClick()\n }\n }\n elements.headerAction.appendChild(actionButton)\n }\n\n buttons.forEach((btn) => {\n const b = dom.createElement('solid-ui-button') as DialogActionControl\n b.setAttribute('label', btn.label)\n b.setAttribute('variant', btn.primary ? 'primary' : 'secondary')\n b.textContent = btn.label\n if (btn.primary) {\n b.setAttribute('data-dialog-primary', 'true')\n }\n if (btn.cancel) {\n b.setAttribute('data-cancel', 'true')\n }\n b.addEventListener('click', async () => {\n if (btn.beforeClose) {\n const shouldClose = await btn.beforeClose()\n if (!shouldClose) return\n }\n finish(btn.value)\n })\n elements.buttons.appendChild(b)\n })\n\n const scheduleInitialFocus = dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n scheduleInitialFocus(() => {\n focusInitialDialogTarget(dialog, elements.description, elements.buttons)\n })\n })\n}\n\nfunction closeModal (_result: DialogButtonValue): void {\n if (modalDialog) {\n const elements = getDialogElements(modalDialog)\n clearModalError(elements)\n closeDialogElement(modalDialog)\n modalDialog.oncancel = null\n const headerActionButton = modalDialog.querySelector('#modal-header-action button') as HTMLButtonElement | null\n if (headerActionButton) headerActionButton.onclick = null\n }\n}\n\nexport function closeSharedDialog (): void {\n closeModal(null)\n}\n\nexport function alertDialog (message: string, title = 'Information', dom: Document) {\n return openModal({\n title,\n message,\n buttons: [{ label: 'OK', value: true, primary: true }],\n dom\n })\n}\n\nfunction updateSavingUI (dialog: HTMLDialogElement, submitLabel: string, isSaving: boolean) {\n const elements = getDialogElements(dialog)\n const saveButton = getSharedDialogSaveButton(dialog)\n const cancelButton = getSharedDialogCancelButton(dialog)\n\n dialog.classList.toggle('modal--saving', isSaving)\n dialog.setAttribute('aria-busy', String(isSaving))\n elements.description.toggleAttribute('inert', isSaving)\n\n if (isSaving) {\n const activeElement = dialog.ownerDocument.activeElement as HTMLElement | null\n if (activeElement && dialog.contains(activeElement)) {\n activeElement.blur()\n }\n }\n\n if (saveButton) {\n setDialogActionDisabled(saveButton, isSaving)\n saveButton.setAttribute('aria-busy', String(isSaving))\n setDialogActionLabel(saveButton, submitLabel)\n }\n\n if (cancelButton) {\n setDialogActionDisabled(cancelButton, isSaving)\n }\n\n elements.savingOverlay.hidden = !isSaving\n if (isSaving) {\n render(html`\n <div class=\"modal__saving-indicator inline-flex-row justify-center\" aria-live=\"polite\" aria-label=\"Saving changes\">\n ${createSpinner()}\n </div>\n `, elements.savingOverlay)\n } else {\n render(html``, elements.savingOverlay)\n }\n}\n\nexport function setSharedDialogSavingState (dom: Document, isSaving: boolean, submitLabel = 'Saving Changes'): void {\n const dialog = ensureModalDialog(dom)\n updateSavingUI(dialog, submitLabel, isSaving)\n}\n\ntype OpenInputDialogCustom = {\n title: string,\n dom: Document,\n form: HTMLFormElement,\n submitLabel?: string,\n cancelLabel?: string,\n headerAction?: DialogHeaderAction,\n hideFooterButtons?: boolean,\n onOpen?: () => void,\n shouldCloseWithoutSave?: () => Promise<boolean> | boolean,\n validate?: () => Promise<string | null> | string | null,\n onSave?: () => Promise<void> | void,\n formatSaveError?: (error: unknown) => string\n}\n\ntype InputDialogValues = Record<string, string>\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a reusable function to open a dialog with a form and return the form values on submit.\nThe function should also support validation and display error messages in the dialog.\nIt should reuse the OpenModal function for consistency. Done in 2 passes */\nexport function openInputDialog (options: OpenInputDialogCustom): Promise<InputDialogValues | null> {\n const submitLabel = options.submitLabel || 'Save Changes'\n const cancelLabel = options.cancelLabel || 'Cancel'\n const dialog = ensureModalDialog(options.dom)\n const elements = getDialogElements(dialog)\n\n const deriveDefaultFieldLabel = (value: string): string => value\n .replace(/^\\s*edit\\s+/i, '')\n .replace(/^\\s*add\\s+/i, '')\n .replace(/^\\s*create\\s+/i, '')\n .trim()\n\n const ensureFormControlsHaveAccessibleNames = () => {\n const titleLabel = deriveDefaultFieldLabel(options.title)\n if (!titleLabel) return\n\n const controls = Array.from(options.form.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>([\n 'input:not([type=\"hidden\"])',\n 'textarea',\n 'select'\n ].join(',')))\n\n if (controls.length !== 1) return\n\n const [control] = controls\n const hasExplicitLabel = control.hasAttribute('aria-label') || control.hasAttribute('aria-labelledby')\n const hasNativeLabel = Boolean(control.closest('label'))\n if (hasExplicitLabel || hasNativeLabel || control.getAttribute('type') === 'hidden') {\n return\n }\n\n if (!control.getAttribute('aria-label')) {\n control.setAttribute('aria-label', titleLabel)\n }\n }\n\n ensureFormControlsHaveAccessibleNames()\n\n const handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n const saveButton = getSharedDialogSaveButton(dialog)\n saveButton?.click()\n }\n\n options.form.addEventListener('submit', handleSubmit)\n\n const dialogPromise = openModal({\n title: options.title,\n message: options.form,\n headerAction: options.headerAction,\n buttons: [\n { label: cancelLabel, value: null, cancel: true },\n {\n label: submitLabel,\n value: 'save',\n primary: true,\n beforeClose: async () => {\n clearModalError(elements)\n\n if (options.shouldCloseWithoutSave && await options.shouldCloseWithoutSave()) {\n return true\n }\n\n if (options.validate) {\n const validationMessage = await options.validate()\n if (validationMessage) {\n setModalError(elements, validationMessage)\n return false\n }\n }\n\n if (!options.onSave) return true\n\n try {\n updateSavingUI(dialog, submitLabel, true)\n\n await options.onSave()\n return true\n } catch (error) {\n updateSavingUI(dialog, submitLabel, false)\n const fallback = options.formatSaveError ? options.formatSaveError(error) : undefined\n setModalError(elements, error, fallback)\n return false\n }\n }\n }\n ],\n dom: options.dom\n })\n\n const scheduleOpenCallback = options.dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => options.dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n if (options.onOpen) {\n scheduleOpenCallback(options.onOpen)\n }\n\n elements.buttons.hidden = Boolean(options.hideFooterButtons)\n\n return dialogPromise\n .then((result) => {\n if (result !== 'save') return null\n return collectFormValues(options.form)\n })\n .finally(() => {\n elements.buttons.hidden = false\n updateSavingUI(dialog, submitLabel, false)\n options.form.removeEventListener('submit', handleSubmit)\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dialog2.esm.js","names":["html","render","createSpinner","formatDisplayError","closeIcon","modalDialog","scrollLockState","WeakMap","getEventTargetElement","target","HTMLElement","Node","parentElement","getEventPath","event","composedPath","isDialogScrollRegionTarget","path","description","querySelector","includes","targetElement","contains","Boolean","closest","getDocumentScrollLockState","dom","state","get","count","previousHtmlOverflow","documentElement","style","overflow","previousBodyOverflow","body","removeScrollGuard","set","installDocumentScrollGuard","preventBackgroundScroll","preventDefault","addEventListener","capture","passive","removeEventListener","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","tagName","setDialogActionDisabled","disabled","toggleAttribute","setDialogActionLabel","label","setAttribute","textContent","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","appendChild","createElement","id","innerHTML","getDialogElements","dialog","title","headerAction","error","buttons","savingOverlay","syncDialogErrorDescription","elements","defaultDescription","describedBy","hidden","trim","clearModalError","setModalError","fallbackMessage","openDialogElement","ownerDocument","showModal","open","closeDialogElement","close","removeAttribute","isMobileDialogLayout","isFocusableElement","element","hasAttribute","getAttribute","tabIndex","findPreferredInitialFocusTarget","container","focusableControls","querySelectorAll","join","match","focusInitialDialogTarget","focus","initialTarget","HTMLInputElement","HTMLTextAreaElement","select","firstButton","collectFormValues","form","data","FormData","values","forEach","value","key","String","openModal","message","Promise","resolve","finish","closeModal","requestCancel","cancelBtn","click","oncancel","resolvedHeaderAction","type","closeButton","iconSlot","onclick","actionButton","className","ariaLabel","onClick","btn","b","primary","cancel","beforeClose","shouldClose","scheduleInitialFocus","defaultView","requestAnimationFrame","callback","setTimeout","_result","headerActionButton","closeSharedDialog","alertDialog","updateSavingUI","submitLabel","isSaving","saveButton","cancelButton","classList","toggle","activeElement","blur","setSharedDialogSavingState","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","replace","ensureFormControlsHaveAccessibleNames","titleLabel","controls","Array","from","length","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","shouldCloseWithoutSave","validate","validationMessage","onSave","fallback","formatSaveError","undefined","scheduleOpenCallback","onOpen","hideFooterButtons","then","result","finally","closeIcon","modalDialog","scrollLockState","getEventTargetElement","target","getEventPath","event","isDialogScrollRegionTarget","path","description","targetElement","getDocumentScrollLockState","state","dom","installDocumentScrollGuard","preventBackgroundScroll","lockDocumentScroll","unlockDocumentScroll","getDialogMountTarget","isSolidUiButton","control","setDialogActionDisabled","disabled","setDialogActionLabel","label","getSharedDialogSaveButton","root","getSharedDialogCancelButton","ensureModalDialog","mountTarget","getDialogElements","dialog","syncDialogErrorDescription","defaultDescription","describedBy","elements","clearModalError","setModalError","formatDisplayError","error","fallbackMessage","openDialogElement","closeDialogElement","isMobileDialogLayout","isFocusableElement","element","findPreferredInitialFocusTarget","focusableControls","container","match","focusInitialDialogTarget","initialTarget","firstButton","buttons","collectFormValues","data","form","values","key","value","openModal","title","message","finish","closeModal","resolve","requestCancel","cancelBtn","resolvedHeaderAction","headerAction","closeButton","iconSlot","render","actionButton","b","btn","callback","headerActionButton","updateSavingUI","saveButton","cancelButton","isSaving","activeElement","submitLabel","createSpinner","openInputDialog","options","cancelLabel","deriveDefaultFieldLabel","titleLabel","controls","hasExplicitLabel","hasNativeLabel","handleSubmit","dialogPromise","validationMessage","fallback","scheduleOpenCallback","result"],"sources":["../../../../../src/components/profile-heading/editor/ui/dialog.ts"],"sourcesContent":["import './dialog.css'\nimport 'solid-ui/components/button'\nimport '~icons/lucide/x'\nimport { html, render } from 'lit-html'\nimport { createSpinner } from './spinner'\nimport { formatDisplayError } from '../utils/errorDisplay'\n\nconst closeIcon = html`<icon-lucide-x aria-hidden=\"true\" focusable=\"false\" style=\"width:12px;height:12px;color:#667085\"></icon-lucide-x>`\n\n/* Copied from issue-pane, minor typescript adjustments */\n/* Changed modal from div to dialog element */\nlet modalDialog: HTMLDialogElement | null = null\n\nconst scrollLockState = new WeakMap<Document, {\n count: number,\n previousHtmlOverflow: string,\n previousBodyOverflow: string,\n removeScrollGuard: (() => void) | null\n}>()\n\nfunction getEventTargetElement (target: EventTarget | null): HTMLElement | null {\n if (target instanceof HTMLElement) return target\n if (target instanceof Node) return target.parentElement\n return null\n}\n\nfunction getEventPath (event: Event): EventTarget[] {\n if (typeof event.composedPath === 'function') {\n return event.composedPath()\n }\n\n return event.target ? [event.target] : []\n}\n\nfunction isDialogScrollRegionTarget (event: Event): boolean {\n const path = getEventPath(event)\n const description = modalDialog?.querySelector('#modal-desc')\n\n if (description && path.includes(description)) {\n return true\n }\n\n if (modalDialog && path.includes(modalDialog)) {\n return true\n }\n\n const targetElement = getEventTargetElement(event.target)\n if (!targetElement || !modalDialog || !modalDialog.contains(targetElement)) {\n return false\n }\n\n return Boolean(targetElement.closest('#modal-desc'))\n}\n\nfunction getDocumentScrollLockState (dom: Document) {\n let state = scrollLockState.get(dom)\n if (!state) {\n state = {\n count: 0,\n previousHtmlOverflow: dom.documentElement.style.overflow,\n previousBodyOverflow: dom.body.style.overflow,\n removeScrollGuard: null\n }\n scrollLockState.set(dom, state)\n }\n return state\n}\n\nfunction installDocumentScrollGuard (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.removeScrollGuard) return\n\n const preventBackgroundScroll = (event: Event) => {\n if (!isDialogScrollRegionTarget(event)) {\n event.preventDefault()\n }\n }\n\n dom.addEventListener('wheel', preventBackgroundScroll, { capture: true, passive: false })\n dom.addEventListener('touchmove', preventBackgroundScroll, { capture: true, passive: false })\n state.removeScrollGuard = () => {\n dom.removeEventListener('wheel', preventBackgroundScroll, true)\n dom.removeEventListener('touchmove', preventBackgroundScroll, true)\n state.removeScrollGuard = null\n }\n}\n\nfunction lockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n\n if (state.count === 0) {\n state.previousHtmlOverflow = dom.documentElement.style.overflow\n state.previousBodyOverflow = dom.body.style.overflow\n\n dom.documentElement.style.overflow = 'hidden'\n dom.body.style.overflow = 'hidden'\n installDocumentScrollGuard(dom)\n }\n\n state.count += 1\n}\n\nfunction unlockDocumentScroll (dom: Document): void {\n const state = getDocumentScrollLockState(dom)\n if (state.count === 0) return\n\n state.count -= 1\n if (state.count > 0) return\n\n dom.documentElement.style.overflow = state.previousHtmlOverflow\n dom.body.style.overflow = state.previousBodyOverflow\n state.removeScrollGuard?.()\n state.removeScrollGuard = null\n}\n\nfunction getDialogMountTarget (dom: Document): HTMLElement {\n return dom.body\n}\n\ntype DialogButtonValue = boolean | 'save' | null\ntype DialogButton = {\n label: string,\n value: DialogButtonValue,\n primary?: boolean,\n cancel?: boolean,\n beforeClose?: () => Promise<boolean> | boolean\n}\n\ntype DialogHeaderAction =\n | { type: 'close' }\n | { type: 'none' }\n | {\n type: 'button',\n label: string,\n ariaLabel?: string,\n className?: string,\n onClick?: () => Promise<void> | void\n }\n\ntype DialogElements = {\n dialog: HTMLDialogElement,\n title: HTMLHeadingElement,\n headerAction: HTMLDivElement,\n description: HTMLDivElement,\n error: HTMLElement,\n buttons: HTMLDivElement,\n savingOverlay: HTMLDivElement\n}\n\ntype DialogActionControl = HTMLElement & {\n disabled?: boolean,\n label?: string,\n click: () => void,\n shadowRoot?: ShadowRoot | null\n}\n\nfunction isSolidUiButton (control: Element | null): control is DialogActionControl {\n return control?.tagName === 'SOLID-UI-BUTTON'\n}\n\nfunction setDialogActionDisabled (control: DialogActionControl | null, disabled: boolean): void {\n if (!control) return\n control.disabled = disabled\n control.toggleAttribute('disabled', disabled)\n}\n\nfunction setDialogActionLabel (control: DialogActionControl | null, label: string): void {\n if (!control) return\n\n if (isSolidUiButton(control)) {\n control.label = label\n control.setAttribute('label', label)\n control.textContent = label\n return\n }\n\n ;(control as HTMLElement).textContent = label\n}\n\nexport function getSharedDialogSaveButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-dialog-primary=\"true\"]') as DialogActionControl | null\n}\n\nexport function getSharedDialogCancelButton (root: ParentNode): DialogActionControl | null {\n return root.querySelector('#modal-buttons [data-cancel=\"true\"]') as DialogActionControl | null\n}\n\nfunction ensureModalDialog (dom: Document): HTMLDialogElement {\n const mountTarget = getDialogMountTarget(dom)\n\n // if we previously created a dialog but it was removed from the document\n // (tests clear body), rebuild it. Checking presence ensures our reference\n // doesn't point at a detached element.\n if (modalDialog && dom.body.contains(modalDialog)) {\n if (modalDialog.parentElement !== mountTarget) {\n mountTarget.appendChild(modalDialog)\n }\n return modalDialog\n }\n\n modalDialog = null\n modalDialog = dom.createElement('dialog')\n modalDialog.id = 'profile-modal'\n modalDialog.setAttribute('aria-modal', 'true')\n modalDialog.setAttribute('aria-labelledby', 'modal-title')\n modalDialog.setAttribute('aria-describedby', 'modal-desc')\n\n modalDialog.innerHTML = `\n <div class=\"modal\">\n <div class=\"modal-header flex-row align-center justify-between\">\n <h2 id=\"modal-title\"></h2>\n <div id=\"modal-header-action\" class=\"flex-row align-center\"></div>\n </div>\n <div id=\"modal-desc\"></div>\n <section id=\"modal-error\" class=\"modal__error-section\" aria-live=\"assertive\" aria-atomic=\"true\" aria-hidden=\"true\" role=\"alert\" tabindex=\"-1\" hidden></section>\n <div id=\"modal-buttons\" class=\"flex-row align-center justify-end\"></div>\n <div id=\"modal-saving-overlay\" hidden></div>\n </div>\n `\n\n mountTarget.appendChild(modalDialog)\n return modalDialog\n}\n\nfunction getDialogElements (dialog: HTMLDialogElement): DialogElements {\n return {\n dialog,\n title: dialog.querySelector('#modal-title') as HTMLHeadingElement,\n headerAction: dialog.querySelector('#modal-header-action') as HTMLDivElement,\n description: dialog.querySelector('#modal-desc') as HTMLDivElement,\n error: dialog.querySelector('#modal-error') as HTMLElement,\n buttons: dialog.querySelector('#modal-buttons') as HTMLDivElement,\n savingOverlay: dialog.querySelector('#modal-saving-overlay') as HTMLDivElement\n }\n}\n\nfunction syncDialogErrorDescription (elements: DialogElements): void {\n const defaultDescription = 'modal-desc'\n const describedBy = elements.error.hidden || !elements.error.textContent?.trim()\n ? defaultDescription\n : `${defaultDescription} modal-error`\n\n elements.dialog.setAttribute('aria-describedby', describedBy)\n}\n\nfunction clearModalError (elements: DialogElements): void {\n elements.error.textContent = ''\n elements.error.setAttribute('aria-hidden', 'true')\n elements.error.hidden = true\n syncDialogErrorDescription(elements)\n}\n\nfunction setModalError (elements: DialogElements, error: unknown, fallbackMessage?: string): void {\n elements.error.textContent = formatDisplayError(error, fallbackMessage)\n elements.error.setAttribute('aria-hidden', 'false')\n elements.error.hidden = false\n syncDialogErrorDescription(elements)\n}\n\nfunction openDialogElement (dialog: HTMLDialogElement): void {\n lockDocumentScroll(dialog.ownerDocument)\n\n if (typeof dialog.showModal === 'function') {\n try {\n if (!dialog.open) dialog.showModal()\n return\n } catch {\n // Fall back for jsdom or partial dialog implementations.\n }\n }\n\n dialog.setAttribute('open', '')\n}\n\nfunction closeDialogElement (dialog: HTMLDialogElement): void {\n try {\n if (typeof dialog.close === 'function' && dialog.open) {\n dialog.close()\n return\n }\n\n dialog.removeAttribute('open')\n } finally {\n unlockDocumentScroll(dialog.ownerDocument)\n }\n}\n\nfunction isMobileDialogLayout (dom: Document): boolean {\n return Boolean(dom.querySelector('[data-layout=\\'mobile\\']'))\n}\n\nfunction isFocusableElement (element: HTMLElement): boolean {\n if (element.hasAttribute('disabled')) return false\n if (element.getAttribute('aria-hidden') === 'true') return false\n if (element.getAttribute('hidden') !== null) return false\n if (element.tabIndex < 0) return false\n return true\n}\n\nfunction findPreferredInitialFocusTarget (container: ParentNode): HTMLElement | null {\n const focusableControls = container.querySelectorAll([\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'solid-ui-select:not([disabled])',\n 'solid-ui-combobox:not([disabled])',\n '[contenteditable=\"true\"]',\n 'button:not([disabled])',\n 'solid-ui-button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n ].join(','))\n\n for (const match of focusableControls) {\n if (match instanceof HTMLElement && isFocusableElement(match)) return match\n }\n\n return null\n}\n\nfunction focusInitialDialogTarget (dialog: HTMLDialogElement, description: HTMLDivElement, buttons: HTMLDivElement): void {\n if (isMobileDialogLayout(dialog.ownerDocument)) {\n dialog.tabIndex = -1\n dialog.focus()\n return\n }\n\n const initialTarget = findPreferredInitialFocusTarget(description)\n if (initialTarget) {\n initialTarget.focus()\n if (initialTarget instanceof HTMLInputElement || initialTarget instanceof HTMLTextAreaElement) {\n initialTarget.select()\n }\n return\n }\n\n const firstButton = findPreferredInitialFocusTarget(buttons)\n if (firstButton) {\n firstButton.focus()\n }\n}\n\nfunction collectFormValues (form: HTMLFormElement): InputDialogValues {\n const data = new FormData(form)\n const values: InputDialogValues = {}\n data.forEach((value, key) => {\n values[key] = String(value)\n })\n return values\n}\n\nfunction openModal ({\n title,\n message,\n buttons,\n headerAction,\n dom\n}: {\n title?: string,\n message?: string | Node,\n buttons: DialogButton[],\n headerAction?: DialogHeaderAction,\n dom: Document\n}) {\n const dialog = ensureModalDialog(dom)\n const elements = getDialogElements(dialog)\n\n openDialogElement(dialog)\n\n elements.title.textContent = title || ''\n elements.description.innerHTML = ''\n if (typeof message === 'string') {\n elements.description.textContent = message\n } else if (message) {\n elements.description.appendChild(message)\n }\n\n elements.buttons.innerHTML = ''\n clearModalError(elements)\n\n return new Promise<DialogButtonValue>((resolve) => {\n const finish = (value: DialogButtonValue) => {\n closeModal(value)\n resolve(value)\n }\n\n const requestCancel = () => {\n const cancelBtn = getSharedDialogCancelButton(dialog)\n if (cancelBtn) {\n cancelBtn.click()\n return\n }\n\n finish(false)\n }\n\n dialog.oncancel = (event: Event) => {\n event.preventDefault()\n requestCancel()\n }\n\n elements.headerAction.innerHTML = ''\n const resolvedHeaderAction = headerAction || { type: 'close' as const }\n if (resolvedHeaderAction.type === 'close') {\n const closeButton = dom.createElement('solid-ui-button') as DialogActionControl\n closeButton.setAttribute('variant', 'ghost')\n closeButton.setAttribute('aria-label', 'Close dialog')\n const iconSlot = dom.createElement('span')\n iconSlot.setAttribute('slot', 'icon')\n render(closeIcon, iconSlot)\n closeButton.appendChild(iconSlot)\n closeButton.onclick = () => requestCancel()\n elements.headerAction.appendChild(closeButton)\n } else if (resolvedHeaderAction.type === 'button') {\n const actionButton = dom.createElement('solid-ui-button') as DialogActionControl\n actionButton.setAttribute('variant', 'tertiary')\n actionButton.className = resolvedHeaderAction.className || ''\n actionButton.textContent = resolvedHeaderAction.label\n actionButton.setAttribute('label', resolvedHeaderAction.label)\n actionButton.setAttribute('aria-label', resolvedHeaderAction.ariaLabel || resolvedHeaderAction.label)\n actionButton.onclick = async () => {\n if (resolvedHeaderAction.onClick) {\n await resolvedHeaderAction.onClick()\n }\n }\n elements.headerAction.appendChild(actionButton)\n }\n\n buttons.forEach((btn) => {\n const b = dom.createElement('solid-ui-button') as DialogActionControl\n b.setAttribute('label', btn.label)\n b.setAttribute('variant', btn.primary ? 'primary' : 'secondary')\n b.textContent = btn.label\n if (btn.primary) {\n b.setAttribute('data-dialog-primary', 'true')\n }\n if (btn.cancel) {\n b.setAttribute('data-cancel', 'true')\n }\n b.addEventListener('click', async () => {\n if (btn.beforeClose) {\n const shouldClose = await btn.beforeClose()\n if (!shouldClose) return\n }\n finish(btn.value)\n })\n elements.buttons.appendChild(b)\n })\n\n const scheduleInitialFocus = dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n scheduleInitialFocus(() => {\n focusInitialDialogTarget(dialog, elements.description, elements.buttons)\n })\n })\n}\n\nfunction closeModal (_result: DialogButtonValue): void {\n if (modalDialog) {\n const elements = getDialogElements(modalDialog)\n clearModalError(elements)\n closeDialogElement(modalDialog)\n modalDialog.oncancel = null\n const headerActionButton = modalDialog.querySelector('#modal-header-action button') as HTMLButtonElement | null\n if (headerActionButton) headerActionButton.onclick = null\n }\n}\n\nexport function closeSharedDialog (): void {\n closeModal(null)\n}\n\nexport function alertDialog (message: string, title = 'Information', dom: Document) {\n return openModal({\n title,\n message,\n buttons: [{ label: 'OK', value: true, primary: true }],\n dom\n })\n}\n\nfunction updateSavingUI (dialog: HTMLDialogElement, submitLabel: string, isSaving: boolean) {\n const elements = getDialogElements(dialog)\n const saveButton = getSharedDialogSaveButton(dialog)\n const cancelButton = getSharedDialogCancelButton(dialog)\n\n dialog.classList.toggle('modal--saving', isSaving)\n dialog.setAttribute('aria-busy', String(isSaving))\n elements.description.toggleAttribute('inert', isSaving)\n\n if (isSaving) {\n const activeElement = dialog.ownerDocument.activeElement as HTMLElement | null\n if (activeElement && dialog.contains(activeElement)) {\n activeElement.blur()\n }\n }\n\n if (saveButton) {\n setDialogActionDisabled(saveButton, isSaving)\n saveButton.setAttribute('aria-busy', String(isSaving))\n setDialogActionLabel(saveButton, submitLabel)\n }\n\n if (cancelButton) {\n setDialogActionDisabled(cancelButton, isSaving)\n }\n\n elements.savingOverlay.hidden = !isSaving\n if (isSaving) {\n render(html`\n <div class=\"modal__saving-indicator inline-flex-row justify-center\" aria-live=\"polite\" aria-label=\"Saving changes\">\n ${createSpinner()}\n </div>\n `, elements.savingOverlay)\n } else {\n render(html``, elements.savingOverlay)\n }\n}\n\nexport function setSharedDialogSavingState (dom: Document, isSaving: boolean, submitLabel = 'Saving Changes'): void {\n const dialog = ensureModalDialog(dom)\n updateSavingUI(dialog, submitLabel, isSaving)\n}\n\ntype OpenInputDialogCustom = {\n title: string,\n dom: Document,\n form: HTMLFormElement,\n submitLabel?: string,\n cancelLabel?: string,\n headerAction?: DialogHeaderAction,\n hideFooterButtons?: boolean,\n onOpen?: () => void,\n shouldCloseWithoutSave?: () => Promise<boolean> | boolean,\n validate?: () => Promise<string | null> | string | null,\n onSave?: () => Promise<void> | void,\n formatSaveError?: (error: unknown) => string\n}\n\ntype InputDialogValues = Record<string, string>\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a reusable function to open a dialog with a form and return the form values on submit.\nThe function should also support validation and display error messages in the dialog.\nIt should reuse the OpenModal function for consistency. Done in 2 passes */\nexport function openInputDialog (options: OpenInputDialogCustom): Promise<InputDialogValues | null> {\n const submitLabel = options.submitLabel || 'Save Changes'\n const cancelLabel = options.cancelLabel || 'Cancel'\n const dialog = ensureModalDialog(options.dom)\n const elements = getDialogElements(dialog)\n\n const deriveDefaultFieldLabel = (value: string): string => value\n .replace(/^\\s*edit\\s+/i, '')\n .replace(/^\\s*add\\s+/i, '')\n .replace(/^\\s*create\\s+/i, '')\n .trim()\n\n const ensureFormControlsHaveAccessibleNames = () => {\n const titleLabel = deriveDefaultFieldLabel(options.title)\n if (!titleLabel) return\n\n const controls = Array.from(options.form.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>([\n 'input:not([type=\"hidden\"])',\n 'textarea',\n 'select'\n ].join(',')))\n\n if (controls.length !== 1) return\n\n const [control] = controls\n const hasExplicitLabel = control.hasAttribute('aria-label') || control.hasAttribute('aria-labelledby')\n const hasNativeLabel = Boolean(control.closest('label'))\n if (hasExplicitLabel || hasNativeLabel || control.getAttribute('type') === 'hidden') {\n return\n }\n\n if (!control.getAttribute('aria-label')) {\n control.setAttribute('aria-label', titleLabel)\n }\n }\n\n ensureFormControlsHaveAccessibleNames()\n\n const handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n const saveButton = getSharedDialogSaveButton(dialog)\n saveButton?.click()\n }\n\n options.form.addEventListener('submit', handleSubmit)\n\n const dialogPromise = openModal({\n title: options.title,\n message: options.form,\n headerAction: options.headerAction,\n buttons: [\n { label: cancelLabel, value: null, cancel: true },\n {\n label: submitLabel,\n value: 'save',\n primary: true,\n beforeClose: async () => {\n clearModalError(elements)\n\n if (options.shouldCloseWithoutSave && await options.shouldCloseWithoutSave()) {\n return true\n }\n\n if (options.validate) {\n const validationMessage = await options.validate()\n if (validationMessage) {\n setModalError(elements, validationMessage)\n return false\n }\n }\n\n if (!options.onSave) return true\n\n try {\n updateSavingUI(dialog, submitLabel, true)\n\n await options.onSave()\n return true\n } catch (error) {\n updateSavingUI(dialog, submitLabel, false)\n const fallback = options.formatSaveError ? options.formatSaveError(error) : undefined\n setModalError(elements, error, fallback)\n return false\n }\n }\n }\n ],\n dom: options.dom\n })\n\n const scheduleOpenCallback = options.dom.defaultView?.requestAnimationFrame\n ? (callback: () => void) => options.dom.defaultView?.requestAnimationFrame(() => callback())\n : (callback: () => void) => setTimeout(callback, 0)\n\n if (options.onOpen) {\n scheduleOpenCallback(options.onOpen)\n }\n\n elements.buttons.hidden = Boolean(options.hideFooterButtons)\n\n return dialogPromise\n .then((result) => {\n if (result !== 'save') return null\n return collectFormValues(options.form)\n })\n .finally(() => {\n elements.buttons.hidden = false\n updateSavingUI(dialog, submitLabel, false)\n options.form.removeEventListener('submit', handleSubmit)\n })\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { html as e } from "lit-html";
|
|
2
|
-
|
|
2
|
+
// src/components/profile-heading/editor/ui/spinner.ts
|
|
3
3
|
function t() {
|
|
4
4
|
return e`
|
|
5
5
|
<span class="loading-spinner" aria-hidden="true"></span>
|
|
6
6
|
<span class="sr-only">Saving...</span>
|
|
7
7
|
`;
|
|
8
8
|
}
|
|
9
|
-
//#endregion
|
|
10
9
|
export { t as createSpinner };
|
|
11
10
|
|
|
12
11
|
//# sourceMappingURL=spinner.esm.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/components/profile-heading/editor/utils/errorDisplay.ts
|
|
2
2
|
function e(e) {
|
|
3
3
|
if (typeof e == "string") return e;
|
|
4
4
|
if (e instanceof Error) return e.message || e.name;
|
|
@@ -12,7 +12,6 @@ function e(e) {
|
|
|
12
12
|
function t(t, n) {
|
|
13
13
|
return (n || e(t) || "Something went wrong.").trim();
|
|
14
14
|
}
|
|
15
|
-
//#endregion
|
|
16
15
|
export { t as formatDisplayError };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=errorDisplay.esm.js.map
|