@bitrise/bitkit-v2 0.3.475-beta.3014 → 0.3.476
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 +5 -6
- package/dist/atoms/DatePicker/DatePicker.js.map +1 -1
- package/dist/atoms/ImageCropper/ImageCropper.js.map +1 -1
- package/dist/components/BitkitActionMenu/BitkitActionMenu.js.map +1 -1
- package/dist/components/BitkitAvatar/BitkitAvatar.js.map +1 -1
- package/dist/components/BitkitButton/BitkitButton.js.map +1 -1
- package/dist/components/BitkitCalendar/BitkitCalendar.d.ts +0 -12
- package/dist/components/BitkitCalendar/BitkitCalendar.js +1 -7
- package/dist/components/BitkitCalendar/BitkitCalendar.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarContent.d.ts +1 -5
- package/dist/components/BitkitCalendar/components/CalendarContent.js +43 -60
- package/dist/components/BitkitCalendar/components/CalendarContent.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarMonth.d.ts +2 -4
- package/dist/components/BitkitCalendar/components/CalendarMonth.js +5 -15
- package/dist/components/BitkitCalendar/components/CalendarMonth.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.d.ts +1 -2
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.js +2 -3
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.d.ts +1 -3
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.js +3 -3
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.d.ts +1 -3
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.js +3 -3
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarSelect.d.ts +0 -1
- package/dist/components/BitkitCalendar/components/CalendarSelect.js +2 -4
- package/dist/components/BitkitCalendar/components/CalendarSelect.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.d.ts +1 -2
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.js +2 -3
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.js.map +1 -1
- package/dist/components/BitkitCollapsible/BitkitCollapsible.js.map +1 -1
- package/dist/components/BitkitColorButton/BitkitColorButton.js.map +1 -1
- package/dist/components/BitkitDatePicker/BitkitDatePicker.d.ts +0 -2
- package/dist/components/BitkitDatePicker/BitkitDatePicker.js +1 -2
- package/dist/components/BitkitDatePicker/BitkitDatePicker.js.map +1 -1
- package/dist/components/BitkitDialog/BitkitStepsDialog.js.map +1 -1
- package/dist/components/BitkitDialog/BitkitStepsDialogStep.js.map +1 -1
- package/dist/components/BitkitDialog/DialogBodyContext.js.map +1 -1
- package/dist/components/BitkitExpandableCard/BitkitExpandableCard.js.map +1 -1
- package/dist/components/BitkitFileInput/BitkitFileInput.js.map +1 -1
- package/dist/components/BitkitIconButton/BitkitIconButton.js.map +1 -1
- package/dist/components/BitkitLabeledData/BitkitLabeledData.js.map +1 -1
- package/dist/components/BitkitList/BitkitList.js.map +1 -1
- package/dist/components/BitkitMarkdown/BitkitMarkdown.js +1 -1
- package/dist/components/BitkitMarkdown/BitkitMarkdown.js.map +1 -1
- package/dist/components/BitkitMarkdownCard/BitkitMarkdownCard.js.map +1 -1
- package/dist/components/BitkitMultiselect/BitkitMultiselect.js.map +1 -1
- package/dist/components/BitkitNoteCard/BitkitNoteCard.js +1 -1
- package/dist/components/BitkitNoteCard/BitkitNoteCard.js.map +1 -1
- package/dist/components/BitkitOverflowContent/BitkitOverflowContent.js.map +1 -1
- package/dist/components/BitkitPageSidebar/BitkitPageSidebar.js.map +1 -1
- package/dist/components/BitkitPagination/BitkitPagination.js.map +1 -1
- package/dist/components/BitkitPaginationLoadMore/BitkitPaginationLoadMore.js.map +1 -1
- package/dist/components/BitkitPopover/BitkitPopover.js.map +1 -1
- package/dist/components/BitkitPromoBanner/BitkitPromoBanner.js.map +1 -1
- package/dist/components/BitkitSegmentedControl/BitkitSegmentedControl.js.map +1 -1
- package/dist/components/BitkitSelectMenu/BitkitSelectMenuAction.js.map +1 -1
- package/dist/components/BitkitSettingsCard/BitkitSettingsCard.js.map +1 -1
- package/dist/components/BitkitSplitButton/BitkitSplitButton.js.map +1 -1
- package/dist/components/BitkitStat/BitkitStat.js.map +1 -1
- package/dist/components/BitkitStepsCard/BitkitStepsCard.js.map +1 -1
- package/dist/components/BitkitTable/BitkitExpandableRow.js.map +1 -1
- package/dist/components/BitkitTable/BitkitRowActionsCell.js.map +1 -1
- package/dist/components/BitkitTable/BitkitSortableColumnHeader.js.map +1 -1
- package/dist/components/BitkitTabs/BitkitTabs.js.map +1 -1
- package/dist/components/BitkitToggletip/BitkitToggletip.js.map +1 -1
- package/dist/components/BitkitTour/BitkitTour.js.map +1 -1
- package/dist/components/BitkitTreeView/BitkitTreeView.js.map +1 -1
- package/dist/components/BitkitUISideNav/UISideNavLink.js.map +1 -1
- package/dist/components/common/NotificationContent.js.map +1 -1
- package/dist/components/index.d.ts +0 -6
- package/dist/icons/IconAbortCircle.js.map +1 -1
- package/dist/icons/IconAbortCircleFilled.js.map +1 -1
- package/dist/icons/IconAddons.js.map +1 -1
- package/dist/icons/IconAgent.js.map +1 -1
- package/dist/icons/IconAnchor.js.map +1 -1
- package/dist/icons/IconAndroid.js.map +1 -1
- package/dist/icons/IconApp.js.map +1 -1
- package/dist/icons/IconAppSettings.js.map +1 -1
- package/dist/icons/IconAppStore.js.map +1 -1
- package/dist/icons/IconAppStoreColor.js.map +1 -1
- package/dist/icons/IconApple.js.map +1 -1
- package/dist/icons/IconArchive.js.map +1 -1
- package/dist/icons/IconArchiveDelete.js.map +1 -1
- package/dist/icons/IconArchiveRestore.js.map +1 -1
- package/dist/icons/IconArrowBackAndDown.js.map +1 -1
- package/dist/icons/IconArrowBackAndUp.js.map +1 -1
- package/dist/icons/IconArrowDown.js.map +1 -1
- package/dist/icons/IconArrowForwardAndDown.js.map +1 -1
- package/dist/icons/IconArrowForwardAndUp.js.map +1 -1
- package/dist/icons/IconArrowLeft.js.map +1 -1
- package/dist/icons/IconArrowNortheast.js.map +1 -1
- package/dist/icons/IconArrowNorthwest.js.map +1 -1
- package/dist/icons/IconArrowRight.js.map +1 -1
- package/dist/icons/IconArrowUp.js.map +1 -1
- package/dist/icons/IconArrowsHorizontal.js.map +1 -1
- package/dist/icons/IconArrowsVertical.js.map +1 -1
- package/dist/icons/IconAutomation.js.map +1 -1
- package/dist/icons/IconAws.js.map +1 -1
- package/dist/icons/IconAwsColor.js.map +1 -1
- package/dist/icons/IconBadge3RdParty.js.map +1 -1
- package/dist/icons/IconBadgeBitrise.js.map +1 -1
- package/dist/icons/IconBadgeUpgrade.js.map +1 -1
- package/dist/icons/IconBadgeVersionOk.js.map +1 -1
- package/dist/icons/IconBazel.js.map +1 -1
- package/dist/icons/IconBell.js.map +1 -1
- package/dist/icons/IconBitbot.js.map +1 -1
- package/dist/icons/IconBitbotError.js.map +1 -1
- package/dist/icons/IconBitbucket.js.map +1 -1
- package/dist/icons/IconBitbucketColor.js.map +1 -1
- package/dist/icons/IconBitbucketNeutral.js.map +1 -1
- package/dist/icons/IconBitbucketWhite.js.map +1 -1
- package/dist/icons/IconBlockCircle.js.map +1 -1
- package/dist/icons/IconBook.js.map +1 -1
- package/dist/icons/IconBoxArrowDown.js.map +1 -1
- package/dist/icons/IconBoxDot.js.map +1 -1
- package/dist/icons/IconBoxLinesOverflow.js.map +1 -1
- package/dist/icons/IconBoxLinesWrap.js.map +1 -1
- package/dist/icons/IconBranch.js.map +1 -1
- package/dist/icons/IconBrowserstackColor.js.map +1 -1
- package/dist/icons/IconBug.js.map +1 -1
- package/dist/icons/IconBuild.js.map +1 -1
- package/dist/icons/IconBuildCache.js.map +1 -1
- package/dist/icons/IconBuildCacheFilled.js.map +1 -1
- package/dist/icons/IconBuildEnvSetup.js.map +1 -1
- package/dist/icons/IconBuildHub.js.map +1 -1
- package/dist/icons/IconBuildHubFilled.js.map +1 -1
- package/dist/icons/IconCalendar.js.map +1 -1
- package/dist/icons/IconChangePlan.js.map +1 -1
- package/dist/icons/IconChat.js.map +1 -1
- package/dist/icons/IconCheck.js.map +1 -1
- package/dist/icons/IconCheckCircle.js.map +1 -1
- package/dist/icons/IconCheckCircleFilled.js.map +1 -1
- package/dist/icons/IconChevronDown.js.map +1 -1
- package/dist/icons/IconChevronLeft.js.map +1 -1
- package/dist/icons/IconChevronRight.js.map +1 -1
- package/dist/icons/IconChevronUp.js.map +1 -1
- package/dist/icons/IconCi.js.map +1 -1
- package/dist/icons/IconCiFilled.js.map +1 -1
- package/dist/icons/IconCircle.js.map +1 -1
- package/dist/icons/IconCircleDashed.js.map +1 -1
- package/dist/icons/IconCircleHalfFilled.js.map +1 -1
- package/dist/icons/IconClaude.js.map +1 -1
- package/dist/icons/IconClaudeColor.js.map +1 -1
- package/dist/icons/IconClock.js.map +1 -1
- package/dist/icons/IconCode.js.map +1 -1
- package/dist/icons/IconCodePush.js.map +1 -1
- package/dist/icons/IconCodeSigning.js.map +1 -1
- package/dist/icons/IconCoffee.js.map +1 -1
- package/dist/icons/IconCommit.js.map +1 -1
- package/dist/icons/IconConfigure.js.map +1 -1
- package/dist/icons/IconConnectedAccounts.js.map +1 -1
- package/dist/icons/IconContainer.js.map +1 -1
- package/dist/icons/IconCopilot.js.map +1 -1
- package/dist/icons/IconCopy.js.map +1 -1
- package/dist/icons/IconCordova.js.map +1 -1
- package/dist/icons/IconCpu.js.map +1 -1
- package/dist/icons/IconCreditcard.js.map +1 -1
- package/dist/icons/IconCredits.js.map +1 -1
- package/dist/icons/IconCross.js.map +1 -1
- package/dist/icons/IconCrossCircle.js.map +1 -1
- package/dist/icons/IconCrossCircleFilled.js.map +1 -1
- package/dist/icons/IconCrown.js.map +1 -1
- package/dist/icons/IconCursor.js.map +1 -1
- package/dist/icons/IconCycle.js.map +1 -1
- package/dist/icons/IconDashboard.js.map +1 -1
- package/dist/icons/IconDashboardFilled.js.map +1 -1
- package/dist/icons/IconDeployment.js.map +1 -1
- package/dist/icons/IconDetails.js.map +1 -1
- package/dist/icons/IconDoc.js.map +1 -1
- package/dist/icons/IconDollar.js.map +1 -1
- package/dist/icons/IconDot.js.map +1 -1
- package/dist/icons/IconDotnet.js.map +1 -1
- package/dist/icons/IconDotnetColor.js.map +1 -1
- package/dist/icons/IconDotnetText.js.map +1 -1
- package/dist/icons/IconDotnetTextColor.js.map +1 -1
- package/dist/icons/IconDoubleCircle.js.map +1 -1
- package/dist/icons/IconDownload.js.map +1 -1
- package/dist/icons/IconDragHandle.js.map +1 -1
- package/dist/icons/IconEc2Ami.js.map +1 -1
- package/dist/icons/IconEnterprise.js.map +1 -1
- package/dist/icons/IconErrorCircle.js.map +1 -1
- package/dist/icons/IconErrorCircleFilled.js.map +1 -1
- package/dist/icons/IconExpand.js.map +1 -1
- package/dist/icons/IconExtraBuildCapacity.js.map +1 -1
- package/dist/icons/IconEye.js.map +1 -1
- package/dist/icons/IconEyeSlash.js.map +1 -1
- package/dist/icons/IconFastlane.js.map +1 -1
- package/dist/icons/IconFile.js.map +1 -1
- package/dist/icons/IconFileDoc.js.map +1 -1
- package/dist/icons/IconFilePdf.js.map +1 -1
- package/dist/icons/IconFilePlist.js.map +1 -1
- package/dist/icons/IconFileYml.js.map +1 -1
- package/dist/icons/IconFileZip.js.map +1 -1
- package/dist/icons/IconFilter.js.map +1 -1
- package/dist/icons/IconFlag.js.map +1 -1
- package/dist/icons/IconFlutter.js.map +1 -1
- package/dist/icons/IconFolder.js.map +1 -1
- package/dist/icons/IconFullscreen.js.map +1 -1
- package/dist/icons/IconFullscreenExit.js.map +1 -1
- package/dist/icons/IconGauge.js.map +1 -1
- package/dist/icons/IconGit.js.map +1 -1
- package/dist/icons/IconGithub.js.map +1 -1
- package/dist/icons/IconGitlab.js.map +1 -1
- package/dist/icons/IconGitlabColor.js.map +1 -1
- package/dist/icons/IconGitlabWhite.js.map +1 -1
- package/dist/icons/IconGlobe.js.map +1 -1
- package/dist/icons/IconGo.js.map +1 -1
- package/dist/icons/IconGoogleColor.js.map +1 -1
- package/dist/icons/IconGooglePlay.js.map +1 -1
- package/dist/icons/IconGooglePlayColor.js.map +1 -1
- package/dist/icons/IconGradle.js.map +1 -1
- package/dist/icons/IconGroup.js.map +1 -1
- package/dist/icons/IconHashtag.js.map +1 -1
- package/dist/icons/IconHeadset.js.map +1 -1
- package/dist/icons/IconHeart.js.map +1 -1
- package/dist/icons/IconHistory.js.map +1 -1
- package/dist/icons/IconHourglass.js.map +1 -1
- package/dist/icons/IconImage.js.map +1 -1
- package/dist/icons/IconInfoCircle.js.map +1 -1
- package/dist/icons/IconInfoCircleFilled.js.map +1 -1
- package/dist/icons/IconInsights.js.map +1 -1
- package/dist/icons/IconInsightsFilled.js.map +1 -1
- package/dist/icons/IconInstall.js.map +1 -1
- package/dist/icons/IconInteraction.js.map +1 -1
- package/dist/icons/IconInvoice.js.map +1 -1
- package/dist/icons/IconIonic.js.map +1 -1
- package/dist/icons/IconJapanese.js.map +1 -1
- package/dist/icons/IconJava.js.map +1 -1
- package/dist/icons/IconJavaColor.js.map +1 -1
- package/dist/icons/IconJavaDuke.js.map +1 -1
- package/dist/icons/IconJavaDukeColor.js.map +1 -1
- package/dist/icons/IconKey.js.map +1 -1
- package/dist/icons/IconKiroColor.js.map +1 -1
- package/dist/icons/IconKotlin.js.map +1 -1
- package/dist/icons/IconKotlinColor.js.map +1 -1
- package/dist/icons/IconKotlinWhite.js.map +1 -1
- package/dist/icons/IconLaptop.js.map +1 -1
- package/dist/icons/IconLaunchdarkly.js.map +1 -1
- package/dist/icons/IconLegacyApp.js.map +1 -1
- package/dist/icons/IconLightbulb.js.map +1 -1
- package/dist/icons/IconLink.js.map +1 -1
- package/dist/icons/IconLinux.js.map +1 -1
- package/dist/icons/IconLock.js.map +1 -1
- package/dist/icons/IconLockOpen.js.map +1 -1
- package/dist/icons/IconLogin.js.map +1 -1
- package/dist/icons/IconLogout.js.map +1 -1
- package/dist/icons/IconMacos.js.map +1 -1
- package/dist/icons/IconMagicWand.js.map +1 -1
- package/dist/icons/IconMagnifier.js.map +1 -1
- package/dist/icons/IconMail.js.map +1 -1
- package/dist/icons/IconMcp.js.map +1 -1
- package/dist/icons/IconMedal.js.map +1 -1
- package/dist/icons/IconMemory.js.map +1 -1
- package/dist/icons/IconMenuGrid.js.map +1 -1
- package/dist/icons/IconMenuHamburger.js.map +1 -1
- package/dist/icons/IconMessage.js.map +1 -1
- package/dist/icons/IconMessageAlert.js.map +1 -1
- package/dist/icons/IconMessageQuestion.js.map +1 -1
- package/dist/icons/IconMicrophone.js.map +1 -1
- package/dist/icons/IconMinus.js.map +1 -1
- package/dist/icons/IconMinusCircle.js.map +1 -1
- package/dist/icons/IconMinusCircleFilled.js.map +1 -1
- package/dist/icons/IconMobile.js.map +1 -1
- package/dist/icons/IconMobileLandscape.js.map +1 -1
- package/dist/icons/IconMonitorChart.js.map +1 -1
- package/dist/icons/IconMoreHorizontal.js.map +1 -1
- package/dist/icons/IconMoreVertical.js.map +1 -1
- package/dist/icons/IconNews.js.map +1 -1
- package/dist/icons/IconNextjs.js.map +1 -1
- package/dist/icons/IconNodejs.js.map +1 -1
- package/dist/icons/IconOpenInNew.js.map +1 -1
- package/dist/icons/IconOther.js.map +1 -1
- package/dist/icons/IconOutsideContributor.js.map +1 -1
- package/dist/icons/IconOverview.js.map +1 -1
- package/dist/icons/IconPause.js.map +1 -1
- package/dist/icons/IconPencil.js.map +1 -1
- package/dist/icons/IconPeople.js.map +1 -1
- package/dist/icons/IconPercent.js.map +1 -1
- package/dist/icons/IconPerson.js.map +1 -1
- package/dist/icons/IconPersonWithDesk.js.map +1 -1
- package/dist/icons/IconPin.js.map +1 -1
- package/dist/icons/IconPlay.js.map +1 -1
- package/dist/icons/IconPlus.js.map +1 -1
- package/dist/icons/IconPlusCircle.js.map +1 -1
- package/dist/icons/IconPlusCircleFilled.js.map +1 -1
- package/dist/icons/IconPower.js.map +1 -1
- package/dist/icons/IconProject.js.map +1 -1
- package/dist/icons/IconProjectSettings.js.map +1 -1
- package/dist/icons/IconPull.js.map +1 -1
- package/dist/icons/IconPush.js.map +1 -1
- package/dist/icons/IconPuzzle.js.map +1 -1
- package/dist/icons/IconPython.js.map +1 -1
- package/dist/icons/IconPythonColor.js.map +1 -1
- package/dist/icons/IconQuestionCircle.js.map +1 -1
- package/dist/icons/IconQuestionCircleFilled.js.map +1 -1
- package/dist/icons/IconReact.js.map +1 -1
- package/dist/icons/IconRefresh.js.map +1 -1
- package/dist/icons/IconRegex.js.map +1 -1
- package/dist/icons/IconRelease.js.map +1 -1
- package/dist/icons/IconReleaseFilled.js.map +1 -1
- package/dist/icons/IconRemoteAccess.js.map +1 -1
- package/dist/icons/IconReplace.js.map +1 -1
- package/dist/icons/IconResponsiveness.js.map +1 -1
- package/dist/icons/IconReviewerApproved.js.map +1 -1
- package/dist/icons/IconReviewerAssigned.js.map +1 -1
- package/dist/icons/IconReviewerRejected.js.map +1 -1
- package/dist/icons/IconRuby.js.map +1 -1
- package/dist/icons/IconRubyColor.js.map +1 -1
- package/dist/icons/IconSave.js.map +1 -1
- package/dist/icons/IconSecurityShield.js.map +1 -1
- package/dist/icons/IconSettings.js.map +1 -1
- package/dist/icons/IconSettingsFilled.js.map +1 -1
- package/dist/icons/IconShuffle.js.map +1 -1
- package/dist/icons/IconSiren.js.map +1 -1
- package/dist/icons/IconSkip.js.map +1 -1
- package/dist/icons/IconSkipCircle.js.map +1 -1
- package/dist/icons/IconSkipCircleFilled.js.map +1 -1
- package/dist/icons/IconSlack.js.map +1 -1
- package/dist/icons/IconSlackColor.js.map +1 -1
- package/dist/icons/IconSparkle.js.map +1 -1
- package/dist/icons/IconSparkleFilled.js.map +1 -1
- package/dist/icons/IconSpinnerOnDisabled.js.map +1 -1
- package/dist/icons/IconSpinnerPurple.js.map +1 -1
- package/dist/icons/IconSpinnerPurpleDouble.js.map +1 -1
- package/dist/icons/IconSpinnerWhite.js.map +1 -1
- package/dist/icons/IconStability.js.map +1 -1
- package/dist/icons/IconStack.js.map +1 -1
- package/dist/icons/IconStar.js.map +1 -1
- package/dist/icons/IconStep.js.map +1 -1
- package/dist/icons/IconStop.js.map +1 -1
- package/dist/icons/IconStopwatch.js.map +1 -1
- package/dist/icons/IconTabPlus.js.map +1 -1
- package/dist/icons/IconTag.js.map +1 -1
- package/dist/icons/IconTasks.js.map +1 -1
- package/dist/icons/IconTeams.js.map +1 -1
- package/dist/icons/IconTeamsColor.js.map +1 -1
- package/dist/icons/IconTemplateCode.js.map +1 -1
- package/dist/icons/IconTerminal.js.map +1 -1
- package/dist/icons/IconTerminalFilled.js.map +1 -1
- package/dist/icons/IconTestQuarantine.js.map +1 -1
- package/dist/icons/IconThemeDarkToggle.js.map +1 -1
- package/dist/icons/IconThumbDown.js.map +1 -1
- package/dist/icons/IconThumbUp.js.map +1 -1
- package/dist/icons/IconTools.js.map +1 -1
- package/dist/icons/IconTrash.js.map +1 -1
- package/dist/icons/IconTrigger.js.map +1 -1
- package/dist/icons/IconUbuntu.js.map +1 -1
- package/dist/icons/IconUbuntuColor.js.map +1 -1
- package/dist/icons/IconUnity3D.js.map +1 -1
- package/dist/icons/IconUnpin.js.map +1 -1
- package/dist/icons/IconUpload.js.map +1 -1
- package/dist/icons/IconValidateShield.js.map +1 -1
- package/dist/icons/IconVideo.js.map +1 -1
- package/dist/icons/IconVsCode.js.map +1 -1
- package/dist/icons/IconWarning.js.map +1 -1
- package/dist/icons/IconWarningYellow.js.map +1 -1
- package/dist/icons/IconWebUi.js.map +1 -1
- package/dist/icons/IconWebhooks.js.map +1 -1
- package/dist/icons/IconWindsurf.js.map +1 -1
- package/dist/icons/IconWorkflow.js.map +1 -1
- package/dist/icons/IconWorkflowFlow.js.map +1 -1
- package/dist/icons/IconXTwitter.js.map +1 -1
- package/dist/icons/IconXamarin.js.map +1 -1
- package/dist/icons/IconXcode.js.map +1 -1
- package/dist/main.js +7 -8
- package/dist/theme/recipes/Spinner.recipe.d.ts +4 -4
- package/dist/theme/recipes/Spinner.recipe.js +4 -4
- package/dist/theme/recipes/Spinner.recipe.js.map +1 -1
- package/dist/theme/recipes/index.d.ts +4 -4
- package/dist/theme/semantic-tokens/index.d.ts +5 -0
- package/dist/theme/semantic-tokens/semanticColors.d.ts +5 -0
- package/dist/theme/semantic-tokens/semanticColors.js +1 -0
- package/dist/theme/semantic-tokens/semanticColors.js.map +1 -1
- package/dist/theme/slot-recipes/Combobox.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/DatePicker.recipe.d.ts +0 -15
- package/dist/theme/slot-recipes/DatePicker.recipe.js +22 -72
- package/dist/theme/slot-recipes/DatePicker.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.d.ts +0 -82
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.js +10 -28
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/Menu.recipe.js +1 -6
- package/dist/theme/slot-recipes/Menu.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/NoteCard.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/NoteCard.recipe.js +1 -1
- package/dist/theme/slot-recipes/NoteCard.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/PageFooter.recipe.d.ts +5 -3
- package/dist/theme/slot-recipes/PageFooter.recipe.js +5 -3
- package/dist/theme/slot-recipes/PageFooter.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/Tag.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/TextInput.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/index.d.ts +7 -159
- package/dist/theme/slot-recipes/index.js +0 -4
- package/dist/theme/slot-recipes/index.js.map +1 -1
- package/dist/theme/tokens/sizes.js.map +1 -1
- package/dist/theme/tokens/spacing.js.map +1 -1
- package/dist/utilities/BitkitPortalContext.js +2 -3
- package/dist/utilities/BitkitPortalContext.js.map +1 -1
- package/docs/v1-to-v2-migration-guide.md +1 -48
- package/package.json +10 -12
- package/dist/components/BitkitFilter/BitkitFilter.context.d.ts +0 -65
- package/dist/components/BitkitFilter/BitkitFilter.context.js +0 -82
- package/dist/components/BitkitFilter/BitkitFilter.context.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilter.d.ts +0 -55
- package/dist/components/BitkitFilter/BitkitFilter.js +0 -240
- package/dist/components/BitkitFilter/BitkitFilter.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilter.utils.d.ts +0 -18
- package/dist/components/BitkitFilter/BitkitFilter.utils.js +0 -42
- package/dist/components/BitkitFilter/BitkitFilter.utils.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilterAdd.d.ts +0 -18
- package/dist/components/BitkitFilter/BitkitFilterAdd.js +0 -188
- package/dist/components/BitkitFilter/BitkitFilterAdd.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilterDateRange.d.ts +0 -26
- package/dist/components/BitkitFilter/BitkitFilterDateRange.js +0 -118
- package/dist/components/BitkitFilter/BitkitFilterDateRange.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilterSearch.d.ts +0 -23
- package/dist/components/BitkitFilter/BitkitFilterSearch.js +0 -70
- package/dist/components/BitkitFilter/BitkitFilterSearch.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilterSelect.d.ts +0 -61
- package/dist/components/BitkitFilter/BitkitFilterSelect.js +0 -140
- package/dist/components/BitkitFilter/BitkitFilterSelect.js.map +0 -1
- package/dist/components/BitkitFilter/BitkitFilterSwitch.d.ts +0 -28
- package/dist/components/BitkitFilter/BitkitFilterSwitch.js +0 -87
- package/dist/components/BitkitFilter/BitkitFilterSwitch.js.map +0 -1
- package/dist/components/BitkitFilter/components/FilterChip.d.ts +0 -23
- package/dist/components/BitkitFilter/components/FilterChip.js +0 -64
- package/dist/components/BitkitFilter/components/FilterChip.js.map +0 -1
- package/dist/components/BitkitFilter/components/FilterField.d.ts +0 -15
- package/dist/components/BitkitFilter/components/FilterField.js +0 -58
- package/dist/components/BitkitFilter/components/FilterField.js.map +0 -1
- package/dist/components/BitkitFilter/components/FilterPanel.d.ts +0 -42
- package/dist/components/BitkitFilter/components/FilterPanel.js +0 -126
- package/dist/components/BitkitFilter/components/FilterPanel.js.map +0 -1
- package/dist/components/BitkitFilter/components/FilterSearchInput.d.ts +0 -15
- package/dist/components/BitkitFilter/components/FilterSearchInput.js +0 -41
- package/dist/components/BitkitFilter/components/FilterSearchInput.js.map +0 -1
- package/dist/components/BitkitFilter/components/FilterSelectForm.d.ts +0 -41
- package/dist/components/BitkitFilter/components/FilterSelectForm.js +0 -307
- package/dist/components/BitkitFilter/components/FilterSelectForm.js.map +0 -1
- package/dist/theme/slot-recipes/Filter.recipe.d.ts +0 -37
- package/dist/theme/slot-recipes/Filter.recipe.js +0 -636
- package/dist/theme/slot-recipes/Filter.recipe.js.map +0 -1
- package/dist/theme/slot-recipes/Listbox.recipe.d.ts +0 -22
- package/dist/theme/slot-recipes/Listbox.recipe.js +0 -92
- package/dist/theme/slot-recipes/Listbox.recipe.js.map +0 -1
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { BoxProps } from '@chakra-ui/react/box';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
|
-
export interface BitkitFilterProps extends Omit<BoxProps, 'children'> {
|
|
4
|
-
/**
|
|
5
|
-
* The filters: `BitkitFilter.Switch`, `.Select`, `.DateRange`, `.Add` and `.Search`, in the
|
|
6
|
-
* order they appear. `.Search` always sits at the end of the bar.
|
|
7
|
-
*/
|
|
8
|
-
children: ReactNode;
|
|
9
|
-
/**
|
|
10
|
-
* Where a capped content block sits: `center` over a centred page column, `start` over one that
|
|
11
|
-
* starts against a sidebar. Pass the same alignment as the page header and content below it.
|
|
12
|
-
* Only applies with a `contentWidth` in rems. Desktop only.
|
|
13
|
-
*/
|
|
14
|
-
contentAlign?: 'center' | 'start';
|
|
15
|
-
/**
|
|
16
|
-
* Lines the bar up with the page content below it, for a bar under a page header: it gains a
|
|
17
|
-
* bottom border and the page's inline padding. Pass the content column's `max-width` in rems to
|
|
18
|
-
* cap the bar's content with it (padded 32 on both sides), or `'full'` for a full-width column
|
|
19
|
-
* (24 at the start, like the default `BitkitPageHeader`, and 32 at the end).
|
|
20
|
-
*
|
|
21
|
-
* Without it the bar has the tighter inset of a filter above a table. Desktop only.
|
|
22
|
-
*/
|
|
23
|
-
contentWidth?: `${number}rem` | 'full';
|
|
24
|
-
/**
|
|
25
|
-
* Forces the desktop bar or the mobile "Filters" dialog. Defaults to the viewport: mobile below the
|
|
26
|
-
* tablet breakpoint. The mobile dialog is made for narrow screens; from tablet up it is a 320px drawer.
|
|
27
|
-
*/
|
|
28
|
-
device?: 'desktop' | 'mobile';
|
|
29
|
-
/**
|
|
30
|
-
* Called once on "Clear filters" in place of handing each changed filter its `resetValue` — for a
|
|
31
|
-
* page that resets them all in one write, e.g. one URL update. The `resetValue`s still decide when
|
|
32
|
-
* the button shows.
|
|
33
|
-
*/
|
|
34
|
-
onClear?: () => void;
|
|
35
|
-
/**
|
|
36
|
-
* Shows "Clear filters" while any filter differs from its `resetValue`. It hands each of those
|
|
37
|
-
* filters its `resetValue` back through its own `onValueChange`, or calls `onClear`.
|
|
38
|
-
*/
|
|
39
|
-
showClear?: boolean;
|
|
40
|
-
/** Shows the filter icon at the start of the bar. Desktop only. */
|
|
41
|
-
showIcon?: boolean;
|
|
42
|
-
/** `loading`: while the page's data loads, the filters can't be opened, removed or cleared. The search stays usable. */
|
|
43
|
-
state?: 'loading';
|
|
44
|
-
}
|
|
45
|
-
declare const _default: import('react').ForwardRefExoticComponent<BitkitFilterProps & import('react').RefAttributes<HTMLDivElement>> & {
|
|
46
|
-
Add: {
|
|
47
|
-
({ children }: import('./BitkitFilterAdd').BitkitFilterAddProps): import('react').JSX.Element;
|
|
48
|
-
displayName: string;
|
|
49
|
-
};
|
|
50
|
-
DateRange: import('react').ForwardRefExoticComponent<import('./BitkitFilterDateRange').BitkitFilterDateRangeProps & import('react').RefAttributes<HTMLButtonElement>>;
|
|
51
|
-
Search: import('react').ForwardRefExoticComponent<import('./BitkitFilterSearch').BitkitFilterSearchProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
52
|
-
Select: import('react').ForwardRefExoticComponent<import('./BitkitFilterSelect').BitkitFilterSelectProps & import('react').RefAttributes<HTMLButtonElement>>;
|
|
53
|
-
Switch: import('react').ForwardRefExoticComponent<import('./BitkitFilterSwitch').BitkitFilterSwitchProps & import('react').RefAttributes<HTMLElement>>;
|
|
54
|
-
};
|
|
55
|
-
export default _default;
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { withSubComponents } from "../../utilities/withSubComponents.js";
|
|
2
|
-
import IconCross from "../../icons/IconCross.js";
|
|
3
|
-
import IconFilter from "../../icons/IconFilter.js";
|
|
4
|
-
import { usePortalContext } from "../../utilities/BitkitPortalContext.js";
|
|
5
|
-
import BitkitCloseButton from "../BitkitCloseButton/BitkitCloseButton.js";
|
|
6
|
-
import BitkitBadge from "../BitkitBadge/BitkitBadge.js";
|
|
7
|
-
import { flattenChildren } from "../../utilities/flattenChildren.js";
|
|
8
|
-
import BitkitButton from "../BitkitButton/BitkitButton.js";
|
|
9
|
-
import useResponsive from "../../hooks/useResponsive.js";
|
|
10
|
-
import { FilterContextProvider } from "./BitkitFilter.context.js";
|
|
11
|
-
import BitkitFilterAdd from "./BitkitFilterAdd.js";
|
|
12
|
-
import BitkitFilterDateRange from "./BitkitFilterDateRange.js";
|
|
13
|
-
import BitkitFilterSearch from "./BitkitFilterSearch.js";
|
|
14
|
-
import BitkitFilterSelect from "./BitkitFilterSelect.js";
|
|
15
|
-
import BitkitFilterSwitch from "./BitkitFilterSwitch.js";
|
|
16
|
-
import { Box } from "@chakra-ui/react/box";
|
|
17
|
-
import { chakra, useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
18
|
-
import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
19
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
-
import { Portal } from "@chakra-ui/react/portal";
|
|
21
|
-
import { Drawer } from "@chakra-ui/react/drawer";
|
|
22
|
-
//#region lib/components/BitkitFilter/BitkitFilter.tsx
|
|
23
|
-
var toggle = (set, id, isIn) => {
|
|
24
|
-
if (set.has(id) === isIn) return set;
|
|
25
|
-
const next = new Set(set);
|
|
26
|
-
if (isIn) next.add(id);
|
|
27
|
-
else next.delete(id);
|
|
28
|
-
return next;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* A bar of filters above a list. Each filter is a controlled sub-component with its own `value` and
|
|
32
|
-
* `onValueChange`; the bar lays them out and offers "Clear filters" across all of them.
|
|
33
|
-
*
|
|
34
|
-
* Below the tablet breakpoint the bar collapses into a "Filters" button opening a full-screen dialog,
|
|
35
|
-
* where every filter is a field opening its own view. A filter still applies on its view's "Apply".
|
|
36
|
-
*/
|
|
37
|
-
var BitkitFilter = forwardRef((props, ref) => {
|
|
38
|
-
const { children, contentAlign, contentWidth, css, device, onClear, showClear = true, showIcon = true, state, ...rest } = props;
|
|
39
|
-
const { isMobile: isMobileViewport } = useResponsive();
|
|
40
|
-
const isMobile = device ? device === "mobile" : isMobileViewport;
|
|
41
|
-
const isDisabled = state === "loading";
|
|
42
|
-
const { disablePortal } = usePortalContext();
|
|
43
|
-
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
|
44
|
-
const recipe = useSlotRecipe({ key: "filter" });
|
|
45
|
-
let pageLayout;
|
|
46
|
-
if (contentWidth) pageLayout = contentWidth === "full" ? "full" : "capped";
|
|
47
|
-
const styles = recipe({
|
|
48
|
-
contentAlign: pageLayout === "capped" ? contentAlign : void 0,
|
|
49
|
-
pageLayout
|
|
50
|
-
});
|
|
51
|
-
const resets = useRef(/* @__PURE__ */ new Map());
|
|
52
|
-
const [dirtyIds, setDirtyIds] = useState(/* @__PURE__ */ new Set());
|
|
53
|
-
const [activeIds, setActiveIds] = useState(/* @__PURE__ */ new Set());
|
|
54
|
-
const register = useCallback((id, reset) => {
|
|
55
|
-
resets.current.set(id, reset);
|
|
56
|
-
}, []);
|
|
57
|
-
const setStatus = useCallback((id, { isActive, isDirty }) => {
|
|
58
|
-
setDirtyIds((prev) => toggle(prev, id, isDirty));
|
|
59
|
-
setActiveIds((prev) => toggle(prev, id, isActive));
|
|
60
|
-
}, []);
|
|
61
|
-
const unregister = useCallback((id) => {
|
|
62
|
-
resets.current.delete(id);
|
|
63
|
-
setStatus(id, {
|
|
64
|
-
isActive: false,
|
|
65
|
-
isDirty: false
|
|
66
|
-
});
|
|
67
|
-
}, [setStatus]);
|
|
68
|
-
const context = useMemo(() => ({
|
|
69
|
-
isDisabled,
|
|
70
|
-
isMobile,
|
|
71
|
-
register,
|
|
72
|
-
setStatus,
|
|
73
|
-
styles,
|
|
74
|
-
unregister
|
|
75
|
-
}), [
|
|
76
|
-
isDisabled,
|
|
77
|
-
isMobile,
|
|
78
|
-
register,
|
|
79
|
-
setStatus,
|
|
80
|
-
styles,
|
|
81
|
-
unregister
|
|
82
|
-
]);
|
|
83
|
-
const filters = [];
|
|
84
|
-
const searches = [];
|
|
85
|
-
flattenChildren(children).forEach((child) => {
|
|
86
|
-
if (child.type === BitkitFilterSearch) searches.push(child);
|
|
87
|
-
else filters.push(child);
|
|
88
|
-
});
|
|
89
|
-
const isDirty = dirtyIds.size > 0;
|
|
90
|
-
const activeCount = activeIds.size;
|
|
91
|
-
const focusTarget = useRef(null);
|
|
92
|
-
const isFocusPending = useRef(false);
|
|
93
|
-
const clearAll = () => {
|
|
94
|
-
if (isDisabled) return;
|
|
95
|
-
isFocusPending.current = true;
|
|
96
|
-
if (onClear) onClear();
|
|
97
|
-
else dirtyIds.forEach((id) => resets.current.get(id)?.());
|
|
98
|
-
};
|
|
99
|
-
useEffect(() => {
|
|
100
|
-
if (!isFocusPending.current || isDirty) return;
|
|
101
|
-
isFocusPending.current = false;
|
|
102
|
-
const active = document.activeElement;
|
|
103
|
-
if (active && active !== document.body && !active.matches("[data-filter-clear]")) return;
|
|
104
|
-
focusTarget.current?.querySelector("button:not(:disabled), input:not(:disabled)")?.focus();
|
|
105
|
-
}, [isDirty]);
|
|
106
|
-
const clearProps = {
|
|
107
|
-
"aria-disabled": isDisabled || void 0,
|
|
108
|
-
"data-filter-clear": "",
|
|
109
|
-
onClick: clearAll
|
|
110
|
-
};
|
|
111
|
-
if (isMobile) return /* @__PURE__ */ jsx(FilterContextProvider, {
|
|
112
|
-
value: context,
|
|
113
|
-
children: /* @__PURE__ */ jsxs(Box, {
|
|
114
|
-
css,
|
|
115
|
-
ref,
|
|
116
|
-
...rest,
|
|
117
|
-
children: [
|
|
118
|
-
/* @__PURE__ */ jsxs(Box, {
|
|
119
|
-
css: styles.mobileBar,
|
|
120
|
-
ref: isDialogOpen ? void 0 : focusTarget,
|
|
121
|
-
children: [/* @__PURE__ */ jsxs(chakra.button, {
|
|
122
|
-
"aria-expanded": isDialogOpen,
|
|
123
|
-
"aria-haspopup": "dialog",
|
|
124
|
-
"aria-label": `Filters, ${activeCount} applied`,
|
|
125
|
-
"aria-disabled": isDisabled || void 0,
|
|
126
|
-
css: styles.mobileTrigger,
|
|
127
|
-
onClick: () => !isDisabled && setIsDialogOpen(true),
|
|
128
|
-
type: "button",
|
|
129
|
-
children: [
|
|
130
|
-
/* @__PURE__ */ jsx(IconFilter, { size: "16" }),
|
|
131
|
-
"Filters",
|
|
132
|
-
/* @__PURE__ */ jsx(BitkitBadge, {
|
|
133
|
-
colorVariant: activeCount ? "purple" : "neutral",
|
|
134
|
-
children: activeCount
|
|
135
|
-
})
|
|
136
|
-
]
|
|
137
|
-
}), showClear && isDirty && /* @__PURE__ */ jsx(BitkitButton, {
|
|
138
|
-
...clearProps,
|
|
139
|
-
icon: IconCross,
|
|
140
|
-
size: "sm",
|
|
141
|
-
variant: "tertiary",
|
|
142
|
-
children: "Clear filters"
|
|
143
|
-
})]
|
|
144
|
-
}),
|
|
145
|
-
searches,
|
|
146
|
-
/* @__PURE__ */ jsx(Drawer.Root, {
|
|
147
|
-
lazyMount: false,
|
|
148
|
-
onOpenChange: ({ open }) => setIsDialogOpen(open),
|
|
149
|
-
open: isDialogOpen,
|
|
150
|
-
unmountOnExit: false,
|
|
151
|
-
children: /* @__PURE__ */ jsx(Portal, {
|
|
152
|
-
disabled: disablePortal,
|
|
153
|
-
children: /* @__PURE__ */ jsx(Drawer.Positioner, { children: /* @__PURE__ */ jsxs(Drawer.Content, { children: [
|
|
154
|
-
/* @__PURE__ */ jsxs(Box, {
|
|
155
|
-
css: styles.mobileHeader,
|
|
156
|
-
children: [/* @__PURE__ */ jsx(Drawer.Title, {
|
|
157
|
-
css: styles.mobileTitle,
|
|
158
|
-
unstyled: true,
|
|
159
|
-
children: "Filters"
|
|
160
|
-
}), /* @__PURE__ */ jsx(Drawer.CloseTrigger, {
|
|
161
|
-
asChild: true,
|
|
162
|
-
unstyled: true,
|
|
163
|
-
children: /* @__PURE__ */ jsx(BitkitCloseButton, { size: "sm" })
|
|
164
|
-
})]
|
|
165
|
-
}),
|
|
166
|
-
/* @__PURE__ */ jsx(Drawer.Body, {
|
|
167
|
-
css: styles.mobileBody,
|
|
168
|
-
ref: isDialogOpen ? focusTarget : void 0,
|
|
169
|
-
children: filters
|
|
170
|
-
}),
|
|
171
|
-
/* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsxs(Box, {
|
|
172
|
-
css: styles.mobileFooter,
|
|
173
|
-
children: [showClear && /* @__PURE__ */ jsx(BitkitButton, {
|
|
174
|
-
...clearProps,
|
|
175
|
-
size: "md",
|
|
176
|
-
state: isDirty ? void 0 : "disabled",
|
|
177
|
-
variant: "secondary",
|
|
178
|
-
children: "Clear filters"
|
|
179
|
-
}), /* @__PURE__ */ jsx(BitkitButton, {
|
|
180
|
-
onClick: () => setIsDialogOpen(false),
|
|
181
|
-
size: "md",
|
|
182
|
-
children: "Show results"
|
|
183
|
-
})]
|
|
184
|
-
}) })
|
|
185
|
-
] }) })
|
|
186
|
-
})
|
|
187
|
-
})
|
|
188
|
-
]
|
|
189
|
-
})
|
|
190
|
-
});
|
|
191
|
-
return /* @__PURE__ */ jsx(FilterContextProvider, {
|
|
192
|
-
value: context,
|
|
193
|
-
children: /* @__PURE__ */ jsx(Box, {
|
|
194
|
-
css: [styles.root, css],
|
|
195
|
-
ref,
|
|
196
|
-
...rest,
|
|
197
|
-
children: /* @__PURE__ */ jsxs(Box, {
|
|
198
|
-
css: styles.content,
|
|
199
|
-
maxWidth: contentWidth === "full" ? void 0 : contentWidth,
|
|
200
|
-
ref: focusTarget,
|
|
201
|
-
children: [/* @__PURE__ */ jsxs(Box, {
|
|
202
|
-
css: styles.filters,
|
|
203
|
-
children: [
|
|
204
|
-
showIcon && /* @__PURE__ */ jsx(Box, {
|
|
205
|
-
css: styles.icon,
|
|
206
|
-
children: /* @__PURE__ */ jsx(IconFilter, {})
|
|
207
|
-
}),
|
|
208
|
-
/* @__PURE__ */ jsx(Box, {
|
|
209
|
-
css: styles.items,
|
|
210
|
-
children: filters
|
|
211
|
-
}),
|
|
212
|
-
showClear && isDirty && /* @__PURE__ */ jsx(BitkitButton, {
|
|
213
|
-
...clearProps,
|
|
214
|
-
flexShrink: "0",
|
|
215
|
-
icon: IconCross,
|
|
216
|
-
size: "sm",
|
|
217
|
-
variant: "tertiary",
|
|
218
|
-
children: "Clear filters"
|
|
219
|
-
})
|
|
220
|
-
]
|
|
221
|
-
}), searches.length > 0 && /* @__PURE__ */ jsx(Box, {
|
|
222
|
-
css: styles.searchBlock,
|
|
223
|
-
children: searches
|
|
224
|
-
})]
|
|
225
|
-
})
|
|
226
|
-
})
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
BitkitFilter.displayName = "BitkitFilter";
|
|
230
|
-
var BitkitFilter_default = withSubComponents(BitkitFilter, {
|
|
231
|
-
Add: BitkitFilterAdd,
|
|
232
|
-
DateRange: BitkitFilterDateRange,
|
|
233
|
-
Search: BitkitFilterSearch,
|
|
234
|
-
Select: BitkitFilterSelect,
|
|
235
|
-
Switch: BitkitFilterSwitch
|
|
236
|
-
});
|
|
237
|
-
//#endregion
|
|
238
|
-
export { BitkitFilter_default as default };
|
|
239
|
-
|
|
240
|
-
//# sourceMappingURL=BitkitFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitFilter.js","names":[],"sources":["../../../lib/components/BitkitFilter/BitkitFilter.tsx"],"sourcesContent":["import { Box, type BoxProps } from '@chakra-ui/react/box';\nimport { Drawer } from '@chakra-ui/react/drawer';\nimport { Portal } from '@chakra-ui/react/portal';\n// `chakra.button`: the mobile \"Filters\" button carries a count badge, which BitkitButton's string-only label can't.\nimport { chakra, useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { forwardRef, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport useResponsive from '../../hooks/useResponsive';\nimport { IconCross, IconFilter } from '../../icons';\nimport { usePortalContext } from '../../utilities/BitkitPortalContext';\nimport { flattenChildren } from '../../utilities/flattenChildren';\nimport { withSubComponents } from '../../utilities/withSubComponents';\nimport BitkitBadge from '../BitkitBadge/BitkitBadge';\nimport BitkitButton from '../BitkitButton/BitkitButton';\nimport BitkitCloseButton from '../BitkitCloseButton/BitkitCloseButton';\nimport { FilterContextProvider, type FilterStatus } from './BitkitFilter.context';\nimport BitkitFilterAdd from './BitkitFilterAdd';\nimport BitkitFilterDateRange from './BitkitFilterDateRange';\nimport BitkitFilterSearch from './BitkitFilterSearch';\nimport BitkitFilterSelect from './BitkitFilterSelect';\nimport BitkitFilterSwitch from './BitkitFilterSwitch';\n\nexport interface BitkitFilterProps extends Omit<BoxProps, 'children'> {\n /**\n * The filters: `BitkitFilter.Switch`, `.Select`, `.DateRange`, `.Add` and `.Search`, in the\n * order they appear. `.Search` always sits at the end of the bar.\n */\n children: ReactNode;\n /**\n * Where a capped content block sits: `center` over a centred page column, `start` over one that\n * starts against a sidebar. Pass the same alignment as the page header and content below it.\n * Only applies with a `contentWidth` in rems. Desktop only.\n */\n contentAlign?: 'center' | 'start';\n /**\n * Lines the bar up with the page content below it, for a bar under a page header: it gains a\n * bottom border and the page's inline padding. Pass the content column's `max-width` in rems to\n * cap the bar's content with it (padded 32 on both sides), or `'full'` for a full-width column\n * (24 at the start, like the default `BitkitPageHeader`, and 32 at the end).\n *\n * Without it the bar has the tighter inset of a filter above a table. Desktop only.\n */\n contentWidth?: `${number}rem` | 'full';\n /**\n * Forces the desktop bar or the mobile \"Filters\" dialog. Defaults to the viewport: mobile below the\n * tablet breakpoint. The mobile dialog is made for narrow screens; from tablet up it is a 320px drawer.\n */\n device?: 'desktop' | 'mobile';\n /**\n * Called once on \"Clear filters\" in place of handing each changed filter its `resetValue` — for a\n * page that resets them all in one write, e.g. one URL update. The `resetValue`s still decide when\n * the button shows.\n */\n onClear?: () => void;\n /**\n * Shows \"Clear filters\" while any filter differs from its `resetValue`. It hands each of those\n * filters its `resetValue` back through its own `onValueChange`, or calls `onClear`.\n */\n showClear?: boolean;\n /** Shows the filter icon at the start of the bar. Desktop only. */\n showIcon?: boolean;\n /** `loading`: while the page's data loads, the filters can't be opened, removed or cleared. The search stays usable. */\n state?: 'loading';\n}\n\nconst toggle = (set: ReadonlySet<string>, id: string, isIn: boolean) => {\n if (set.has(id) === isIn) return set;\n const next = new Set(set);\n if (isIn) next.add(id);\n else next.delete(id);\n return next;\n};\n\n/**\n * A bar of filters above a list. Each filter is a controlled sub-component with its own `value` and\n * `onValueChange`; the bar lays them out and offers \"Clear filters\" across all of them.\n *\n * Below the tablet breakpoint the bar collapses into a \"Filters\" button opening a full-screen dialog,\n * where every filter is a field opening its own view. A filter still applies on its view's \"Apply\".\n */\nconst BitkitFilter = forwardRef<HTMLDivElement, BitkitFilterProps>((props, ref) => {\n const {\n children,\n contentAlign,\n contentWidth,\n css,\n device,\n onClear,\n showClear = true,\n showIcon = true,\n state,\n ...rest\n } = props;\n const { isMobile: isMobileViewport } = useResponsive();\n const isMobile = device ? device === 'mobile' : isMobileViewport;\n const isDisabled = state === 'loading';\n const { disablePortal } = usePortalContext();\n const [isDialogOpen, setIsDialogOpen] = useState(false);\n\n const recipe = useSlotRecipe({ key: 'filter' });\n let pageLayout: 'capped' | 'full' | undefined;\n if (contentWidth) pageLayout = contentWidth === 'full' ? 'full' : 'capped';\n const styles = recipe({ contentAlign: pageLayout === 'capped' ? contentAlign : undefined, pageLayout });\n\n const resets = useRef(new Map<string, () => void>());\n const [dirtyIds, setDirtyIds] = useState<ReadonlySet<string>>(new Set());\n const [activeIds, setActiveIds] = useState<ReadonlySet<string>>(new Set());\n\n const register = useCallback((id: string, reset: () => void) => {\n resets.current.set(id, reset);\n }, []);\n\n const setStatus = useCallback((id: string, { isActive, isDirty }: FilterStatus) => {\n setDirtyIds((prev) => toggle(prev, id, isDirty));\n setActiveIds((prev) => toggle(prev, id, isActive));\n }, []);\n\n const unregister = useCallback(\n (id: string) => {\n resets.current.delete(id);\n setStatus(id, { isActive: false, isDirty: false });\n },\n [setStatus],\n );\n\n const context = useMemo(\n () => ({ isDisabled, isMobile, register, setStatus, styles, unregister }),\n [isDisabled, isMobile, register, setStatus, styles, unregister],\n );\n\n const filters: ReactNode[] = [];\n const searches: ReactNode[] = [];\n // Flattened, so a filter grouped in a fragment is still sorted to the right place.\n flattenChildren(children).forEach((child) => {\n if (child.type === BitkitFilterSearch) searches.push(child);\n else filters.push(child);\n });\n\n const isDirty = dirtyIds.size > 0;\n const activeCount = activeIds.size;\n // The \"Clear filters\" button goes away (or is disabled) once nothing differs, so focus then moves\n // to the first control of the cleared filters rather than dropping to the page. Only if it hasn't\n // gone anywhere else meanwhile, e.g. while a slow reset was under way.\n const focusTarget = useRef<HTMLDivElement>(null);\n const isFocusPending = useRef(false);\n const clearAll = () => {\n if (isDisabled) return;\n isFocusPending.current = true;\n if (onClear) onClear();\n else dirtyIds.forEach((id) => resets.current.get(id)?.());\n };\n useEffect(() => {\n if (!isFocusPending.current || isDirty) return;\n isFocusPending.current = false;\n const active = document.activeElement;\n if (active && active !== document.body && !active.matches('[data-filter-clear]')) return;\n focusTarget.current?.querySelector<HTMLElement>('button:not(:disabled), input:not(:disabled)')?.focus();\n }, [isDirty]);\n\n // While the page loads, \"Clear filters\" is only `aria-disabled`, so it keeps its focus.\n const clearProps = { 'aria-disabled': isDisabled || undefined, 'data-filter-clear': '', onClick: clearAll };\n\n if (isMobile) {\n return (\n <FilterContextProvider value={context}>\n <Box css={css} ref={ref} {...rest}>\n <Box css={styles.mobileBar} ref={isDialogOpen ? undefined : focusTarget}>\n <chakra.button\n aria-expanded={isDialogOpen}\n aria-haspopup=\"dialog\"\n aria-label={`Filters, ${activeCount} applied`}\n aria-disabled={isDisabled || undefined}\n css={styles.mobileTrigger}\n onClick={() => !isDisabled && setIsDialogOpen(true)}\n type=\"button\"\n >\n <IconFilter size=\"16\" />\n Filters\n <BitkitBadge colorVariant={activeCount ? 'purple' : 'neutral'}>{activeCount}</BitkitBadge>\n </chakra.button>\n {showClear && isDirty && (\n <BitkitButton {...clearProps} icon={IconCross} size=\"sm\" variant=\"tertiary\">\n Clear filters\n </BitkitButton>\n )}\n </Box>\n {searches}\n {/* Kept mounted while closed: the filters inside register their values with the bar. */}\n <Drawer.Root\n lazyMount={false}\n onOpenChange={({ open }) => setIsDialogOpen(open)}\n open={isDialogOpen}\n unmountOnExit={false}\n >\n <Portal disabled={disablePortal}>\n <Drawer.Positioner>\n <Drawer.Content>\n <Box css={styles.mobileHeader}>\n <Drawer.Title css={styles.mobileTitle} unstyled>\n Filters\n </Drawer.Title>\n <Drawer.CloseTrigger asChild unstyled>\n <BitkitCloseButton size=\"sm\" />\n </Drawer.CloseTrigger>\n </Box>\n <Drawer.Body css={styles.mobileBody} ref={isDialogOpen ? focusTarget : undefined}>\n {filters}\n </Drawer.Body>\n <Drawer.Footer>\n <Box css={styles.mobileFooter}>\n {showClear && (\n <BitkitButton\n {...clearProps}\n size=\"md\"\n state={isDirty ? undefined : 'disabled'}\n variant=\"secondary\"\n >\n Clear filters\n </BitkitButton>\n )}\n <BitkitButton onClick={() => setIsDialogOpen(false)} size=\"md\">\n Show results\n </BitkitButton>\n </Box>\n </Drawer.Footer>\n </Drawer.Content>\n </Drawer.Positioner>\n </Portal>\n </Drawer.Root>\n </Box>\n </FilterContextProvider>\n );\n }\n\n return (\n <FilterContextProvider value={context}>\n <Box css={[styles.root, css]} ref={ref} {...rest}>\n <Box css={styles.content} maxWidth={contentWidth === 'full' ? undefined : contentWidth} ref={focusTarget}>\n <Box css={styles.filters}>\n {showIcon && (\n <Box css={styles.icon}>\n <IconFilter />\n </Box>\n )}\n <Box css={styles.items}>{filters}</Box>\n {showClear && isDirty && (\n <BitkitButton {...clearProps} flexShrink=\"0\" icon={IconCross} size=\"sm\" variant=\"tertiary\">\n Clear filters\n </BitkitButton>\n )}\n </Box>\n {searches.length > 0 && <Box css={styles.searchBlock}>{searches}</Box>}\n </Box>\n </Box>\n </FilterContextProvider>\n );\n});\n\nBitkitFilter.displayName = 'BitkitFilter';\n\nexport default withSubComponents(BitkitFilter, {\n Add: BitkitFilterAdd,\n DateRange: BitkitFilterDateRange,\n Search: BitkitFilterSearch,\n Select: BitkitFilterSelect,\n Switch: BitkitFilterSwitch,\n});\n"],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type FilterValue = string | string[] | Date[] | null;
|
|
2
|
-
/** Typing in a search settles for this long before its callback fires. */
|
|
3
|
-
export declare const SEARCH_DEBOUNCE_MS = 300;
|
|
4
|
-
/** Compares option lists as sets, since checking options in another order picks the same ones; dates by position. */
|
|
5
|
-
export declare const isEqualFilterValue: (a: FilterValue, b: FilterValue) => boolean;
|
|
6
|
-
/** A filter value that holds no selection. */
|
|
7
|
-
export declare const isEmptyFilterValue: (value: FilterValue) => boolean;
|
|
8
|
-
export declare const isPattern: (value: string) => boolean;
|
|
9
|
-
/** Compiles a wildcard `pattern`, where `*` stands for any run of characters, to match whole texts. */
|
|
10
|
-
export declare const compilePattern: (pattern: string) => RegExp;
|
|
11
|
-
/**
|
|
12
|
-
* Lowercases a noun for running text, keeping any word with a capital after its first letter as an
|
|
13
|
-
* acronym or name: "CI Providers" reads "CI providers", "PRs" and "iOS apps" stay as they are.
|
|
14
|
-
*/
|
|
15
|
-
export declare const toRunningText: (noun: string) => string;
|
|
16
|
-
export declare const formatDateRange: (range: Date[]) => string;
|
|
17
|
-
/** The last moment of the day `date` falls on, so a range ending that day includes all of it. */
|
|
18
|
-
export declare const endOfDay: (date: Date) => Date;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
//#region lib/components/BitkitFilter/BitkitFilter.utils.ts
|
|
2
|
-
/** Compares option lists as sets, since checking options in another order picks the same ones; dates by position. */
|
|
3
|
-
var isEqualFilterValue = (a, b) => {
|
|
4
|
-
if (Array.isArray(a) && Array.isArray(b)) {
|
|
5
|
-
if (a.length !== b.length) return false;
|
|
6
|
-
if (a.every((item) => typeof item === "string")) {
|
|
7
|
-
const others = new Set(b);
|
|
8
|
-
return a.every((item) => others.has(item));
|
|
9
|
-
}
|
|
10
|
-
return a.every((item, index) => {
|
|
11
|
-
const other = b[index];
|
|
12
|
-
return item instanceof Date && other instanceof Date ? item.getTime() === other.getTime() : item === other;
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
return a === b;
|
|
16
|
-
};
|
|
17
|
-
/** A filter value that holds no selection. */
|
|
18
|
-
var isEmptyFilterValue = (value) => value === null || value === "" || Array.isArray(value) && value.length === 0;
|
|
19
|
-
var regExpEscape = (text) => text.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
20
|
-
var isPattern = (value) => value.includes("*");
|
|
21
|
-
/** Compiles a wildcard `pattern`, where `*` stands for any run of characters, to match whole texts. */
|
|
22
|
-
var compilePattern = (pattern) => new RegExp(`^${pattern.split(/\*+/).map(regExpEscape).join(".*")}$`);
|
|
23
|
-
/**
|
|
24
|
-
* Lowercases a noun for running text, keeping any word with a capital after its first letter as an
|
|
25
|
-
* acronym or name: "CI Providers" reads "CI providers", "PRs" and "iOS apps" stay as they are.
|
|
26
|
-
*/
|
|
27
|
-
var toRunningText = (noun) => noun.split(" ").map((word) => /[A-Z]/.test(word.slice(1)) ? word : word.toLowerCase()).join(" ");
|
|
28
|
-
var dateFormat = new Intl.DateTimeFormat("en-US", {
|
|
29
|
-
day: "numeric",
|
|
30
|
-
month: "short"
|
|
31
|
-
});
|
|
32
|
-
var formatDateRange = (range) => range.map((date) => dateFormat.format(date)).join(" – ");
|
|
33
|
-
/** The last moment of the day `date` falls on, so a range ending that day includes all of it. */
|
|
34
|
-
var endOfDay = (date) => {
|
|
35
|
-
const end = new Date(date);
|
|
36
|
-
end.setHours(23, 59, 59, 999);
|
|
37
|
-
return end;
|
|
38
|
-
};
|
|
39
|
-
//#endregion
|
|
40
|
-
export { compilePattern, endOfDay, formatDateRange, isEmptyFilterValue, isEqualFilterValue, isPattern, toRunningText };
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=BitkitFilter.utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitFilter.utils.js","names":[],"sources":["../../../lib/components/BitkitFilter/BitkitFilter.utils.ts"],"sourcesContent":["export type FilterValue = string | string[] | Date[] | null;\n\n/** Typing in a search settles for this long before its callback fires. */\nexport const SEARCH_DEBOUNCE_MS = 300;\n\n/** Compares option lists as sets, since checking options in another order picks the same ones; dates by position. */\nexport const isEqualFilterValue = (a: FilterValue, b: FilterValue): boolean => {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n if (a.every((item) => typeof item === 'string')) {\n const others = new Set<unknown>(b);\n return a.every((item) => others.has(item));\n }\n return a.every((item, index) => {\n const other = b[index];\n return item instanceof Date && other instanceof Date ? item.getTime() === other.getTime() : item === other;\n });\n }\n return a === b;\n};\n\n/** A filter value that holds no selection. */\nexport const isEmptyFilterValue = (value: FilterValue): boolean =>\n value === null || value === '' || (Array.isArray(value) && value.length === 0);\n\nconst regExpEscape = (text: string) => text.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&');\n\nexport const isPattern = (value: string) => value.includes('*');\n\n/** Compiles a wildcard `pattern`, where `*` stands for any run of characters, to match whole texts. */\nexport const compilePattern = (pattern: string) => new RegExp(`^${pattern.split(/\\*+/).map(regExpEscape).join('.*')}$`);\n\n/**\n * Lowercases a noun for running text, keeping any word with a capital after its first letter as an\n * acronym or name: \"CI Providers\" reads \"CI providers\", \"PRs\" and \"iOS apps\" stay as they are.\n */\nexport const toRunningText = (noun: string) =>\n noun\n .split(' ')\n .map((word) => (/[A-Z]/.test(word.slice(1)) ? word : word.toLowerCase()))\n .join(' ');\n\nconst dateFormat = new Intl.DateTimeFormat('en-US', { day: 'numeric', month: 'short' });\n\nexport const formatDateRange = (range: Date[]) => range.map((date) => dateFormat.format(date)).join(' – ');\n\n/** The last moment of the day `date` falls on, so a range ending that day includes all of it. */\nexport const endOfDay = (date: Date) => {\n const end = new Date(date);\n end.setHours(23, 59, 59, 999);\n return end;\n};\n"],"mappings":";;AAMA,IAAa,sBAAsB,GAAgB,MAA4B;CAC7E,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;EACxC,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO;EAClC,IAAI,EAAE,OAAO,SAAS,OAAO,SAAS,QAAQ,GAAG;GAC/C,MAAM,SAAS,IAAI,IAAa,CAAC;GACjC,OAAO,EAAE,OAAO,SAAS,OAAO,IAAI,IAAI,CAAC;EAC3C;EACA,OAAO,EAAE,OAAO,MAAM,UAAU;GAC9B,MAAM,QAAQ,EAAE;GAChB,OAAO,gBAAgB,QAAQ,iBAAiB,OAAO,KAAK,QAAQ,MAAM,MAAM,QAAQ,IAAI,SAAS;EACvG,CAAC;CACH;CACA,OAAO,MAAM;AACf;;AAGA,IAAa,sBAAsB,UACjC,UAAU,QAAQ,UAAU,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAE9E,IAAM,gBAAgB,SAAiB,KAAK,QAAQ,sBAAsB,MAAM;AAEhF,IAAa,aAAa,UAAkB,MAAM,SAAS,GAAG;;AAG9D,IAAa,kBAAkB,YAAoB,IAAI,OAAO,IAAI,QAAQ,MAAM,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE;;;;;AAMtH,IAAa,iBAAiB,SAC5B,KACG,MAAM,GAAG,CAAC,CACV,KAAK,SAAU,QAAQ,KAAK,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,KAAK,YAAY,CAAE,CAAC,CACxE,KAAK,GAAG;AAEb,IAAM,aAAa,IAAI,KAAK,eAAe,SAAS;CAAE,KAAK;CAAW,OAAO;AAAQ,CAAC;AAEtF,IAAa,mBAAmB,UAAkB,MAAM,KAAK,SAAS,WAAW,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK;;AAGzG,IAAa,YAAY,SAAe;CACtC,MAAM,MAAM,IAAI,KAAK,IAAI;CACzB,IAAI,SAAS,IAAI,IAAI,IAAI,GAAG;CAC5B,OAAO;AACT"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
export interface BitkitFilterAddProps {
|
|
3
|
-
/**
|
|
4
|
-
* `BitkitFilter.Select` elements, also inside fragments or your own components. Each is listed in
|
|
5
|
-
* the menu, in the order they mount, until it holds a value.
|
|
6
|
-
*/
|
|
7
|
-
children: ReactNode;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Optional filters behind an "Add filter" button. A filter picked from its menu opens its popover
|
|
11
|
-
* there; once applied it shows as a removable chip, and leaves the menu until it is removed. On
|
|
12
|
-
* mobile the menu is a sheet over the filters dialog.
|
|
13
|
-
*/
|
|
14
|
-
declare const BitkitFilterAdd: {
|
|
15
|
-
({ children }: BitkitFilterAddProps): import('react').JSX.Element;
|
|
16
|
-
displayName: string;
|
|
17
|
-
};
|
|
18
|
-
export default BitkitFilterAdd;
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import IconChevronRight from "../../icons/IconChevronRight.js";
|
|
2
|
-
import IconInfoCircle from "../../icons/IconInfoCircle.js";
|
|
3
|
-
import IconPlus from "../../icons/IconPlus.js";
|
|
4
|
-
import { usePortalContext } from "../../utilities/BitkitPortalContext.js";
|
|
5
|
-
import BitkitButton from "../BitkitButton/BitkitButton.js";
|
|
6
|
-
import BitkitTooltip from "../BitkitTooltip/BitkitTooltip.js";
|
|
7
|
-
import { FilterAddContextProvider, useFilterContext } from "./BitkitFilter.context.js";
|
|
8
|
-
import { Box } from "@chakra-ui/react/box";
|
|
9
|
-
import { chakra } from "@chakra-ui/react/styled-system";
|
|
10
|
-
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
11
|
-
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
-
import { Portal } from "@chakra-ui/react/portal";
|
|
13
|
-
import { Menu } from "@chakra-ui/react/menu";
|
|
14
|
-
import { Text } from "@chakra-ui/react/text";
|
|
15
|
-
import { Dialog } from "@chakra-ui/react/dialog";
|
|
16
|
-
//#region lib/components/BitkitFilter/BitkitFilterAdd.tsx
|
|
17
|
-
/**
|
|
18
|
-
* Optional filters behind an "Add filter" button. A filter picked from its menu opens its popover
|
|
19
|
-
* there; once applied it shows as a removable chip, and leaves the menu until it is removed. On
|
|
20
|
-
* mobile the menu is a sheet over the filters dialog.
|
|
21
|
-
*/
|
|
22
|
-
var BitkitFilterAdd = ({ children }) => {
|
|
23
|
-
const triggerId = useId();
|
|
24
|
-
const { isDisabled, isMobile, styles } = useFilterContext();
|
|
25
|
-
const { disablePortal } = usePortalContext();
|
|
26
|
-
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
27
|
-
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
28
|
-
const [addingId, setAddingId] = useState();
|
|
29
|
-
const [highlightedId, setHighlightedId] = useState(null);
|
|
30
|
-
const [entries, setEntries] = useState(/* @__PURE__ */ new Map());
|
|
31
|
-
const register = useCallback((id, entry) => {
|
|
32
|
-
setEntries((prev) => new Map(prev).set(id, entry));
|
|
33
|
-
}, []);
|
|
34
|
-
const unregister = useCallback((id) => {
|
|
35
|
-
setEntries((prev) => {
|
|
36
|
-
const next = new Map(prev);
|
|
37
|
-
next.delete(id);
|
|
38
|
-
return next;
|
|
39
|
-
});
|
|
40
|
-
}, []);
|
|
41
|
-
const getTrigger = useCallback(() => document.getElementById(triggerId), [triggerId]);
|
|
42
|
-
const stopAdding = useCallback(() => setAddingId(void 0), []);
|
|
43
|
-
const available = [...entries].filter(([, entry]) => entry.isEmpty);
|
|
44
|
-
const isEmpty = !available.length;
|
|
45
|
-
const focusPendingFrom = useRef(null);
|
|
46
|
-
const focusTrigger = useCallback(() => {
|
|
47
|
-
const trigger = getTrigger();
|
|
48
|
-
if (trigger instanceof HTMLButtonElement && !trigger.disabled) trigger.focus();
|
|
49
|
-
else focusPendingFrom.current = document.activeElement;
|
|
50
|
-
}, [getTrigger]);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
const from = focusPendingFrom.current;
|
|
53
|
-
if (!from || isEmpty) return;
|
|
54
|
-
focusPendingFrom.current = null;
|
|
55
|
-
const active = document.activeElement;
|
|
56
|
-
if (active === from || active === document.body || !from.isConnected) getTrigger()?.focus();
|
|
57
|
-
}, [getTrigger, isEmpty]);
|
|
58
|
-
const context = useMemo(() => ({
|
|
59
|
-
addingId,
|
|
60
|
-
focusTrigger,
|
|
61
|
-
getTrigger,
|
|
62
|
-
register,
|
|
63
|
-
stopAdding,
|
|
64
|
-
unregister
|
|
65
|
-
}), [
|
|
66
|
-
addingId,
|
|
67
|
-
focusTrigger,
|
|
68
|
-
getTrigger,
|
|
69
|
-
register,
|
|
70
|
-
stopAdding,
|
|
71
|
-
unregister
|
|
72
|
-
]);
|
|
73
|
-
const isDisabledEntry = (entry) => !entry.disabledReason && !entry.hasOptions;
|
|
74
|
-
const pick = (id) => {
|
|
75
|
-
if (entries.get(id)?.disabledReason) return;
|
|
76
|
-
setAddingId(id);
|
|
77
|
-
};
|
|
78
|
-
const addButton = /* @__PURE__ */ jsx(BitkitButton, {
|
|
79
|
-
alignSelf: "flex-start",
|
|
80
|
-
"aria-disabled": isDisabled || void 0,
|
|
81
|
-
icon: IconPlus,
|
|
82
|
-
id: isMobile ? triggerId : void 0,
|
|
83
|
-
onClick: isMobile ? () => !isDisabled && setIsSheetOpen(true) : void 0,
|
|
84
|
-
size: isMobile ? "md" : "sm",
|
|
85
|
-
state: isEmpty ? "disabled" : void 0,
|
|
86
|
-
variant: "tertiary",
|
|
87
|
-
children: "Add filter"
|
|
88
|
-
});
|
|
89
|
-
return /* @__PURE__ */ jsxs(FilterAddContextProvider, {
|
|
90
|
-
value: context,
|
|
91
|
-
children: [children, isMobile ? /* @__PURE__ */ jsxs(Fragment$1, { children: [addButton, /* @__PURE__ */ jsx(Dialog.Root, {
|
|
92
|
-
onOpenChange: ({ open }) => setIsSheetOpen(open),
|
|
93
|
-
open: isSheetOpen,
|
|
94
|
-
unstyled: true,
|
|
95
|
-
children: /* @__PURE__ */ jsxs(Portal, {
|
|
96
|
-
disabled: disablePortal,
|
|
97
|
-
children: [/* @__PURE__ */ jsx(Dialog.Backdrop, { css: styles.addSheetBackdrop }), /* @__PURE__ */ jsx(Dialog.Positioner, {
|
|
98
|
-
css: styles.addSheetPositioner,
|
|
99
|
-
children: /* @__PURE__ */ jsxs(Dialog.Content, {
|
|
100
|
-
css: styles.addSheet,
|
|
101
|
-
children: [/* @__PURE__ */ jsx(Dialog.Title, {
|
|
102
|
-
css: styles.addMenuLabel,
|
|
103
|
-
children: "Select filter"
|
|
104
|
-
}), available.map(([id, entry]) => /* @__PURE__ */ jsxs(chakra.button, {
|
|
105
|
-
"aria-disabled": entry.disabledReason ? true : void 0,
|
|
106
|
-
css: styles.addSheetItem,
|
|
107
|
-
"data-not-applicable": entry.disabledReason ? "" : void 0,
|
|
108
|
-
disabled: isDisabledEntry(entry),
|
|
109
|
-
onClick: () => {
|
|
110
|
-
if (entry.disabledReason) return;
|
|
111
|
-
setIsSheetOpen(false);
|
|
112
|
-
pick(id);
|
|
113
|
-
},
|
|
114
|
-
type: "button",
|
|
115
|
-
children: [/* @__PURE__ */ jsxs(Box, {
|
|
116
|
-
as: "span",
|
|
117
|
-
flex: "1",
|
|
118
|
-
children: [/* @__PURE__ */ jsx(Text, {
|
|
119
|
-
as: "span",
|
|
120
|
-
display: "block",
|
|
121
|
-
children: entry.label
|
|
122
|
-
}), !!entry.disabledReason && /* @__PURE__ */ jsx(Text, {
|
|
123
|
-
as: "span",
|
|
124
|
-
css: styles.addSheetItemReason,
|
|
125
|
-
display: "block",
|
|
126
|
-
children: entry.disabledReason
|
|
127
|
-
})]
|
|
128
|
-
}), /* @__PURE__ */ jsx(IconChevronRight, { css: styles.addMenuIcon })]
|
|
129
|
-
}, id))]
|
|
130
|
-
})
|
|
131
|
-
})]
|
|
132
|
-
})
|
|
133
|
-
})] }) : /* @__PURE__ */ jsxs(Menu.Root, {
|
|
134
|
-
ids: { trigger: triggerId },
|
|
135
|
-
onHighlightChange: ({ highlightedValue }) => setHighlightedId(highlightedValue),
|
|
136
|
-
onOpenChange: ({ open }) => {
|
|
137
|
-
if (open && isDisabled) return;
|
|
138
|
-
setIsMenuOpen(open);
|
|
139
|
-
if (!open) setHighlightedId(null);
|
|
140
|
-
},
|
|
141
|
-
onSelect: ({ value }) => pick(value),
|
|
142
|
-
open: isMenuOpen,
|
|
143
|
-
unstyled: true,
|
|
144
|
-
children: [/* @__PURE__ */ jsx(Menu.Trigger, {
|
|
145
|
-
asChild: true,
|
|
146
|
-
children: addButton
|
|
147
|
-
}), /* @__PURE__ */ jsx(Portal, {
|
|
148
|
-
disabled: disablePortal,
|
|
149
|
-
children: /* @__PURE__ */ jsx(Menu.Positioner, { children: /* @__PURE__ */ jsx(Menu.Content, {
|
|
150
|
-
css: styles.addMenu,
|
|
151
|
-
children: available.map(([id, entry]) => /* @__PURE__ */ jsxs(Menu.Item, {
|
|
152
|
-
"aria-disabled": entry.disabledReason ? true : void 0,
|
|
153
|
-
closeOnSelect: !entry.disabledReason,
|
|
154
|
-
css: styles.addMenuItem,
|
|
155
|
-
"data-not-applicable": entry.disabledReason ? "" : void 0,
|
|
156
|
-
disabled: isDisabledEntry(entry),
|
|
157
|
-
value: id,
|
|
158
|
-
children: [/* @__PURE__ */ jsxs(Text, {
|
|
159
|
-
flex: "1",
|
|
160
|
-
children: [entry.label, !!entry.disabledReason && /* @__PURE__ */ jsx(Text, {
|
|
161
|
-
as: "span",
|
|
162
|
-
srOnly: true,
|
|
163
|
-
children: `, ${entry.disabledReason}`
|
|
164
|
-
})]
|
|
165
|
-
}), entry.disabledReason ? /* @__PURE__ */ jsx(BitkitTooltip, {
|
|
166
|
-
open: highlightedId === id,
|
|
167
|
-
placement: "right",
|
|
168
|
-
text: entry.disabledReason,
|
|
169
|
-
children: /* @__PURE__ */ jsx(IconInfoCircle, {
|
|
170
|
-
css: styles.addMenuIcon,
|
|
171
|
-
size: "16"
|
|
172
|
-
})
|
|
173
|
-
}) : /* @__PURE__ */ jsx(IconChevronRight, {
|
|
174
|
-
css: styles.addMenuIcon,
|
|
175
|
-
"data-add-chevron": true,
|
|
176
|
-
size: "16"
|
|
177
|
-
})]
|
|
178
|
-
}, id))
|
|
179
|
-
}) })
|
|
180
|
-
})]
|
|
181
|
-
})]
|
|
182
|
-
});
|
|
183
|
-
};
|
|
184
|
-
BitkitFilterAdd.displayName = "BitkitFilterAdd";
|
|
185
|
-
//#endregion
|
|
186
|
-
export { BitkitFilterAdd as default };
|
|
187
|
-
|
|
188
|
-
//# sourceMappingURL=BitkitFilterAdd.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitFilterAdd.js","names":[],"sources":["../../../lib/components/BitkitFilter/BitkitFilterAdd.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { Dialog } from '@chakra-ui/react/dialog';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { Portal } from '@chakra-ui/react/portal';\n// `chakra.button`: the mobile sheet's rows are bare buttons styled by the filter recipe.\nimport { chakra } from '@chakra-ui/react/styled-system';\nimport { Text } from '@chakra-ui/react/text';\nimport { type ReactNode, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\nimport { IconChevronRight, IconInfoCircle, IconPlus } from '../../icons';\nimport { usePortalContext } from '../../utilities/BitkitPortalContext';\nimport BitkitButton from '../BitkitButton/BitkitButton';\nimport BitkitTooltip from '../BitkitTooltip/BitkitTooltip';\nimport { FilterAddContextProvider, type FilterAddEntry, useFilterContext } from './BitkitFilter.context';\n\nexport interface BitkitFilterAddProps {\n /**\n * `BitkitFilter.Select` elements, also inside fragments or your own components. Each is listed in\n * the menu, in the order they mount, until it holds a value.\n */\n children: ReactNode;\n}\n\n/**\n * Optional filters behind an \"Add filter\" button. A filter picked from its menu opens its popover\n * there; once applied it shows as a removable chip, and leaves the menu until it is removed. On\n * mobile the menu is a sheet over the filters dialog.\n */\nconst BitkitFilterAdd = ({ children }: BitkitFilterAddProps) => {\n // The popovers anchor to the button by id: a ref on a button inside Ark's `asChild` trigger trips React 18.\n const triggerId = useId();\n const { isDisabled, isMobile, styles } = useFilterContext();\n const { disablePortal } = usePortalContext();\n const [isSheetOpen, setIsSheetOpen] = useState(false);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [addingId, setAddingId] = useState<string>();\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n const [entries, setEntries] = useState<ReadonlyMap<string, FilterAddEntry>>(new Map());\n\n const register = useCallback((id: string, entry: FilterAddEntry) => {\n // `set` on a known id keeps its place, so an entry doesn't move when its props change.\n setEntries((prev) => new Map(prev).set(id, entry));\n }, []);\n\n const unregister = useCallback((id: string) => {\n setEntries((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const getTrigger = useCallback(() => document.getElementById(triggerId), [triggerId]);\n const stopAdding = useCallback(() => setAddingId(undefined), []);\n\n const available = [...entries].filter(([, entry]) => entry.isEmpty);\n const isEmpty = !available.length;\n\n // The button is disabled while every filter is applied, so focus waits until a removal re-enables it.\n // It only moves if it hasn't gone anywhere since: still on the removed control, or dropped to the page.\n const focusPendingFrom = useRef<Element | null>(null);\n const focusTrigger = useCallback(() => {\n const trigger = getTrigger();\n if (trigger instanceof HTMLButtonElement && !trigger.disabled) trigger.focus();\n else focusPendingFrom.current = document.activeElement;\n }, [getTrigger]);\n useEffect(() => {\n const from = focusPendingFrom.current;\n if (!from || isEmpty) return;\n focusPendingFrom.current = null;\n const active = document.activeElement;\n if (active === from || active === document.body || !from.isConnected) getTrigger()?.focus();\n }, [getTrigger, isEmpty]);\n\n const context = useMemo(\n () => ({ addingId, focusTrigger, getTrigger, register, stopAdding, unregister }),\n [addingId, focusTrigger, getTrigger, register, stopAdding, unregister],\n );\n\n // A filter with no options to pick is plainly disabled. One with a `disabledReason` stays reachable,\n // so keyboard and screen-reader users can learn the reason too, but can't be picked.\n const isDisabledEntry = (entry: FilterAddEntry) => !entry.disabledReason && !entry.hasOptions;\n const pick = (id: string) => {\n if (entries.get(id)?.disabledReason) return;\n setAddingId(id);\n };\n\n // While the page loads the button only looks disabled (`aria-disabled`), so it keeps a focus handed to it.\n const addButton = (\n <BitkitButton\n alignSelf=\"flex-start\"\n aria-disabled={isDisabled || undefined}\n icon={IconPlus}\n id={isMobile ? triggerId : undefined}\n onClick={isMobile ? () => !isDisabled && setIsSheetOpen(true) : undefined}\n size={isMobile ? 'md' : 'sm'}\n state={isEmpty ? 'disabled' : undefined}\n variant=\"tertiary\"\n >\n Add filter\n </BitkitButton>\n );\n\n return (\n <FilterAddContextProvider value={context}>\n {children}\n {isMobile ? (\n <>\n {addButton}\n <Dialog.Root onOpenChange={({ open }) => setIsSheetOpen(open)} open={isSheetOpen} unstyled>\n <Portal disabled={disablePortal}>\n <Dialog.Backdrop css={styles.addSheetBackdrop} />\n <Dialog.Positioner css={styles.addSheetPositioner}>\n <Dialog.Content css={styles.addSheet}>\n <Dialog.Title css={styles.addMenuLabel}>Select filter</Dialog.Title>\n {available.map(([id, entry]) => (\n <chakra.button\n aria-disabled={entry.disabledReason ? true : undefined}\n css={styles.addSheetItem}\n data-not-applicable={entry.disabledReason ? '' : undefined}\n disabled={isDisabledEntry(entry)}\n key={id}\n onClick={() => {\n if (entry.disabledReason) return;\n setIsSheetOpen(false);\n pick(id);\n }}\n type=\"button\"\n >\n <Box as=\"span\" flex=\"1\">\n <Text as=\"span\" display=\"block\">\n {entry.label}\n </Text>\n {/* A touch screen has no hover to open a tooltip, so the reason is spelled out. */}\n {!!entry.disabledReason && (\n <Text as=\"span\" css={styles.addSheetItemReason} display=\"block\">\n {entry.disabledReason}\n </Text>\n )}\n </Box>\n <IconChevronRight css={styles.addMenuIcon} />\n </chakra.button>\n ))}\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n </>\n ) : (\n <Menu.Root\n ids={{ trigger: triggerId }}\n onHighlightChange={({ highlightedValue }) => setHighlightedId(highlightedValue)}\n onOpenChange={({ open }) => {\n if (open && isDisabled) return;\n setIsMenuOpen(open);\n if (!open) setHighlightedId(null);\n }}\n onSelect={({ value }) => pick(value)}\n open={isMenuOpen}\n unstyled\n >\n <Menu.Trigger asChild>{addButton}</Menu.Trigger>\n <Portal disabled={disablePortal}>\n <Menu.Positioner>\n <Menu.Content css={styles.addMenu}>\n {available.map(([id, entry]) => (\n <Menu.Item\n aria-disabled={entry.disabledReason ? true : undefined}\n closeOnSelect={!entry.disabledReason}\n css={styles.addMenuItem}\n data-not-applicable={entry.disabledReason ? '' : undefined}\n disabled={isDisabledEntry(entry)}\n key={id}\n value={id}\n >\n <Text flex=\"1\">\n {entry.label}\n {!!entry.disabledReason && <Text as=\"span\" srOnly>{`, ${entry.disabledReason}`}</Text>}\n </Text>\n {entry.disabledReason ? (\n // On the icon rather than the row: as the row's trigger, the tooltip would replace\n // the id its `aria-activedescendant` points at. It opens while the row is highlighted,\n // by pointer or arrow keys, since the menu keeps focus on itself.\n <BitkitTooltip open={highlightedId === id} placement=\"right\" text={entry.disabledReason}>\n <IconInfoCircle css={styles.addMenuIcon} size=\"16\" />\n </BitkitTooltip>\n ) : (\n <IconChevronRight css={styles.addMenuIcon} data-add-chevron size=\"16\" />\n )}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </FilterAddContextProvider>\n );\n};\n\nBitkitFilterAdd.displayName = 'BitkitFilterAdd';\n\nexport default BitkitFilterAdd;\n"],"mappings":"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"}
|