{
  "version": 3,
  "sources": ["../../../../services/src/generated/typescript/service-runtime/WebProjectHelper.ts", "../../../../services/src/generated/typescript/WebProject.ts", "../../../../../node_modules/@framerjs/framer-events/lib/esm/generated/ColorTokenSet.js", "../../../../../node_modules/@framerjs/framer-events/lib/esm/generated/ComponentCanvasDelete.js", "../../src/document/models/CanvasTree/traits/utils/dynamicValueHasTypeError.ts", "../../src/document/components/chrome/shared/ComputedValuePopout.tsx", "../../src/document/components/chrome/shared/ComputedValuePopout.styles.ts", "../../src/document/components/chrome/shared/ValueTransformChain.tsx", "../../src/document/components/chrome/properties/rows/ValueTransformRows.tsx", "../../src/document/components/chrome/shared/ColorPicker/ColorPopoutButton.tsx", "../../src/document/components/chrome/shared/ColorPicker/ColorPickerPopout.tsx", "../../src/document/components/chrome/shared/ColorPicker/ColorPickerPopoutContent.tsx", "../../src/document/components/chrome/shared/ColorPicker/ColorPickerFillTypeTabs.tsx", "../../src/document/components/chrome/shared/ColorPicker/icons/TabIcons.styles.ts", "../../src/document/components/chrome/shared/ColorPicker/icons/TabIcons.tsx", "../../src/document/components/chrome/shared/ColorPicker/GradientStopsSlider.tsx", "../../src/document/components/chrome/shared/ColorPicker/GradientStopsSlider.styles.ts", "../../src/document/components/chrome/assets/EntityAssetRow.tsx", "../../src/document/components/chrome/properties/rows/StyleAssetRow.tsx", "../../src/document/components/chrome/properties/utils/useRename.tsx", "../../src/document/components/chrome/properties/rows/StyleAssetRow.styles.ts", "../../src/utils/clipboard/helpers/copyModuleImports.ts", "../../src/document/components/chrome/properties/utils/findComponentInstances.ts", "../../src/document/components/chrome/properties/utils/removePresetNode.ts", "../../src/document/components/chrome/assets/actions/delete.ts", "../../src/document/components/chrome/shared/AddToLibraryModal.tsx", "../../src/document/components/chrome/shared/AddToLibraryModal.styles.ts", "../../src/document/components/chrome/shared/utils/getComponentContextMenuItems.ts", "../../src/document/components/chrome/shared/utils/panelMultiSelect.styles.ts", "../../src/document/components/chrome/assets/actions/insertCanvasNode.ts", "../../src/document/components/chrome/analytics/utils/promptCreateAbTest.ts", "../../src/document/components/chrome/analytics/utils/createAbTest.ts", "../../src/document/components/chrome/shared/UpsellModal/utils/funnelUpsellModals.ts", "../../src/document/components/chrome/analytics/utils/createFunnel.ts", "../../src/document/components/chrome/assets/actions/sort.ts", "../../src/document/components/chrome/assets/utils/canDeleteEntityFolderNode.ts", "../../src/document/components/chrome/contentManagement/utils/handleDeleteCollection.tsx", "../../src/document/components/chrome/contentManagement/utils/ButtonSheet.styles.ts", "../../src/document/components/chrome/contentManagement/utils/ButtonSheet.tsx", "../../src/document/components/chrome/assets/utils/buildEntityItemMenuItems.ts", "../../src/document/components/chrome/assets/EntityRow.tsx", "../../src/document/components/chrome/assets/utils/usePresetAssetRows.ts", "../../src/document/components/chrome/assets/utils/useAssetPanelEntityRows.ts", "../../src/document/components/chrome/properties/panels/EmptyEntityAssetResults.styles.ts", "../../src/document/components/chrome/properties/panels/EmptyEntityAssetResults.tsx", "../../src/document/components/chrome/properties/utils/getColorStyleTokenRowProps.tsx", "../../src/document/components/chrome/assets/types.ts", "../../src/document/components/chrome/properties/utils/useDismissPopoutOnSelectionChange.tsx", "../../src/document/components/chrome/presetsPanel/ColorTokenPopoutContainer.tsx", "../../src/document/components/chrome/shared/ColorPicker/ColorTokenPopout.tsx", "../../src/document/components/chrome/shared/ColorPicker/tokens/ColorPickerTokenEdit.tsx", "../../src/document/components/chrome/shared/ColorPicker/icons/IconMoon.tsx", "../../src/document/components/chrome/shared/ColorPicker/icons/IconSun.tsx", "../../src/document/components/chrome/shared/ColorPicker/tokens/ColorPickerEntityAssetTokens.tsx", "../../src/document/components/chrome/properties/panels/SelectStyleEntityAssetPopoutContent.styles.ts", "../../src/document/components/chrome/shared/TableSearchBar.tsx", "../../src/document/components/chrome/shared/TableSearchBar.styles.ts", "../../src/document/components/chrome/shared/ColorPicker/ColorPopoutButton.styles.ts", "../../src/document/components/chrome/properties/rows/numberFormattingOptions.ts", "../../src/document/components/chrome/shared/ValueTransformChain.styles.ts", "../../src/document/components/chrome/shared/DataSourceImageVariableReferenceButton.tsx", "../../src/document/components/chrome/shared/VariablePopoutButton.tsx", "../../src/document/components/chrome/shared/FetchDataValueButton.styles.ts", "../../src/document/components/chrome/shared/FetchDataValuePopout.tsx", "../../src/document/components/chrome/properties/utils/useFetchURLsUsedInScope.ts", "../../src/document/components/chrome/shared/FetchDataValuePopout.styles.ts", "../../src/document/components/chrome/shared/utils/fetchJSONFromSandbox.ts", "../../src/document/components/chrome/shared/FetchDataValueButton.tsx", "../../src/document/components/chrome/shared/DynamicValueButton.tsx", "../../src/code-editor/CodeFile.ts", "../../src/app/AppActions.ts", "../../src/plugins/utils/getDefaultDevelopmentPluginManifest.ts", "../../src/document/components/chrome/QuickActions/QuickActionsModal.tsx", "../../src/document/components/chrome/floatingToolbar/FloatingToolbar.tsx", "../../src/document/components/chrome/projectbar/ToolbarItem.tsx", "../../src/document/components/chrome/projectbar/ToolbarItem.styles.ts", "../../src/document/components/chrome/floatingToolbar/CanvasLocaleToolbarItem.tsx", "../../src/document/components/chrome/floatingToolbar/getMenuBoundsForToolbarItem.ts", "../../src/document/components/chrome/floatingToolbar/FloatingToolbar.styles.ts", "../../src/document/components/chrome/floatingToolbar/ToolbarZoomMenu.styles.ts", "../../src/document/components/chrome/floatingToolbar/ZoomMenuContainer.tsx", "../../src/document/components/chrome/floatingToolbar/ToolbarZoomMenu.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconComment.styles.ts", "../../src/document/components/chrome/floatingToolbar/icons/IconComment.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconCommentAgent.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconContactSupport.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconHand.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconHandAgent.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconMoon.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconPlugins.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconPointer.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconPointerAgent.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconSun.tsx", "../../src/document/components/chrome/floatingToolbar/icons/IconThemeAgent.tsx", "../../src/document/components/chrome/QuickActions/QuickActionsCategoryTag.styles.ts", "../../src/document/components/chrome/QuickActions/QuickActionsCategoryTag.tsx", "../../src/document/components/chrome/QuickActions/QuickActionsEmptyState.tsx", "../../src/document/components/chrome/QuickActions/QuickActionsModal.styles.ts", "../../src/document/components/chrome/QuickActions/QuickActionsGroupHeader.tsx", "../../src/document/components/chrome/QuickActions/QuickActionsInputIcon.styles.ts", "../../src/document/components/chrome/QuickActions/QuickActionsInputIcon.tsx", "../../src/document/components/chrome/QuickActions/utils/getIconForQuickActionItem.tsx", "../../src/document/components/chrome/QuickActions/utils/getQuickActionItemIdentifier.ts", "../../src/document/components/chrome/QuickActions/utils/performCodeImportAction.ts", "../../src/document/components/chrome/QuickActions/utils/useAssetStylesActions.tsx", "../../src/document/components/chrome/properties/panels/EditBlockquoteStylePresetPopout.tsx", "../../src/document/components/chrome/properties/inputs/NumberShorthandInput.tsx", "../../src/document/components/chrome/properties/inputs/FusedNumberInputs.tsx", "../../src/document/components/chrome/properties/inputs/FusedNumberInputs.styles.ts", "../../src/document/components/chrome/properties/inputs/NumberShorthandInput.styles.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetBreakpointTypeRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetBreakpointWidthRow.tsx", "../../src/document/components/chrome/properties/panels/CornerPanel.tsx", "../../src/document/components/utils/recordCornerShapeUpdate.ts", "../../src/document/components/chrome/properties/panels/CornerShapePanel.tsx", "../../src/document/components/chrome/properties/panels/utils/useCopyAndPasteSingleProperty.ts", "../../src/document/components/chrome/properties/panels/RadiusPanel.tsx", "../../src/document/components/chrome/properties/rows/SplitInFourInputsRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetCornerRows.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetFillRow.tsx", "../../src/document/components/chrome/properties/panels/FillPanel.tsx", "../../src/document/components/chrome/shared/ColorPicker/FillPopoutButton.tsx", "../../src/document/components/chrome/shared/ColorPicker/trackingMetadata.tsx", "../../src/document/components/chrome/properties/panels/FillImageAltRows.tsx", "../../src/document/components/chrome/properties/panels/FillImageAltRows.styles.ts", "../../src/document/components/chrome/properties/panels/utils/getFillImageAltPopoutId.ts", "../../src/document/components/chrome/properties/panels/utils/addFillImageAltForNodes.ts", "../../src/document/components/chrome/properties/panels/utils/addFillForNodes.ts", "../../src/document/components/chrome/properties/panels/utils/getDefaultGradientStops.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetFontRow.tsx", "../../src/document/components/chrome/properties/panels/utils/textStyle.ts", "../../src/document/components/chrome/properties/rows/FontRow.tsx", "../../src/document/components/chrome/shared/FontPopout/FontCategoryPicker.tsx", "../../src/document/components/chrome/shared/FontPopout/FontPopout.tsx", "../../src/document/components/chrome/shared/utils/useWebProjectService.ts", "../../src/document/components/chrome/shared/FontPopout/FontPopout.styles.ts", "../../src/document/components/chrome/shared/FontPopout/FontPreview.tsx", "../../src/document/components/chrome/shared/FontPopout/FontPreview.styles.ts", "../../src/document/components/chrome/shared/FontPopout/previews/index.ts", "../../src/document/components/chrome/shared/FontPopout/utils/formatFontFamily.ts", "../../src/document/components/chrome/shared/FontPopout/ListItem.styles.ts", "../../src/document/components/chrome/shared/FontPopout/ListItem.tsx", "../../src/document/components/chrome/shared/FontPopout/utils/selectAllFonts.ts", "../../src/document/components/chrome/shared/FontPopout/ListStateWrapper.styles.ts", "../../src/document/components/chrome/shared/FontPopout/ListStateWrapper.tsx", "../../src/document/components/chrome/shared/FontPopout/useFontPopoutInfo.ts", "../../src/document/components/chrome/shared/FontPopout/FontPopoutButton.styles.ts", "../../src/document/components/chrome/shared/FontPopout/FontPopoutButton.tsx", "../../src/document/components/chrome/properties/utils/getFontVariantName.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetFontSizeRow.tsx", "../../src/document/components/chrome/properties/rows/FontSizeRow.tsx", "../../src/document/components/chrome/properties/rows/FontSizeRow.styles.ts", "../../src/document/components/chrome/shared/PresetIcon.styles.ts", "../../src/document/components/chrome/shared/PresetIcon.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/FontVariantsPopout.tsx", "../../src/document/components/chrome/properties/rows/VariableFontRow/VariableFontRow.tsx", "../../src/document/components/chrome/properties/rows/VariableFontRow/VariableFontPopoutButton.tsx", "../../src/utils/containsMixedValue.ts", "../../src/document/components/chrome/properties/rows/utils/icons/IconAgentToggleOff.tsx", "../../src/document/components/chrome/properties/rows/utils/icons/IconAgentToggleOn.tsx", "../../src/document/components/chrome/properties/rows/utils/BooleanPopoutButtonPreview.tsx", "../../src/document/components/chrome/properties/rows/VariableFontRow/VariableFontPopout.tsx", "../../src/document/components/chrome/properties/rows/VariableFontRow/VariableFontPopout.styles.ts", "../../src/document/components/chrome/properties/rows/VariableFontRow/utils/categorizeVariationAxes.ts", "../../src/document/components/chrome/properties/rows/VariableFontRow/utils/supportsVariableFont.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/CustomFontPopout.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/CustomFontPopout.styles.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetFontVariantsRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetLetterSpacingRow.tsx", "../../src/document/components/chrome/properties/rows/LetterSpacingRow.tsx", "../../src/document/components/chrome/properties/rows/LineHeightRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetLineHeightRow.tsx", "../../src/document/components/chrome/properties/rows/ParagraphSpacingRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetParagraphSpacingRow.tsx", "../../src/document/components/chrome/properties/rows/TextAlignmentRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextAlignmentRow.tsx", "../../src/document/models/CanvasTree/records/ColorRecord.ts", "../../src/document/models/ColorClass.ts", "../../src/document/components/chrome/properties/rows/TextColorRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextColorRow.tsx", "../../src/document/components/chrome/properties/rows/TextDecorationRow.tsx", "../../src/document/components/chrome/properties/rows/TextDecorationRow.styles.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextDecorationRow.tsx", "../../src/document/components/chrome/properties/rows/TextTransformRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextTransformRow.tsx", "../../src/document/components/chrome/properties/panels/BorderPanel.tsx", "../../src/document/components/chrome/properties/panels/BorderPopout.tsx", "../../src/document/components/chrome/properties/panels/BorderValuesRows.tsx", "../../src/document/components/chrome/properties/panels/BorderPopoutButton.tsx", "../../src/document/components/chrome/properties/panels/utils/addBorderForNodes.ts", "../../src/document/components/chrome/properties/panels/EditBlockquoteStylePresetPopout.styles.ts", "../../src/document/components/chrome/properties/panels/PaddingRow.tsx", "../../src/document/components/chrome/properties/panels/utils/useDynamicLayoutValueUpdate.ts", "../../src/document/components/chrome/properties/panels/Panel.styles.ts", "../../src/document/components/chrome/properties/panels/Panel.tsx", "../../src/document/components/chrome/properties/panels/PanelSectionHeader.tsx", "../../src/document/components/chrome/properties/panels/PanelSectionHeader.styles.ts", "../../src/document/components/chrome/properties/panels/PresetPopoutContainer.tsx", "../../src/document/components/chrome/properties/panels/utils/getBlockquoteStylePresetBreakpoints.ts", "../../src/document/components/chrome/properties/panels/utils/useBlockquoteStylePresetBreakpoints.ts", "../../src/document/components/chrome/properties/utils/getBlockquoteStylePresetRowProps.tsx", "../../src/document/components/chrome/properties/panels/SelectStyleEntityAssetPopoutContent.tsx", "../../src/document/components/chrome/properties/panels/SelectBlockquoteStyleEntityAssetPopout.tsx", "../../src/document/components/chrome/properties/panels/EditLinkStylePresetPopout.tsx", "../../src/document/components/chrome/shared/TransitionEditor/TransitionPopout.tsx", "../../src/document/components/chrome/shared/TransitionEditor/DurationRow.tsx", "../../src/document/components/chrome/shared/TransitionEditor/SpringVisualiser.tsx", "../../src/document/components/chrome/shared/TransitionEditor/SpringEditor.tsx", "../../src/document/components/chrome/shared/TransitionEditor/TransitionPreview.tsx", "../../src/document/components/chrome/shared/TransitionEditor/TransitionPreview.styles.ts", "../../src/document/components/chrome/shared/TransitionEditor/BezierCurve.tsx", "../../src/document/components/chrome/shared/TransitionEditor/TransitionPreviewIcon.styles.ts", "../../src/document/components/chrome/shared/TransitionEditor/TransitionPreviewIcon.tsx", "../../src/document/components/chrome/shared/TransitionEditor/BezierCurveEditor.tsx", "../../src/document/components/chrome/shared/TransitionEditor/TweenEditor.styles.ts", "../../src/document/components/chrome/shared/TransitionEditor/TweenEditor.tsx", "../../src/document/components/chrome/properties/rows/TextBackgroundColorRow.tsx", "../../src/document/components/chrome/properties/rows/TextBackgroundCornerRows.tsx", "../../src/document/components/chrome/properties/rows/TextBackgroundCornerShapeRow.tsx", "../../src/document/components/chrome/properties/rows/TextBackgroundRadiusRow.tsx", "../../src/document/components/chrome/properties/rows/TextBackgroundPaddingRow.tsx", "../../src/document/components/chrome/properties/panels/PanelSectionHeaderButton.tsx", "../../src/document/components/chrome/properties/panels/PanelSectionHeaderButton.styles.ts", "../../src/document/components/chrome/properties/panels/icons/IconSectionHeaderPlus.tsx", "../../src/document/components/chrome/properties/utils/getLinkStylePresetRowProps.tsx", "../../src/document/components/chrome/properties/panels/SelectLinkStyleEntityAssetPopout.tsx", "../../src/document/components/chrome/properties/utils/getTableStylePresetRowProps.tsx", "../../src/document/components/chrome/properties/panels/EditTableStylePresetPopout.tsx", "../../src/document/components/chrome/properties/panels/TableBorderPanel.tsx", "../../src/document/components/chrome/properties/panels/TableBorderValuesRows.tsx", "../../src/document/components/chrome/properties/panels/icons/IconTableBordersInnerAll.tsx", "../../src/document/components/chrome/properties/panels/icons/IconTableBordersInnerHorizontal.tsx", "../../src/document/components/chrome/properties/panels/icons/IconTableBordersInnerNone.tsx", "../../src/document/components/chrome/properties/panels/icons/IconTableBordersInnerVertical.tsx", "../../src/document/components/chrome/properties/panels/TableBorderPopoutButton.tsx", "../../src/document/components/chrome/properties/panels/SelectTableStyleEntityAssetPopout.tsx", "../../src/document/components/chrome/assets/utils/getTextStylePresetDescription.ts", "../../src/document/components/chrome/properties/panels/EditTextStylePresetPopout.tsx", "../../src/document/components/chrome/properties/rows/OpenTypeRow/utils/supportsOpenTypeFontFeature.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetOpenTypeRow.tsx", "../../src/document/components/chrome/properties/rows/OpenTypeRow.tsx", "../../src/document/components/chrome/properties/rows/OpenTypePopout.tsx", "../../src/document/components/chrome/properties/rows/OpenTypePopout.styles.ts", "../../src/document/components/chrome/properties/rows/OpenTypeRow/OpenTypeFeaturePreview.tsx", "../../src/document/components/chrome/properties/rows/OpenTypeRow/OpenTypeFeaturePreview.styles.ts", "../../src/document/components/chrome/properties/rows/OpenTypeRow/utils/getOpenTypePreviewOverride.ts", "../../src/document/components/chrome/properties/rows/OpenTypeRow/utils/getOpenTypePreview.tsx", "../../src/document/components/chrome/properties/rows/OpenTypeRow/utils/useOpenTypeFeatures.ts", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextBackgroundColorRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextBackgroundCornerRows.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextBackgroundPaddingRow.tsx", "../../src/document/components/chrome/properties/rows/TextStrokeRow.tsx", "../../src/document/components/chrome/properties/rows/TextStrokePopoutButton.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextStrokeRow.tsx", "../../src/document/components/chrome/properties/rows/TextWrapBalanceRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetTextWrapBalanceRow.tsx", "../../src/document/components/chrome/properties/rows/StylePresetRows/StylePresetVariableFontRow.tsx", "../../src/document/components/chrome/properties/panels/utils/useTextStylePresetBreakpoints.ts", "../../src/document/components/chrome/properties/utils/getTextStylePresetRowProps.tsx", "../../src/document/components/chrome/properties/panels/SelectTextStyleEntityAssetPopout.tsx", "../../src/document/components/chrome/properties/panels/utils/useComponentsWithPresets.ts", "../../src/document/components/chrome/QuickActions/utils/useCanvasScopeQuickActions.ts", "../../src/document/components/chrome/QuickActions/utils/useCategoryActions.ts", "../../src/document/components/chrome/QuickActions/utils/getShortcutListForRole.ts", "../../src/document/components/chrome/QuickActions/utils/useCodeCrashQuickActions.ts", "../../src/code-editor/Folder.ts", "../../src/document/components/chrome/QuickActions/utils/useCodeFileQuickActions.ts", "../../src/document/components/chrome/QuickActions/utils/useCodeImportActions.ts", "../../src/document/components/utils/switchCollectionItemOnCanvas.ts", "../../src/document/components/chrome/QuickActions/utils/useCollectionPageItemQuickActions.ts", "../../src/utils/useItemToTitle.ts", "../../src/utils/useSelectedCollectionItemForWebPage.ts", "../../src/document/components/chrome/localization/useActiveLocalizationLocale.ts", "../../src/document/components/chrome/QuickActions/utils/createTitleFromLabelHierarchy.ts", "../../src/document/components/chrome/QuickActions/utils/excludedAppActions.ts", "../../src/document/components/chrome/QuickActions/utils/collectQuickActionsFromMenuItemOptions.ts", "../../src/document/components/chrome/QuickActions/utils/useCollectionQuickActions.ts", "../../src/document/components/chrome/QuickActions/utils/useCombineLists.ts", "../../src/document/components/chrome/QuickActions/utils/useComponentsActions.tsx", "../../src/document/components/chrome/QuickActions/utils/useContextMenuActions.ts", "../../src/document/components/chrome/QuickActions/utils/extractedMainMenuAppActions.ts", "../../src/document/components/chrome/QuickActions/utils/useFindNodesQuickActions.tsx", "../../src/document/components/chrome/QuickActions/utils/useLayoutTemplateActions.ts", "../../src/document/components/chrome/QuickActions/utils/useMainMenuActions.ts", "../../src/web/pages/project/employeesOnlyMenu/createMenuAndActionHandlers.ts", "../../src/web/pages/project/employeesOnlyMenu/experimentsMenu.ts", "../../src/web/pages/project/lib/TODO.ts", "../../src/document/components/chrome/QuickActions/utils/usePluginQuickActions.tsx", "../../src/document/components/chrome/QuickActions/utils/usePluginQuickActions.styles.ts", "../../src/document/components/chrome/QuickActions/utils/useSearchActionGroups.ts", "../../src/document/components/chrome/QuickActions/utils/useSmartComponentQuickActions.ts", "../../src/document/components/chrome/QuickActions/utils/useTeamLibraryActions.ts", "../../src/document/components/chrome/QuickActions/utils/useVersionHistoryActions.ts", "../../src/code-editor/logger.ts", "../../src/code-editor/loadingErrorToast.ts"],
  "sourcesContent": ["/*\n ****\n ******\n ******\n ******\n ****** \u267B\uFE0F Runtime helper generated by the Services build process from .d.ts. Do not modify. See the Services README for more information.\n ****** See '../' for service types.\n ******\n ******\n ******\n ****\n */\n\n// The generated service helper may or may not use some of the runtime exports. For simplicity, we import all of them.\nimport {\n\tService,\n\tServiceManager,\n\tServiceChannel,\n\tServiceMessageHelper,\n\tServiceRuntimePrivate,\n\tServiceValue,\n\tServiceStream,\n\tServiceStreamOptions,\n\tUnsafeJSON,\n\tfloat,\n\tinteger,\n\toneway,\n} from \"../../../runtime/index.ts\"\n\nimport type { WebProject } from \"../WebProject.ts\"\n\nconst { onewayMethodTemplate, voidMethodTemplate, valueMethodTemplate, streamMethodTemplate } = ServiceRuntimePrivate\n\nexport namespace WebProjectHelper {\n\ttype Interface = WebProject.Interface\n\n\texport const service: Service<Interface> = {\n\t\tid: \"__WebProject__\",\n\t\tfingerprint: \"fdb6442ba0f8b7a03634fbdf402ef482\",\n\t\tmethods: {\n\t\t\tcurrentProjectStream: {},\n\t\t\tshowMoveProjectMenu: {},\n\t\t},\n\t\tnewOutgoingWrapper: (helper: ServiceMessageHelper): Interface => {\n\t\t\treturn {\n\t\t\t\tcurrentProjectStream: streamMethodTemplate.bind(/* this: */ -1, \"currentProjectStream\", helper),\n\t\t\t\tshowMoveProjectMenu: voidMethodTemplate.bind(\n\t\t\t\t\t/* this: */ -1,\n\t\t\t\t\t\"showMoveProjectMenu\",\n\t\t\t\t\t/* accepts argument: */ true,\n\t\t\t\t\thelper,\n\t\t\t\t),\n\t\t\t} as Interface\n\t\t},\n\t}\n}\n", "/*\n **********\n *********\n ********\n *******\n ****** \u267B\uFE0F Generated by the Services build process from .d.ts. Do not modify. See the Services README for more information.\n *****\n ****\n ***\n **\n */\n\n// The generated namespace may or may not use some of the runtime exports. For simplicity, we import all of them.\nimport type {\n\tService,\n\tServiceChannel,\n\tServiceMessageHelper,\n\tServiceRuntimePrivate,\n\tServiceValue,\n\tServiceStream,\n\tServiceStreamOptions,\n\tUnsafeJSON,\n\tfloat,\n\tinteger,\n\toneway,\n} from \"../../runtime/index.ts\"\nimport { ServiceManager } from \"../../runtime/index.ts\"\n\n// The generated namespace may or may not use some of the global types. For simplicity, we import all of them.\nimport type {\n\tPoint,\n\tSize,\n\tRect,\n\tUser,\n\tColor,\n\tMenuAction,\n\tMenuValidationResult,\n\tMenuDispatchResult,\n\tMenuActionState,\n\tArea,\n\tContextMenu,\n\tMenuOptionIconCrossOrigin,\n\tMenuOptionIcon,\n\tMenuItemOptions,\n\tContextMenuResult,\n} from \"./Global.ts\"\n\n// Import the service implementation\nimport { WebProjectHelper } from \"./service-runtime/WebProjectHelper.ts\"\n\nimport type { SharedService } from \"./SharedService.ts\"\n\nexport namespace WebProject {\n\t/**\n\t * Exposes an IPC interface to interact with the current project on web.\n\t */\n\texport interface Interface {\n\t\tcurrentProjectStream(_?: ServiceStreamOptions): ServiceStream<WebProject.CurrentProjectEvent>\n\t\tshowMoveProjectMenu(_: WebProject.ShowMoveProjectMenuArguments): Promise<void>\n\t}\n\n\t/*\n\t * Using the service\n\t */\n\n\texport const service: Service<Interface> = WebProjectHelper.service\n\n\texport function on(channel: ServiceChannel): SharedService<Interface> {\n\t\t// Note: capture the shared service manager here so testing behavior is predictable\n\t\tconst sharedServices = ServiceManager.shared()\n\t\treturn {\n\t\t\texpect: () => sharedServices.expectWithoutDiscovery(service, channel),\n\t\t\tdiscover: options => sharedServices.discover(service, channel, options),\n\t\t\tregister: implementation => sharedServices.register({ channel, service, implementation }),\n\t\t}\n\t}\n\n\texport async function unregister(implementation: Interface): Promise<void> {\n\t\tvoid ServiceManager.shared().unregister(implementation)\n\t}\n\n\t/*\n\t * Types\n\t */\n\n\texport type ProjectSpaceScope = ServiceValue<\"user\" | \"organization\">\n\n\texport type ProjectSpace = ServiceValue<{\n\t\tid: string\n\t\ticon?: string\n\t\townerId: string\n\t\tscope: \"user\" | \"organization\"\n\t\tdisplayName?: string\n\t}>\n\n\texport type CurrentProjectEvent = ServiceValue<{\n\t\ttitle?: string\n\t\tspace: WebProject.ProjectSpace\n\t\tcanMoveProject: boolean\n\t}>\n\n\texport type Location = ServiceValue<{\n\t\tx: integer\n\t\ty: integer\n\t}>\n\n\texport type ShowMoveProjectMenuArguments = ServiceValue<{\n\t\tlocation: WebProject.Location\n\t}>\n}\n", "import { triggerEvent } from \"../listeners\";\nfunction createColorTokenSetEvent(payload) {\n  console.warn(\"[DEPRECATED] Use triggerColorTokenSetEvent instead of createColorTokenSetEvent.\");\n  return {\n    ...payload,\n    event: \"color_token_set\"\n  };\n}\nconst meta = {\n  track: true\n};\nfunction triggerColorTokenSetEvent(payload) {\n  const event = {\n    ...payload,\n    event: \"color_token_set\"\n  };\n  triggerEvent(event, meta);\n}\nexport {\n  createColorTokenSetEvent,\n  triggerColorTokenSetEvent\n};\n", "import { triggerEvent } from \"../listeners\";\nfunction createComponentCanvasDeleteEvent(payload) {\n  console.warn(\"[DEPRECATED] Use triggerComponentCanvasDeleteEvent instead of createComponentCanvasDeleteEvent.\");\n  return {\n    ...payload,\n    event: \"component_canvas_delete\"\n  };\n}\nconst meta = {\n  track: true\n};\nfunction triggerComponentCanvasDeleteEvent(payload) {\n  const event = {\n    ...payload,\n    event: \"component_canvas_delete\"\n  };\n  triggerEvent(event, meta);\n}\nexport {\n  createComponentCanvasDeleteEvent,\n  triggerComponentCanvasDeleteEvent\n};\n", "import { isArray } from \"utils/typeChecks.ts\"\nimport { isComputedValue } from \"../ComputedValue.ts\"\nimport type { DynamicValue } from \"../DynamicValue.ts\"\nimport type { ValueTransformType } from \"../ValueTransform.ts\"\nimport {\n\tgetInputTypesForValueTransformName,\n\tgetOutputTypeForValueTransform,\n\tisKnownValueTransformName,\n} from \"../ValueTransform.ts\"\nimport type { VariableDefinition, VariableType } from \"../WithVariables.ts\"\n\nexport function dynamicValueHasTypeError(\n\tvalue: DynamicValue,\n\tvariable: VariableDefinition,\n\texpectedType: VariableType | readonly VariableType[],\n): boolean {\n\tlet inputType: ValueTransformType | VariableType = variable.type\n\n\tif (isComputedValue(value)) {\n\t\tfor (const transform of value.transforms) {\n\t\t\tif (!isKnownValueTransformName(transform.name)) continue\n\t\t\tconst inputTypes = getInputTypesForValueTransformName(transform.name)\n\t\t\tif (!inputTypes || !inputTypes.includes(inputType)) return true\n\t\t\tinputType = getOutputTypeForValueTransform(transform)\n\t\t}\n\t}\n\n\treturn isArray(expectedType) ? !expectedType.includes(inputType as VariableType) : inputType !== expectedType\n}\n", "import { Scroll, Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { ComputedValueFromVariable } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport {\n\tcreateComputedValue,\n\tisComputedValue,\n\tisComputedValueOutputType,\n} from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { ValueTransform } from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport type { VariableDefinition, VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport type { AllowedFileTypes, ControlDescription } from \"library/render/types/PropertyControls.ts\"\nimport React from \"react\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"../properties/rows/PanelRow.tsx\"\nimport { selectedVariableIsNegated } from \"../properties/utils/selectedVariableIsNegated.ts\"\nimport * as styles from \"./ComputedValuePopout.styles.ts\"\nimport type { ControlReferenceInfoProps } from \"./DynamicValueButton.tsx\"\nimport { ValueTransformChain } from \"./ValueTransformChain.tsx\"\nimport { VariableReferenceButton } from \"./VariableReferenceButton.tsx\"\nimport { matchesExpectedType } from \"./dynamicValueChainSections.ts\"\n\ninterface Props extends ControlReferenceInfoProps {\n\ttitle: string | undefined\n\tvalue: ComputedValueFromVariable\n\tvariable: VariableDefinition\n\tinputControl: ControlDescription | undefined\n\toutputControl: ControlDescription | undefined\n\tonChangeDynamicValue: (value: DynamicValue, outputType: VariableType) => void\n\tonRemove: (dynamicValue: DynamicValue) => void\n\texpectedType: VariableType | readonly VariableType[]\n\tallowedFileTypes?: AllowedFileTypes\n\tvariableSourceIdentifiers: ModuleExportIdentifierString | undefined\n\tsupportsRelativeDates: boolean\n}\n\nexport function ComputedValuePopout({\n\ttitle,\n\tvalue,\n\tvariable,\n\tinputControl,\n\toutputControl,\n\tonChangeDynamicValue,\n\tonRemove,\n\texpectedType,\n\tallowedFileTypes,\n\tcontrolReferenceInfo,\n\tvariableSourceIdentifiers,\n\tsupportsRelativeDates,\n}: Props) {\n\tconst latestValueRef = React.useRef(value)\n\tlatestValueRef.current = value\n\n\tconst variableIsNegated = selectedVariableIsNegated(value, variable)\n\n\tconst onChangeTransforms = (updatedTransforms: readonly ValueTransform[]) => {\n\t\tconst latestValue = latestValueRef.current\n\n\t\tif (isComputedValue(latestValue)) {\n\t\t\tif (updatedTransforms.length === 0) {\n\t\t\t\tconst variableIsOfExpectedType = matchesExpectedType(variable.type, expectedType)\n\t\t\t\tassert(variableIsOfExpectedType)\n\t\t\t\tonChangeDynamicValue(latestValue.startValue, latestValue.outputType)\n\t\t\t} else {\n\t\t\t\tonChangeDynamicValue({ ...latestValue, transforms: updatedTransforms }, latestValue.outputType)\n\t\t\t}\n\t\t} else {\n\t\t\tconst outputType = isArray(expectedType)\n\t\t\t\t? expectedType.find(isComputedValueOutputType)\n\t\t\t\t: isComputedValueOutputType(expectedType)\n\t\t\t\t\t? expectedType\n\t\t\t\t\t: undefined\n\t\t\tassert(outputType)\n\t\t\tonChangeDynamicValue(createComputedValue(outputType, latestValue, updatedTransforms), outputType)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Scroll direction=\"vertical\" className={styles.scrollContainer}>\n\t\t\t<Stack gap={0} direction=\"column\">\n\t\t\t\t<Stack\n\t\t\t\t\tgap={0}\n\t\t\t\t\tpadding={dimensions.css.popoverPadding}\n\t\t\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\t\t\tpaddingBottom={0}\n\t\t\t\t>\n\t\t\t\t\t<PanelRow\n\t\t\t\t\t\ttitle={Dictionary.Variable}\n\t\t\t\t\t\tsupportsVariables\n\t\t\t\t\t\tsupportsComputedValues\n\t\t\t\t\t\tvariableType={expectedType}\n\t\t\t\t\t\tvariableReferenceType={undefined}\n\t\t\t\t\t\tallowedFileTypes={allowedFileTypes}\n\t\t\t\t\t\tdynamicValue={value}\n\t\t\t\t\t\tonCreateVariable={undefined}\n\t\t\t\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\t\t\t\tonRemoveDynamicValue={onRemove}\n\t\t\t\t\t\tonSelectComputedValue={computed => onChangeDynamicValue(computed, computed.outputType)}\n\t\t\t\t\t\tdisplayTransformOptions={false}\n\t\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey}\n\t\t\t\t\t\tcontrolSourceIdentifier={controlReferenceInfo?.controlSourceIdentifier}\n\t\t\t\t\t\t// Transform options aren't displayed within the variable menu, so this popout id should never be used\n\t\t\t\t\t\tcomputedValuePopoutId=\"never\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<VariableReferenceButton\n\t\t\t\t\t\t\texpectedType={expectedType}\n\t\t\t\t\t\t\treference={value.startValue}\n\t\t\t\t\t\t\tonRemove={onRemove}\n\t\t\t\t\t\t\tisNegated={variableIsNegated}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t</Stack>\n\t\t\t\t<ValueTransformChain\n\t\t\t\t\tpropName={title}\n\t\t\t\t\texpectedType={expectedType}\n\t\t\t\t\tinputControl={inputControl}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\tmainInputType={variable.type}\n\t\t\t\t\tvariableIsNegated={variableIsNegated}\n\t\t\t\t\tonChangeTransforms={onChangeTransforms}\n\t\t\t\t\ttransforms={value.transforms}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t\tinputControlKey={variable.id}\n\t\t\t\t\tinputControlSourceIdentifier={variableSourceIdentifiers}\n\t\t\t\t\tsupportsRelativeDates={supportsRelativeDates}\n\t\t\t\t/>\n\t\t\t</Stack>\n\t\t</Scroll>\n\t)\n}\n", "import \"ComputedValuePopout.styles_19zm6q6.wyw.css\"; export const scrollContainer = \"scrollContainer_spc7gkz\";", "import {\n\tButton,\n\tCenterChild,\n\tIconDots,\n\tIconErrorStateWarning,\n\tPopupButton,\n\tPopupButtonItem,\n\tStack,\n\tuseReadOnly,\n} from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { assert } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport engine from \"document/engine.ts\"\nimport { isComputedValueOutputType } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { ValueTransform, ValueTransformType } from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport {\n\tgetInputTypesForValueTransformName,\n\tgetOutputTypeForValueTransform,\n\tgetValueTransformRange,\n\tgetValueTransformTitle,\n} from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport { variableTypeTitle } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { isVariableType } from \"document/models/CanvasTree/traits/utils/isVariableType.ts\"\nimport {\n\tcreateNegateTransform,\n\tcreateValueTransformWithName,\n} from \"document/models/CanvasTree/traits/utils/valueTransformUtils.ts\"\nimport type { ControlDescription } from \"library/render/types/PropertyControls.ts\"\nimport React from \"react\"\nimport { isReadonlyArray } from \"utils/typeChecks.ts\"\nimport { DescriptionRow } from \"../properties/codeComponentRows/DescriptionRow.tsx\"\nimport { PanelRow } from \"../properties/rows/PanelRow.tsx\"\nimport { valueTransformRows } from \"../properties/rows/ValueTransformRows.tsx\"\nimport { doubleColumnClass } from \"../properties/utils/doubleColumn.styles.ts\"\nimport type { ControlReferenceInfoProps } from \"./DynamicValueButton.tsx\"\nimport * as styles from \"./ValueTransformChain.styles.ts\"\nimport type {\n\tTransformChainSectionProps,\n\tTransformSection,\n\tTypeErrorSection,\n\tTypeErrorSectionWithKey,\n\tValueTransformOption,\n} from \"./dynamicValueChainSections.ts\"\nimport {\n\taddTransformToReachOutputTypeIfPossible,\n\tgetExpectedOutputType,\n\tgetTransformChainSections,\n\tisTransformSection,\n\tisTypeErrorSection,\n\tisTypeErrorSectionWithKey,\n\tisUnknownTransformSection,\n} from \"./dynamicValueChainSections.ts\"\nimport { applyTransformValuesToReplacement } from \"./utils/applyTransformValuesToReplacement.ts\"\n\ninterface Props extends TransformChainSectionProps, ControlReferenceInfoProps {\n\toutputControl: ControlDescription | undefined\n\tonChangeTransforms: (transforms: readonly ValueTransform[]) => void\n\t/** Used to compare start value enums to enum variables, to know if they are compatible. */\n\tinputControlKey: string\n\tinputControlSourceIdentifier?: ModuleExportIdentifierString\n\tsupportsRelativeDates: boolean\n}\n\nexport const ValueTransformChain = React.memo(function ValueTransformChain({\n\toutputControl,\n\tonChangeTransforms,\n\tcontrolReferenceInfo,\n\tinputControlKey,\n\tinputControlSourceIdentifier,\n\tsupportsRelativeDates,\n\t...transformChainSectionProps\n}: Props) {\n\tconst isReadOnly = useReadOnly()\n\n\tconst chain = getTransformChainSections(transformChainSectionProps)\n\n\tconst latestTransformsRef = React.useRef(transformChainSectionProps.transforms)\n\tlatestTransformsRef.current = transformChainSectionProps.transforms\n\n\tconst replaceSection = (\n\t\tpart: \"errorBefore\" | \"errorAfter\" | \"chain\",\n\t\tsection: TransformSection | TypeErrorSection | TypeErrorSectionWithKey,\n\t\t{ name, isNegated, outputType }: ValueTransformOption,\n\t) => {\n\t\tconst isFirstSection = chain.sections[0] === section\n\t\tconst inputType = isTransformSection(section) ? section.inputType : section.received\n\t\tconst transformOutputType = outputControl?.type === outputType ? outputControl : outputType\n\t\tconst newTransform = createValueTransformWithName({\n\t\t\tname,\n\t\t\tinput: isFirstSection ? (transformChainSectionProps.inputControl ?? inputType) : inputType,\n\t\t\toutput: transformOutputType,\n\t\t})\n\t\tconst newTransforms = [newTransform]\n\t\tif (isNegated) {\n\t\t\tnewTransforms.push(createNegateTransform())\n\t\t}\n\n\t\t// If we are the last part of the chain add another transform if that allows us to reach the\n\t\t// expected type.\n\t\tconst isLastSection = chain.sections.at(-1) === section\n\t\tif (isLastSection) {\n\t\t\tconst expectedOutputType = getExpectedOutputType(transformChainSectionProps.expectedType)\n\t\t\taddTransformToReachOutputTypeIfPossible(newTransforms, outputControl, expectedOutputType)\n\t\t}\n\n\t\t// We use a ref to get the latest value because it might have been updated in the meantime\n\t\tconst latestTransforms = latestTransformsRef.current\n\t\tconst transformCount = latestTransforms?.length ?? 0\n\n\t\tif (!latestTransforms || transformCount === 0) {\n\t\t\tonChangeTransforms(newTransforms)\n\t\t\treturn\n\t\t}\n\n\t\t// The range of transforms that need to be replaced\n\t\tlet range: { start: number; length: number } | null = null\n\n\t\tif (part === \"errorBefore\") {\n\t\t\t// Insert at the front\n\t\t\trange = { start: 0, length: 0 }\n\t\t} else if (part === \"errorAfter\") {\n\t\t\t// Insert at the end\n\t\t\trange = { start: transformCount, length: 0 }\n\t\t} else if (isTransformSection(section)) {\n\t\t\tconst replacementRange = getReplacementRangeForTransform(latestTransforms, section, newTransform)\n\t\t\tif (!replacementRange) return\n\t\t\trange = replacementRange\n\t\t} else {\n\t\t\t// Replacing type error, insert before next transform without replacing any transforms\n\t\t\tassert(isTypeErrorSectionWithKey(section))\n\t\t\tconst nextTransformRange = getValueTransformRange(latestTransforms, section.transformAfter.id)\n\t\t\tif (!nextTransformRange) return\n\t\t\trange = { start: nextTransformRange.start, length: 0 }\n\t\t}\n\n\t\tif (!range) return\n\n\t\tconst transforms = [...latestTransforms]\n\t\ttransforms.splice(range.start, range.length, ...newTransforms)\n\t\tonChangeTransforms(transforms)\n\t}\n\n\tconst onChangeTransform = (updatedTransform: ValueTransform) => {\n\t\tconst latestTransforms = latestTransformsRef.current\n\t\tassert(latestTransforms)\n\n\t\tconst updatedTransforms = latestTransforms.map(transform =>\n\t\t\ttransform.id === updatedTransform.id ? updatedTransform : transform,\n\t\t)\n\t\tonChangeTransforms(updatedTransforms)\n\t}\n\n\tconst deleteTransform = (transformToDelete: ValueTransform) => {\n\t\tconst latestTransforms = latestTransformsRef.current\n\t\tassert(latestTransforms)\n\n\t\tconst range = getValueTransformRange(latestTransforms, transformToDelete.id)\n\t\tif (!range) return\n\n\t\tconst newValueTransforms = [...latestTransforms]\n\t\tnewValueTransforms.splice(range.start, range.length)\n\n\t\tonChangeTransforms(newValueTransforms)\n\t}\n\n\t// Used for replacing value transforms as well as fixing type errors by inserting a transform\n\tconst displayReplaceOptions = (\n\t\tevent: React.MouseEvent,\n\t\tpart: \"errorBefore\" | \"errorAfter\" | \"chain\",\n\t\tsection: TransformSection | TypeErrorSection | TypeErrorSectionWithKey,\n\t) => {\n\t\tif (!section.replaceOptions) return\n\t\tlet { clientX: x, clientY: y } = event\n\t\tif (event.target instanceof HTMLElement) {\n\t\t\tconst bounds = event.target.getBoundingClientRect()\n\t\t\tx = bounds.left\n\t\t\ty = bounds.bottom - 2\n\t\t}\n\t\tconst options: MenuItemOptions[] = section.replaceOptions.map(replaceOption => {\n\t\t\tconst { name, isNegated } = replaceOption\n\t\t\tconst isSelected = isTransformSection(section)\n\t\t\t\t? section.transform.name === name && section.isNegated === isNegated\n\t\t\t\t: false\n\t\t\treturn {\n\t\t\t\tlabel: getValueTransformTitle(name, isNegated),\n\t\t\t\tenabled: !isReadOnly,\n\t\t\t\tclick: () => {\n\t\t\t\t\tif (isSelected) return\n\t\t\t\t\treplaceSection(part, section, replaceOption)\n\t\t\t\t},\n\t\t\t\tchecked: isSelected,\n\t\t\t}\n\t\t})\n\t\tengine.stores.contextMenuStore.show(options, { location: { x, y } })\n\t}\n\n\t// Adds a transform at the end of the chain\n\tconst displayTransformAdditionOptions = (event: React.MouseEvent<HTMLButtonElement>) => {\n\t\tconst buttonElement = event.currentTarget\n\t\tconst bounds = buttonElement.getBoundingClientRect()\n\n\t\tconst options: MenuItemOptions[] = chain.transformAdditionOptions.map(({ name, isNegated, outputType }) => ({\n\t\t\tlabel: getValueTransformTitle(name, isNegated),\n\t\t\tenabled: !isReadOnly,\n\t\t\tclick: () => {\n\t\t\t\tconst transformsToAdd = [\n\t\t\t\t\tcreateValueTransformWithName({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tinput: transformChainSectionProps.inputControl ?? transformChainSectionProps.mainInputType,\n\t\t\t\t\t\toutput: outputControl && outputControl.type === outputType ? outputControl : outputType,\n\t\t\t\t\t}),\n\t\t\t\t]\n\n\t\t\t\tif (isNegated) {\n\t\t\t\t\ttransformsToAdd.push(createNegateTransform())\n\t\t\t\t}\n\n\t\t\t\t// We use a ref to get the latest value because it might have been updated in the meantime\n\t\t\t\tconst latestTransforms = latestTransformsRef.current\n\t\t\t\tif (latestTransforms) {\n\t\t\t\t\tonChangeTransforms([...latestTransforms, ...transformsToAdd])\n\t\t\t\t} else {\n\t\t\t\t\tonChangeTransforms(transformsToAdd)\n\t\t\t\t}\n\t\t\t},\n\t\t}))\n\n\t\tengine.stores.contextMenuStore.show(options, {\n\t\t\tlocation: { x: bounds.left, y: bounds.top },\n\t\t\tplacement: \"top-start\",\n\t\t})\n\t}\n\n\tconst errorBefore = chain.errorBefore\n\tconst errorAfter = chain.errorAfter\n\n\treturn (\n\t\t<Stack className={errorBefore ? styles.topMarginWithError : styles.topMargin} gap={0}>\n\t\t\t{errorBefore && (\n\t\t\t\t<InvalidTypeWarning\n\t\t\t\t\ttitle={chain.errorBefore.title}\n\t\t\t\t\texpected={chain.errorBefore.expected}\n\t\t\t\t\treceived={chain.errorBefore.received}\n\t\t\t\t\tcanReplace={(chain.errorBefore.replaceOptions?.length ?? 0) > 0}\n\t\t\t\t\tonReplace={event => displayReplaceOptions(event, \"errorBefore\", errorBefore)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{chain.sections.map((section, idx) => {\n\t\t\t\tif (isTypeErrorSection(section)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<InvalidTypeWarning\n\t\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\t\ttitle={section.title}\n\t\t\t\t\t\t\texpected={section.expected}\n\t\t\t\t\t\t\treceived={section.received}\n\t\t\t\t\t\t\tcanReplace={(section.replaceOptions?.length ?? 0) > 0}\n\t\t\t\t\t\t\tonReplace={event => displayReplaceOptions(event, \"chain\", section)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst transform = section.transform\n\t\t\t\tif (isUnknownTransformSection(section)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<SectionContainer\n\t\t\t\t\t\t\tkey={transform.id}\n\t\t\t\t\t\t\tisFirstSection={idx === 0}\n\t\t\t\t\t\t\ttitle={getValueTransformTitle(transform.name, false)}\n\t\t\t\t\t\t\treplaceOptions={null}\n\t\t\t\t\t\t\tcanBeDeleted\n\t\t\t\t\t\t\tonDelete={() => deleteTransform(transform)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DescriptionRow fullWidth description=\"Unknown transform\" />\n\t\t\t\t\t\t</SectionContainer>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<SectionContainer\n\t\t\t\t\t\tkey={transform.id}\n\t\t\t\t\t\tisFirstSection={idx === 0}\n\t\t\t\t\t\ttitle={getValueTransformTitle(transform.name, section.isNegated)}\n\t\t\t\t\t\tcanBeDeleted={section.canBeDeleted}\n\t\t\t\t\t\tonDelete={() => deleteTransform(transform)}\n\t\t\t\t\t\treplaceOptions={section.replaceOptions}\n\t\t\t\t\t\tonReplace={replaceOption => replaceSection(\"chain\", section, replaceOption)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{valueTransformRows({\n\t\t\t\t\t\t\tinputType: section.inputType,\n\t\t\t\t\t\t\tinputControl: section.inputControl,\n\t\t\t\t\t\t\tinputControlKey,\n\t\t\t\t\t\t\tinputControlSourceIdentifier,\n\t\t\t\t\t\t\toutputControl,\n\t\t\t\t\t\t\ttransform,\n\t\t\t\t\t\t\tisNegated: section.isNegated,\n\t\t\t\t\t\t\tonChange: onChangeTransform,\n\t\t\t\t\t\t\tcontrolReferenceInfo,\n\t\t\t\t\t\t\tsupportsRelativeDates: supportsRelativeDates && transformChainSectionProps.transforms?.length === 1,\n\t\t\t\t\t\t})}\n\t\t\t\t\t</SectionContainer>\n\t\t\t\t)\n\t\t\t})}\n\t\t\t{errorAfter && (\n\t\t\t\t<InvalidTypeWarning\n\t\t\t\t\ttitle={chain.errorAfter.title}\n\t\t\t\t\texpected={chain.errorAfter.expected}\n\t\t\t\t\treceived={chain.errorAfter.received}\n\t\t\t\t\tcanReplace={(chain.errorAfter?.replaceOptions?.length ?? 0) > 0}\n\t\t\t\t\tonReplace={event => displayReplaceOptions(event, \"errorAfter\", errorAfter)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{chain.transformAdditionOptions.length > 0 && (\n\t\t\t\t<Stack padding={dimensions.css.panelPadding} className={cx(!errorAfter && styles.dividerAbove)}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tenabled={!isReadOnly}\n\t\t\t\t\t\ttitle={`Add ${Dictionary.Transform}`}\n\t\t\t\t\t\tonMouseDown={displayTransformAdditionOptions}\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</Stack>\n\t)\n})\n\ninterface SectionContainerProps {\n\ttitle: string\n\tonDelete: () => void\n\tcanBeDeleted: boolean\n\tchildren: React.ReactNode\n\treplaceOptions: readonly ValueTransformOption[] | null\n\tonReplace?: (option: ValueTransformOption) => void\n\tisFirstSection: boolean\n}\n\nfunction SectionContainer({\n\ttitle,\n\tonDelete,\n\tcanBeDeleted,\n\treplaceOptions,\n\tonReplace,\n\tchildren,\n\tisFirstSection,\n}: SectionContainerProps) {\n\tconst hasReplaceOptions = !!replaceOptions && replaceOptions.length !== 0\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tpadding={dimensions.css.panelPadding}\n\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t\tclassName={cx(!isFirstSection && styles.dividerAbove)}\n\t\t>\n\t\t\t{(hasReplaceOptions || canBeDeleted) && (\n\t\t\t\t<PanelRow title={isFirstSection ? undefined : \"Then\"}>\n\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t{!hasReplaceOptions && <PopupButtonItem title={title} selected />}\n\t\t\t\t\t\t{replaceOptions?.map(replaceOption => {\n\t\t\t\t\t\t\tconst optionTitle = getValueTransformTitle(replaceOption.name, replaceOption.isNegated)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={optionTitle}\n\t\t\t\t\t\t\t\t\ttitle={optionTitle}\n\t\t\t\t\t\t\t\t\tselected={title === optionTitle}\n\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\tassert(onReplace)\n\t\t\t\t\t\t\t\t\t\tonReplace(replaceOption)\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<PopupButtonItem type=\"divider\" visible={canBeDeleted} />\n\t\t\t\t\t\t<PopupButtonItem title={Dictionary.Remove} onSelect={onDelete} visible={canBeDeleted} />\n\t\t\t\t\t</PopupButton>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n\nfunction variableNames(expected: ValueTransformType | readonly ValueTransformType[]): string {\n\tif (!isReadonlyArray(expected)) {\n\t\treturn isVariableType(expected) ? variableTypeTitle(expected) : expected\n\t}\n\n\tconst validOutputTypes = expected.filter(isComputedValueOutputType)\n\n\tconst named = validOutputTypes.map(type => {\n\t\treturn isVariableType(type) ? variableTypeTitle(type) : type\n\t})\n\n\tif (named.length === 1) {\n\t\tconst name = named[0]\n\t\tassert(name)\n\t\treturn name\n\t}\n\n\tconst items = named.slice(0, -1)\n\tconst lastItem = named[named.length - 1]\n\treturn items.join(\", \") + `, or ${lastItem}`\n}\n\ninterface InvalidTypeWarningProps {\n\ttitle: string | undefined\n\texpected: ValueTransformType | readonly ValueTransformType[]\n\treceived: ValueTransformType\n\tcanReplace: boolean\n\tonReplace: (event: React.MouseEvent) => void\n}\n\nfunction InvalidTypeWarning({ title, expected, received, canReplace, onReplace }: InvalidTypeWarningProps) {\n\treturn (\n\t\t<Stack\n\t\t\tpadding={dimensions.css.panelPadding}\n\t\t\tpaddingLeft={`calc(${dimensions.css.panelPadding} + 7px)`}\n\t\t\tdirection=\"row\"\n\t\t\talignItems=\"center\"\n\t\t\tclassName={styles.warningContainer}\n\t\t>\n\t\t\t<IconErrorStateWarning />\n\t\t\t<span>{`${title ? `${title} expects` : \"Expects\"} a ${variableNames(\n\t\t\t\texpected,\n\t\t\t)} but receives a ${isVariableType(received) ? variableTypeTitle(received) : received} value.`}</span>\n\t\t\t{canReplace && (\n\t\t\t\t<CenterChild onMouseDown={onReplace} className={styles.typeWarningReplaceButton}>\n\t\t\t\t\t<IconDots />\n\t\t\t\t</CenterChild>\n\t\t\t)}\n\t\t</Stack>\n\t)\n}\n\nfunction getReplacementRangeForTransform(\n\tcurrentTransforms: readonly ValueTransform[],\n\tsection: TransformSection,\n\tnewTransform: ValueTransform,\n): ReturnType<typeof getValueTransformRange> {\n\t// Replace all transforms represented by the section\n\tconst range = getValueTransformRange(currentTransforms, section.transform.id)\n\tif (!range) return null\n\n\tconst currentTransform = currentTransforms[range.start]\n\tif (!currentTransform) return null\n\n\tapplyTransformValuesToReplacement(section.inputType, currentTransform, newTransform)\n\n\t// Remove all transforms after the replaced transform that are incompatible with the new\n\t// transform's output type\n\tconst nextTransformIndex = range.start + 1\n\tconst nextTransform = currentTransforms[nextTransformIndex]\n\tif (!nextTransform) return range\n\n\tconst outputTypeOfNewTransform = getOutputTypeForValueTransform(newTransform)\n\tconst inputTypesOfNextTransform = getInputTypesForValueTransformName(nextTransform.name)\n\tconst nextTransformSupportsOutputType = inputTypesOfNextTransform?.includes(outputTypeOfNewTransform)\n\tif (nextTransformSupportsOutputType) return range\n\n\trange.length = currentTransforms.length - range.start\n\treturn range\n}\n\nexport const testing = { getReplacementRangeForTransform }\n", "import {\n\tButton,\n\tDateInput,\n\tNumberInputWithTicker,\n\tPopupButton,\n\tPopupButtonItem,\n\tSegmentedControl,\n\tSegmentedControlItem,\n\tSlider,\n\tStack,\n\tStepper,\n\tTextInput,\n} from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { assert, Mixed, shouldBeNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { randomID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport {\n\tgetNumericColumnGapFromShorthand,\n\tgetNumericRowGapFromShorthand,\n} from \"document/models/CanvasTree/traits/NumberShorthand.ts\"\nimport type {\n\tConvertFromBooleanOutputValueType,\n\tConvertFromEnumCase,\n\tConvertFromEnumOrStringOutputValueType,\n\tConvertFromEnumOutputType,\n\tConvertFromStringCase,\n\tDateSegment,\n\tValueTransform,\n\tValueTransformConvertFromBoolean,\n\tValueTransformConvertFromEnum,\n\tValueTransformConvertFromString,\n\tValueTransformEquals,\n\tValueTransformExtractDateSegment,\n\tValueTransformIsBetweenDates,\n\tValueTransformNumberToString,\n\tValueTransformToDateString,\n\tValueTransformType,\n} from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport {\n\tdateSegmentOptions,\n\tnumberToStringCompactDisplayOptions,\n\tnumberToStringCurrencyDisplayOptions,\n\tnumberToStringNotationOptions,\n\tnumberToStringStyles,\n\tnumberToStringUnitDisplayOptions,\n} from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { getLink, isLink } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport {\n\ttype DateDisplayOption,\n\ttype DateFormatOption,\n\ttype DateStyleOption,\n\tdateDisplayConfig,\n\tdateDisplayOptions,\n\tdateFormatConfig,\n\tdateStyleConfig,\n\tgetVerifiedDateDisplayValue,\n\tgetVerifiedDateFormatValue,\n\tgetVerifiedDateStyleValue,\n\ttransformOptionsToDateFormatKey,\n\ttransformOptionsToDateStyleKey,\n} from \"document/models/CanvasTree/traits/utils/toDateStringTransformOptions.ts\"\nimport {\n\tconvertFromBooleanFallbackOutputValue,\n\tconvertFromEnumOrStringFallbackOutputValue,\n} from \"document/models/CanvasTree/traits/utils/valueTransformUtils.ts\"\nimport {\n\ttype GapControlProp,\n\tisBorderRadiusControlPropValue,\n\tisCollectionReferenceControlPropValue,\n\tisGapControlPropValue,\n\tisMultiCollectionReferenceControlPropValue,\n\tisPaddingControlPropValue,\n} from \"document/models/controlProps/ControlProp.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport type { ControlDescription } from \"library/render/types/PropertyControls.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport React from \"react\"\nimport { fallbackTitleForOption } from \"utils/enumControlUtils.ts\"\nimport { upperCaseFirstChar } from \"utils/names.ts\"\nimport { titleCase } from \"utils/titleCase.ts\"\nimport { isBoolean, isNumber, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport type { ControlReferenceInfo } from \"../../shared/DynamicValueButton.tsx\"\nimport { LocaleSelector } from \"../../shared/LocaleSelector.tsx\"\nimport { PopoutButton } from \"../../shared/PopoutButton.tsx\"\nimport { VariableReferenceButton } from \"../../shared/VariableReferenceButton.tsx\"\nimport { isLocaleCode } from \"../../shared/locales.ts\"\nimport { useControlPropRows } from \"../codeComponentRows/ControlPropRowContext.tsx\"\nimport { isValidPropertyValueType } from \"../codeComponentRows/utils/isValidPropertyValue.ts\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { doubleColumnClass } from \"../utils/doubleColumn.styles.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport { numberFormattingCurrencyOptions, numberFormattingUnitTypes } from \"./numberFormattingOptions.ts\"\n\nfunction transformUpdateHandler<T extends ValueTransform, K extends keyof T>(\n\tvalueTransform: T,\n\tkey: K,\n\tonChange: (transform: T) => void,\n\t// Optional transform, can be used to round user input for example\n\ttransform?: (value: T[K]) => T[K],\n) {\n\treturn (value: T[K]) => {\n\t\tonChange({ ...valueTransform, [key]: transform ? transform(value) : value })\n\t}\n}\n\nexport function valueTransformRows<T extends ValueTransform>({\n\tinputType,\n\tinputControl,\n\toutputControl,\n\ttransform,\n\tisNegated,\n\tonChange,\n\tcontrolReferenceInfo,\n\tinputControlKey,\n\tinputControlSourceIdentifier,\n\tsupportsRelativeDates,\n}: {\n\tinputType: ValueTransformType\n\tinputControl: ControlDescription | undefined\n\tinputControlKey: string\n\tinputControlSourceIdentifier?: ModuleExportIdentifierString\n\toutputControl: ControlDescription | undefined\n\ttransform: T\n\tisNegated: boolean\n\tonChange: (transform: T) => void\n\tcontrolReferenceInfo: ControlReferenceInfo | undefined\n\tsupportsRelativeDates: boolean\n}) {\n\tconst { CollectionReferenceControlPropRow, MultiCollectionReferenceControlPropRow } = useControlPropRows()\n\n\tswitch (transform.name) {\n\t\tcase \"isBefore\":\n\t\tcase \"isAfter\": {\n\t\t\tconst prefix = transform.name === \"isBefore\" ? \"Before\" : \"After\"\n\t\t\tconst baseName = inputControl?.title ?? Dictionary.Value\n\t\t\tconst defaultVariableName = `${prefix} ${baseName}`\n\t\t\treturn (\n\t\t\t\t<DateValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tonChange={value => onChange({ ...transform, value })}\n\t\t\t\t\tdefaultVariableName={defaultVariableName}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tcase \"isBetweenDates\":\n\t\t\treturn <BetweenDatesRow transform={transform} onChange={onChange as any} baseVariableName={inputControl?.title} />\n\t\tcase \"equals\":\n\t\t\treturn (\n\t\t\t\t<ValueTransformEqualRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tinputType={inputType}\n\t\t\t\t\tinputControl={inputControl}\n\t\t\t\t\tinputControlKey={inputControlKey}\n\t\t\t\t\tinputControlSourceIdentifier={inputControlSourceIdentifier}\n\t\t\t\t\ttransform={transform}\n\t\t\t\t\tonChange={onChange as any}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"startsWith\":\n\t\tcase \"endsWith\":\n\t\tcase \"prefix\":\n\t\tcase \"suffix\": {\n\t\t\tconst baseName = inputControl?.title ?? Dictionary.Value\n\t\t\tconst suffix = transform.name === \"endsWith\" || transform.name === \"suffix\" ? \"Suffix\" : \"Prefix\"\n\t\t\tconst defaultVariableName = `${baseName} ${suffix}`\n\t\t\treturn (\n\t\t\t\t<StringValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tonChange={value => onChange({ ...transform, value })}\n\t\t\t\t\tdefaultVariableName={defaultVariableName}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tcase \"contains\":\n\t\t\tswitch (inputControl?.type) {\n\t\t\t\tcase ControlType.MultiCollectionReference:\n\t\t\t\t\tif (!CollectionReferenceControlPropRow) return\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CollectionReferenceControlPropRow\n\t\t\t\t\t\t\tsupportsVariables\n\t\t\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\t\t\ttype: ControlType.CollectionReference,\n\t\t\t\t\t\t\t\tvalue: isCollectionReferenceControlPropValue(transform.value) ? transform.value : undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\t\t\tonChange({ ...transform, value: value.value })\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\tdefault:\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StringValueRow\n\t\t\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\t\t\tsupportsVariables\n\t\t\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\t\t\tonChange={value => onChange({ ...transform, value })}\n\t\t\t\t\t\t\tdefaultVariableName={inputControl?.title}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t}\n\t\tcase \"containsAny\":\n\t\tcase \"containsAll\":\n\t\t\tif (inputControl?.type !== ControlType.MultiCollectionReference) return\n\t\t\tif (!MultiCollectionReferenceControlPropRow) return\n\t\t\t{\n\t\t\t\treturn (\n\t\t\t\t\t<MultiCollectionReferenceControlPropRow\n\t\t\t\t\t\tsupportsVariables\n\t\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\t\ttype: ControlType.MultiCollectionReference,\n\t\t\t\t\t\t\tvalue: isMultiCollectionReferenceControlPropValue(transform.value) ? transform.value : undefined,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\t\tonChange({ ...transform, value: value.value })\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdefaultVariableName={inputControl.title ?? Dictionary.Value}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t}\n\t\tcase \"isIncludedIn\":\n\t\t\tif (inputControl?.type !== ControlType.CollectionReference) return null\n\t\t\tif (!MultiCollectionReferenceControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<MultiCollectionReferenceControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.MultiCollectionReference,\n\t\t\t\t\t\tvalue: isMultiCollectionReferenceControlPropValue(transform.value) ? transform.value : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\tonChange({ ...transform, value: value.value })\n\t\t\t\t\t}}\n\t\t\t\t\tdefaultVariableName={inputControl.title ?? Dictionary.Value}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"toggleInList\":\n\t\t\tif (inputControl?.type !== ControlType.MultiCollectionReference) return null\n\t\t\tif (!CollectionReferenceControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<CollectionReferenceControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.CollectionReference,\n\t\t\t\t\t\tvalue: isCollectionReferenceControlPropValue(transform.value) ? transform.value : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\tonChange({ ...transform, value: value.value })\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"greaterThan\":\n\t\tcase \"lessThan\": {\n\t\t\tconst isGreaterThan = transform.name === \"greaterThan\"\n\t\t\tconst valueIsMin = isGreaterThan ? !isNegated : isNegated\n\t\t\tconst prefix = valueIsMin ? Dictionary.Min : Dictionary.Max\n\t\t\tconst baseName = inputControl?.title ?? Dictionary.Value\n\t\t\tconst defaultVariableName = `${prefix} ${baseName}`\n\t\t\treturn (\n\t\t\t\t<NumberValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\tonChange={value => onChange({ ...transform, value })}\n\t\t\t\t\tdefaultVariableName={defaultVariableName}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tcase \"toDateString\":\n\t\t\treturn (\n\t\t\t\t<DateFormatRows\n\t\t\t\t\ttransform={transform}\n\t\t\t\t\tsupportsRelativeDates={supportsRelativeDates}\n\t\t\t\t\tonChange={onChange as any}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"extractDateSegment\":\n\t\t\treturn <ExtractDateSegmentRows transform={transform} onChange={onChange as any} />\n\t\tcase \"numberToString\":\n\t\t\treturn <NumberToStringRows transform={transform} onChange={onChange as any} />\n\t\tcase \"convertFromEnum\":\n\t\t\treturn (\n\t\t\t\t<ConvertFromEnumRows\n\t\t\t\t\tinputControl={inputControl}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttransform={transform}\n\t\t\t\t\tonChange={onChange as any}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"convertFromBoolean\":\n\t\t\treturn (\n\t\t\t\t<ConvertFromBooleanRows\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttransform={transform}\n\t\t\t\t\tonChange={onChange as any}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"convertFromString\":\n\t\t\treturn (\n\t\t\t\t<ConvertFromStringRows\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttransform={transform}\n\t\t\t\t\tonChange={onChange as any}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\nfunction LocaleOverridePanelRow({\n\ttransform,\n\tonChange,\n}: Omit<DateFormattingProps, \"supportsRelativeDates\"> | NumberToStringProps) {\n\tconst [localeInputVisible, setLocaleInputVisible] = React.useState<boolean>(() => isLocaleCode(transform.locale))\n\tconst localeHandler = transformUpdateHandler(transform, \"locale\", onChange)\n\n\tconst overrideLocalePreferenceHandler = (value: \"override\" | \"auto\") => {\n\t\tsetLocaleInputVisible(value === \"override\")\n\n\t\tif (value === \"auto\") {\n\t\t\tlocaleHandler(undefined)\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title={Dictionary.Locale}>\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tkey=\"auto\"\n\t\t\t\t\t\tidentifier=\"auto\"\n\t\t\t\t\t\ttitle={Dictionary.Auto}\n\t\t\t\t\t\tselected={!localeInputVisible}\n\t\t\t\t\t\tonSelect={overrideLocalePreferenceHandler}\n\t\t\t\t\t/>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tkey=\"override\"\n\t\t\t\t\t\tidentifier=\"override\"\n\t\t\t\t\t\ttitle=\"Override\"\n\t\t\t\t\t\tselected={localeInputVisible}\n\t\t\t\t\t\tonSelect={overrideLocalePreferenceHandler}\n\t\t\t\t\t/>\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\n\t\t\t{localeInputVisible ? (\n\t\t\t\t<PanelRow>\n\t\t\t\t\t<LocaleSelector\n\t\t\t\t\t\tcompact\n\t\t\t\t\t\tvalue={isLocaleCode(transform.locale) ? transform.locale : \"\"}\n\t\t\t\t\t\tonChange={localeHandler}\n\t\t\t\t\t\twrapperClassName={doubleColumnClass}\n\t\t\t\t\t/>\n\t\t\t\t</PanelRow>\n\t\t\t) : null}\n\t\t</>\n\t)\n}\n\nfunction ValueTransformEqualRow({\n\tinputType,\n\tinputControl,\n\ttransform,\n\tonChange,\n\tsupportsVariables,\n\tinputControlKey,\n\tinputControlSourceIdentifier,\n}: {\n\tinputType: ValueTransformType\n\tinputControl: ControlDescription | undefined\n\tinputControlKey: string\n\tinputControlSourceIdentifier?: ModuleExportIdentifierString\n\ttransform: ValueTransformEquals\n\tonChange: (transform: ValueTransformEquals) => void\n\tsupportsVariables: boolean\n}) {\n\tconst { CollectionReferenceControlPropRow, EnumControlPropRow } = useControlPropRows()\n\n\tswitch (inputType) {\n\t\tcase ControlType.String:\n\t\t\treturn (\n\t\t\t\t<StringValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tonChange={transformUpdateHandler(transform, \"value\", onChange)}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t\tdefaultVariableName={inputControl?.title}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Boolean:\n\t\t\treturn (\n\t\t\t\t<BooleanValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tonChange={transformUpdateHandler(transform, \"value\", onChange)}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t\tdefaultVariableName={inputControl?.title}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Number:\n\t\t\treturn (\n\t\t\t\t<NumberValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\tonChange={transformUpdateHandler(transform, \"value\", onChange)}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Enum:\n\t\t\tif (inputControl?.type !== ControlType.Enum) return null\n\t\t\tif (!inputControlSourceIdentifier) return null\n\t\t\tif (!EnumControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<EnumControlPropRow\n\t\t\t\t\tcontrolProp={{ type: ControlType.Enum, value: transform.value }}\n\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\tonChange={controlProp => {\n\t\t\t\t\t\tassert(isValidPropertyValueType(ControlType.Enum, controlProp.value))\n\t\t\t\t\t\ttransformUpdateHandler(transform, \"value\", onChange)(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t\tcontrol={{ ...inputControl, title: Dictionary.Value }}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t\tcontrolSourceIdentifier={inputControlSourceIdentifier}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Date:\n\t\t\tif (inputControl?.type !== ControlType.Date) return null\n\t\t\treturn (\n\t\t\t\t<DateValueRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tvalue={transform.value}\n\t\t\t\t\tonChange={transformUpdateHandler(transform, \"value\", onChange)}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t\tdefaultVariableName={inputControl?.title}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.CollectionReference:\n\t\t\tif (inputControl?.type !== ControlType.CollectionReference) return null\n\t\t\tif (!CollectionReferenceControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<CollectionReferenceControlPropRow\n\t\t\t\t\ttitle={Dictionary.Value}\n\t\t\t\t\tcontrolKey={inputControlKey}\n\t\t\t\t\tcontrol={inputControl}\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.CollectionReference,\n\t\t\t\t\t\tvalue: isCollectionReferenceControlPropValue(transform.value) ? transform.value : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={controlProp => {\n\t\t\t\t\t\tassert(isCollectionReferenceControlPropValue(controlProp.value), \"Invalid value\")\n\t\t\t\t\t\ttransformUpdateHandler(transform, \"value\", onChange)(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\tthrow Error(\"<ValueTransformEqualRow />, Currently only string, boolean, number, enum, and date are supported\")\n\t}\n}\n\ninterface BooleanValueRowProps {\n\ttitle: string\n\tvalue: unknown\n\tonChange: (value: boolean | VariableReference) => void\n\tsupportsVariables?: boolean\n\tdefaultVariableName?: string\n\tonDelete?: VoidFunction\n}\n\nfunction BooleanValueRow({\n\ttitle,\n\tvalue,\n\tonChange,\n\tsupportsVariables = false,\n\tdefaultVariableName,\n\tonDelete,\n}: BooleanValueRowProps) {\n\tconst resolvedVariableName = defaultVariableName ?? title\n\tconst onSelect = (newValue: boolean) => {\n\t\tonChange(newValue)\n\t}\n\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Boolean,\n\t\t\t\tinitialValue: isBoolean(value) ? value : true,\n\t\t\t\tname: resolvedVariableName,\n\t\t\t})\n\t\t\tif (variableRef) onChange(variableRef)\n\t\t},\n\t\t[onChange, resolvedVariableName, value],\n\t)\n\n\tconst onRemoveVariableReference = useEngineCallback(() => {\n\t\tif (!isVariableReference(value)) return\n\t\tconst variableValue = getVariableValue(engine, value)\n\t\tconst newValue = isBoolean(variableValue) ? variableValue : true\n\t\tonChange(newValue)\n\t}, [value, onChange])\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tvariableType={ControlType.Boolean}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveVariableReference}\n\t\t\tonSelectVariable={onChange}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t{isVariableReference(value) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\treference={value}\n\t\t\t\t\texpectedType={ControlType.Boolean}\n\t\t\t\t\tonRemove={onRemoveVariableReference}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<SegmentedControl className={doubleColumnClass}>\n\t\t\t\t\t<SegmentedControlItem identifier title={Dictionary.Yes} selected={value === true} onSelect={onSelect} />\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tidentifier={false}\n\t\t\t\t\t\ttitle={Dictionary.No}\n\t\t\t\t\t\tselected={value === false}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t/>\n\t\t\t\t</SegmentedControl>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\ninterface NumberValueRowProps {\n\ttitle: string\n\tvalue: unknown\n\tonChange: (value: number | VariableReference) => void\n\tsupportsVariables?: boolean\n\tcontrol: ControlDescription | undefined\n\tdefaultVariableName?: string\n\tonDelete?: VoidFunction\n}\n\nfunction NumberValueRow({\n\ttitle,\n\tvalue,\n\tonChange,\n\tcontrol,\n\tsupportsVariables = false,\n\tdefaultVariableName,\n\tonDelete,\n}: NumberValueRowProps) {\n\tconst resolvedVariableName = defaultVariableName ?? control?.title ?? title\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Number,\n\t\t\t\tinitialValue: isNumber(value) ? value : 0,\n\t\t\t\tname: resolvedVariableName,\n\t\t\t})\n\t\t\tif (variableRef) onChange(variableRef)\n\t\t},\n\t\t[onChange, resolvedVariableName, value],\n\t)\n\n\tconst onRemoveVariableReference = useEngineCallback(() => {\n\t\tif (!isVariableReference(value)) return\n\t\tconst variableValue = getVariableValue(engine, value)\n\t\tconst newValue = isNumber(variableValue) ? variableValue : 0\n\t\tonChange(newValue)\n\t}, [value, onChange])\n\n\tconst numberValue = isNumber(value) ? value : undefined\n\n\tlet min: number | undefined\n\tlet max: number | undefined\n\tlet step: number | undefined\n\tlet unit: string | undefined\n\tlet displaySlider = false\n\n\tif (control?.type === ControlType.Number) {\n\t\tmin = control.min\n\t\tmax = control.max\n\t\tstep = control.step\n\t\tunit = control.unit\n\t\tif (control.displayStepper === false) {\n\t\t\tdisplaySlider = true\n\t\t}\n\t} else if (\n\t\tcontrol?.type === ControlType.Gap ||\n\t\tcontrol?.type === ControlType.Padding ||\n\t\tcontrol?.type === ControlType.BorderRadius\n\t) {\n\t\tmin = 0\n\t}\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tvariableType={ControlType.Number}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveVariableReference}\n\t\t\tonSelectVariable={onChange}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t{isVariableReference(value) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\treference={value}\n\t\t\t\t\texpectedType={ControlType.Number}\n\t\t\t\t\tonRemove={onRemoveVariableReference}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<NumberInputWithTicker value={numberValue} min={min} max={max} step={step} unit={unit} onChange={onChange} />\n\t\t\t\t\t{displaySlider ? (\n\t\t\t\t\t\t<Slider value={numberValue} min={min} max={max} step={step} onChange={onChange} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Stepper value={numberValue} min={min} max={max} step={step} onChange={onChange} />\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\ninterface StringValueRowProps {\n\ttitle: string\n\tvalue: unknown\n\tonChange: (value: string | VariableReference) => void\n\tsupportsVariables?: boolean\n\tdefaultVariableName?: string\n\tonDelete?: () => void\n}\n\nfunction StringValueRow({\n\ttitle,\n\tvalue,\n\tonChange,\n\tsupportsVariables = false,\n\tdefaultVariableName,\n\tonDelete,\n}: StringValueRowProps) {\n\tconst resolvedVariableName = defaultVariableName ?? title\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.String,\n\t\t\t\tinitialValue: isString(value) ? value : \"\",\n\t\t\t\tname: resolvedVariableName,\n\t\t\t})\n\t\t\tif (variableRef) onChange(variableRef)\n\t\t},\n\t\t[onChange, resolvedVariableName, value],\n\t)\n\n\tconst onRemoveVariableReference = useEngineCallback(() => {\n\t\tonChange(\"\")\n\t}, [onChange])\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tvariableType={ControlType.String}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveVariableReference}\n\t\t\tonSelectVariable={onChange}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t{isVariableReference(value) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\treference={value}\n\t\t\t\t\texpectedType={ControlType.String}\n\t\t\t\t\tonRemove={onRemoveVariableReference}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<TextInput\n\t\t\t\t\tvalue={isString(value) ? value : \"\"}\n\t\t\t\t\tplaceholder={Dictionary.Empty}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\ninterface ColorValueRowProps {\n\ttitle: string\n\tvalue: unknown\n\tonChange: (value: string | VariableReference) => void\n\tsupportsVariables?: boolean\n\tdefaultVariableName?: string\n\tonDelete?: VoidFunction\n}\n\nfunction ColorValueRow({\n\ttitle,\n\tvalue,\n\tonChange,\n\tsupportsVariables = false,\n\tdefaultVariableName,\n\tonDelete,\n}: ColorValueRowProps) {\n\tconst resolvedVariableName = defaultVariableName ?? title\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Color,\n\t\t\t\tinitialValue: isString(value) ? value : \"\",\n\t\t\t\tname: resolvedVariableName,\n\t\t\t})\n\t\t\tif (variableRef) onChange(variableRef)\n\t\t},\n\t\t[onChange, resolvedVariableName, value],\n\t)\n\n\tconst onRemoveVariableReference = useEngineCallback(() => {\n\t\tonChange(\"\")\n\t}, [onChange])\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tvariableType={ControlType.Color}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveVariableReference}\n\t\t\tonSelectVariable={onChange}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t{isVariableReference(value) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\treference={value}\n\t\t\t\t\texpectedType={ControlType.Color}\n\t\t\t\t\tonRemove={onRemoveVariableReference}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<ColorPopoutButton navigationTitle={title} value={isString(value) ? value : \"\"} onChange={onChange} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\ninterface DateFormattingProps {\n\ttransform: ValueTransformToDateString\n\tsupportsRelativeDates: boolean\n\tonChange: (transform: ValueTransformToDateString) => void\n}\n\nconst styleKeyToLabel: Record<DateStyleOption, string> = {\n\tnarrow: \"XS\",\n\tcompact: \"XS\",\n\tshort: \"S\",\n\tmedium: \"M\",\n\tlong: \"L\",\n\tfull: \"XL\",\n}\n\nfunction DateFormatRows({ transform, supportsRelativeDates, onChange }: DateFormattingProps) {\n\tconst displayValue = getVerifiedDateDisplayValue(transform.display, supportsRelativeDates)\n\tconst formatValue = getVerifiedDateFormatValue(displayValue, transform.format)\n\tconst styleValue = getVerifiedDateStyleValue(displayValue, formatValue, transform.dateStyle)\n\n\tconst dateStyleHandler = transformUpdateHandler(transform, \"dateStyle\", onChange)\n\tconst capitalizeHandler = transformUpdateHandler(transform, \"capitalize\", onChange)\n\n\tconst dateDisplayHandler = (value: DateDisplayOption) => {\n\t\tconst verifiedDisplayOption = getVerifiedDateDisplayValue(value, supportsRelativeDates)\n\t\t// Keep the format & style the same if possible, or fallback to the defaults if the existing\n\t\t// ones don't exist on the new display\n\t\tconst verifiedFormatOption = getVerifiedDateFormatValue(verifiedDisplayOption, formatValue)\n\t\tconst verifiedStyleOption = getVerifiedDateStyleValue(verifiedDisplayOption, verifiedFormatOption, styleValue)\n\n\t\tonChange({\n\t\t\t...transform,\n\t\t\tdisplay: verifiedDisplayOption,\n\t\t\tformat: verifiedFormatOption,\n\t\t\tdateStyle: verifiedStyleOption,\n\t\t})\n\t}\n\n\tconst dateFormatHandler = (value: DateFormatOption) => {\n\t\t// Keep the style the same if possible, or fallback to the default if the existing style\n\t\t// doesn't exist on the new format\n\t\tconst verifiedFormatOption = getVerifiedDateFormatValue(displayValue, value)\n\t\tconst verifiedStyleOption = getVerifiedDateStyleValue(displayValue, verifiedFormatOption, styleValue)\n\n\t\tonChange({\n\t\t\t...transform,\n\t\t\tformat: verifiedFormatOption,\n\t\t\tdateStyle: verifiedStyleOption,\n\t\t})\n\t}\n\n\tconst configForDateDisplay = React.useMemo(() => dateDisplayConfig[displayValue], [displayValue])\n\n\tconst configForDateFormat = React.useMemo(() => {\n\t\tconst dateFormatKey = transformOptionsToDateFormatKey(displayValue, formatValue, supportsRelativeDates)\n\t\treturn dateFormatConfig[dateFormatKey]\n\t}, [displayValue, formatValue, supportsRelativeDates])\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title=\"Display\">\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t{dateDisplayOptions.map(option => {\n\t\t\t\t\t\tif (option === \"relative\" && !supportsRelativeDates) {\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\t\ttitle={dateDisplayConfig[option].label}\n\t\t\t\t\t\t\t\tselected={option === displayValue}\n\t\t\t\t\t\t\t\tonSelect={dateDisplayHandler}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\n\t\t\t{configForDateDisplay.formats.length > 1 ? (\n\t\t\t\t<PanelRow title=\"Format\">\n\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t{configForDateDisplay.formats.map(option => {\n\t\t\t\t\t\t\tconst dateFormatKeyForOption = transformOptionsToDateFormatKey(\n\t\t\t\t\t\t\t\tdisplayValue,\n\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\tsupportsRelativeDates,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst dateFormatForOption = dateFormatConfig[dateFormatKeyForOption]\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\t\t\ttitle={dateFormatForOption.label}\n\t\t\t\t\t\t\t\t\tselected={option === formatValue}\n\t\t\t\t\t\t\t\t\tonSelect={dateFormatHandler}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</PopupButton>\n\t\t\t\t</PanelRow>\n\t\t\t) : null}\n\n\t\t\t{configForDateFormat.styles.length > 1 ? (\n\t\t\t\t<PanelRow title={Dictionary.Style}>\n\t\t\t\t\t<SegmentedControl direction={configForDateFormat.controlDirection} className={doubleColumnClass}>\n\t\t\t\t\t\t{configForDateFormat.styles.map(option => {\n\t\t\t\t\t\t\tconst dateStyleKey = transformOptionsToDateStyleKey(\n\t\t\t\t\t\t\t\tdisplayValue,\n\t\t\t\t\t\t\t\tformatValue,\n\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\tsupportsRelativeDates,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst optionConfig = dateStyleConfig[dateStyleKey]\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\t\t\tonSelect={dateStyleHandler}\n\t\t\t\t\t\t\t\t\ttitle={optionConfig.overrideLabel || styleKeyToLabel[option]}\n\t\t\t\t\t\t\t\t\tselected={option === styleValue}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t</PanelRow>\n\t\t\t) : null}\n\n\t\t\t{displayValue === \"relative\" ? (\n\t\t\t\t<PanelRow title=\"Capitalize\">\n\t\t\t\t\t<SegmentedControl className={doubleColumnClass}>\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tidentifier={true}\n\t\t\t\t\t\t\tonSelect={capitalizeHandler}\n\t\t\t\t\t\t\ttitle={Dictionary.Yes}\n\t\t\t\t\t\t\tselected={transform.capitalize === true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tidentifier={false}\n\t\t\t\t\t\t\tonSelect={capitalizeHandler}\n\t\t\t\t\t\t\ttitle={Dictionary.No}\n\t\t\t\t\t\t\tselected={transform.capitalize !== true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t</PanelRow>\n\t\t\t) : null}\n\n\t\t\t<LocaleOverridePanelRow transform={transform} onChange={onChange} />\n\t\t</>\n\t)\n}\n\nconst dateSegmentValueToLabel: Record<DateSegment, string> = {\n\tyear: \"Year\",\n\tmonth: \"Month\",\n\tday: \"Day\",\n\thour12: \"Hour (12-hour)\",\n\thour24: \"Hour (24-hour)\",\n\tminute: \"Minute\",\n}\n\ninterface ExtractDateSegmentProps {\n\ttransform: ValueTransformExtractDateSegment\n\tonChange: (transform: ValueTransformExtractDateSegment) => void\n}\n\nfunction ExtractDateSegmentRows({ transform, onChange }: ExtractDateSegmentProps) {\n\tconst dateSegmentHandler = transformUpdateHandler(transform, \"segment\", onChange)\n\n\tconst segmentValue = transform.segment ?? \"year\"\n\n\treturn (\n\t\t<PanelRow title=\"Segment\">\n\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t{dateSegmentOptions.map(option => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\ttitle={dateSegmentValueToLabel[option]}\n\t\t\t\t\t\t\tselected={option === segmentValue}\n\t\t\t\t\t\t\tonSelect={dateSegmentHandler}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</PopupButton>\n\t\t</PanelRow>\n\t)\n}\n\ninterface BetweenDatesProps {\n\ttransform: ValueTransformIsBetweenDates\n\tonChange: (transform: ValueTransformIsBetweenDates) => void\n\tbaseVariableName?: string\n}\n\nfunction BetweenDatesRow({ transform, onChange, baseVariableName }: BetweenDatesProps) {\n\tconst resolvedBaseName = baseVariableName ?? Dictionary.Value\n\treturn (\n\t\t<>\n\t\t\t<DateValueRow\n\t\t\t\ttitle={Dictionary.Start}\n\t\t\t\tsupportsVariables\n\t\t\t\tvalue={transform.start}\n\t\t\t\tonChange={transformUpdateHandler(transform, \"start\", onChange)}\n\t\t\t\tdefaultVariableName={`${Dictionary.Start} ${resolvedBaseName}`}\n\t\t\t/>\n\t\t\t<DateValueRow\n\t\t\t\ttitle=\"End\"\n\t\t\t\tsupportsVariables\n\t\t\t\tvalue={transform.end}\n\t\t\t\tonChange={transformUpdateHandler(transform, \"end\", onChange)}\n\t\t\t\tdefaultVariableName={`End ${resolvedBaseName}`}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\ninterface NumberToStringProps {\n\ttransform: ValueTransformNumberToString\n\tonChange: (transform: ValueTransformNumberToString) => void\n}\n\nfunction NumberToStringRows({ transform, onChange }: NumberToStringProps) {\n\tconst groupingHandler = transformUpdateHandler(transform, \"grouping\", onChange)\n\tconst notationHandler = transformUpdateHandler(transform, \"notation\", onChange)\n\tconst compactDisplayHandler = transformUpdateHandler(transform, \"compactDisplay\", onChange)\n\tconst styleHandler = transformUpdateHandler(transform, \"style\", onChange)\n\tconst currencyOptionHandler = transformUpdateHandler(transform, \"currency\", onChange)\n\tconst currencyDisplayOptionHandler = transformUpdateHandler(transform, \"currencyDisplay\", onChange)\n\tconst unitTypeHandler = transformUpdateHandler(transform, \"unit\", onChange)\n\tconst unitDisplayTypeHandler = transformUpdateHandler(transform, \"unitDisplay\", onChange)\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title=\"Grouping\">\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\ttitle={Dictionary.Auto}\n\t\t\t\t\t\tonSelect={() => groupingHandler(\"auto\")}\n\t\t\t\t\t\tselected={transform.grouping === \"auto\"}\n\t\t\t\t\t/>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\ttitle=\"Always\"\n\t\t\t\t\t\tonSelect={() => groupingHandler(true)}\n\t\t\t\t\t\tselected={transform.grouping === true}\n\t\t\t\t\t/>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\ttitle={Dictionary.None}\n\t\t\t\t\t\tonSelect={() => groupingHandler(false)}\n\t\t\t\t\t\tselected={transform.grouping === false}\n\t\t\t\t\t/>\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t\t<PanelRow title=\"Notation\">\n\t\t\t\t<SegmentedControl className={doubleColumnClass}>\n\t\t\t\t\t{numberToStringNotationOptions.map(notationOption => (\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tkey={notationOption}\n\t\t\t\t\t\t\tidentifier={notationOption}\n\t\t\t\t\t\t\ttitle={titleCase(notationOption)}\n\t\t\t\t\t\t\tselected={transform.notation === notationOption}\n\t\t\t\t\t\t\tonSelect={notationHandler}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</SegmentedControl>\n\t\t\t</PanelRow>\n\t\t\t{transform.notation === \"compact\" && (\n\t\t\t\t<PanelRow title=\" \">\n\t\t\t\t\t<SegmentedControl className={doubleColumnClass}>\n\t\t\t\t\t\t{numberToStringCompactDisplayOptions.map(compactDisplayOption => (\n\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\tkey={compactDisplayOption}\n\t\t\t\t\t\t\t\tidentifier={compactDisplayOption}\n\t\t\t\t\t\t\t\ttitle={titleCase(compactDisplayOption)}\n\t\t\t\t\t\t\t\tselected={transform.compactDisplay === compactDisplayOption}\n\t\t\t\t\t\t\t\tonSelect={compactDisplayHandler}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t\t<PanelRow title={Dictionary.Style}>\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t{numberToStringStyles.map(style => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={style}\n\t\t\t\t\t\t\tidentifier={style}\n\t\t\t\t\t\t\tonSelect={styleHandler}\n\t\t\t\t\t\t\ttitle={upperCaseFirstChar(style)}\n\t\t\t\t\t\t\tselected={transform.style === style}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t\t{transform.style === \"currency\" && (\n\t\t\t\t<>\n\t\t\t\t\t<PanelRow title=\"Currency\">\n\t\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t\t{numberFormattingCurrencyOptions.map(currencyOption => (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={currencyOption}\n\t\t\t\t\t\t\t\t\tidentifier={currencyOption}\n\t\t\t\t\t\t\t\t\ttitle={currencyOption}\n\t\t\t\t\t\t\t\t\tonSelect={currencyOptionHandler}\n\t\t\t\t\t\t\t\t\tselected={transform.currency === currencyOption}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t\t<PanelRow title=\"Display\">\n\t\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t\t{numberToStringCurrencyDisplayOptions.map(currencyDisplayOption => (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={currencyDisplayOption}\n\t\t\t\t\t\t\t\t\tidentifier={currencyDisplayOption}\n\t\t\t\t\t\t\t\t\ttitle={titleCase(currencyDisplayOption)}\n\t\t\t\t\t\t\t\t\tonSelect={currencyDisplayOptionHandler}\n\t\t\t\t\t\t\t\t\tselected={transform.currencyDisplay === currencyDisplayOption}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{transform.style === \"unit\" && (\n\t\t\t\t<>\n\t\t\t\t\t<PanelRow title=\"Unit\">\n\t\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t\t{numberFormattingUnitTypes.map(unitType => (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={unitType}\n\t\t\t\t\t\t\t\t\tidentifier={unitType}\n\t\t\t\t\t\t\t\t\ttitle={titleCase(unitType)}\n\t\t\t\t\t\t\t\t\tonSelect={unitTypeHandler}\n\t\t\t\t\t\t\t\t\tselected={transform.unit === unitType}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t\t<PanelRow title=\"Display\">\n\t\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t\t{numberToStringUnitDisplayOptions.map(unitDisplayType => (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={unitDisplayType}\n\t\t\t\t\t\t\t\t\tidentifier={unitDisplayType}\n\t\t\t\t\t\t\t\t\ttitle={titleCase(unitDisplayType)}\n\t\t\t\t\t\t\t\t\tonSelect={unitDisplayTypeHandler}\n\t\t\t\t\t\t\t\t\tselected={transform.unitDisplay === unitDisplayType}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<PanelRow title=\"Digits\">\n\t\t\t\t<PopoutButton\n\t\t\t\t\tdisplayDivider\n\t\t\t\t\tuseFrescoButton\n\t\t\t\t\ttitle=\"Integer\"\n\t\t\t\t\tnavigationTitle=\"Integer Digits\"\n\t\t\t\t\tpopout={<NumberToStringIntegerDigitPopout transform={transform} onChange={onChange} />}\n\t\t\t\t/>\n\t\t\t\t<PopoutButton\n\t\t\t\t\tdisplayDivider\n\t\t\t\t\tuseFrescoButton\n\t\t\t\t\ttitle=\"Fraction\"\n\t\t\t\t\tnavigationTitle=\"Fraction Digits\"\n\t\t\t\t\tpopout={<NumberToStringFractionDigitPopout transform={transform} onChange={onChange} />}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t\t<LocaleOverridePanelRow transform={transform} onChange={onChange} />\n\t\t</>\n\t)\n}\n\nfunction roundIfNumber(value: number | undefined): number | undefined {\n\treturn isNumber(value) ? Math.round(value) : undefined\n}\n\nfunction NumberToStringFractionDigitPopout({ transform, onChange }: NumberToStringProps) {\n\tconst onChangeMinFraction = transformUpdateHandler(transform, \"minimumFractionDigits\", onChange, roundIfNumber)\n\tconst onChangeMaxFraction = transformUpdateHandler(transform, \"maximumFractionDigits\", onChange, roundIfNumber)\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"column\"\n\t\t\tpaddingLeft={dimensions.css.panelPadding}\n\t\t\tpaddingRight={dimensions.css.panelPadding}\n\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\tgap={0}\n\t\t>\n\t\t\t<PanelRow title={Dictionary.Min}>\n\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={20}\n\t\t\t\t\tvalue={transform.minimumFractionDigits}\n\t\t\t\t\tonChange={onChangeMinFraction}\n\t\t\t\t/>\n\t\t\t\t<Button enabled={isNumber(transform.minimumFractionDigits)} onClick={() => onChangeMinFraction(undefined)}>\n\t\t\t\t\tClear\n\t\t\t\t</Button>\n\t\t\t</PanelRow>\n\t\t\t<PanelRow title={Dictionary.Max}>\n\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={20}\n\t\t\t\t\tvalue={transform.maximumFractionDigits}\n\t\t\t\t\tonChange={onChangeMaxFraction}\n\t\t\t\t/>\n\t\t\t\t<Button enabled={isNumber(transform.maximumFractionDigits)} onClick={() => onChangeMaxFraction(undefined)}>\n\t\t\t\t\tClear\n\t\t\t\t</Button>\n\t\t\t</PanelRow>\n\t\t</Stack>\n\t)\n}\n\nfunction NumberToStringIntegerDigitPopout({ transform, onChange }: NumberToStringProps) {\n\tconst onChangeMinInteger = transformUpdateHandler(transform, \"minimumIntegerDigits\", onChange, roundIfNumber)\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"column\"\n\t\t\tpaddingLeft={dimensions.css.panelPadding}\n\t\t\tpaddingRight={dimensions.css.panelPadding}\n\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\tgap={0}\n\t\t>\n\t\t\t<PanelRow title={Dictionary.Min}>\n\t\t\t\t<NumberInputWithTicker min={1} max={21} value={transform.minimumIntegerDigits} onChange={onChangeMinInteger} />\n\t\t\t\t<Button enabled={isNumber(transform.minimumIntegerDigits)} onClick={() => onChangeMinInteger(undefined)}>\n\t\t\t\t\tClear\n\t\t\t\t</Button>\n\t\t\t</PanelRow>\n\t\t</Stack>\n\t)\n}\n\ninterface ConvertFromEnumCaseValueProps {\n\toutputType: ConvertFromEnumOutputType\n\toutputControl: ControlDescription | undefined\n\ttitle: string\n\tvalue: ConvertFromEnumOrStringOutputValueType | VariableReference\n\tonChange(value: ConvertFromEnumOrStringOutputValueType | VariableReference): void\n\tcontrolReferenceInfo: ControlReferenceInfo | undefined\n\tdefaultVariableName?: string\n\tonDelete?: VoidFunction\n}\n\nfunction ConvertFromEnumOrStringOutputValue({\n\toutputType,\n\toutputControl,\n\ttitle,\n\tvalue,\n\tonChange,\n\tcontrolReferenceInfo,\n\tdefaultVariableName,\n\tonDelete,\n}: ConvertFromEnumCaseValueProps) {\n\tconst {\n\t\tBorderRadiusControlPropRow,\n\t\tEnumControlPropRow,\n\t\tGapControlPropRow,\n\t\tLinkControlPropRow,\n\t\tPaddingControlPropRow,\n\t} = useControlPropRows()\n\n\tswitch (outputType) {\n\t\tcase ControlType.String:\n\t\t\treturn (\n\t\t\t\t<StringValueRow\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tdefaultVariableName={defaultVariableName ?? outputControl?.title}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Boolean:\n\t\t\treturn (\n\t\t\t\t<BooleanValueRow\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tdefaultVariableName={defaultVariableName ?? outputControl?.title}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Number:\n\t\t\treturn (\n\t\t\t\t<NumberValueRow\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrol={outputControl}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tdefaultVariableName={defaultVariableName ?? outputControl?.title}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Color:\n\t\t\treturn (\n\t\t\t\t<ColorValueRow\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tdefaultVariableName={defaultVariableName ?? outputControl?.title}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Link:\n\t\t\tif (!LinkControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<LinkControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.Link,\n\t\t\t\t\t\tvalue: isLink(value) || isUndefined(value) || isVariableReference(value) ? value : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey ?? \"\"}\n\t\t\t\t\tcontrol={{ type: ControlType.Link, title }}\n\t\t\t\t\tonChange={(_controlKey, getUpdate, _nodesToUpdate) => {\n\t\t\t\t\t\tconst controlProp = getUpdate({ type: ControlType.Link, value: getLink(value) })\n\t\t\t\t\t\tconst link = getLink(controlProp.value)\n\t\t\t\t\t\tassert(!isComputedValue(link))\n\t\t\t\t\t\tonChange(link)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Enum:\n\t\t\tif (outputControl?.type !== ControlType.Enum) return null\n\t\t\tif (!EnumControlPropRow) return null\n\t\t\tassert(!isLink(value), \"Invalid value for enum control prop\")\n\t\t\treturn (\n\t\t\t\t<EnumControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrolProp={{ type: ControlType.Enum, value }}\n\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey ?? \"\"}\n\t\t\t\t\tonChange={controlProp => {\n\t\t\t\t\t\tassert(isValidPropertyValueType(ControlType.Enum, controlProp.value))\n\t\t\t\t\t\tonChange(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t\tcontrol={{ ...outputControl, title }}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tcontrolSourceIdentifier={controlReferenceInfo?.controlSourceIdentifier}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Gap: {\n\t\t\tconst gapValue = isGapControlPropValue(value) ? value : \"0px\"\n\t\t\tconst columnGap = isString(gapValue) ? getNumericColumnGapFromShorthand(gapValue) : Mixed\n\t\t\tconst rowGap = isString(gapValue) ? getNumericRowGapFromShorthand(gapValue) : Mixed\n\n\t\t\tif (!GapControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<GapControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.Gap,\n\t\t\t\t\t\tvalue: gapValue,\n\t\t\t\t\t\tcolumnGap,\n\t\t\t\t\t\trowGap,\n\t\t\t\t\t}}\n\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey ?? \"\"}\n\t\t\t\t\tcontrol={{ type: ControlType.Gap, title }}\n\t\t\t\t\tnodeIds={[]}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tonChange={(_controlKey, getUpdate) => {\n\t\t\t\t\t\tconst current: GapControlProp = {\n\t\t\t\t\t\t\ttype: ControlType.Gap,\n\t\t\t\t\t\t\tvalue: gapValue,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst controlProp = getUpdate(current)\n\t\t\t\t\t\tassert(!isComputedValue(controlProp.value))\n\t\t\t\t\t\tonChange(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t\tcase ControlType.Padding:\n\t\t\tif (!PaddingControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<PaddingControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.Padding,\n\t\t\t\t\t\tvalue: isPaddingControlPropValue(value) ? value : \"0px\",\n\t\t\t\t\t}}\n\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey ?? \"\"}\n\t\t\t\t\tcontrol={{ type: ControlType.Padding, title }}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tonChange={controlProp => {\n\t\t\t\t\t\tassert(!isComputedValue(controlProp.value))\n\t\t\t\t\t\tonChange(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.BorderRadius:\n\t\t\tif (!BorderRadiusControlPropRow) return null\n\t\t\treturn (\n\t\t\t\t<BorderRadiusControlPropRow\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tcontrolProp={{\n\t\t\t\t\t\ttype: ControlType.BorderRadius,\n\t\t\t\t\t\tvalue: isBorderRadiusControlPropValue(value) ? value : \"0px\",\n\t\t\t\t\t}}\n\t\t\t\t\tcontrolKey={controlReferenceInfo?.controlKey ?? \"\"}\n\t\t\t\t\tcontrol={{ type: ControlType.BorderRadius, title }}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tonChange={controlProp => {\n\t\t\t\t\t\tassert(!isComputedValue(controlProp.value))\n\t\t\t\t\t\tonChange(controlProp.value)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\tshouldBeNever(outputType)\n\t\t\treturn null\n\t}\n}\n\nfunction EnumOrStringCaseDivider() {\n\treturn (\n\t\t<PanelRow title=\" \" style={{ height: `calc(${dimensions.css.inputSpacing} * 2 + 1px)` }}>\n\t\t\t<div\n\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\tstyle={{ background: colors.panelDivider, height: 1, marginTop: `calc(${dimensions.css.inputSpacing} / 2)` }}\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n}\n\ninterface ConvertFromEnumProps {\n\tinputControl: ControlDescription | undefined\n\toutputControl: ControlDescription | undefined\n\ttransform: ValueTransformConvertFromEnum\n\tonChange: (transform: ValueTransformConvertFromEnum) => void\n\tcontrolReferenceInfo: ControlReferenceInfo | undefined\n}\n\nfunction ConvertFromEnumRows({\n\tinputControl,\n\toutputControl,\n\ttransform,\n\tonChange,\n\tcontrolReferenceInfo,\n}: ConvertFromEnumProps) {\n\tif (inputControl?.type !== ControlType.Enum) return null\n\n\tconst foundCaseFrom: Set<string> = new Set()\n\n\tconst allowedInputOptions: Set<string> = new Set(inputControl.options as string[])\n\n\tconst rows: JSX.Element[] = []\n\n\tconst updateCaseWithId = (id: string, update: Partial<ConvertFromEnumCase>) => {\n\t\tconst updatedCases = transform.cases.map(switchCase => {\n\t\t\treturn switchCase.id === id ? { ...switchCase, ...update } : switchCase\n\t\t})\n\t\tonChange({ ...transform, cases: updatedCases })\n\t}\n\n\tconst removeCaseWithId = (id: string) => {\n\t\tonChange({ ...transform, cases: transform.cases.filter(switchCase => switchCase.id !== id) })\n\t}\n\n\tfunction updateCaseFrom(from: string, id: string) {\n\t\tupdateCaseWithId(id, { from })\n\t}\n\n\tfunction updateCaseTo(to: ConvertFromEnumOrStringOutputValueType | VariableReference, id: string) {\n\t\tupdateCaseWithId(id, { to })\n\t}\n\n\ttransform.cases.forEach(({ from }) => foundCaseFrom.add(from))\n\n\ttransform.cases.forEach(({ id, from, to }) => {\n\t\tconst noOptionSelected = !allowedInputOptions.has(from)\n\t\trows.push(\n\t\t\t<React.Fragment key={id}>\n\t\t\t\t<EnumOrStringCaseDivider />\n\t\t\t\t<PanelRow title=\"When\" onDelete={() => removeCaseWithId(id)}>\n\t\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\ttitle={Dictionary.SelectEllipsis}\n\t\t\t\t\t\t\tenabled={false}\n\t\t\t\t\t\t\tselected={noOptionSelected}\n\t\t\t\t\t\t\tvisible={noOptionSelected}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{inputControl.options.map((inputOption: string, idx) => {\n\t\t\t\t\t\t\tconst title = inputControl.optionTitles?.[idx] ?? fallbackTitleForOption(inputOption)\n\t\t\t\t\t\t\tconst selected = from === inputOption\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\tkey={title}\n\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\tenabled={selected || !foundCaseFrom.has(inputOption)}\n\t\t\t\t\t\t\t\t\tonSelect={() => updateCaseFrom(inputOption, id)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<PopupButtonItem type=\"divider\" />\n\t\t\t\t\t\t<PopupButtonItem title={Dictionary.Remove} onSelect={() => removeCaseWithId(id)} />\n\t\t\t\t\t</PopupButton>\n\t\t\t\t</PanelRow>\n\t\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\t\toutputType={transform.outputType}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttitle=\"Set\"\n\t\t\t\t\tvalue={to}\n\t\t\t\t\tonChange={value => updateCaseTo(value, id)}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t/>\n\t\t\t</React.Fragment>,\n\t\t)\n\t})\n\n\tconst updateDefault = (defaultValue: ConvertFromEnumOrStringOutputValueType | VariableReference) => {\n\t\tonChange({ ...transform, default: defaultValue })\n\t}\n\n\tconst itemsToAdd = new Set(allowedInputOptions)\n\tfoundCaseFrom.forEach(foundFromInput => itemsToAdd.delete(foundFromInput))\n\n\tconst addCondition = () => {\n\t\tassert(itemsToAdd.size > 0)\n\t\tconst firstItemToAdd = Array.from(itemsToAdd)[0]\n\t\tassert(firstItemToAdd)\n\t\tconst newCaseOption: ConvertFromEnumCase = {\n\t\t\tid: randomID(),\n\t\t\tfrom: firstItemToAdd,\n\t\t\tto: convertFromEnumOrStringFallbackOutputValue(transform.outputType, outputControl),\n\t\t}\n\t\tconst cases = [...transform.cases, newCaseOption]\n\t\tonChange({ ...transform, cases })\n\t\twindow.blur()\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{rows}\n\t\t\t<EnumOrStringCaseDivider />\n\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\toutputType={transform.outputType}\n\t\t\t\toutputControl={outputControl}\n\t\t\t\ttitle={Dictionary.Fallback}\n\t\t\t\tvalue={transform.default}\n\t\t\t\tonChange={updateDefault}\n\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t/>\n\t\t\t{itemsToAdd.size > 0 && (\n\t\t\t\t<PanelRow title=\"\">\n\t\t\t\t\t<Button className={doubleColumnClass} onClick={addCondition}>\n\t\t\t\t\t\tAdd Condition\n\t\t\t\t\t</Button>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t</>\n\t)\n}\n\ninterface ConvertFromStringProps {\n\toutputControl: ControlDescription | undefined\n\ttransform: ValueTransformConvertFromString\n\tonChange: (transform: ValueTransformConvertFromString) => void\n\tcontrolReferenceInfo: ControlReferenceInfo | undefined\n}\n\nfunction ConvertFromStringRows({ outputControl, transform, onChange, controlReferenceInfo }: ConvertFromStringProps) {\n\tconst rows: JSX.Element[] = []\n\n\tconst updateCaseWithId = (id: string, update: Partial<ConvertFromStringCase>) => {\n\t\tconst updatedCases = transform.cases.map(switchCase => {\n\t\t\treturn switchCase.id === id ? { ...switchCase, ...update } : switchCase\n\t\t})\n\t\tonChange({ ...transform, cases: updatedCases })\n\t}\n\n\tconst removeCaseWithId = (id: string) => {\n\t\tonChange({ ...transform, cases: transform.cases.filter(switchCase => switchCase.id !== id) })\n\t}\n\n\tfunction updateCaseFrom(from: string, id: string) {\n\t\tupdateCaseWithId(id, { from })\n\t}\n\n\tfunction updateCaseTo(to: ConvertFromEnumOrStringOutputValueType | VariableReference, id: string) {\n\t\tupdateCaseWithId(id, { to })\n\t}\n\n\ttransform.cases.forEach(({ id, from, to }) => {\n\t\trows.push(\n\t\t\t<React.Fragment key={id}>\n\t\t\t\t<EnumOrStringCaseDivider />\n\t\t\t\t<PanelRow title=\"When\" onDelete={() => removeCaseWithId(id)}>\n\t\t\t\t\t<TextInput value={from} onChange={value => updateCaseFrom(value, id)} className={doubleColumnClass} />\n\t\t\t\t</PanelRow>\n\t\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\t\toutputType={transform.outputType}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttitle=\"Set\"\n\t\t\t\t\tvalue={to}\n\t\t\t\t\tonChange={value => updateCaseTo(value, id)}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t/>\n\t\t\t</React.Fragment>,\n\t\t)\n\t})\n\n\tconst updateDefault = (defaultValue: ConvertFromEnumOrStringOutputValueType | VariableReference) => {\n\t\tonChange({ ...transform, default: defaultValue })\n\t}\n\n\tconst addCondition = () => {\n\t\tconst newCaseOption: ConvertFromStringCase = {\n\t\t\tid: randomID(),\n\t\t\tfrom: \"\",\n\t\t\tto: convertFromEnumOrStringFallbackOutputValue(transform.outputType, outputControl),\n\t\t}\n\t\tconst cases = [...transform.cases, newCaseOption]\n\t\tonChange({ ...transform, cases })\n\t\twindow.blur()\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{rows}\n\t\t\t<EnumOrStringCaseDivider />\n\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\toutputType={transform.outputType}\n\t\t\t\toutputControl={outputControl}\n\t\t\t\ttitle={Dictionary.Fallback}\n\t\t\t\tvalue={transform.default}\n\t\t\t\tonChange={updateDefault}\n\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t/>\n\t\t\t<PanelRow title=\"\">\n\t\t\t\t<Button className={doubleColumnClass} onClick={addCondition}>\n\t\t\t\t\tAdd Condition\n\t\t\t\t</Button>\n\t\t\t</PanelRow>\n\t\t</>\n\t)\n}\n\ninterface ConvertFromBooleanProps {\n\toutputControl: ControlDescription | undefined\n\ttransform: ValueTransformConvertFromBoolean\n\tonChange: (transform: ValueTransformConvertFromBoolean) => void\n\tcontrolReferenceInfo: ControlReferenceInfo | undefined\n}\n\nfunction ConvertFromBooleanRows({ outputControl, transform, onChange, controlReferenceInfo }: ConvertFromBooleanProps) {\n\tconst updateTruthy = (truthy: ConvertFromBooleanOutputValueType | VariableReference) => {\n\t\tonChange({ ...transform, truthy })\n\t}\n\n\tconst updateFalsy = (falsy: ConvertFromBooleanOutputValueType | VariableReference) => {\n\t\tonChange({ ...transform, falsy })\n\t}\n\n\tconst updateFallback = (value: ConvertFromBooleanOutputValueType | VariableReference) => {\n\t\tonChange({\n\t\t\t...transform,\n\t\t\tfallback: {\n\t\t\t\t...(transform.fallback ?? {}),\n\t\t\t\tvalue,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst addFallback = () => {\n\t\tconst fallbackValue = convertFromBooleanFallbackOutputValue(transform.outputType, outputControl)\n\t\tonChange({\n\t\t\t...transform,\n\t\t\tfallback: { value: fallbackValue },\n\t\t})\n\t}\n\n\tconst removeFallback = () => {\n\t\tconst { fallback, ...next } = transform\n\t\tonChange(next)\n\t}\n\n\tconst baseName = outputControl?.title ?? Dictionary.Value\n\n\treturn (\n\t\t<>\n\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\toutputType={transform.outputType}\n\t\t\t\toutputControl={outputControl}\n\t\t\t\ttitle={`When ${Dictionary.Yes}`}\n\t\t\t\tvalue={transform.truthy}\n\t\t\t\tonChange={updateTruthy}\n\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\tdefaultVariableName={`${Dictionary.Yes} ${baseName}`}\n\t\t\t/>\n\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\toutputType={transform.outputType}\n\t\t\t\toutputControl={outputControl}\n\t\t\t\ttitle={`When ${Dictionary.No}`}\n\t\t\t\tvalue={transform.falsy}\n\t\t\t\tonChange={updateFalsy}\n\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\tdefaultVariableName={`${Dictionary.No} ${baseName}`}\n\t\t\t/>\n\t\t\t{transform.fallback ? (\n\t\t\t\t<ConvertFromEnumOrStringOutputValue\n\t\t\t\t\toutputType={transform.outputType}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\ttitle={Dictionary.Fallback}\n\t\t\t\t\tvalue={transform.fallback?.value}\n\t\t\t\t\tonChange={updateFallback}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t\tonDelete={removeFallback}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PanelRow title=\"\">\n\t\t\t\t\t<Button className={doubleColumnClass} onClick={addFallback}>\n\t\t\t\t\t\tAdd {Dictionary.Fallback}\n\t\t\t\t\t</Button>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t</>\n\t)\n}\n\ninterface DateValueRowProps {\n\ttitle: string\n\tvalue: unknown\n\tonChange: (value: string | undefined | VariableReference) => void\n\tsupportsVariables?: boolean\n\tdefaultVariableName?: string\n}\n\nfunction DateValueRow({ title, value, onChange, supportsVariables = false, defaultVariableName }: DateValueRowProps) {\n\tconst resolvedVariableName = defaultVariableName ?? title\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst initialValue = isString(value) ? value : undefined\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Date,\n\t\t\t\tname: resolvedVariableName,\n\t\t\t\tinitialValue,\n\t\t\t})\n\t\t\tif (variableRef) onChange(variableRef)\n\t\t},\n\t\t[value, onChange, resolvedVariableName],\n\t)\n\n\tconst onRemoveVariableReference = useEngineCallback(() => {\n\t\tonChange(\"\")\n\t}, [onChange])\n\n\tconst stringValue = isString(value) ? value : \"\"\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\tvariableType={ControlType.Date}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveVariableReference}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonSelectVariable={onChange}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t>\n\t\t\t{isVariableReference(value) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\texpectedType={ControlType.Date}\n\t\t\t\t\treference={value}\n\t\t\t\t\tonRemove={onRemoveVariableReference}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<DateInput className={doubleColumnClass} value={stringValue} onChange={onChange} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n", "import { truncateWithEllipsis, useReadOnly } from \"@framerjs/fresco\"\nimport type { InputVariant } from \"@framerjs/fresco/src/components/types.ts\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { useBaseEngine } from \"document/base-engine/BaseEngine.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport { isGradient } from \"document/models/Gradient.ts\"\nimport { roundedNumber } from \"library/index.ts\"\nimport { useMemo } from \"react\"\nimport { isNumber, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { PopoutButtonBackgroundPreview } from \"../PopoutButtonBackgroundPreview.tsx\"\nimport { PopoutButtonWithPreview, type PopoutButtonWithPreviewProps } from \"../PopoutButtonWithPreview.tsx\"\nimport type { ColorPickerPopoutProps } from \"./ColorPickerPopout.tsx\"\nimport { ColorPickerPopout } from \"./ColorPickerPopout.tsx\"\nimport * as styles from \"./ColorPopoutButton.styles.ts\"\nimport { colorFillDisplayValue } from \"./utils.ts\"\n\ninterface Props\n\textends\n\t\tOmit<ColorPickerPopoutProps, \"value\" | \"PopoutContent\">,\n\t\tPick<\n\t\t\tPopoutButtonWithPreviewProps,\n\t\t\t\"onDismiss\" | \"onPresent\" | \"onContextMenu\" | \"deleteTitle\" | \"onDelete\" | \"sortable\" | \"displayInPopover\"\n\t\t> {\n\tid?: string\n\tvalue: Reduced<string | Gradient | undefined>\n\tnavigationTitle?: string\n\temptyLabel?: string\n\tshowAlphaInButton?: boolean\n\tvariant?: InputVariant\n}\n\nexport function ColorPopoutButton({\n\tid,\n\tvalue,\n\tonDelete,\n\tdeleteTitle,\n\tnavigationTitle = \"Color\",\n\tdisplayInPopover,\n\tsortable,\n\temptyLabel,\n\tonDismiss,\n\tonPresent,\n\tonContextMenu,\n\tshowAlphaInButton,\n\tvariant = \"default\",\n\t...props\n}: Props) {\n\tconst engine = useBaseEngine()\n\tconst isReadOnly = useReadOnly()\n\tconst showsAddColorText = isNotFound(value) || isUndefined(value)\n\tconst { title: color, alpha } = useMemo(() => colorFillDisplayValue(value, engine, emptyLabel), [value, emptyLabel])\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tvariant={variant}\n\t\t\tid={id}\n\t\t\tenabled={!isReadOnly || !showsAddColorText}\n\t\t\ttestId=\"color-popout-button\"\n\t\t\ttitle={\n\t\t\t\t<>\n\t\t\t\t\t<span className={truncateWithEllipsis}>{color}</span>\n\t\t\t\t\t{showAlphaInButton && !isUndefined(alpha) ? getFormattedAlpha(alpha) : undefined}\n\t\t\t\t</>\n\t\t\t}\n\t\t\tnavigationTitle={navigationTitle}\n\t\t\tpopout={<ColorPickerPopout {...props} value={isGradient(value) || isString(value) ? value : \"\"} />}\n\t\t\tpreview={\n\t\t\t\t<PopoutButtonBackgroundPreview\n\t\t\t\t\tvariant={variant}\n\t\t\t\t\tbackground={getBackground(value)}\n\t\t\t\t\tdefaultBackgroundColor=\"transparent\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\tdeleteTitle={deleteTitle}\n\t\t\tonDelete={onDelete}\n\t\t\tdisplayInPopover={displayInPopover}\n\t\t\tsortable={sortable}\n\t\t\ttitleColor={isNotFound(value) || isUndefined(value) ? colors.popoutButtonTextPlaceholder : undefined}\n\t\t\tonDismiss={onDismiss}\n\t\t\tonPresent={onPresent}\n\t\t\tonContextMenu={onContextMenu}\n\t\t/>\n\t)\n}\n\nfunction getFormattedAlpha(value: number | string) {\n\tconst alphaText = isNumber(value) ? `${roundedNumber(value * 100, 0)}%` : value\n\treturn <span className={styles.innerText}>{alphaText}</span>\n}\n\nfunction getBackground(value: Props[\"value\"]): string {\n\tif (isString(value)) return value\n\tif (isGradient(value)) return value.toCSS()\n\treturn \"\"\n}\n", "import type { AssetSize } from \"@framerjs/assets\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { FillType } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport type { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport type { ImageFit } from \"library/render/types/BackgroundImage.ts\"\nimport { memo } from \"react\"\nimport type { ImageUploadResult } from \"web/pages/project/lib/UploadService.ts\"\nimport type { ColorPickerContentState } from \"../../ColorPickerPopoutTypes.ts\"\nimport type { TilingBackgroundPatternPreset } from \"../../properties/rows/FillImagePatternPresetsRow/presetOptions.ts\"\nimport type { OptionalFillImagePositionRowProps } from \"../../properties/rows/FillImagePositionRow.tsx\"\nimport type { AltTextProps } from \"../ImagePicker.tsx\"\nimport type { ColorPickerTab } from \"./ColorPickerFillTypeTabs.tsx\"\nimport { ColorPickerPopoutContent } from \"./ColorPickerPopoutContent.tsx\"\nimport { useProcessColorValue } from \"./OnPageColorPickerPopout.tsx\"\nimport { tokenPackages } from \"./tokenPackages.ts\"\n\nexport interface ColorPickerPopoutProps extends Partial<AltTextProps>, OptionalFillImagePositionRowProps {\n\tvalue: string | Gradient\n\tonChange: (value: string, gradientStopId: NodeID, final: boolean) => void\n\n\tcurrentType?: FillType\n\tonChangeColorStops?: (value: readonly GradientColorStop[]) => void\n\tonChangeFillType?: (type: FillType) => void\n\timageReferences?: Set<string>\n\tfillImageResize?: Set<ImageFit>\n\tonChangeImages?: (imageUpload: Promise<ImageUploadResult[]>) => void\n\tonRemoveImage?: () => void\n\tonChangeImageResize?: (size: ImageFit) => void\n\tonChangeAssetSize?: (size: AssetSize) => void\n\tfillImageTileSize?: Reduced<number | undefined>\n\tonChangeFillImageSize?: (fillImageTileSize: number) => void\n\tonSelectTilePatternPreset?: (pattern: TilingBackgroundPatternPreset) => void\n\n\ttrackingMetadata?: ColorPickerTrackingMetadata\n\n\ttabsToShow?: ColorPickerTab[]\n\tallowColorStyles?: boolean\n\tallowP3?: boolean\n\n\tfillGradientCSS?: string\n}\n\nexport function calculateState(): ColorPickerContentState {\n\tconst { selectionStore, documentSettingsStore, persistedUserDefaults, treeStore } = engine.stores\n\treturn {\n\t\tselection: selectionStore.ids,\n\t\tselectedGradientStopId: selectionStore.gradientStopId,\n\t\tcolorModel: persistedUserDefaults.colorModel,\n\t\ttokenPackages: tokenPackages(treeStore.tree),\n\t\tisDarkMode: documentSettingsStore.hasDarkAppearance,\n\t}\n}\n\nconst engineChangeKeys = [\n\tEngineChange.TreeStore,\n\tEngineChange.UserDefaultsStore,\n\tengine.stores.selectionStore,\n\tEngineChange.DocumentSettings,\n]\n\nexport const ColorPickerPopout = memo(function ColorPickerPopout(props: ColorPickerPopoutProps) {\n\tconst state = useEngineState(calculateState, [], engineChangeKeys)\n\tconst { value, token } = useProcessColorValue(props.value, state)\n\n\treturn <ColorPickerPopoutContent {...props} {...state} value={value} token={token} onChangeColor={props.onChange} />\n})\n\nexport interface ColorPickerTrackingMetadata {\n\tnodeType: string\n\tnodeProperty: string\n}\n", "import type { AssetSize } from \"@framerjs/assets\"\nimport { triggerColorTokenSetEvent } from \"@framerjs/framer-events\"\nimport type { PackageIdentifier } from \"@framerjs/framer-runtime\"\nimport { Scroll } from \"@framerjs/fresco\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { MetricsInteractionViews, MetricsViewContext } from \"app/metrics.ts\"\nimport { ColorPickerImage } from \"document/components/chrome/shared/ColorPicker/ColorPickerImage.tsx\"\nimport { ColorPickerInput } from \"document/components/chrome/shared/ColorPicker/ColorPickerInput.tsx\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { isColorStyleTokenNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { FillType } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { isGradientFillType } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { NotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { tokenToCSSVariable } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport { isGradient } from \"document/models/Gradient.ts\"\nimport type { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { Tools } from \"document/stores/ToolStore.ts\"\nimport type { ImageFit } from \"library/render/types/BackgroundImage.ts\"\nimport type React from \"react\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport type { ImageUploadResult } from \"web/pages/project/lib/UploadService.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport type { TilingBackgroundPatternPreset } from \"../../properties/rows/FillImagePatternPresetsRow/presetOptions.ts\"\nimport type { OptionalFillImagePositionRowProps } from \"../../properties/rows/FillImagePositionRow.tsx\"\nimport type { AltTextProps } from \"../ImagePicker.tsx\"\nimport type { ColorPickerTab } from \"./ColorPickerFillTypeTabs.tsx\"\nimport { ColorPickerFillTypeTabs } from \"./ColorPickerFillTypeTabs.tsx\"\nimport * as styles from \"./ColorPickerPopoutContent.styles.ts\"\nimport { GradientStopsSlider } from \"./GradientStopsSlider.tsx\"\nimport { getCurrentColorValue, useColorPickerCallbacks } from \"./OnPageColorPickerPopoutContent.tsx\"\nimport { ColorPickerEntityAssetTokens } from \"./tokens/ColorPickerEntityAssetTokens.tsx\"\nimport type { ColorModel, ColorPickerTokenPackages } from \"./types.ts\"\n\ninterface ColorPickerPopoutContentProps extends Partial<AltTextProps>, OptionalFillImagePositionRowProps {\n\tvalue: string | Gradient\n\t/* Optional token that takes precedent over the value for displaying color */\n\ttoken: ColorStyleTokenNode | null | undefined\n\tselection: NodeID[]\n\ttokenPackages: ColorPickerTokenPackages\n\tonChangeColor: (value: string, colorStopSelection: NodeID | undefined, final: boolean) => void\n\tonChangeColorStops?: (value: readonly GradientColorStop[]) => void\n\tcurrentType?: FillType\n\tfillImageResize?: Set<ImageFit>\n\tonChangeFillType?: (type: FillType) => void\n\timageReferences?: Set<string>\n\tonChangeImages?: (imageUpload: Promise<ImageUploadResult[]>) => void\n\tonRemoveImage?: () => void\n\tonChangeImageResize?: (size: ImageFit) => void\n\tonChangeAssetSize?: (size: AssetSize) => void\n\tcolorModel: ColorModel\n\tselectedGradientStopId: NodeID | undefined\n\ttrackingMetadata?: { nodeType: string; nodeProperty: string }\n\ttabsToShow?: ColorPickerTab[]\n\tisDarkMode: boolean\n\tallowColorStyles?: boolean\n\tfillGradientCSS?: string\n\tfillImageTileSize?: Reduced<number | undefined>\n\tonChangeFillImageSize?: (fillImageTileSize: number) => void\n\tonSelectTilePatternPreset?: (pattern: TilingBackgroundPatternPreset) => void\n\tallowP3?: boolean\n}\n\ninterface ColorPickerPopoutContentComponent {\n\t(props: ColorPickerPopoutContentProps): JSX.Element\n\tsampleColor: (() => void) | null\n}\n\nexport const ColorPickerPopoutContent: ColorPickerPopoutContentComponent = ({\n\tvalue,\n\ttoken,\n\tcolorModel,\n\tcurrentType,\n\tonChangeImages,\n\tonRemoveImage,\n\tonChangeImageResize,\n\tonChangeAssetSize,\n\tonChangeColorStops,\n\tfillImageResize,\n\timageReferences,\n\tselectedGradientStopId: colorStopSelection,\n\ttokenPackages,\n\ttabsToShow,\n\taltText = NotFound,\n\tisDarkMode,\n\tonChangeAltText,\n\tallowColorStyles = true,\n\tfillGradientCSS,\n\tfillImagePositionX,\n\tfillImagePositionY,\n\tonChangeImagePosition,\n\tonChangeFillImageSize,\n\tfillImageTileSize,\n\tonSelectTilePatternPreset,\n\tonChangeFillType,\n\tselection,\n\tonChangeColor,\n\ttrackingMetadata,\n\tallowP3,\n}: ColorPickerPopoutContentProps) => {\n\tconst [prevValue, setPrevValue] = useState<string | Gradient | null>(null)\n\tconst scrollRef = useRef<HTMLDivElement>(null)\n\n\tconst [colorForExternalColor, setColorForExternalColor] = useState<{ [key: string]: string }>({})\n\tconst [pendingExternalColor, setPendingExternalColor] = useState<string | null>(null)\n\tconst [displaySeparator, setDisplaySeparator] = useState(false)\n\tconst [lastToken, setLastToken] = useState<ColorStyleTokenNode | null>(null)\n\n\tconst imageFill = currentType === \"image\"\n\tconst isGradientFill = isGradient(value) && isGradientFillType(currentType)\n\n\tconst solidOrGradientFill = !imageFill\n\n\tconst currentColorValue = getCurrentColorValue({\n\t\tisDarkMode,\n\t\ttoken,\n\t\timageFill,\n\t\tvalue,\n\t\tcolorStopSelection,\n\t\tpendingExternalColor,\n\t\tcolorForExternalColor,\n\t\tsetPendingExternalColor,\n\t})\n\n\tconst showTokens = allowColorStyles || token\n\tconst currentTab = useMemo((): ColorPickerTab | null => {\n\t\tif (!onChangeFillType || !currentType) return null\n\n\t\tswitch (currentType) {\n\t\t\tcase \"color\":\n\t\t\t\treturn \"solid\"\n\t\t\tcase \"image\":\n\t\t\t\treturn \"image\"\n\t\t\tcase \"linear-gradient\":\n\t\t\t\treturn \"linear\"\n\t\t\tcase \"radial-gradient\":\n\t\t\t\treturn \"radial\"\n\t\t\tcase \"conic-gradient\":\n\t\t\t\treturn \"conic\"\n\t\t\tdefault:\n\t\t\t\tassertNever(currentType)\n\t\t}\n\t}, [onChangeFillType, currentType])\n\n\tconst onChangeTab = useCallback(\n\t\t(tab: ColorPickerTab) => {\n\t\t\tif (!onChangeFillType || !onChangeColorStops) return\n\n\t\t\tonChangeFillType(fillTypeForTab(tab))\n\t\t},\n\t\t[onChangeFillType, onChangeColorStops],\n\t)\n\n\tconst onScroll = useCallback((event: React.UIEvent) => {\n\t\tconst scrollTop = (event.target as HTMLDivElement).scrollTop\n\t\tsetDisplaySeparator(scrollTop > 0)\n\t}, [])\n\n\tconst { handleChangeColor, handleSampleColor } = useColorPickerCallbacks({\n\t\tisDarkMode,\n\t\tonChangeColor,\n\t\tselection,\n\t\tcolorStopSelection,\n\t\tsetColorForExternalColor,\n\t\tsetPendingExternalColor,\n\t})\n\n\tconst onSelectToken = useCallback(\n\t\t(token: ColorStyleTokenNode, packageIdentifier?: PackageIdentifier) => {\n\t\t\tconst tokenVariable = tokenToCSSVariable(token, { packageIdentifier })\n\t\t\thandleChangeColor(tokenVariable)\n\n\t\t\tconst localPackageIdentifier = engine.componentLoader.localPackageIdentifier()\n\t\t\tconst selectedPackage = tokenPackages[packageIdentifier || localPackageIdentifier]\n\t\t\ttriggerColorTokenSetEvent({\n\t\t\t\ttokenId: token.id,\n\t\t\t\tpackageName: selectedPackage?.isLocal === false ? selectedPackage.packageIdentifier : undefined,\n\t\t\t\ttotalTokenCount: selectedPackage?.tokensCount,\n\t\t\t\t...trackingMetadata,\n\t\t\t})\n\t\t},\n\t\t[handleChangeColor, tokenPackages, trackingMetadata],\n\t)\n\n\tif (!equalColorTokenValues(token, lastToken)) {\n\t\tsetLastToken(token || null)\n\t}\n\n\tuseEffect(() => {\n\t\t// FIXME: We need this because on DocumentActionTarget we call sampleColor in case the picker is opened.\n\t\t// This is a hack to get the sampleColor function to be available on the component.\n\t\t// We should find a better way to do this using modern react patterns.\n\t\tColorPickerPopoutContent.sampleColor = handleSampleColor\n\n\t\treturn () => {\n\t\t\tColorPickerPopoutContent.sampleColor = null\n\t\t}\n\t}, [])\n\n\tconst newValueIsGradient = isGradient(value)\n\tconst prevValueIsGradient = isGradient(prevValue)\n\n\tif (newValueIsGradient && !prevValueIsGradient) {\n\t\tenableGradientTool()\n\t}\n\n\t// Update the previousValue for the next render\n\tif (value !== prevValue) {\n\t\tsetPrevValue(value)\n\t}\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (engine.stores.toolStore.tool === Tools.FillGradient) {\n\t\t\t\tenableGradientTool(false)\n\t\t\t}\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<MetricsViewContext.Provider value={MetricsInteractionViews.COLOR_PICKER}>\n\t\t\t<div className={cx(styles.container, !showTokens && !imageFill && styles.containerPadding)}>\n\t\t\t\t{currentTab && (\n\t\t\t\t\t<ColorPickerFillTypeTabs\n\t\t\t\t\t\ttabsToShow={tabsToShow}\n\t\t\t\t\t\tcurrentTab={currentTab}\n\t\t\t\t\t\tonChangeTab={onChangeTab}\n\t\t\t\t\t\tdisplaySeparator={displaySeparator && !token}\n\t\t\t\t\t\tclassName={styles.colorPickerFillTypeTabs}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<Scroll onScroll={onScroll} ref={scrollRef} className={styles.scroll}>\n\t\t\t\t\t<div className={styles.scrollContentWrapper}>\n\t\t\t\t\t\t{isGradientFill && onChangeColorStops && (\n\t\t\t\t\t\t\t<GradientStopsSlider\n\t\t\t\t\t\t\t\tgradient={value}\n\t\t\t\t\t\t\t\tfillGradientCSS={fillGradientCSS}\n\t\t\t\t\t\t\t\tonChangeColorStops={onChangeColorStops}\n\t\t\t\t\t\t\t\tisDarkMode={isDarkMode}\n\t\t\t\t\t\t\t\tgradientToolType={Tools.FillGradient}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{solidOrGradientFill && (\n\t\t\t\t\t\t\t<div className={styles.colorPickerInputWrapper}>\n\t\t\t\t\t\t\t\t<ColorPickerInput\n\t\t\t\t\t\t\t\t\tengine={engine}\n\t\t\t\t\t\t\t\t\tonChange={handleChangeColor}\n\t\t\t\t\t\t\t\t\tcolor={currentColorValue}\n\t\t\t\t\t\t\t\t\tcolorModel={colorModel}\n\t\t\t\t\t\t\t\t\tclassName={styles.colorPickerInput}\n\t\t\t\t\t\t\t\t\tsampleColor={handleSampleColor}\n\t\t\t\t\t\t\t\t\tallowP3={allowP3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{currentTab !== \"image\" && showTokens && (\n\t\t\t\t\t\t\t<ColorPickerEntityAssetTokens\n\t\t\t\t\t\t\t\tcurrentColorValue={currentColorValue}\n\t\t\t\t\t\t\t\tcolorModel={colorModel}\n\t\t\t\t\t\t\t\tselectedId={token ? token.id : null}\n\t\t\t\t\t\t\t\tonSelect={onSelectToken}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{imageFill && onChangeImages && imageReferences && (\n\t\t\t\t\t\t\t<ColorPickerImage\n\t\t\t\t\t\t\t\timageReferences={imageReferences}\n\t\t\t\t\t\t\t\tfillImageResize={fillImageResize}\n\t\t\t\t\t\t\t\tonChangeImages={onChangeImages}\n\t\t\t\t\t\t\t\tonRemoveImage={onRemoveImage}\n\t\t\t\t\t\t\t\tonChangeImageResize={onChangeImageResize}\n\t\t\t\t\t\t\t\tonChangeAssetSize={onChangeAssetSize}\n\t\t\t\t\t\t\t\taltText={altText}\n\t\t\t\t\t\t\t\tonChangeAltText={onChangeAltText}\n\t\t\t\t\t\t\t\tfillImagePositionX={fillImagePositionX}\n\t\t\t\t\t\t\t\tfillImagePositionY={fillImagePositionY}\n\t\t\t\t\t\t\t\tonChangeImagePosition={onChangeImagePosition}\n\t\t\t\t\t\t\t\tfillImageTileSize={fillImageTileSize}\n\t\t\t\t\t\t\t\tonChangeFillImageSize={onChangeFillImageSize}\n\t\t\t\t\t\t\t\tonSelectTilePatternPreset={onSelectTilePatternPreset}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</Scroll>\n\t\t\t</div>\n\t\t</MetricsViewContext.Provider>\n\t)\n}\n\nColorPickerPopoutContent.sampleColor = null\n\nfunction fillTypeForTab(tab: ColorPickerTab): FillType {\n\tswitch (tab) {\n\t\tcase \"image\":\n\t\t\treturn \"image\"\n\t\tcase \"solid\":\n\t\t\treturn \"color\"\n\t\tcase \"linear\":\n\t\t\treturn \"linear-gradient\"\n\t\tcase \"radial\":\n\t\t\treturn \"radial-gradient\"\n\t\tcase \"conic\":\n\t\t\treturn \"conic-gradient\"\n\t\tdefault:\n\t\t\tassertNever(tab)\n\t}\n}\n\nfunction enableGradientTool(enabled = true) {\n\tif (getIsViewOnly(engine, \"canDesign\")) return\n\tsetTimeout(\n\t\tengine.scheduler.wrapHandler(() => {\n\t\t\tenabled ? engine.setTool(Tools.FillGradient) : engine.exitTool()\n\t\t}),\n\t\t0,\n\t)\n}\nfunction equalColorTokenValues(a: ColorStyleTokenNode | undefined | null, b: ColorStyleTokenNode | undefined | null) {\n\tif (isColorStyleTokenNode(a) && isColorStyleTokenNode(b) && a.id === b.id) return true\n\treturn !a && !b\n}\n", "import { SegmentedControl, SegmentedControlItem } from \"@framerjs/fresco\"\nimport { MetricsViewContext } from \"app/metrics.ts\"\nimport React from \"react\"\nimport {\n\tIconConicGradient,\n\tIconImage,\n\tIconLinearGradient,\n\tIconRadialGradient,\n\tIconSolidColor,\n} from \"./icons/TabIcons.tsx\"\n\ninterface Props {\n\ttabsToShow?: ColorPickerTab[]\n\tcurrentTab: ColorPickerTab\n\tonChangeTab: (tab: ColorPickerTab) => void\n\tdisplaySeparator: boolean\n\tclassName?: string\n}\n\nexport type ColorPickerTab = \"solid\" | \"linear\" | \"radial\" | \"conic\" | \"image\"\n\nconst tabDetails = {\n\tsolid: {\n\t\ttitle: \"Solid\",\n\t\tmetricId: \"select-solid\",\n\t\tIcon: IconSolidColor,\n\t},\n\tlinear: {\n\t\ttitle: \"Linear Gradient\",\n\t\tmetricId: \"select-linear-gradient\",\n\t\tIcon: IconLinearGradient,\n\t},\n\tradial: {\n\t\ttitle: \"Radial Gradient\",\n\t\tmetricId: \"select-radial-gradient\",\n\t\tIcon: IconRadialGradient,\n\t},\n\tconic: {\n\t\ttitle: \"Conic Gradient\",\n\t\tmetricId: \"select-conic-gradient\",\n\t\tIcon: IconConicGradient,\n\t},\n\timage: {\n\t\ttitle: \"Image\",\n\t\tmetricId: \"select-image\",\n\t\tIcon: IconImage,\n\t},\n}\nconst allColorPickerFillTypeTabs: ColorPickerTab[] = [\"solid\", \"linear\", \"radial\", \"conic\", \"image\"]\nexport const colorPickerFillTypeTabsWithoutSolid: ColorPickerTab[] = allColorPickerFillTypeTabs.filter(\n\ttab => tab !== \"solid\",\n)\nexport const colorPickerFillTypeTabsWithoutConic: ColorPickerTab[] = allColorPickerFillTypeTabs.filter(\n\ttab => tab !== \"conic\",\n)\nexport const colorPickerFillTypeTabsWithoutImage: ColorPickerTab[] = allColorPickerFillTypeTabs.filter(\n\ttab => tab !== \"image\",\n)\nexport const colorPickerFillTypeTabsWithoutImageAndConic: ColorPickerTab[] = allColorPickerFillTypeTabs.filter(\n\ttab => tab !== \"image\" && tab !== \"conic\",\n)\n\nexport function ColorPickerFillTypeTabs({ tabsToShow, currentTab, onChangeTab, className }: Props) {\n\tconst tabs = tabsToShow ?? allColorPickerFillTypeTabs\n\n\tconst activeIndex = tabs.indexOf(currentTab)\n\tconst metricsView = React.useContext(MetricsViewContext)\n\n\treturn (\n\t\t<SegmentedControl className={className}>\n\t\t\t{tabs.map((tab, idx) => {\n\t\t\t\tconst isSelected = activeIndex === idx\n\t\t\t\tconst { title, metricId, Icon } = tabDetails[tab]\n\n\t\t\t\treturn (\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tkey={tab}\n\t\t\t\t\t\ttitle={title} /* tooltips */\n\t\t\t\t\t\tselected={isSelected}\n\t\t\t\t\t\tidentifier={tab}\n\t\t\t\t\t\tonSelect={onChangeTab}\n\t\t\t\t\t\tdata-metric-id={metricId}\n\t\t\t\t\t\tdata-metric-view={metricsView}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon active={isSelected} />\n\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t)\n\t\t\t})}\n\t\t</SegmentedControl>\n\t)\n}\n", "import \"TabIcons.styles_10ywfat.wyw.css\"; export const base = \"base_bq1h51l\";\nexport const active = \"active_asnykz2\";\nexport const solid = \"solid_s56bw4h\";\nexport const linear = \"linear_lm3d7jc\";\nexport const radial = \"radial_r1wh2mpa\";\nexport const conic = \"conic_c1vmm7iq\";\nexport const image = \"image_ipjema9\";", "import { cx } from \"@linaria/core\"\nimport * as styles from \"./TabIcons.styles.ts\"\n\ninterface Props {\n\tactive: boolean\n}\nexport function IconSolidColor({ active }: Props) {\n\treturn <div className={cx(styles.base, styles.solid, active && styles.active)} />\n}\nexport function IconLinearGradient({ active }: Props) {\n\treturn <div className={cx(styles.base, styles.linear, active && styles.active)} />\n}\nexport function IconRadialGradient({ active }: Props) {\n\treturn <div className={cx(styles.base, styles.radial, active && styles.active)} />\n}\nexport function IconConicGradient({ active }: Props) {\n\treturn <div className={cx(styles.base, styles.conic, active && styles.active)} />\n}\nexport function IconImage({ active }: Props) {\n\treturn (\n\t\t<div className={cx(styles.base, styles.image, active && styles.active)}>\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\">\n\t\t\t\t<g>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id=\"idXACGLl3Hjg1140397100\" gradientTransform=\"rotate(90, 0.5, 0.5)\">\n\t\t\t\t\t\t\t<stop offset=\"0.2\" stopColor=\"currentColor\" stopOpacity=\"1\"></stop>\n\t\t\t\t\t\t\t<stop offset=\"1\" stopColor=\"rgba(255, 255, 255, 0)\" stopOpacity=\"0\"></stop>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 2.293 6.207 C 2.683 5.817 3.317 5.817 3.707 6.207 L 8.805 11.305 C 7.969 11.748 7.015 11.999 6.003 12 L 5.997 12 C 3.429 11.999 1.239 10.385 0.384 8.116 Z\"\n\t\t\t\t\t\tfill=\"url(#idXACGLl3Hjg1140397100)\"\n\t\t\t\t\t></path>\n\t\t\t\t</g>\n\t\t\t\t<path\n\t\t\t\t\td=\"M 7.5 2 C 8.328 2 9 2.672 9 3.5 C 9 4.328 8.328 5 7.5 5 C 6.672 5 6 4.328 6 3.5 C 6 2.672 6.672 2 7.5 2 Z\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t</div>\n\t)\n}\n", "import { ReadOnlyContext } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport {\n\tinterpolateColorAtPosition,\n\tresolveGradientStopColors,\n\tsortGradientStopsInPlace,\n} from \"document/components/tools/gradient/utils.ts\"\nimport engine from \"document/engine.ts\"\nimport { convertMaskGradientToTheme } from \"document/models/CanvasTree/traits/WithMasks.ts\"\nimport type { Gradient, GradientTool } from \"document/models/Gradient.ts\"\nimport { LinearGradient } from \"document/models/Gradient.ts\"\nimport { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { Tools } from \"document/stores/ToolEnum.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport type { PanInfo } from \"framer-motion\"\nimport { motion, useDragControls, useMotionValue } from \"framer-motion\"\nimport React from \"react\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { useSubscribeToFillValue } from \"../../properties/utils/useSubscribeToFillValue.ts\"\nimport { checkerboard8 } from \"../CheckerboardURLs/index.ts\"\nimport * as styles from \"./GradientStopsSlider.styles.ts\"\n\ninterface Props {\n\tgradient: Gradient\n\tisDarkMode: boolean\n\tgradientToolType: GradientTool\n\t// Not used, but triggers a rerender when the value of the gradient changes.\n\tfillGradientCSS?: string\n\tonChangeColorStops: (value: readonly GradientColorStop[]) => void\n\twithDivider?: boolean\n}\n\n// @TODO: the UI is fairly similar to the hue/alpha slider, consider reusing the styles.\nexport const GradientStopsSlider = React.memo(\n\t({ gradient, onChangeColorStops, isDarkMode, gradientToolType, withDivider = true }: Props) => {\n\t\tconst gradientRef = React.useRef<HTMLDivElement>(null)\n\t\tconst [dragging, setDragging] = React.useState(false)\n\t\tconst [showPlaceholder, setShowPlaceholder] = React.useState(false)\n\t\tconst { selectionStore } = engine.stores\n\t\tconst selectedStopId = selectionStore.useState(state => state.gradientStopId)\n\t\tconst x = useMotionValue(0)\n\n\t\tconst { pendingDragId, pendingEvent, prepareDelayedDrag, clearPendingDrag } = usePendingDrag()\n\n\t\tconst themedGradient = useDeprecatedEngineState(\n\t\t\tEngineChange.ColorStyleTokens,\n\t\t\t() => {\n\t\t\t\tif (gradientToolType === Tools.MaskGradient) {\n\t\t\t\t\tconst { stops } = convertMaskGradientToTheme(gradient, isDarkMode)\n\t\t\t\t\treturn new LinearGradient({ stops })\n\t\t\t\t}\n\n\t\t\t\treturn gradient\n\t\t\t},\n\t\t\t[gradient, isDarkMode],\n\t\t)\n\n\t\t// Update the css when the editor theme, or any tokens, are updated.\n\t\t// Otherwise the gradient preview can get out of sync.\n\t\tconst sliderBackgroundCSS = useDeprecatedEngineState(\n\t\t\tEngineChange.ColorStyleTokens,\n\t\t\t() =>\n\t\t\t\tnew LinearGradient({\n\t\t\t\t\tstops: resolveGradientStopColors(engine.tree, themedGradient.stops, isDarkMode),\n\t\t\t\t}).toCSS(90),\n\t\t\t[themedGradient, isDarkMode],\n\t\t)\n\n\t\tconst handleAddStop = useEngineCallback(\n\t\t\t(e: React.PointerEvent) => {\n\t\t\t\tif (!(e.nativeEvent.target instanceof Element) || e.nativeEvent.target.getAttribute(\"data-stop\") || dragging) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tsetShowPlaceholder(false)\n\n\t\t\t\tconst width = gradientRef.current?.clientWidth\n\t\t\t\tif (!width) return\n\n\t\t\t\tconst position = (e.nativeEvent.offsetX - styles.knobRadius) / (width - styles.knobRadius * 2)\n\n\t\t\t\tconst newStop = new GradientColorStop({\n\t\t\t\t\tposition,\n\t\t\t\t\tvalue: interpolateColorAtPosition(engine.tree, gradient.stops, position, isDarkMode),\n\t\t\t\t})\n\n\t\t\t\tconst nextStops = sortGradientStopsInPlace([...gradient.stops, newStop])\n\t\t\t\tonChangeColorStops(nextStops)\n\n\t\t\t\tselectionStore.gradientStopId = newStop.id\n\n\t\t\t\t// Prepare for immediate dragging\n\t\t\t\tprepareDelayedDrag(newStop.id, e)\n\t\t\t},\n\t\t\t[gradient, onChangeColorStops, dragging, isDarkMode, prepareDelayedDrag],\n\t\t)\n\n\t\tconst updateGradientStopPosition = React.useCallback(\n\t\t\t(stop: GradientColorStop) => {\n\t\t\t\treturn ({ shiftKey }: PointerEvent, info: PanInfo) => {\n\t\t\t\t\tconst width = gradientRef.current?.clientWidth\n\t\t\t\t\tif (isUndefined(width)) return\n\n\t\t\t\t\tconst rect = gradientRef.current?.getBoundingClientRect()\n\n\t\t\t\t\tif (!rect) return\n\n\t\t\t\t\tconst pointX = info.point.x\n\t\t\t\t\tconst relativeX = pointX - rect.left - styles.knobRadius\n\n\t\t\t\t\tlet position = relativeX / (width - styles.knobRadius * 2)\n\t\t\t\t\tposition = Math.max(0, Math.min(1, position))\n\n\t\t\t\t\tif (shiftKey) position = Math.round(position / 0.05) * 0.05\n\n\t\t\t\t\tconst index = gradient.stops.findIndex(s => s === stop)\n\t\t\t\t\tconst nextStops = [...gradient.stops]\n\t\t\t\t\tnextStops.splice(index, 1, stop.merge({ position }))\n\t\t\t\t\tonChangeColorStops(sortGradientStopsInPlace(nextStops))\n\t\t\t\t}\n\t\t\t},\n\t\t\t[gradient.stops, onChangeColorStops],\n\t\t)\n\n\t\tconst dragStart = useEngineCallback((stop: GradientColorStop) => {\n\t\t\tsetDragging(true)\n\t\t\tselectionStore.gradientStopId = stop.id\n\t\t\tengine.beginUndoGroup()\n\t\t}, [])\n\n\t\tconst dragEnd = useEngineCallback(() => {\n\t\t\tsetDragging(false)\n\t\t\tengine.endUndoGroup()\n\t\t\tclearPendingDrag()\n\t\t}, [clearPendingDrag])\n\n\t\tconst handleMouseMove = React.useCallback(\n\t\t\t(event: React.MouseEvent) => {\n\t\t\t\tif (\n\t\t\t\t\t!(event.nativeEvent.target instanceof Element) ||\n\t\t\t\t\tevent.nativeEvent.target.getAttribute(\"data-stop\") ||\n\t\t\t\t\tdragging\n\t\t\t\t) {\n\t\t\t\t\tsetShowPlaceholder(false)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Offset the knob by the radius to center it.\n\t\t\t\tx.set(event.nativeEvent.offsetX - styles.knobRadius)\n\t\t\t\tsetShowPlaceholder(true)\n\t\t\t},\n\t\t\t[dragging, x],\n\t\t)\n\t\treturn (\n\t\t\t<ReadOnlyContext.Consumer>\n\t\t\t\t{isReadOnly => (\n\t\t\t\t\t<div className={cx(styles.container, withDivider ? styles.containerWithDivider : undefined)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={styles.addStopSafeArea}\n\t\t\t\t\t\t\tonMouseMove={isReadOnly ? undefined : handleMouseMove}\n\t\t\t\t\t\t\tonMouseEnter={isReadOnly ? undefined : handleMouseMove}\n\t\t\t\t\t\t\tonPointerDown={isReadOnly ? undefined : handleAddStop}\n\t\t\t\t\t\t\tstyle={{ touchAction: \"none\" }} // Necessary in order to support touch screens\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tref={gradientRef}\n\t\t\t\t\t\t\t\tclassName={styles.gradient}\n\t\t\t\t\t\t\t\tstyle={{ backgroundImage: `${sliderBackgroundCSS}, url(${checkerboard8})` }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tclassName={styles.stopPlaceholder}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\t\t\t\tvisibility: !isReadOnly && showPlaceholder && !dragging ? undefined : \"hidden\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransformTemplate={transformTemplate}\n\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t{gradient.stops.map((stop, index) => {\n\t\t\t\t\t\t\t\t\tconst selected = selectedStopId === stop.id\n\t\t\t\t\t\t\t\t\tconst isPendingDrag = pendingDragId === stop.id\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<GradientStop\n\t\t\t\t\t\t\t\t\t\t\tkey={stop.id}\n\t\t\t\t\t\t\t\t\t\t\tisReadOnly={isReadOnly}\n\t\t\t\t\t\t\t\t\t\t\tstop={themedGradient.stops[index] ?? stop}\n\t\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\t\tonDragStart={isReadOnly ? undefined : dragStart}\n\t\t\t\t\t\t\t\t\t\t\tonDrag={isReadOnly ? undefined : updateGradientStopPosition(stop)}\n\t\t\t\t\t\t\t\t\t\t\tonDragEnd={isReadOnly ? undefined : dragEnd}\n\t\t\t\t\t\t\t\t\t\t\tisPendingDrag={isPendingDrag}\n\t\t\t\t\t\t\t\t\t\t\tpendingEvent={isPendingDrag ? pendingEvent : null}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</ReadOnlyContext.Consumer>\n\t\t)\n\t},\n)\n\nconst selectStop = engine.scheduler.wrapHandler((stop: GradientColorStop) => {\n\tengine.stores.selectionStore.gradientStopId = stop.id\n})\n\nconst GradientStop = ({\n\tisReadOnly,\n\tstop,\n\tselected,\n\tonDragStart,\n\tonDragEnd,\n\tonDrag,\n\tisPendingDrag,\n\tpendingEvent,\n}: {\n\tisReadOnly: boolean\n\tstop: GradientColorStop\n\tselected: boolean\n\tonDragStart?: (stop: GradientColorStop) => void\n\tonDragEnd?: () => void\n\tonDrag?: (event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => void\n\tisPendingDrag?: boolean\n\tpendingEvent?: React.PointerEvent | null\n}) => {\n\tconst ref = React.useRef<HTMLButtonElement | null>(null)\n\tconst dragControls = useDragControls()\n\n\t// On mount, auto focus on the element if it is the selected knob.\n\tReact.useEffect(() => {\n\t\tif (!selected) return\n\t\tref.current?.focus()\n\t}, [selected])\n\n\t// Effect to handle pending drag initiations\n\tReact.useEffect(() => {\n\t\tif (isPendingDrag && pendingEvent && ref.current) {\n\t\t\tdragControls.start(pendingEvent)\n\t\t}\n\t}, [isPendingDrag, pendingEvent, dragControls])\n\n\tconst { value } = useSubscribeToFillValue(stop.value) ?? stop\n\n\treturn (\n\t\t<motion.button\n\t\t\tref={ref}\n\t\t\tdrag={isReadOnly ? false : \"x\"}\n\t\t\tdata-stop={stop.id}\n\t\t\ttabIndex={0}\n\t\t\tonMouseDown={() => selectStop(stop)}\n\t\t\tdragMomentum={false}\n\t\t\tdragElastic={false}\n\t\t\tdragConstraints={{ top: 0, left: 0, right: 0, bottom: 0 }}\n\t\t\tonDragStart={() => onDragStart?.(stop)}\n\t\t\tonDragEnd={onDragEnd}\n\t\t\tonDrag={onDrag}\n\t\t\tdragControls={dragControls}\n\t\t\tkey={stop.id}\n\t\t\ttransformTemplate={transformTemplate}\n\t\t\tclassName={cx(styles.gradientStop, styles.stopIndicatorSafeArea, selected && styles.selectedStop)}\n\t\t\tstyle={indicatorStyle(stop.position, value)}\n\t\t/>\n\t)\n}\n\nfunction usePendingDrag() {\n\tconst [pendingDragId, setPendingDragId] = React.useState<string | null>(null)\n\tconst pendingEventRef = React.useRef<React.PointerEvent | null>(null)\n\n\tconst prepareDelayedDrag = React.useCallback((stopId: string, e: React.PointerEvent) => {\n\t\tpendingEventRef.current = e\n\t\tsetPendingDragId(stopId)\n\t}, [])\n\n\tconst clearPendingDrag = React.useCallback(() => {\n\t\tsetPendingDragId(null)\n\t\tpendingEventRef.current = null\n\t}, [])\n\n\treturn {\n\t\tpendingDragId,\n\t\tpendingEvent: pendingEventRef.current,\n\t\tprepareDelayedDrag,\n\t\tclearPendingDrag,\n\t}\n}\n\nfunction indicatorStyle(x: number, value: string): React.CSSProperties & Record<string, unknown> {\n\t// Clamping the left position of the knobs because we never want the center\n\t// point to reach the end of the gradient bar, we want a bit of offset so\n\t// the inner circle of the knob will align nicely with the radius of the\n\t// bar.\n\treturn {\n\t\tleft: `clamp(${styles.knobRadius}px, ${x * 100}%, calc(100% - ${styles.knobRadius}px))`,\n\t\ttop: `50%`,\n\t\t\"--value\": value,\n\t}\n}\n\n/** A transform template to use instead of defining one inline each time we rerender. Saves a bit of\n * performance. But also makes sure we don't give away a closure that retains memory reference for\n * potentially a long time. */\nfunction transformTemplate(_: unknown, t: string) {\n\treturn `translateX(-50%) translateY(-50%) ${t}`\n}\n", "import \"GradientStopsSlider.styles_15vt450.wyw.css\"; export const stopPlaceholder = \"stopPlaceholder_s111g3ts\";\nexport const container = \"container_c1lu6b7z\";\nexport const containerWithDivider = \"containerWithDivider_c1sy8udy\";\nexport const addStopSafeArea = \"addStopSafeArea_a18zwbqs\";\nexport const gradient = \"gradient_g1dt60af\";\nexport const gradientStop = \"gradientStop_gdfuksn\";\nexport const knobRadius = 4;\nexport const stopIndicatorSafeArea = \"stopIndicatorSafeArea_szuqtwn\";\nexport const selectedStop = \"selectedStop_s1758a38\";", "import {\n\tIconAssetsCodeFile,\n\tIconCodeBlock,\n\tIconEntityFolder,\n\tIconImageStylePreset,\n\tIconLayerComponent,\n\tIconLayerVector,\n\tIconLayoutTemplate,\n\tIconSidebarCollection,\n\tIconTableStylePreset,\n\tIconVideo,\n\tuseReadOnly,\n} from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { ModuleType, assert, assertNever, emptyArray } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments, useExperimentIsOn } from \"app/experiments.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { editInfoForCodeComponentIdentifier } from \"document/components/utils/editActionForCodeComponent.ts\"\nimport engine from \"document/engine.ts\"\nimport { CodeComponentNode, type NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { EntityTypeRootId } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport {\n\tAB_TESTS_ENTITY_TYPE_ROOT_ID,\n\tBLOCKQUOTE_ENTITY_ROOT_ID,\n\tCMS_ENTITY_ROOT_ID,\n\tCODE_FILE_ENTITY_TYPE_ROOT_ID,\n\tCOLOR_ENTITY_ROOT_ID,\n\tCOMPONENTS_ENTITY_TYPE_ROOT_ID,\n\tCONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID,\n\tFUNNELS_ENTITY_TYPE_ROOT_ID,\n\tINLINE_CODE_ENTITY_ROOT_ID,\n\tLAYOUT_TEMPLATE_ENTITY_ROOT_ID,\n\tLINK_ENTITY_ROOT_ID,\n\tTEXT_ENTITY_ROOT_ID,\n\tVECTOR_SET_ENTITY_TYPE_ROOT_ID,\n\tisEntityTypeRootNodeId,\n} from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { buildReferenceNodeId } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport {\n\tisFunnelNode,\n\tisTextStylePresetPrimaryNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { type ReactNode, forwardRef, memo, useCallback, useContext, useLayoutEffect, useRef, useState } from \"react\"\nimport { scrollIntoView } from \"utils/scroll-into-view-if-needed/index.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../QuickActions/types.ts\"\nimport { IconAgentCMS } from \"../agentPanel/components/IconAgentCMS.tsx\"\nimport { IconAgentCode } from \"../agentPanel/components/IconAgentCode.tsx\"\nimport { IconAgentComponent } from \"../agentPanel/components/IconAgentComponent.tsx\"\nimport { IconAgentHome } from \"../agentPanel/components/IconAgentHome.tsx\"\nimport { IconAgentPage } from \"../agentPanel/components/IconAgentPage.tsx\"\nimport { IconAgentVectorSet } from \"../agentPanel/components/IconAgentVectorSet.tsx\"\nimport { IconAgentVideo } from \"../agentPanel/components/IconAgentVideo.tsx\"\nimport { IconABTest, IconAgentFunnel, IconFunnel } from \"../analytics/icons.tsx\"\nimport { IconAgentLayerImage } from \"../layers/AgentLayerIcons.tsx\"\nimport { IconAgentLayerGrid } from \"../layers/IconAgentLayerGrid.tsx\"\nimport { PresetIcon } from \"../presetsPanel/PresetIcon.tsx\"\nimport { getAssetStylePopoutId } from \"../properties/rows/StyleAssetRow.tsx\"\nimport type { ContextMenuOptions } from \"../properties/utils/presetRowProps.ts\"\nimport { CollapsibleRow } from \"../shared/CollapsibleRow.tsx\"\nimport { ColorTokenPreview } from \"../shared/ColorPicker/tokens/ColorPickerTokenRowPreview.tsx\"\nimport { PopoutButton, usePopoutContent } from \"../shared/PopoutButton.tsx\"\nimport { PopoutContext } from \"../shared/PopoutContext.ts\"\nimport { getModuleContextMenuItems as getModuleContextMenuItemsInner } from \"../shared/utils/getComponentContextMenuItems.ts\"\nimport { selectedSibling } from \"../shared/utils/panelMultiSelect.styles.ts\"\nimport { isMultiSelectModifierKeyPressed } from \"../shared/utils/panelMultiSelect.ts\"\nimport { DraggableAssetRow } from \"./DraggableEntityItem.tsx\"\nimport * as styles from \"./EntityAssetRow.styles.ts\"\nimport { FOLDER_COLOR, INTERACTION_BORDER_COLOR } from \"./EntityAssetRow.styles.ts\"\nimport { IconAgentAssetLayoutTemplate } from \"./IconAgentAssetLayoutTemplate.tsx\"\nimport { insertCanvasNode } from \"./actions/insertCanvasNode.ts\"\nimport { renameEntity, renameEntityFolderNode, renameEntityReferenceNode } from \"./actions/rename.ts\"\nimport { getEntityInputId, referenceUnreferencedNodesByTypeRoot } from \"./actions/utils.ts\"\nimport type {\n\tCreateContextMenuItemsHandler,\n\tEntityAssetEditReferenceButton,\n\tEntityAssetReferencePopoutContent,\n} from \"./types.ts\"\nimport { buildEntityAssetFolderMenuItems } from \"./utils/buildEntityItemMenuItems.ts\"\nimport type { AssetRowComponentType } from \"./utils/getComponentType.ts\"\nimport type { ModuleInfo } from \"./utils/getExportedModulesMap.ts\"\n\n/**\n * Action types for entity row lifecycle events.\n * Currently supports \"rename\" which is triggered by inline editing.\n * Note: Delete/duplicate actions are handled via context menus (referenceCreateContextMenuItems)\n * and should be tracked in those menu click handlers instead.\n */\ntype EntityAction = \"rename\"\n\n/** Callback for entity lifecycle events. Consumers can use this for analytics tracking. */\nexport type EntityActionCallback = (action: EntityAction, id: NodeID, metadata?: Record<string, unknown>) => void\n\nexport interface EntityAssetRowBaseProps {\n\tid: NodeID\n\tdepth: number\n\t/* This is useful for actions that can affect the position of referenced and unreferenced nodes in the list (rename, drag and drop). */\n\thasAnyNonReferencedNodeSibling: boolean\n\ttypeRootId: EntityTypeRootId\n\treferenceCreateContextMenuItems?: CreateContextMenuItemsHandler\n\t/* Due to entity rows in node panel pop-outs also using these components, selectedIds needs to remain optional. */\n\tselectedIds?: ReadonlySet<NodeID> | undefined\n\tgetOrderedIds?: (selectedIds: ReadonlySet<NodeID>) => NodeID[]\n\t// Used to keep track of the type root selections were made on in order to allow for making distinctions between\n\t// asset rows that might share the same id. E.g. smart components derived from code files.\n\tlastSelectionTypeRootId?: EntityTypeRootId | null\n\t/** Optional callback for entity lifecycle events (e.g., for analytics tracking) */\n\tonEntityAction?: EntityActionCallback\n}\n\nexport interface EntityAssetFolderRowProps {\n\ttitle?: string\n\tcollapsed: boolean\n\tselected?: boolean\n\tonSelectItem: ((value: NodeID, event: React.MouseEvent) => void) | undefined\n\tonToggleCollapse?: (id: NodeID) => void\n\ticon?: ReactNode\n\tdisableContextMenu?: boolean\n\tdisableRename?: boolean\n\tisCodeFileFolder?: boolean\n\tmodules?: readonly ModuleInfo[]\n\tPopoutContent?: EntityAssetReferencePopoutContent\n\tinsertionIndicatorOffset?: number\n\tnewItemNavigationTitle?: string\n\tpopout?: boolean\n\tcolor?: string\n\t/** Optional color for focus/drag borders and dividers. Falls back to color prop. */\n\tinteractionBorderColor?: string\n}\n\nexport interface EntityAssetReferenceRowProps {\n\ttitle?: string\n\tselected?: boolean /** Whether or not the row is selected. Can only provided when item is a EntityReferenceNode */\n\tentityModules: readonly ModuleInfo[] | undefined\n\thasSearch?: boolean\n\tonSelectItem: ((value: NodeID, event: React.MouseEvent) => void) | undefined\n\treferenceClassName?: string\n\tPopoutContent?: EntityAssetReferencePopoutContent\n\tgetEditButton?: EntityAssetEditReferenceButton\n\treferenceWithPopoutDivider?: boolean\n\tinsertionIndicatorOffset?: number\n\tpopout?: boolean\n\tcolor?: string\n\t/** Optional color for focus/drag borders and dividers. Falls back to color prop. */\n\tinteractionBorderColor?: string\n\tdisableRename?: boolean\n\tlight?: string\n\tdark?: string\n\tcomponentType?: AssetRowComponentType\n\tdescription?: string\n\tisSortable?: boolean\n}\n\nfunction canToggleCollapse(): boolean {\n\treturn !isMultiSelectModifierKeyPressed()\n}\n\nexport const EntityAssetFolderRow = memo(function EntityAssetFolderRow({\n\tid,\n\ttitle,\n\tcollapsed,\n\tselected,\n\tonSelectItem,\n\thasAnyNonReferencedNodeSibling,\n\tonToggleCollapse,\n\tdepth,\n\ticon,\n\tmodules,\n\tdisableContextMenu,\n\tisCodeFileFolder = false,\n\tdisableRename = false,\n\tPopoutContent,\n\tinsertionIndicatorOffset,\n\tnewItemNavigationTitle,\n\tpopout = false,\n\tcolor,\n\tinteractionBorderColor,\n\ttypeRootId,\n\tselectedIds,\n\treferenceCreateContextMenuItems,\n\tgetOrderedIds,\n\tonEntityAction,\n}: EntityAssetFolderRowProps & EntityAssetRowBaseProps) {\n\tconst agentExperimentIsOn = useExperimentIsOn(\"agent\")\n\tconst isViewOnly = useReadOnly()\n\n\tconst { present, ref } = !isUndefined(PopoutContent)\n\t\t? /** biome-ignore lint/correctness/useHookAtTopLevel: It is safe to do this as configuration in a type root\n\t\t\t * should never change from first render. If it is configured to have a popout in folder it should not change behavior.\n\t\t\t */\n\t\t\tusePopoutContent({\n\t\t\t\tpopout: <PopoutContent folderId={id} popout={popout} />,\n\t\t\t\tnavigationTitle: newItemNavigationTitle,\n\t\t\t\tonBeforePresent: canToggleCollapse,\n\t\t\t})\n\t\t: {}\n\n\tconst getMenuOptions = useCallback(() => {\n\t\tif (disableContextMenu) return emptyArray<MenuItemOptions>()\n\n\t\tconst hasMultiSelect = selectedIds && selectedIds.size > 1 && selectedIds.has(id)\n\n\t\tif (hasMultiSelect) {\n\t\t\treturn (\n\t\t\t\treferenceCreateContextMenuItems?.(id, {\n\t\t\t\t\tstartRenaming: () => renameEntity(id, popout),\n\t\t\t\t\thasSearch: false,\n\t\t\t\t}) ?? emptyArray<MenuItemOptions>()\n\t\t\t)\n\t\t}\n\n\t\treturn buildEntityAssetFolderMenuItems(engine, id, popout, modules, {\n\t\t\tpresentColorPopout: present,\n\t\t\tstartRenaming: () => renameEntity(id, popout),\n\t\t})\n\t}, [id, present, popout, modules, selectedIds, referenceCreateContextMenuItems, disableContextMenu])\n\n\tconst handleToggleCollapse = useCallback(() => {\n\t\tonToggleCollapse?.(id)\n\t}, [onToggleCollapse, id])\n\n\tconst handleFolderPathChange = useEngineCallback(\n\t\t(folderNodeId: NodeID, newPath: string) => {\n\t\t\trenameEntityFolderNode(engine, folderNodeId, newPath, { popout })\n\t\t\tonEntityAction?.(\"rename\", folderNodeId, { newName: newPath })\n\t\t},\n\t\t[popout, onEntityAction],\n\t)\n\n\tassert(typeRootId, \"EntityAssetFolderRow should have a typeRootId\")\n\n\treturn (\n\t\t<DraggableAssetRow\n\t\t\titemId={id}\n\t\t\ttypeRootId={typeRootId}\n\t\t\tisFolder\n\t\t\tisCodeFileFolder={isCodeFileFolder}\n\t\t\thasAnyNonReferencedNodeSibling={hasAnyNonReferencedNodeSibling}\n\t\t\tdepth={depth}\n\t\t\tisCollapsed={collapsed}\n\t\t\tindicatorLeftOffset={insertionIndicatorOffset}\n\t\t\tisViewOnly={isViewOnly}\n\t\t\tpopout={popout}\n\t\t\tcolor={color}\n\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\tselectedIds={selectedIds}\n\t\t\tclassName={cx(selected && selectedSibling)}\n\t\t\tgetOrderedIds={getOrderedIds}\n\t\t>\n\t\t\t{({ isDragPreview, isDraggedOver }) => (\n\t\t\t\t<div style={{ [FOLDER_COLOR]: color, [INTERACTION_BORDER_COLOR]: interactionBorderColor }}>\n\t\t\t\t\t<CollapsibleRow\n\t\t\t\t\t\trowClassName={cx(!agentExperimentIsOn && styles.outline, isDraggedOver && styles.draggedOverRow)}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tdepth={depth}\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tIcon={icon ?? <IconEntityFolder className={styles.icon} />}\n\t\t\t\t\t\twithCollapse\n\t\t\t\t\t\tisCollapsible\n\t\t\t\t\t\tisCollapsed={collapsed}\n\t\t\t\t\t\tisSelected={selected && !isDragPreview}\n\t\t\t\t\t\tonSelect={onSelectItem}\n\t\t\t\t\t\ttoggleCollapse={handleToggleCollapse}\n\t\t\t\t\t\tisEditable={!disableRename && !isEntityTypeRootNodeId(id)}\n\t\t\t\t\t\tinputId={getEntityInputId(id, popout)}\n\t\t\t\t\t\tonTitleChange={handleFolderPathChange}\n\t\t\t\t\t\tgetMenuOptions={disableContextMenu ? undefined : getMenuOptions}\n\t\t\t\t\t\tcanToggleCollapse={canToggleCollapse}\n\t\t\t\t\t\tselectionStyle=\"unsaturated\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</DraggableAssetRow>\n\t)\n})\n\nfunction getModuleContextMenuItems(id: NodeID, isViewOnly: boolean, { moduleIdentifier, name }: ModuleInfo) {\n\tconst { libraryStore, scopeStore, codeEditorStore, modalStore } = engine.stores\n\tconst moduleContextMenuItems = getModuleContextMenuItemsInner({\n\t\tcomponentIdentifier: moduleIdentifier,\n\t\tisViewOnly,\n\t\tteamLibrary: libraryStore.teamLibrary,\n\t\tsource: \"components_panel\",\n\t})\n\n\tconst menuItems: MenuItemOptions[] = [\n\t\t{\n\t\t\tlabel: Dictionary.Insert,\n\t\t\tenabled: !isViewOnly && id !== scopeStore.active.id && !codeEditorStore.currentCodeFileId,\n\t\t\tclick: () =>\n\t\t\t\tinsertCanvasNode({\n\t\t\t\t\tvekterEngine: engine,\n\t\t\t\t\tcomponent: new CodeComponentNode({\n\t\t\t\t\t\tcodeComponentIdentifier: moduleIdentifier,\n\t\t\t\t\t\tslotsAreChildNodes: experiments.isOn(\"componentSlotsAreChildNodes\"),\n\t\t\t\t\t}),\n\t\t\t\t}),\n\t\t},\n\t\t...editInfoForCodeComponentIdentifier(moduleIdentifier, engine, { keepHistory: false }),\n\t\t{\n\t\t\tlabel: Dictionary.Find,\n\t\t\tclick: () => {\n\t\t\t\tmodalStore.set({\n\t\t\t\t\ttype: ModalType.QuickActions,\n\t\t\t\t\tsource: \"components_panel\",\n\t\t\t\t\tinitialCategory: {\n\t\t\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\ttype: FindNodesType.CodeComponent,\n\t\t\t\t\t\t\ttitle: name,\n\t\t\t\t\t\t\tcomponentIdentifier: moduleIdentifier,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t},\n\t]\n\n\tif (moduleContextMenuItems.length > 0) {\n\t\tmenuItems.push({ type: \"separator\" })\n\t\tmenuItems.push(...moduleContextMenuItems)\n\t}\n\treturn menuItems\n}\n\n/**\n * Renders the row with the entity name and the entity icon.\n * */\nexport const EntityAssetReferenceRow = memo(function EntityAssetReferenceRow({\n\tid,\n\tdepth,\n\ttitle,\n\tselected = false,\n\tonSelectItem,\n\tentityModules,\n\thasSearch,\n\thasAnyNonReferencedNodeSibling,\n\ttypeRootId,\n\treferenceClassName,\n\tPopoutContent,\n\tisSortable = true,\n\tgetEditButton,\n\treferenceCreateContextMenuItems,\n\treferenceWithPopoutDivider = false,\n\tinsertionIndicatorOffset,\n\tpopout = false,\n\tdisableRename = false,\n\tcolor,\n\tinteractionBorderColor,\n\tlight,\n\tdark,\n\tcomponentType,\n\tdescription,\n\tselectedIds,\n\tgetOrderedIds,\n\tlastSelectionTypeRootId,\n\tonEntityAction,\n}: EntityAssetReferenceRowProps & EntityAssetRowBaseProps) {\n\tconst isViewOnly = useReadOnly()\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\n\tconst ref = useRef<HTMLDivElement>(null)\n\n\tconst navigation = useContext(PopoutContext)\n\tconst [stackIndex] = useState(navigation?.currentStackIndex ?? -1)\n\n\tuseLayoutEffect(() => {\n\t\tif (isUndefined(typeRootId) || !selected) return\n\n\t\t// `scrollIntoView` breaks the popout transition, so we only do this for the top level\n\t\t// popout content that appears instantly.\n\t\tif (stackIndex > 0) return\n\n\t\t// Don't scroll when multiple items are selected or when multi-selecting\n\t\t// This primarily helps avoid scrolling to code files when a code component is selected.\n\t\tconst hasMultipleSelections = selectedIds && selectedIds.size > 1\n\t\tif (hasMultipleSelections || isMultiSelectModifierKeyPressed()) return\n\t\t// Only scroll if lastSelectionTypeRootId matches typeRootId to avoid scrolling to asset rows that might share\n\t\t// the same id in the selection state, e.g. smart components derived from code files.\n\t\tif (lastSelectionTypeRootId && lastSelectionTypeRootId !== typeRootId) return\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (ref.current) {\n\t\t\t\tscrollIntoView(ref.current, {\n\t\t\t\t\tscrollMode: \"if-needed\",\n\t\t\t\t\tblock: \"center\",\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}, [selected, stackIndex, typeRootId, selectedIds, lastSelectionTypeRootId])\n\n\tconst singleModule = entityModules?.[0]\n\tconst hasSingleModule = entityModules?.length === 1\n\tconst createContextMenuItems = useCallback(\n\t\t(referenceId: NodeID, options: ContextMenuOptions) => {\n\t\t\tconst hasMultiSelect = selectedIds && selectedIds.size > 1 && selectedIds.has(referenceId)\n\t\t\tconst isCodeModule =\n\t\t\t\ttypeRootId === COMPONENTS_ENTITY_TYPE_ROOT_ID &&\n\t\t\t\tsingleModule &&\n\t\t\t\thasSingleModule &&\n\t\t\t\tsingleModule.type === ModuleType.Code\n\n\t\t\treturn isCodeModule && !hasMultiSelect\n\t\t\t\t? getModuleContextMenuItems(referenceId, isViewOnly, singleModule)\n\t\t\t\t: (referenceCreateContextMenuItems?.(referenceId, options) ?? emptyArray())\n\t\t},\n\t\t[isViewOnly, referenceCreateContextMenuItems, singleModule, hasSingleModule, typeRootId, selectedIds],\n\t)\n\n\tif (isUndefined(typeRootId)) return null\n\n\tconst icon = getIconForEntityReferenceItem(typeRootId, id, componentType, light, dark, agentExperimentEnabled)\n\n\tif (isUndefined(PopoutContent) || getEditButton) {\n\t\treturn (\n\t\t\t<EntityAssetReferenceItemRow\n\t\t\t\tclassName={referenceClassName}\n\t\t\t\tref={ref}\n\t\t\t\tid={id}\n\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\tdepth={depth}\n\t\t\t\tselected={selected}\n\t\t\t\ttitle={title ?? \"\"}\n\t\t\t\tdescription={description}\n\t\t\t\ticon={icon}\n\t\t\t\teditButton={getEditButton}\n\t\t\t\tonSelectItem={onSelectItem}\n\t\t\t\thasSearch={hasSearch}\n\t\t\t\tcreateContextMenuItems={createContextMenuItems}\n\t\t\t\thasAnyNonReferencedNodeSibling={hasAnyNonReferencedNodeSibling}\n\t\t\t\tinsertionIndicatorOffset={insertionIndicatorOffset}\n\t\t\t\tentityModules={entityModules}\n\t\t\t\tdisableRename={isViewOnly || disableRename}\n\t\t\t\tisSortable={isSortable}\n\t\t\t\tpopout={popout}\n\t\t\t\tcolor={color}\n\t\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tgetOrderedIds={getOrderedIds}\n\t\t\t\tlastSelectionTypeRootId={lastSelectionTypeRootId}\n\t\t\t\tonEntityAction={onEntityAction}\n\t\t\t/>\n\t\t)\n\t}\n\n\treturn (\n\t\t<PopoutButton\n\t\t\tid={getAssetStylePopoutId(id)}\n\t\t\tclassName={cx(styles.button, selected && selectedSibling)}\n\t\t\tnavigationTitle={title}\n\t\t\tpopout={<PopoutContent referenceItemId={id} popout={popout} />}\n\t\t\ttogglePopoutEnabled\n\t\t\tdisplayDivider={referenceWithPopoutDivider}\n\t\t\tonBeforePresent={canToggleCollapse}\n\t\t>\n\t\t\t<EntityAssetReferenceItemRow\n\t\t\t\tclassName={referenceClassName}\n\t\t\t\tref={ref}\n\t\t\t\tid={id}\n\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\tdepth={depth}\n\t\t\t\tselected={selected}\n\t\t\t\ttitle={title ?? \"\"}\n\t\t\t\tdescription={description}\n\t\t\t\ticon={icon}\n\t\t\t\tonSelectItem={onSelectItem}\n\t\t\t\tcreateContextMenuItems={referenceCreateContextMenuItems}\n\t\t\t\thasAnyNonReferencedNodeSibling={hasAnyNonReferencedNodeSibling}\n\t\t\t\tinsertionIndicatorOffset={insertionIndicatorOffset}\n\t\t\t\tentityModules={entityModules}\n\t\t\t\tpopout={popout}\n\t\t\t\tdisableRename={isViewOnly || disableRename}\n\t\t\t\tcolor={color}\n\t\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\t\tisSortable={isSortable}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tgetOrderedIds={getOrderedIds}\n\t\t\t\tlastSelectionTypeRootId={lastSelectionTypeRootId}\n\t\t\t\tonEntityAction={onEntityAction}\n\t\t\t/>\n\t\t</PopoutButton>\n\t)\n})\n\ninterface EntityAssetReferenceItemRowProps extends EntityAssetReferenceRowProps, EntityAssetRowBaseProps {\n\tclassName?: string\n\ttypeRootId: EntityTypeRootId\n\ttitle: string\n\tdescription?: string\n\ticon: ReactNode\n\teditButton?: EntityAssetEditReferenceButton\n\tinsertionIndicatorOffset?: number\n\tdisableRename?: boolean\n\tisSortable?: boolean\n\tpopout: boolean\n\tcolor?: string\n\tcreateContextMenuItems?: (\n\t\tid: NodeID,\n\t\toptions: ContextMenuOptions,\n\t) => readonly MenuItemOptions[] | Promise<MenuItemOptions[]>\n}\n\n/**\n * Renders a single asset row for entity reference nodes. Supports inline rename, drag and drop,\n * etc.\n */\nconst EntityAssetReferenceItemRow = forwardRef<HTMLDivElement, EntityAssetReferenceItemRowProps>(\n\tfunction EntityAssetReferenceItemRow(\n\t\t{\n\t\t\tclassName,\n\t\t\tid,\n\t\t\ttypeRootId,\n\t\t\tdepth,\n\t\t\ttitle,\n\t\t\ticon,\n\t\t\tdescription,\n\t\t\tcreateContextMenuItems,\n\t\t\teditButton,\n\t\t\tselected = false,\n\t\t\tonSelectItem,\n\t\t\tinsertionIndicatorOffset,\n\t\t\thasAnyNonReferencedNodeSibling,\n\t\t\tentityModules,\n\t\t\tdisableRename = false,\n\t\t\thasSearch = false,\n\t\t\tisSortable = true,\n\t\t\tpopout,\n\t\t\tcolor,\n\t\t\tinteractionBorderColor,\n\t\t\tselectedIds,\n\t\t\tgetOrderedIds,\n\t\t\tonEntityAction,\n\t\t}: EntityAssetReferenceItemRowProps,\n\t\tforwardedRef,\n\t) {\n\t\tconst agentExperimentIsOn = useExperimentIsOn(\"agent\")\n\t\tconst isViewOnly = useReadOnly()\n\n\t\tconst getMenuOptions = useCallback(() => {\n\t\t\tif (isUndefined(createContextMenuItems)) return emptyArray<MenuItemOptions>()\n\n\t\t\treturn createContextMenuItems(id, { startRenaming: () => renameEntity(id, popout), hasSearch })\n\t\t}, [createContextMenuItems, hasSearch, popout, id])\n\n\t\tconst renameEntityReference = useEngineCallback(\n\t\t\t(_id: NodeID, newPath: string) => {\n\t\t\t\t// TODO: reconsider removing and adding direct node renaming instead\n\t\t\t\tif (hasAnyNonReferencedNodeSibling) referenceUnreferencedNodesByTypeRoot(engine, typeRootId)\n\t\t\t\tvoid renameEntityReferenceNode(engine, buildReferenceNodeId(typeRootId, id), newPath, {\n\t\t\t\t\tpopout,\n\t\t\t\t}).then(() => {\n\t\t\t\t\tonEntityAction?.(\"rename\", id, { newName: newPath })\n\t\t\t\t})\n\t\t\t},\n\t\t\t[id, typeRootId, hasAnyNonReferencedNodeSibling, popout, onEntityAction],\n\t\t)\n\n\t\treturn (\n\t\t\t<DraggableAssetRow\n\t\t\t\titemId={id}\n\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\tisFolder={false}\n\t\t\t\thasAnyNonReferencedNodeSibling={hasAnyNonReferencedNodeSibling}\n\t\t\t\tdepth={depth}\n\t\t\t\tisCollapsed={false}\n\t\t\t\tindicatorLeftOffset={insertionIndicatorOffset}\n\t\t\t\tisViewOnly={isViewOnly}\n\t\t\t\tentityModules={entityModules}\n\t\t\t\tisSortable={isSortable && !hasSearch}\n\t\t\t\tpopout={popout}\n\t\t\t\tcolor={color}\n\t\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\t\tselectedIds={selectedIds}\n\t\t\t\tclassName={cx(selected && selectedSibling)}\n\t\t\t\tgetOrderedIds={getOrderedIds}\n\t\t\t>\n\t\t\t\t{({ isDragPreview }) => (\n\t\t\t\t\t<div style={{ [FOLDER_COLOR]: color, [INTERACTION_BORDER_COLOR]: interactionBorderColor }}>\n\t\t\t\t\t\t<CollapsibleRow\n\t\t\t\t\t\t\trowClassName={cx(className, !agentExperimentIsOn && styles.outline)}\n\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\t\t\tdepth={depth}\n\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\tIcon={icon}\n\t\t\t\t\t\t\tsubLabel={description}\n\t\t\t\t\t\t\twithCollapse\n\t\t\t\t\t\t\tisEditable={!disableRename && !isEntityTypeRootNodeId(id) && !hasSearch}\n\t\t\t\t\t\t\tinputId={getEntityInputId(id, popout)}\n\t\t\t\t\t\t\tonTitleChange={renameEntityReference}\n\t\t\t\t\t\t\tisSelected={selected && !isDragPreview}\n\t\t\t\t\t\t\tonSelect={onSelectItem}\n\t\t\t\t\t\t\tgetMenuOptions={getMenuOptions}\n\t\t\t\t\t\t\ttrailingElementOverride={editButton?.(id, title)}\n\t\t\t\t\t\t\tdataTestId=\"asset-row\"\n\t\t\t\t\t\t\tselectionStyle=\"unsaturated\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</DraggableAssetRow>\n\t\t)\n\t},\n)\n\nfunction getIconForEntityReferenceItem(\n\ttypeRootId: EntityTypeRootId,\n\tnodeId: NodeID,\n\tcmsComponentType?: AssetRowComponentType,\n\tlight?: string,\n\tdark?: string,\n\tagentExperimentEnabled: boolean = false,\n) {\n\tswitch (typeRootId) {\n\t\tcase BLOCKQUOTE_ENTITY_ROOT_ID:\n\t\t\treturn <PresetIcon icon=\"b\" color={colors.presetIcon} />\n\t\tcase CMS_ENTITY_ROOT_ID: {\n\t\t\tconst icon = getIconForCMSStyleEntity(cmsComponentType, agentExperimentEnabled)\n\t\t\treturn <PresetIcon icon={icon} className={styles.blue} />\n\t\t}\n\t\tcase LAYOUT_TEMPLATE_ENTITY_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentAssetLayoutTemplate style={{ color: colors.assetComponentIcon }} />\n\t\t\treturn <IconLayoutTemplate style={{ color: colors.assetComponentIcon }} />\n\t\tcase VECTOR_SET_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentVectorSet className={styles.blue} />\n\t\t\treturn <IconLayerVector className={styles.blue} />\n\t\t// TODO: Color is hardcoded on icon here\n\t\tcase CODE_FILE_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentCode style={{ color: colors.assetCodeFileIcon }} />\n\t\t\treturn <IconAssetsCodeFile style={{ color: colors.assetCodeFileIcon }} />\n\t\tcase COLOR_ENTITY_ROOT_ID:\n\t\t\treturn <ColorStyleTokenEntityIcon light={light} dark={dark} />\n\t\tcase COMPONENTS_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentComponent style={{ color: colors.assetComponentIcon }} />\n\t\t\treturn <IconLayerComponent color={colors.assetComponentIcon} />\n\t\tcase INLINE_CODE_ENTITY_ROOT_ID:\n\t\t\treturn <PresetIcon icon=\"c\" color={colors.presetIcon} />\n\t\tcase LINK_ENTITY_ROOT_ID:\n\t\t\treturn <PresetIcon icon=\"a\" className={styles.blue} />\n\t\tcase TEXT_ENTITY_ROOT_ID: {\n\t\t\tconst node = engine.tree.get(nodeId)\n\t\t\tif (!isTextStylePresetPrimaryNode(node)) return null\n\t\t\treturn <PresetIcon icon={node.tag} color={colors.presetIcon} />\n\t\t}\n\t\tcase FUNNELS_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentFunnel />\n\t\t\treturn <IconFunnel />\n\t\tcase AB_TESTS_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return getAgentAbTestIcon(nodeId)\n\t\t\treturn <IconABTest />\n\t\tcase CONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID:\n\t\t\tif (agentExperimentEnabled) return <IconAgentCMS />\n\t\t\treturn <IconSidebarCollection />\n\t\tdefault:\n\t\t\tassertNever(typeRootId)\n\t}\n}\n\nfunction getAgentAbTestIcon(nodeId: NodeID) {\n\tconst funnel = engine.tree.getNodeWithTrait(nodeId, isFunnelNode)\n\tif (!funnel?.abTestingParentId) return <IconABTest />\n\n\tconst parentPage = engine.tree.getNodeWithTrait(funnel.abTestingParentId, isWebPageNode)\n\tif (parentPage?.id === engine.tree.root.homePageNodeId) return <IconAgentHome />\n\treturn <IconAgentPage />\n}\n\nfunction getIconForCMSStyleEntity(componentType: AssetRowComponentType | undefined, agentExperimentEnabled: boolean) {\n\tif (isUndefined(componentType)) {\n\t\tif (agentExperimentEnabled) return <IconAgentComponent />\n\t\treturn <IconLayerComponent />\n\t}\n\n\tswitch (componentType) {\n\t\tcase \"code\":\n\t\t\tif (agentExperimentEnabled) return <IconAgentCode />\n\t\t\treturn <IconCodeBlock />\n\t\tcase \"video\":\n\t\t\tif (agentExperimentEnabled) return <IconAgentVideo />\n\t\t\treturn <IconVideo />\n\t\tcase \"image\":\n\t\t\tif (agentExperimentEnabled) return <IconAgentLayerImage />\n\t\t\treturn <IconImageStylePreset />\n\t\tcase \"table\":\n\t\t\tif (agentExperimentEnabled) return <IconAgentLayerGrid />\n\t\t\treturn <IconTableStylePreset />\n\t\tdefault:\n\t\t\tassertNever(componentType)\n\t}\n}\n\nconst ColorStyleTokenEntityIcon = ({ light, dark }: { light?: string; dark?: string }) => {\n\tconst { isDarkMode } = useDarkMode()\n\n\treturn (\n\t\t<PresetIcon\n\t\t\ticon={<ColorTokenPreview value={isDarkMode && !!dark ? dark : light} size=\"small\" />}\n\t\t\tcolor={colors.presetIcon}\n\t\t/>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport React, { useCallback } from \"react\"\nimport { PopoutButton } from \"../../shared/PopoutButton.tsx\"\nimport { useRename } from \"../utils/useRename.tsx\"\nimport * as styles from \"./StyleAssetRow.styles.ts\"\n\ninterface Props {\n\t/* The content to render when it is not renaming */\n\tchildren: React.ReactNode\n\t/* 14x14 */\n\ticon: React.ReactNode\n\tid: string\n\tname: string\n\tpopout: React.ReactNode\n\tdisplayPopoutDivider: boolean\n\tisViewOnly?: boolean\n\tonContextMenu?(event: React.MouseEvent, startRenaming: () => void): void\n}\n\n/**\n * Renamable style asset row with popout\n */\nexport const StyleAssetRow = React.memo(\n\t({ children, icon, id, name, popout, displayPopoutDivider, onContextMenu, isViewOnly }: Props) => {\n\t\tconst [startRenaming, isRenaming, onRename, cancelRename] = useRename(engine, id)\n\n\t\tfunction confirmRename(event: React.SyntheticEvent<HTMLInputElement>) {\n\t\t\tonRename(event.currentTarget.value.trim() || name)\n\t\t}\n\n\t\tfunction renameWithEnter(event: React.KeyboardEvent<HTMLInputElement>) {\n\t\t\t// don't propagate keyboard events to the popout button when renaming\n\t\t\tevent.stopPropagation()\n\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tconfirmRename(event)\n\t\t\t}\n\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tcancelRename()\n\t\t\t}\n\t\t}\n\n\t\tfunction handleClick(event: React.MouseEvent) {\n\t\t\tif (isRenaming) {\n\t\t\t\t// don't propagate clicks to the popout button when renaming\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\t\t}\n\n\t\tfunction handleContextMenu(event: React.MouseEvent) {\n\t\t\tonContextMenu?.(event, startRenaming)\n\t\t}\n\n\t\tfunction handleFocus(event: React.FocusEvent<HTMLInputElement>) {\n\t\t\tevent.target.select()\n\t\t}\n\n\t\tconst handleDoubleClick = useCallback(() => {\n\t\t\tif (isViewOnly || isRenaming) return\n\t\t\tstartRenaming()\n\t\t}, [isViewOnly, isRenaming, startRenaming])\n\n\t\treturn (\n\t\t\t<PopoutButton\n\t\t\t\tdisplayDivider={displayPopoutDivider}\n\t\t\t\tid={getAssetStylePopoutId(id)}\n\t\t\t\tpopout={popout}\n\t\t\t\tnavigationTitle={isViewOnly ? name : `Edit ${name}`}\n\t\t\t\tonContextMenu={handleContextMenu}\n\t\t\t\tonDoubleClick={handleDoubleClick}\n\t\t\t\ttogglePopoutEnabled\n\t\t\t\tclassName={styles.button}\n\t\t\t>\n\t\t\t\t<div className={styles.icon}>{icon}</div>\n\t\t\t\t{isRenaming ? (\n\t\t\t\t\t<input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\t\tplaceholder={name}\n\t\t\t\t\t\tdefaultValue={name}\n\t\t\t\t\t\tonBlur={confirmRename}\n\t\t\t\t\t\tonKeyDown={renameWithEnter}\n\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\tautoCorrect=\"off\"\n\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\tchildren\n\t\t\t\t)}\n\t\t\t</PopoutButton>\n\t\t)\n\t},\n)\n\nexport function getAssetStylePopoutId(id: string): string {\n\treturn `asset-style-popout-${id}`\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { useState } from \"react\"\n\nexport function useRename(engine: VekterEngine, nodeId: string) {\n\tconst [isRenaming, setIsRenaming] = useState(false)\n\n\tfunction startRenaming() {\n\t\tsetIsRenaming(true)\n\t}\n\n\tconst onRename = engine.scheduler.wrapHandler((name: string) => {\n\t\tengine.tree.get(nodeId)?.set({ name })\n\t\tengine.scheduler.runBeforeNextFrame(() => {\n\t\t\tsetIsRenaming(false)\n\t\t})\n\t})\n\n\tfunction cancelRename() {\n\t\tsetIsRenaming(false)\n\t}\n\n\treturn [startRenaming, isRenaming, onRename, cancelRename] as const\n}\n", "import \"StyleAssetRow.styles_1fz8xf4.wyw.css\"; export const input = \"input_i1ldific\";\nexport const button = \"button_b1l2hhm2\";\nexport const icon = \"icon_iw2pulc\";", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { isModuleExportIdentifier, parseModuleIdentifier, unhandledError } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { getModuleImportStatement, moduleUrlWithExportSpecifierFragment } from \"modules/utils.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { copyText } from \"../copyText.ts\"\n\nfunction getImportStatement(engine: VekterEngine, componentIdentifier: string | undefined, versioned: boolean = true) {\n\tconst latest = engine.stores.modulesStore.getPersistedModuleByLocalIdentifier(componentIdentifier)\n\tif (!latest) return\n\tconst specifier = versioned ? `${latest.importURL}@${latest.saveId}` : latest.importURL\n\treturn getModuleImportStatement({\n\t\tkind: \"external\",\n\t\tspecifier,\n\t\ttitle: latest.title,\n\t\texports: latest.exports,\n\t})\n}\n\nexport function copyImportURL(\n\tengine: VekterEngine,\n\tcomponentIdentifier: string | undefined,\n\tversioned: boolean = true,\n) {\n\tconst importStatement = getImportStatement(engine, componentIdentifier, versioned)\n\tif (!importStatement) return\n\tconst moduleIdentifier = parseModuleIdentifier(componentIdentifier)\n\tconst exportSpecifier = isModuleExportIdentifier(moduleIdentifier) ? moduleIdentifier.exportSpecifier : undefined\n\tconst url = moduleUrlWithExportSpecifierFragment(importStatement.info.specifier, exportSpecifier)\n\tcopyText(url)\n\t\t.then(() => {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tprimaryText: \"Copied import URL\",\n\t\t\t\tsecondaryText: \"to your clipboard.\",\n\t\t\t\tduration: 3000,\n\t\t\t\taction: {\n\t\t\t\t\ttitle: Dictionary.LearnMore,\n\t\t\t\t\tonClick: openDeveloperSupportArticle,\n\t\t\t\t},\n\t\t\t\tshowCloseButton: \"never\",\n\t\t\t})\n\t\t})\n\t\t.catch(unhandledError)\n}\n\nexport function copyImportStatement(\n\tengine: VekterEngine,\n\tcomponentIdentifier: string | undefined,\n\tversioned: boolean = true,\n) {\n\tconst importStatement = getImportStatement(engine, componentIdentifier, versioned)\n\tif (!importStatement) return\n\tcopyText(importStatement.toString())\n\t\t.then(() => {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tprimaryText: \"Copied import statement\",\n\t\t\t\tsecondaryText: \"to your clipboard.\",\n\t\t\t\tduration: 3000,\n\t\t\t\taction: {\n\t\t\t\t\ttitle: Dictionary.LearnMore,\n\t\t\t\t\tonClick: openDeveloperSupportArticle,\n\t\t\t\t},\n\t\t\t\tshowCloseButton: \"never\",\n\t\t\t})\n\t\t})\n\t\t.catch(unhandledError)\n}\n\nfunction openDeveloperSupportArticle() {\n\topenNewTab(\"https://www.framer.com/developers/\")\n}\n", "import {\n\ttype GlobalModuleId,\n\tModuleType,\n\tisExternalModuleIdentifier,\n\tisLocalModuleIdentifier,\n\tisModuleExportIdentifier,\n\tisModuleIdentifier,\n\tlocalModuleIdentifierForStableName,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport {\n\ttype CanvasNode,\n\tCodeComponentNode,\n\ttype NodeID,\n\tSmartComponentNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { getContentManagementNode } from \"document/models/CanvasTree/nodes/ContentManagementNode.utils.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { isCodeComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { withControlProps } from \"document/models/CanvasTree/traits/WithControlProps.ts\"\nimport { CustomCursorType, isCustomCursor, withCursor } from \"document/models/CanvasTree/traits/WithCursor.ts\"\nimport { hasLayoutTemplate } from \"document/models/CanvasTree/traits/WithLayoutTemplate.ts\"\nimport type { VariableDefinition, VariableDivider } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { collectionItemHasModule } from \"utils/collectionUtils.ts\"\nimport { isSet, isUndefined } from \"utils/typeChecks.ts\"\n\n/**\n * Finds all uses of a specified module, supporting components and vector sets. Requires a fully loaded tree for\n * components as they may be used as cursors.\n */\nexport function findComponentInstances(\n\ttype: Extract<ModuleType, ModuleType.Canvas | ModuleType.Vector>,\n\tengine: VekterEngine,\n\tcomponentIdentifier: string | Set<string>,\n\t{\n\t\tfindFirst = false,\n\t}: {\n\t\t/** If true, the function will return early once the first instance is found. */\n\t\tfindFirst?: boolean\n\t} = {},\n): Map<NodeID, CanvasNode> {\n\tconst nodes = new Map<NodeID, CanvasNode>()\n\n\tconst matches = (identifier: string | undefined) => {\n\t\tif (isUndefined(identifier)) return false\n\t\tconst moduleIdentifier = isModuleIdentifier(identifier)\n\t\t\t? identifier\n\t\t\t: localModuleIdentifierForStableName(type, identifier, \"default\").value\n\t\tif (isSet(componentIdentifier)) {\n\t\t\treturn componentIdentifier.has(moduleIdentifier)\n\t\t}\n\t\treturn moduleIdentifier === componentIdentifier\n\t}\n\n\tconst iterator = engine.stores.treeStore.query().partial(true).whereClass(CodeComponentNode).iterate()\n\tfor (const node of iterator) {\n\t\tif (matches(node.codeComponentIdentifier)) {\n\t\t\tnodes.set(node.id, node)\n\t\t\tif (findFirst) return nodes\n\t\t}\n\t}\n\n\tconst smartComponentIterator = engine.stores.treeStore.query().partial(true).whereClass(SmartComponentNode).iterate()\n\tfor (const node of smartComponentIterator) {\n\t\tconst hasVectorSetItem = node?.variables.some(variable =>\n\t\t\tfindVectorSetItemInVariable(engine, variable, componentIdentifier),\n\t\t)\n\n\t\tif (hasVectorSetItem) {\n\t\t\tnodes.set(node.id, node)\n\t\t\tif (findFirst) return nodes\n\t\t}\n\t}\n\n\t// FIXME: If CMS Node will ever become shallow this code needs to be checked/updated\n\tconst contentManagementNode = getContentManagementNode(engine.tree)?.loaded\n\tif (contentManagementNode) {\n\t\tfor (const collectionNode of contentManagementNode.children) {\n\t\t\t// Check if the collection node is using a vector for fields\n\t\t\tconst hasVectorSetItem = collectionNode.variables.some(variable =>\n\t\t\t\tfindVectorSetItemInVariable(engine, variable, componentIdentifier),\n\t\t\t)\n\n\t\t\tif (hasVectorSetItem) {\n\t\t\t\tnodes.set(collectionNode.id, collectionNode)\n\t\t\t\tif (findFirst) return nodes\n\t\t\t}\n\n\t\t\t// Check if the collection items are using a vector for fields\n\t\t\tfor (const itemNode of collectionNode.getUnsortedChildren()) {\n\t\t\t\tif (isSet(componentIdentifier)) {\n\t\t\t\t\tfor (const identifier of componentIdentifier) {\n\t\t\t\t\t\tif (!isModuleExportIdentifier(identifier)) continue\n\t\t\t\t\t\tif (collectionItemHasModule(itemNode, identifier)) {\n\t\t\t\t\t\t\tnodes.set(itemNode.id, itemNode)\n\t\t\t\t\t\t\tif (findFirst) return nodes\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tisModuleExportIdentifier(componentIdentifier) &&\n\t\t\t\t\tcollectionItemHasModule(itemNode, componentIdentifier)\n\t\t\t\t) {\n\t\t\t\t\tnodes.set(itemNode.id, itemNode)\n\t\t\t\t\tif (findFirst) return nodes\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst listNode = PresetsListNode.get(engine.tree)\n\tif (listNode) {\n\t\tconst componentPresets = listNode.getComponentPresets()\n\t\tfor (const presetNode of componentPresets) {\n\t\t\tif (matches(presetNode.componentIdentifier)) {\n\t\t\t\tnodes.set(presetNode.id, presetNode)\n\t\t\t\tif (findFirst) return nodes\n\t\t\t}\n\t\t}\n\t}\n\n\tconst canBeUsedAsCursor = type === ModuleType.Canvas\n\tif (!canBeUsedAsCursor) return nodes\n\n\tconst nodesWithPotentialCursorsIterator = engine.stores.treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.withOrMode()\n\t\t.wherePropertyEquals(\"customCursorType\", CustomCursorType.Component)\n\t\t.wherePropertyExists(\"layoutTemplateIdentifier\")\n\t\t.wherePropertyExists(\"codeComponentIdentifier\")\n\t\t.iterate()\n\n\tfor (const node of nodesWithPotentialCursorsIterator) {\n\t\tif (nodes.has(node.id)) continue\n\n\t\tif (\n\t\t\twithCursor(node) &&\n\t\t\tnode.customCursorType === CustomCursorType.Component &&\n\t\t\tmatches(node.customCursorSmartComponentId)\n\t\t) {\n\t\t\tnodes.set(node.id, node)\n\t\t\tif (findFirst) return nodes\n\t\t}\n\n\t\tif ((withControlProps(node) && hasLayoutTemplate(node)) || isCodeComponentNode(node)) {\n\t\t\tconst component = engine.componentLoader.reactComponentForIdentifier(\n\t\t\t\tisCodeComponentNode(node) ? node.codeComponentIdentifier : node.layoutTemplateIdentifier,\n\t\t\t)\n\t\t\tif (!component) continue\n\n\t\t\tfor (const key in component.properties) {\n\t\t\t\tconst property = component.properties[key]\n\t\t\t\tif (property?.type !== ControlType.CustomCursor) continue\n\n\t\t\t\tconst controlProp = node.getRawControlProp(key)\n\t\t\t\tif (controlProp?.type !== ControlType.CustomCursor) continue\n\t\t\t\tif (!isCustomCursor(controlProp.value)) continue\n\n\t\t\t\tif (matches(controlProp.value.customCursorSmartComponentId)) {\n\t\t\t\t\tnodes.set(node.id, node)\n\t\t\t\t\tif (findFirst) return nodes\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nodes\n}\n\nfunction findVectorSetItemInVariable(\n\tengine: VekterEngine,\n\tvariable: VariableDefinition | VariableDivider,\n\tcomponentIdentifier: string | Set<string>,\n) {\n\tif (variable.type !== ControlType.VectorSetItem) return false\n\n\tif (isSet(componentIdentifier)) {\n\t\tfor (const identifier of componentIdentifier) {\n\t\t\tif (isVariableUsingVectorSet(engine, variable, identifier)) return true\n\t\t}\n\t\treturn false\n\t}\n\n\treturn isVariableUsingVectorSet(engine, variable, componentIdentifier)\n}\n\nfunction isVariableUsingVectorSet(\n\tengine: VekterEngine,\n\tvariable: VariableDefinition | VariableDivider,\n\tidentifier: string,\n) {\n\tif (variable.type !== ControlType.VectorSetItem) return false\n\n\tlet moduleId: GlobalModuleId | undefined\n\n\tif (isLocalModuleIdentifier(identifier)) {\n\t\tmoduleId = engine.stores.modulesStore.getPersistedModuleByLocalIdentifier(identifier)?.id\n\t}\n\tif (isExternalModuleIdentifier(identifier)) {\n\t\tmoduleId = parseModuleIdentifier(identifier).moduleId\n\t}\n\n\tif (variable.setModuleId === moduleId) return true\n\n\treturn false\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { removeNodeWithReference } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\n\nexport function removePresetNode(engine: VekterEngine, presetId: NodeID) {\n\tconst preset = engine.tree.get(presetId)\n\tif (isNull(preset)) return\n\n\tremoveNodeWithReference(engine.tree, presetId)\n\n\t// Remove breakpoints of the preset.\n\tfor (const breakpointId of preset.cache.replicaInstances ?? []) {\n\t\tengine.tree.remove(breakpointId)\n\t}\n}\n", "import { triggerComponentCanvasDeleteEvent } from \"@framerjs/framer-events\"\nimport { AnnotationKey } from \"@framerjs/framer-runtime/crossorigin\"\nimport {\n\tassert,\n\ttype ExternalModuleExportIdentifierString,\n\ttype LocalModuleExportIdentifierString,\n\ttype LocalModuleId,\n\tModuleType,\n\tassertNever,\n\tparseModuleIdentifier,\n\twithoutExportSpecifier,\n} from \"@framerjs/shared\"\nimport { isFramerVectorSetInfo } from \"code-generation/utils/annotations.ts\"\nimport { engineLog } from \"document/EngineLoggers.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { deleteToken } from \"document/components/utils/tokenContextActions.ts\"\nimport type { CanvasNode, CodeComponentNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tAB_TESTS_ENTITY_TYPE_ROOT_ID,\n\tBLOCKQUOTE_ENTITY_ROOT_ID,\n\tCMS_ENTITY_ROOT_ID,\n\tCODE_FILE_ENTITY_TYPE_ROOT_ID,\n\tCOLOR_ENTITY_ROOT_ID,\n\tCOMPONENTS_ENTITY_TYPE_ROOT_ID,\n\tCONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID,\n\tFUNNELS_ENTITY_TYPE_ROOT_ID,\n\tINLINE_CODE_ENTITY_ROOT_ID,\n\tLAYOUT_TEMPLATE_ENTITY_ROOT_ID,\n\tLINK_ENTITY_ROOT_ID,\n\tTEXT_ENTITY_ROOT_ID,\n\tVECTOR_SET_ENTITY_TYPE_ROOT_ID,\n\ttrackingTypeForRootId,\n} from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { isLocalModuleNode } from \"document/models/CanvasTree/nodes/LocalModuleNode.ts\"\nimport {\n\tremoveNodeWithReference,\n\tremoveReferenceForNode,\n} from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { entityRootTypeIdForEntityNode } from \"document/models/CanvasTree/nodes/utils/entityTypeRootNode.ts\"\nimport {\n\tisEntityFolderNode,\n\tisEntityReferenceNode,\n\tisExternalModuleNode,\n\tisLayoutTemplateNode,\n\tisSmartComponentNode,\n\tisVectorSetNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isReplicaOrReplicaChild } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { deleteCodeFileModule } from \"utils/codeFiles.ts\"\nimport { someCollectionHasModule } from \"utils/collectionUtils.ts\"\nimport { getComponentPresetsForModule } from \"utils/componentPresetUtils.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { getVectorSetIdentifiers } from \"utils/vectorSets.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { findComponentInstances } from \"../../properties/utils/findComponentInstances.ts\"\nimport { removePresetNode } from \"../../properties/utils/removePresetNode.ts\"\n\nexport async function deleteEntityFolderNode(engine: VekterEngine, node: CanvasNode) {\n\tif (!isEntityFolderNode(node)) return\n\n\tconst type = entityRootTypeIdForEntityNode(node)\n\tengine.scheduler.process(() => engine.beginUndoGroup())\n\n\t// Remove all original nodes referenced inside the folder along with references to avoid things\n\t// out of sync\n\n\ttry {\n\t\tfor (const descendant of node.descendants()) {\n\t\t\tif (!isEntityReferenceNode(descendant)) continue\n\n\t\t\tconst referencedNodeId = descendant.referenceId\n\n\t\t\tswitch (type) {\n\t\t\t\tcase BLOCKQUOTE_ENTITY_ROOT_ID:\n\t\t\t\tcase CMS_ENTITY_ROOT_ID:\n\t\t\t\tcase INLINE_CODE_ENTITY_ROOT_ID:\n\t\t\t\tcase LINK_ENTITY_ROOT_ID:\n\t\t\t\tcase TEXT_ENTITY_ROOT_ID:\n\t\t\t\t\tengine.scheduler.process(() => {\n\t\t\t\t\t\tremovePresetNode(engine, referencedNodeId)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase COLOR_ENTITY_ROOT_ID:\n\t\t\t\t\tengine.scheduler.process(() => deleteToken(engine, referencedNodeId))\n\t\t\t\t\tbreak\n\t\t\t\tcase CODE_FILE_ENTITY_TYPE_ROOT_ID:\n\t\t\t\t\tawait deleteCodeFileNode(engine, referencedNodeId)\n\t\t\t\t\tbreak\n\t\t\t\tcase LAYOUT_TEMPLATE_ENTITY_ROOT_ID:\n\t\t\t\tcase COMPONENTS_ENTITY_TYPE_ROOT_ID: {\n\t\t\t\t\tconst referencedNode = engine.tree.get(referencedNodeId)\n\t\t\t\t\tif (isSmartComponentNode(referencedNode) || isLayoutTemplateNode(referencedNode)) {\n\t\t\t\t\t\tawait deleteLocalComponentScopeNode(engine, referencedNodeId)\n\t\t\t\t\t} else if (isLocalModuleNode(referencedNode)) {\n\t\t\t\t\t\tawait deleteCodeFileNode(engine, referencedNodeId)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase VECTOR_SET_ENTITY_TYPE_ROOT_ID: {\n\t\t\t\t\tif (isAnyNodeUsingVectorSet(engine, referencedNodeId)) continue\n\t\t\t\t\tengine.scheduler.process(() => {\n\t\t\t\t\t\tremoveNodeWithReference(engine.tree, referencedNodeId)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase AB_TESTS_ENTITY_TYPE_ROOT_ID:\n\t\t\t\tcase FUNNELS_ENTITY_TYPE_ROOT_ID: {\n\t\t\t\t\tengine.scheduler.process(() => {\n\t\t\t\t\t\tremoveNodeWithReference(engine.tree, referencedNodeId)\n\t\t\t\t\t\trecord(\"funnel_delete\", { funnelId: referencedNodeId })\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase CONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID:\n\t\t\t\t\tthrow new Error(\"Content management entity removal is managed by CollectionPanel\")\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(type)\n\t\t\t}\n\t\t}\n\n\t\trecord(\"entity_folder_delete\", {\n\t\t\tdepth: engine.tree.ancestors(node.id).filter(isEntityFolderNode).length,\n\t\t\tentityType: trackingTypeForRootId(type),\n\t\t})\n\n\t\tif (getIsViewOnly(engine, \"canDesign\")) return\n\n\t\tengine.scheduler.process(() => {\n\t\t\tengine.tree.remove(node.id)\n\t\t})\n\t} finally {\n\t\tengine.scheduler.process(() => engine.endUndoGroup())\n\t}\n}\n\nexport function isAnyNodeUsingVectorSet(engine: VekterEngine, nodeId: NodeID) {\n\tconst identifiers = getVectorSetIdentifiers(engine, nodeId)\n\tconst vectorSetNode = engine.tree.get(nodeId)\n\tif (isVectorSetNode(vectorSetNode)) {\n\t\tidentifiers.add(vectorSetNode.instanceIdentifier)\n\t}\n\n\tif (isExternalModuleNode(vectorSetNode)) {\n\t\tidentifiers.add(vectorSetNode.codeComponentIdentifier)\n\t}\n\n\tconst nodes = findComponentInstances(ModuleType.Vector, engine, identifiers, { findFirst: true })\n\treturn nodes.size > 0\n}\n\nexport function canDeleteVectorSetNode(engine: VekterEngine, nodeId: NodeID) {\n\tif (engine.stores.treeStore.getDataTree()) {\n\t\treturn !isAnyNodeUsingVectorSet(engine, nodeId)\n\t}\n\n\treturn engine.runWithFullyLoadedTreeAsync(() => !isAnyNodeUsingVectorSet(engine, nodeId), {\n\t\trunInBackground: true,\n\t\tname: \"canDeleteVectorSetNode: \" + nodeId,\n\t})\n}\n\nconst findInstanceOfExternalModuleNode = (\n\tengine: VekterEngine,\n\tcodeComponentIdentifier: ExternalModuleExportIdentifierString,\n): CodeComponentNode | undefined => {\n\tconst codeComponents = engine.tree.getNodes<CodeComponentNode>(engine.stores.treeStore.treeIndex.codeComponentNodeIds)\n\tconst codeComponentWithSameIdentifier = codeComponents.filter(\n\t\tnode => node.codeComponentIdentifier === codeComponentIdentifier,\n\t)\n\tif (codeComponentWithSameIdentifier.length === 0) return\n\n\tconst nonReplicaInstance = codeComponentWithSameIdentifier.find(node => !isReplicaOrReplicaChild(node))\n\tif (nonReplicaInstance) return nonReplicaInstance\n\n\tconst firstInstance = codeComponentWithSameIdentifier[0]\n\tassert(firstInstance)\n\treturn firstInstance\n}\n\nexport const canRemoveExternalModuleNode = (\n\tengine: VekterEngine,\n\tcodeComponentIdentifier: ExternalModuleExportIdentifierString,\n): boolean => {\n\tconst parsedIdentifier = parseModuleIdentifier(codeComponentIdentifier)\n\tconst bareExternalModuleIdentifier = withoutExportSpecifier(parsedIdentifier)\n\tconst externalModuleNode = engine.tree.getNodeWithTrait(bareExternalModuleIdentifier.moduleId, isExternalModuleNode)\n\n\tif (externalModuleNode?.type === ModuleType.Shader) {\n\t\tfor (const node of engine.stores.treeStore.getPartialIndexes().shaderNodes) {\n\t\t\tif (node.shaderModuleIdentifier === codeComponentIdentifier) return false\n\t\t}\n\t\treturn true\n\t}\n\n\tconst moduleComponentInstance = findInstanceOfExternalModuleNode(engine, codeComponentIdentifier)\n\tif (moduleComponentInstance) return false\n\n\tconst inUseByCMSContent = someCollectionHasModule(engine.tree, codeComponentIdentifier)\n\tif (inUseByCMSContent) return false\n\n\tconst componentPresets = getComponentPresetsForModule(engine.tree, codeComponentIdentifier)\n\tif (componentPresets.length > 0) return false\n\n\treturn true\n}\n\nexport async function deleteExternalVectorSetModule(engine: VekterEngine, vectorSetModuleId: NodeID) {\n\tif (getIsViewOnly(engine, \"canDesign\")) return\n\tconst canDelete = await canDeleteVectorSetNode(engine, vectorSetModuleId)\n\tif (!canDelete) return\n\n\tawait engine.runWithFullyLoadedTreeAsync(() => {}, { name: \"deleteExternalVectorSetModule\" })\n\tconst vectorModuleNode = engine.tree.getNodeWithTrait(vectorSetModuleId, isExternalModuleNode)\n\tif (!vectorModuleNode) return\n\n\tconst setInfo = vectorModuleNode.annotation(AnnotationKey.FramerVectorSet)\n\n\tengine.scheduler.process(() => {\n\t\tengine.deleteNode(vectorModuleNode.id)\n\t\tif (!isFramerVectorSetInfo(setInfo)) return\n\t\tengine.deleteNodes(setInfo.items.map(item => item.moduleId))\n\t})\n}\n\nexport function canDeleteLocalSmartComponentNode(engine: VekterEngine, identifier: LocalModuleExportIdentifierString) {\n\tif (engine.stores.treeStore.getDataTree()) {\n\t\tconst nodeIds = findComponentInstances(ModuleType.Canvas, engine, identifier, { findFirst: true })\n\t\treturn nodeIds.size === 0\n\t}\n\treturn engine.runWithFullyLoadedTreeAsync(\n\t\t() => {\n\t\t\tconst nodeIds = findComponentInstances(ModuleType.Canvas, engine, identifier, { findFirst: true })\n\t\t\treturn nodeIds.size === 0\n\t\t},\n\t\t{ runInBackground: true, name: \"canDeleteLocalComponent-\" + identifier },\n\t)\n}\n\nexport async function deleteLocalComponentScopeNode(engine: VekterEngine, nodeId: NodeID) {\n\tif (getIsViewOnly(engine, \"canDesign\")) return\n\n\tconst dataTree = engine.stores.treeStore.getDataTree()\n\n\tif (!dataTree) {\n\t\tawait engine.runWithFullyLoadedTreeAsync(() => {}, { name: \"deleteLocalComponentScopeNode-\" + nodeId })\n\t\tengine.scheduler.process(() => deleteLocalComponentScopeNodeFromFullyLoadedTree(engine, nodeId))\n\t\treturn\n\t}\n\tengine.scheduler.process(() => deleteLocalComponentScopeNodeFromDataTree(engine, nodeId))\n}\n\nfunction deleteLocalComponentScopeNodeFromDataTree(engine: VekterEngine, nodeId: NodeID) {\n\tconst tree = engine.stores.treeStore.getDataTreeOrLoadedTree()\n\tconst node = tree.get(nodeId)\n\tassert(node, \"Trying to delete a component scope node that doesn't exist\")\n\tif (isLayoutTemplateNode(node)) {\n\t\tconst identifier = node.instanceIdentifier\n\t\tif (tree.root.layoutTemplateIdentifier === identifier) {\n\t\t\ttree.root.set({ layoutTemplateIdentifier: undefined })\n\t\t}\n\n\t\t// If the layout template we are deleting is not the inherited template,\n\t\t// explicitly sets the layout template identifier to null so that the web\n\t\t// page doesn't inherit some other template.\n\t\tconst value =\n\t\t\tisString(tree.root.layoutTemplateIdentifier) && tree.root.layoutTemplateIdentifier !== identifier\n\t\t\t\t? null\n\t\t\t\t: undefined\n\n\t\tfor (const scope of tree.root.children) {\n\t\t\tif (!isWebPageNode(scope, true)) continue\n\t\t\tif (scope.layoutTemplateIdentifierOverride !== identifier) continue\n\t\t\tscope.set({ layoutTemplateIdentifierOverride: value })\n\t\t}\n\t}\n\n\ttriggerComponentCanvasDeleteEvent({\n\t\tcomponentId: nodeId,\n\t})\n\tengine.stores.scopeStore.removeNode(node)\n\n\tremoveReferenceForNode(tree, nodeId)\n}\n\nfunction deleteLocalComponentScopeNodeFromFullyLoadedTree(engine: VekterEngine, nodeId: NodeID) {\n\tconst node = engine.tree.get(nodeId)\n\n\tif (isLayoutTemplateNode(node)) {\n\t\tconst identifier = node.instanceIdentifier\n\t\tif (engine.tree.root.layoutTemplateIdentifier === identifier) {\n\t\t\tengine.tree.root.set({ layoutTemplateIdentifier: undefined })\n\t\t}\n\n\t\t// If the layout template we are deleting is not the inherited template,\n\t\t// explicitly sets the layout template identifier to null so that the web\n\t\t// page doesn't inherit some other template.\n\t\tconst value =\n\t\t\tisString(engine.tree.root.layoutTemplateIdentifier) && engine.tree.root.layoutTemplateIdentifier !== identifier\n\t\t\t\t? null\n\t\t\t\t: undefined\n\n\t\tfor (const scope of engine.tree.root.children) {\n\t\t\tif (!isWebPageNode(scope)) continue\n\t\t\tif (scope.layoutTemplateIdentifierOverride !== identifier) continue\n\t\t\tscope.set({ layoutTemplateIdentifierOverride: value })\n\t\t}\n\t}\n\n\ttriggerComponentCanvasDeleteEvent({\n\t\tcomponentId: nodeId,\n\t})\n\tengine.deleteNode(nodeId)\n\n\tremoveReferenceForNode(engine.tree, nodeId)\n}\n\nexport async function deleteCodeFileNode(engine: VekterEngine, nodeId: NodeID) {\n\tif (getIsViewOnly(engine, \"canDesign\")) return\n\n\tengine.scheduler.process(() => {\n\t\tconst tree = engine.stores.treeStore.getDataTreeOrPartialTree()\n\t\t// A code file might have two references, one in the code section and one in the\n\t\t// component section that represent the exported modules. We need to make sure we\n\t\t// remove all references to a code file\n\t\tremoveReferenceForNode(tree, nodeId, { isCodeFile: true })\n\t\tremoveReferenceForNode(tree, nodeId)\n\t})\n\n\ttry {\n\t\t// We must wait for the delete action to succeed in the case of\n\t\t// codeModules as there is no optimistic modulesStorage yet.\n\t\t// LocalModuleNode id is not typed as LocalModuleId but it is in fact\n\t\t// corresponding to the local id of the module to match that type.\n\t\tawait deleteCodeFileModule(engine.stores.modulesStore, nodeId as LocalModuleId)\n\t} catch (err) {\n\t\tengineLog.reportError(err)\n\t}\n}\n", "import type { ModalOpenSource } from \"@framerjs/events\"\nimport { Button, CustomModal, Spinner, Stack, Translatable as T, ThemeOverride, modalStyles } from \"@framerjs/fresco\"\nimport type { GlobalModuleId } from \"@framerjs/shared\"\nimport { localModuleIdentifier } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport { addToLibrary } from \"document/library/libraryApi.ts\"\nimport { isSmartComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport React from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { useModalThemeOnActiveView } from \"../utils/useModalTheme.ts\"\nimport * as styles from \"./AddToLibraryModal.styles.ts\"\n\nexport const openAddToLibraryModal = engine.scheduler.wrapHandler(\n\t(moduleId: GlobalModuleId, exportSpecifier: string, source: ModalOpenSource) =>\n\t\tengine.stores.modalStore.set({ type: ModalType.AddToLibrary, source, moduleId, exportSpecifier }),\n)\n\nexport function AddToLibraryModal({ moduleId, exportSpecifier, path }: ModalProps<ModalType.AddToLibrary>) {\n\tconst { scopeStore, libraryStore, modalStore } = engine.stores\n\tconst { active: activeScope } = scopeStore.useState()\n\tconst { teamLibrary } = libraryStore.useState()\n\tconst [loading, setLoading] = React.useState(false)\n\n\tconst modalThemeProps = useModalThemeOnActiveView(\"default\")\n\n\tconst handleAddToLibrary = React.useCallback(async () => {\n\t\ttry {\n\t\t\t// Should not happen since you can only trigger this modal if a module id and a team library do exist\n\t\t\t// but it's still good to cover the edge case in case something goes wrong.\n\t\t\tif (!teamLibrary) {\n\t\t\t\tthrow new Error(\"Failed to add module to library.\")\n\t\t\t}\n\t\t\tsetLoading(true)\n\t\t\tconst title = getComponentDisplayNameFromModuleId(moduleId, exportSpecifier)\n\t\t\tawait addToLibrary({\n\t\t\t\tlibraryId: teamLibrary.id,\n\t\t\t\tmoduleId,\n\t\t\t\texportSpecifier,\n\t\t\t\tpath,\n\t\t\t\ttitle,\n\t\t\t})\n\t\t\tlibraryStore.triggerUpdate()\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tkey: \"addToLibrarySuccess\",\n\t\t\t\tprimaryText: \"Added to\",\n\t\t\t\tsecondaryText: \"Workspace Library.\",\n\t\t\t})\n\t\t\tmodalStore.dismiss()\n\t\t} catch {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tkey: \"addToLibraryError\",\n\t\t\t\tprimaryText: \"Failed to add\",\n\t\t\t\tsecondaryText: \"to library.\",\n\t\t\t\ticon: \"error\",\n\t\t\t})\n\t\t} finally {\n\t\t\tsetLoading(false)\n\t\t}\n\t}, [exportSpecifier, moduleId, path, teamLibrary])\n\n\treturn (\n\t\t<CustomModal className={styles.modal} visible onDismiss={modalStore.dismiss} {...modalThemeProps}>\n\t\t\t<ThemeOverride mode={isSmartComponentNode(activeScope) && \"component\"}>\n\t\t\t\t<Stack>\n\t\t\t\t\t<div className={modalStyles.title}>Add to Workspace Library</div>\n\t\t\t\t\t<div className={modalStyles.secondaryText}>\n\t\t\t\t\t\t<T>\n\t\t\t\t\t\t\tBy adding your component to the workspace library it will appear in the Insert Menu for your workspace to\n\t\t\t\t\t\t\tuse.\n\t\t\t\t\t\t</T>{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tclassName={modalStyles.link}\n\t\t\t\t\t\t\thref=\"https://www.framer.com/help/articles/sharing-components/\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<T>{Dictionary.LearnMore}</T>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" gap={10}>\n\t\t\t\t\t\t<Button enabled={!loading} className={modalStyles.grow} onClick={modalStore.dismiss}>\n\t\t\t\t\t\t\t<T>Cancel</T>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tenabled={!loading}\n\t\t\t\t\t\t\tclassName={cx(modalStyles.grow, styles.confirmButton)}\n\t\t\t\t\t\t\tonClick={handleAddToLibrary}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loading ? <Spinner /> : <T>Add</T>}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t</Stack>\n\t\t\t</ThemeOverride>\n\t\t</CustomModal>\n\t)\n}\n\nfunction getComponentDisplayNameFromModuleId(moduleId: GlobalModuleId, exportSpecifier: string): string | undefined {\n\tconst module = engine.stores.modulesStore.getPersistedModuleByGlobalId(moduleId)\n\tif (!module) return\n\t// Attempt to get the component from the component loader.\n\tconst codeComponentIdentifier = localModuleIdentifier(module.localId, exportSpecifier).value\n\tconst entity = engine.componentLoader.componentForIdentifier(codeComponentIdentifier)\n\treturn entity?.name\n}\n", "import \"AddToLibraryModal.styles_1x4kbwf.wyw.css\"; export const modal = \"modal_m2pik8\";\nexport const confirmButton = \"confirmButton_c1iujwaq\";", "import type { ModalOpenSource } from \"@framerjs/events\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { AnnotationKey } from \"@framerjs/framer-runtime/crossorigin\"\nimport type { GlobalModuleId, LocalModuleExportIdentifierString, ModuleIdentifier } from \"@framerjs/shared\"\nimport {\n\tassert,\n\tisExternalModuleIdentifier,\n\tisLocalModuleIdentifier,\n\tisModuleExportIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { isFramerVectorSetsInfo } from \"code-generation/utils/annotations.ts\"\nimport { RenamedIds, updateNodeConnections } from \"document/components/tools/utils/updateNodeConnections.ts\"\nimport { cloneScopeNodeWithVariants } from \"document/components/unlinking/importExternalSmartComponentOrWebpage.ts\"\nimport engine from \"document/engine.ts\"\nimport type { Library } from \"document/library/libraryApi.ts\"\nimport { getLibraries } from \"document/library/libraryApi.ts\"\nimport { type CanvasTree, type NodeID, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport type { LoadedVectorSetNode } from \"document/models/CanvasTree/nodes/VectorSetNode.ts\"\nimport { duplicateEntityReferenceNode } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { moduleIdentifierToLocalComponentId } from \"document/models/CanvasTree/nodes/utils/moduleIdentifierToLocalComponentId.ts\"\nimport {\n\tisLayoutTemplateNode,\n\tisSmartComponentNode,\n\tisVectorSetNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isPrimaryVariant } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { uniqueName } from \"document/utils/uniqueName.ts\"\nimport type { PersistedModule } from \"modules/ModulesStorage.ts\"\nimport { copyImportStatement, copyImportURL } from \"utils/clipboard/helpers/copyModuleImports.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { getVectorSetIdentifiers, getVectorSetName } from \"utils/vectorSets.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport {\n\tcanDeleteLocalSmartComponentNode,\n\tcanDeleteVectorSetNode,\n\tdeleteLocalComponentScopeNode,\n} from \"../../assets/actions/delete.ts\"\nimport { openAddToLibraryModal } from \"../AddToLibraryModal.tsx\"\nimport { duplicateLayoutTemplateNode } from \"./duplicateLayoutTemplate.ts\"\n\nexport function duplicateVectorSetNode(\n\ttree: CanvasTree,\n\tcomponentLoader: ComponentLoader,\n\tvectorSet: LoadedVectorSetNode,\n) {\n\tconst renamedIds = new RenamedIds()\n\tconst newNode = vectorSet.cloneWithRenamedIds(renamedIds)\n\n\tconst names = new Set<string>()\n\n\tfor (const scope of tree.root.children) {\n\t\tif (!isVectorSetNode(scope)) continue\n\t\tconst name = scope.resolveValue(\"name\")\n\t\tif (isString(name)) names.add(name)\n\t}\n\n\tnewNode.set({\n\t\tname: uniqueName(vectorSet?.resolveValue(\"name\") ?? Dictionary.Vector, names),\n\t})\n\n\ttree.insertNode(newNode, undefined, tree.getIndex(vectorSet) + 1)\n\n\tconst vectorSetItems = newNode.getVectorSetItems()\n\n\tfor (const item of vectorSetItems) {\n\t\tupdateNodeConnections(tree, componentLoader, item, renamedIds, false)\n\t}\n\n\tvoid engine.stores.codeGenerationStore.createVectorSet(vectorSetItems)\n\n\tduplicateEntityReferenceNode(engine, vectorSet.id, newNode.id)\n\n\trecord(\"vector_set_create\", { source: \"duplicate\", items: newNode.getVectorSetItems().length })\n\n\treturn newNode\n}\n\nexport function getProjectComponentMenuItems({\n\tcomponentIdentifier,\n\tisViewOnly,\n\tlocalComponentNameByIdentifier,\n\twithDeselectItem = (fn: () => void) => () => {\n\t\tfn()\n\t},\n}: {\n\tcomponentIdentifier: string\n\tlocalComponentNameByIdentifier: Record<LocalModuleExportIdentifierString, string | null>\n\tisViewOnly: boolean\n\twithDeselectItem?: (fn: () => void) => () => void\n}) {\n\tif (!(componentIdentifier in localComponentNameByIdentifier)) return []\n\tconst componentNodeId = moduleIdentifierToLocalComponentId(componentIdentifier)\n\n\t// Only allow deleting and duplicating canvas components that have local component nodes.\n\tif (!componentNodeId) return []\n\n\tconst enabled = !isViewOnly && componentIdentifier in localComponentNameByIdentifier\n\tconst isLocalModuleExportIdentifier =\n\t\tisLocalModuleIdentifier(componentIdentifier) && isModuleExportIdentifier(componentIdentifier)\n\n\tconst deleteEnabled =\n\t\tisViewOnly || !isLocalModuleExportIdentifier\n\t\t\t? false\n\t\t\t: () => {\n\t\t\t\t\tconst node = engine.tree.getNode(componentNodeId)\n\t\t\t\t\treturn isVectorSetNode(node)\n\t\t\t\t\t\t? canDeleteVectorSetNode(engine, componentNodeId)\n\t\t\t\t\t\t: canDeleteLocalSmartComponentNode(engine, componentIdentifier)\n\t\t\t\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: Dictionary.Rename,\n\t\t\tenabled,\n\t\t\t// The click action is assigned by the UI (AssetsRow or BreadcrumbItem)\n\t\t},\n\t\t{\n\t\t\tlabel: Dictionary.Duplicate,\n\t\t\tclick: withDeselectItem(() => {\n\t\t\t\tconst node = engine.tree.getNode(componentNodeId)\n\t\t\t\tassert(isScopeNode(node) && node.isLoaded(), \"Current breadcrumb scope must be loaded\")\n\n\t\t\t\tif (isLayoutTemplateNode(node)) {\n\t\t\t\t\tconst newNode = duplicateLayoutTemplateNode(engine.tree, engine.componentLoader, node)\n\t\t\t\t\tengine.stores.scopeStore.select(newNode.id, { keepHistory: false })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (isVectorSetNode(node)) {\n\t\t\t\t\tconst newNode = duplicateVectorSetNode(engine.tree, engine.componentLoader, node)\n\t\t\t\t\tengine.stores.scopeStore.select(newNode.id, { keepHistory: false })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (!isSmartComponentNode(node)) return\n\t\t\t\tconst primaryVariant = engine.tree.getNode(node.baseVariantId)\n\t\t\t\tif (!primaryVariant || !isPrimaryVariant(primaryVariant)) return\n\n\t\t\t\tcloneScopeNodeWithVariants(engine, node, primaryVariant, \"duplicate\", {\n\t\t\t\t\tintrinsicSize: engine.tree.getRect(primaryVariant),\n\t\t\t\t})\n\t\t\t}),\n\t\t\tenabled,\n\t\t},\n\t\t{\n\t\t\tlabel: Dictionary.Find,\n\t\t\tenabled,\n\t\t\tvisible: supportsFind(engine.tree, componentNodeId),\n\t\t\tclick: () => {\n\t\t\t\tconst node = engine.tree.getNode(componentNodeId)\n\t\t\t\tif (!node) return\n\n\t\t\t\tengine.stores.modalStore.set({\n\t\t\t\t\ttype: ModalType.QuickActions,\n\t\t\t\t\tsource: \"components_panel\",\n\t\t\t\t\tinitialCategory: {\n\t\t\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\t\t\toptions: isVectorSetNode(node)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: FindNodesType.VectorSet,\n\t\t\t\t\t\t\t\t\ttitle: getVectorSetName(node),\n\t\t\t\t\t\t\t\t\tcomponentIdentifier: getVectorSetIdentifiers(engine, componentNodeId),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\ttype: FindNodesType.CodeComponent,\n\t\t\t\t\t\t\t\t\ttitle: node.resolveValue(\"name\") ?? Dictionary.Unknown,\n\t\t\t\t\t\t\t\t\tcomponentIdentifier: componentIdentifier,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: Dictionary.Delete,\n\t\t\tclick: withDeselectItem(() => deleteLocalComponentScopeNode(engine, componentNodeId)),\n\t\t\tenabled: deleteEnabled,\n\t\t},\n\t]\n}\n\nfunction supportsFind(tree: CanvasTree, componentNodeId: NodeID) {\n\tconst node = tree.getNode(componentNodeId)\n\tif (!node) return false\n\treturn isVectorSetNode(node) || isSmartComponentNode(node)\n}\n\nexport function getModuleContextMenuItems({\n\tcomponentIdentifier,\n\tteamLibrary,\n\tisViewOnly,\n\tsource,\n}: {\n\tcomponentIdentifier: string | undefined\n\tteamLibrary: Library | undefined\n\tisViewOnly: boolean\n\tsource: ModalOpenSource\n}): MenuItemOptions[] {\n\tconst moduleIdentifier = parseModuleIdentifier(componentIdentifier)\n\tconst exportSpecifier = isModuleExportIdentifier(moduleIdentifier) ? moduleIdentifier.exportSpecifier : \"default\"\n\n\tconst persistedModule = engine.stores.modulesStore.getPersistedModuleByLocalIdentifier(componentIdentifier)\n\tconst hasDefaultExport = persistedModule?.exports.includes(\"default\")\n\tconst items: MenuItemOptions[] = []\n\n\tif (hasDefaultExport) {\n\t\titems.push(\n\t\t\tbuildComponentMenuLibraryItems(moduleIdentifier, {\n\t\t\t\tteamLibrary,\n\t\t\t\tpersistedModule,\n\t\t\t\tisViewOnly,\n\t\t\t\texportSpecifier,\n\t\t\t\tsource,\n\t\t\t}),\n\t\t)\n\t}\n\n\tconst parsed = parseModuleIdentifier(componentIdentifier)\n\n\tconst annotation = isLocalModuleIdentifier(parsed)\n\t\t? engine.stores.modulesStore.forType(parsed.type).getByLocalId(parsed.localId)?.annotations(null, \"default\")?.[\n\t\t\t\tAnnotationKey.FramerVectorSets\n\t\t\t]\n\t\t: undefined\n\n\t// We can't copy url/imports for smart components with vector sets controls.\n\tif (persistedModule && !isFramerVectorSetsInfo(annotation)) {\n\t\tconst moduleItems = [\n\t\t\t{\n\t\t\t\tlabel: Dictionary.CopyImport,\n\t\t\t\tclick: () => {\n\t\t\t\t\tcopyImportStatement(engine, componentIdentifier)\n\t\t\t\t\trecord(\"ui_interaction\", {\n\t\t\t\t\t\tid: UIInteraction.copyImportStatement,\n\t\t\t\t\t\tpage: Pages.assetsContextMenu,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Dictionary.CopyUrl,\n\t\t\t\tclick: () => {\n\t\t\t\t\tcopyImportURL(engine, componentIdentifier)\n\t\t\t\t\trecord(\"ui_interaction\", { id: UIInteraction.copyImportURL, page: Pages.assetsContextMenu })\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\titems.push(...moduleItems)\n\t}\n\n\treturn items\n}\n\ninterface BuildLibrarySubmenuItemsOptions {\n\tteamLibrary: Library | undefined\n\tpersistedModule: PersistedModule | undefined\n\tisViewOnly: boolean\n\texportSpecifier: string\n\tsource: ModalOpenSource\n}\n\nfunction buildComponentMenuLibraryItems(\n\tmoduleIdentifier: ModuleIdentifier | undefined,\n\toptions: BuildLibrarySubmenuItemsOptions,\n): MenuItemOptions {\n\tconst { teamLibrary, persistedModule, exportSpecifier, isViewOnly, source } = options\n\n\t// An external module might not have the persisted module in the store, so we need to treat external ones\n\t// differently. Without the moduleId, the getLibraries API will return all the libraries within the team, regardless\n\t// of which team the module we're querying actually belongs to.\n\tconst moduleId = isExternalModuleIdentifier(moduleIdentifier) ? moduleIdentifier?.moduleId : persistedModule?.id\n\n\tconst libraryItems: MenuItemOptions[] = []\n\n\tlibraryItems.push({\n\t\tlabel: Dictionary.Add,\n\t\tenabled: async () => {\n\t\t\tconst librariesContainingModule = teamLibrary\n\t\t\t\t? await getLibraries({ teamId: teamLibrary.ownerTeamId, moduleId })\n\t\t\t\t: undefined\n\t\t\tconst isInLibrary = Boolean(librariesContainingModule?.length)\n\n\t\t\t// At this time we only allow sharing of default exports. this is to prevent breaking of library exports due to renames of the export specifiers. This is specifically relevant for code files.\n\t\t\tconst isLocalModuleWithDefaultExport = isLocalModuleIdentifier(moduleIdentifier) && exportSpecifier === \"default\"\n\n\t\t\tconst isShareableLocalModule = isLocalModuleWithDefaultExport && !!persistedModule\n\n\t\t\tconst canAddToLibrary = isShareableLocalModule && !isInLibrary\n\t\t\treturn canAddToLibrary && !isViewOnly && Boolean(teamLibrary?.permissions.canEdit)\n\t\t},\n\t\tclick: () => {\n\t\t\tif (!persistedModule) return\n\t\t\topenAddToLibraryModal(persistedModule.id, exportSpecifier, source)\n\t\t},\n\t})\n\n\tlibraryItems.push({\n\t\tlabel: Dictionary.Remove,\n\t\tenabled: async () => {\n\t\t\tconst librariesContainingModule = teamLibrary\n\t\t\t\t? await getLibraries({ teamId: teamLibrary.ownerTeamId, moduleId })\n\t\t\t\t: undefined\n\t\t\tconst isInLibrary = Boolean(librariesContainingModule?.length)\n\n\t\t\tconst canRemoveFromLibrary = !!moduleId && isInLibrary\n\t\t\treturn canRemoveFromLibrary && Boolean(teamLibrary?.permissions.canEdit)\n\t\t},\n\t\tclick: () => {\n\t\t\tif (!moduleId) return\n\t\t\tengine.stores.modalStore.set({\n\t\t\t\ttype: ModalType.RemoveTeamLibraryModule,\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tengine.stores.modalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tonConfirm: async () => {\n\t\t\t\t\tawait confirmRemoveFromLibrary(moduleId, exportSpecifier)\n\t\t\t\t\tengine.stores.modalStore.dismiss()\n\t\t\t\t},\n\t\t\t\tsource: \"context_menu\",\n\t\t\t})\n\t\t},\n\t})\n\n\treturn {\n\t\tlabel: Dictionary.Library,\n\t\tsubmenu: libraryItems,\n\t}\n}\n\nconst confirmRemoveFromLibrary = async (globalModuleId: GlobalModuleId, exportSpecifier: string) => {\n\ttry {\n\t\tawait engine.stores.libraryStore.removeFromLibrary(globalModuleId, exportSpecifier)\n\t} catch (_err) {\n\t\ttoast({\n\t\t\ttype: \"add\",\n\t\t\tvariant: \"error\",\n\t\t\tprimaryText: \"Failed to remove component\",\n\t\t\tsecondaryText: \"from library.\",\n\t\t\tkey: `${globalModuleId}-remove-from-library`,\n\t\t\ticon: \"error\",\n\t\t\tshowCloseButton: \"never\",\n\t\t})\n\t}\n}\n", "import \"panelMultiSelect.styles_h6i6ju.wyw.css\"; export const selectedSibling = \"selectedSibling_s19ww6iw\";", "import { assert } from \"@framerjs/shared\"\nimport { updateInsertedVariantNode } from \"code-generation/utils/variantEditingHelpers.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { candidateForMaster } from \"document/components/canvas/CanvasDropZone.tsx\"\nimport { getParentForInsertNode } from \"document/components/utils/getParentForInsertNode.ts\"\nimport { preserveOriginalFractionOrRelativeSize } from \"document/components/utils/insertComponent.ts\"\nimport { setDimensionTypeAutoIfSupported } from \"document/components/utils/setDimensionTypeAutoIfSupported.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isStackComponent } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport {\n\tgetFloatingPositionProps,\n\twithFloatingPosition,\n} from \"document/models/CanvasTree/traits/WithFloatingPosition.ts\"\nimport { isPinnable } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport { withSize } from \"document/models/CanvasTree/traits/WithSize.ts\"\nimport { isMaster, isReplicaOrReplicaChild } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { isReplicaVariantOrReplicaVariantChild } from \"document/models/CanvasTree/traits/WithVariant.ts\"\nimport { convertFrameToCanvas } from \"document/models/CanvasTree/utils/geometry.ts\"\nimport { guessConstrainedFrame } from \"document/models/ConstraintSolver.ts\"\nimport { shouldGuessPinToBottom } from \"document/models/shouldGuessPinToBottom.ts\"\nimport { shouldGuessPinToRight } from \"document/models/shouldGuessPinToRight.ts\"\nimport { Rect } from \"library/render/types/Rect.ts\"\n\nexport function insertCanvasNode({\n\tvekterEngine,\n\tcomponent,\n}: {\n\tvekterEngine: VekterEngine\n\tcomponent: CanvasNode\n}): NodeID {\n\tconst parent = getParentForInsertNode(component, vekterEngine)\n\tconst center = vekterEngine.stores.canvasStore.getCanvasCenter()\n\n\t// If this is a design component, make sure to insert the master in the tree, but hidden\n\tif (isMaster(component)) {\n\t\tcomponent = candidateForMaster(component, vekterEngine) || component\n\t}\n\n\tconst clone = vekterEngine.cloneNode(component)\n\tconst { width, height } = vekterEngine.tree.getRect(clone)\n\tconst parentRect = parent ? vekterEngine.tree.getRect(parent) : null\n\n\tconst parentOrCanvasCenter = {\n\t\tx: parentRect ? parentRect.width / 2 : center.x,\n\t\ty: parentRect ? parentRect.height / 2 : center.y,\n\t}\n\tconst rect: Rect = {\n\t\theight,\n\t\twidth,\n\t\tx: parentOrCanvasCenter.x - width / 2,\n\t\ty: parentOrCanvasCenter.y - height / 2,\n\t}\n\n\tlet update = clone.updateForRect({\n\t\trect,\n\t\tparentSizeInfo: null,\n\t\tconstraintsLocked: false,\n\t\tshouldGuessPinToBottom: true,\n\t\tshouldGuessPinToRight: shouldGuessPinToRight(vekterEngine.tree, null, parent),\n\t})\n\tlet idToSelect = clone.id\n\tlet insertIntoReplicaVariant: boolean = false\n\tlet originalParent: CanvasNode | null = null\n\tif (parent && parentRect) {\n\t\toriginalParent = parent\n\n\t\tif (isReplicaVariantOrReplicaVariantChild(parent)) {\n\t\t\toriginalParent = vekterEngine.tree.getNode(parent.originalid)\n\t\t\tassert(originalParent, \"Fail to insert node into variants: the original parent should exist\")\n\t\t\tinsertIntoReplicaVariant = true\n\t\t}\n\n\t\tvekterEngine.moveNode(clone.id, originalParent?.id)\n\t\tif (insertIntoReplicaVariant) {\n\t\t\tassert(\n\t\t\t\tisReplicaOrReplicaChild(parent),\n\t\t\t\t\"Fail to insert node into variants: the new parent should be a replica node\",\n\t\t\t)\n\t\t\tidToSelect = updateInsertedVariantNode(vekterEngine, clone, parent, originalParent)\n\t\t}\n\n\t\tif (isStackComponent(parent) && withSize(clone) && isPinnable(clone)) {\n\t\t\tupdate = preserveOriginalFractionOrRelativeSize(clone, update)\n\t\t}\n\n\t\tconst constraintProps = guessConstrainedFrame(\n\t\t\trect,\n\t\t\tvekterEngine.tree.getParentSizeInfo(clone, parent),\n\t\t\twithFloatingPosition(component) ? getFloatingPositionProps(component) : null,\n\t\t\t{\n\t\t\t\tshouldGuessPinToBottom: shouldGuessPinToBottom(vekterEngine.tree, null, originalParent),\n\t\t\t\tshouldGuessPinToRight: shouldGuessPinToRight(vekterEngine.tree, null, parent),\n\t\t\t},\n\t\t)\n\t\tupdate = {\n\t\t\t...update,\n\t\t\t...constraintProps,\n\t\t}\n\t}\n\n\tsetDimensionTypeAutoIfSupported(vekterEngine.componentLoader, component, update)\n\n\tclone.set(update)\n\n\t// Select and center the new node.\n\tengine.stores.selectionStore.set(idToSelect, { switchToProperties: true })\n\n\tif (parent) {\n\t\tconst canvasRect = convertFrameToCanvas(engine.tree, parent, rect)\n\t\tengine.stores.canvasStore.scrollToCenter(Rect.center(canvasRect))\n\t}\n\n\treturn idToSelect\n}\n", "import type { ModalOpenSource } from \"@framerjs/framer-events\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { AnalyticsScopeNode, type NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { buildEntityReferenceNodeId } from \"document/models/CanvasTree/nodes/EntityReferenceNode.ts\"\nimport { createReferenceAlways } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { AnalyticsTabNames } from \"document/stores/AnalyticsStore.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { expandAssetEntityItems } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { addAbVariant } from \"./addAbVariant.ts\"\nimport { configureAbTest } from \"./configureAbTest.ts\"\n\ninterface PromptCreateAbTestOptions {\n\t/** Optional folder ID to place the A/B test reference inside */\n\tparentFolderId: NodeID | undefined\n}\n\nexport function promptCreateAbTest(engine: VekterEngine, source: ModalOpenSource, options?: PromptCreateAbTestOptions) {\n\tconst { parentFolderId } = options ?? {}\n\n\tconst onConfirm = engine.scheduler.wrapHandler((selectedPageId: NodeID) => {\n\t\tconst selectedPage = engine.tree.get(selectedPageId)\n\t\tif (!isWebPageNode(selectedPage)) return\n\n\t\tconst alreadyHasVariants = selectedPage.hasAbTestingChildren(engine.tree)\n\t\tif (alreadyHasVariants) {\n\t\t\tconst analyticsScope = AnalyticsScopeNode.ensure(engine.tree)\n\t\t\tengine.loadScopesThenProcess([analyticsScope], ([loadedAnalyticsScope]) => {\n\t\t\t\tif (!loadedAnalyticsScope) return\n\t\t\t\tconst id = configureAbTest(engine, selectedPageId, loadedAnalyticsScope)\n\t\t\t\tif (id && parentFolderId) {\n\t\t\t\t\tconst referenceId = buildEntityReferenceNodeId(id)\n\t\t\t\t\tconst referenceNode = engine.tree.get(referenceId)\n\t\t\t\t\tif (referenceNode) {\n\t\t\t\t\t\tengine.tree.moveNode(referenceNode, parentFolderId)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcreateReferenceAlways(engine.tree, parentFolderId, id)\n\t\t\t\t\t}\n\t\t\t\t\texpandAssetEntityItems(engine, parentFolderId, false)\n\t\t\t\t}\n\t\t\t\tengine.scheduler.runBeforeNextFrame(() =>\n\t\t\t\t\tengine.stores.analyticsStore.open(id ? { tab: AnalyticsTabNames.abtest, id } : undefined),\n\t\t\t\t)\n\t\t\t})\n\t\t} else {\n\t\t\tengine.loadScopesThenProcess([selectedPage], ([selectedPageNode]) => {\n\t\t\t\tif (!selectedPageNode) return\n\t\t\t\tengine.stores.analyticsStore.close()\n\t\t\t\taddAbVariant(engine, selectedPageNode, parentFolderId) // this will open the variant\n\t\t\t})\n\t\t}\n\t})\n\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.CreateAbTest,\n\t\tsource,\n\t\tonConfirm,\n\t})\n}\n", "import type { ModalOpenSource } from \"@framerjs/framer-events\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { AB_TESTS_ENTITY_TYPE_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { promptCreateAbTest } from \"../../analytics/utils/promptCreateAbTest.ts\"\nimport { showAbTestUpsell } from \"../../shared/UpsellModal/utils/abTestUpsellModals.ts\"\nimport { showAnalyticsEventsUpsell } from \"../../shared/UpsellModal/utils/analyticsEventsUpsellModals.ts\"\n\nexport function createAbTest(\n\tvekterEngine: VekterEngine,\n\tsource: ModalOpenSource,\n\tparentId: NodeID = AB_TESTS_ENTITY_TYPE_ROOT_ID,\n) {\n\tif (showAbTestUpsell(vekterEngine, source, { isAddingTest: true })) return\n\tif (showAnalyticsEventsUpsell(vekterEngine, source)) return\n\tpromptCreateAbTest(vekterEngine, source, { parentFolderId: parentId })\n}\n", "import { AddOnLicenseType, ProjectLicenseType, getAddOnLicenseTypeName, openNewTab } from \"@framerjs/app-shared\"\nimport type { ModalOpenSource } from \"@framerjs/framer-events\"\nimport { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { UpsellFeature } from \"document/components/chrome/siteSettings/Plans/Stripe/utils/upsell.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { enterpriseUpsellURL } from \"utils/staticURLs.ts\"\n\n/**\n * Shows the funnel upsell modal if the user cannot use funnels.\n * Returns true if an upsell modal was shown, false otherwise.\n */\nexport function showFunnelUpsell(engine: VekterEngine, source: ModalOpenSource): boolean {\n\tassert(engine.stores.projectStore.project, \"Project should be defined\")\n\tconst { settings, usage, license } = engine.stores.projectStore.project\n\n\tconst canUseFunnels = settings.featureFlags.canUseFunnels ?? \"off\"\n\n\t// Feature is available, no upsell needed\n\tif (canUseFunnels === \"on\") {\n\t\treturn false\n\t}\n\n\t// Enterprise users that are over their limit should contact support\n\t// Note: this is not possible, but we handle this here in case we\u2019ve\n\t// accidentally misconfigured license overrides for the Enterprise plan.\n\tconst isEnterprise = license.type === ProjectLicenseType.EnterpriseSite\n\tif (isEnterprise) {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.Confirmation,\n\t\t\ttitle: \"Conversion Funnels\",\n\t\t\tdescription:\n\t\t\t\t\"Funnels aren\u2019t included in your current plan. Please contact your account manager to enable this feature.\",\n\t\t\tsource,\n\t\t\tconfirmLabel: Dictionary.ContactUs,\n\t\t\tcancelLabel: Dictionary.MaybeLater,\n\t\t\tonConfirm: () => openNewTab(enterpriseUpsellURL),\n\t\t})\n\t\treturn true\n\t}\n\n\tconst addOnName = getAddOnLicenseTypeName(AddOnLicenseType.AdvancedAnalytics)\n\n\t// User can buy an add-on to unlock funnels\n\tif (canUseFunnels === \"upsell\") {\n\t\tconst eventsUsage = Math.max(\n\t\t\tusage.advancedAnalytics?.currentMonth ?? 0,\n\t\t\tusage.advancedAnalytics?.previousMonth ?? 0,\n\t\t\t1,\n\t\t)\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.ConfirmAcquireAddOn,\n\t\t\ttitle: \"Funnels\",\n\t\t\tdescription: `Buy the ${addOnName} ${Dictionary.AddOn} to run A/B tests, add triggers and funnels, and boost your overall conversion rates.`,\n\t\t\taddonInfo: {\n\t\t\t\taddonLicenseType: AddOnLicenseType.AdvancedAnalytics,\n\t\t\t\tquantity: eventsUsage,\n\t\t\t},\n\t\t\tsource,\n\t\t})\n\t\treturn true\n\t}\n\n\t// User needs to be on a different plan\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.UpsellFeature,\n\t\tupsellFeature: UpsellFeature.canUseFunnels,\n\t\ttitle: \"Funnels\",\n\t\tdescription: `Upgrade and buy the ${addOnName} ${Dictionary.AddOn} to run A/B tests, add triggers and funnels, and boost conversion rates.`,\n\t\tsource,\n\t})\n\treturn true\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { AnalyticsScopeNode } from \"document/models/CanvasTree/nodes/AnalyticsScopeNode.ts\"\nimport { FUNNELS_ENTITY_TYPE_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { FunnelNode } from \"document/models/CanvasTree/nodes/FunnelNode.ts\"\nimport { FunnelStepActionNode } from \"document/models/CanvasTree/nodes/FunnelStepActionNode.ts\"\nimport { FunnelStepNode } from \"document/models/CanvasTree/nodes/FunnelStepNode.ts\"\nimport { createReferenceAlways } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isFunnelNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { AnalyticsTabNames } from \"document/stores/AnalyticsStore.ts\"\nimport { uniqueName } from \"document/utils/uniqueName.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { renameEntity } from \"../../assets/actions/rename.ts\"\nimport { expandAssetEntityItems } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { showAnalyticsEventsUpsell } from \"../../shared/UpsellModal/utils/analyticsEventsUpsellModals.ts\"\nimport { showFunnelUpsell } from \"../../shared/UpsellModal/utils/funnelUpsellModals.ts\"\n\nexport function createFunnel(vekterEngine: VekterEngine, parentId: NodeID = FUNNELS_ENTITY_TYPE_ROOT_ID) {\n\tif (showFunnelUpsell(vekterEngine, \"analytics_sidebar\")) return\n\tif (showAnalyticsEventsUpsell(vekterEngine, \"analytics_sidebar\")) return\n\n\tvekterEngine.scheduler.processWhenReady(() => {\n\t\tconst analyticsScope = AnalyticsScopeNode.ensure(vekterEngine.tree)\n\t\tassert(analyticsScope.isLoaded(), \"AnalyticsScopeNode should be loaded\")\n\n\t\t// Generate Unique Name\n\t\tconst existingNames = new Set(\n\t\t\tanalyticsScope.children.map((c: FunnelNode) => isFunnelNode(c) && c.resolveValue(\"name\")).filter(isString),\n\t\t)\n\t\tconst funnelName = uniqueName(Dictionary.Funnel, existingNames)\n\n\t\t// Create the Node Structure\n\t\tconst newFunnel = new FunnelNode({ name: funnelName })\n\t\tconst newStep = new FunnelStepNode()\n\t\tconst newAction = new FunnelStepActionNode({ trackingEventType: \"pageview\" })\n\t\tnewStep.addChild(newAction)\n\t\tnewFunnel.addChild(newStep)\n\n\t\t// Insert into Document\n\t\tvekterEngine.tree.insertNode(newFunnel, analyticsScope.id)\n\n\t\t// Create the Assets Panel Reference\n\t\tcreateReferenceAlways(vekterEngine.tree, parentId, newFunnel.id)\n\n\t\t// Handle UI State\n\t\tif (parentId !== FUNNELS_ENTITY_TYPE_ROOT_ID) {\n\t\t\texpandAssetEntityItems(vekterEngine, parentId, false)\n\t\t}\n\n\t\t// Analytics\n\t\trecord(\"funnel_create\", { funnelId: newFunnel.id })\n\t\trecord(\"funnel_step_create\", {\n\t\t\tfunnelId: newFunnel.id,\n\t\t\tstepId: newStep.id,\n\t\t\teventType: \"pageview\",\n\t\t\tactionCount: 0,\n\t\t})\n\n\t\t// Navigation and Rename\n\t\tvoid vekterEngine.stores.analyticsStore.setActiveTab({ tab: AnalyticsTabNames.funnel, id: newFunnel.id })\n\t\tvekterEngine.scheduler.runAtEndOfFrame(() => {\n\t\t\trenameEntity(newFunnel.id, false)\n\t\t})\n\t})\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { EntityFolderNode } from \"document/models/CanvasTree/nodes/EntityFolderNode.ts\"\nimport type { EntityReferenceNode } from \"document/models/CanvasTree/nodes/EntityReferenceNode.ts\"\nimport {\n\tAB_TESTS_ENTITY_TYPE_ROOT_ID,\n\tCODE_FILE_ENTITY_TYPE_ROOT_ID,\n\tCOMPONENTS_ENTITY_TYPE_ROOT_ID,\n\ttype EntityTypeRootId,\n\ttype EntityTypeRootNode,\n\tFUNNELS_ENTITY_TYPE_ROOT_ID,\n\tisEntityTypeRootNodeId,\n} from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { isValidEntityParentNode } from \"document/models/CanvasTree/nodes/utils/entityFolderNode.ts\"\nimport { entityRootTypeIdForEntityNode } from \"document/models/CanvasTree/nodes/utils/entityTypeRootNode.ts\"\nimport { isEntityFolderNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getNameFromPath } from \"document/utils/assetPath.ts\"\nimport { referenceUnreferencedNodesByTypeRoot } from \"./utils.ts\"\n\nfunction sortDescendantsAlphabetically(\n\tengine: VekterEngine,\n\tnode: EntityTypeRootNode | EntityFolderNode,\n\tentityTypeRootId: EntityTypeRootId,\n) {\n\tif (node.children.length === 0) return\n\n\tconst sortedChildren = [...node.children].sort((a, b) =>\n\t\tgetDisplayName(a, entityTypeRootId).localeCompare(getDisplayName(b, entityTypeRootId)),\n\t)\n\n\tsortedChildren.forEach((child, index) => {\n\t\tengine.tree.moveNode(child, node.id, index)\n\t\tif (isEntityFolderNode(child)) sortDescendantsAlphabetically(engine, child, entityTypeRootId)\n\t})\n}\n\nfunction getDisplayName(node: EntityReferenceNode | EntityFolderNode, entityTypeRootId: EntityTypeRootId) {\n\tif (\n\t\t!isEntityFolderNode(node) &&\n\t\t(entityTypeRootId === CODE_FILE_ENTITY_TYPE_ROOT_ID || entityTypeRootId === COMPONENTS_ENTITY_TYPE_ROOT_ID)\n\t) {\n\t\treturn getNameFromPath(node.getName())\n\t}\n\n\treturn node.getName()\n}\n\n/**\n * Sorts the descendants of an entity type root or entity folder alphabetically.\n */\nexport function sortEntityAssetsAlphabetically(engine: VekterEngine, folderId: NodeID) {\n\tconst isEntityTypeRootNode = isEntityTypeRootNodeId(folderId)\n\n\t// Skip referenceUnreferencedNodesByTypeRoot for analytics types since they use eager reference creation\n\tconst isAnalyticsType = folderId === FUNNELS_ENTITY_TYPE_ROOT_ID || folderId === AB_TESTS_ENTITY_TYPE_ROOT_ID\n\tif (isEntityTypeRootNode && !isAnalyticsType) {\n\t\treferenceUnreferencedNodesByTypeRoot(engine, folderId)\n\t}\n\n\tconst folderNode = engine.tree.getNode(folderId)\n\tif (!folderNode || !isValidEntityParentNode(folderNode)) return\n\n\tconst entityTypeRootId = isEntityTypeRootNode ? folderId : entityRootTypeIdForEntityNode(folderNode)\n\n\tsortDescendantsAlphabetically(engine, folderNode, entityTypeRootId)\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { CanvasTree, NodeID, CodeComponentNode } from \"document/models/CanvasTree/index.ts\"\nimport type { EntityFolderNode } from \"document/models/CanvasTree/nodes/EntityFolderNode.ts\"\nimport { isLocalModuleNode } from \"document/models/CanvasTree/nodes/LocalModuleNode.ts\"\nimport type { RichTextNode } from \"document/models/CanvasTree/nodes/RichTextNode.ts\"\nimport { isStylePresetNode } from \"document/models/CanvasTree/nodes/utils/isStylePresetNode.ts\"\nimport {\n\tisEntityFolderNode,\n\tisSmartComponentNode,\n\tisVectorSetNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { someCollectionHasModule } from \"utils/collectionUtils.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { isAnyNodeUsingVectorSet } from \"../actions/delete.ts\"\nimport type { ModuleInfo } from \"./getExportedModulesMap.ts\"\n\n/**\n * Checks whether the entity folder node can be deleted. This is done by checking\n * if any of the children of the entity folder node are in use.\n */\nexport function canDeleteEntityFolderNode(\n\tnode: EntityFolderNode,\n\tengine: VekterEngine,\n\tmodules: readonly ModuleInfo[] | undefined,\n): boolean {\n\tconst treeStore = engine.stores.treeStore\n\n\tconst tree = treeStore.getDataTreeOrPartialTree()\n\tif (!tree.isLoaded()) return false\n\n\tconst codeComponentIdentifiers = treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.whereClassName<CodeComponentNode>(ClassDiscriminator.CodeComponentNode)\n\t\t.asArray()\n\t\t.map(codeComponent => codeComponent.codeComponentIdentifier)\n\tconst richTextNodes = treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.whereClassName<RichTextNode>(ClassDiscriminator.RichTextNode)\n\t\t.asArray()\n\tconst moduleIdentifiers = new Set(modules?.map(module => module.moduleIdentifier))\n\n\treturn canDeleteEntityFolderNodeInTree(\n\t\tnode.id,\n\t\ttree,\n\t\tengine,\n\t\tcodeComponentIdentifiers,\n\t\trichTextNodes,\n\t\tmoduleIdentifiers,\n\t)\n}\n\nfunction canDeleteEntityFolderNodeInTree(\n\tnodeId: NodeID,\n\ttree: CanvasTree,\n\tengine: VekterEngine,\n\tcodeComponentIdentifiers: string[],\n\trichTextNodes: RichTextNode[],\n\tmoduleIdentifiers: Set<string>,\n): boolean {\n\tconst node = tree.get(nodeId)\n\tif (!node || !isEntityFolderNode(node)) return true\n\n\tfor (const child of node.children) {\n\t\tif (isEntityFolderNode(child)) {\n\t\t\tif (\n\t\t\t\t!canDeleteEntityFolderNodeInTree(\n\t\t\t\t\tchild.id,\n\t\t\t\t\ttree,\n\t\t\t\t\tengine,\n\t\t\t\t\tcodeComponentIdentifiers,\n\t\t\t\t\trichTextNodes,\n\t\t\t\t\tmoduleIdentifiers,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tconst referencedNode = tree.get(child.referenceId)\n\t\tif (!referencedNode) continue\n\n\t\tif (isStylePresetNode(referencedNode)) {\n\t\t\tfor (const richTextNode of richTextNodes) {\n\t\t\t\tconst usedPresetIds = richTextNode.getStylePresetIdsForCodeGeneration()\n\t\t\t\tif (usedPresetIds.has(referencedNode.id)) return false\n\t\t\t}\n\t\t} else if (isSmartComponentNode(referencedNode)) {\n\t\t\tconst identifier = referencedNode.instanceIdentifier\n\t\t\tif (someCollectionHasModule(tree, identifier)) return false\n\n\t\t\tconst moduleInUse = codeComponentIdentifiers.some(\n\t\t\t\tcodeComponentIdentifier => codeComponentIdentifier === identifier,\n\t\t\t)\n\n\t\t\tif (moduleInUse) return false\n\t\t} else if (isLocalModuleNode(referencedNode)) {\n\t\t\tconst moduleInUse = codeComponentIdentifiers.some(codeComponentIdentifier =>\n\t\t\t\tmoduleIdentifiers.has(codeComponentIdentifier),\n\t\t\t)\n\t\t\tif (moduleInUse) return false\n\t\t} else if (isVectorSetNode(referencedNode)) {\n\t\t\tif (isAnyNodeUsingVectorSet(engine, referencedNode.id)) return false\n\t\t}\n\t}\n\treturn true\n}\n", "import type { ModalOpenSource } from \"@framerjs/events\"\nimport { IconPage, IconSidebarCollection, IconWebPageHome } from \"@framerjs/fresco\"\nimport { assert, unhandledError } from \"@framerjs/shared\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { MetricsInteractionViews } from \"app/metrics.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { enumerate } from \"document/components/utils/enumerate.tsx\"\nimport { getWebPageDisplayTitle } from \"document/components/utils/webPageTitles.ts\"\nimport {\n\ttype CollectionNode,\n\ttype LoadedContentManagementNode,\n\ttype LoadedWebPageNode,\n\ttype NodeID,\n\tWebPageNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { getContentManagementNode } from \"document/models/CanvasTree/nodes/ContentManagementNode.utils.ts\"\nimport { buildEntityReferenceNodeId } from \"document/models/CanvasTree/nodes/EntityReferenceNode.ts\"\nimport { trackingTypeForRootId } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { entityRootTypeIdForEntityNode } from \"document/models/CanvasTree/nodes/utils/entityTypeRootNode.ts\"\nimport {\n\tisCollectionNode,\n\tisDataRepeater,\n\tisEntityFolderNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isAnyCollectionReferencingVariableDefinition } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport pluralize from \"pluralize\"\nimport { getCollectionData } from \"utils/collectionUtils.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { getEmptyFolderIds, getFolderAndReferencedIdsForSelection } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { ButtonSheet, ButtonSheetItem } from \"./ButtonSheet.tsx\"\nimport { closeCollectionItems } from \"./closeCollectionItems.tsx\"\nimport { getCollectionsReferencingCollection } from \"./getCollectionsReferencingCollection.ts\"\ntype DeleteCollectionMetricView = MetricsInteractionViews.CONTEXT_MENU | MetricsInteractionViews.CMS\n\nfunction modalSourceForMetricsView(metricView: DeleteCollectionMetricView): ModalOpenSource {\n\tswitch (metricView) {\n\t\tcase MetricsInteractionViews.CMS:\n\t\t\treturn \"delete_collection\"\n\t\tcase MetricsInteractionViews.CONTEXT_MENU:\n\t\t\treturn \"context_menu\"\n\t}\n}\n\nfunction getAssociatedWebPagesForCollection(\n\twebPageNodes: Iterable<WebPageNode>,\n\tcollectionNode: CollectionNode,\n): LoadedWebPageNode[] {\n\tconst instanceIdentifier = collectionNode.instanceIdentifier\n\n\tconst associatedWebPages: LoadedWebPageNode[] = []\n\n\tfor (const webPageNode of webPageNodes) {\n\t\tassert(webPageNode.loaded, \"Web page node should be loaded\")\n\t\tif (webPageNode.dataIdentifier === instanceIdentifier) {\n\t\t\tassociatedWebPages.push(webPageNode.loaded)\n\t\t\tcontinue\n\t\t}\n\t\tfor (const node of webPageNode.loaded.descendants()) {\n\t\t\tif (isDataRepeater(node) && node.dataIdentifier === instanceIdentifier) {\n\t\t\t\tassociatedWebPages.push(webPageNode.loaded)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn associatedWebPages\n}\n\n/**\n * Deletes selected collections and folders from the CMS panel in three steps:\n *\n * 1. Closes any open collection item editors (aborts if the user keeps editing).\n * 2. Categorizes each selected collection into one of three buckets:\n *    - Silently deletable: empty, no web page associations, no references from other collections.\n *    - Needs confirmation: has items or is referenced by other collections.\n *    - Has web page usages: tied to web pages \u2014 a usage modal explains what would break.\n * 3. Executes deletion based on the bucket:\n *    - Silently deletable: removed right away without user interaction.\n *    - Needs confirmation: a confirmation modal is shown; deletion only proceeds on confirm.\n *    - Has web page usages: a read-only modal lists the affected pages so the user\n *      can unlink them first \u2014 no delete action is offered.\n *\n * Each individual collection deletion (via {@link deleteCollection}) removes four things:\n *   1. The collection node itself.\n *   2. Its entity reference node, if the collection is organized inside a folder.\n *   3. Fields in other collections that reference this collection.\n *   4. Selects the next available sibling collection after removal.\n *\n * Folders are split out from the selection separately. They are deleted alongside their\n * collections, or cleaned up independently via {@link deleteFoldersIfEmpty} when no\n * collections need deletion. Only empty folders (no non-folder descendants) are removed.\n */\nexport async function deleteReferencedCollectionAndFolderEntities(\n\tengine: VekterEngine,\n\tselectedIds: ReadonlySet<NodeID>,\n) {\n\tconst { userKeptEditing } = await closeCollectionItems({\n\t\tengine,\n\t\ttarget: \"all\",\n\t})\n\tif (userKeptEditing) return\n\n\tconst { folderIds, referencedIds: collectionIds } = getFolderAndReferencedIdsForSelection(engine, selectedIds)\n\n\tconst collectionsWithUsages: {\n\t\tid: NodeID\n\t\tname: string\n\t\tassociatedWebPages: LoadedWebPageNode[]\n\t}[] = []\n\tconst collectionsToConfirmDeletion: Set<NodeID> = new Set()\n\tconst silentlyDeletable: Set<NodeID> = new Set()\n\n\tfor (const collectionId of collectionIds) {\n\t\ttry {\n\t\t\tconst node = engine.tree.getNodeWithTrait(collectionId, isCollectionNode)\n\t\t\tif (!node) continue\n\n\t\t\tif (!engine.stores.treeStore.getDataTree()) {\n\t\t\t\tawait engine.runWithFullyLoadedTreeAsync(noop, {\n\t\t\t\t\tname: \"load_shallow_scopes_before_delete_collection\",\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst associatedWebPages = getAssociatedWebPagesForCollection(\n\t\t\t\tengine.stores.treeStore.query().whereClass(WebPageNode).iterate(),\n\t\t\t\tnode,\n\t\t\t)\n\t\t\tconst allCollections = getContentManagementNode(engine.tree)?.loaded?.children\n\t\t\tconst referencingCollections = getCollectionsReferencingCollection(allCollections, node)\n\n\t\t\tconst hasItems = node.getItemCount() > 0\n\t\t\tconst name = node.resolveValue(\"name\") ?? \"Unknown\"\n\n\t\t\tif (associatedWebPages.length > 0) {\n\t\t\t\tcollectionsWithUsages.push({ id: collectionId, name, associatedWebPages })\n\t\t\t} else if (hasItems || referencingCollections.length > 0) {\n\t\t\t\tcollectionsToConfirmDeletion.add(collectionId)\n\t\t\t} else {\n\t\t\t\tsilentlyDeletable.add(collectionId)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tunhandledError(error)\n\t\t}\n\t}\n\n\tif (silentlyDeletable.size > 0) {\n\t\tdeleteCollectionsAndFoldersById(engine, silentlyDeletable, folderIds)\n\t} else if (folderIds.size > 0) {\n\t\tengine.scheduler.process(() => deleteFoldersIfEmpty(engine, folderIds))\n\t}\n\n\tconst remainingFolderIds = new Set([...folderIds].filter(id => engine.tree.has(id)))\n\n\tif (collectionsToConfirmDeletion.size > 0) {\n\t\tshowConfirmationModal(engine, collectionsToConfirmDeletion, remainingFolderIds, collectionsWithUsages)\n\t} else if (collectionsWithUsages.length > 0) {\n\t\tshowUsageModal(engine, collectionsWithUsages)\n\t}\n}\n\nexport async function handleDeleteCollection(\n\tengine: VekterEngine,\n\tcollectionId: NodeID,\n\tmetricView: DeleteCollectionMetricView,\n) {\n\tconst deleteCollectionHandler = engine.scheduler.wrapHandler(deleteCollection)\n\n\tconst collectionNode = engine.tree.get<CollectionNode>(collectionId)\n\tif (!collectionNode) return\n\n\tconst { userKeptEditing } = await closeCollectionItems({\n\t\tengine,\n\t\ttarget: \"all\",\n\t})\n\tif (userKeptEditing) return\n\n\tif (!engine.stores.treeStore.getDataTree()) {\n\t\tawait engine.runWithFullyLoadedTreeAsync(noop, {\n\t\t\tname: \"load_shallow_scopes_before_delete_collection\",\n\t\t})\n\t}\n\n\tconst associatedWebPages = getAssociatedWebPagesForCollection(\n\t\tengine.stores.treeStore.query().whereClass(WebPageNode).iterate(),\n\t\tcollectionNode,\n\t)\n\tconst allCollections = getContentManagementNode(engine.tree)?.loaded?.children\n\tconst referencingCollections = getCollectionsReferencingCollection(allCollections, collectionNode)\n\n\tconst hasItems = collectionNode.getItemCount() > 0\n\tconst preventDelete = associatedWebPages.length > 0\n\tconst shouldDisplayWarning = hasItems || preventDelete || referencingCollections.length > 0\n\n\tif (shouldDisplayWarning) {\n\t\tlet description: React.ReactNode | undefined\n\n\t\tif (preventDelete) {\n\t\t\tconst firstFivePages = associatedWebPages.slice(0, 5)\n\t\t\tconst numRemainingPages = associatedWebPages.length - 5\n\n\t\t\tdescription = (\n\t\t\t\t<>\n\t\t\t\t\t{numRemainingPages > 0\n\t\t\t\t\t\t? `The collection is currently used in ${associatedWebPages.length} ` +\n\t\t\t\t\t\t\t`${pluralize(\"pages\", associatedWebPages.length)}, including the pages listed below.`\n\t\t\t\t\t\t: `The collection is currently used in the ${pluralize(\"pages\", firstFivePages.length)} listed below.`}{\" \"}\n\t\t\t\t\tMake sure to delete all connected layers before removing it.\n\t\t\t\t\t<PageLinksList engine={engine} pages={firstFivePages} variant=\"filled\" />\n\t\t\t\t</>\n\t\t\t)\n\t\t} else {\n\t\t\tdescription = (\n\t\t\t\t<>\n\t\t\t\t\t{referencingCollections.length === 0 && \"This will remove all items from the collection.\"}\n\t\t\t\t\t{referencingCollections.length > 0 && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\tDeleting it will remove references to its items from the{\" \"}\n\t\t\t\t\t\t\t{enumerate(\n\t\t\t\t\t\t\t\treferencingCollections.map(collection => (\n\t\t\t\t\t\t\t\t\t<strong key={collection.id}>{collection.resolveValue(\"name\")}</strong>\n\t\t\t\t\t\t\t\t)),\n\t\t\t\t\t\t\t)}{\" \"}\n\t\t\t\t\t\t\t{pluralize(\"collection\", referencingCollections.length)}.\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\tconst title = `Delete ${collectionNode.resolveValue(\"name\") ?? Dictionary.Unknown} collection`\n\t\tconst source = modalSourceForMetricsView(metricView)\n\n\t\tif (preventDelete) {\n\t\t\tengine.stores.modalStore.set({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tsource,\n\t\t\t\tcancelLabel: Dictionary.Dismiss,\n\t\t\t\tonCancel: () => engine.stores.modalStore.dismiss(),\n\t\t\t\tkeyboardConfirmMode: false,\n\t\t\t})\n\t\t} else {\n\t\t\tengine.stores.modalStore.set({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\tvariant: \"destructive\",\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tsource,\n\t\t\t\tconfirmLabel: Dictionary.Delete,\n\t\t\t\tkeyboardConfirmMode: \"Enter\",\n\t\t\t\tonConfirm: () => deleteCollectionHandler(engine, collectionId, metricView),\n\t\t\t})\n\t\t}\n\t} else {\n\t\tdeleteCollectionHandler(engine, collectionId, metricView)\n\t}\n}\n\nconst pageIcons = {\n\thome: <IconWebPageHome />,\n\tcollection: <IconSidebarCollection />,\n\tother: <IconPage />,\n}\n\ninterface PageLinksListProps {\n\tengine: VekterEngine\n\tpages: LoadedWebPageNode[]\n\tvariant: \"plain\" | \"filled\"\n}\n\nfunction PageLinksList({ engine, pages, variant }: PageLinksListProps) {\n\tfunction navigateTo(webPageId: string) {\n\t\tengine.stores.scopeStore.select(webPageId, { keepHistory: false })\n\t\tengine.stores.selectionStore.set(webPageId)\n\t\tengine.stores.modalStore.dismiss()\n\t}\n\n\tfunction iconForPage(pageNode: LoadedWebPageNode) {\n\t\tif (engine.tree.root.homePageNodeId === pageNode.id) return pageIcons.home\n\t\tif (pageNode.dataIdentifier) return pageIcons.collection\n\t\treturn pageIcons.other\n\t}\n\n\treturn (\n\t\t<ButtonSheet variant={variant}>\n\t\t\t{pages.map(pageNode => {\n\t\t\t\tconst data = engine.componentLoader.dataForIdentifier(pageNode.dataIdentifier)\n\n\t\t\t\treturn (\n\t\t\t\t\t<ButtonSheetItem\n\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\tkey={pageNode.id}\n\t\t\t\t\t\tstartIcon={iconForPage(pageNode)}\n\t\t\t\t\t\ttitle={getWebPageDisplayTitle(engine.tree, pageNode, data ?? null)}\n\t\t\t\t\t\tonClick={() => navigateTo(pageNode.id)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</ButtonSheet>\n\t)\n}\n\nfunction deleteFieldsReferencingCollection({\n\tcollectionToDelete,\n\tcontentManagementNode,\n\tengine,\n}: {\n\tcollectionToDelete: CollectionNode\n\tcontentManagementNode: LoadedContentManagementNode\n\tengine: VekterEngine\n}) {\n\tfor (const otherCollection of contentManagementNode.children) {\n\t\tif (collectionToDelete.id === otherCollection.id) continue\n\n\t\tconst updatedVariables = otherCollection.variables.filter(variable => {\n\t\t\tconst shouldDelete =\n\t\t\t\tisAnyCollectionReferencingVariableDefinition(variable) &&\n\t\t\t\tvariable.dataIdentifier === collectionToDelete.instanceIdentifier\n\t\t\treturn !shouldDelete\n\t\t})\n\n\t\tif (updatedVariables.length !== otherCollection.variables.length) {\n\t\t\tengine.tree.current(otherCollection)?.set({ variables: updatedVariables })\n\t\t}\n\t}\n}\n\nfunction showConfirmationModal(\n\tengine: VekterEngine,\n\tcollectionsToConfirm: Set<NodeID>,\n\tfoldersToRemove: Set<NodeID>,\n\tcollectionsWithUsages: { id: NodeID; name: string; associatedWebPages: LoadedWebPageNode[] }[],\n) {\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.Confirmation,\n\t\tvariant: \"destructive\",\n\t\ttitle: `Delete ${collectionsToConfirm.size} ${pluralize(\"collection\", collectionsToConfirm.size)}`,\n\t\tdescription: (\n\t\t\t<>\n\t\t\t\tThis will permanently delete the following {pluralize(\"collection\", collectionsToConfirm.size)} and remove all{\" \"}\n\t\t\t\t{collectionsToConfirm.size === 1 ? \"its\" : \"their\"} items.\n\t\t\t\t<ButtonSheet variant=\"filled\">\n\t\t\t\t\t{[...collectionsToConfirm].map(id => (\n\t\t\t\t\t\t<ButtonSheetItem\n\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\t\tstartIcon={<IconSidebarCollection />}\n\t\t\t\t\t\t\ttitle={engine.tree.getNode(id)?.resolveValue(\"name\") ?? \"Unknown\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ButtonSheet>\n\t\t\t</>\n\t\t),\n\t\tconfirmLabel: Dictionary.Delete,\n\t\tavoidDismissOnConfirm: true,\n\t\tonConfirm: () => {\n\t\t\tdeleteCollectionsAndFoldersById(engine, collectionsToConfirm, foldersToRemove)\n\n\t\t\tif (collectionsWithUsages.length > 0) {\n\t\t\t\tshowUsageModal(engine, collectionsWithUsages)\n\t\t\t} else {\n\t\t\t\tengine.stores.modalStore.dismiss()\n\t\t\t}\n\t\t},\n\t\tkeyboardConfirmMode: \"Enter\",\n\t\tsource: \"delete_collection\",\n\t})\n}\n\nfunction showUsageModal(\n\tengine: VekterEngine,\n\tcollectionsWithUsages: { id: NodeID; name: string; associatedWebPages: LoadedWebPageNode[] }[],\n) {\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.Confirmation,\n\t\ttitle: `${collectionsWithUsages.length} ${pluralize(\"collection\", collectionsWithUsages.length)} in use`,\n\t\tdescription: (\n\t\t\t<>\n\t\t\t\tThe following {pluralize(\"collection\", collectionsWithUsages.length)}{\" \"}\n\t\t\t\t{collectionsWithUsages.length === 1 ? \"is\" : \"are\"} currently used in pages. Make sure to delete all connected\n\t\t\t\tlayers before removing {collectionsWithUsages.length === 1 ? \"it\" : \"them\"}.\n\t\t\t\t<ButtonSheet variant=\"filled\">\n\t\t\t\t\t{collectionsWithUsages.map(({ id, name, associatedWebPages }) => (\n\t\t\t\t\t\t<ButtonSheetItem\n\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\t\tstartIcon={<IconSidebarCollection />}\n\t\t\t\t\t\t\ttitle={`${name} (${associatedWebPages.length} ${pluralize(\"page\", associatedWebPages.length)})`}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tconst firstPage = associatedWebPages[0]\n\t\t\t\t\t\t\t\tif (firstPage) {\n\t\t\t\t\t\t\t\t\tengine.stores.scopeStore.select(firstPage.id, { keepHistory: false })\n\t\t\t\t\t\t\t\t\tengine.stores.selectionStore.set(firstPage.id)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tengine.stores.modalStore.dismiss()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ButtonSheet>\n\t\t\t</>\n\t\t),\n\t\tconfirmLabel: Dictionary.Dismiss,\n\t\tonConfirm: () => {\n\t\t\tengine.stores.modalStore.dismiss()\n\t\t},\n\t\tsource: \"delete_collection\",\n\t})\n}\n\nfunction deleteCollectionsAndFoldersById(engine: VekterEngine, collectionIds: Set<NodeID>, folderIds: Set<NodeID>) {\n\tengine.scheduler.process(() => {\n\t\tfor (const id of collectionIds) {\n\t\t\tdeleteCollection(engine, id, MetricsInteractionViews.CMS)\n\t\t}\n\n\t\tdeleteFoldersIfEmpty(engine, folderIds)\n\t})\n}\n\nfunction deleteFoldersIfEmpty(engine: VekterEngine, foldersToRemove: Set<NodeID>) {\n\tconst emptyFolderIds = getEmptyFolderIds(engine, foldersToRemove)\n\n\tif (emptyFolderIds.size > 0) {\n\t\ttrackEmptyFolderDeletions(engine, emptyFolderIds)\n\t\tengine.deleteNodes(emptyFolderIds)\n\t}\n}\n\nfunction trackEmptyFolderDeletions(engine: VekterEngine, emptyFolderIds: Set<NodeID>) {\n\tfor (const id of emptyFolderIds) {\n\t\tconst node = engine.tree.getNodeWithTrait(id, isEntityFolderNode)\n\t\tif (!node) continue\n\t\tconst type = entityRootTypeIdForEntityNode(node)\n\n\t\trecord(\"entity_folder_delete\", {\n\t\t\tdepth: engine.tree.ancestors(node.id).filter(isEntityFolderNode).length,\n\t\t\tentityType: trackingTypeForRootId(type),\n\t\t})\n\t}\n}\n\nfunction deleteCollection(engine: VekterEngine, collectionId: NodeID, metricView: DeleteCollectionMetricView) {\n\t// FIXME If CMS Node will ever become shallow this code needs to be checked/updated\n\tconst contentManagementNode = getContentManagementNode(engine.tree)?.loaded\n\tif (!contentManagementNode) return\n\n\tconst index = contentManagementNode.children.findIndex(collection => collection.id === collectionId)\n\tif (index === -1) return\n\tconst collectionToDelete = contentManagementNode.children.at(index)\n\tif (!collectionToDelete) return\n\n\tconst { module } = getCollectionData(engine.componentLoader, engine.stores.modulesStore, collectionToDelete)\n\trecord(\"collection_delete\", {\n\t\tmoduleId: module?.id,\n\t\trecordCount: collectionToDelete.getItemCount(),\n\t\tsource: metricView,\n\t})\n\tconst nextCollection =\n\t\t(index > 0 ? contentManagementNode.children.at(index - 1) : undefined) ??\n\t\tcontentManagementNode.children.find(collection => collection.id !== collectionId)\n\tengine.deleteNode(collectionId)\n\n\tconst referenceNodeId = buildEntityReferenceNodeId(collectionId)\n\tconst belongsToEntityFolder = engine.tree.has(referenceNodeId)\n\n\tif (belongsToEntityFolder) {\n\t\tengine.tree.remove(referenceNodeId)\n\t}\n\n\tdeleteFieldsReferencingCollection({ collectionToDelete, contentManagementNode, engine })\n\n\tif (nextCollection) {\n\t\tengine.stores.selectionStore.set(nextCollection.id)\n\t}\n}\n", "import \"ButtonSheet.styles_1a2ejuu.wyw.css\"; export const items = \"items_i15mi7wq\";\nexport const plainItems = \"plainItems_p1j8fte9\";\nexport const link = \"link_l6r3fbg\";\nexport const plainLink = \"plainLink_p17gpj3h\";\nexport const item = \"item_im3at28\";\nexport const staticItem = \"staticItem_so163bv\";\nexport const plainItem = \"plainItem_p16qxw33\";\nexport const grow = \"grow_g1mg6odu\";\nexport const noShrink = \"noShrink_nnqin9u\";", "import { IconChevronRightButtonSheet, Link, Stack } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport * as styles from \"./ButtonSheet.styles.ts\"\n\ninterface ButtonSheetProps {\n\tchildren: React.ReactNode\n\tvariant: \"plain\" | \"filled\"\n}\n\nexport function ButtonSheet({ children, variant }: ButtonSheetProps) {\n\treturn (\n\t\t<Stack direction=\"column\" gap={0} className={cx(styles.items, variant === \"plain\" && styles.plainItems)}>\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n\ninterface ButtonSheetItemProps {\n\tstartIcon: React.ReactNode | null\n\ttitle: string\n\tonClick?: () => void\n\tvariant: \"plain\" | \"filled\"\n}\n\nexport function ButtonSheetItem({ startIcon = null, title, onClick, variant }: ButtonSheetItemProps) {\n\tconst isPlain = variant === \"plain\"\n\tconst content = (\n\t\t<Stack direction=\"row\" gap={8} alignItems=\"center\">\n\t\t\t{startIcon && <div className={styles.noShrink}>{startIcon}</div>}\n\t\t\t<div className={styles.grow}>{title}</div>\n\t\t\t{onClick && (\n\t\t\t\t<div className={styles.noShrink}>\n\t\t\t\t\t<IconChevronRightButtonSheet />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Stack>\n\t)\n\n\treturn (\n\t\t<div className={cx(styles.item, !onClick && styles.staticItem, isPlain && styles.plainItem)}>\n\t\t\t{onClick ? (\n\t\t\t\t<Link onClick={onClick} className={cx(styles.link, isPlain && styles.plainLink)}>\n\t\t\t\t\t{content}\n\t\t\t\t</Link>\n\t\t\t) : (\n\t\t\t\t<div className={cx(styles.link, isPlain && styles.plainLink)}>{content}</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n", "import { assert, assertNever, unhandledError } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport type { MaybeNodeID, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tAB_TESTS_ENTITY_TYPE_ROOT_ID,\n\tBLOCKQUOTE_ENTITY_ROOT_ID,\n\tCMS_ENTITY_ROOT_ID,\n\tCODE_FILE_ENTITY_TYPE_ROOT_ID,\n\tCOLOR_ENTITY_ROOT_ID,\n\tCOMPONENTS_ENTITY_TYPE_ROOT_ID,\n\tCONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID,\n\ttype EntityTypeRootId,\n\tFUNNELS_ENTITY_TYPE_ROOT_ID,\n\tINLINE_CODE_ENTITY_ROOT_ID,\n\tLAYOUT_TEMPLATE_ENTITY_ROOT_ID,\n\tLINK_ENTITY_ROOT_ID,\n\tTEXT_ENTITY_ROOT_ID,\n\tVECTOR_SET_ENTITY_TYPE_ROOT_ID,\n\tisEntityTypeRootNodeId,\n} from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { isValidEntityParentNode } from \"document/models/CanvasTree/nodes/utils/entityFolderNode.ts\"\nimport { entityRootTypeIdForEntityNode } from \"document/models/CanvasTree/nodes/utils/entityTypeRootNode.ts\"\nimport { isEntityFolderNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getRichTextTagName, richTextTags } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { getComponentsWithPresets } from \"utils/getComponentsWithPresets.ts\"\nimport { isNull, isUndefined } from \"utils/typeChecks.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { createAbTest } from \"../../analytics/utils/createAbTest.ts\"\nimport { createFunnel } from \"../../analytics/utils/createFunnel.ts\"\nimport { createCollection } from \"../../contentManagement/utils/createCollection.ts\"\nimport { createAndRenameFolderNode, createEntityReferenceNodeForRootType } from \"../actions/create.ts\"\nimport { deleteEntityFolderNode } from \"../actions/delete.ts\"\nimport { expandParentAndRenameEntity } from \"../actions/rename.ts\"\nimport { sortEntityAssetsAlphabetically } from \"../actions/sort.ts\"\nimport { canDeleteEntityFolderNode } from \"./canDeleteEntityFolderNode.ts\"\nimport { expandAssetEntityItems, expandAssetEntityItemsFromNode } from \"./expandAssetEntityItems.ts\"\nimport type { ModuleInfo } from \"./getExportedModulesMap.ts\"\n\nimport { createReferenceAlways } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { deleteReferencedCollectionAndFolderEntities } from \"../../contentManagement/utils/handleDeleteCollection.tsx\"\n\ninterface BuildEntityAssetFolderMenuItemsOptions {\n\tpresentColorPopout?: VoidFunction\n\tstartRenaming?: VoidFunction\n}\n\n/**\n * Builds the menu items for a given entity folder node.\n * The menu items are based on the entity type root node.\n *\n * @param engine The engine instance.\n * @param parentId The id of the entity node.\n * @param popout Whether the context is a popout window.\n * @param modules Available modules for code file checks.\n * @param options Optional callbacks for various menu actions.\n * @returns A promise that resolves to the menu items.\n */\nexport async function buildEntityAssetFolderMenuItems(\n\tengine: VekterEngine,\n\tparentId: MaybeNodeID,\n\tpopout: boolean,\n\tmodules: readonly ModuleInfo[] | undefined,\n\toptions?: BuildEntityAssetFolderMenuItemsOptions,\n): Promise<MenuItemOptions[]> {\n\tconst { presentColorPopout, startRenaming } = options ?? {}\n\tif (isNull(parentId) || isUndefined(parentId)) return []\n\n\tconst parentNode = engine.tree.getNode(parentId)\n\tif (!parentNode || !isValidEntityParentNode(parentNode)) throw new Error(\"Invalid parent node\")\n\n\tconst entityType = entityRootTypeIdForEntityNode(parentNode)\n\tconst isRoot = isEntityTypeRootNodeId(parentId)\n\tconst loader = engine.tree.getService(\"loader\")\n\tconst hasDataTree = Boolean(engine.stores.treeStore.getDataTree())\n\n\tconst isLoadedTree = loader ? loader.numberOfScopesToLoad() === 0 : true\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tconst canSearchTreeForEntityDelete = isLoadedTree || hasDataTree\n\tconst canDeleteFolder = canSearchTreeForEntityDelete ? canDeleteEntityFolderNode(parentNode, engine, modules) : true\n\n\tconst fixedMenuItems: MenuItemOptions[] = [\n\t\t{\n\t\t\tlabel: Dictionary.NewFolder,\n\t\t\tenabled: !isViewOnly,\n\t\t\tclick: () => createAndRenameFolderNode(engine, parentId, popout),\n\t\t},\n\t\t{ type: \"separator\" },\n\t\t{ label: Dictionary.Rename, click: startRenaming, visible: !isRoot, enabled: !isViewOnly },\n\t\t{\n\t\t\tlabel: Dictionary.Delete,\n\t\t\tclick: async () => {\n\t\t\t\tconst node = engine.tree.getNodeWithTrait(parentId, isEntityFolderNode)\n\t\t\t\tif (!node) return\n\n\t\t\t\t// When deleting a folder with no children, we can just delete it\n\t\t\t\t// without modal confirmation.\n\t\t\t\tif (node.children.length === 0) {\n\t\t\t\t\tawait deleteEntityFolderNode(engine, node)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst prompt = (canDeleteFolder: boolean) => {\n\t\t\t\t\tengine.stores.modalStore.set({\n\t\t\t\t\t\ttype: ModalType.DeleteEntityFolder,\n\t\t\t\t\t\tsource: popout ? \"popout\" : \"assets_panel\",\n\t\t\t\t\t\tpath: node.resolveValue(\"name\") ?? Dictionary.Unknown,\n\t\t\t\t\t\tonConfirm: async () => {\n\t\t\t\t\t\t\t// We wait to dismiss the modal until after the delete is\n\t\t\t\t\t\t\t// completed to provide user feedback of the pending action.\n\t\t\t\t\t\t\tawait deleteEntityFolderNode(engine, node)\n\t\t\t\t\t\t\tengine.stores.modalStore.dismiss()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcanDeleteFolder,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (!hasDataTree) {\n\t\t\t\t\tawait engine.scheduler.runWithFullyLoadedTreeAsync({ name: \"detectUsedEntities\" })\n\t\t\t\t}\n\n\t\t\t\tprompt(canDeleteEntityFolderNode(node, engine, modules))\n\t\t\t},\n\t\t\tenabled: canDeleteFolder && !isViewOnly,\n\t\t\tvisible: !isEntityTypeRootNodeId(parentId),\n\t\t},\n\t\t{ type: \"separator\" },\n\t\t{\n\t\t\tlabel: Dictionary.SortAlphabetically,\n\t\t\tclick: () => sortEntityAssetsAlphabetically(engine, parentId),\n\t\t\tvisible: !popout,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\t]\n\n\tswitch (entityType) {\n\t\tcase INLINE_CODE_ENTITY_ROOT_ID:\n\t\tcase BLOCKQUOTE_ENTITY_ROOT_ID:\n\t\tcase LINK_ENTITY_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () =>\n\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\tonDone(presetId) {\n\t\t\t\t\t\t\t\tpresentPopout(engine, presetId, parentNode.id, popout)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\tcase COLOR_ENTITY_ROOT_ID:\n\t\t\tassert(presentColorPopout, \"Expected presentColorPopout to be defined for color type root entities\")\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () =>\n\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\tpresent: presentColorPopout,\n\t\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\tcase CODE_FILE_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: Dictionary.NewCodeFile,\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () =>\n\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\tcase COMPONENTS_ENTITY_TYPE_ROOT_ID:\n\t\tcase LAYOUT_TEMPLATE_ENTITY_ROOT_ID:\n\t\tcase VECTOR_SET_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () =>\n\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\tonDone(id: NodeID) {\n\t\t\t\t\t\t\t\texpandAssetEntityItemsFromNode(engine, id, entityType, popout)\n\t\t\t\t\t\t\t\tengine.stores.scopeStore.select(id, { keepHistory: false })\n\t\t\t\t\t\t\t\tengine.stores.codeEditorStore.closeEditor()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\n\t\tcase TEXT_ENTITY_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tsubmenu: richTextTags.map(tag => ({\n\t\t\t\t\t\tlabel: getRichTextTagName(tag),\n\t\t\t\t\t\tclick: () =>\n\t\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\t\ttag,\n\t\t\t\t\t\t\t\tonDone(presetId) {\n\t\t\t\t\t\t\t\t\tpresentPopout(engine, presetId, parentNode.id, popout)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\n\t\tcase CMS_ENTITY_ROOT_ID: {\n\t\t\tconst components = await getComponentsWithPresets(engine)\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tsubmenu: [\n\t\t\t\t\t\t...components.map(component => ({\n\t\t\t\t\t\t\tlabel: component.name,\n\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\t\t\tcmsOptions: {\n\t\t\t\t\t\t\t\t\t\ttype: \"component\",\n\t\t\t\t\t\t\t\t\t\tcomponent: component,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonDone(presetId) {\n\t\t\t\t\t\t\t\t\t\tpresentPopout(engine, presetId, parentNode.id, popout)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: Dictionary.Image,\n\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\t\t\tcmsOptions: {\n\t\t\t\t\t\t\t\t\t\ttype: \"image\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonDone(presetId) {\n\t\t\t\t\t\t\t\t\t\tpresentPopout(engine, presetId, parentNode.id, popout)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: Dictionary.Table,\n\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\tcreateEntityReferenceNodeForRootType(engine, {\n\t\t\t\t\t\t\t\t\trootType: entityType,\n\t\t\t\t\t\t\t\t\tparentId,\n\t\t\t\t\t\t\t\t\tcmsOptions: {\n\t\t\t\t\t\t\t\t\t\ttype: \"table\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tonDone(presetId) {\n\t\t\t\t\t\t\t\t\t\tpresentPopout(engine, presetId, parentNode.id, popout)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\t}\n\t\tcase FUNNELS_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () => createFunnel(engine, parentId),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\tcase AB_TESTS_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () => createAbTest(engine, \"context_menu\", parentId),\n\t\t\t\t},\n\t\t\t\t...fixedMenuItems,\n\t\t\t]\n\t\tcase CONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tlabel: getMenuLabelForEntityType(entityType),\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tconst newCollection = createCollection(engine, \"context_menu\")\n\t\t\t\t\t\tif (!newCollection) return\n\n\t\t\t\t\t\tcreateReferenceAlways(engine.tree, parentId, newCollection.id)\n\t\t\t\t\t\tengine.scheduler.runAtEndOfFrame(() =>\n\t\t\t\t\t\t\texpandParentAndRenameEntity(engine, parentId, newCollection.id, false),\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ type: \"separator\" },\n\t\t\t\t{ label: Dictionary.Rename, click: startRenaming, visible: !isRoot, enabled: !isViewOnly },\n\t\t\t\t{\n\t\t\t\t\tlabel: Dictionary.Delete,\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tconst node = engine.tree.getNodeWithTrait(parentId, isEntityFolderNode)\n\t\t\t\t\t\tif (!node) return\n\n\t\t\t\t\t\tconst idsToDelete = new Set([node.id])\n\t\t\t\t\t\tdeleteReferencedCollectionAndFolderEntities(engine, idsToDelete).catch(unhandledError)\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !isViewOnly,\n\t\t\t\t\tvisible: !isEntityTypeRootNodeId(parentId),\n\t\t\t\t},\n\t\t\t]\n\t\tdefault:\n\t\t\tassertNever(entityType)\n\t}\n}\n\nfunction getMenuLabelForEntityType(type: EntityTypeRootId): string {\n\tswitch (type) {\n\t\tcase INLINE_CODE_ENTITY_ROOT_ID:\n\t\tcase BLOCKQUOTE_ENTITY_ROOT_ID:\n\t\tcase COLOR_ENTITY_ROOT_ID:\n\t\tcase LINK_ENTITY_ROOT_ID:\n\t\tcase TEXT_ENTITY_ROOT_ID:\n\t\tcase CMS_ENTITY_ROOT_ID:\n\t\t\treturn Dictionary.NewStyle\n\t\tcase CODE_FILE_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.NewCodeFile\n\t\tcase COMPONENTS_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.NewComponent\n\t\tcase LAYOUT_TEMPLATE_ENTITY_ROOT_ID:\n\t\t\treturn Dictionary.NewTemplate\n\t\tcase VECTOR_SET_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.NewVectorSet\n\t\tcase FUNNELS_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.NewFunnel\n\t\tcase AB_TESTS_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.NewABTestEllipsis\n\t\tcase CONTENT_MANAGEMENT_ENTITY_TYPE_ROOT_ID:\n\t\t\treturn Dictionary.AddCollection\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n\nfunction presentPopout(engine: VekterEngine, presetId: NodeID, parentId: NodeID, popout: boolean) {\n\tpopoutWindow.navigation.presentPopout(presetId)\n\n\texpandAssetEntityItems(engine, parentId, popout)\n}\n", "import { HandleClickOnClick } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { IconAssetsCodeFolder } from \"@framerjs/fresco\"\nimport { palette } from \"@framerjs/fresco/tokens\"\nimport {\n\ttype EntityActionCallback,\n\tEntityAssetFolderRow,\n\ttype EntityAssetFolderRowProps,\n\tEntityAssetReferenceRow,\n\ttype EntityAssetReferenceRowProps,\n\ttype EntityAssetRowBaseProps,\n} from \"./EntityAssetRow.tsx\"\n\ntype Props = Omit<EntityAssetRowBaseProps, \"hasAnyNonReferencedNodeSibling\"> &\n\tPartial<EntityAssetFolderRowProps & EntityAssetReferenceRowProps> & {\n\t\ttype: \"folder\" | \"reference\"\n\t\thasUnreferencedItems: boolean\n\t\t/** Optional callback for entity lifecycle events (e.g., for analytics tracking) */\n\t\tonEntityAction?: EntityActionCallback\n\t}\n\nexport function EntityRow({\n\tcollapsed = false,\n\tcolor,\n\tinteractionBorderColor,\n\tcomponentType,\n\tdark,\n\tdepth,\n\tgetEditButton,\n\thasUnreferencedItems,\n\tid,\n\ticon,\n\tinsertionIndicatorOffset,\n\tisCodeFileFolder,\n\tlight,\n\tdescription,\n\tmodules,\n\tnewItemNavigationTitle,\n\tonSelectItem,\n\tonToggleCollapse,\n\tpopout = false,\n\tPopoutContent,\n\treferenceClassName,\n\treferenceCreateContextMenuItems,\n\treferenceWithPopoutDivider = false,\n\tselected,\n\tisSortable = true,\n\ttitle,\n\ttype,\n\ttypeRootId,\n\tselectedIds,\n\tgetOrderedIds,\n\tlastSelectionTypeRootId,\n\tdisableRename,\n\tonEntityAction,\n}: Props) {\n\treturn (\n\t\t<HandleClickOnClick>\n\t\t\t{type === \"folder\" ? (\n\t\t\t\t<EntityAssetFolderRow\n\t\t\t\t\tcollapsed={collapsed}\n\t\t\t\t\tcolor={color}\n\t\t\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\t\t\tdepth={depth}\n\t\t\t\t\tmodules={modules}\n\t\t\t\t\tdisableRename={disableRename}\n\t\t\t\t\thasAnyNonReferencedNodeSibling={hasUnreferencedItems}\n\t\t\t\t\ticon={icon ?? (isCodeFileFolder ? <IconAssetsCodeFolder color={palette.purple100} /> : undefined)}\n\t\t\t\t\tid={id}\n\t\t\t\t\tinsertionIndicatorOffset={insertionIndicatorOffset}\n\t\t\t\t\tisCodeFileFolder={isCodeFileFolder}\n\t\t\t\t\tdisableContextMenu={isCodeFileFolder}\n\t\t\t\t\tnewItemNavigationTitle={newItemNavigationTitle}\n\t\t\t\t\tonToggleCollapse={onToggleCollapse}\n\t\t\t\t\tpopout={popout}\n\t\t\t\t\tPopoutContent={PopoutContent}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\t\tselected={selected}\n\t\t\t\t\tonSelectItem={onSelectItem}\n\t\t\t\t\tselectedIds={selectedIds}\n\t\t\t\t\treferenceCreateContextMenuItems={referenceCreateContextMenuItems}\n\t\t\t\t\tgetOrderedIds={getOrderedIds}\n\t\t\t\t\tonEntityAction={onEntityAction}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<EntityAssetReferenceRow\n\t\t\t\t\tcolor={color}\n\t\t\t\t\tinteractionBorderColor={interactionBorderColor}\n\t\t\t\t\tcomponentType={componentType}\n\t\t\t\t\tdark={dark}\n\t\t\t\t\tdepth={depth}\n\t\t\t\t\tdescription={description}\n\t\t\t\t\tdisableRename={disableRename}\n\t\t\t\t\tentityModules={modules}\n\t\t\t\t\tgetEditButton={getEditButton}\n\t\t\t\t\thasAnyNonReferencedNodeSibling={hasUnreferencedItems}\n\t\t\t\t\tid={id}\n\t\t\t\t\tinsertionIndicatorOffset={insertionIndicatorOffset}\n\t\t\t\t\tlight={light}\n\t\t\t\t\tonSelectItem={onSelectItem}\n\t\t\t\t\tPopoutContent={PopoutContent}\n\t\t\t\t\treferenceClassName={referenceClassName}\n\t\t\t\t\treferenceCreateContextMenuItems={referenceCreateContextMenuItems}\n\t\t\t\t\treferenceWithPopoutDivider={referenceWithPopoutDivider}\n\t\t\t\t\tselected={selected}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\t\tisSortable={isSortable}\n\t\t\t\t\tselectedIds={selectedIds}\n\t\t\t\t\tgetOrderedIds={getOrderedIds}\n\t\t\t\t\tlastSelectionTypeRootId={lastSelectionTypeRootId}\n\t\t\t\t\tonEntityAction={onEntityAction}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</HandleClickOnClick>\n\t)\n}\n", "import { emptyArray } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { buildEntityReferenceNodeId } from \"document/models/CanvasTree/nodes/EntityReferenceNode.ts\"\nimport type { EntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { withGetName } from \"document/models/CanvasTree/traits/WithGetName.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { useDeferredValue, useState } from \"react\"\nimport { matchSubstring } from \"utils/searchUtils.ts\"\nimport { type AssetRow, getAssetRowsForTypeRoot } from \"./useAssetPanelEntityRows.ts\"\n\nconst defaultState = { id: null, rows: emptyArray<AssetRow>(), hasAnyItems: false, hasUnreferencedItems: false }\nObject.freeze(defaultState)\n\nexport function usePresetAssetRows<N extends CanvasNode, T extends object | undefined>(\n\tgetNodes: () => readonly N[],\n\tgetRoot: () => EntityTypeRootNode | null | undefined,\n\tgetReferenceMeta?: (id: NodeID) => T,\n\tfilter?: (node: N) => boolean,\n) {\n\tconst [searchValue, setSearchValue] = useState<string>(\"\")\n\tconst deferredSearchValue = useDeferredValue(searchValue)\n\n\tconst expandedAssetEntityIds = useEngineState(\n\t\t() => engine.stores.chromeStore.expandedAssetEntityIds(true),\n\t\t[],\n\t\tengine.stores.chromeStore,\n\t)\n\n\tconst { rows, hasAnyItems, hasUnreferencedItems, id } = useEngineState(\n\t\t() => {\n\t\t\tconst nodes = getNodes()\n\t\t\tconst colorEntityRoot = getRoot()\n\t\t\t// Casting due to not being able to pass T to the constant defaultState.\n\t\t\tif (!colorEntityRoot) return defaultState as typeof defaultState & { rows: readonly AssetRow<T>[] }\n\n\t\t\treturn getEntityAssetRows(nodes, colorEntityRoot, expandedAssetEntityIds, {\n\t\t\t\tsearchQuery: deferredSearchValue,\n\t\t\t\tgetReferenceMeta,\n\t\t\t\tfilter,\n\t\t\t})\n\t\t},\n\t\t[getRoot, getReferenceMeta, filter, deferredSearchValue, expandedAssetEntityIds],\n\t\tEngineChange.TreeStore,\n\t\t{ deepEqual: true },\n\t)\n\n\treturn {\n\t\tsearchValue: deferredSearchValue,\n\t\tsetSearchValue,\n\t\thasSearch: deferredSearchValue !== \"\",\n\t\trows,\n\t\thasAnyItems,\n\t\thasUnreferencedItems,\n\t\ttypeRootId: id,\n\t} as const\n}\n\nfunction getEntityAssetRows<N extends CanvasNode, T extends object | undefined>(\n\tnodes: readonly N[],\n\troot: EntityTypeRootNode,\n\texpandedAssetEntityIds: ReadonlySet<NodeID>,\n\t{\n\t\tfilter,\n\t\tgetReferenceMeta,\n\t\tsearchQuery,\n\t}: {\n\t\tsearchQuery?: string\n\t\tgetReferenceMeta?: (id: NodeID) => T\n\t\tfilter?: (node: N) => boolean\n\t},\n) {\n\tconst unreferenced: AssetRow<T>[] = []\n\tconst allowList = new Set<NodeID>()\n\n\tlet hasAnyUnreferenced = false\n\tfor (const node of nodes) {\n\t\tif (filter && !filter(node)) continue\n\t\tallowList.add(node.id)\n\n\t\tconst referenceId = buildEntityReferenceNodeId(node.id)\n\t\tconst isReferenced = engine.tree.has(referenceId)\n\t\tif (isReferenced) continue\n\n\t\thasAnyUnreferenced = true\n\n\t\tconst title = withGetName(node) ? node.getName() : (node.resolveValue(\"name\") ?? Dictionary.Unknown)\n\t\tif (searchQuery && !matchSubstring(searchQuery, title)) continue\n\n\t\tunreferenced.push({\n\t\t\ttype: \"reference\",\n\t\t\tdepth: 0,\n\t\t\tid: node.id,\n\t\t\ttitle,\n\t\t\t...(getReferenceMeta?.(node.id) ?? {}),\n\t\t})\n\t}\n\n\treturn {\n\t\trows: getAssetRowsForTypeRoot(\n\t\t\troot,\n\t\t\t{\n\t\t\t\tsearchQuery,\n\t\t\t\tallowList,\n\t\t\t\texpandedAssetEntityIds,\n\t\t\t\tskipFolders: !!searchQuery,\n\t\t\t\tgetReferenceMeta,\n\t\t\t},\n\t\t\t{ unreferenced, includeRoot: false },\n\t\t),\n\t\thasUnreferencedItems: unreferenced.length > 0,\n\t\thasAnyItems: hasAnyUnreferenced || root.children.length > 0,\n\t\tid: root.id,\n\t} as const\n}\n", "import { splitExtension } from \"@framerjs/assets\"\nimport {\n\tassert,\n\ttype LocalModuleId,\n\ttype LocalModuleIdentifierString,\n\tModuleType,\n\temptyArray,\n\tlocalModuleIdentifier,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange, type EngineChangeFlag } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasTree, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { EntityFolderNode } from \"document/models/CanvasTree/nodes/EntityFolderNode.ts\"\nimport type { EntityReferenceNode } from \"document/models/CanvasTree/nodes/EntityReferenceNode.ts\"\nimport type { EntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { type LocalModuleNode, isLocalModuleNode } from \"document/models/CanvasTree/nodes/LocalModuleNode.ts\"\nimport { isEntityFolderNode, isEntityReferenceNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { OptionalToUndefined } from \"document/models/CanvasTree/traits/utils/OptionalToUndefined.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { getNameFromPath } from \"document/utils/assetPath.ts\"\nimport { newSetByTogglingItem } from \"document/utils/newSetByTogglingItem.ts\"\nimport { useCallback, useRef, useState } from \"react\"\nimport { matchSubstring } from \"utils/searchUtils.ts\"\nimport type { LocalModuleIdToExportedModulesMap, ModuleInfo } from \"./getExportedModulesMap.ts\"\nimport { getNodeName } from \"./getNodeName.ts\"\n\ntype DefaultT = Record<string, unknown>\ntype ShaderDisplayNameMode = \"shaderTitle\" | \"fileName\"\nconst LOCAL_SHADER_FOLDER_ID = \"shaders-folder\"\n\ninterface LocalModuleAssetRow {\n\tlocalId: LocalModuleId\n\tname: string\n\tpath: string\n\tcanRename: boolean\n}\n\ninterface LocalShaderModuleFolder {\n\tid: typeof LOCAL_SHADER_FOLDER_ID\n\ttitle: string\n\titems: LocalModuleAssetRow[]\n}\n\nexport type AssetRow<T extends object | undefined = DefaultT> = {\n\tdepth: number\n\ttitle: string\n\tmodules?: readonly ModuleInfo[]\n\tid: NodeID | LocalModuleIdentifierString\n\tisCodeFileFolder?: boolean\n\tisCodeFileAsset?: boolean\n\tisSortable?: boolean\n} & (\n\t| ({\n\t\t\ttype: \"folder\"\n\t\t\tcollapsed: boolean\n\t  } & Partial<T>)\n\t| ({\n\t\t\ttype: \"reference\"\n\t\t\t// A reference need never specify if its collapsed or a code-file folder. This allows code\n\t\t\t// to remain succinct.\n\t\t\tcollapsed?: boolean\n\t  } & Partial<T>)\n)\n\ntype Entity = EntityTypeRootNode | EntityFolderNode | EntityReferenceNode | LocalModuleNode\n\ntype Collapsed = boolean\nexport interface AssetRowContext<T extends object | undefined = DefaultT> {\n\ttree?: CanvasTree\n\texpandedAssetEntityIds: ReadonlySet<NodeID>\n\tcreateMagicFolders?: boolean\n\tsearchQuery?: string\n\tmodulesByLocalId?: LocalModuleIdToExportedModulesMap\n\t// It's possible that we have entity references for assets that are no longer in the tree,\n\t// or not local module nodes. Building an allowlist based on only local code modules\n\t// prevents those bad entity references from being displayed.\n\tallowList?: ReadonlySet<NodeID> | undefined\n\tskipFolders?: boolean\n\tlastSearchResult?: ReadonlyMap<NodeID, Collapsed> | undefined\n\tgetReferenceMeta?: (id: NodeID) => T | undefined\n\t/** Optional transform applied to titles before search matching (e.g. decoding encoded slashes). */\n\ttransformTitle?: (title: string) => string\n}\n\nfunction getShaderTitle(moduleIdentifier: string): string | undefined {\n\tconst shaderDefinition = engine.componentLoader.shaderForIdentifier(moduleIdentifier)\n\treturn shaderDefinition?.title?.trim()\n}\n\n/** Builds the local Shaders folder from local modules; separate from `getAssetRows` flow */\nexport function useLocalShaderModuleFolder(\n\tsearchQuery: string,\n\tdisplayNameMode: ShaderDisplayNameMode,\n): LocalShaderModuleFolder {\n\tconst items = useEngineState(\n\t\t() => {\n\t\t\tconst modules = engine.stores.modulesStore.localModules\n\t\t\tconst rows: LocalModuleAssetRow[] = []\n\t\t\tfor (const module of modules.values()) {\n\t\t\t\tif (module.type !== ModuleType.Shader) continue\n\n\t\t\t\tconst localId = module.localId\n\t\t\t\tconst localModuleNode = engine.tree.getNodeWithTrait(localId, isLocalModuleNode)\n\t\t\t\tconst fileName = getNameFromPath(localModuleNode?.save.name ?? module.name)\n\t\t\t\tconst moduleIdentifier = localModuleIdentifier(localId, \"default\").value\n\t\t\t\tconst shaderTitle = getShaderTitle(moduleIdentifier)\n\t\t\t\tconst isFileNameDisplay = displayNameMode === \"fileName\"\n\t\t\t\tconst baseName = splitExtension(fileName)[0]\n\t\t\t\t// Shaders can display as file name (\"Blockify.ts\") in the code section, title (\"Blockify\") if title specified, or file name without extension if no title.\n\t\t\t\tconst name = isFileNameDisplay ? fileName : (shaderTitle ?? baseName)\n\t\t\t\tconst canRename = isFileNameDisplay || !shaderTitle\n\n\t\t\t\tconst matchesSearch =\n\t\t\t\t\t!searchQuery ||\n\t\t\t\t\tmatchSubstring(searchQuery, fileName) ||\n\t\t\t\t\tmatchSubstring(searchQuery, baseName) ||\n\t\t\t\t\t(shaderTitle && matchSubstring(searchQuery, shaderTitle))\n\t\t\t\tif (!matchesSearch) continue\n\n\t\t\t\trows.push({\n\t\t\t\t\tlocalId,\n\t\t\t\t\tname,\n\t\t\t\t\tpath: module.name,\n\t\t\t\t\tcanRename,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn rows.toSorted((a, b) => a.name.localeCompare(b.name))\n\t\t},\n\t\t[displayNameMode, searchQuery],\n\t\t[EngineChange.ActiveBundle, EngineChange.TreeStore, engine.stores.modulesStore],\n\t\t{ deepEqual: true },\n\t)\n\treturn {\n\t\tid: LOCAL_SHADER_FOLDER_ID,\n\t\ttitle: Dictionary.Shaders,\n\t\titems,\n\t}\n}\n\n/**\n * Return a list of rows for a EntityFolderNode, EntityReferenceNode, or LocalModuleNode, and all of\n * its descendants.\n */\nexport function getAssetRows<T extends object | undefined = DefaultT>(\n\tnode: Entity,\n\tdepth: number,\n\tforceExpansion: boolean,\n\tctx: AssetRowContext<T>,\n): readonly AssetRow<T>[] {\n\tconst id = isEntityReferenceNode(node) ? node.referenceId : node.id\n\t// If a lastSearchResult map is provided, and this node's id is not present, it means neither this node nor any of\n\t// its descendants matched the search. In that case, skip this branch entirely.\n\tif (ctx.lastSearchResult && !ctx.lastSearchResult.has(id)) return emptyArray<AssetRow<T>>()\n\n\t// When an allowlist is provided, skip nodes not present.\n\t// Also skip reference nodes where the referenced node itself is missing from the tree, if a tree is provided.\n\tif (isEntityReferenceNode(node) && ((ctx.allowList && !ctx.allowList.has(id)) || (ctx.tree && !ctx.tree.get(id)))) {\n\t\treturn emptyArray<AssetRow<T>>()\n\t}\n\n\tconst modules = modulesForNode(node, ctx.modulesByLocalId)\n\tif (ctx.createMagicFolders && modules.length > 1) {\n\t\treturn assetRowsForMagicFolder(node, modules, depth, forceExpansion, ctx)\n\t}\n\n\tconst title = getTitle(node, modules, ctx.createMagicFolders)\n\tconst searchTitle = ctx.transformTitle ? ctx.transformTitle(title) : title\n\tconst matchesSearch = Boolean(ctx.searchQuery && matchSubstring(ctx.searchQuery, searchTitle))\n\tconst shouldBeExpanded = ctx.expandedAssetEntityIds.has(node.id)\n\n\t// Only iterate through children if the node is expanded, or the search query is not falsy, to\n\t// avoid unnecessary iterations. When there is a search query, we must check all descendants to\n\t// expand a path to a matching node.\n\tconst rows: AssetRow<T>[] = []\n\tif (shouldBeExpanded || ctx.searchQuery) {\n\t\t// If the folder was included in the last search result, but collapsed, reset the context to remove the search result allowlist. This allows expanding the folder to show all its contents even though they weren't shown originally.\n\t\tconst nextCtx: AssetRowContext<T> = ctx.lastSearchResult?.get(node.id)\n\t\t\t? { ...ctx, lastSearchResult: undefined }\n\t\t\t: ctx\n\n\t\tconst nextDepth = ctx.skipFolders ? depth : depth + 1\n\n\t\tnode.children?.forEach(child => {\n\t\t\tif (!isEntityFolderNode(child) && !isEntityReferenceNode(child)) return\n\t\t\trows.push(...getAssetRows(child, nextDepth, matchesSearch, nextCtx))\n\t\t})\n\t}\n\n\t// If there is a search query but neither the folder or any descendants match, return an empty\n\t// array to omit this branch of assets from the list of rows.\n\tif (!forceExpansion && ctx.searchQuery && !matchesSearch && rows.length === 0) return emptyArray<AssetRow<T>>()\n\n\t// Omit folders entirely when flagged.\n\tif (isEntityFolderNode(node) && ctx.skipFolders) return rows\n\n\trows.unshift({\n\t\tid,\n\t\tdepth,\n\t\ttype: isEntityFolderNode(node) ? \"folder\" : \"reference\",\n\t\ttitle: title || \"\",\n\t\tcollapsed: rows.length === 0 && !shouldBeExpanded,\n\t\tmodules,\n\t\tisCodeFileAsset: !!modules.length && modules[0]?.type === ModuleType.Code, // Multi-export code modules are handled by the magic folder logic.\n\t\t...(isEntityReferenceNode(node) ? ctx.getReferenceMeta?.(node.referenceId) : undefined),\n\t})\n\n\treturn rows\n}\n\ninterface GetAssetRowsForTypeRootOptions<T extends object | undefined = DefaultT> {\n\tunreferenced?: readonly AssetRow<T>[]\n\tincludeRoot: boolean\n\tskipEmptyRoot?: boolean\n}\n\nexport function getAssetRowsForTypeRoot<T extends object | undefined = DefaultT>(\n\tnode: EntityTypeRootNode,\n\tctx: AssetRowContext<T>,\n\t{ unreferenced, includeRoot, skipEmptyRoot }: GetAssetRowsForTypeRootOptions<T>,\n): readonly AssetRow<T>[] {\n\t// If we have an allow list of folders from a search result that didn't include the root, skip it. It can never be included.\n\tif (ctx.lastSearchResult && !ctx.lastSearchResult.has(node.id) && includeRoot) return emptyArray<AssetRow<T>>()\n\n\tconst rows: AssetRow<T>[] = []\n\n\tconst title = getNodeName(node)\n\tconst depth = includeRoot ? 0 : -1\n\n\tconst matchesSearch = Boolean(ctx.searchQuery && includeRoot !== false && matchSubstring(ctx.searchQuery, title))\n\tconst shouldBeExpanded = ctx.expandedAssetEntityIds.has(node.id) || includeRoot === false\n\tconst shouldRenderChildren = shouldBeExpanded || ctx.searchQuery\n\n\t// We walk through children if the node is expanded, or their is a truthy search query. This\n\t// allows forcing expansion if there is a matching descendent.\n\tif (shouldRenderChildren) {\n\t\tnode.children?.forEach(child => {\n\t\t\trows.push(...getAssetRows(child, depth + 1, matchesSearch, ctx))\n\t\t})\n\t}\n\n\tif (shouldRenderChildren && unreferenced) rows.push(...unreferenced)\n\tif (!includeRoot) return rows\n\tif (ctx.searchQuery && !matchesSearch && rows.length === 0) return emptyArray<AssetRow<T>>()\n\n\t// When flagged, and not searching, and there are no unreferenced items, and there are no rows,\n\t// skip the empty root if: (1) no children exist, OR (2) children exist but are all invalid.\n\tif (\n\t\tskipEmptyRoot &&\n\t\t!ctx.searchQuery &&\n\t\t!unreferenced?.length &&\n\t\trows.length === 0 &&\n\t\t!rootHasValidChildren(node, ctx)\n\t) {\n\t\treturn emptyArray<AssetRow<T>>()\n\t}\n\n\trows.unshift({\n\t\ttype: \"folder\",\n\t\tid: node.id,\n\t\tdepth,\n\t\ttitle,\n\t\tcollapsed: rows.length === 0 && !shouldBeExpanded,\n\t})\n\n\treturn rows\n}\n\nfunction rootHasValidChildren<T extends object | undefined = DefaultT>(\n\tnode: EntityTypeRootNode,\n\tctx: AssetRowContext<T>,\n): boolean {\n\treturn (\n\t\tnode.children.length > 0 &&\n\t\tnode.children.some(child => {\n\t\t\tif (!isEntityFolderNode(child) && !isEntityReferenceNode(child)) return false\n\t\t\tif (isEntityFolderNode(child)) return true // Folders are always valid\n\t\t\tconst childId = child.referenceId\n\t\t\tconst isAllowed = !ctx.allowList || ctx.allowList.has(childId)\n\t\t\tconst isChildInTree = !ctx.tree || ctx.tree.get(childId)\n\t\t\treturn isAllowed && isChildInTree\n\t\t})\n\t)\n}\n\nfunction modulesForNode(\n\tnode: Entity,\n\tmodulesByLocalId: LocalModuleIdToExportedModulesMap | undefined,\n): readonly ModuleInfo[] {\n\tconst id = isLocalModuleNode(node) ? node.id : isEntityReferenceNode(node) ? node.referenceId : undefined\n\tif (id) {\n\t\tconst modules = modulesByLocalId?.get(id)\n\t\tif (modules) return modules\n\t}\n\n\treturn emptyArray<ModuleInfo>()\n}\n\nfunction getTitle(node: Entity, modules: readonly ModuleInfo[], useSingleModuleName: boolean | undefined) {\n\tif (isEntityFolderNode(node)) return getNodeName(node)\n\n\t// For code files, the module file name is the source of truth.\n\t// For smart components, the node's name property is the source\n\t// of truth - the module data may be stale until code regenerates.\n\tif (modules.length === 1 && useSingleModuleName) {\n\t\tconst singleModule = modules[0]\n\t\tassert(singleModule, \"Must have a single module.\")\n\t\tif (singleModule.type === ModuleType.Code) {\n\t\t\treturn getNameFromPath(singleModule.name)\n\t\t}\n\t}\n\n\treturn getNodeName(node)\n}\n\nfunction assetRowsForMagicFolder<T extends object | undefined = DefaultT>(\n\tnode: Entity,\n\tmodules: readonly ModuleInfo[],\n\tdepth: number,\n\tforceExpansion: boolean,\n\tctx: AssetRowContext<T>,\n): readonly AssetRow<T>[] {\n\tconst rows: AssetRow<T>[] = []\n\n\tconst id = isEntityReferenceNode(node) ? node.referenceId : node.id\n\tconst title = getNodeName(node)\n\tconst searchTitle = ctx.transformTitle ? ctx.transformTitle(title) : title\n\n\tconst matchesSearch = Boolean(ctx.searchQuery && matchSubstring(ctx.searchQuery, searchTitle))\n\tconst shouldBeExpanded = ctx.expandedAssetEntityIds.has(id) || matchesSearch\n\tconst magicFolderIncluded = ctx.lastSearchResult?.get(id)\n\n\tif (ctx.searchQuery || shouldBeExpanded) {\n\t\tconst search = magicFolderIncluded ? undefined : ctx.searchQuery\n\t\tfor (const module of modules) {\n\t\t\t// Force the rows to be included if the magic folder is included by the search query.\n\t\t\tif (search && !matchSubstring(search, module.name) && !matchesSearch) continue\n\n\t\t\trows.push({\n\t\t\t\ttype: \"reference\",\n\t\t\t\tdepth: depth + 1,\n\t\t\t\tid: module.moduleIdentifier,\n\t\t\t\tmodules: [module],\n\t\t\t\ttitle: module.name,\n\t\t\t\tisSortable: false,\n\t\t\t\tisCodeFileAsset: true,\n\t\t\t})\n\t\t}\n\t}\n\n\t// If there are no matching rows and the folder is not expanded, return an empty array.\n\tif (!forceExpansion && ctx.searchQuery && !matchesSearch && rows.length === 0) return emptyArray<AssetRow<T>>()\n\n\trows.unshift({\n\t\tid,\n\t\ttype: \"folder\",\n\t\tdepth,\n\t\ttitle,\n\t\tcollapsed: rows.length === 0 && !shouldBeExpanded,\n\t\tisCodeFileFolder: true,\n\t})\n\n\treturn rows\n}\n\ninterface GetStateResult<T extends object | undefined = DefaultT> extends Partial<\n\tPick<\n\t\tAssetRowContext<T>,\n\t\t\"createMagicFolders\" | \"modulesByLocalId\" | \"getReferenceMeta\" | \"allowList\" | \"tree\" | \"transformTitle\"\n\t> &\n\t\tPick<GetAssetRowsForTypeRootOptions, \"includeRoot\">\n> {\n\tunreferenced: readonly AssetRow<T>[]\n\tentityRootNode: EntityTypeRootNode\n}\n\ninterface State<T extends object | undefined = DefaultT> {\n\trows: readonly AssetRow<T>[]\n\thasUnreferencedItems: boolean\n}\n\nconst defaultState: State & { hasLastSearchResult: false } = {\n\trows: emptyArray<AssetRow>(),\n\thasUnreferencedItems: false,\n\thasLastSearchResult: false,\n}\nObject.freeze(defaultState)\n\ntype GetStateArgs = OptionalToUndefined<\n\tPick<AssetRowContext, \"lastSearchResult\" | \"searchQuery\" | \"expandedAssetEntityIds\">\n>\n\n/**\n * @param searchQuery - The search query to filter the asset rows.\n * @param expandedAssetEntityIds - The IDs of the asset entities that are expanded from the Chrome\n * Store.\n * @param includeRoot - Whether to include the root entity (e.g. Project) folder in the asset rows.\n * @param getState - A function that returns the state of the asset rows.\n * @returns The asset rows and a function to toggle the expanded state of an asset entity.\n */\nexport function useAssetPanelEntityRows<T extends object | undefined = DefaultT>(\n\tsearchQuery: string,\n\texpandedAssetEntityIds: ReadonlySet<NodeID>,\n\tgetState: (args: GetStateArgs) => GetStateResult<T> | null,\n\tengineChangeFlags?: EngineChangeFlag[],\n): [State<T>, (id: NodeID) => void] {\n\tconst previousSearchResult = useRef<{ [searchQuery: string]: Map<NodeID, Collapsed> } | undefined>()\n\tconst [expandedDuringSearch, setExpandedDuringSearch] = useState(() => new Set<NodeID>())\n\n\tconst state = useEngineState(\n\t\t() => {\n\t\t\tconst lastSearchResult = searchQuery ? previousSearchResult.current?.[searchQuery] : undefined\n\t\t\tconst search = lastSearchResult ? undefined : searchQuery\n\t\t\tconst expanded = lastSearchResult ? expandedDuringSearch : expandedAssetEntityIds\n\t\t\tconst result = getState({ lastSearchResult, searchQuery: search, expandedAssetEntityIds: expanded })\n\t\t\tif (!result) return defaultState\n\n\t\t\tconst { unreferenced, entityRootNode, includeRoot = false, ...ctxOptions } = result\n\n\t\t\tconst ctx: AssetRowContext<T> = {\n\t\t\t\t...ctxOptions,\n\t\t\t\tlastSearchResult,\n\t\t\t\tsearchQuery: search,\n\t\t\t\texpandedAssetEntityIds: expanded,\n\t\t\t}\n\n\t\t\tconst rows = getAssetRowsForTypeRoot(entityRootNode, ctx, {\n\t\t\t\tunreferenced,\n\t\t\t\tincludeRoot,\n\t\t\t\tskipEmptyRoot: true,\n\t\t\t})\n\n\t\t\treturn {\n\t\t\t\trows,\n\t\t\t\thasUnreferencedItems: unreferenced.length > 0,\n\t\t\t}\n\t\t},\n\t\t[searchQuery, expandedAssetEntityIds, expandedDuringSearch, getState],\n\t\t[EngineChange.Tree, ...(engineChangeFlags ?? emptyArray<EngineChangeFlag>())],\n\t\t{ deepEqual: true },\n\t)\n\n\t// When the search query changes, and it's the first render for that search query, reset the set\n\t// of expanded items to reflect the items that were force expanded by the search result.\n\t//\n\t// We don't set state because we don't want to recalculate the rows. We also store the search\n\t// result in a ref so that we can use it to allow expansion of folders that were included but\n\t// collapsed by the search result.\n\tif (searchQuery && !previousSearchResult.current?.[searchQuery]) {\n\t\tconst searchResult = new Map<NodeID, boolean>()\n\n\t\texpandedDuringSearch.clear()\n\t\tstate.rows.forEach(row => {\n\t\t\tsearchResult.set(row.id, row.collapsed ?? false)\n\t\t\tif (row.collapsed) return\n\t\t\texpandedDuringSearch.add(row.id)\n\t\t})\n\n\t\tpreviousSearchResult.current = { [searchQuery]: searchResult }\n\t}\n\n\tconst toggle = useCallback(\n\t\t(id: NodeID) => {\n\t\t\tif (searchQuery) {\n\t\t\t\tsetExpandedDuringSearch(v => newSetByTogglingItem(v, id))\n\t\t\t} else {\n\t\t\t\tengine.stores.chromeStore.toggleAssetEntityItem(id, false)\n\t\t\t}\n\t\t},\n\t\t[searchQuery],\n\t)\n\n\treturn [state, toggle]\n}\n", "import \"EmptyEntityAssetResults.styles_1x95aoh.wyw.css\"; export const noResultsWrapper = \"noResultsWrapper_n1fixlrr\";", "import * as styles from \"./EmptyEntityAssetResults.styles.ts\"\n\ninterface EmptyEntityAssetResultsProps {\n\thasSearch: boolean\n\thasResults: boolean\n}\n\nexport function EmptyEntityAssetResults({ hasSearch, hasResults }: EmptyEntityAssetResultsProps) {\n\tif (!hasSearch || hasResults) return null\n\n\treturn <div className={styles.noResultsWrapper}>No Results</div>\n}\n", "import type { MenuItemOptions } from \"app/menu.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport { deleteToken, duplicateToken, resetTokenDarkValue } from \"document/components/utils/tokenContextActions.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { createReferenceForNodeIfNeeded } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isColorStyleTokenNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { useCallback } from \"react\"\nimport { isNull, isString } from \"utils/typeChecks.ts\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport { type EntityAssetReferencePopoutContentProps, isFolderPopout } from \"../../assets/types.ts\"\nimport { expandAssetEntityItems } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { ColorTokenPopoutContainer } from \"../../presetsPanel/ColorTokenPopoutContainer.tsx\"\nimport { ColorTokenPopout, EditColorTokenPopout } from \"../../shared/ColorPicker/ColorTokenPopout.tsx\"\nimport type { ContextMenuOptions } from \"./presetRowProps.ts\"\n\nexport function createColorItemContextMenuItems(id: NodeID, options: ContextMenuOptions) {\n\tconst node = engine.tree.get<ColorStyleTokenNode>(id)\n\tif (isNull(node)) return []\n\tif (!isColorStyleTokenNode(node)) return []\n\n\treturn createContextMenuItems(node, options)\n}\n\nfunction createContextMenuItems(\n\tcolorToken: ColorStyleTokenNode,\n\t{ startRenaming, hasSearch }: ContextMenuOptions,\n): MenuItemOptions[] {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tconst containsDark = isString(colorToken.dark)\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Find\",\n\t\t\tclick() {\n\t\t\t\tengine.stores.modalStore.set({\n\t\t\t\t\ttype: ModalType.QuickActions,\n\t\t\t\t\tsource: \"styles_panel\",\n\t\t\t\t\tinitialCategory: {\n\t\t\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\ttype: FindNodesType.ColorStyleToken,\n\t\t\t\t\t\t\ttitle: colorToken.name,\n\t\t\t\t\t\t\ttokenId: colorToken.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Rename\",\n\t\t\tenabled: !isViewOnly && !colorToken.installed,\n\t\t\tclick: startRenaming,\n\t\t\tvisible: !hasSearch,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Duplicate\",\n\t\t\tenabled: !isViewOnly,\n\t\t\tclick: () => duplicateToken(engine, colorToken),\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\tenabled: !isViewOnly && !colorToken.installed,\n\t\t\tclick: () => deleteToken(engine, colorToken.id),\n\t\t},\n\n\t\t{\n\t\t\ttype: \"separator\",\n\t\t\tvisible: containsDark,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Clear Dark Style\",\n\t\t\tenabled: !isViewOnly && !colorToken.installed,\n\t\t\tvisible: containsDark,\n\t\t\tclick: () => resetTokenDarkValue(engine, colorToken),\n\t\t},\n\t]\n}\n\ninterface EditColorStyleTokenNodePopoutProps {\n\tcolorToken: ColorStyleTokenNode\n}\n\nexport function EditColorStyleTokenNodePopout({ colorToken }: EditColorStyleTokenNodePopoutProps) {\n\tconst { isDarkMode } = useDarkMode()\n\n\tconst colorModel = useEngineState(\n\t\t() => engine.stores.persistedUserDefaults.colorModel,\n\t\t[],\n\t\tEngineChange.UserDefaultsStore,\n\t)\n\n\treturn (\n\t\t<ColorTokenPopoutContainer>\n\t\t\t<EditColorTokenPopout token={colorToken} colorModel={colorModel} isDarkMode={isDarkMode} allowRenaming={false} />\n\t\t</ColorTokenPopoutContainer>\n\t)\n}\n\nexport function ColorStyleTokenPopoutContent(props: EntityAssetReferencePopoutContentProps) {\n\tconst colorModel = useEngineState(\n\t\t() => engine.stores.persistedUserDefaults.colorModel,\n\t\t[],\n\t\tEngineChange.UserDefaultsStore,\n\t)\n\n\tconst isFolder = isFolderPopout(props)\n\tconst id = isFolder ? props.folderId : props.referenceItemId\n\n\tconst handleColorTokenCreate = useCallback(\n\t\t(node: ColorStyleTokenNode) => {\n\t\t\tcreateReferenceForNodeIfNeeded(engine.tree, id, node.id)\n\n\t\t\texpandAssetEntityItems(engine, id, props.popout)\n\t\t},\n\t\t[id, props.popout],\n\t)\n\n\tif (isFolder) {\n\t\treturn (\n\t\t\t<ColorTokenPopout\n\t\t\t\tvalue=\"#000000\"\n\t\t\t\tcolorModel={colorModel}\n\t\t\t\tonChange={handleColorTokenCreate}\n\t\t\t\tparentFolderId={isFolder ? props.folderId : undefined}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst colorToken = engine.tree.get<ColorStyleTokenNode>(id)\n\tif (isNull(colorToken)) return null\n\n\treturn <EditColorStyleTokenNodePopout colorToken={colorToken} />\n}\n", "import type { EntityDefinition } from \"@framerjs/framer-runtime\"\nimport type { ExternalModuleExportIdentifierString, GlobalModuleId, LocalModuleId } from \"@framerjs/shared\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ContextMenuOptions } from \"../properties/utils/presetRowProps.ts\"\n\nconst insertableComponentTypes = [\"component\", \"externalModuleComponent\", \"libraryModule\"] as const\nexport type InsertableComponentType = (typeof insertableComponentTypes)[number]\n\ntype ListItemType = InsertableComponentType | \"folder\" | \"libraryColor\" | \"libraryTextStyle\" | \"layoutTemplate\"\n\ninterface ListMeta {\n\tid: string\n\tname: string\n\ttype: ListItemType\n\tIcon: () => JSX.Element | null\n\tdescription?: string\n}\n\ninterface Component extends ListMeta {\n\ttype: \"component\"\n\tcomponentDefinition: EntityDefinition\n\tcodeComponentIdentifier: string | undefined\n\tsmartComponentId: string | null\n\tnameWithCategory: string\n}\n\ninterface Folder extends ListMeta {\n\ttype: \"folder\"\n\tupdatesStatus?: string\n\titems: ListItem[]\n}\n\ninterface IntrinsicSize {\n\tintrinsicWidth?: number\n\tintrinsicHeight?: number\n}\n\nexport interface ExternalModuleComponent extends ListMeta {\n\ttype: \"externalModuleComponent\"\n\tcodeComponentIdentifier: ExternalModuleExportIdentifierString\n\tlocalId: LocalModuleId\n\tintrinsicWidth?: number\n\tintrinsicHeight?: number\n\townerType?: \"project\" | \"team\" | string\n\townerId?: string\n\tfolderName?: string\n\tmoduleType?: \"canvasComponent\" | \"codeFile\" | string\n\t/**\n\t * Node ID of the corresponding ScopeNode in the source project.\n\t * Used for linking smart components directly to the component isolation in the source project.\n\t */\n\tscopeNodeId?: string\n\thasUpdate: boolean\n}\n\ninterface LibraryModule extends ModuleComponent<ListMeta> {\n\ttype: \"libraryModule\"\n\tcanBeEdited: boolean\n\tmoduleId: GlobalModuleId\n\tlocalId: LocalModuleId\n\texportSpecifier: string\n\tcreatedAt: string\n\tcreatedBy: string\n\townerType: string\n\townerId: string\n\tmoduleType: \"canvasComponent\" | \"codeFile\" | string\n\t/**\n\t * Node ID of the corresponding ScopeNode in the source project.\n\t * Used for linking smart components directly to the component isolation in the source project.\n\t */\n\tscopeNodeId?: string\n}\n\ninterface LibraryColor extends ListMeta {\n\ttype: \"libraryColor\"\n}\n\ninterface LibraryTextStyle extends ListMeta {\n\ttype: \"libraryTextStyle\"\n}\n\ninterface LayoutTemplate extends ListMeta {\n\ttype: \"layoutTemplate\"\n\t/** LayoutTemplateNode id */\n\tid: NodeID\n}\n\ntype LibraryListItem = LibraryModule | LibraryColor | LibraryTextStyle\nexport type ListItem = Component | ExternalModuleComponent | Folder | LibraryListItem | LayoutTemplate\n\nexport interface ListItemGroup {\n\ttitle: string\n\titems: ListItem[]\n}\n\ntype ModuleComponent<T> = T &\n\tIntrinsicSize & {\n\t\tid: string\n\t\tcodeComponentIdentifier: ExternalModuleExportIdentifierString\n\t\timportURL: string\n\t\tsourceURL: string\n\t\texports: readonly string[]\n\t}\n\nexport type EntityAssetEditReferenceButton = (id: NodeID, title: string) => React.ReactNode\n\nconst referenceItemIdKey = \"referenceItemId\" as const\nconst folderIdKey = \"folderId\" as const\n\nexport interface AssetReferencePopoutContentProps {\n\t[referenceItemIdKey]: NodeID\n\tpopout: boolean\n}\ninterface AssetFolderPopoutContentProps {\n\t[folderIdKey]: NodeID\n\tpopout: boolean\n}\n\nexport type EntityAssetReferencePopoutContentProps = AssetReferencePopoutContentProps | AssetFolderPopoutContentProps\nexport type EntityAssetReferencePopoutContent = React.FunctionComponent<EntityAssetReferencePopoutContentProps>\n\nexport type CreateContextMenuItemsHandler = (\n\tid: NodeID,\n\toptions: ContextMenuOptions,\n) => readonly MenuItemOptions[] | Promise<MenuItemOptions[]>\n\nexport function isFolderPopout(props: EntityAssetReferencePopoutContentProps): props is AssetFolderPopoutContentProps {\n\treturn folderIdKey in props\n}\n", "import engine from \"document/engine.ts\"\nimport React from \"react\"\nimport { isShallowEqual } from \"utils/isShallowEqual.ts\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\n\nexport const useDismissPopoutOnSelectionChange = () => {\n\tconst selectedNodeIds = engine.stores.selectionStore.useState(state => state.ids)\n\tconst [mountedWithIds] = React.useState(selectedNodeIds)\n\n\t// Close popout on selection change\n\tReact.useEffect(() => {\n\t\tif (isShallowEqual(mountedWithIds, selectedNodeIds)) return\n\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tpopoutWindow.close()\n\t\t})\n\t}, [mountedWithIds, selectedNodeIds])\n}\n", "import type { ReactElement } from \"react\"\nimport { useDismissPopoutOnSelectionChange } from \"../properties/utils/useDismissPopoutOnSelectionChange.tsx\"\n\nexport const ColorTokenPopoutContainer = ({ children }: { children: ReactElement }) => {\n\tuseDismissPopoutOnSelectionChange()\n\n\treturn children\n}\n", "import { triggerColorTokenCreateEvent } from \"@framerjs/framer-events\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport {\n\tCOLOR_STYLE_TOKEN_LIST_NODE_ID,\n\tColorStyleTokenListNode,\n} from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { COLOR_ENTITY_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport {\n\tcreateEntityFolderNodesFromPath,\n\twouldAssetEntityCollide,\n} from \"document/models/CanvasTree/nodes/utils/entityFolderNode.ts\"\nimport {\n\tbuildReferenceNodeId,\n\tcreateReferenceForNodeIfNeeded,\n} from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { splitPathToSegments } from \"document/utils/assetPath.ts\"\nimport React from \"react\"\nimport { expandAssetEntityItems } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { PopoutContext } from \"../PopoutContext.ts\"\nimport { ColorPickerTokenEdit } from \"./tokens/ColorPickerTokenEdit.tsx\"\nimport type { ColorModel } from \"./types.ts\"\n\ninterface ColorTokenPopoutProps {\n\tvalue: string\n\tonChange?: (color: ColorStyleTokenNode) => void\n\tcolorModel: ColorModel\n\tparentFolderId?: NodeID\n}\n\nexport const ColorTokenPopout = React.memo(function PopoutNewColorTokenContent({\n\tvalue: color,\n\tcolorModel,\n\tonChange,\n\tparentFolderId,\n}: ColorTokenPopoutProps) {\n\tconst popoutNavigation = React.useContext(PopoutContext)\n\n\tfunction createTokenAction({ name, light, dark }: Pick<ColorStyleTokenNode, \"name\" | \"light\" | \"dark\">) {\n\t\tconst { token, folderId } = insertNewTokenNode(name, { light, dark }, parentFolderId)\n\t\tonChange?.(token)\n\t\tpopoutNavigation?.goBack()\n\t\texpandAssetEntityItems(engine, folderId, false)\n\n\t\ttriggerColorTokenCreateEvent({\n\t\t\ttokenId: token.id,\n\t\t\ttotalTokenCount: ColorStyleTokenListNode.getTokenNodes(engine.tree).length,\n\t\t})\n\t}\n\n\treturn (\n\t\t<ColorPickerTokenEdit\n\t\t\tcolor={color}\n\t\t\t// https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n\t\t\t// Adding this key makes sure that a new instance of\n\t\t\t// ColorPickerTokenEdit is created if the color changes.\n\t\t\tkey={color}\n\t\t\tdismiss={popoutNavigation?.goBack}\n\t\t\tcreateTokenAction={createTokenAction}\n\t\t\tcolorModel={colorModel}\n\t\t\tisValidName={useValidateTokenName(parentFolderId ?? COLOR_ENTITY_ROOT_ID)}\n\t\t/>\n\t)\n})\n\nfunction insertNewTokenNode(\n\tname: string,\n\tproperties: Partial<Omit<ColorStyleTokenNode, \"name\">>,\n\tparentFolderId?: NodeID,\n) {\n\tconst path = splitPathToSegments(name)\n\tconst resolvedName = path.pop()\n\n\tconst folderId = createEntityFolderNodesFromPath(engine.tree, path, parentFolderId ?? COLOR_ENTITY_ROOT_ID)\n\n\tconst token = new ColorStyleTokenNode({\n\t\tname: resolvedName,\n\t\t...properties,\n\t})\n\tcreateReferenceForNodeIfNeeded(engine.tree, folderId, token.id)\n\tengine.tree.insertNode(token, COLOR_STYLE_TOKEN_LIST_NODE_ID)\n\n\treturn { token, folderId }\n}\n\ninterface EditColorTokenPopoutProps {\n\ttoken: ColorStyleTokenNode\n\tcolorModel: ColorModel\n\tisDarkMode: boolean\n\tallowRenaming: boolean\n\tparentFolderId?: NodeID\n}\n\nexport const EditColorTokenPopout = React.memo(function PopoutEditColorTokenContent({\n\ttoken,\n\tcolorModel,\n\tisDarkMode,\n\tallowRenaming,\n\tparentFolderId,\n}: EditColorTokenPopoutProps) {\n\tconst popoutNavigation = React.useContext(PopoutContext)\n\n\t/**\n\t * Only show the edit popout in dark theme by default if there's a dark\n\t * value set. This avoids users setting a dark color by mistake if they are\n\t * just working in the dark interface, but doesn't need a dark color for the\n\t * site.\n\t */\n\tconst theme = isDarkMode && token.dark ? \"dark\" : \"light\"\n\treturn (\n\t\t<ColorPickerTokenEdit\n\t\t\ttoken={token}\n\t\t\tallowRenaming={allowRenaming}\n\t\t\ttheme={theme}\n\t\t\tdismiss={popoutNavigation?.goBack}\n\t\t\tcolorModel={colorModel}\n\t\t\tisValidName={useValidateTokenName(parentFolderId ?? COLOR_ENTITY_ROOT_ID)}\n\t\t/>\n\t)\n})\n\n/**\n * Returns a callback to validate the name of a color token.\n * A token name is valid if:\n * - It is not empty\n * - No other token exists with the same name and folder path\n */\nfunction useValidateTokenName(rootFolderId: NodeID) {\n\treturn React.useCallback(\n\t\t(name: string) => {\n\t\t\tif (name.length === 0) return false\n\n\t\t\t// Check all tokens that don't have entity references as they won't be caught by wouldAssetEntityCollide.\n\t\t\t// If the root folder is not the color entity root then the token we are creating can't clash with these unreferenced\n\t\t\t// tokens so we skip the check.\n\t\t\tif (rootFolderId === COLOR_ENTITY_ROOT_ID) {\n\t\t\t\tconst tokens = ColorStyleTokenListNode.getTokenNodes(engine.tree)\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tconst referenceNodeId = buildReferenceNodeId(COLOR_ENTITY_ROOT_ID, token.id)\n\t\t\t\t\tconst referenceNode = engine.tree.getNode(referenceNodeId)\n\t\t\t\t\tif (referenceNode) continue\n\n\t\t\t\t\tif (token.name === name) return false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst path = splitPathToSegments(name)\n\t\t\tconst resolvedName = path.at(-1)\n\t\t\tif (!resolvedName || resolvedName.length === 0) return false\n\n\t\t\treturn !wouldAssetEntityCollide(engine.tree, path, rootFolderId, \"reference\")\n\t\t},\n\t\t[rootFolderId],\n\t)\n}\n", "import { PreferMouseDown } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { Button, SegmentedControl, SegmentedControlItem, Stack, TextInput } from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport { unhandledError } from \"@framerjs/shared\"\nimport { renameEntityReferenceNode } from \"document/components/chrome/assets/actions/rename.ts\"\nimport { referenceUnreferencedNodesByTypeRoot } from \"document/components/chrome/assets/actions/utils.ts\"\nimport { sampleColor } from \"document/components/tools/utils/sampleColor.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { COLOR_ENTITY_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { buildReferenceNodeId } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isColorStyleTokenNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { ConvertColor } from \"library/index.ts\"\nimport React, { useEffect, useRef, useState } from \"react\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { ColorPickerInput } from \"../ColorPickerInput.tsx\"\nimport { IconMoon } from \"../icons/IconMoon.tsx\"\nimport { IconSun } from \"../icons/IconSun.tsx\"\nimport type { ColorModel } from \"../types.ts\"\n\ntype CreateToken = (value: Pick<ColorStyleTokenNode, \"light\" | \"dark\" | \"name\">) => void\n\ninterface SharedProps {\n\ttheme?: Theme\n\ttoken?: ColorStyleTokenNode\n\tcolor?: string\n\tallowRenaming?: boolean\n\tdismiss: (() => void) | undefined\n\tcolorModel: ColorModel\n\tisValidName: (name: string) => boolean\n\tcreateTokenAction?: CreateToken\n}\n\ntype Theme = \"light\" | \"dark\"\ninterface CreateProps extends SharedProps {\n\tcolor: string\n\tcreateTokenAction: CreateToken\n}\n\ninterface EditProps extends SharedProps {\n\ttoken: ColorStyleTokenNode\n}\n\ntype Props = CreateProps | EditProps\n\ninterface InitialColorPickerState {\n\tname: string\n\tlightColor: string\n\tdarkColor: string | undefined\n}\n\nfunction createInitialState(\n\ttoken: ColorStyleTokenNode | undefined,\n\tcolor: string | undefined,\n\tcolorForExternalColor: { [externalColor: string]: string } | null,\n): InitialColorPickerState {\n\tlet name: string = \"\"\n\tlet initialLightColor: string = \"\"\n\tlet initialDarkColor: string | undefined = undefined\n\n\tif (token) {\n\t\tinitialLightColor = colorForExternalColor?.[token.light] ?? token.light\n\t\tinitialDarkColor = token.dark ? (colorForExternalColor?.[token.dark] ?? token.dark) : token.dark\n\n\t\tname = token.name\n\t} else if (color) {\n\t\tinitialLightColor = colorForExternalColor?.[color] ?? color\n\t}\n\n\treturn {\n\t\tname,\n\t\tlightColor: initialLightColor,\n\t\tdarkColor: initialDarkColor,\n\t}\n}\n\nexport const ColorPickerTokenEdit = React.memo(\n\t({\n\t\tcolor: initialColor,\n\t\ttoken,\n\t\ttheme: initialTheme = \"light\",\n\t\tallowRenaming = true,\n\t\tcolorModel,\n\t\tisValidName,\n\t\tcreateTokenAction,\n\t\tdismiss,\n\t}: Props) => {\n\t\tconst [theme, setTheme] = useState(initialTheme)\n\t\tconst colorForExternalColorRef = useRef<{ [externalColor: string]: string } | null>(null)\n\t\tif (colorForExternalColorRef.current === null) {\n\t\t\tcolorForExternalColorRef.current = {}\n\t\t}\n\n\t\tconst [name, setName] = useState(\n\t\t\t() => createInitialState(token, initialColor, colorForExternalColorRef.current).name,\n\t\t)\n\t\tconst [lightColor, setLightColor] = useState(\n\t\t\t() => createInitialState(token, initialColor, colorForExternalColorRef.current).lightColor,\n\t\t)\n\t\tconst [darkColor, setDarkColor] = useState(\n\t\t\t() => createInitialState(token, initialColor, colorForExternalColorRef.current).darkColor,\n\t\t)\n\n\t\tconst inputField = useRef<HTMLInputElement>(null)\n\n\t\t// Update state if the props change externally (e.g. via undo)\n\t\tuseEffect(() => {\n\t\t\tconst newState = createInitialState(token, initialColor, colorForExternalColorRef.current)\n\t\t\tsetName(newState.name)\n\t\t\tsetLightColor(newState.lightColor)\n\t\t\tsetDarkColor(newState.darkColor)\n\t\t}, [token, initialColor])\n\n\t\t// These helpers are not memoed because the component itself is memoed.\n\t\tconst onChangeColor = engine.scheduler.wrapHandler((color: string) => {\n\t\t\tif (theme === \"light\") {\n\t\t\t\tsetLightColor(color)\n\t\t\t} else {\n\t\t\t\tsetDarkColor(color)\n\t\t\t}\n\n\t\t\tconst rgbValue = ConvertColor.toRgbString(color)\n\t\t\tconst colorKey = theme === \"light\" ? \"light\" : \"dark\"\n\n\t\t\tcolorForExternalColorRef.current = { [rgbValue]: color }\n\n\t\t\tif (!token) return\n\n\t\t\tconst node = engine.tree.get(token.id)\n\t\t\tif (isColorStyleTokenNode(node)) {\n\t\t\t\t// Guard against colors installed via VEX (vex.ts) being updated\n\t\t\t\tif (node.installed) return\n\t\t\t\tnode.set({ [colorKey]: color })\n\t\t\t\trecord(\"color_token_update\", { valueLight: node.light, valueDark: node.dark })\n\t\t\t}\n\t\t})\n\n\t\tconst onSelectTheme = (theme: Theme) => {\n\t\t\tsetTheme(theme)\n\t\t}\n\n\t\tconst cleanName = () => name.trim()\n\n\t\tconst hasNameChanged = () => {\n\t\t\treturn token?.name ? token.name !== cleanName() : true\n\t\t}\n\n\t\tconst isDoneEnabled = () => {\n\t\t\tif (!hasNameChanged()) return true\n\n\t\t\tconst trimmedName = cleanName()\n\t\t\treturn !!trimmedName && isValidName(trimmedName)\n\t\t}\n\n\t\tconst onDone = engine.scheduler.wrapHandler(() => {\n\t\t\tif (!isDoneEnabled()) return\n\t\t\tconst trimmedName = cleanName()\n\n\t\t\tif (token) {\n\t\t\t\tif (hasNameChanged()) {\n\t\t\t\t\trenameColorToken(token.id, trimmedName, lightColor, darkColor)\n\t\t\t\t}\n\t\t\t\tdismiss?.()\n\t\t\t} else if (createTokenAction) {\n\t\t\t\tcreateTokenAction({ name: trimmedName, light: lightColor, dark: darkColor })\n\t\t\t}\n\t\t})\n\n\t\tconst onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tonDone()\n\t\t\t\t\tbreak\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\tonDone()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tconst onBlur = engine.scheduler.wrapHandler(() => {\n\t\t\tif (!token) return\n\t\t\tif (!isDoneEnabled()) return\n\t\t\tconst trimmedName = cleanName()\n\t\t\tif (!hasNameChanged()) return\n\t\t\tconst node = engine.tree.get(token.id)\n\t\t\tif (!isColorStyleTokenNode(node)) return\n\t\t\tnode.set({ name: trimmedName })\n\t\t})\n\n\t\tconst onSampleColor = () => {\n\t\t\tsampleColor(engine)\n\t\t\t\t.then(\n\t\t\t\t\tengine.scheduler.wrapHandler((color: string | undefined) => {\n\t\t\t\t\t\tif (!color) return\n\t\t\t\t\t\tonChangeColor(color)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.catch(unhandledError)\n\t\t}\n\n\t\treturn (\n\t\t\t<PreferMouseDown enabled={false}>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\t\tpaddingLeft: dimensions.css.popoverPadding,\n\t\t\t\t\t\tpaddingRight: dimensions.css.popoverPadding,\n\t\t\t\t\t\tpaddingBottom: dimensions.css.popoverPadding,\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: \"auto\",\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{allowRenaming && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\t\tmargin: `0 1px ${dimensions.css.inputSpacing} 0`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\tref={inputField}\n\t\t\t\t\t\t\t\tvalue={name || \"\"}\n\t\t\t\t\t\t\t\tonChange={setName}\n\t\t\t\t\t\t\t\tplaceholder=\"Name\"\n\t\t\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmarginTop: allowRenaming ? dimensions.css.inputSpacing : 0,\n\t\t\t\t\t\t\tmarginBottom: dimensions.css.inputSpacing,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SegmentedControl enabled>\n\t\t\t\t\t\t\t<SegmentedControlItem<Theme>\n\t\t\t\t\t\t\t\ttitle=\"Light\"\n\t\t\t\t\t\t\t\tselected={theme === \"light\"}\n\t\t\t\t\t\t\t\tidentifier=\"light\"\n\t\t\t\t\t\t\t\tonSelect={onSelectTheme}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconSun />\n\t\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t\t\t<SegmentedControlItem<Theme>\n\t\t\t\t\t\t\t\ttitle=\"Dark\"\n\t\t\t\t\t\t\t\tselected={theme === \"dark\"}\n\t\t\t\t\t\t\t\tidentifier=\"dark\"\n\t\t\t\t\t\t\t\tonSelect={onSelectTheme}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<IconMoon />\n\t\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t\t</SegmentedControl>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ColorPickerInput\n\t\t\t\t\t\tengine={engine}\n\t\t\t\t\t\tonChange={onChangeColor}\n\t\t\t\t\t\t// darkColor can be undefined, show light color as a fallback in the UI.\n\t\t\t\t\t\tcolor={theme === \"light\" ? lightColor : (darkColor ?? lightColor)}\n\t\t\t\t\t\tcolorModel={colorModel}\n\t\t\t\t\t\tsampleColor={onSampleColor}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{!token && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\theight: 1,\n\t\t\t\t\t\t\t\t\tbackground: colors.panelDivider,\n\t\t\t\t\t\t\t\t\tmarginTop: dimensions.css.popoverPadding,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Stack direction=\"row\" paddingTop={dimensions.css.popoverPadding}>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ttitle=\"Create\"\n\t\t\t\t\t\t\t\t\tonClick={onDone}\n\t\t\t\t\t\t\t\t\tstyle={buttonStyle}\n\t\t\t\t\t\t\t\t\tenabled={isDoneEnabled()}\n\t\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</PreferMouseDown>\n\t\t)\n\t},\n)\n\nconst buttonStyle: React.CSSProperties = { flexGrow: 1 }\n\nfunction renameColorToken(tokenId: NodeID, name: string, lightColor: string, darkColor: string | undefined) {\n\tconst node = engine.tree.get(tokenId)\n\tif (!node || !isColorStyleTokenNode(node)) return\n\t// Guard against colors installed via VEX (vex.ts) being updated\n\tif (node.installed) return\n\n\tconst entityReferenceNodeId = buildReferenceNodeId(COLOR_ENTITY_ROOT_ID, node.id)\n\tconst entityReferenceNode = engine.tree.get(entityReferenceNodeId)\n\tif (!entityReferenceNode) {\n\t\treferenceUnreferencedNodesByTypeRoot(engine, COLOR_ENTITY_ROOT_ID)\n\t}\n\n\tnode.set({ light: lightColor, dark: darkColor })\n\tvoid renameEntityReferenceNode(engine, entityReferenceNodeId, name, { popout: true })\n}\n", "export function IconMoon() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n\t\t\t<path\n\t\t\t\td=\"M 13.977 9.26 C 13.912 9.051 13.719 8.91 13.501 8.912 L 13.367 8.936 C 11.588 9.427 9.682 8.924 8.378 7.618 C 7.074 6.312 6.572 4.406 7.065 2.627 C 7.077 2.592 7.083 2.555 7.083 2.517 C 7.095 2.358 7.026 2.202 6.9 2.103 C 6.774 2.004 6.607 1.974 6.455 2.023 C 3.62 2.818 1.757 5.523 2.026 8.455 C 2.294 11.387 4.618 13.709 7.549 13.975 C 10.481 14.241 13.185 12.376 13.977 9.54 C 14.008 9.449 14.008 9.351 13.977 9.26 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconSun() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n\t\t\t<g fill=\"currentColor\">\n\t\t\t\t<path d=\"M8 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM8 14a1 1 0 1 1 0 2 1 1 0 0 1 0-2ZM16 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\" />\n\t\t\t</g>\n\t\t\t<g fill=\"currentColor\">\n\t\t\t\t<path d=\"M13.657 2.343a1 1 0 1 1-1.415 1.414 1 1 0 0 1 1.415-1.414ZM3.757 12.243a1 1 0 1 1-1.415 1.414 1 1 0 0 1 1.415-1.414ZM13.657 13.657a1 1 0 1 1-1.414-1.415 1 1 0 0 1 1.414 1.415ZM3.757 3.757a1 1 0 1 1-1.414-1.415 1 1 0 0 1 1.414 1.415Z\" />\n\t\t\t</g>\n\t\t\t<path fill=\"currentColor\" d=\"M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z\" />\n\t\t</svg>\n\t)\n}\n", "import type { PackageIdentifier } from \"@framerjs/framer-runtime\"\nimport { Button, useReadOnly } from \"@framerjs/fresco\"\nimport { palette } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport { EntityRow } from \"document/components/chrome/assets/EntityRow.tsx\"\nimport { expandAssetEntityItemsFromNode } from \"document/components/chrome/assets/utils/expandAssetEntityItems.ts\"\nimport { usePresetAssetRows } from \"document/components/chrome/assets/utils/usePresetAssetRows.ts\"\nimport { EmptyEntityAssetResults } from \"document/components/chrome/properties/panels/EmptyEntityAssetResults.tsx\"\nimport {\n\tColorStyleTokenPopoutContent,\n\tEditColorStyleTokenNodePopout,\n\tcreateColorItemContextMenuItems,\n} from \"document/components/chrome/properties/utils/getColorStyleTokenRowProps.tsx\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { ColorStyleTokenListNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport type { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { ColorEntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { isColorStyleTokenNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport React, { useCallback, useLayoutEffect, useMemo } from \"react\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport * as styles from \"../../../properties/panels/SelectStyleEntityAssetPopoutContent.styles.ts\"\nimport { usePopoutContent } from \"../../PopoutButton.tsx\"\nimport { TableSearchBar } from \"../../TableSearchBar.tsx\"\nimport { ColorTokenPopout } from \"../ColorTokenPopout.tsx\"\nimport type { ColorModel } from \"../types.ts\"\n\nconst EMPTY_SET = new Set<NodeID>()\n\ninterface ColorPickerEntityAssetTokensProps {\n\tcurrentColorValue: string\n\tcolorModel: ColorModel\n\tselectedId: NodeID | null\n\tonSelect: (token: ColorStyleTokenNode, packageIdentifier?: PackageIdentifier) => void\n}\n\nexport const ColorPickerEntityAssetTokens = React.memo(function ColorPickerEntityAssetTokens({\n\tcurrentColorValue,\n\tcolorModel,\n\tselectedId,\n\tonSelect,\n}: ColorPickerEntityAssetTokensProps) {\n\tconst isReadOnly = useReadOnly()\n\tconst handleToggleCollapse = useCallback(\n\t\t(id: NodeID) => engine.stores.chromeStore.toggleAssetEntityItem(id, true),\n\t\t[],\n\t)\n\n\tconst onCreateToken = useCallback(\n\t\t(token: ColorStyleTokenNode) => {\n\t\t\tsetSearchValue(\"\")\n\t\t\tonSelect(token)\n\t\t},\n\t\t[onSelect],\n\t)\n\n\tconst { present: presentNewColorToken } = usePopoutContent({\n\t\tpopout: <ColorTokenPopout value={currentColorValue} onChange={onCreateToken} colorModel={colorModel} />,\n\t\tnavigationTitle: \"New Color Style\",\n\t})\n\n\tconst { searchValue, setSearchValue, hasSearch, rows, hasAnyItems, hasUnreferencedItems, typeRootId } =\n\t\tusePresetAssetRows(\n\t\t\t() => ColorStyleTokenListNode.getTokenNodes(engine.tree),\n\t\t\t() => ColorEntityTypeRootNode.get(engine.tree),\n\t\t\tid => {\n\t\t\t\tconst reference = engine.tree.getNodeWithTrait(id, isColorStyleTokenNode)\n\t\t\t\tif (!reference) return\n\t\t\t\treturn {\n\t\t\t\t\tlight: reference.light,\n\t\t\t\t\tdark: reference.dark,\n\t\t\t\t} as const\n\t\t\t},\n\t\t)\n\n\tconst handleSelect = useCallback(\n\t\t(id: NodeID) => {\n\t\t\tconst node = engine.tree.get(id)\n\t\t\tif (!isColorStyleTokenNode(node)) return\n\n\t\t\tonSelect(node)\n\t\t},\n\t\t[onSelect],\n\t)\n\n\tconst getEditButton = useCallback((id: NodeID) => {\n\t\treturn <EntityAssetReferenceEditButton id={id} />\n\t}, [])\n\n\tuseLayoutEffect(() => {\n\t\tif (!selectedId) return\n\n\t\tconst id = ColorEntityTypeRootNode.get(engine.tree)?.id\n\t\tif (!id) return\n\t\t// We can't update store data while rendering\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t// Make sure we expand the folders until the selected node\n\t\t\texpandAssetEntityItemsFromNode(engine, selectedId, id, true)\n\t\t})\n\t}, [selectedId])\n\n\tconst selectedItemIds = useMemo(() => (selectedId ? new Set([selectedId]) : EMPTY_SET), [selectedId])\n\n\tconst isEmpty = rows.length === 0\n\treturn (\n\t\t<div className={styles.container}>\n\t\t\t<div className={cx(styles.listWrapper, hasSearch && !isEmpty && styles.paddingBottom)}>\n\t\t\t\t{hasAnyItems && (\n\t\t\t\t\t<div className={cx(styles.divider, styles.sticky, styles.marginTop)}>\n\t\t\t\t\t\t<TableSearchBar\n\t\t\t\t\t\t\tvalue={searchValue}\n\t\t\t\t\t\t\tenabled\n\t\t\t\t\t\t\tonChange={setSearchValue}\n\t\t\t\t\t\t\tplaceholder={Dictionary.SearchEllipsis}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<EmptyEntityAssetResults hasSearch={hasSearch} hasResults={!isEmpty} />\n\n\t\t\t\t{!isEmpty && typeRootId && (\n\t\t\t\t\t<div className={styles.itemsWrapper}>\n\t\t\t\t\t\t{rows.map(row => (\n\t\t\t\t\t\t\t<EntityRow\n\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\ttype={row.type}\n\t\t\t\t\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\t\t\t\t\tdepth={row.depth}\n\t\t\t\t\t\t\t\tid={row.id}\n\t\t\t\t\t\t\t\ttitle={row.title}\n\t\t\t\t\t\t\t\tselected={selectedItemIds.has(row.id)}\n\t\t\t\t\t\t\t\tcollapsed={row.collapsed}\n\t\t\t\t\t\t\t\tcolor={palette.dark20}\n\t\t\t\t\t\t\t\tonToggleCollapse={handleToggleCollapse}\n\t\t\t\t\t\t\t\tonSelectItem={isReadOnly ? undefined : handleSelect}\n\t\t\t\t\t\t\t\tnewItemNavigationTitle=\"New Color Style\"\n\t\t\t\t\t\t\t\treferenceCreateContextMenuItems={createColorItemContextMenuItems}\n\t\t\t\t\t\t\t\tPopoutContent={ColorStyleTokenPopoutContent}\n\t\t\t\t\t\t\t\tgetEditButton={getEditButton}\n\t\t\t\t\t\t\t\treferenceClassName={styles.itemWrapper}\n\t\t\t\t\t\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\t\t\t\t\t\tlight={row.light}\n\t\t\t\t\t\t\t\tdark={row.dark}\n\t\t\t\t\t\t\t\tpopout\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{!hasSearch && (\n\t\t\t\t<div className={cx(styles.newStyleButtonWrapper, isEmpty && styles.noStylesButton)}>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tenabled={!isReadOnly}\n\t\t\t\t\t\tclassName={styles.newStyleButton}\n\t\t\t\t\t\ttitle={Dictionary.NewStyle}\n\t\t\t\t\t\tonClick={presentNewColorToken}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\nfunction EntityAssetReferenceEditButton({ id }: { id: NodeID }) {\n\tconst colorToken = useEngineState(() => engine.tree.get<ColorStyleTokenNode>(id), [], EngineChange.Tree)\n\tif (isNull(colorToken)) return null\n\n\treturn <EditColorButton colorToken={colorToken} />\n}\n\nfunction EditColorButton({ colorToken }: { colorToken: ColorStyleTokenNode }) {\n\tconst isReadOnly = useReadOnly()\n\n\tconst { present: editToken } = usePopoutContent({\n\t\tpopout: <EditColorStyleTokenNodePopout colorToken={colorToken} />,\n\t\tnavigationTitle: \"Edit Color Style\",\n\t})\n\n\tconst handleEditToken = useCallback(\n\t\t(event: React.MouseEvent<HTMLElement>) => {\n\t\t\tevent?.stopPropagation()\n\n\t\t\teditToken()\n\t\t},\n\t\t[editToken],\n\t)\n\n\tif (isReadOnly) return null\n\n\treturn <Button className={styles.editButton} small title={Dictionary.Edit} onClick={handleEditToken} />\n}\n", "import \"SelectStyleEntityAssetPopoutContent.styles_2hhny8.wyw.css\"; export const listWrapper = \"listWrapper_l184m9tn\";\nexport const noPaddingTop = \"noPaddingTop_ngigcnt\";\nexport const divider = \"divider_d1du6z0j\";\nexport const itemsWrapper = \"itemsWrapper_i1quduhy\";\nexport const marginTop = \"marginTop_mnw4tg6\";\nexport const sticky = \"sticky_sp2ghbf\";\nexport const newStyleButtonWrapper = \"newStyleButtonWrapper_n1n2g0vl\";\nexport const newStyleButton = \"newStyleButton_n1v9q03l\";\nexport const noStylesButton = \"noStylesButton_n7mqhvd\";\nexport const editButton = \"editButton_evj928p\";\nexport const itemWrapper = \"itemWrapper_iu88gkv\";\nexport const paddingBottom = \"paddingBottom_p1b4ifmh\";\nexport const scroll = \"scroll_sazlnea\";\nexport const container = \"container_c4ewaa3\";\nexport const scrollWrapper = \"scrollWrapper_s1hq378l\";", "import type { SearchBarProps } from \"@framerjs/fresco\"\nimport { CenterChild, IconInputClose, IconInputSearch, SearchBar, Stack, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport type { FontSize } from \"@framerjs/fresco/src/tokens/fonts\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { isCommandKeyPressed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { AllOrNothing } from \"document/models/CanvasTree/traits/utils/AllOrNothing.ts\"\nimport React from \"react\"\nimport * as styles from \"./TableSearchBar.styles.ts\"\n\nexport const dataIsTableSearchBarDataAttribute = \"data-is-table-search-bar\"\nexport const dataIsTableSearchBarSelector = `[${dataIsTableSearchBarDataAttribute}]`\n\ninterface CategoryProps {\n\tcategory: string | undefined\n\tonSelectCategory: () => void\n\tonClearCategory: () => void\n}\n\ntype Props = Pick<SearchBarProps, \"enabled\" | \"value\" | \"onChange\" | \"placeholder\"> &\n\tAllOrNothing<CategoryProps> & {\n\t\tfontSize?: FontSize\n\t\tfullWidthSeparator?: boolean\n\t\tchildren?: React.ReactNode\n\t\tforSpreadsheet?: boolean\n\t\tkeyboardInteractionBlocked?: boolean\n\t\tsearchShortcutBlocked?: boolean\n\t}\n\nexport function TableSearchBar({\n\tenabled,\n\tvalue,\n\tonChange,\n\tplaceholder,\n\tcategory,\n\tonSelectCategory,\n\tonClearCategory,\n\tfontSize,\n\tchildren,\n\tfullWidthSeparator = false,\n\tforSpreadsheet = false,\n\tkeyboardInteractionBlocked = false,\n\tsearchShortcutBlocked = false,\n}: Props) {\n\tconst ref = React.useRef<HTMLInputElement>(null)\n\n\tReact.useEffect(() => {\n\t\tif (!enabled || searchShortcutBlocked) return\n\n\t\tconst handleCmdF = (event: KeyboardEvent) => {\n\t\t\tif (isCommandKeyPressed(event) && event.key === \"f\") {\n\t\t\t\tref.current?.focus()\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t}\n\n\t\t// Listen for cmd+f during the capture phase because the global cmd+f accelerator for the content\n\t\t// panel search also listens during the capture phase, and it unconditionally stops propagation,\n\t\t// which completely prevents any events from bubbling.\n\t\twindow.addEventListener(\"keydown\", handleCmdF, true)\n\t\treturn () => window.removeEventListener(\"keydown\", handleCmdF, true)\n\t}, [enabled, searchShortcutBlocked])\n\n\tfunction clearCategory(event: React.MouseEvent) {\n\t\t// Prevent select category to be called as well\n\t\tevent.stopPropagation()\n\t\tonClearCategory?.()\n\t}\n\n\tfunction handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n\t\tif (event.key === \"Backspace\" || event.key === \"Delete\") {\n\t\t\tif (event.currentTarget.value === \"\" && !event.repeat) {\n\t\t\t\tonClearCategory?.()\n\t\t\t}\n\t\t}\n\t}\n\n\tconst style: React.CSSProperties & Record<string, unknown> = {\n\t\t\"--search-bar-font-size\": fontSize,\n\t}\n\n\treturn (\n\t\t<Stack\n\t\t\tclassName={cx(\n\t\t\t\tstyles.row,\n\t\t\t\tfullWidthSeparator && styles.fullWidthBottomSeparator,\n\t\t\t\tforSpreadsheet && styles.spreadsheetRow,\n\t\t\t)}\n\t\t\tdirection=\"row\"\n\t\t\tgap={0}\n\t\t\talignItems=\"center\"\n\t\t\tstyle={style}\n\t\t\t{...{ [dataIsTableSearchBarDataAttribute]: true }}\n\t\t>\n\t\t\t{category && (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tpadding={8}\n\t\t\t\t\tgap={`calc(${dimensions.css.inputSpacing} / 2)`}\n\t\t\t\t\tclassName={styles.categoryToken}\n\t\t\t\t\tonClick={onSelectCategory}\n\t\t\t\t>\n\t\t\t\t\t<CenterChild>\n\t\t\t\t\t\t<IconInputSearch />\n\t\t\t\t\t</CenterChild>\n\t\t\t\t\t<span className={truncateWithEllipsis}>{category}</span>\n\t\t\t\t\t<CenterChild className={styles.clearIconWrapper} onClick={clearCategory} title={Dictionary.Clear}>\n\t\t\t\t\t\t<IconInputClose />\n\t\t\t\t\t</CenterChild>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t\t<SearchBar\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\tenabled={enabled}\n\t\t\t\tonChange={onChange}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\ticonPosition=\"left\"\n\t\t\t\tisIconVisible={!category}\n\t\t\t\tclassName={cx(styles.searchBar)}\n\t\t\t\tplaceholder={placeholder ?? Dictionary.SearchEllipsis}\n\t\t\t\ttabIndex={keyboardInteractionBlocked ? -1 : undefined}\n\t\t\t/>\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n", "import \"TableSearchBar.styles_mkfm1c.wyw.css\"; export const row = \"row_r1scmgcx\";\nexport const spreadsheetRow = \"spreadsheetRow_s1t189mt\";\nexport const fullWidthBottomSeparator = \"fullWidthBottomSeparator_fcnd7nx\";\nexport const searchBar = \"searchBar_s19qx2a5\";\nexport const categoryToken = \"categoryToken_c1fn15ez\";\nexport const clearIconWrapper = \"clearIconWrapper_cb1iqun\";", "import \"ColorPopoutButton.styles_1oignw2.wyw.css\"; export const innerText = \"innerText_ifinndj\";", "/**\n * Copied from: https://www.six-group.com/en/products-services/financial-information/data-standards.html#scrollTo=currency-codes\n * Linked to from MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#currency\n */\nexport const numberFormattingCurrencyOptions = [\n\t\"AED\",\n\t\"AFN\",\n\t\"ALL\",\n\t\"AMD\",\n\t\"ANG\",\n\t\"AOA\",\n\t\"ARS\",\n\t\"AUD\",\n\t\"AWG\",\n\t\"AZN\",\n\t\"BAM\",\n\t\"BBD\",\n\t\"BDT\",\n\t\"BGN\",\n\t\"BHD\",\n\t\"BIF\",\n\t\"BMD\",\n\t\"BND\",\n\t\"BOB\",\n\t\"BOV\",\n\t\"BRL\",\n\t\"BSD\",\n\t\"BTN\",\n\t\"BWP\",\n\t\"BYN\",\n\t\"BZD\",\n\t\"CAD\",\n\t\"CDF\",\n\t\"CHE\",\n\t\"CHF\",\n\t\"CHW\",\n\t\"CLF\",\n\t\"CLP\",\n\t\"CNY\",\n\t\"COP\",\n\t\"COU\",\n\t\"CRC\",\n\t\"CUC\",\n\t\"CUP\",\n\t\"CVE\",\n\t\"CZK\",\n\t\"DJF\",\n\t\"DKK\",\n\t\"DOP\",\n\t\"DZD\",\n\t\"EGP\",\n\t\"ERN\",\n\t\"ETB\",\n\t\"EUR\",\n\t\"FJD\",\n\t\"FKP\",\n\t\"GBP\",\n\t\"GEL\",\n\t\"GHS\",\n\t\"GIP\",\n\t\"GMD\",\n\t\"GNF\",\n\t\"GTQ\",\n\t\"GYD\",\n\t\"HKD\",\n\t\"HNL\",\n\t\"HRK\",\n\t\"HTG\",\n\t\"HUF\",\n\t\"IDR\",\n\t\"ILS\",\n\t\"INR\",\n\t\"IQD\",\n\t\"IRR\",\n\t\"ISK\",\n\t\"JMD\",\n\t\"JOD\",\n\t\"JPY\",\n\t\"KES\",\n\t\"KGS\",\n\t\"KHR\",\n\t\"KMF\",\n\t\"KPW\",\n\t\"KRW\",\n\t\"KWD\",\n\t\"KYD\",\n\t\"KZT\",\n\t\"LAK\",\n\t\"LBP\",\n\t\"LKR\",\n\t\"LRD\",\n\t\"LSL\",\n\t\"LYD\",\n\t\"MAD\",\n\t\"MDL\",\n\t\"MGA\",\n\t\"MKD\",\n\t\"MMK\",\n\t\"MNT\",\n\t\"MOP\",\n\t\"MRU\",\n\t\"MUR\",\n\t\"MVR\",\n\t\"MWK\",\n\t\"MXN\",\n\t\"MXV\",\n\t\"MYR\",\n\t\"MZN\",\n\t\"NAD\",\n\t\"NGN\",\n\t\"NIO\",\n\t\"NOK\",\n\t\"NPR\",\n\t\"NZD\",\n\t\"OMR\",\n\t\"PAB\",\n\t\"PEN\",\n\t\"PGK\",\n\t\"PHP\",\n\t\"PKR\",\n\t\"PLN\",\n\t\"PYG\",\n\t\"QAR\",\n\t\"RON\",\n\t\"RSD\",\n\t\"RUB\",\n\t\"RWF\",\n\t\"SAR\",\n\t\"SBD\",\n\t\"SCR\",\n\t\"SDG\",\n\t\"SEK\",\n\t\"SGD\",\n\t\"SHP\",\n\t\"SLE\",\n\t\"SLL\",\n\t\"SOS\",\n\t\"SRD\",\n\t\"SSP\",\n\t\"STN\",\n\t\"SVC\",\n\t\"SYP\",\n\t\"SZL\",\n\t\"THB\",\n\t\"TJS\",\n\t\"TMT\",\n\t\"TND\",\n\t\"TOP\",\n\t\"TRY\",\n\t\"TTD\",\n\t\"TWD\",\n\t\"TZS\",\n\t\"UAH\",\n\t\"UGX\",\n\t\"USD\",\n\t\"USN\",\n\t\"UYI\",\n\t\"UYU\",\n\t\"UYW\",\n\t\"UZS\",\n\t\"VED\",\n\t\"VES\",\n\t\"VND\",\n\t\"VUV\",\n\t\"WST\",\n\t\"XAF\",\n\t\"XAG\",\n\t\"XAU\",\n\t\"XBA\",\n\t\"XBB\",\n\t\"XBC\",\n\t\"XBD\",\n\t\"XCD\",\n\t\"XDR\",\n\t\"XOF\",\n\t\"XPD\",\n\t\"XPF\",\n\t\"XPT\",\n\t\"XSU\",\n\t\"XTS\",\n\t\"XUA\",\n\t\"XXX\",\n\t\"YER\",\n\t\"ZAR\",\n\t\"ZMW\",\n\t\"ZWL\",\n] as const\n\n/**\n * Copied from: https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n * Linked to from MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#unit\n */\nexport const numberFormattingUnitTypes = [\n\t\"acre\",\n\t\"bit\",\n\t\"byte\",\n\t\"celsius\",\n\t\"centimeter\",\n\t\"day\",\n\t\"degree\",\n\t\"fahrenheit\",\n\t\"fluid-ounce\",\n\t\"foot\",\n\t\"gallon\",\n\t\"gigabit\",\n\t\"gigabyte\",\n\t\"gram\",\n\t\"hectare\",\n\t\"hour\",\n\t\"inch\",\n\t\"kilobit\",\n\t\"kilobyte\",\n\t\"kilogram\",\n\t\"kilometer\",\n\t\"liter\",\n\t\"megabit\",\n\t\"megabyte\",\n\t\"meter\",\n\t\"mile\",\n\t\"mile-scandinavian\",\n\t\"milliliter\",\n\t\"millimeter\",\n\t\"millisecond\",\n\t\"minute\",\n\t\"month\",\n\t\"ounce\",\n\t\"percent\",\n\t\"petabyte\",\n\t\"pound\",\n\t\"second\",\n\t\"stone\",\n\t\"terabit\",\n\t\"terabyte\",\n\t\"week\",\n\t\"yard\",\n\t\"year\",\n] as const\n", "import \"ValueTransformChain.styles_8xelte.wyw.css\"; export const topMargin = \"topMargin_t1sh08fv\";\nexport const topMarginWithError = \"topMarginWithError_t1plzp3r\";\nexport const dividerAbove = \"dividerAbove_d1onjkvi\";\nexport const warningContainer = \"warningContainer_w10su6nm\";\nexport const typeWarningReplaceButton = \"typeWarningReplaceButton_t10qkdqj\";", "import { assert } from \"@framerjs/shared\"\nimport type { CollectionVariableInfo } from \"document/components/utils/getEditableCollectionVariableInfo.ts\"\nimport { useResolvedImageThumbnail } from \"document/components/utils/useResolvedImageThumbnail.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CollectionItemNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isCollectionItemNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { VariableID, VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport type { ImageControlProp } from \"document/models/controlProps/ControlProp.ts\"\nimport { prefixControlProps } from \"document/models/controlProps/controlPropKey.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { isEqual } from \"library/render/utils/isEqual.ts\"\nimport { useCallback } from \"react\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { CollectionImagePopout } from \"../contentManagement/CollectionImagePopout.tsx\"\nimport type { CollectionItemChangeHandler } from \"../contentManagement/utils/CollectionItemChangeHandler.ts\"\nimport { PopoutButtonBackgroundPreview } from \"./PopoutButtonBackgroundPreview.tsx\"\nimport { VariablePopoutButton } from \"./VariablePopoutButton.tsx\"\n\nfunction getCollectionItemUpdate(\n\tcollectionItem: CollectionItemNode,\n\tvariableId: VariableID,\n\tgetUpdate: CollectionItemChangeHandler,\n): Partial<CollectionItemNode> | null {\n\tconst currentControlProp = collectionItem.getControlProp(variableId)\n\tconst newControlProp = getUpdate(currentControlProp)\n\n\tif (isEqual(currentControlProp, newControlProp)) return null\n\n\treturn prefixControlProps({ [variableId]: newControlProp })\n}\n\nfunction updateActiveCollectionItem(getUpdate: CollectionItemChangeHandler, variableId: VariableID, id: NodeID) {\n\tconst collectionItemNode = engine.tree.getNodeWithTrait(id, isCollectionItemNode)\n\tif (!collectionItemNode) {\n\t\treturn\n\t}\n\n\tconst update = getCollectionItemUpdate(collectionItemNode, variableId, getUpdate)\n\tif (!update) {\n\t\treturn\n\t}\n\n\tcollectionItemNode.set(update)\n}\n\nconst updateControlPropComparingLatestControlProp = engine.scheduler.wrapHandler(\n\t(getUpdate: CollectionItemChangeHandler, variableId: VariableID, id: NodeID) => {\n\t\tupdateActiveCollectionItem(getUpdate, variableId, id)\n\t},\n)\n\nconst resetControlProp = engine.scheduler.wrapHandler((variableId: VariableID, id: NodeID) => {\n\tupdateActiveCollectionItem(() => undefined, variableId, id)\n})\n\ninterface DataSourceImageVariableReferenceButtonProps {\n\treference: VariableReference\n\tpopoutId: string\n\tonRemove?: (reference: VariableReference) => void\n\texpectedType: VariableType | readonly VariableType[]\n\tvariableInfo: CollectionVariableInfo<ControlType.Image>\n}\n\n/**\n * DataSourceImageVariableReferenceButton is used to display the fill property of a Frame when the\n * data comes from a CMS collection. It has the button with a preview and the popup that shows ImagePicker.\n */\nexport function DataSourceImageVariableReferenceButton({\n\treference,\n\tpopoutId,\n\tonRemove,\n\texpectedType,\n\tvariableInfo,\n}: DataSourceImageVariableReferenceButtonProps) {\n\tconst fieldId = reference.id\n\n\tconst { collectionItemNode, controlDescription, controlProp, reducedControlProp } = variableInfo\n\n\tassert(\n\t\treducedControlProp.type === ControlType.ResponsiveImage || reducedControlProp.type === ControlType.Image,\n\t\t\"Expected reduced image\",\n\t)\n\n\tconst onChange = useCallback(\n\t\t(getUpdate: (current: ImageControlProp | undefined) => ImageControlProp) => {\n\t\t\tupdateControlPropComparingLatestControlProp(getUpdate, fieldId, collectionItemNode.id)\n\t\t},\n\t\t[fieldId, collectionItemNode],\n\t)\n\n\tconst onRemoveImage = useCallback(() => {\n\t\tresetControlProp(fieldId, collectionItemNode.id)\n\t}, [fieldId, collectionItemNode])\n\n\tconst imageUrl = useResolvedImageThumbnail(isString(controlProp.value) ? controlProp.value : undefined)\n\n\treturn (\n\t\t<VariablePopoutButton\n\t\t\treference={reference}\n\t\t\tpopoutId={popoutId}\n\t\t\tonRemove={onRemove}\n\t\t\tpopout={\n\t\t\t\t<CollectionImagePopout\n\t\t\t\t\tcontrolProp={reducedControlProp}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonRemove={onRemoveImage}\n\t\t\t\t\tmaxExtraImages={0}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tnavigationTitle={controlDescription.title}\n\t\t\texpectedType={expectedType}\n\t\t\tpreview={\n\t\t\t\timageUrl ? (\n\t\t\t\t\t<PopoutButtonBackgroundPreview\n\t\t\t\t\t\tbackground={imageUrl}\n\t\t\t\t\t\tbackgroundPositionX={controlProp.positionX}\n\t\t\t\t\t\tbackgroundPositionY={controlProp.positionY}\n\t\t\t\t\t/>\n\t\t\t\t) : undefined\n\t\t\t}\n\t\t/>\n\t)\n}\n", "import type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport React from \"react\"\nimport type { UsePopoutOptions } from \"./PopoutButton.tsx\"\nimport { popoutButtonDataAttribute, usePopoutContent } from \"./PopoutButton.tsx\"\nimport { VariableReferenceButton } from \"./VariableReferenceButton.tsx\"\n\ninterface Props extends Omit<UsePopoutOptions, \"id\"> {\n\texpectedType: VariableType | readonly VariableType[]\n\treference: VariableReference\n\tonRemove: ((dynamicValue: DynamicValue) => void) | undefined\n\thasError?: boolean\n\n\tisComputedValue?: boolean\n\tpopoutId?: string\n\tpreview?: React.ReactNode\n}\n\nexport function VariablePopoutButton({\n\texpectedType,\n\treference,\n\tonRemove,\n\thasError,\n\tpopoutId,\n\tisComputedValue,\n\tpreview,\n\t...popoutOptions\n}: Props) {\n\tconst ref = React.useRef<HTMLDivElement>(null)\n\n\tconst { present, dismiss } = usePopoutContent({\n\t\t...popoutOptions,\n\t\tid: popoutId,\n\t\tref,\n\t})\n\n\tconst keyDownHandler = (event: React.KeyboardEvent<HTMLElement>) => {\n\t\tswitch (event.key) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \" \":\n\t\t\t\tpresent()\n\t\t\t\tevent.preventDefault()\n\t\t\t\tbreak\n\t\t\tcase \"Escape\":\n\t\t\t\tdismiss()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\treturn (\n\t\t<VariableReferenceButton\n\t\t\tref={ref}\n\t\t\tonClick={present}\n\t\t\tonRemove={onRemove}\n\t\t\thasError={hasError}\n\t\t\treference={reference}\n\t\t\tonKeyDown={keyDownHandler}\n\t\t\texpectedType={expectedType}\n\t\t\ttabIndex={0}\n\t\t\tisComputedValue={isComputedValue}\n\t\t\tpreview={preview}\n\t\t\t{...{ [popoutButtonDataAttribute]: true }}\n\t\t/>\n\t)\n}\n", "import \"FetchDataValueButton.styles_1t9yg9a.wyw.css\"; export const button = \"button_b1njk4r9\";", "import type { ComboBoxListItem, ComboBoxListItemOption, ComboBoxProps } from \"@framerjs/fresco\"\nimport {\n\tComboBox,\n\tIconCogwheel,\n\tInputMessage,\n\tPopupButton,\n\tPopupButtonItem,\n\tReadOnlyContext,\n\tScroll,\n\tSpinner,\n\tStack,\n\tTextInput,\n\tThemeOverride,\n\tuseReadOnly,\n} from \"@framerjs/fresco\"\nimport { ComboBoxTextArea } from \"@framerjs/fresco/src/components/ComboBox\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { assert, assertNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasTree, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type {\n\tFetchDataControlProp,\n\tFetchDataValue,\n\tSafeFetchDataValue,\n} from \"document/models/CanvasTree/traits/FetchDataValue.ts\"\nimport {\n\tcollectVariablesFromURL,\n\tfetchPresetURLs,\n\tfillVariablesInURL,\n\tisConfiguredFetchDataValue,\n\tpatchFetchValue,\n} from \"document/models/CanvasTree/traits/FetchDataValue.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { isValidFetchDataValueResult } from \"library/modules/FetchClient.tsx\"\nimport { useStableCallback } from \"library/utils/useStableCallback.ts\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { titleCase } from \"utils/titleCase.ts\"\nimport { isArray, isObject, isString } from \"utils/typeChecks.ts\"\nimport { validateCustomCanonicalURL } from \"../../../utils/validateCustomCanonicalURL.ts\"\nimport { useControlPropRows } from \"../properties/codeComponentRows/ControlPropRowContext.tsx\"\nimport { DescriptionRow } from \"../properties/codeComponentRows/DescriptionRow.tsx\"\nimport { PanelRow } from \"../properties/rows/PanelRow.tsx\"\nimport { createVariableInScope } from \"../properties/utils/createVariableInScope.ts\"\nimport { doubleColumnClass } from \"../properties/utils/doubleColumn.styles.ts\"\nimport { isStatusGestureVariantDescendant } from \"../properties/utils/gestureStatusVariant.ts\"\nimport { useFetchURLsInActiveScope } from \"../properties/utils/useFetchURLsUsedInScope.ts\"\nimport type { ControlReferenceInfoProps } from \"./DynamicValueButton.tsx\"\nimport * as styles from \"./FetchDataValuePopout.styles.ts\"\nimport { PopoutButtonPreviewIconWrapper } from \"./PopoutButtonPreviewIconWrapper.tsx\"\nimport { PopoutButtonWithPreview } from \"./PopoutButtonWithPreview.tsx\"\nimport { VariableReferenceButton } from \"./VariableReferenceButton.tsx\"\nimport { fetchJSONFromSandbox } from \"./utils/fetchJSONFromSandbox.ts\"\n\nfunction collectResultKeyOptions(\n\texpectedType: FetchDataControlProp[\"type\"],\n\tvalue: unknown,\n\tresults: ComboBoxListItem[],\n\tpath = \"\",\n) {\n\tif (isValidFetchDataValueResult(expectedType, value)) {\n\t\tresults.push({\n\t\t\ttype: \"option\",\n\t\t\tvalue: path,\n\t\t\tlabel: String(value),\n\t\t\tenabled: true,\n\t\t})\n\t\treturn\n\t}\n\n\tif (isArray(value)) {\n\t\tfor (let i = 0; i <= value.length; i++) {\n\t\t\tconst item = value[i]\n\t\t\tcollectResultKeyOptions(expectedType, item, results, path.length > 0 ? `${path}.${i}` : `${i}`)\n\t\t}\n\t}\n\n\tif (isObject(value)) {\n\t\tfor (const key in value) {\n\t\t\tcollectResultKeyOptions(expectedType, value[key], results, path.length > 0 ? `${path}.${key}` : key)\n\t\t}\n\t}\n}\n\nconst cacheDurationOptions = [\n\t{\n\t\tvalue: 0,\n\t\ttitle: \"Never\",\n\t},\n\t{\n\t\tvalue: 10,\n\t\ttitle: \"10 Seconds\",\n\t},\n\t{\n\t\tvalue: 60,\n\t\ttitle: \"1 Minute\",\n\t},\n\t{\n\t\tvalue: 600,\n\t\ttitle: \"10 Minutes\",\n\t},\n\t{\n\t\tvalue: 3600,\n\t\ttitle: \"1 Hour\",\n\t},\n\t{\n\t\tvalue: 3600 * 24,\n\t\ttitle: \"1 Day\",\n\t},\n\t{\n\t\tvalue: 3600 * 24 * 7,\n\t\ttitle: \"1 Week\",\n\t},\n\t{\n\t\tvalue: 3600 * 24 * 30,\n\t\ttitle: \"1 Month\",\n\t},\n]\n\nconst credentialsOptions = [\n\t{\n\t\tvalue: \"same-origin\",\n\t\ttitle: \"Same Origin\",\n\t},\n\t{\n\t\tvalue: \"include\",\n\t\ttitle: \"Include\",\n\t},\n]\n\nfunction VariableValueRow({\n\tvalue,\n\tvariableName,\n\tonChangeVariable,\n\treadOnly,\n}: {\n\tvalue: VariableReference | string | undefined\n\tvariableName: string\n\treadOnly: boolean\n\tonChangeVariable: (variableName: string, value: VariableReference | string) => void\n}) {\n\tconst handleRemoveVariable = () => {\n\t\tonChangeVariable(variableName, \"\")\n\t}\n\n\tconst handleSelectVariable = (variable: VariableReference) => {\n\t\tonChangeVariable(variableName, variable)\n\t}\n\n\tconst handleCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.String,\n\t\t\t\tname: variableName,\n\t\t\t\tinitialValue: isString(value) ? value : \"\",\n\t\t\t})\n\t\t\tif (!variableRef) return\n\n\t\t\tonChangeVariable(variableName, variableRef)\n\t\t},\n\t\t[onChangeVariable, value, variableName],\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={titleCase(variableName)}\n\t\t\tsupportsVariables\n\t\t\tvariableType={[ControlType.String, ControlType.Number, ControlType.Boolean]}\n\t\t\tdynamicValue={isVariableReference(value) ? value : null}\n\t\t\tonRemoveDynamicValue={handleRemoveVariable}\n\t\t\tonSelectVariable={handleSelectVariable}\n\t\t\tonCreateVariable={handleCreateVariable}\n\t\t\tvariableCreationType={ControlType.String}\n\t\t>\n\t\t\t{isVariableReference(value) ? (\n\t\t\t\t<VariableReferenceButton expectedType={ControlType.String} reference={value} onRemove={handleRemoveVariable} />\n\t\t\t) : (\n\t\t\t\t<TextInput\n\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\t\tonChange={nextValue => onChangeVariable(variableName, nextValue)}\n\t\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction sortByTitle(a: ComboBoxListItem, b: ComboBoxListItem) {\n\treturn (a.title ?? a.value).localeCompare(b.title ?? b.value)\n}\n\nfunction useURLSuggestionsCombooxItems() {\n\tconst allUsedURLs = useFetchURLsInActiveScope()\n\n\treturn useMemo(() => {\n\t\tconst normalizedUrls: string[] = []\n\n\t\tfor (const url of allUsedURLs) {\n\t\t\tconst validatedUrl = validateCustomCanonicalURL(url)\n\t\t\tif (validatedUrl.result !== \"ok\") continue\n\n\t\t\tnormalizedUrls.push(validatedUrl.normalizedValue)\n\t\t}\n\t\tnormalizedUrls.push(...fetchPresetURLs)\n\n\t\t// Origin > Path > Search query\n\t\tconst pathsByHostname = new Map<string, Map<string, Set<string>>>()\n\n\t\tfor (const normalizedUrl of normalizedUrls) {\n\t\t\tconst urlObject = new URL(normalizedUrl)\n\n\t\t\tconst hostName = urlObject.hostname\n\t\t\tconst path = urlObject.pathname\n\t\t\tconst search = urlObject.search\n\n\t\t\tlet paths = pathsByHostname.get(hostName)\n\t\t\tif (!paths) {\n\t\t\t\tpaths = new Map()\n\t\t\t\tpathsByHostname.set(hostName, paths)\n\t\t\t}\n\n\t\t\tlet searches = paths.get(path)\n\t\t\tif (!searches) {\n\t\t\t\tsearches = new Set()\n\t\t\t\tpaths.set(path, searches)\n\t\t\t}\n\n\t\t\tsearches.add(search)\n\t\t}\n\n\t\tif (pathsByHostname.size === 0) return []\n\n\t\tconst result: ComboBoxListItem[] = []\n\t\tfor (const [hostName, paths] of pathsByHostname) {\n\t\t\tconst items: ComboBoxListItemOption[] = []\n\n\t\t\tfor (const [path, searches] of paths) {\n\t\t\t\t// Only if the same URL path has different query params do we display\n\t\t\t\t// The query path in the combobox for readability.\n\t\t\t\tif (searches.size > 1) {\n\t\t\t\t\tsearches.forEach(search => {\n\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\ttype: \"option\",\n\t\t\t\t\t\t\tvalue: hostName + path + search,\n\t\t\t\t\t\t\ttitle: `\\u00A0 ${path}${search}`, // Add some spacing\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\ttype: \"option\",\n\t\t\t\t\t\tvalue: hostName + path + Array.from(searches)[0], // Safe to concatenate since there's only 1 or empty\n\t\t\t\t\t\ttitle: `\\u00A0 ${path}`, // Add some spacing\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.sort(sortByTitle)\n\n\t\t\tresult.push({\n\t\t\t\ttype: \"section\",\n\t\t\t\ttitle: hostName,\n\t\t\t\tvalue: hostName,\n\t\t\t\titems,\n\t\t\t})\n\n\t\t\tresult.sort(sortByTitle)\n\t\t}\n\n\t\treturn result\n\t}, [allUsedURLs])\n}\n\ninterface Props extends ControlReferenceInfoProps {\n\ttitle: string | undefined\n\tvalue: FetchDataValue\n\tnodeIds: readonly NodeID[]\n\tonChangeFetchDataValue: (value: FetchDataValue) => void\n}\n\nfunction useHasLoadingVariantInSelection(tree: CanvasTree, nodeIds: readonly NodeID[]): boolean {\n\treturn useMemo(() => isStatusGestureVariantDescendant(tree, nodeIds), [tree, nodeIds])\n}\n\ninterface FallbackControlRowProps<ControlProp extends SafeFetchDataValue[\"controlProp\"]> {\n\tcontrolProp: ControlProp\n\tnodeIds: NodeID[]\n\ttitle: string\n\tonChange: (value: NonNullable<ControlProp>) => void\n}\n\nfunction FallbackControlRow<ControlProp extends SafeFetchDataValue[\"controlProp\"]>({\n\tcontrolProp,\n\tonChange,\n\tnodeIds,\n\ttitle,\n}: FallbackControlRowProps<ControlProp>) {\n\tconst {\n\t\tBooleanControlPropRow,\n\t\tColorControlPropRow,\n\t\tImageControlPropRow,\n\t\tLinkControlPropRow,\n\t\tNumberControlPropRow,\n\t\tStringControlPropRow,\n\t} = useControlPropRows()\n\n\tswitch (controlProp.type) {\n\t\tcase ControlType.String:\n\t\t\tif (!StringControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<StringControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t\tonChange={(_, getUpdate) => {\n\t\t\t\t\t\tconst update = getUpdate(controlProp) as ControlProp\n\t\t\t\t\t\tonChange(update)\n\t\t\t\t\t}}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Number:\n\t\t\tif (!NumberControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<NumberControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\tassert(value.type === ControlType.Number)\n\t\t\t\t\t\tonChange(value as ControlProp)\n\t\t\t\t\t}}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Boolean:\n\t\t\tif (!BooleanControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<BooleanControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\tassert(value.type === ControlType.Boolean)\n\t\t\t\t\t\tonChange(value as ControlProp)\n\t\t\t\t\t}}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Image:\n\t\t\tif (!ImageControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<ImageControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t\tonUpload={upload => {\n\t\t\t\t\t\tvoid upload.then(reference => {\n\t\t\t\t\t\t\tonChange({\n\t\t\t\t\t\t\t\ttype: ControlType.Image,\n\t\t\t\t\t\t\t\tvalue: reference ?? undefined,\n\t\t\t\t\t\t\t} as ControlProp)\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\tonChange={(_, getUpdate) => {\n\t\t\t\t\t\tonChange(getUpdate(controlProp) as ControlProp)\n\t\t\t\t\t}}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Link:\n\t\t\tif (!LinkControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<LinkControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tonChange={(_, getUpdate) => {\n\t\t\t\t\t\tonChange(getUpdate(controlProp) as ControlProp)\n\t\t\t\t\t}}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase ControlType.Color:\n\t\t\tif (!ColorControlPropRow) return\n\t\t\treturn (\n\t\t\t\t<ColorControlPropRow\n\t\t\t\t\tcontrolKey={title}\n\t\t\t\t\tcontrol={controlProp}\n\t\t\t\t\tsupportsVariables\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tcontrolProp={controlProp}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\tsupportsComputedValues={false}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\tassertNever(controlProp)\n\t}\n}\n\ninterface FetchDataAdvancedSettingsProps {\n\tnodeIds: readonly NodeID[]\n\terrorControlProp: SafeFetchDataValue[\"errorControlProp\"]\n\tonErrorControlPropChange: (value: SafeFetchDataValue[\"errorControlProp\"]) => void\n\tcacheDuration: number\n\tcredentials: SafeFetchDataValue[\"credentials\"]\n\tonCredentialsChange: (value: NonNullable<SafeFetchDataValue[\"credentials\"]>) => void\n\tonCacheDurationChange: (value: number) => void\n}\n\nfunction FetchDataAdvancedSettings({\n\tnodeIds,\n\tcacheDuration,\n\tonCacheDurationChange,\n\tonCredentialsChange,\n\tcredentials = \"same-origin\",\n\terrorControlProp,\n\tonErrorControlPropChange,\n}: FetchDataAdvancedSettingsProps) {\n\treturn (\n\t\t<Stack gap={0} direction=\"column\" padding={dimensions.css.popoverPadding} paddingBottom={10} paddingTop={10}>\n\t\t\t{errorControlProp && (\n\t\t\t\t<FallbackControlRow\n\t\t\t\t\ttitle=\"Error\"\n\t\t\t\t\tonChange={onErrorControlPropChange}\n\t\t\t\t\tcontrolProp={errorControlProp}\n\t\t\t\t\tnodeIds={nodeIds as NodeID[]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<PanelRow title=\"Cache\">\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t{cacheDurationOptions.map(cacheOption => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={cacheOption.title}\n\t\t\t\t\t\t\tidentifier={cacheOption.value}\n\t\t\t\t\t\t\ttitle={cacheOption.title}\n\t\t\t\t\t\t\tselected={cacheDuration === cacheOption.value}\n\t\t\t\t\t\t\tonSelect={onCacheDurationChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t\t<PanelRow title=\"Credentials\">\n\t\t\t\t<PopupButton wrapperClassName={doubleColumnClass}>\n\t\t\t\t\t{credentialsOptions.map(cacheOption => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={cacheOption.title}\n\t\t\t\t\t\t\tidentifier={cacheOption.value}\n\t\t\t\t\t\t\ttitle={cacheOption.title}\n\t\t\t\t\t\t\tselected={credentials === cacheOption.value}\n\t\t\t\t\t\t\tonSelect={onCredentialsChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t\t{credentials === \"include\" && (\n\t\t\t\t<DescriptionRow\n\t\t\t\t\twithMargin={false}\n\t\t\t\t\tdescription=\"Some authorized APIs may only work on your live site. [Learn more](http://framer.com/help/articles/how-to-use-fetch#credentials)\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t)\n}\n\nclass CredentialsIncludeFetchError extends Error {}\nfunction isCredentialsIncludeFetchError(error: unknown): error is CredentialsIncludeFetchError {\n\treturn error instanceof CredentialsIncludeFetchError\n}\n\nfunction FetchDataValuePopoutInner({\n\tvalue: unsafeValue,\n\tonChangeFetchDataValue,\n\tnodeIds,\n\treadOnly,\n}: Props & { readOnly: boolean }) {\n\tconst value = patchFetchValue(unsafeValue)\n\n\tconst [resultKeyOptions, setResultKeyOptions] = useState<Record<string, ComboBoxListItem[]>>({})\n\tconst [isLoadingKeyPath, setIsLoadingKeyPath] = useState(false)\n\tconst [testRequestError, setTestRequestError] = useState<Error | null>(null)\n\tconst [hasKeyPathFocus, setHasResultKeyFocus] = useState<boolean>(false)\n\n\tconst abortControlRef = useRef<AbortController | null>(null)\n\n\tconst currentValueRef = useRef<FetchDataValue>(value)\n\tcurrentValueRef.current = value\n\n\tconst previouslyUsedUrls = useURLSuggestionsCombooxItems()\n\n\t// We need to keep URL state in local component and sync it with tree state\n\t// because\n\t// 1. Changing the URL in the tree could cause a refetch with the new value\n\t// 2. We need \"constantChange\" so that we know which variables to present in\n\t//    the form on every keystroke, and so that tabbing works correctly.\n\tconst [internalUrl, setInternalUrl] = useState(value.url)\n\tconst variableNames = collectVariablesFromURL(internalUrl)\n\tuseEffect(() => {\n\t\t// Sync the external URL state with the internal state.\n\t\tsetInternalUrl(value.url)\n\t}, [value.url])\n\n\tconst firstNode = useDeprecatedEngineState(EngineChange.Tree, () => engine.tree.get(nodeIds[0]))\n\tconst urlWithVariables = useMemo(\n\t\t() => fillVariablesInURL(value, variable => String(firstNode?.cache.getVariableReferenceValue(variable))),\n\t\t[value, firstNode],\n\t)\n\n\tconst handleCacheDurationChange = (newCacheDuration: number) => {\n\t\tonChangeFetchDataValue({ ...value, cacheDuration: newCacheDuration })\n\t}\n\n\tconst handleURLChange = (newURL: string) => {\n\t\tsetInternalUrl(newURL)\n\t}\n\n\tconst handleURLBlur = () => {\n\t\tonChangeFetchDataValue({ ...value, url: internalUrl })\n\t}\n\n\tconst handleCredentialsChange = (newCredentials: NonNullable<SafeFetchDataValue[\"credentials\"]>) => {\n\t\tonChangeFetchDataValue({ ...value, credentials: newCredentials })\n\t}\n\n\tconst handleUrlKeyDown: ComboBoxProps[\"onKeyDown\"] = event => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tonChangeFetchDataValue({ ...value, url: internalUrl })\n\t\t\treturn\n\t\t}\n\t}\n\n\tconst handleVariableChange = (variableName: string, variable: VariableReference | string) => {\n\t\tonChangeFetchDataValue({\n\t\t\t...value,\n\t\t\t// There is a race condition where the value stored in the tree is not updated yet when a variable is selected.\n\t\t\t// This ensures that the latest URL value is used.\n\t\t\turl: internalUrl,\n\t\t\tvariables: {\n\t\t\t\t...value.variables,\n\t\t\t\t[variableName]: variable,\n\t\t\t},\n\t\t})\n\t}\n\n\tconst handleAccessPathChange = (newResultKey: string) => {\n\t\tonChangeFetchDataValue({ ...value, resultKeyPath: newResultKey })\n\t}\n\n\tconst loadKeyPathSuggestions = useStableCallback(async () => {\n\t\tconst currentValue = currentValueRef.current\n\n\t\tif (readOnly) return\n\n\t\tif (abortControlRef.current) {\n\t\t\tabortControlRef.current.abort()\n\t\t}\n\t\tconst abortController = new AbortController()\n\t\tabortControlRef.current = abortController\n\n\t\ttry {\n\t\t\t// The URL was not yet valid so we cannot suggest keys.\n\t\t\tif (!isConfiguredFetchDataValue(currentValue)) {\n\t\t\t\tif (currentValue.url === \"\") return\n\n\t\t\t\tsetTestRequestError(new Error(\"Invalid URL\"))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsetIsLoadingKeyPath(true)\n\n\t\t\tconst json = await fetchJSONFromSandbox(engine, urlWithVariables)\n\t\t\tif (abortController.signal.aborted) return\n\n\t\t\tconst options: ComboBoxListItem[] = []\n\t\t\tcollectResultKeyOptions(value.controlProp.type, json, options)\n\n\t\t\tsetResultKeyOptions(lastOptions => ({\n\t\t\t\t...lastOptions,\n\t\t\t\t[urlWithVariables]: options,\n\t\t\t}))\n\t\t\tsetTestRequestError(null)\n\t\t} catch (error) {\n\t\t\tif (abortController.signal.aborted) return\n\n\t\t\tif (currentValue.credentials === \"include\") {\n\t\t\t\t// We display a different warning tint for fetches that failed when credentials are included.\n\t\t\t\tsetTestRequestError(new CredentialsIncludeFetchError(\"Fetch with Credentials Failed\"))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsetTestRequestError(error instanceof Error ? error : new Error(\"Unknown Error\", { cause: error }))\n\t\t} finally {\n\t\t\tsetIsLoadingKeyPath(false)\n\t\t}\n\t})\n\n\tuseEffect(() => {\n\t\tif (!hasKeyPathFocus) return\n\n\t\t// It is possible that a variable value changes after focus on the key path field.\n\t\t// In this case we want to refetch the keys\n\t\tvoid loadKeyPathSuggestions()\n\t}, [loadKeyPathSuggestions, hasKeyPathFocus, value.url, value.variables])\n\n\tconst handleResultKeyFocus = () => {\n\t\tsetHasResultKeyFocus(true)\n\t}\n\n\tconst handleResultKeyBlur = () => {\n\t\tabortControlRef.current?.abort()\n\t\tsetHasResultKeyFocus(false)\n\t}\n\n\tconst handleFallbackControlChange = (controlProp: FetchDataValue[\"controlProp\"] | undefined) => {\n\t\tif (!controlProp) return\n\n\t\tonChangeFetchDataValue({ ...value, controlProp: controlProp })\n\t}\n\n\tconst handleErrorControlPropChange = (errorControlProp: FetchDataValue[\"errorControlProp\"]) => {\n\t\tif (!errorControlProp) return\n\n\t\tonChangeFetchDataValue({ ...value, errorControlProp })\n\t}\n\n\tconst keyOptionsForUrl = resultKeyOptions[urlWithVariables] ?? []\n\n\treturn (\n\t\t<Scroll direction=\"vertical\" className={styles.scrollContainer}>\n\t\t\t<Stack gap={0} direction=\"column\" padding={dimensions.css.popoverPadding} paddingBottom={10} paddingTop={0}>\n\t\t\t\t<Stack paddingBottom={10} gap={8}>\n\t\t\t\t\t<ThemeOverride\n\t\t\t\t\t\tmode={testRequestError && !isCredentialsIncludeFetchError(testRequestError) ? \"warning\" : undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ComboBoxTextArea\n\t\t\t\t\t\t\tautoCompleteEnabled\n\t\t\t\t\t\t\titems={previouslyUsedUrls}\n\t\t\t\t\t\t\tplaceholder=\"api.example.com\"\n\t\t\t\t\t\t\tonChange={handleURLChange}\n\t\t\t\t\t\t\tshowAllWhenOpened\n\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\twrapperClassName={styles.urlInputWrapper}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\tonBlur={handleURLBlur}\n\t\t\t\t\t\t\tonKeyDown={handleUrlKeyDown}\n\t\t\t\t\t\t\tsearchItemValue\n\t\t\t\t\t\t\tclassName={styles.urlInput}\n\t\t\t\t\t\t\trows={3}\n\t\t\t\t\t\t\tvalue={internalUrl}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{testRequestError && (\n\t\t\t\t\t\t\t<InputMessage\n\t\t\t\t\t\t\t\ttype={isCredentialsIncludeFetchError(testRequestError) ? \"info-warning\" : \"warning\"}\n\t\t\t\t\t\t\t\ttitle={testRequestError.message}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ThemeOverride>\n\t\t\t\t</Stack>\n\n\t\t\t\t{variableNames.map(variable => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<VariableValueRow\n\t\t\t\t\t\t\tkey={variable}\n\t\t\t\t\t\t\tvariableName={variable}\n\t\t\t\t\t\t\tonChangeVariable={handleVariableChange}\n\t\t\t\t\t\t\tvalue={value.variables[variable]}\n\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\n\t\t\t\t<PanelRow title=\"Path\">\n\t\t\t\t\t<ComboBox\n\t\t\t\t\t\trightChevron\n\t\t\t\t\t\tshowAllWhenOpened\n\t\t\t\t\t\tautoCompleteEnabled\n\t\t\t\t\t\tonFocus={handleResultKeyFocus}\n\t\t\t\t\t\tonBlur={handleResultKeyBlur}\n\t\t\t\t\t\trightSlot={\n\t\t\t\t\t\t\tisLoadingKeyPath && keyOptionsForUrl.length === 0 && <Spinner inline className={styles.spinner} />\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems={keyOptionsForUrl}\n\t\t\t\t\t\tplaceholder=\"user.name\"\n\t\t\t\t\t\tonChange={handleAccessPathChange}\n\t\t\t\t\t\twrapperClassName={doubleColumnClass}\n\t\t\t\t\t\tvalue={value.resultKeyPath}\n\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t/>\n\t\t\t\t</PanelRow>\n\n\t\t\t\t<FallbackControlRow\n\t\t\t\t\ttitle={Dictionary.Fallback}\n\t\t\t\t\tonChange={handleFallbackControlChange}\n\t\t\t\t\tcontrolProp={value.controlProp}\n\t\t\t\t\tnodeIds={nodeIds as NodeID[]}\n\t\t\t\t/>\n\n\t\t\t\t<PanelRow title=\"Advanced\">\n\t\t\t\t\t<PopoutButtonWithPreview\n\t\t\t\t\t\tpopout={\n\t\t\t\t\t\t\t<FetchDataAdvancedSettings\n\t\t\t\t\t\t\t\tcacheDuration={value.cacheDuration}\n\t\t\t\t\t\t\t\tonCacheDurationChange={handleCacheDurationChange}\n\t\t\t\t\t\t\t\tcredentials={value.credentials}\n\t\t\t\t\t\t\t\tonCredentialsChange={handleCredentialsChange}\n\t\t\t\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\t\t\t\terrorControlProp={value.errorControlProp}\n\t\t\t\t\t\t\t\tonErrorControlPropChange={handleErrorControlPropChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdisplayDivider\n\t\t\t\t\t\ttitle=\"Settings\"\n\t\t\t\t\t\tnavigationTitle=\"Advanced\"\n\t\t\t\t\t\tpreview={\n\t\t\t\t\t\t\t<PopoutButtonPreviewIconWrapper>\n\t\t\t\t\t\t\t\t<IconCogwheel />\n\t\t\t\t\t\t\t</PopoutButtonPreviewIconWrapper>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</PanelRow>\n\t\t\t</Stack>\n\t\t</Scroll>\n\t)\n}\n\nexport function FetchDataValuePopout(props: Props) {\n\tconst hasLoadingVariantInSelection = useHasLoadingVariantInSelection(engine.tree, props.nodeIds)\n\tconst readOnly = useReadOnly() || hasLoadingVariantInSelection\n\n\treturn (\n\t\t<ReadOnlyContext.Provider value={readOnly}>\n\t\t\t<FetchDataValuePopoutInner {...props} readOnly={readOnly} />\n\t\t</ReadOnlyContext.Provider>\n\t)\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert } from \"@framerjs/shared\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isCodeComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isComputedValueFromFetchData } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { allVariableKeys } from \"document/models/CanvasTree/utils/allVariableKeys.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\n\n/**\n * Returns a list of all unique URLs used in Fetch properties on the given node\n * and all its descendants.\n */\nexport function getFetchURLsFromNode(componentLoader: ComponentLoader, scopeNode: CanvasNode) {\n\tconst fetchURLs = new Set<string>()\n\n\tfor (const node of scopeNode.walk()) {\n\t\tif (isCodeComponentNode(node)) {\n\t\t\tconst component = componentLoader.reactComponentForIdentifier(node.codeComponentIdentifier)\n\t\t\tif (!component) continue\n\n\t\t\tconst props = node.getControlProps(component.properties)\n\t\t\tfor (const key in props) {\n\t\t\t\tconst prop = props[key]\n\t\t\t\tassert(prop)\n\n\t\t\t\tif (!isComputedValueFromFetchData(prop.value) || !prop.value.startValue.url) continue\n\n\t\t\t\tfetchURLs.add(prop.value.startValue.url)\n\t\t\t}\n\t\t}\n\n\t\tfor (const key of allVariableKeys) {\n\t\t\tconst property = node[key]\n\n\t\t\tif (!isComputedValueFromFetchData(property)) continue\n\t\t\tif (!property.startValue.url) continue\n\n\t\t\tfetchURLs.add(property.startValue.url)\n\t\t}\n\t}\n\n\treturn Array.from(fetchURLs)\n}\n\n/**\n * Returns a list of all unique URLs used in Fetch properties on any node within\n * the active scope.\n */\nexport function useFetchURLsInActiveScope() {\n\treturn useEngineState(\n\t\t() => {\n\t\t\tconst activeScope = engine.stores.scopeStore.active\n\t\t\treturn getFetchURLsFromNode(engine.componentLoader, activeScope)\n\t\t},\n\t\t[],\n\t\t[EngineChange.Tree, engine.stores.scopeStore],\n\t)\n}\n", "import \"FetchDataValuePopout.styles_6s20ae.wyw.css\"; export const scrollContainer = \"scrollContainer_s1b5mru3\";\nexport const spinner = \"spinner_s1qtjerc\";\nexport const urlInput = \"urlInput_u1u7jv6n\";\nexport const urlInputWrapper = \"urlInputWrapper_u8u1qu1\";", "import type { VekterEngine } from \"document/VekterEngine.ts\"\n\nexport async function fetchJSONFromSandbox(engine: VekterEngine, url: string) {\n\tconst response = await engine.canvasSandbox?.sandbox.utils.fetchJSON(url)\n\n\tif (!response) {\n\t\tthrow new Error(\"Failed to fetch\")\n\t}\n\n\treturn response.data\n}\n", "import { IconVariableLink, LegacyIconVariableLink, useReadOnly } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { assert } from \"@framerjs/shared\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ComputedValueFromFetchDataValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { FetchDataValue } from \"document/models/CanvasTree/traits/FetchDataValue.ts\"\nimport { patchFetchValue } from \"document/models/CanvasTree/traits/FetchDataValue.ts\"\nimport type { VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport * as styles from \"./FetchDataValueButton.styles.ts\"\nimport { FetchDataValuePopout } from \"./FetchDataValuePopout.tsx\"\nimport { PopoutButtonPreviewIconWrapper } from \"./PopoutButtonPreviewIconWrapper.tsx\"\nimport { PopoutButtonWithPreview } from \"./PopoutButtonWithPreview.tsx\"\n\ninterface FetchDataValueButtonProps {\n\ttitle: string | undefined\n\tvalue: ComputedValueFromFetchDataValue\n\tonChangeValue: (value: DynamicValue, outputType: VariableType) => void\n\tonRemove: (value: DynamicValue) => void\n\tpopoutId: string\n\tnodeIds: readonly NodeID[]\n}\n\nexport function FetchDataValueButton({\n\ttitle,\n\tvalue,\n\tonChangeValue,\n\tonRemove,\n\tnodeIds,\n\tpopoutId,\n}: FetchDataValueButtonProps) {\n\tconst isReadonly = useReadOnly()\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\tconst handleValueChange = (fetchDataValue: FetchDataValue) => {\n\t\tconst safeValue = patchFetchValue(fetchDataValue)\n\n\t\tonChangeValue(\n\t\t\t{\n\t\t\t\t...value,\n\t\t\t\tstartValue: safeValue,\n\t\t\t},\n\t\t\tvalue.outputType,\n\t\t)\n\t}\n\n\tconst handleRemove = () => {\n\t\tonRemove(value)\n\t}\n\n\tconst handleContextMenu = (event: React.MouseEvent) => {\n\t\tif (!onRemove) return\n\t\tengine.stores.contextMenuStore.show(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Remove\",\n\t\t\t\t\tenabled: !isReadonly,\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tassert(value)\n\n\t\t\t\t\t\tonRemove(value)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\t{ location: { x: event.clientX, y: event.clientY } },\n\t\t)\n\t}\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tonContextMenu={handleContextMenu}\n\t\t\tid={popoutId}\n\t\t\tnavigationTitle={<span>Fetch</span>}\n\t\t\tdisplayDivider={false}\n\t\t\tonDelete={handleRemove}\n\t\t\ttitle=\"Fetch\"\n\t\t\tclassName={styles.button}\n\t\t\tdeleteIconColor=\"white\"\n\t\t\ttitleColor=\"white\"\n\t\t\tswatchBackgroundColor={colors.swatchBackgroundForComputedValue}\n\t\t\tpreview={\n\t\t\t\t<PopoutButtonPreviewIconWrapper color=\"transparent\" background=\"transparent\">\n\t\t\t\t\t{agentExperimentEnabled ? <IconVariableLink /> : <LegacyIconVariableLink />}\n\t\t\t\t</PopoutButtonPreviewIconWrapper>\n\t\t\t}\n\t\t\tpopout={\n\t\t\t\t<FetchDataValuePopout\n\t\t\t\t\tonChangeFetchDataValue={handleValueChange}\n\t\t\t\t\tnodeIds={nodeIds}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value.startValue}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport { getEditableCollectionVariableInfo } from \"document/components/utils/getEditableCollectionVariableInfo.ts\"\nimport engine from \"document/engine.ts\"\nimport { isComputedValue, isComputedValueFromFetchData } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { dynamicValueHasTypeError } from \"document/models/CanvasTree/traits/utils/dynamicValueHasTypeError.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { type AllowedFileTypes, type ControlDescription, ControlType } from \"library/render/types/PropertyControls.ts\"\nimport type { SupportsFetchDataValuesProps } from \"../properties/codeComponentRows/WithSupportsFetchDataValuesProps.ts\"\nimport { getVariableFromInfo, useVariableProviderInfo } from \"../properties/useVariableProviderInfo.ts\"\nimport { selectedVariableIsNegatedWithoutOtherTransforms } from \"../properties/utils/selectedVariableIsNegated.ts\"\nimport { ComputedValuePopout } from \"./ComputedValuePopout.tsx\"\nimport { DataSourceImageVariableReferenceButton } from \"./DataSourceImageVariableReferenceButton.tsx\"\nimport { FetchDataValueButton } from \"./FetchDataValueButton.tsx\"\nimport { VariablePopoutButton } from \"./VariablePopoutButton.tsx\"\nimport { VariableReferenceButton, type VariableReferenceButtonProps } from \"./VariableReferenceButton.tsx\"\n\nexport interface ControlReferenceInfo {\n\tcontrolSourceIdentifier: string | undefined\n\tcontrolKey: string\n}\n\nexport interface ControlReferenceInfoProps {\n\t/** Required for control references */\n\tcontrolReferenceInfo?: ControlReferenceInfo\n}\n\ntype DynamicValueButtonCommonProps = ControlReferenceInfoProps & {\n\ttitle: string | undefined\n\tvalue: DynamicValue\n\tonChangeDynamicValue: (value: DynamicValue, outputType: VariableType) => void\n\tonRemove: (dynamicValue: DynamicValue) => void\n\tpopoutId: string\n\texpectedType: VariableType | readonly VariableType[]\n\tallowedFileTypes?: AllowedFileTypes\n\toutputControl: ControlDescription | undefined\n\tsupportsComputedValues?: boolean\n\tsupportsFetchDataValues?: boolean\n\tsupportsRelativeDates?: boolean\n}\n\nexport type DynamicValueButtonProps = DynamicValueButtonCommonProps & SupportsFetchDataValuesProps\n\nexport function DynamicValueButton({\n\ttitle,\n\tvalue,\n\tonChangeDynamicValue,\n\tonRemove,\n\tpopoutId,\n\texpectedType,\n\tallowedFileTypes,\n\toutputControl,\n\tcontrolReferenceInfo,\n\tnodeIds,\n\tsupportsComputedValues = false,\n\tsupportsRelativeDates = false,\n}: DynamicValueButtonProps) {\n\tconst variableInfo = useVariableProviderInfo()\n\n\tif (isComputedValueFromFetchData(value)) {\n\t\treturn (\n\t\t\t<FetchDataValueButton\n\t\t\t\tpopoutId={popoutId}\n\t\t\t\tnodeIds={nodeIds ?? []}\n\t\t\t\tonChangeValue={onChangeDynamicValue}\n\t\t\t\tonRemove={onRemove}\n\t\t\t\ttitle={title}\n\t\t\t\tvalue={value}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst variableReference = isComputedValue(value) ? value.startValue : value\n\tconst variable = getVariableFromInfo(variableReference, variableInfo)\n\tconst isNegatedVariable = selectedVariableIsNegatedWithoutOtherTransforms(value, variable)\n\n\tif (!variableInfo || !variable || !supportsComputedValues || isVariableReference(value) || isNegatedVariable) {\n\t\treturn (\n\t\t\t<VariableReferenceButtonWrapper\n\t\t\t\texpectedType={expectedType}\n\t\t\t\treference={variableReference}\n\t\t\t\tonRemove={onRemove}\n\t\t\t\tisNegated={isNegatedVariable}\n\t\t\t\tpopoutId={popoutId}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst providerId = variableReference.providerId || variableInfo.fallbackProvider\n\tconst inputControl = providerId ? variableInfo.combinedControls.get(providerId)?.get(variableReference.id) : undefined\n\tconst variableSourceIdentifiers = providerId ? variableInfo.variableSourceIdentifiers[providerId] : undefined\n\n\treturn (\n\t\t<VariablePopoutButton\n\t\t\treference={variableReference}\n\t\t\texpectedType={expectedType}\n\t\t\tpopoutId={popoutId}\n\t\t\tonRemove={onRemove}\n\t\t\tnavigationTitle={title ?? variable.name}\n\t\t\thasError={dynamicValueHasTypeError(value, variable, expectedType)}\n\t\t\tisComputedValue\n\t\t\tdisplayDivider\n\t\t\tpopout={\n\t\t\t\t<ComputedValuePopout\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tvariable={variable}\n\t\t\t\t\tinputControl={inputControl}\n\t\t\t\t\toutputControl={outputControl}\n\t\t\t\t\texpectedType={expectedType}\n\t\t\t\t\tallowedFileTypes={allowedFileTypes}\n\t\t\t\t\tonChangeDynamicValue={onChangeDynamicValue}\n\t\t\t\t\tonRemove={onRemove}\n\t\t\t\t\tcontrolReferenceInfo={controlReferenceInfo}\n\t\t\t\t\tvariableSourceIdentifiers={variableSourceIdentifiers}\n\t\t\t\t\tsupportsRelativeDates={supportsRelativeDates}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction VariableReferenceButtonWrapper({\n\treference,\n\texpectedType,\n\tonRemove,\n\tisNegated,\n\tpopoutId,\n}: VariableReferenceButtonProps & { popoutId: string }) {\n\tconst variableInfo = useEngineState(\n\t\t() => {\n\t\t\tif (!hasImageType(expectedType)) return\n\n\t\t\treturn getEditableCollectionVariableInfo(\n\t\t\t\tengine.tree,\n\t\t\t\tengine.componentLoader,\n\t\t\t\tengine.stores.treeStore.sandboxRepeaterData,\n\t\t\t\treference,\n\t\t\t\tControlType.Image,\n\t\t\t\tundefined,\n\t\t\t)\n\t\t},\n\t\t[reference],\n\t\t[EngineChange.Tree, EngineChange.TreeStore],\n\t\t{ deepEqual: true },\n\t)\n\n\tif (variableInfo) {\n\t\treturn (\n\t\t\t<DataSourceImageVariableReferenceButton\n\t\t\t\treference={reference}\n\t\t\t\tpopoutId={popoutId}\n\t\t\t\tonRemove={onRemove}\n\t\t\t\texpectedType={expectedType}\n\t\t\t\tvariableInfo={variableInfo}\n\t\t\t/>\n\t\t)\n\t}\n\n\treturn (\n\t\t<VariableReferenceButton\n\t\t\texpectedType={expectedType}\n\t\t\treference={reference}\n\t\t\tonRemove={onRemove}\n\t\t\tisNegated={isNegated}\n\t\t/>\n\t)\n}\n\nfunction hasImageType(expectedType: VariableType | readonly VariableType[]) {\n\tif (Array.isArray(expectedType)) {\n\t\treturn expectedType.includes(\"image\")\n\t}\n\n\treturn expectedType === \"image\"\n}\n", "import { splitExtension } from \"@framerjs/assets\"\nimport type { LocalModuleId } from \"@framerjs/shared\"\nimport { splitTypeSlashName } from \"modules/utils.ts\"\nimport { dirname, filename } from \"./utils.ts\"\n\n/**\n * Used to build out the folder structure for code files. which is rendered in the side panel. This has been decoupled from the EditableFile class to allow for the folder structure to exist independently of the monaco-editor.\n */\nexport class CodeFile {\n\tpublic formatted = false\n\tpublic disposed = false\n\tprivate edited = false\n\n\tpublic readonly id: LocalModuleId\n\tpublic readonly path: string\n\tpublic readonly name: string\n\tpublic readonly displayPath: string\n\tpublic readonly sortName: string\n\tpublic readonly folderSortName: string\n\tpublic readonly folders: string[]\n\n\tconstructor(id: LocalModuleId, path: string, edited: boolean = false) {\n\t\tthis.id = id\n\t\tthis.path = path\n\t\tthis.edited = edited\n\t\tthis.name = filename(path)\n\t\tthis.sortName = splitExtension(path)[0]\n\t\tthis.displayPath = splitTypeSlashName(path)[1]\n\t\tthis.folderSortName = dirname(this.displayPath)\n\t\tthis.folders = this.folderSortName\n\t\t\t.split(\"/\")\n\t\t\t// Filtering is required to handle files in the root.\n\t\t\t.filter(Boolean)\n\t}\n\n\tpublic setEdited(edited: boolean): void {\n\t\tthis.edited = edited\n\t}\n\n\tpublic isEdited(): boolean {\n\t\treturn this.edited\n\t}\n}\n", "import type { GlobalPreviewHandlers } from \"document/preview/globalPreviewHandlers.ts\"\nimport { getGlobalPreviewHandlers } from \"document/preview/globalPreviewHandlers.ts\"\nimport { Tools } from \"document/stores/ToolEnum.ts\"\n\n// Convenience for targets that want to generate a type with a specific subset of actions\nexport type PickAppActions<K extends AppAction> = { [P in K]: () => void | Promise<unknown> }\n\nexport const fileActions = [\n\t\"archiveProject\",\n\t\"copyProjectLink\",\n\t\"copyRemixLink\",\n\t\"copyAIKitRemixLink\",\n\t\"createAIKit\",\n\t\"convertPagesToKitPages\",\n\t\"duplicateProject\",\n\t\"duplicateTemplate\",\n\t\"goToProjects\",\n\t\"openCanvas\",\n\t\"openCMS\",\n\t\"openLocalization\",\n\t\"openSettings\",\n\t\"openEvaluations\",\n\t\"importFigma\",\n\t\"newPage\",\n\t\"newProject\",\n\t\"newWebPage\",\n\t\"newWebPageFolder\",\n\t\"quickActions\",\n\t\"saveTemplateAsProject\",\n\t\"sortLayersAlphabetically\",\n\t\"sortWebPagesAlphabetically\",\n\t\"toggleContentManagement\",\n\t\"toggleLocalization\",\n\t\"toggleVersionHistory\",\n\t\"transferProject\",\n\t\"unarchiveProject\",\n\t\"uploadImage\",\n\t\"uploadVideo\",\n] as const\n\nexport type FileAction = (typeof fileActions)[number]\n\nexport const editActions = [\n\t\"undo\",\n\t\"redo\",\n\t\"goBack\",\n\t\"goForward\",\n\t\"cut\",\n\t\"copy\",\n\t\"copyStyle\",\n\t\"copyFill\",\n\t\"copyCSS\",\n\t\"copyLink\",\n\t\"copyNodeId\",\n\t\"copySVG\",\n\t\"copyText\",\n\t\"copyGrid\",\n\t\"copyEffects\",\n\t\"copyCursor\",\n\t\"copyURL\",\n\t\"paste\",\n\t\"pasteStyle\",\n\t\"pasteFill\",\n\t\"pasteInPlace\",\n\t\"pasteEffects\",\n\t\"pasteCursor\",\n\t\"pasteGrid\",\n\t\"duplicate\",\n\t\"delete\",\n\t\"toggleLayerLock\",\n\t\"toggleLayerVisible\",\n\t\"toggleLayerClip\",\n\t\"rename\",\n\t\"renameLayers\",\n\t\"openPanelSearch\",\n\t\"openTextSearchPlugin\",\n\t\"selectMostRecentPage\",\n\t\"selectAll\",\n\t\"selectGroundNode\",\n\t\"selectParent\",\n\t\"selectSiblings\",\n\t\"selectChildren\",\n\t\"fakeSelectChildren\",\n\t\"selectAllTopParents\",\n\t\"selectTextNodes\",\n\t\"selectTextNodesWithSameFont\",\n\t\"selectAllLayersWithSameFill\",\n\t\"cycleSelection\",\n\t\"decycleSelection\",\n] as const\ntype EditAction = (typeof editActions)[number]\n\nexport const viewActions = [\n\t\"zoomIn\",\n\t\"zoomOut\",\n\t\"zoomToFitAll\",\n\t\"zoomToFitSelection\",\n\t\"resetZoom\",\n\t\"toggleShowPixelGrid\",\n\t\"toggleInterface\",\n\t\"toggleShowAllLinks\",\n\t\"toggleRulers\",\n\t\"toggleGrids\",\n\t\"toggleAppearanceSystem\",\n\t\"toggleAppearance\",\n\t\"showPages\",\n\t\"showLayers\",\n\t\"showAssets\",\n\t\"showAgent\",\n\t\"newAgentChat\",\n\t\"collapseLayers\",\n\t\"toggleShowHandoff\",\n] as const\nexport type ViewAction = (typeof viewActions)[number]\n\nexport const toolActions = [\n\t...Tools.allActions(),\n\t\"generateWebPage\",\n\t\"sampleColor\",\n\t\"startLinkTool\",\n\t\"toggleInsert\",\n\t\"toggleLibraryModal\",\n] as const\ntype ToolAction = (typeof toolActions)[number]\n\nexport const layoutActions = [\n\t\"addEnclosingFrame\",\n\t\"addEnclosingStack\",\n\t\"autoSizeLayout\",\n\t\"removeFramePreservingChildren\",\n\t\"sizeToFitContent\",\n\t\"moveForward\",\n\t\"moveBackward\",\n\t\"moveToFront\",\n\t\"moveToBack\",\n] as const\ntype LayoutAction = (typeof layoutActions)[number]\n\nexport const alignmentActions = [\n\t\"alignLeft\",\n\t\"alignCenter\",\n\t\"alignRight\",\n\t\"alignTop\",\n\t\"alignMiddle\",\n\t\"alignBottom\",\n\t\"distributeHorizontal\",\n\t\"distributeVertical\",\n\t\"alignToSelection\",\n\t\"alignToParent\",\n] as const\ntype AlignmentAction = (typeof alignmentActions)[number]\n\nconst shapeBooleanActions = [\"unite\", \"subtract\", \"intersect\", \"exclude\", \"join\"] as const\ntype ShapeBooleanAction = (typeof shapeBooleanActions)[number]\n\nexport const textActions = [\"makeBold\", \"makeItalic\", \"makeUnderlined\", \"chooseFontFamily\"] as const\ntype TextAction = (typeof textActions)[number]\n\nexport const graphicActions = [\n\t\"group\",\n\t\"ungroup\",\n\t\"flipHorizontal\",\n\t\"flipVertical\",\n\t\"convertToOutline\",\n\t\"flattenPath\",\n\t\"reversePath\",\n] as const\ntype GraphicAction = (typeof graphicActions)[number]\n\nexport const componentActions = [\n\t\"makeComponent\",\n\t\"makeCodeComponent\",\n\t\"showComponentMaster\",\n\t\"detachComponentInstanceFromMaster\",\n\t\"updateComponentMasterFromInstance\",\n\t\"resetComponentInstanceOverrides\",\n] as const\ntype ComponentAction = (typeof componentActions)[number]\n\nconst previewActions = [\n\t...(Object.keys(getGlobalPreviewHandlers()) as (keyof GlobalPreviewHandlers)[]),\n\t\"toggleHighlightsInLivePreview\",\n\t\"showPreview\",\n\t\"handleResponsive\",\n\t\"togglePreviewInterface\",\n] as const\ntype PreviewAction = (typeof previewActions)[number]\n\nconst pluginActions = [\n\t\"openPlugins\",\n\t\"runRecentPlugin\",\n\t\"clearRecentPlugins\",\n\t\"showPluginDeveloperTools\",\n\t\"openPluginDocumentation\",\n\t\"openDevelopmentPlugin\",\n] as const\ntype PluginAction = (typeof pluginActions)[number]\n\nexport type CodeAction = \"createCodeComponent\" | \"createOverride\" | \"showAPIDocumentation\" | \"saveCodeFile\"\n\nexport type SiteSettingsAction = \"saveSiteSettings\"\n\nexport type HelpAction =\n\t| \"keyboardShortcuts\"\n\t| \"requestFeature\"\n\t| \"openCommunity\"\n\t| \"copyVersion\"\n\t| \"sitesGetStarted\"\n\t| \"startAppTour\"\n\t| \"contactSupport\"\n\t| \"browseMarketplace\"\n\nexport type PreferenceAction =\n\t| \"newContentAsDraft\"\n\t| \"useDirectSelect\"\n\t| \"autoSwitchToLayers\"\n\t| \"useSmartLayoutPins\"\n\t| \"reverseZoomDirection\"\n\t| \"fastZoom\"\n\t| \"animateOnZoom\"\n\t| \"keyboardZoomsToSelection\"\n\t| \"showScrollToContentToast\"\n\t| \"resetDefaultFrameBackground\"\n\t| \"nudgePreferences\"\n\t| \"togglePerformanceMode\"\n\t| \"toggleCanvasPages\"\n\t| \"exitCanvasOnDoubleClick\"\n\t| \"templatesModalOnNewProject\"\n\nexport const sitesActions = [\n\t\"publishSite\",\n\t\"openPublishedSite\",\n\t\"showPreview\",\n\t\"previewNextBreakpoint\",\n\t\"previewPreviousBreakpoint\",\n\t\"togglePreviewInterface\",\n\t\"inviteCollaborators\",\n\t\"openSettings\",\n\t\"openGeneralSettings\",\n\t\"openDomainSettings\",\n\t\"openRedirects\",\n\t\"openForms\",\n\t\"openStagingAndVersions\",\n\t\"openUsage\",\n\t\"openCustomCode\",\n\t\"openPlans\",\n\t\"openAnalytics\",\n\t\"openTemplates\",\n] as const\nexport type SitesAction = (typeof sitesActions)[number]\n\nconst collectionActions = [\n\t\"copyCollectionItemAsMarkdown\",\n\t\"copyLinkToCollectionItem\",\n\t\"deleteCollection\",\n\t\"deleteCollectionItem\",\n\t\"draftCollectionItem\",\n\t\"duplicateCollection\",\n\t\"editFields\",\n\t\"importCollection\",\n\t\"newCollection\",\n\t\"newCollectionFolder\",\n\t\"newCollectionItem\",\n\t\"nextCollectionItem\",\n\t\"pasteCollection\",\n\t\"previousCollectionItem\",\n\t\"undraftCollectionItem\",\n] as const\ntype CollectionAction = (typeof collectionActions)[number]\n\nconst localizationActions = [\n\t\"addLocale\",\n\t\"editLocale\",\n\t\"viewLocaleOnCanvas\",\n\t\"batchTranslateAll\",\n\t\"filterLocalizationByScope\",\n\t\"filterLocalizationByStatus\",\n] as const\ntype LocalizationAction = (typeof localizationActions)[number]\n\nconst vectorSetActions = [\"createVectorSet\", \"addToVectorSet\"] as const\ntype VectorSetActions = (typeof vectorSetActions)[number]\n\nconst assetStyleActions = [\"editAssetStyle\", \"applyAssetStyle\", \"deleteAssetStyle\"] as const\ntype AssetStyleAction = (typeof assetStyleActions)[number]\n\nexport enum ComponentQuickActionsType {\n\tEdit = \"componentEdit\",\n\tInsert = \"componentInsert\",\n\tOpenPrimary = \"componentOpenPrimary\",\n\tReplace = \"componentReplace\",\n\tFind = \"componentFind\",\n}\n\nconst componentQuickActions = [\n\tComponentQuickActionsType.Edit,\n\tComponentQuickActionsType.Insert,\n\tComponentQuickActionsType.OpenPrimary,\n\tComponentQuickActionsType.Replace,\n\tComponentQuickActionsType.Find,\n] as const\nexport type ComponentQuickActions = (typeof componentQuickActions)[number]\n\nexport enum CodeImportQuickActionsType {\n\tLocalComponent = \"codeImportLocalComponent\",\n\tExternalComponent = \"codeImportExternalComponent\",\n}\n\nconst codeImportQuickActions = [\n\tCodeImportQuickActionsType.LocalComponent,\n\tCodeImportQuickActionsType.ExternalComponent,\n] as const\ntype CodeImportQuickActions = (typeof codeImportQuickActions)[number]\n\nexport type AppAction =\n\t| FileAction\n\t| EditAction\n\t| ViewAction\n\t| ToolAction\n\t| LayoutAction\n\t| AlignmentAction\n\t| ShapeBooleanAction\n\t| TextAction\n\t| GraphicAction\n\t| ComponentAction\n\t| PreviewAction\n\t| PluginAction\n\t| CodeAction\n\t| SiteSettingsAction\n\t| HelpAction\n\t| PreferenceAction\n\t| SitesAction\n\t| CollectionAction\n\t| LocalizationAction\n\t| AssetStyleAction\n\t| ComponentQuickActions\n\t| CodeImportQuickActions\n\t| VectorSetActions\n\n\t// Web-only actions\n\t| \"openAccountSettings\"\n\n\t// Beta actions\n\t| \"toggleBetaChannel\"\n", "import type { ModalOpenSource } from \"@framerjs/framer-events\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { ManifestConfigurationError } from \"plugins/pluginErrors.ts\"\nimport type { VekterPluginManifest } from \"plugins/plugins.ts\"\nimport { showPluginUrlFailedToast } from \"plugins/toast.ts\"\n\nexport const defaultDevelopmentUrl = \"https://localhost:5173\"\n\nexport function getDefaultDevelopmentPluginManifest(\n\tengine: VekterEngine,\n\tmodalOpenSource: ModalOpenSource,\n\tselectPlugin: (manifest: VekterPluginManifest) => void,\n) {\n\tvoid engine.stores.pluginStore\n\t\t.loadManifestFromUrl(defaultDevelopmentUrl)\n\t\t.then(selectPlugin)\n\t\t.catch(error => {\n\t\t\t// When the plugin is running but the manifest is incorrectly\n\t\t\t// configured we can display the toast immediately instead of\n\t\t\t// displaying another modal\n\t\t\tif (error instanceof ManifestConfigurationError) {\n\t\t\t\tshowPluginUrlFailedToast(defaultDevelopmentUrl, error)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tengine.stores.modalStore.set({\n\t\t\t\ttype: ModalType.PluginFromURL,\n\t\t\t\tenvironment: \"development\",\n\t\t\t\tsource: modalOpenSource,\n\t\t\t\tonSelectPlugin: selectPlugin,\n\t\t\t})\n\t\t})\n}\n\nexport function promptForPluginURL(\n\tengine: VekterEngine,\n\tmodalOpenSource: ModalOpenSource,\n\tselectPlugin: (manifest: VekterPluginManifest) => void,\n) {\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.PluginFromURL,\n\t\tenvironment: \"default\",\n\t\tsource: modalOpenSource,\n\t\tonSelectPlugin: selectPlugin,\n\t})\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { useClickHandlers } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport {\n\tCenterChild,\n\tCustomModal,\n\tIconBreadcrumbSeparator,\n\tInputWrapper,\n\tSpacer,\n\tSpinner,\n\tStack,\n\ttype StickyHeaderLevel,\n\tTextInput,\n\tVirtualList,\n\tuseCallbackOnMouseMove,\n} from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport {\n\tassert,\n\tassertNever,\n\tisCommandKeyPressed,\n\tisExternalModuleIdentifier,\n\tparseModuleIdentifier,\n\tshouldBeNever,\n\tunhandledError,\n} from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { CodeImportQuickActionsType } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { closeCollectionItems } from \"document/components/chrome/contentManagement/utils/closeCollectionItems.tsx\"\nimport engine from \"document/engine.ts\"\nimport type { ModalProps } from \"document/stores/ModalStore.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport type { Point } from \"library/render/types/Point.ts\"\nimport { useStableCallback } from \"library/utils/useStableCallback.ts\"\nimport { isComingSoonPlugin, isPluginDevelopmentUrl } from \"plugins/plugins.ts\"\nimport { getDefaultDevelopmentPluginManifest } from \"plugins/utils/getDefaultDevelopmentPluginManifest.ts\"\nimport React, { useEffect, useMemo } from \"react\"\nimport { isShallowArrayEqual } from \"utils/isShallowEqual.ts\"\nimport { isArray, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { Pages, record } from \"web/lib/tracker.ts\"\nimport { getAcceleratorTokenSeparator } from \"web/pages/project/lib/getAcceleratorLabel.ts\"\nimport { useIsViewOnly } from \"web/pages/project/permissions/useIsViewOnly.ts\"\nimport type { InitialState } from \"#framer-plugin/initialState.ts\"\nimport { shouldDisplayFloatingToolbar } from \"../floatingToolbar/FloatingToolbar.tsx\"\nimport { DarkOnDarkThemeOverride } from \"../shared/DarkOnDarkThemeOverride.tsx\"\nimport { useModalThemeOnActiveView } from \"../utils/useModalTheme.ts\"\nimport { QuickActionsCategoryTag } from \"./QuickActionsCategoryTag.tsx\"\nimport { QuickActionsEmptyState } from \"./QuickActionsEmptyState.tsx\"\nimport { QuickActionsGroupHeader } from \"./QuickActionsGroupHeader.tsx\"\nimport { QuickActionsInputIcon } from \"./QuickActionsInputIcon.tsx\"\nimport * as styles from \"./QuickActionsModal.styles.ts\"\nimport type {\n\tQuickActionsCategory,\n\tQuickActionsCategoryTypeWithoutOptions,\n\tQuickActionsGroup,\n\tQuickActionsGroupType,\n\tQuickActionsItem,\n\tQuickActionsItemIdentifier,\n\tQuickActionsVirtualListItem,\n} from \"./types.ts\"\nimport {\n\tFindNodesType,\n\tQuickActionsCategoryType,\n\tQuickActionsGroupSpecificType,\n\tQuickActionsTintType,\n\tQuickActionsType,\n\tcanGoBackFromCategory,\n\tisQuickActionsItemWithExternalIcon,\n\tisSelectableQuickActionItem,\n} from \"./types.ts\"\nimport { getEmptyStateIcon, getIconForQuickActionItem } from \"./utils/getIconForQuickActionItem.tsx\"\nimport { getQuickActionItemIdentifier } from \"./utils/getQuickActionItemIdentifier.ts\"\nimport { EnterIcon } from \"./utils/icons.tsx\"\nimport { performImportAction, performTeamLibraryImportAction } from \"./utils/performCodeImportAction.ts\"\nimport type { AssetStyleNode } from \"./utils/useAssetStylesActions.tsx\"\nimport {\n\texecuteAssetStyleAction,\n\tgetAssetStyleQuickActionsName,\n\tuseAssetStylesActions,\n} from \"./utils/useAssetStylesActions.tsx\"\nimport { useCanvasScopeQuickActions } from \"./utils/useCanvasScopeQuickActions.ts\"\nimport { useCategories, useFilterActionGroupsByCategory } from \"./utils/useCategoryActions.ts\"\nimport { goToCodeCrashSourceNode, useCodeCrashQuickActions } from \"./utils/useCodeCrashQuickActions.ts\"\nimport { performCodeFileAction, useCodeFileQuickActions } from \"./utils/useCodeFileQuickActions.ts\"\nimport { useCodeImportActions } from \"./utils/useCodeImportActions.ts\"\nimport {\n\tperformCollectionPageQuickAction,\n\tuseCollectionPageItemQuickActions,\n} from \"./utils/useCollectionPageItemQuickActions.ts\"\nimport {\n\tperformCollectionAction,\n\tperformCreateCollectionAction,\n\tuseCollectionQuickActions,\n} from \"./utils/useCollectionQuickActions.ts\"\nimport { useCombineLists } from \"./utils/useCombineLists.ts\"\nimport { executeComponentQuickAction, useComponentsActions } from \"./utils/useComponentsActions.tsx\"\nimport { performContextMenuAction, useContextMenuActions } from \"./utils/useContextMenuActions.ts\"\nimport {\n\ttype FindNodesOptions,\n\tperformFindNodesAction,\n\tuseFindNodesQuickActions,\n} from \"./utils/useFindNodesQuickActions.tsx\"\nimport { useLayoutTemplateActions } from \"./utils/useLayoutTemplateActions.ts\"\nimport {\n\tperformLocaleScopeFilterAction,\n\tperformLocaleStatusFilterAction,\n\tuseLocaleScopeFilterQuickActions,\n\tuseLocaleStatusFilterQuickActions,\n} from \"./utils/useLocaleScopeFilterQuickActions.ts\"\nimport { performMainMenuAction, useMainMenuActions } from \"./utils/useMainMenuActions.ts\"\nimport { openPluginAndCreateManagedCollectionIfNeeded, usePluginQuickActions } from \"./utils/usePluginQuickActions.tsx\"\nimport { useSearchActionGroups } from \"./utils/useSearchActionGroups.ts\"\nimport {\n\tperformSmartComponentAction,\n\tuseHandshakeQuickActions,\n\tuseSmartComponentQuickActions,\n} from \"./utils/useSmartComponentQuickActions.ts\"\nimport { performTeamLibraryInsertAction, useTeamLibraryActions } from \"./utils/useTeamLibraryActions.ts\"\nimport { performVersionHistoryAction, useVersionHistoryActions } from \"./utils/useVersionHistoryActions.ts\"\n\nconst dismiss = () => {\n\tconst { modalStore } = engine.stores\n\t// Some quick actions open another modal, to prevent closing that modal\n\t// we check if the quick action modal is still active before closing it.\n\tif (modalStore.active.type === ModalType.QuickActions) {\n\t\tmodalStore.dismiss()\n\t}\n}\n\n/** Each active main view type can specify which groups should be visible without starting a search */\nconst actionGroupsVisibleAtStart: Readonly<Record<ActiveMainView, Set<QuickActionsGroupType>>> = {\n\t[ActiveMainView.Canvas]: new Set([\n\t\tQuickActionsGroupSpecificType.CanvasCreateActions,\n\t\tQuickActionsGroupSpecificType.PluginMarketplace,\n\t\tQuickActionsGroupSpecificType.Project,\n\t]),\n\t[ActiveMainView.ContentManagement]: new Set([\n\t\tQuickActionsType.ContextMenuItem,\n\t\tQuickActionsGroupSpecificType.ContextSubMenu,\n\t]),\n\t[ActiveMainView.SiteSettings]: new Set([QuickActionsGroupSpecificType.SiteSettings]),\n\t[ActiveMainView.Analytics]: new Set([QuickActionsGroupSpecificType.Analytics]),\n\t[ActiveMainView.CodeEditor]: new Set([\n\t\tQuickActionsGroupSpecificType.PluginMarketplace,\n\t\tQuickActionsGroupSpecificType.Code,\n\t\tQuickActionsType.CodeFile,\n\t\tQuickActionsCategoryType.CodeImport,\n\t\tQuickActionsCategoryType.Plugins,\n\t]),\n\t[ActiveMainView.Preview]: new Set([]),\n\t[ActiveMainView.Localizations]: new Set([\n\t\tQuickActionsType.ContextMenuItem,\n\t\tQuickActionsGroupSpecificType.ContextSubMenu,\n\t]),\n}\n\n/** The visible groups at start can be overridden for specific scope types like the smart component canvas */\nconst actionGroupsVisibleAtStartByScopeType: Readonly<Partial<Record<ScopeType, Set<QuickActionsGroupType>>>> = {\n\t[ScopeType.SmartComponent]: new Set([\n\t\tQuickActionsGroupSpecificType.CanvasCreateActions,\n\t\tQuickActionsType.SmartComponent,\n\t\tQuickActionsGroupSpecificType.Project,\n\t\tQuickActionsCategoryType.TeamLibrary,\n\t]),\n\t[ScopeType.CanvasPage]: new Set([\n\t\tQuickActionsGroupSpecificType.Preview,\n\t\tQuickActionsGroupSpecificType.Project,\n\t\tQuickActionsCategoryType.TeamLibrary,\n\t]),\n}\n\nconst versionHistoryGroup = new Set([QuickActionsType.VersionHistory])\n\nconst actionGroupsVisibleAtStartByCategory: Readonly<\n\tRecord<Exclude<QuickActionsCategoryType, QuickActionsCategoryType.Default>, Set<QuickActionsGroupType>>\n> = {\n\t[QuickActionsCategoryType.CodeImport]: new Set([QuickActionsType.CodeImport]),\n\t[QuickActionsCategoryType.Plugins]: new Set([QuickActionsGroupSpecificType.PluginVisibleAtStart]),\n\t[QuickActionsCategoryType.ManagedCollectionPlugins]: new Set([QuickActionsGroupSpecificType.PluginVisibleAtStart]),\n\t[QuickActionsCategoryType.AssetStyles]: new Set([QuickActionsType.AssetStyles]),\n\t[QuickActionsCategoryType.Components]: new Set([QuickActionsType.Component]),\n\t[QuickActionsCategoryType.TeamLibrary]: new Set([QuickActionsType.TeamLibrary]),\n\t[QuickActionsCategoryType.WorkspacePlugins]: new Set([QuickActionsType.WorkspacePlugin]),\n\t[QuickActionsCategoryType.FindNodes]: new Set([QuickActionsType.FindNodes]),\n\t[QuickActionsCategoryType.LocaleScopeFilter]: new Set([QuickActionsType.LocaleScopeFilter]),\n\t[QuickActionsCategoryType.LocaleStatusFilter]: new Set([QuickActionsType.LocaleStatusFilter]),\n\t[QuickActionsCategoryType.CollectionPageItem]: new Set([QuickActionsType.CollectionPageItem]),\n}\n\nfunction getActionGroupsVisibleAtStart(\n\tmainView: ActiveMainView,\n\tscopeType: ScopeType,\n\tisHistoryModeActive: boolean,\n\tactiveCategory: QuickActionsCategory,\n): ReadonlySet<QuickActionsGroupType> {\n\tif (activeCategory.type !== QuickActionsCategoryType.Default) {\n\t\tconst visibleAtStartByCategory = actionGroupsVisibleAtStartByCategory[activeCategory.type]\n\t\tif (visibleAtStartByCategory) return visibleAtStartByCategory\n\t}\n\n\tif (mainView === ActiveMainView.Canvas) {\n\t\tif (isHistoryModeActive) return versionHistoryGroup\n\n\t\tconst visibleAtStartOverrides = actionGroupsVisibleAtStartByScopeType[scopeType]\n\t\tif (visibleAtStartOverrides) return visibleAtStartOverrides\n\t}\n\treturn actionGroupsVisibleAtStart[mainView]\n}\n\n/** For when you want to move certain groups to the top without making them visible before starting a search */\nconst actionGroupsWithPrecedence: Readonly<Record<ActiveMainView, Set<QuickActionsGroupType>>> = {\n\t[ActiveMainView.Canvas]: new Set([\n\t\tQuickActionsType.CollectionPageItem,\n\t\tQuickActionsType.CanvasScope,\n\t\tQuickActionsType.MainMenuItem,\n\t\tQuickActionsType.Component,\n\t\tQuickActionsGroupSpecificType.SiteSettings,\n\t]),\n\t[ActiveMainView.ContentManagement]: new Set([QuickActionsType.Collection]),\n\t[ActiveMainView.SiteSettings]: new Set(),\n\t[ActiveMainView.Analytics]: new Set(),\n\t[ActiveMainView.CodeEditor]: new Set(),\n\t[ActiveMainView.Preview]: new Set(),\n\t[ActiveMainView.Localizations]: new Set([\n\t\tQuickActionsType.ContextMenuItem,\n\t\tQuickActionsGroupSpecificType.ContextSubMenu,\n\t]),\n}\n\nfunction preventDefault(event: React.MouseEvent) {\n\tevent.preventDefault()\n}\n\nfunction addSeparators(title: string | string[]): React.ReactNode {\n\tif (isString(title)) return title\n\tconst titleSegmentCount = title.length\n\tif (titleSegmentCount === 1) return title[0]\n\n\treturn (\n\t\t<Stack direction=\"row\" alignItems=\"center\">\n\t\t\t{title.map((titleSegment, idx) => {\n\t\t\t\tconst isFirst = idx === 0\n\t\t\t\tconst isLast = idx === titleSegmentCount - 1\n\t\t\t\t// We want the selected item name not to shrink but parent menu item labels can\n\t\t\t\tconst className = isLast ? styles.nonShrinkableText : styles.shrinkableText\n\t\t\t\tif (isFirst) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span key={idx} className={className}>\n\t\t\t\t\t\t\t{titleSegment}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<React.Fragment key={idx}>\n\t\t\t\t\t\t<CenterChild className={styles.separatorIcon}>\n\t\t\t\t\t\t\t<IconBreadcrumbSeparator />\n\t\t\t\t\t\t</CenterChild>\n\t\t\t\t\t\t<span className={className}>{titleSegment}</span>\n\t\t\t\t\t</React.Fragment>\n\t\t\t\t)\n\t\t\t})}\n\t\t</Stack>\n\t)\n}\n\nfunction sortGroupsBySet(groupSet: ReadonlySet<QuickActionsGroupType>, groups: QuickActionsGroup[]) {\n\tif (groupSet.size === 0) return\n\tconst sortedGroupTypes = Array.from(groupSet)\n\tgroups.sort((a, b) => sortedGroupTypes.indexOf(a.type) - sortedGroupTypes.indexOf(b.type))\n}\n\n/** Visible groups at start and groups with precedence are moved to the top of the list */\nfunction useMoveGroupsToFront(\n\tgroups: readonly QuickActionsGroup[],\n\tvisibleAtStartGroupTypes: ReadonlySet<QuickActionsGroupType>,\n\tprecedenceGroupTypes: ReadonlySet<QuickActionsGroupType>,\n): readonly QuickActionsGroup[] {\n\tconst previousSortedGroups = React.useRef<readonly QuickActionsGroup[]>()\n\n\tconst sortedGroups = React.useMemo<readonly QuickActionsGroup[]>(() => {\n\t\tconst visibleAtStartGroups: QuickActionsGroup[] = []\n\t\tconst precedenceGroups: QuickActionsGroup[] = []\n\t\tconst regularGroups: QuickActionsGroup[] = []\n\n\t\tfor (const group of groups) {\n\t\t\tif (visibleAtStartGroupTypes.has(group.type)) {\n\t\t\t\tvisibleAtStartGroups.push(group)\n\t\t\t} else if (precedenceGroupTypes.has(group.type)) {\n\t\t\t\tprecedenceGroups.push(group)\n\t\t\t} else {\n\t\t\t\tregularGroups.push(group)\n\t\t\t}\n\t\t}\n\n\t\t// Make sure the groups have the same order as defined in the Set\n\t\tsortGroupsBySet(visibleAtStartGroupTypes, visibleAtStartGroups)\n\t\tsortGroupsBySet(precedenceGroupTypes, precedenceGroups)\n\n\t\tconst result = [...visibleAtStartGroups, ...precedenceGroups, ...regularGroups]\n\n\t\tconst previousResult = previousSortedGroups.current\n\t\tif (isArray(previousResult) && isShallowArrayEqual(result, previousResult)) {\n\t\t\treturn previousResult\n\t\t}\n\n\t\treturn result\n\t}, [groups, visibleAtStartGroupTypes, precedenceGroupTypes])\n\n\tuseEffect(() => {\n\t\t// Refs are not allowed to be updated in useMemo\n\t\tpreviousSortedGroups.current = sortedGroups\n\t})\n\n\treturn sortedGroups\n}\n\nfunction getIconTint(item: QuickActionsItem): string | undefined {\n\tif (isUndefined(item.tint)) return undefined\n\tswitch (item.tint) {\n\t\tcase QuickActionsTintType.ComponentPurple:\n\t\t\treturn styles.rowIconComponentTint\n\t\tcase QuickActionsTintType.AssetStyleIcon:\n\t\t\treturn styles.rowIconAssetStyleTint\n\t\tdefault:\n\t\t\tshouldBeNever(item.tint)\n\t}\n}\n\ninterface QuickActionsRowProps {\n\tactionItem: QuickActionsItem\n\tactionIdentifier: QuickActionsItemIdentifier\n\tselectedIdentifier: QuickActionsItemIdentifier | undefined\n\tsetSelectedActionItem: (identifier: QuickActionsItemIdentifier) => void\n\texecuteActionWithIdentifier: (identifier: QuickActionsItemIdentifier) => void\n\tprevMousePositionRef: React.RefObject<Point>\n}\n\nfunction isComingSoonPluginAction(actionItem: QuickActionsItem) {\n\treturn actionItem?.type === QuickActionsType.Plugin && isComingSoonPlugin(actionItem.pluginManifest)\n}\n\nfunction HighlightedItemAction({ actionItem }: { actionItem: QuickActionsItem }) {\n\tconst isActionItemWithActions = actionItem.type === QuickActionsType.SelectCategory && !actionItem.appAction\n\tconst isPluginAction = actionItem.type === QuickActionsType.Plugin\n\tconst isOpenExternalAction = actionItem.type === QuickActionsType.OpenExternalUrl && actionItem.showOpenActionText\n\tconst isWorkspacePluginAction = actionItem.id === QuickActionsCategoryType.WorkspacePlugins\n\n\tif (!isActionItemWithActions && !isPluginAction && !isOpenExternalAction) return null\n\n\tif (isComingSoonPluginAction(actionItem)) {\n\t\treturn <span className={styles.rowShortcut}>Coming Soon</span>\n\t}\n\n\tfunction getActionText(): string {\n\t\tif (isPluginAction) return \" to Launch\"\n\t\tif (isOpenExternalAction) return \" to Open\"\n\t\tif (isWorkspacePluginAction) return \" to View\"\n\n\t\treturn \" for Actions\"\n\t}\n\n\treturn (\n\t\t<span className={styles.rowShortcut}>\n\t\t\t<EnterIcon />\n\t\t\t{getActionText()}\n\t\t</span>\n\t)\n}\n\nconst QuickActionsRow = React.memo(function QuickActionsRow({\n\tactionItem,\n\tselectedIdentifier,\n\tsetSelectedActionItem,\n\texecuteActionWithIdentifier,\n\tactionIdentifier: identifier,\n\tprevMousePositionRef,\n}: QuickActionsRowProps) {\n\tconst handleHighlight = React.useCallback(() => {\n\t\tsetSelectedActionItem(identifier)\n\t}, [identifier, setSelectedActionItem])\n\n\tconst isHighlighted = selectedIdentifier === identifier\n\tconst doesCheckedExist = \"checked\" in actionItem\n\tconst isChecked = doesCheckedExist && actionItem.checked\n\n\tconst handleMouseMove = useCallbackOnMouseMove(handleHighlight, prevMousePositionRef)\n\n\tconst clickHandlers = useClickHandlers(\n\t\t() => executeActionWithIdentifier(identifier),\n\t\tpreventDefault /* Keep search input focused so the modal isn't dismissed */,\n\t\ttrue,\n\t)\n\n\treturn (\n\t\t<Stack\n\t\t\tid={identifier}\n\t\t\tkey={identifier}\n\t\t\tpadding={dimensions.css.inputSpacing}\n\t\t\tdirection=\"row\"\n\t\t\talignItems=\"center\"\n\t\t\tonMouseMove={handleMouseMove}\n\t\t\t{...clickHandlers}\n\t\t\tclassName={cx(styles.actionRow, selectedIdentifier === identifier && styles.actionRowSelected)}\n\t\t>\n\t\t\t<CenterChild\n\t\t\t\tclassName={cx(\n\t\t\t\t\tstyles.rowIcon,\n\t\t\t\t\tgetIconTint(actionItem),\n\t\t\t\t\tactionItem.icon && isQuickActionsItemWithExternalIcon(actionItem) && styles.rowIconExternal,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{getIconForQuickActionItem(actionItem, isHighlighted)}\n\t\t\t</CenterChild>\n\t\t\t<span className={styles.rowTitle}>{addSeparators(actionItem.name)}</span>\n\t\t\t<Spacer flex />\n\t\t\t{actionItem.shortcut ? (\n\t\t\t\t<span className={styles.rowShortcut}>{actionItem.shortcut.join(getAcceleratorTokenSeparator())}</span>\n\t\t\t) : (\n\t\t\t\tisHighlighted && <HighlightedItemAction actionItem={actionItem} />\n\t\t\t)}\n\t\t\t{/* copy added if checked is propagated, which is only from the experiments case in collectQuickActionsFromMenu() */}\n\t\t\t{isHighlighted && doesCheckedExist && (\n\t\t\t\t<span className={styles.rowEnabledOrDisabledText}>{isChecked ? \"Enabled\" : \"Disabled\"}</span>\n\t\t\t)}\n\t\t</Stack>\n\t)\n})\n\nfunction usePrioritizeLoadingAllData(activeCategory: QuickActionsCategory) {\n\tconst categoryType = activeCategory.type\n\tReact.useEffect(() => {\n\t\tconst loader = engine.tree.getService(\"loader\")\n\t\tif (!loader) return\n\n\t\tlet unsubscribe: VoidFunction | undefined\n\n\t\tswitch (categoryType) {\n\t\t\tcase QuickActionsCategoryType.FindNodes:\n\t\t\t\tunsubscribe = loader.prioritizeLoadingAllData({ preload: true })\n\t\t\t\tbreak\n\n\t\t\tcase QuickActionsCategoryType.AssetStyles:\n\t\t\tcase QuickActionsCategoryType.CodeImport:\n\t\t\tcase QuickActionsCategoryType.Components:\n\t\t\tcase QuickActionsCategoryType.TeamLibrary:\n\t\t\tcase QuickActionsCategoryType.WorkspacePlugins:\n\t\t\tcase QuickActionsCategoryType.Plugins:\n\t\t\tcase QuickActionsCategoryType.ManagedCollectionPlugins:\n\t\t\tcase QuickActionsCategoryType.LocaleScopeFilter:\n\t\t\tcase QuickActionsCategoryType.LocaleStatusFilter:\n\t\t\tcase QuickActionsCategoryType.CollectionPageItem:\n\t\t\tcase QuickActionsCategoryType.Default:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(categoryType)\n\t\t}\n\n\t\treturn unsubscribe\n\t}, [categoryType])\n}\n\nexport interface UseUnorderedQuickActionGroupsProps {\n\tmainView: ActiveMainView\n\tscopeType: ScopeType\n\tisHistoryModeActive: boolean\n\tactiveCategory: QuickActionsCategory\n\tinitialCategory: QuickActionsCategory | undefined\n\tviewOnlyCanvas: boolean\n\tisPreviewingLocaleOnCanvas: boolean\n\tsearchTerm: string\n}\n\nfunction useUnorderedQuickActionGroups({\n\tmainView,\n\tscopeType,\n\tisHistoryModeActive,\n\tactiveCategory,\n\tinitialCategory,\n\tviewOnlyCanvas,\n\tisPreviewingLocaleOnCanvas,\n\tsearchTerm,\n}: UseUnorderedQuickActionGroupsProps) {\n\tconst projectIsReady = engine.stores.loadingStore.useState(state => state.isReady)\n\tconst activeCategoryType = activeCategory?.type\n\n\tconst { contextMenuActionGroups, contextAppActions } = useContextMenuActions(mainView)\n\tconst componentGroups = useComponentsActions(mainView, scopeType, viewOnlyCanvas, activeCategory)\n\tconst assetStylesActionGroups = useAssetStylesActions(activeCategory)\n\t// Only start fetching team modules when in the category or code import.\n\tconst teamLibraryEnabled =\n\t\t!viewOnlyCanvas &&\n\t\tscopeType !== ScopeType.ContentManagement &&\n\t\t(activeCategoryType === QuickActionsCategoryType.TeamLibrary ||\n\t\t\tactiveCategoryType === QuickActionsCategoryType.CodeImport ||\n\t\t\tactiveCategoryType === QuickActionsCategoryType.Components)\n\tconst { teamLibraryGroups, teamName, teamLibraryModulesLoading } = useTeamLibraryActions(teamLibraryEnabled)\n\tconst canvasScopeActionGroups = useCanvasScopeQuickActions()\n\tconst layoutTemplateActionGroups = useLayoutTemplateActions(engine)\n\tconst collectionActionGroups = useCollectionQuickActions()\n\tconst codeImportGroups = useCodeImportActions(activeCategory, teamLibraryGroups)\n\tconst { findNodesActionGroups, findNodesLoading } = useFindNodesQuickActions(activeCategory)\n\tconst localeScopeFilterActionGroups = useLocaleScopeFilterQuickActions(activeCategoryType)\n\tconst localeStatusFilterActionGroups = useLocaleStatusFilterQuickActions(activeCategoryType)\n\tconst {\n\t\topenPluginsActionGroups: openPluginsActionGroupsWithoutFeatured,\n\t\tpreviewActionGroups,\n\t\tprojectActionGroups,\n\t\tnavigateActionGroups,\n\t\tsiteSettingsActionGroups,\n\t\tpreferenceActionGroups,\n\t\thelpActionGroups,\n\t\tcodeActionGroups,\n\t\texperimentActionGroups,\n\t\tmainMenuActionGroups,\n\t\tmenuDidLoad,\n\t} = useMainMenuActions(contextAppActions, isHistoryModeActive, scopeType, viewOnlyCanvas)\n\tconst codeFileActionGroups = useCodeFileQuickActions()\n\tconst smartComponentActionGroups = useSmartComponentQuickActions(mainView, scopeType, viewOnlyCanvas)\n\tconst handshakeActionGroups = useHandshakeQuickActions()\n\tconst collectionPageActionGroups = useCollectionPageItemQuickActions()\n\tconst { groups: pluginActionGroups, defaultCategoryFeaturedItems: featuredPluginActionItems } = usePluginQuickActions(\n\t\tmainView,\n\t\tactiveCategory,\n\t\tinitialCategory,\n\t)\n\tconst versionHistoryActions = useVersionHistoryActions()\n\tconst categories = useCategories(scopeType, mainView, viewOnlyCanvas, isPreviewingLocaleOnCanvas)\n\tconst goToCodeCrash = useCodeCrashQuickActions(searchTerm)\n\n\tconst openPluginsActionGroups = useMemo(() => {\n\t\tconst [openPluginsActionGroup] = openPluginsActionGroupsWithoutFeatured\n\t\tif (!openPluginsActionGroup) return openPluginsActionGroupsWithoutFeatured\n\t\treturn [{ ...openPluginsActionGroup, items: [...openPluginsActionGroup.items, ...featuredPluginActionItems] }]\n\t}, [featuredPluginActionItems, openPluginsActionGroupsWithoutFeatured])\n\n\tconst unorderedActionGroups = useCombineLists(\n\t\tpluginActionGroups,\n\t\topenPluginsActionGroups,\n\t\tassetStylesActionGroups,\n\t\tcomponentGroups,\n\t\tnavigateActionGroups,\n\t\tteamLibraryGroups,\n\t\tcodeImportGroups,\n\t\tcontextMenuActionGroups,\n\t\tcanvasScopeActionGroups,\n\t\tlayoutTemplateActionGroups,\n\t\tsmartComponentActionGroups,\n\t\thandshakeActionGroups,\n\t\tcollectionPageActionGroups,\n\t\tpreviewActionGroups,\n\t\tprojectActionGroups,\n\t\tcodeActionGroups,\n\t\tcollectionActionGroups,\n\t\tcodeFileActionGroups,\n\t\tsiteSettingsActionGroups,\n\t\tpreferenceActionGroups,\n\t\thelpActionGroups,\n\t\texperimentActionGroups,\n\t\tmainMenuActionGroups,\n\t\tversionHistoryActions,\n\t\tcategories,\n\t\tfindNodesActionGroups,\n\t\tlocaleScopeFilterActionGroups,\n\t\tlocaleStatusFilterActionGroups,\n\t\tgoToCodeCrash,\n\t)\n\n\tconst isLoading: boolean = teamLibraryModulesLoading || findNodesLoading || !projectIsReady\n\n\treturn {\n\t\tunorderedActionGroups,\n\t\tmenuDidLoad,\n\t\tteamName,\n\t\tprojectIsReady,\n\t\tisLoading,\n\t}\n}\n\nexport const testing = { useUnorderedQuickActionGroups }\n\nfunction scrollToTop(scroll: React.RefObject<HTMLDivElement>) {\n\tconst scrollElement = scroll.current\n\tif (!scrollElement) return\n\tscrollElement.scrollTop = 0\n}\n\nfunction keyForItem(item: QuickActionsVirtualListItem): string {\n\tswitch (item.kind) {\n\t\tcase \"group\":\n\t\t\tif (item.key) return item.key + item.type\n\t\t\treturn item.title + item.type\n\t\tcase \"item\":\n\t\t\treturn item.identifier\n\t\tcase \"emptyState\":\n\t\t\treturn item.kind\n\t\tdefault:\n\t\t\tassertNever(item)\n\t}\n}\n\nfunction heightForItem(item: QuickActionsVirtualListItem) {\n\tswitch (item.kind) {\n\t\tcase \"group\":\n\t\t\treturn item.title ? styles.groupHeaderHeight : 0\n\t\tcase \"item\":\n\t\t\treturn styles.itemHeight\n\t\tcase \"emptyState\":\n\t\t\treturn styles.emptyStateHeight\n\t\tdefault:\n\t\t\tassertNever(item)\n\t}\n}\n\nfunction marginTopForItem(_item: QuickActionsVirtualListItem, index: number) {\n\treturn index === 0 ? styles.containerPadding : 0\n}\n\nfunction stickyHeaderLevelForItem(item: QuickActionsVirtualListItem): StickyHeaderLevel {\n\treturn item.kind === \"group\" && item.title ? \"primary\" : \"off\"\n}\n\nconst defaultCategory: QuickActionsCategory = { type: QuickActionsCategoryType.Default }\n\nexport function QuickActionsModal({ initialCategory, initialPluginState }: ModalProps<ModalType.QuickActions>) {\n\t// Quick actions mount metric\n\tuseRecordEffect(\"ui_impression\", { page: Pages.quickActionsModal })\n\n\tconst inputRef = React.useRef<HTMLInputElement>(null)\n\tconst scroll = React.useRef<HTMLDivElement>(null)\n\tconst prevMousePositionRef = React.useRef<Point>(null)\n\n\tconst { chromeStore, scopeStore, siteSettingsStore, pluginStore, codeEditorStore, modalStore } = engine.stores\n\n\tconst { mainView, isHistoryModeActive, isPreviewingLocaleOnCanvas, floatingToolbarWidth } = chromeStore.useState(\n\t\tstate => ({\n\t\t\tmainView: state.mainView,\n\t\t\tisHistoryModeActive: state.isHistoryModeActive,\n\t\t\tisPreviewingLocaleOnCanvas: state.isPreviewingLocaleOnCanvas,\n\t\t\tfloatingToolbarWidth: state.floatingToolbarWidth,\n\t\t}),\n\t)\n\tconst viewOnlyCanvas = useIsViewOnly(\"canDesign\")\n\tconst scopeType = scopeStore.useState(state => state.scopeType)\n\n\tconst [activeCategory, setActiveCategory] = React.useState<QuickActionsCategory>(initialCategory ?? defaultCategory)\n\n\tconst activeCategoryType = activeCategory?.type\n\n\tusePrioritizeLoadingAllData(activeCategory)\n\n\tconst handleCategoryChange = React.useCallback((newCategory: QuickActionsCategoryTypeWithoutOptions) => {\n\t\tsetActiveCategory({ type: newCategory })\n\t}, [])\n\n\tconst [searchTerm, setSearchTerm] = React.useState(\"\")\n\tconst emptySearchTerm = searchTerm === \"\"\n\tconst normalizedSearchTerm = searchTerm.trim().toLowerCase()\n\n\tconst groupsVisibleAtStart = getActionGroupsVisibleAtStart(mainView, scopeType, isHistoryModeActive, activeCategory)\n\n\tconst { unorderedActionGroups, menuDidLoad, teamName, isLoading, projectIsReady } = useUnorderedQuickActionGroups({\n\t\tmainView,\n\t\tscopeType,\n\t\tisHistoryModeActive,\n\t\tactiveCategory,\n\t\tinitialCategory,\n\t\tviewOnlyCanvas,\n\t\tisPreviewingLocaleOnCanvas,\n\t\tsearchTerm,\n\t})\n\n\tconst { groups: groupsFilteredByCategory } = useFilterActionGroupsByCategory(\n\t\tactiveCategoryType,\n\t\tunorderedActionGroups,\n\t)\n\n\tconst groupsWithPrecedence = actionGroupsWithPrecedence[mainView]\n\n\tconst orderedActionGroups = useMoveGroupsToFront(groupsFilteredByCategory, groupsVisibleAtStart, groupsWithPrecedence)\n\n\tconst { filteredVirtualListItems, filteredItemsByIdentifier, firstItemIdentifier, isEmptyState } =\n\t\tuseSearchActionGroups(orderedActionGroups, normalizedSearchTerm, groupsVisibleAtStart, activeCategoryType)\n\n\tconst filteredVirtualListItemsRef = React.useRef(filteredVirtualListItems)\n\tuseEffect(() => {\n\t\tfilteredVirtualListItemsRef.current = filteredVirtualListItems\n\t})\n\n\tconst showActiveCategoryTag =\n\t\tactiveCategoryType !== QuickActionsCategoryType.Plugins &&\n\t\tactiveCategoryType !== QuickActionsCategoryType.ManagedCollectionPlugins &&\n\t\tactiveCategoryType !== QuickActionsCategoryType.Default\n\n\tconst [selectedIdentifier, _setSelectedIdentifier] = React.useState<QuickActionsItemIdentifier>()\n\tconst [scrollIntoViewIndex, _setScrollIntoViewIndex] = React.useState(0)\n\n\tconst preloadSelection = useStableCallback((identifier: QuickActionsItemIdentifier | undefined) => {\n\t\tif (!identifier) return\n\t\tconst action = filteredItemsByIdentifier.get(identifier)\n\t\tif (action?.type !== QuickActionsType.Plugin) return\n\n\t\tpluginStore.preloadPlugin(engine, action.pluginManifest.id)\n\t})\n\n\t// Preloading selected items.\n\tconst setSelectedIdentifier = React.useCallback(\n\t\t(identifier: QuickActionsItemIdentifier | undefined, scrollBehavior: \"scrollIntoView\" | \"none\" = \"none\") => {\n\t\t\t_setSelectedIdentifier(identifier)\n\t\t\tpreloadSelection(identifier)\n\n\t\t\tif (scrollBehavior !== \"scrollIntoView\") {\n\t\t\t\t_setScrollIntoViewIndex(-1)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst index = filteredVirtualListItemsRef.current.findIndex(item => {\n\t\t\t\treturn isSelectableQuickActionItem(item) && item.identifier === identifier\n\t\t\t})\n\n\t\t\t_setScrollIntoViewIndex(index)\n\t\t},\n\t\t[],\n\t)\n\n\t// `useLayoutEffect` is used to prevent the selection flashing when items change.\n\t//\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: we want to scroll to the top item on any search change.\n\tReact.useLayoutEffect(() => {\n\t\tsetSelectedIdentifier(firstItemIdentifier)\n\t\tif (!firstItemIdentifier) return\n\t\tscrollToTop(scroll)\n\t}, [searchTerm, firstItemIdentifier, setSelectedIdentifier])\n\n\tconst executeActionWithIdentifier = useEngineCallback(\n\t\t(identifier: string) => {\n\t\t\tconst selectedAction = filteredItemsByIdentifier.get(identifier)\n\t\t\tif (!selectedAction) return\n\t\t\tconst { type, id, key, appAction } = selectedAction\n\n\t\t\trecord(\"ui_interaction\", {\n\t\t\t\tpage: Pages.quickActionsModal,\n\t\t\t\tid: getQuickActionItemIdentifier(selectedAction),\n\t\t\t})\n\n\t\t\tlet shouldDismiss = true\n\t\t\tswitch (type) {\n\t\t\t\tcase QuickActionsType.CanvasScope:\n\t\t\t\tcase QuickActionsType.LayoutTemplate:\n\t\t\t\t\tscopeStore.select(id, { keepHistory: false })\n\t\t\t\t\tsiteSettingsStore.close()\n\t\t\t\t\tcodeEditorStore.closeEditor()\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.Collection:\n\t\t\t\t\tperformCollectionAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.CreateCollection:\n\t\t\t\tcase QuickActionsType.CreateCollectionFolder:\n\t\t\t\t\tperformCreateCollectionAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.ContextMenuItem: {\n\t\t\t\t\tperformContextMenuAction(id)\n\n\t\t\t\t\tconst category = getCategoryForAppAction(appAction)\n\t\t\t\t\tif (category) {\n\t\t\t\t\t\thandleCategoryChange(category)\n\t\t\t\t\t\tsetSearchTerm(\"\")\n\t\t\t\t\t\tscrollToTop(scroll)\n\t\t\t\t\t\tshouldDismiss = false\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.CodeImport: {\n\t\t\t\t\tif (appAction === CodeImportQuickActionsType.LocalComponent) {\n\t\t\t\t\t\tvoid performImportAction(key ?? id)\n\t\t\t\t\t}\n\t\t\t\t\tif (appAction === CodeImportQuickActionsType.ExternalComponent) {\n\t\t\t\t\t\tif (activeCategory?.type === QuickActionsCategoryType.Components) {\n\t\t\t\t\t\t\tconst parsedModule = parseModuleIdentifier(activeCategory.activeComponent.identifier)\n\t\t\t\t\t\t\tassert(isExternalModuleIdentifier(parsedModule), \"Module identifier is not external\")\n\t\t\t\t\t\t\tperformTeamLibraryImportAction(parsedModule?.moduleId).catch(unhandledError)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tperformTeamLibraryImportAction(id).catch(unhandledError)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.TeamLibrary: {\n\t\t\t\t\tvoid performTeamLibraryInsertAction(id)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.SelectCategory:\n\t\t\t\t\tsetSearchTerm(\"\")\n\t\t\t\t\tsetActiveCategory(selectedAction.category)\n\t\t\t\t\tshouldDismiss = false\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.AssetStyles:\n\t\t\t\t\texecuteAssetStyleAction(selectedAction.appAction, activeCategory)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.Component:\n\t\t\t\t\tif (!selectedAction.appAction) return\n\t\t\t\t\tvoid executeComponentQuickAction(engine.componentLoader, mainView, selectedAction.appAction, activeCategory)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.MainMenuItem:\n\t\t\t\t\tif (appAction === \"openPlugins\") {\n\t\t\t\t\t\thandleCategoryChange(QuickActionsCategoryType.Plugins)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tperformMainMenuAction(appAction)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we get here it's because we did something that should\n\t\t\t\t\t// leave the quick actions menu open.\n\t\t\t\t\tsetSearchTerm(\"\")\n\t\t\t\t\tshouldDismiss = false\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.CodeFile:\n\t\t\t\t\tperformCodeFileAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.SmartComponent:\n\t\t\t\tcase QuickActionsType.Handshake:\n\t\t\t\t\tperformSmartComponentAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.CollectionPageItem: {\n\t\t\t\t\tvoid closeCollectionItems({\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\ttarget: \"all-except-selected\",\n\t\t\t\t\t}).then(({ userKeptEditing }) => {\n\t\t\t\t\t\tif (!userKeptEditing) {\n\t\t\t\t\t\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t\t\t\t\t\tperformCollectionPageQuickAction(id)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.VersionHistory:\n\t\t\t\t\tperformVersionHistoryAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.FindNodes: {\n\t\t\t\t\tperformFindNodesAction(id)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.LocaleScopeFilter:\n\t\t\t\t\tperformLocaleScopeFilterAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.LocaleStatusFilter:\n\t\t\t\t\tperformLocaleStatusFilterAction(id)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.OpenDevelopmentPlugin:\n\t\t\t\t\tsetupAndOpenQuickActionsDevPlugin(engine, activeCategory, initialCategory, initialPluginState)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.WorkspacePlugin: {\n\t\t\t\t\tshouldDismiss = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.Plugin: {\n\t\t\t\t\tif (isComingSoonPlugin(selectedAction.pluginManifest)) {\n\t\t\t\t\t\ttoast({\n\t\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\t\tprimaryText: `${selectedAction.pluginManifest.name} plugin`,\n\t\t\t\t\t\t\tsecondaryText: \"is coming soon.\",\n\t\t\t\t\t\t\tvariant: \"info\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\topenPluginAndCreateManagedCollectionIfNeeded(\n\t\t\t\t\t\tselectedAction.pluginManifest,\n\t\t\t\t\t\tactiveCategory,\n\t\t\t\t\t\tinitialCategory,\n\t\t\t\t\t\tinitialPluginState,\n\t\t\t\t\t)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase QuickActionsType.OpenExternalUrl:\n\t\t\t\t\topenNewTab(selectedAction.url, { referrer: false })\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.OpenModal:\n\t\t\t\t\tmodalStore.set(selectedAction.modal)\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsType.GoToCodeCrashSourceNode:\n\t\t\t\t\tgoToCodeCrashSourceNode(id)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(type, \"Should be able to execute all quick action types\")\n\t\t\t}\n\t\t\tif (shouldDismiss) {\n\t\t\t\tdismiss()\n\t\t\t}\n\t\t},\n\t\t[filteredItemsByIdentifier, initialCategory, activeCategory, handleCategoryChange, mainView, initialPluginState],\n\t)\n\n\tconst exitCategory = React.useCallback(() => {\n\t\tif (activeCategoryType === QuickActionsCategoryType.Default) return\n\t\tlet nextCategory: QuickActionsCategory = { type: QuickActionsCategoryType.Default }\n\n\t\tswitch (activeCategoryType) {\n\t\t\tcase QuickActionsCategoryType.WorkspacePlugins:\n\t\t\t\tnextCategory = { type: QuickActionsCategoryType.Plugins }\n\t\t\t\tif (initialCategory?.type === QuickActionsCategoryType.ManagedCollectionPlugins) {\n\t\t\t\t\tnextCategory = initialCategory\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase QuickActionsCategoryType.Plugins:\n\t\t\tcase QuickActionsCategoryType.ManagedCollectionPlugins:\n\t\t\t\tnextCategory = { type: QuickActionsCategoryType.Default }\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t\tsetActiveCategory(nextCategory)\n\t\tinputRef.current?.focus()\n\t}, [activeCategoryType, initialCategory])\n\n\tconst onKeyDown = React.useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\tconst isHoldingDownKey = event.repeat\n\n\t\t\t\t\tconst nextItemIdentifier = getNextItemIdentifier({\n\t\t\t\t\t\tselectedIdentifier,\n\t\t\t\t\t\tdirection: event.key === \"ArrowDown\" ? \"down\" : \"up\",\n\t\t\t\t\t\tloop: !isHoldingDownKey,\n\t\t\t\t\t\tfilteredVirtualListItems: filteredVirtualListItemsRef.current,\n\t\t\t\t\t})\n\n\t\t\t\t\t// If the selection doesn't change, do nothing\n\t\t\t\t\tif (nextItemIdentifier && nextItemIdentifier !== selectedIdentifier) {\n\t\t\t\t\t\tsetSelectedIdentifier(nextItemIdentifier, \"scrollIntoView\")\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"Enter\": {\n\t\t\t\t\t// Don't put a newline in the input\n\t\t\t\t\tevent.preventDefault()\n\n\t\t\t\t\tif (selectedIdentifier) {\n\t\t\t\t\t\texecuteActionWithIdentifier(selectedIdentifier)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\tevent.preventDefault()\n\n\t\t\t\t\tif (canGoBackFromCategory(activeCategoryType)) {\n\t\t\t\t\t\texitCategory()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdismiss()\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase \"Tab\": {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"k\":\n\t\t\t\t\t// Allow cmd+K to toggle off the quick actions modal\n\t\t\t\t\tif (isCommandKeyPressed(event) && !event.repeat) dismiss()\n\t\t\t\t\tbreak\n\t\t\t\tcase \"Backspace\":\n\t\t\t\t\t// Prevent clearing the category if you are also clearing the search term.\n\t\t\t\t\tif (event.repeat) return\n\t\t\t\t\tif (emptySearchTerm) exitCategory()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\temptySearchTerm,\n\t\t\texitCategory,\n\t\t\tselectedIdentifier,\n\t\t\tsetSelectedIdentifier,\n\t\t\texecuteActionWithIdentifier,\n\t\t\tactiveCategoryType,\n\t\t],\n\t)\n\tconst onBlur = React.useCallback(\n\t\t(event: React.FocusEvent<HTMLInputElement, Element>) => {\n\t\t\t// When project is still loading, blur event will be triggered if\n\t\t\t// the project contains code component with an input field that has\n\t\t\t// autoFocus set to true. We don't want to dismiss the modal in that case.\n\t\t\tif (!projectIsReady) {\n\t\t\t\tevent.preventDefault() // Prevents the input from losing focus\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Clicking on the active category will also blur the input, but we don't want to dismiss the modal yet.\n\t\t\tif (activeCategory) return\n\t\t\tdismiss()\n\t\t},\n\t\t[projectIsReady, activeCategory],\n\t)\n\n\tconst modalIsDocked = shouldDisplayFloatingToolbar(mainView)\n\tconst isContentManagementView = mainView === ActiveMainView.ContentManagement\n\n\tfunction getWidth() {\n\t\tif (modalIsDocked) return floatingToolbarWidth\n\t\tif (isContentManagementView) return styles.contentManagementModalWidth\n\t\treturn styles.defaultModalWidth\n\t}\n\n\tconst modalWidth = getWidth()\n\n\tconst modalThemeProps = useModalThemeOnActiveView(\"darker\")\n\n\t// We don't render the modal until the main menu items have been loaded with\n\t// the latest state. Loading the main menu is async.\n\tif (!menuDidLoad) return null\n\n\treturn (\n\t\t<DarkOnDarkThemeOverride>\n\t\t\t<CustomModal\n\t\t\t\tvisible\n\t\t\t\tonDismiss={dismiss}\n\t\t\t\tclassName={cx(styles.modal, modalIsDocked ? styles.modalPositionDocked : styles.modalPosition)}\n\t\t\t\tstyle={{ width: modalWidth }}\n\t\t\t\t// We use onKeyDownCapture to prevent some keys from affecting the canvas tools shortcuts\n\t\t\t\tonKeyDownCapture={onKeyDown}\n\t\t\t\tanimationEnabled={false}\n\t\t\t\t{...modalThemeProps}\n\t\t\t>\n\t\t\t\t<Stack className={styles.headerSeparator} gap={0}>\n\t\t\t\t\t<InputWrapper className={cx(styles.inputSearch, showActiveCategoryTag && styles.inputSearchWithCategoryTag)}>\n\t\t\t\t\t\t{showActiveCategoryTag ? (\n\t\t\t\t\t\t\t<QuickActionsCategoryTag\n\t\t\t\t\t\t\t\tname={getActiveCategoryName(activeCategory, teamName)}\n\t\t\t\t\t\t\t\tcolor={colors.quickActionsCategoryTagColor}\n\t\t\t\t\t\t\t\tbackground={colors.quickActionsCategoryTagBackground}\n\t\t\t\t\t\t\t\tonRemove={exitCategory}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<QuickActionsInputIcon activeCategoryType={activeCategoryType} onExitCategory={exitCategory} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\t\tonChange={setSearchTerm}\n\t\t\t\t\t\t\tstopUpDownKeyPropagation={false}\n\t\t\t\t\t\t\treadOnly={activeCategoryType === QuickActionsCategoryType.FindNodes && isEmptyState && emptySearchTerm}\n\t\t\t\t\t\t\tplaceholder={getInputPlaceholder(activeCategory, isEmptyState, isLoading)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{isLoading && <Spinner className={styles.inputSearchSpinner} inline />}\n\t\t\t\t\t</InputWrapper>\n\t\t\t\t</Stack>\n\n\t\t\t\t{projectIsReady && (\n\t\t\t\t\t<VirtualList\n\t\t\t\t\t\tscrollRef={scroll}\n\t\t\t\t\t\titems={filteredVirtualListItems}\n\t\t\t\t\t\tkeyForItem={keyForItem}\n\t\t\t\t\t\theightForItem={heightForItem}\n\t\t\t\t\t\tmarginTopForItem={marginTopForItem}\n\t\t\t\t\t\tstickyHeaderLevelForItem={stickyHeaderLevelForItem}\n\t\t\t\t\t\tscrollToIndex={scrollIntoViewIndex}\n\t\t\t\t\t\tscrollPaddingBottom={styles.containerPadding}\n\t\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\t\tstyles.actionResultContainer,\n\t\t\t\t\t\t\tgetResultContainerHeightStyle(modalIsDocked, isContentManagementView),\n\t\t\t\t\t\t\tfilteredVirtualListItems.length === 0 && styles.emptyActionResultContainer,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{({ item }) => {\n\t\t\t\t\t\t\tswitch (item.kind) {\n\t\t\t\t\t\t\t\tcase \"group\":\n\t\t\t\t\t\t\t\t\tif (!item.title) return null\n\t\t\t\t\t\t\t\t\treturn <QuickActionsGroupHeader>{addSeparators(item.title)}</QuickActionsGroupHeader>\n\t\t\t\t\t\t\t\tcase \"item\":\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<QuickActionsRow\n\t\t\t\t\t\t\t\t\t\t\tactionItem={item}\n\t\t\t\t\t\t\t\t\t\t\tactionIdentifier={item.identifier}\n\t\t\t\t\t\t\t\t\t\t\tselectedIdentifier={selectedIdentifier}\n\t\t\t\t\t\t\t\t\t\t\tsetSelectedActionItem={setSelectedIdentifier}\n\t\t\t\t\t\t\t\t\t\t\texecuteActionWithIdentifier={executeActionWithIdentifier}\n\t\t\t\t\t\t\t\t\t\t\tprevMousePositionRef={prevMousePositionRef}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase \"emptyState\":\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<QuickActionsEmptyState\n\t\t\t\t\t\t\t\t\t\t\ttitle={getEmptyStateTitle(item.categoryType, emptySearchTerm)}\n\t\t\t\t\t\t\t\t\t\t\theaderTitle={getEmptyStateHeaderTitle(showActiveCategoryTag, teamName, emptySearchTerm)}\n\t\t\t\t\t\t\t\t\t\t\ticon={getEmptyStateIcon(item.categoryType, emptySearchTerm)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tassertNever(item)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t</VirtualList>\n\t\t\t\t)}\n\t\t\t</CustomModal>\n\t\t</DarkOnDarkThemeOverride>\n\t)\n}\n\n/**\n * Some app actions want to set a quick actions category, but that's only possible from within the\n * modal.\n */\nfunction getCategoryForAppAction(appAction: AppAction | undefined): QuickActionsCategoryTypeWithoutOptions | undefined {\n\tswitch (appAction) {\n\t\tcase \"filterLocalizationByScope\":\n\t\t\treturn QuickActionsCategoryType.LocaleScopeFilter\n\t\tcase \"filterLocalizationByStatus\":\n\t\t\treturn QuickActionsCategoryType.LocaleStatusFilter\n\t\tcase \"importCollection\":\n\t\t\treturn QuickActionsCategoryType.Plugins\n\t}\n}\n\nfunction getActiveCategoryName(activeCategory: QuickActionsCategory, teamName: string) {\n\tswitch (activeCategory.type) {\n\t\tcase QuickActionsCategoryType.CodeImport:\n\t\t\treturn \"Import\"\n\t\tcase QuickActionsCategoryType.TeamLibrary:\n\t\t\treturn teamName\n\t\tcase QuickActionsCategoryType.WorkspacePlugins:\n\t\t\treturn teamName\n\t\tcase QuickActionsCategoryType.AssetStyles: {\n\t\t\tconst assetNode = engine.tree.get<AssetStyleNode>(activeCategory.activeItemId)\n\t\t\tif (!assetNode) return Dictionary.Unknown\n\t\t\treturn getAssetStyleQuickActionsName(assetNode)\n\t\t}\n\t\tcase QuickActionsCategoryType.Components:\n\t\t\treturn activeCategory.activeComponent.name\n\t\tcase QuickActionsCategoryType.FindNodes:\n\t\t\treturn activeCategory.options.title\n\t\tcase QuickActionsCategoryType.LocaleScopeFilter:\n\t\tcase QuickActionsCategoryType.LocaleStatusFilter:\n\t\t\treturn \"Filter\"\n\t\tcase QuickActionsCategoryType.CollectionPageItem:\n\t\t\treturn Dictionary.Item\n\t\tcase QuickActionsCategoryType.Plugins:\n\t\tcase QuickActionsCategoryType.ManagedCollectionPlugins:\n\t\t\treturn Dictionary.Plugins\n\t\tcase QuickActionsCategoryType.Default:\n\t\t\treturn Dictionary.Default\n\t\tdefault:\n\t\t\tassertNever(activeCategory, \"Category name must be defined\")\n\t}\n}\n\nfunction getInputPlaceholder(activeCategory: QuickActionsCategory, isEmptyState: boolean, loading: boolean) {\n\tconst { type: categoryType } = activeCategory\n\n\tif (categoryType === QuickActionsCategoryType.LocaleScopeFilter) {\n\t\treturn `Search for ${Dictionary.Page.toLowerCase()}, ${Dictionary.Component.toLowerCase()}, or ${Dictionary.Collection.toLowerCase()}\u2026`\n\t}\n\tif (categoryType === QuickActionsCategoryType.LocaleStatusFilter) {\n\t\treturn \"Search statuses\u2026\"\n\t}\n\tif (categoryType === QuickActionsCategoryType.CollectionPageItem) {\n\t\treturn \"Search items\u2026\"\n\t}\n\tif (categoryType === QuickActionsCategoryType.FindNodes) {\n\t\tif (loading) return Dictionary.LoadingEllipsis\n\t\tif (isEmptyState) return getFindNodesEmptyResultMessage(activeCategory.options)\n\t\treturn \"Search layers\u2026\"\n\t}\n\tif (categoryType === QuickActionsCategoryType.CodeImport) {\n\t\treturn \"Search components\u2026\"\n\t}\n\tif (categoryType === QuickActionsCategoryType.TeamLibrary) {\n\t\tif (loading) return Dictionary.LoadingEllipsis\n\t\tif (isEmptyState) return \"Your Workspace Library is empty.\"\n\t\treturn \"Search components\u2026\"\n\t}\n\tif (categoryType === QuickActionsCategoryType.AssetStyles || categoryType === QuickActionsCategoryType.Components) {\n\t\treturn \"Search actions\u2026\"\n\t}\n\tif (\n\t\tcategoryType === QuickActionsCategoryType.Plugins ||\n\t\tcategoryType === QuickActionsCategoryType.ManagedCollectionPlugins ||\n\t\tcategoryType === QuickActionsCategoryType.WorkspacePlugins\n\t) {\n\t\treturn \"Search Plugins\u2026\"\n\t}\n\n\treturn Dictionary.SearchEllipsis\n}\n\nfunction getEmptyStateTitle(category: QuickActionsCategoryType, emptySearchTerm: boolean) {\n\tif (!emptySearchTerm) return Dictionary.NoSearchResults\n\tif (category === QuickActionsCategoryType.WorkspacePlugins) return \"No Plugins\"\n\treturn \"No Results Found\"\n}\n\nfunction getEmptyStateHeaderTitle(\n\tshowActiveCategoryTag: boolean | undefined,\n\tteamName: string,\n\temptySearchTerm: boolean,\n): string | undefined {\n\tif (showActiveCategoryTag) return teamName\n\tif (!emptySearchTerm) return \"Search\"\n\treturn undefined\n}\n\nfunction getNextItemIdentifier({\n\tselectedIdentifier,\n\tdirection,\n\tloop,\n\tfilteredVirtualListItems,\n}: {\n\tselectedIdentifier: string | undefined\n\tdirection: \"down\" | \"up\"\n\tloop: boolean\n\tfilteredVirtualListItems: readonly QuickActionsVirtualListItem[]\n}): string | undefined {\n\tconst firstSelectableItemIndex = filteredVirtualListItems.findIndex(isSelectableQuickActionItem)\n\tconst firstSelectableItem = filteredVirtualListItems[firstSelectableItemIndex]\n\tif (!firstSelectableItem) return\n\tassert(isSelectableQuickActionItem(firstSelectableItem))\n\n\tif (!selectedIdentifier) {\n\t\treturn firstSelectableItem.identifier\n\t}\n\n\tconst currentIndex = filteredVirtualListItems.findIndex(item => {\n\t\treturn isSelectableQuickActionItem(item) && item.identifier === selectedIdentifier\n\t})\n\n\tif (currentIndex === -1) {\n\t\treturn firstSelectableItem.identifier\n\t}\n\n\tconst lastSelectableItemIndex = filteredVirtualListItems.findLastIndex(isSelectableQuickActionItem)\n\tconst lastSelectableItem = filteredVirtualListItems[lastSelectableItemIndex]\n\tassert(isSelectableQuickActionItem(lastSelectableItem))\n\tif (firstSelectableItem === lastSelectableItem) {\n\t\treturn firstSelectableItem.identifier\n\t}\n\n\tconst increment = direction === \"down\" ? 1 : -1\n\n\tfor (\n\t\tlet index = currentIndex;\n\t\tindex >= firstSelectableItemIndex && index <= lastSelectableItemIndex;\n\t\tindex += increment\n\t) {\n\t\tif (index === currentIndex) continue\n\n\t\tconst item = filteredVirtualListItems[index]\n\t\tif (!isSelectableQuickActionItem(item)) continue\n\n\t\treturn item.identifier\n\t}\n\n\tif (!loop) return\n\n\tconst nextItem = direction === \"down\" ? firstSelectableItem : lastSelectableItem\n\treturn nextItem.identifier\n}\n\nfunction setupAndOpenQuickActionsDevPlugin(\n\tvekterEngine: VekterEngine,\n\tactiveCategory?: QuickActionsCategory,\n\tinitialCategory?: QuickActionsCategory,\n\tinitialState?: InitialState,\n): void {\n\tgetDefaultDevelopmentPluginManifest(vekterEngine, \"quick_actions\", manifest =>\n\t\topenPluginAndCreateManagedCollectionIfNeeded(manifest, activeCategory, initialCategory, initialState),\n\t)\n}\n\nexport function toggleQuickActionsDevPlugin(vekterEngine: VekterEngine, initialState?: InitialState): void {\n\tconst { pluginStore } = vekterEngine.stores\n\n\tif (pluginStore.isLoading) return\n\n\tconst activePlugin = pluginStore.activePlugin\n\n\tif (!activePlugin) {\n\t\tsetupAndOpenQuickActionsDevPlugin(vekterEngine, { type: QuickActionsCategoryType.Plugins }, undefined, initialState)\n\t\treturn\n\t}\n\tswitch (activePlugin.manifest.type) {\n\t\tcase \"api\":\n\t\t\treturn\n\t\tcase \"hosted\": {\n\t\t\tconst isDevelopmentPlugin = isPluginDevelopmentUrl(activePlugin.manifest.entrypointUrl)\n\t\t\tif (!isDevelopmentPlugin) return\n\t\t\tpluginStore.closePlugin(activePlugin.manifestId)\n\t\t\treturn\n\t\t}\n\t\tdefault: {\n\t\t\tassertNever(activePlugin.manifest)\n\t\t}\n\t}\n}\n\nfunction getResultContainerHeightStyle(modalIsDocked: boolean, isContentManagementView: boolean) {\n\tif (modalIsDocked) {\n\t\treturn isContentManagementView\n\t\t\t? styles.actionResultContainerContentManagementFixedHeight\n\t\t\t: styles.actionResultContainerFixedHeight\n\t}\n\treturn isContentManagementView\n\t\t? styles.actionResultContainerContentManagementDynamicHeight\n\t\t: styles.actionResultContainerDynamicHeight\n}\n\nfunction getFindNodesEmptyResultMessage(options: FindNodesOptions) {\n\tconst { type } = options\n\n\tswitch (type) {\n\t\tcase FindNodesType.StylePreset:\n\t\t\treturn \"No layers are using this style.\"\n\t\tcase FindNodesType.ComponentPreset:\n\t\t\treturn \"No layers are using this component.\"\n\t\tcase FindNodesType.ColorStyleToken:\n\t\t\treturn \"No layers are using this color.\"\n\t\tcase FindNodesType.CodeComponent:\n\t\t\treturn \"No layers are using this component.\"\n\t\tcase FindNodesType.CodeFile:\n\t\t\treturn \"No layers are using this code file.\"\n\t\tcase FindNodesType.VectorSet:\n\t\t\treturn \"No layers are using this vector set.\"\n\t\tdefault:\n\t\t\tassertNever(type, \"Category name must be defined\")\n\t}\n}\n", "import { ProjectLicenseType, TeamLicenseType, openNewTab } from \"@framerjs/app-shared\"\nimport { UpsellType } from \"@framerjs/events\"\nimport { Button, Stack, Translatable as T } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { assertNever, unhandledError } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { getActionAccelerator } from \"app/AppAccelerators.ts\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { Experiment, experiments, useExperimentIsOn } from \"app/experiments.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { ActiveModal } from \"document/stores/ModalStore.ts\"\nimport { SiteSettingsTabNames } from \"document/stores/SiteSettingsStore.ts\"\nimport { Tools } from \"document/stores/ToolEnum.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport React, { useCallback, useLayoutEffect, type ComponentProps } from \"react\"\nimport { appPointerEvents } from \"utils/appPointerEvents.styles.ts\"\nimport { contactSupportURL } from \"utils/staticURLs.ts\"\nimport { isBoolean, isNullish } from \"utils/typeChecks.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { Pages, UIInteraction, UpsellPages, UpsellUIInteraction, record } from \"web/lib/tracker.ts\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport { usePurchaseOriginLocalStorage } from \"web/lib/usePurchaseOriginLocalStorage.ts\"\nimport { getAcceleratorTokens } from \"web/pages/project/lib/getAcceleratorLabel.ts\"\nimport { useIsViewOnly } from \"web/pages/project/permissions/useIsViewOnly.ts\"\nimport { contactSupport, hideIntercom } from \"web/pages/projects/lib/contactSupport.ts\"\nimport { ToolbarItem } from \"../projectbar/ToolbarItem.tsx\"\nimport { CanvasLocaleToolbarItem } from \"./CanvasLocaleToolbarItem.tsx\"\nimport * as styles from \"./FloatingToolbar.styles.ts\"\nimport { ToolbarZoomMenu } from \"./ToolbarZoomMenu.tsx\"\nimport { IconComment } from \"./icons/IconComment.tsx\"\nimport { IconCommentAgent } from \"./icons/IconCommentAgent.tsx\"\nimport { IconContactSupport } from \"./icons/IconContactSupport.tsx\"\nimport { IconHand } from \"./icons/IconHand.tsx\"\nimport { IconHandAgent } from \"./icons/IconHandAgent.tsx\"\nimport { IconMoon } from \"./icons/IconMoon.tsx\"\nimport { IconPlugins } from \"./icons/IconPlugins.tsx\"\nimport { IconPointer } from \"./icons/IconPointer.tsx\"\nimport { IconPointerAgent } from \"./icons/IconPointerAgent.tsx\"\nimport { IconSun } from \"./icons/IconSun.tsx\"\nimport { IconThemeAgent } from \"./icons/IconThemeAgent.tsx\"\n\nfunction useSitesUpsellButton(isViewOnly: boolean) {\n\tconst { isDraft, project } = engine.stores.projectStore.useState(state => ({\n\t\tisDraft: state.isDraft,\n\t\tproject: state.project,\n\t}))\n\n\tconst isEnterpriseTeam = project?.teamLicenseType === TeamLicenseType.EnterprisePlan\n\tconst isFreePlanSite = project?.license.type === ProjectLicenseType.FreeSite\n\tconst isFreeSiteInEnterpriseTeam = isEnterpriseTeam && isFreePlanSite\n\n\treturn {\n\t\tupsellButtonVisible: !isViewOnly && !isDraft && isFreePlanSite,\n\t\tisFreeSiteInEnterpriseTeam,\n\t}\n}\n\nexport const FloatingToolbar = React.memo(function FloatingToolbar() {\n\tconst { isDarkMode, setDarkMode } = useDarkMode()\n\tconst { updatePurchaseOrigin } = usePurchaseOriginLocalStorage()\n\n\tconst {\n\t\tmodalStore,\n\t\ttoolStore,\n\t\tfeedbackStore,\n\t\tchromeStore,\n\t\tprojectStore,\n\t\tsiteSettingsStore,\n\t\tselectionStore,\n\t\tsessionStore,\n\t} = engine.stores\n\n\tconst activeModal = modalStore.useState(state => state.active)\n\tconst { tool } = toolStore.useState()\n\tconst { hideFloatingBar, mainView, isPreviewingFeaturedTemplate, overlay, isIntercomMessengerVisible } =\n\t\tchromeStore.useState(state => ({\n\t\t\thideFloatingBar: (state.isTutorialActive && !state.hasTutorialPlayed) || state.overlay?.type === \"collectionItem\",\n\t\t\tmainView: state.mainView,\n\t\t\tisViewOnly: state.isViewOnly,\n\t\t\tisPreviewingFeaturedTemplate: state.isPreviewingFeaturedTemplate,\n\t\t\toverlay: state.overlay,\n\t\t\tisIntercomMessengerVisible: state.isIntercomMessengerVisible,\n\t\t}))\n\n\tconst { activeLocale, hasLocales, hasUnreadFeedback } = useDeprecatedEngineState(\n\t\t[EngineChange.Tree, chromeStore, feedbackStore],\n\t\t() => {\n\t\t\tconst localeId = chromeStore.canvasLocaleId\n\t\t\tconst root = engine.tree.root\n\t\t\tconst hasUnreadFeedback = feedbackStore.hasUnreadFeedback\n\n\t\t\treturn {\n\t\t\t\tactiveLocale: root.getLocale(localeId),\n\t\t\t\thasLocales: Boolean(root.locales && root.locales.length > 0),\n\t\t\t\thasUnreadFeedback,\n\t\t\t}\n\t\t},\n\t)\n\n\tconst isViewOnly = useIsViewOnly(\"canDesign\")\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\n\tconst isCollectionItemOverlayActive = overlay?.type === \"collectionItem\"\n\n\tconst { upsellButtonVisible, isFreeSiteInEnterpriseTeam } = useSitesUpsellButton(isViewOnly)\n\n\tconst isLocaleVisible =\n\t\thasLocales && (mainView === ActiveMainView.Canvas || mainView === ActiveMainView.Localizations)\n\n\tconst openCheckoutPage = useCallback(() => {\n\t\tconst project = projectStore.project\n\n\t\tif (project) {\n\t\t\tupdatePurchaseOrigin(\n\t\t\t\tUpsellType.floatingToolbarSitesUpsell,\n\t\t\t\t{ projectId: project.id, site: project.license.type, team: project.teamLicenseType },\n\t\t\t\tnull,\n\t\t\t)\n\t\t}\n\n\t\trecord(\"ui_interaction\", {\n\t\t\tpage: UpsellPages.floatingToolbarSitesUpsell,\n\t\t\tid: UpsellUIInteraction.confirmInAppUpsell,\n\t\t})\n\t\tsiteSettingsStore.setActiveTab({ tab: SiteSettingsTabNames.plans }).catch(unhandledError)\n\t}, [updatePurchaseOrigin])\n\n\tconst freeSiteInEnterpriseTeamWarning = useCallback(() => {\n\t\ttoast({\n\t\t\ttype: \"add\",\n\t\t\tkey: \"enterprise-free-site-warning\",\n\t\t\tvariant: \"warning\",\n\t\t\ticon: \"notifications\",\n\t\t\tduration: 5000,\n\t\t\tprimaryText: \"Project must be moved\",\n\t\t\tsecondaryText: \"to enterprise account.\",\n\t\t\taction: { title: Dictionary.ContactUs, onClick: () => openNewTab(contactSupportURL) },\n\t\t})\n\t}, [])\n\n\tconst isHidden =\n\t\t// Hide the toolbar until we know whether the user is previewing a template or not\n\t\t// This prevents the user from seeing a jump in hiding/showing the commenting tool which would happen if we\n\t\t// default this property to the wrong value\n\t\tisPreviewingFeaturedTemplate === undefined ||\n\t\tchromeStore.displayMinimalUI ||\n\t\thideFloatingBar ||\n\t\t!shouldDisplayFloatingToolbar(mainView)\n\n\tconst setTool = useEngineCallback(\n\t\t(newTool: Tools) => {\n\t\t\tif (tool === newTool) return engine.setTool(Tools.Highlight)\n\t\t\tif (newTool === Tools.Path) selectionStore.clear()\n\n\t\t\tengine.setTool(newTool)\n\t\t},\n\t\t[tool, selectionStore.clear],\n\t)\n\n\tconst toggleDarkMode = useEngineCallback(() => {\n\t\tsetDarkMode(!isDarkMode)\n\t}, [isDarkMode, setDarkMode])\n\n\tconst toggleContactSupport = useCallback(() => {\n\t\tif (isIntercomMessengerVisible) {\n\t\t\trecord(\"ui_interaction\", {\n\t\t\t\tpage: Pages.floatingToolbar,\n\t\t\t\tid: UIInteraction.hideIntercomMessenger,\n\t\t\t})\n\t\t\thideIntercom()\n\t\t} else {\n\t\t\trecord(\"ui_interaction\", {\n\t\t\t\tpage: Pages.floatingToolbar,\n\t\t\t\tid: UIInteraction.openIntercomMessenger,\n\t\t\t})\n\t\t\tcontactSupport(\n\t\t\t\t{\n\t\t\t\t\tuserId: sessionStore.user.id,\n\t\t\t\t\tuserEmail: sessionStore.user.email,\n\t\t\t\t\tuserIntercomHash: sessionStore.user.intercomUserHash,\n\t\t\t\t},\n\t\t\t\tchromeStore,\n\t\t\t)\n\t\t}\n\t}, [isIntercomMessengerVisible])\n\n\tconst quickActionsModalIsOpen = activeModal.type === ModalType.QuickActions\n\tif (isHidden) return null\n\n\tconst isCommentToolSelected = tool === Tools.Comment && !quickActionsModalIsOpen\n\n\treturn (\n\t\t<MeasuredToolbarWrapper activeModal={activeModal}>\n\t\t\t<ToolbarItem\n\t\t\t\ttool={Tools.Highlight}\n\t\t\t\ticon={agentExperimentEnabled ? IconPointerAgent : IconPointer}\n\t\t\t\ttitle={Dictionary.Select}\n\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\tselected={pointerActive(tool) && !quickActionsModalIsOpen}\n\t\t\t\tonClick={setTool}\n\t\t\t\tenabled\n\t\t\t\ticonOnly\n\t\t\t/>\n\t\t\t<ToolbarItem\n\t\t\t\ttool={Tools.Pan}\n\t\t\t\ticon={agentExperimentEnabled ? IconHandAgent : IconHand}\n\t\t\t\ttitle=\"Pan\"\n\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\tselected={tool === Tools.Pan && !quickActionsModalIsOpen}\n\t\t\t\tonClick={setTool}\n\t\t\t\tenabled\n\t\t\t\ticonOnly\n\t\t\t/>\n\t\t\t{!isPreviewingFeaturedTemplate && (\n\t\t\t\t<ToolbarItem\n\t\t\t\t\ttool={Tools.Comment}\n\t\t\t\t\ticon={\n\t\t\t\t\t\tagentExperimentEnabled ? (\n\t\t\t\t\t\t\t<IconCommentAgent unread={hasUnreadFeedback} selected={isCommentToolSelected} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IconComment unread={hasUnreadFeedback} selected={isCommentToolSelected} />\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\ttitle=\"Comment\"\n\t\t\t\t\ttooltipShortcut={shortcutForAction(\"toolComment\")}\n\t\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\t\tselected={isCommentToolSelected}\n\t\t\t\t\tonClick={setTool}\n\t\t\t\t\tenabled\n\t\t\t\t\ticonOnly\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<ToolbarItem\n\t\t\t\ticon={agentExperimentEnabled ? <IconThemeAgent /> : isDarkMode ? <IconSun /> : <IconMoon />}\n\t\t\t\ttitle=\"Theme\"\n\t\t\t\ttooltipShortcut={shortcutForAction(\"toggleAppearance\")}\n\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\tselected={false}\n\t\t\t\tonClick={toggleDarkMode}\n\t\t\t\tenabled\n\t\t\t\ticonOnly\n\t\t\t/>\n\t\t\t<Experiment isNotOn=\"agent\">\n\t\t\t\t{projectStore.projectLicenseType !== ProjectLicenseType.FreeSite && (\n\t\t\t\t\t<ToolbarItem\n\t\t\t\t\t\ticon={<IconContactSupport />}\n\t\t\t\t\t\ttitle=\"Contact Support\"\n\t\t\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\t\t\tselected={isIntercomMessengerVisible}\n\t\t\t\t\t\tonClick={toggleContactSupport}\n\t\t\t\t\t\tenabled\n\t\t\t\t\t\ticonOnly\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<ToolbarItem\n\t\t\t\t\ttitle={Dictionary.Plugins}\n\t\t\t\t\ticon={IconPlugins}\n\t\t\t\t\ttooltipShortcut={shortcutForAction(\"quickActions\")}\n\t\t\t\t\ttooltipDirection=\"bottom\"\n\t\t\t\t\tselected={quickActionsModalIsOpen}\n\t\t\t\t\tonClick={toggleQuickActions}\n\t\t\t\t\tenabled={!isCollectionItemOverlayActive}\n\t\t\t\t\ticonOnly\n\t\t\t\t/>\n\t\t\t</Experiment>\n\t\t\t{isLocaleVisible && <CanvasLocaleToolbarItem mainView={mainView} activeLocale={activeLocale} />}\n\t\t\t<ToolbarZoomMenu />\n\t\t\t{upsellButtonVisible && (\n\t\t\t\t<>\n\t\t\t\t\t<div className={styles.divider} />\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tclassName={styles.tintedButton}\n\t\t\t\t\t\tonClick={isFreeSiteInEnterpriseTeam ? freeSiteInEnterpriseTeamWarning : openCheckoutPage}\n\t\t\t\t\t>\n\t\t\t\t\t\t<T>Upgrade Now</T>\n\t\t\t\t\t</Button>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</MeasuredToolbarWrapper>\n\t)\n})\n\nfunction isReactChildRendered(child: React.ReactNode): boolean {\n\tif (isNullish(child)) return false\n\tif (isBoolean(child)) return false\n\tif (!React.isValidElement(child)) return false\n\tif (child.type === Experiment) {\n\t\tconst props = child.props as ComponentProps<typeof Experiment>\n\t\tif (\"isOn\" in props) {\n\t\t\treturn experiments.isOn(props.isOn)\n\t\t} else if (\"isNotOn\" in props) {\n\t\t\treturn !experiments.isOn(props.isNotOn)\n\t\t}\n\t}\n\treturn true\n}\n\n// We don't just count the amount of children that are visibly rendered because in that case if two\n// items with different visibility both swap visibility at the same time the toolbar will not\n// re-measure.\nfunction getReactChildVisibilityHash(children: React.ReactNode): string {\n\treturn (\n\t\tReact.Children.map(children, child => {\n\t\t\treturn isReactChildRendered(child) ? \"1\" : \"0\"\n\t\t})?.join(\"\") ?? \"\"\n\t)\n}\n\nfunction MeasuredToolbarWrapper({ activeModal, children }: { activeModal: ActiveModal; children: React.ReactNode }) {\n\tconst ref = React.useRef<HTMLDivElement>(null)\n\n\tconst childVisibilityHash = getReactChildVisibilityHash(children)\n\tconst quickActionsModalIsOpen = activeModal.type === ModalType.QuickActions\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: We want to measure the width of the toolbar when items are added or removed\n\tuseLayoutEffect(() => {\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tif (!ref.current) return\n\t\t\tengine.stores.chromeStore.floatingToolbarWidth = ref.current.offsetWidth\n\t\t})\n\t}, [childVisibilityHash])\n\n\treturn (\n\t\t<Stack\n\t\t\tref={ref}\n\t\t\tdirection=\"row\"\n\t\t\tgap={dimensions.css.inputSpacing}\n\t\t\tpadding={dimensions.css.floatingToolbarPadding}\n\t\t\tclassName={cx(\n\t\t\t\tstyles.floatingBar,\n\t\t\t\tquickActionsModalIsOpen && styles.floatingBarInFrontOfQuickActions,\n\t\t\t\tappPointerEvents,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</Stack>\n\t)\n}\n\nconst toggleQuickActions = engine.scheduler.wrapHandler(() => {\n\tconst activeModal = engine.stores.modalStore.active\n\tif (activeModal.type === ModalType.QuickActions) {\n\t\tengine.stores.modalStore.dismiss()\n\t} else {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.QuickActions,\n\t\t\tsource: \"toolbar\",\n\t\t})\n\t}\n})\n\nfunction pointerActive(tool: Tools): boolean {\n\tswitch (tool) {\n\t\tcase Tools.Highlight:\n\t\tcase Tools.DirectSelect:\n\t\tcase Tools.Select:\n\t\tcase Tools.Zoom:\n\t\tcase Tools.ZoomSelect:\n\t\tcase Tools.Move:\n\t\tcase Tools.Chat:\n\t\tcase Tools.Resize:\n\t\tcase Tools.Scale:\n\t\tcase Tools.Rotate:\n\t\tcase Tools.Unknown:\n\t\tcase Tools.LineAnchorMove:\n\t\tcase Tools.Padding:\n\t\tcase Tools.Gap:\n\t\tcase Tools.SampleColor:\n\t\tcase Tools.Radius:\n\t\tcase Tools.FillGradient:\n\t\tcase Tools.MaskGradient:\n\t\tcase Tools.SlotConnect:\n\t\tcase Tools.Link:\n\t\tcase Tools.Guide:\n\t\tcase Tools.ViewportResize:\n\t\tcase Tools.HighlightStackItem:\n\t\t\treturn true\n\n\t\tcase Tools.AgentPanel:\n\t\tcase Tools.AgentDragSelect:\n\t\tcase Tools.AgentSelect:\n\t\tcase Tools.Comment:\n\t\tcase Tools.Pan:\n\t\tcase Tools.CollectionReferenceVariableEdit:\n\t\tcase Tools.CreateFrame:\n\t\tcase Tools.CreateRounded:\n\t\tcase Tools.CreateImage:\n\t\tcase Tools.CreateVideo:\n\t\tcase Tools.CreateScreen:\n\t\tcase Tools.CreateText:\n\t\tcase Tools.CreateOvalShape:\n\t\tcase Tools.CreateRectangleShape:\n\t\tcase Tools.CreatePolygonShape:\n\t\tcase Tools.CreateStarShape:\n\t\tcase Tools.CreateStack:\n\t\tcase Tools.CreateRows:\n\t\tcase Tools.CreateColumns:\n\t\tcase Tools.CreateGrid:\n\t\tcase Tools.CreateGridRow:\n\t\tcase Tools.CreateGridSpan:\n\t\tcase Tools.CreateMasonry:\n\t\tcase Tools.TextEdit:\n\t\tcase Tools.RichTextEdit:\n\t\tcase Tools.RichTextVariableEdit:\n\t\tcase Tools.StringVariableEdit:\n\t\tcase Tools.DateVariableEdit:\n\t\tcase Tools.EnumVariableEdit:\n\t\tcase Tools.Path:\n\t\tcase Tools.LoadingShield:\n\t\t\treturn false\n\n\t\tdefault:\n\t\t\tassertNever(tool)\n\t}\n}\n\nexport function shouldDisplayFloatingToolbar(mainView: ActiveMainView): boolean {\n\tswitch (mainView) {\n\t\tcase ActiveMainView.Canvas:\n\t\t\treturn true\n\t\tcase ActiveMainView.Localizations:\n\t\tcase ActiveMainView.ContentManagement:\n\t\tcase ActiveMainView.CodeEditor:\n\t\tcase ActiveMainView.SiteSettings:\n\t\tcase ActiveMainView.Preview:\n\t\tcase ActiveMainView.Analytics:\n\t\t\treturn false\n\t\tdefault:\n\t\t\tassertNever(mainView, \"Unknown main view\")\n\t}\n}\n\nfunction shortcutForAction(action: AppAction): string | undefined {\n\tconst accelerator = getActionAccelerator(action)\n\tif (!accelerator) return undefined\n\treturn getAcceleratorTokens(accelerator).join(\"\")\n}\n", "import { syntheticClickHandlerForMouseDown, usePrefersMouseDown } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { Stack, Translatable as T } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport type { Tools } from \"document/stores/ToolEnum.ts\"\nimport React from \"react\"\nimport { isFunction } from \"utils/typeChecks.ts\"\nimport * as styles from \"./ToolbarItem.styles.ts\"\nimport { ToolbarTooltip, getNativeToolbarTooltipText, useToolbarTooltipVariant } from \"./ToolbarTooltip.tsx\"\n\ninterface Props {\n\ttitle: string\n\ticon: React.FunctionComponent | JSX.Element\n\tselected: boolean\n\tonClick?: (tool: Tools | undefined, event: React.MouseEvent) => void\n\tonMouseDown?: (tool: Tools | undefined, event: React.MouseEvent) => void\n\tenabled: boolean\n\ttool?: Tools\n\ticonOnly?: boolean\n\tid?: string\n\tclassName?: string\n\ttooltip?: string\n\ttooltipShortcut?: string\n\ttooltipDirection?: \"top\" | \"left\" | \"bottom\" | \"right\"\n\ttooltipVariant?: \"default\" | \"toolbar\"\n\tshowIndicatorDot?: boolean\n}\n\nexport const ToolbarItem = React.memo(\n\tReact.forwardRef(function ToolbarItem(\n\t\t{\n\t\t\ttitle,\n\t\t\ticon: Icon,\n\t\t\tselected,\n\t\t\tonClick,\n\t\t\tonMouseDown,\n\t\t\tenabled,\n\t\t\ttool,\n\t\t\ticonOnly = false,\n\t\t\tid,\n\t\t\tclassName,\n\t\t\ttooltip,\n\t\t\ttooltipShortcut,\n\t\t\ttooltipDirection,\n\t\t\ttooltipVariant,\n\t\t\tshowIndicatorDot = false,\n\t\t}: Props,\n\t\tforwardedRef: React.Ref<HTMLDivElement>,\n\t) {\n\t\tconst resolvedTooltipVariant = useToolbarTooltipVariant(tooltipVariant)\n\t\tconst shouldUseToolbarTooltip = resolvedTooltipVariant === \"toolbar\"\n\t\tconst preferMouseDown = usePrefersMouseDown()\n\t\t// if`onMouseDown` is defined, use `onMouseDown`, else use `onClick`; if `preferMouseDown` is true, then we use `onClick` only if no `onMouseDown` is passed...\n\t\tconst mouseDownHandler = onMouseDown || onClick\n\t\tconst tooltipText = tooltip || title\n\t\tconst nativeTooltipText = getNativeToolbarTooltipText(tooltipText, tooltipShortcut)\n\n\t\tconst button = (\n\t\t\t// We use div instead of button to prevent keeping focus on button after click,\n\t\t\t// so that global keyboard shortcuts don't interfere with the button shortcuts like Space\n\t\t\t// eslint-disable-next-line jsx-a11y/interactive-supports-focus,jsx-a11y/click-events-have-key-events\n\t\t\t// biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: keeping focus behavior unchanged for toolbar shortcuts\n\t\t\t// biome-ignore lint/a11y/useFocusableInteractive: keeping focus behavior unchanged for toolbar shortcuts\n\t\t\t// biome-ignore lint/a11y/useKeyWithClickEvents: pointer-driven toolbar control\n\t\t\t// biome-ignore lint/a11y/useSemanticElements: div role button is intentional for toolbar shortcut behavior\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\tonMouseDown={enabled && (preferMouseDown || onMouseDown) ? e => mouseDownHandler?.(tool, e) : undefined}\n\t\t\t\t// ... this is needed to not break logic where both `onMouseDown` and `onClick` are passed\n\t\t\t\tonClick={\n\t\t\t\t\tenabled && (!preferMouseDown || onMouseDown)\n\t\t\t\t\t\t? e => onClick?.(tool, e)\n\t\t\t\t\t\t: syntheticClickHandlerForMouseDown(e => onClick?.(tool, e))\n\t\t\t\t}\n\t\t\t\tclassName={cx(\n\t\t\t\t\tstyles.container,\n\t\t\t\t\tselected && styles.buttonSelected,\n\t\t\t\t\tenabled ? styles.enabled : styles.disabled,\n\t\t\t\t\ticonOnly && styles.iconOnlyButton,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tid={id}\n\t\t\t\ttitle={shouldUseToolbarTooltip ? undefined : nativeTooltipText}\n\t\t\t\tref={forwardedRef}\n\t\t\t\taria-label={shouldUseToolbarTooltip ? tooltipText : undefined}\n\t\t\t>\n\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" gap={8}>\n\t\t\t\t\t{isFunction(Icon) ? <Icon /> : Icon}\n\t\t\t\t\t{!iconOnly && <T>{title}</T>}\n\t\t\t\t</Stack>\n\t\t\t\t{showIndicatorDot && (\n\t\t\t\t\t<div className={styles.indicatorDot} aria-hidden={true} data-testid=\"toolbar-item-indicator-dot\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\n\t\treturn (\n\t\t\t<ToolbarTooltip\n\t\t\t\tenabled={shouldUseToolbarTooltip}\n\t\t\t\ttext={tooltipText}\n\t\t\t\tshortcut={tooltipShortcut}\n\t\t\t\tdirection={tooltipDirection}\n\t\t\t>\n\t\t\t\t{button}\n\t\t\t</ToolbarTooltip>\n\t\t)\n\t}),\n)\n", "import \"ToolbarItem.styles_1akbe0c.wyw.css\"; export const enabled = \"enabled_e1b164do\";\nexport const disabled = \"disabled_dqjgxy5\";\nexport const container = \"container_c1mhlhgs\";\nexport const iconOnlyButton = \"iconOnlyButton_iucnbqk\";\nexport const buttonSelected = \"buttonSelected_bq3ttmp\";\nexport const indicatorDot = \"indicatorDot_i1o77rkk\";", "import { CenterChild } from \"@framerjs/fresco\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { getSelectedCollectionItem } from \"document/components/utils/collectionItemUtils.ts\"\nimport engine from \"document/engine.ts\"\nimport { isCollectionItemNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { Locale, LocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { memo } from \"react\"\nimport { LocaleFlag } from \"utils/LocaleFlag.tsx\"\nimport { getNameForDefaultLocale } from \"../localization/getNameForDefaultLocale.ts\"\nimport { getIncludedLocales } from \"../localization/includedLocales.ts\"\nimport { ToolbarItem } from \"../projectbar/ToolbarItem.tsx\"\nimport { floatingToolbarMenuGutter, getMenuPositionAndBoundsForToolbarItem } from \"./getMenuBoundsForToolbarItem.ts\"\n\nexport function getIncludedLocaleIds(activeLocale: Locale): LocaleId[] {\n\tconst locales = engine.tree.root.locales || []\n\tconst allLocaleIds = [defaultLocaleId, ...locales.map(locale => locale.id)]\n\n\tconst activeScope = engine.stores.scopeStore.active\n\tif (!isWebPageNode(activeScope)) return allLocaleIds\n\n\tconst selectedItem = getSelectedCollectionItem(\n\t\tengine.tree,\n\t\tengine.componentLoader,\n\t\tactiveScope.dataIdentifier,\n\t\tengine.stores.scopeStore.getSelectedCollectionItemForWebPage(activeScope),\n\t\tactiveLocale?.id,\n\t)\n\tif (!selectedItem) return allLocaleIds\n\n\tconst selectedItemNode = engine.tree.getNodeWithTrait(selectedItem.id, isCollectionItemNode)\n\treturn getIncludedLocales(engine.tree, selectedItemNode) ?? allLocaleIds\n}\n\n/**\n * Show menu options to switch between locales. If viewing a detail page,\n * disable locales that page is hidden in.\n */\nfunction getLocaleMenuOptions(activeLocale: Locale): MenuItemOptions[] {\n\tconst locales = engine.tree.root.locales || []\n\tconst includedLocaleIds = getIncludedLocaleIds(activeLocale)\n\n\tconst options: MenuItemOptions[] = [\n\t\t{\n\t\t\tlabel: getNameForDefaultLocale(engine.tree),\n\t\t\tchecked: activeLocale.id === defaultLocaleId,\n\t\t\t// Enabled is set to true because the default locale can't be set to\n\t\t\t// hidden (for now), so no condition is needed to check that.\n\t\t\tenabled: true,\n\t\t\tclick: () => (engine.stores.chromeStore.canvasLocaleId = defaultLocaleId),\n\t\t},\n\t\t...locales.map((locale): MenuItemOptions => {\n\t\t\tconst enabled = includedLocaleIds.includes(locale.id)\n\n\t\t\treturn {\n\t\t\t\tlabel: enabled ? locale.name : `${locale.name} (Hidden)`,\n\t\t\t\tchecked: activeLocale.id === locale.id,\n\t\t\t\tenabled,\n\t\t\t\tclick: () => (engine.stores.chromeStore.canvasLocaleId = locale.id),\n\t\t\t}\n\t\t}),\n\t]\n\n\tconst enabledOptions = options.filter(option => option.enabled)\n\tconst disabledOptions = options.filter(option => !option.enabled)\n\n\tif (disabledOptions.length === 0) {\n\t\treturn enabledOptions\n\t}\n\n\treturn [...enabledOptions, { type: \"separator\" }, ...disabledOptions]\n}\n\ninterface CanvasLocaleToolbarItemProps {\n\tmainView: ActiveMainView\n\tactiveLocale: Locale\n}\n\nexport const CanvasLocaleToolbarItem = memo(function CanvasLocaleToolbarItem({\n\tmainView,\n\tactiveLocale,\n}: CanvasLocaleToolbarItemProps) {\n\tconst canvasVisible = mainView === ActiveMainView.Canvas\n\tconst localizationVisible = mainView === ActiveMainView.Localizations\n\n\treturn (\n\t\t<ToolbarItem\n\t\t\ticonOnly\n\t\t\tselected\n\t\t\ttitle={activeLocale.name}\n\t\t\ttooltipDirection=\"bottom\"\n\t\t\tenabled={canvasVisible || localizationVisible}\n\t\t\tonMouseDown={(_, event) => {\n\t\t\t\tconst { position } = getMenuPositionAndBoundsForToolbarItem(event, event.currentTarget)\n\n\t\t\t\tconst options = getLocaleMenuOptions(activeLocale)\n\t\t\t\tengine.stores.contextMenuStore.show(options, {\n\t\t\t\t\tlocation: position,\n\t\t\t\t\tplacement: \"top-start\",\n\t\t\t\t\tgutter: floatingToolbarMenuGutter,\n\t\t\t\t})\n\t\t\t}}\n\t\t\ticon={\n\t\t\t\t<CenterChild>\n\t\t\t\t\t<LocaleFlag localeCode={activeLocale.code} />\n\t\t\t\t</CenterChild>\n\t\t\t}\n\t\t/>\n\t)\n})\n", "import { dimensions } from \"@framerjs/fresco/src/tokens\"\nimport engine from \"document/engine.ts\"\nimport type { Point } from \"library/render/types/Point.ts\"\nimport type React from \"react\"\n\nexport const floatingToolbarMenuGutter = dimensions.values.floatingToolbarPadding\n\nexport function getMenuPositionAndBoundsForToolbarItem(\n\tevent: React.MouseEvent,\n\telement: Element | null,\n): { position: Point } {\n\tconst { clientX, clientY } = event\n\n\tif (!element) return { position: { x: clientX, y: clientY } }\n\n\tconst rect = element.getBoundingClientRect()\n\tconst y = window.innerHeight - engine.stores.layoutState.floatingToolbarTop - 1 // Account for the 1px box shadow (border) around the toolbar\n\tconst position: Point = { x: rect.left + dimensions.values.contextMenuOffsetX, y }\n\treturn { position }\n}\n", "import \"FloatingToolbar.styles_1yx7qa2.wyw.css\"; import { cx } from \"@linaria/core\";\nexport const floatingBar = \"floatingBar_fieamjh\";\nexport const floatingBarInFrontOfQuickActions = \"floatingBarInFrontOfQuickActions_f1ld410\";\nexport const divider = \"divider_dms40pa\";\nconst button = \"button_b1900yzy\";\nexport const tintedButton = cx(button, \"tintedButton_t168sm3g\");", "import \"ToolbarZoomMenu.styles_xgy13r.wyw.css\"; export const zoomButton = \"zoomButton_zt1ddm5\";", "import { Events } from \"@framerjs/fresco/layout-transitions\"\nimport { actionLabels } from \"app/ActionLabels.ts\"\nimport { appAccelerators, appAcceleratorsWindows } from \"app/AppAccelerators.ts\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport { createContainer } from \"document/components/utils/createContainer.ts\"\nimport engine from \"document/engine.ts\"\nimport { getBoundingFrameForNodes } from \"document/models/CanvasTree/utils/geometry.ts\"\nimport { Tools } from \"document/stores/ToolEnum.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport React from \"react\"\nimport { floatingToolbarMenuGutter, getMenuPositionAndBoundsForToolbarItem } from \"./getMenuBoundsForToolbarItem.ts\"\n\ninterface Props {\n\tchildren: (info: {\n\t\tref: React.RefObject<HTMLDivElement>\n\t\tzoom: number\n\t\tonMouseDown(event: React.MouseEvent): void\n\t}) => JSX.Element\n}\n\ninterface State {\n\tzoom: number\n\tdisplayRulers: boolean\n\tdisplayGrids: boolean\n\tshowPixelGrid: boolean\n}\n\nclass ZoomMenuContainer extends React.PureComponent<Props, State> {\n\t// Since the zoom value can be changed by live update or interactive/immediate update (via UI),\n\t// we need to subscribe to both CanvasLiveTransform and CanvasZoom,\n\t// to make sure the zoom value is always in sync with the canvas store\n\tstatic engineChangeKeys = [EngineChange.CanvasLiveTransform, EngineChange.CanvasZoom, EngineChange.UserDefaultsStore]\n\n\tstatic calculateState(): State {\n\t\tconst { zoom } = engine.stores.canvasStore // either liveZoom or interactiveZoom\n\t\tconst { displayRulers, showPixelGrid, displayGrids } = engine.stores.persistedUserDefaults\n\t\treturn {\n\t\t\tzoom,\n\t\t\tdisplayRulers,\n\t\t\tdisplayGrids,\n\t\t\tshowPixelGrid,\n\t\t}\n\t}\n\n\tmenuRef = React.createRef<HTMLDivElement>()\n\thandleMouseDown = engine.scheduler.wrapHandler((event: React.MouseEvent) => {\n\t\tevent.stopPropagation()\n\t\tif (!Events.isLeftMouseButtonDown(event)) return\n\n\t\tconst { canvasStore, contextMenuStore, persistedUserDefaults, selectionStore, modalStore, scopeStore } =\n\t\t\tengine.stores\n\n\t\tconst zoomMenuOptions: MenuItemOptions[] = [\n\t\t\t{\n\t\t\t\tlabel: actionLabels.toolZoom,\n\t\t\t\trole: Tools.actionForCase(Tools.Zoom) as AppAction,\n\t\t\t\taccelerator: appAccelerators.toolZoom,\n\t\t\t\tclick: () => engine.setTool(Tools.Zoom),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.zoomIn,\n\t\t\t\trole: \"zoomIn\",\n\t\t\t\taccelerator: appAccelerators.zoomIn,\n\t\t\t\tclick: () =>\n\t\t\t\t\tcanvasStore.zoomIn(undefined, {\n\t\t\t\t\t\tanimated: persistedUserDefaults.animateOnZoom,\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.zoomOut,\n\t\t\t\trole: \"zoomOut\",\n\t\t\t\taccelerator: appAccelerators.zoomOut,\n\t\t\t\tclick: () =>\n\t\t\t\t\tcanvasStore.zoomOut(undefined, {\n\t\t\t\t\t\tanimated: persistedUserDefaults.animateOnZoom,\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"separator\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.resetZoom,\n\t\t\t\trole: \"resetZoom\",\n\t\t\t\taccelerator: appAccelerators.resetZoom,\n\t\t\t\tacceleratorWindows: appAcceleratorsWindows.resetZoom,\n\t\t\t\tclick: () => canvasStore.setZoom(1, { animated: persistedUserDefaults.animateOnZoom }),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.zoomToFitAll,\n\t\t\t\trole: \"zoomToFitAll\",\n\t\t\t\taccelerator: appAccelerators.zoomToFitAll,\n\t\t\t\tacceleratorWindows: appAcceleratorsWindows.zoomToFitAll,\n\t\t\t\tclick: () => engine.stores.canvasStore.zoomToFitAll(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.zoomToFitSelection,\n\t\t\t\trole: \"zoomToFitSelection\",\n\t\t\t\taccelerator: appAccelerators.zoomToFitSelection,\n\t\t\t\tacceleratorWindows: appAcceleratorsWindows.zoomToFitSelection,\n\t\t\t\tclick: () => {\n\t\t\t\t\tconst nodes = selectionStore.nodes\n\t\t\t\t\tconst frame = getBoundingFrameForNodes(\n\t\t\t\t\t\tengine.tree,\n\t\t\t\t\t\tnodes.length > 0 ? nodes : scopeStore.active.getGroundNodes(),\n\t\t\t\t\t)\n\t\t\t\t\tcanvasStore.zoomToCenter(frame, {\n\t\t\t\t\t\tanimated: persistedUserDefaults.animateOnZoom,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"separator\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.fastZoom,\n\t\t\t\trole: \"fastZoom\",\n\t\t\t\tchecked: persistedUserDefaults.fastZoom,\n\t\t\t\tclick: () => {\n\t\t\t\t\tpersistedUserDefaults.fastZoom = !persistedUserDefaults.fastZoom\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: actionLabels.nudgePreferences,\n\t\t\t\trole: \"nudgePreferences\",\n\t\t\t\tclick: () => {\n\t\t\t\t\tif (modalStore.active.type === ModalType.NudgePreferences) {\n\t\t\t\t\t\tmodalStore.dismiss()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmodalStore.set({ type: ModalType.NudgePreferences, source: \"main_menu\" })\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t]\n\n\t\tconst { position } = getMenuPositionAndBoundsForToolbarItem(event, this.menuRef.current)\n\n\t\tcontextMenuStore.show(zoomMenuOptions, {\n\t\t\tlocation: position,\n\t\t\tplacement: \"top-start\",\n\t\t\tgutter: floatingToolbarMenuGutter,\n\t\t})\n\t})\n\n\toverride render() {\n\t\tconst { zoom } = this.state\n\t\tconst roundedZoom = Math.round(zoom * 100)\n\t\treturn this.props.children({ ref: this.menuRef, zoom: roundedZoom, onMouseDown: this.handleMouseDown })\n\t}\n}\n\nconst container = createContainer(ZoomMenuContainer)\nexport { container as ZoomMenuContainer }\n", "import { IconInputDropdown, Stack } from \"@framerjs/fresco\"\nimport * as styles from \"./ToolbarZoomMenu.styles.ts\"\nimport { ZoomMenuContainer } from \"./ZoomMenuContainer.tsx\"\n\nexport function ToolbarZoomMenu() {\n\treturn (\n\t\t<ZoomMenuContainer>\n\t\t\t{({ ref, zoom, onMouseDown }) => (\n\t\t\t\t<Stack\n\t\t\t\t\tclassName={styles.zoomButton}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tonMouseDown={onMouseDown}\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tjustifyContent=\"space-between\"\n\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\tgap={2}\n\t\t\t\t>\n\t\t\t\t\t<span>{`${zoom}%`}</span>\n\t\t\t\t\t<IconInputDropdown />\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</ZoomMenuContainer>\n\t)\n}\n", "import \"IconComment.styles_1nqgo1t.wyw.css\"; export const container = \"container_c37vw1j\";\nexport const unreadIcon = \"unreadIcon_udqjqml\";\nexport const agentContainer = \"agentContainer_akenek1\";\nexport const unreadIconAgent = \"unreadIconAgent_ul8ek9m\";", "import { colors } from \"@framerjs/fresco/tokens\"\nimport * as styles from \"./IconComment.styles.ts\"\n\ninterface Props {\n\tunread: boolean\n\tselected: boolean\n}\nexport function IconComment({ unread, selected }: Props) {\n\treturn (\n\t\t<span className={styles.container}>\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" role=\"presentation\">\n\t\t\t\t<path d=\"M10 2a8 8 0 0 1 0 16H4a2 2 0 0 1-2-2v-6a8 8 0 0 1 8-8Z \" fill=\"currentColor\" />\n\t\t\t</svg>\n\t\t\t{unread && (\n\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" className={styles.unreadIcon}>\n\t\t\t\t\t<title>Unread comments</title>\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx=\"7\"\n\t\t\t\t\t\tcy=\"7\"\n\t\t\t\t\t\tr=\"5\"\n\t\t\t\t\t\tfill={colors.tint}\n\t\t\t\t\t\tstroke={selected ? colors.toolbarButtonBackgroundActiveSites : colors.panelBackground}\n\t\t\t\t\t\tstrokeWidth=\"3\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n", "import { colors } from \"@framerjs/fresco/tokens\"\nimport * as styles from \"./IconComment.styles.ts\"\n\ninterface Props {\n\tunread: boolean\n\tselected: boolean\n}\n\nexport function IconCommentAgent({ unread, selected }: Props) {\n\treturn (\n\t\t<span className={styles.agentContainer}>\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"none\" role=\"presentation\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M15 7a8 8 0 0 1 0 16H9a2 2 0 0 1-2-2v-6a8 8 0 0 1 8-8Z\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tfillOpacity=\"0.2\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t{unread && (\n\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" className={styles.unreadIconAgent}>\n\t\t\t\t\t<title>Unread comments</title>\n\t\t\t\t\t<circle\n\t\t\t\t\t\tcx=\"7\"\n\t\t\t\t\t\tcy=\"7\"\n\t\t\t\t\t\tr=\"4\"\n\t\t\t\t\t\tfill={colors.tint}\n\t\t\t\t\t\tstroke={selected ? colors.toolbarButtonBackgroundActiveSites : colors.panelBackground}\n\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n", "export function IconContactSupport() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\" overflow=\"visible\">\n\t\t\t<path\n\t\t\t\td=\"M 9 0 C 13.971 0 18 4.029 18 9 C 18 13.971 13.971 18 9 18 C 4.029 18 0 13.971 0 9 C 0 4.029 4.029 0 9 0 Z M 9 13 C 8.448 13 8 13.448 8 14 C 8 14.552 8.448 15 9 15 C 9.552 15 10 14.552 10 14 C 10 13.448 9.552 13 9 13 Z M 11.682 3.956 C 10.802 3.136 9.454 2.826 8.257 3.096 C 6.987 3.383 5.852 4.33 5.52 5.991 C 5.431 6.524 5.78 7.031 6.31 7.137 C 6.839 7.243 7.357 6.91 7.48 6.384 C 7.648 5.544 8.149 5.171 8.697 5.047 C 9.317 4.907 9.971 5.095 10.318 5.419 C 11.008 6.061 10.986 7.162 9.945 7.855 C 9.015 8.475 8.52 9.217 8.264 9.837 C 8.16 10.086 8.084 10.346 8.037 10.612 C 8.018 10.723 8.006 10.835 8.001 10.948 L 8 10.978 L 8 11 C 7.999 11.533 8.416 11.974 8.949 12.001 C 9.482 12.028 9.942 11.633 9.995 11.102 L 10 11.008 L 10 11.018 C 10.018 10.875 10.056 10.734 10.111 10.601 C 10.23 10.315 10.484 9.9 11.055 9.52 C 13.014 8.213 13.448 5.602 11.682 3.956 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "export function IconHand() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"20\">\n\t\t\t<path\n\t\t\t\td=\"M 9.077 18.462 C 12.63 19.251 16 16.548 16 12.908 L 16 5 C 16 4.448 15.552 4 15 4 L 15 4 C 14.448 4 14 4.448 14 5 L 14 8 L 14 8.5 C 14 8.776 13.776 9 13.5 9 L 13.5 9 C 13.224 9 13 8.776 13 8.5 L 13 3 C 13 2.448 12.552 2 12 2 L 12 2 C 11.448 2 11 2.448 11 3 L 11 8.5 C 11 8.776 10.776 9 10.5 9 L 10.5 9 C 10.224 9 10 8.776 10 8.5 L 10 2 C 10 1.448 9.552 1 9 1 L 9 1 C 8.448 1 8 1.448 8 2 L 8 8.5 C 8 8.776 7.776 9 7.5 9 L 7.5 9 C 7.224 9 7 8.776 7 8.5 L 7 4 C 7 3.448 6.552 3 6 3 L 6 3 C 5.448 3 5 3.448 5 4 L 5 10 L 5 10.463 C 5 10.991 4.343 11.234 4 10.833 L 2.813 9.449 C 2.356 8.915 1.563 8.828 1 9.25 L 1 9.25 C 0.46 9.655 0.379 10.433 0.823 10.941 L 5.705 16.52 C 6.546 17.482 7.672 18.149 8.919 18.426 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconHandAgent() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity=\"0.2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\td=\"M14.352 23.648c4.174.949 8.148-2.224 8.148-6.504V10.5a1.5 1.5 0 0 0-3 0V14 8.5a1.5 1.5 0 0 0-3 0V14 7.5a1.5 1.5 0 0 0-3 0V14 9.5a1.5 1.5 0 0 0-3 0v5.066a.46.46 0 0 1-.833.267l-.737-1.03a1.515 1.515 0 0 0-2.18-.303 1.7 1.7 0 0 0-.327 2.308l3.528 4.998a7 7 0 0 0 4.168 2.789Z\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "export function IconMoon() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\">\n\t\t\t<path\n\t\t\t\td=\"M 17.969 11.679 C 17.883 11.402 17.625 11.213 17.335 11.216 L 17.156 11.248 C 14.784 11.903 12.243 11.232 10.504 9.491 C 8.765 7.75 8.096 5.208 8.753 2.836 C 8.769 2.789 8.777 2.74 8.777 2.69 C 8.793 2.477 8.702 2.27 8.534 2.138 C 8.366 2.005 8.143 1.965 7.939 2.031 C 4.16 3.09 1.676 6.698 2.034 10.607 C 2.392 14.516 5.49 17.611 9.399 17.966 C 13.308 18.321 16.913 15.834 17.969 12.054 C 18.01 11.932 18.01 11.801 17.969 11.679 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconPlugins() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n\t\t\t<path\n\t\t\t\td=\"M 0 4 C 0 1.791 1.791 0 4 0 L 14 0 C 16.209 0 18 1.791 18 4 L 18 14 C 18 16.209 16.209 18 14 18 L 4 18 C 1.791 18 0 16.209 0 14 Z M 11.5 11.5 L 10.5 11.5 C 9.948 11.5 9.5 11.948 9.5 12.5 C 9.5 13.052 9.948 13.5 10.5 13.5 L 11.5 13.5 L 11.5 14.5 C 11.5 15.052 11.948 15.5 12.5 15.5 C 13.052 15.5 13.5 15.052 13.5 14.5 L 13.5 13.5 L 14.5 13.5 C 15.052 13.5 15.5 13.052 15.5 12.5 C 15.5 11.948 15.052 11.5 14.5 11.5 L 13.5 11.5 L 13.5 10.5 C 13.5 9.948 13.052 9.5 12.5 9.5 C 11.948 9.5 11.5 9.948 11.5 10.5 Z M 10 5.5 C 10 6.881 11.119 8 12.5 8 C 13.881 8 15 6.881 15 5.5 C 15 4.119 13.881 3 12.5 3 C 11.119 3 10 4.119 10 5.5 Z M 2.785 7.095 C 2.549 7.495 2.837 8 3.301 8 L 7.699 8 C 8.163 8 8.451 7.495 8.215 7.095 L 6.017 3.374 C 5.784 2.981 5.216 2.981 4.983 3.374 Z M 3.03 11.97 C 2.737 12.263 2.737 12.737 3.03 13.03 L 4.97 14.97 C 5.263 15.263 5.737 15.263 6.03 14.97 L 7.97 13.03 C 8.263 12.737 8.263 12.263 7.97 11.97 L 6.03 10.03 C 5.737 9.737 5.263 9.737 4.97 10.03 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconPointer() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\">\n\t\t\t<path\n\t\t\t\td=\"M 4.346 2.449 C 3.173 2.058 2.058 3.173 2.449 4.346 L 6.232 15.697 C 6.585 16.755 7.928 17.072 8.716 16.284 L 16.284 8.716 C 17.072 7.928 16.755 6.585 15.697 6.232 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t\t<path\n\t\t\t\td=\"M 12 12 L 16.5 16.5\"\n\t\t\t\tfill=\"transparent\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconPointerAgent() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity=\"0.2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\td=\"M14.183 22.859c-.622 1.197-2.386 1.028-2.769-.266L7.859 10.596c-.45-1.522.965-2.938 2.487-2.487l11.997 3.555c1.294.383 1.463 2.147.266 2.769l-5.263 2.737a1 1 0 0 0-.426.426Z\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "export function IconSun() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\">\n\t\t\t<g>\n\t\t\t\t<g transform=\"translate(9 0)\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 1 C 0 0.448 0.448 0 1 0 L 1 0 C 1.552 0 2 0.448 2 1 L 2 3 C 2 3.552 1.552 4 1 4 L 1 4 C 0.448 4 0 3.552 0 3 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 17 C 0 16.448 0.448 16 1 16 L 1 16 C 1.552 16 2 16.448 2 17 L 2 19 C 2 19.552 1.552 20 1 20 L 1 20 C 0.448 20 0 19.552 0 19 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t</g>\n\t\t\t\t<g transform=\"translate(9 0) rotate(-90 1 10)\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 1 C 0 0.448 0.448 0 1 0 L 1 0 C 1.552 0 2 0.448 2 1 L 2 3 C 2 3.552 1.552 4 1 4 L 1 4 C 0.448 4 0 3.552 0 3 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 17 C 0 16.448 0.448 16 1 16 L 1 16 C 1.552 16 2 16.448 2 17 L 2 19 C 2 19.552 1.552 20 1 20 L 1 20 C 0.448 20 0 19.552 0 19 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g transform=\"rotate(45 10 10)\">\n\t\t\t\t<g transform=\"translate(9 0)\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 1 C 0 0.448 0.448 0 1 0 L 1 0 C 1.552 0 2 0.448 2 1 L 2 3 C 2 3.552 1.552 4 1 4 L 1 4 C 0.448 4 0 3.552 0 3 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 17 C 0 16.448 0.448 16 1 16 L 1 16 C 1.552 16 2 16.448 2 17 L 2 19 C 2 19.552 1.552 20 1 20 L 1 20 C 0.448 20 0 19.552 0 19 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t</g>\n\t\t\t\t<g transform=\"translate(9 0) rotate(-90 1 10)\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 1 C 0 0.448 0.448 0 1 0 L 1 0 C 1.552 0 2 0.448 2 1 L 2 3 C 2 3.552 1.552 4 1 4 L 1 4 C 0.448 4 0 3.552 0 3 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M 0 17 C 0 16.448 0.448 16 1 16 L 1 16 C 1.552 16 2 16.448 2 17 L 2 19 C 2 19.552 1.552 20 1 20 L 1 20 C 0.448 20 0 19.552 0 19 Z\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t></path>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<path\n\t\t\t\td=\"M 10 6 C 12.209 6 14 7.791 14 10 C 14 12.209 12.209 14 10 14 C 7.791 14 6 12.209 6 10 C 6 7.791 7.791 6 10 6 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n", "export function IconThemeAgent() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"none\" viewBox=\"0 0 30 30\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity=\"0.2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\td=\"M6.5 14.63a8.5 8.5 0 0 1 5.855-8.08 1 1 0 0 1 1.29 1.153 7 7 0 0 0 8.282 8.282 1 1 0 0 1 1.153 1.29A8.5 8.5 0 0 1 15 23.13h0a8.5 8.5 0 0 1-8.5-8.5\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "import \"QuickActionsCategoryTag.styles_1d7nkfh.wyw.css\"; export const tag = \"tag_tg66tfe\";\nexport const closeButton = \"closeButton_c1xbkjzx\";", "import { IconClose, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport * as styles from \"./QuickActionsCategoryTag.styles.ts\"\n\ninterface Props {\n\tname: string\n\tcolor: string\n\tbackground: string\n\tonRemove: () => void\n}\n\nexport const QuickActionsCategoryTag = ({ name, color, background, onRemove }: Props) => {\n\treturn (\n\t\t<div className={styles.tag} style={{ color, background }}>\n\t\t\t<span className={truncateWithEllipsis}>{name}</span>\n\t\t\t<span className={styles.closeButton} onClick={onRemove}>\n\t\t\t\t<IconClose />\n\t\t\t</span>\n\t\t</div>\n\t)\n}\n", "import { CenterChild, Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport React from \"react\"\nimport { QuickActionsGroupHeader } from \"./QuickActionsGroupHeader.tsx\"\nimport * as styles from \"./QuickActionsModal.styles.ts\"\n\ninterface QuickActionsEmptyStateProps {\n\theaderTitle?: string\n\ticon: React.ReactNode\n\ttitle: string\n}\n\nexport const QuickActionsEmptyState = React.memo(({ headerTitle, icon, title }: QuickActionsEmptyStateProps) => {\n\treturn (\n\t\t<Stack direction=\"column\" gap={0}>\n\t\t\t{headerTitle && <QuickActionsGroupHeader>{headerTitle}</QuickActionsGroupHeader>}\n\t\t\t<Stack\n\t\t\t\tpadding={dimensions.css.inputSpacing}\n\t\t\t\tdirection=\"row\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tclassName={cx(styles.actionRow, styles.emptyStateActionRow)}\n\t\t\t>\n\t\t\t\t<CenterChild className={styles.rowIcon}>{icon}</CenterChild>\n\t\t\t\t<span className={cx(styles.rowTitle, styles.rowTitleEmptyState)}>{title}</span>\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n})\n", "import \"QuickActionsModal.styles_ofse0p.wyw.css\"; export const itemHeight = 40;\nexport const itemIconSize = 20;\nexport const defaultModalWidth = 330;\nexport const contentManagementModalWidth = 290;\nexport const itemIconRadius = 5;\nexport const groupHeaderHeight = 35;\nexport const containerPadding = 5;\nexport const emptyStateHeight = groupHeaderHeight + itemHeight;\nexport const modalPosition = \"modalPosition_m1ie2kph\";\nexport const modalPositionDocked = \"modalPositionDocked_moa1vhm\";\nexport const modal = \"modal_mt2xqh6\";\nexport const inputSearch = \"inputSearch_i1qzdkxu\";\nexport const inputSearchWithCategoryTag = \"inputSearchWithCategoryTag_iis3mit\";\nexport const headerSeparator = \"headerSeparator_hmvqqp5\";\nexport const inputSearchSpinner = \"inputSearchSpinner_i2fw7iy\";\nexport const actionResultContainer = \"actionResultContainer_afzdl1q\";\nexport const actionResultContainerFixedHeight = \"actionResultContainerFixedHeight_aq40plj\";\nexport const actionResultContainerContentManagementFixedHeight = \"actionResultContainerContentManagementFixedHeight_a17i738l\";\nexport const actionResultContainerDynamicHeight = \"actionResultContainerDynamicHeight_ag4bwmi\";\nexport const actionResultContainerContentManagementDynamicHeight = \"actionResultContainerContentManagementDynamicHeight_a7a3gqh\";\nexport const emptyActionResultContainer = \"emptyActionResultContainer_e1ruv3r7\";\nexport const groupTitleContainer = \"groupTitleContainer_g13ju5ya\";\nexport const groupTitle = \"groupTitle_gop9oyl\";\nexport const actionRow = \"actionRow_a1mvlnk8\";\nexport const emptyStateActionRow = \"emptyStateActionRow_e16znu3r\";\nexport const actionRowSelected = \"actionRowSelected_am8kjpx\";\nexport const rowIcon = \"rowIcon_r1y6w2bc\";\nexport const rowIconExternal = \"rowIconExternal_r2sqnqz\";\nexport const rowIconComponentTint = \"rowIconComponentTint_r1fyybpx\";\nexport const rowIconAssetStyleTint = \"rowIconAssetStyleTint_r1vgi437\";\nexport const rowTitle = \"rowTitle_rwh61kd\";\nexport const rowTitleEmptyState = \"rowTitleEmptyState_r557f0t\";\nexport const shrinkableText = \"shrinkableText_s68rd75\";\nexport const nonShrinkableText = \"nonShrinkableText_n8b8jq4\";\nexport const separatorIcon = \"separatorIcon_s1goywx6\";\nexport const rowShortcut = \"rowShortcut_rlnbzqw\";\nexport const rowEnabledOrDisabledText = \"rowEnabledOrDisabledText_r2cvdvb\";", "import { Stack } from \"@framerjs/fresco\"\nimport * as styles from \"./QuickActionsModal.styles.ts\"\n\nexport function QuickActionsGroupHeader({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<Stack direction=\"column\" className={styles.groupTitleContainer} gap={0}>\n\t\t\t<Stack direction=\"row\" alignItems=\"center\" className={styles.groupTitle}>\n\t\t\t\t{children}\n\t\t\t</Stack>\n\t\t</Stack>\n\t)\n}\n", "import \"QuickActionsInputIcon.styles_1tkedvx.wyw.css\"; export const backButton = \"backButton_b1kdbjht\";", "import { Button, IconArrowLeft } from \"@framerjs/fresco\"\nimport * as styles from \"./QuickActionsInputIcon.styles.ts\"\nimport { QuickActionsCategoryType } from \"./types.ts\"\nimport { IconSearchSmall } from \"./utils/icons.tsx\"\n\ninterface QuickActionsInputIconProps {\n\tactiveCategoryType: QuickActionsCategoryType\n\tonExitCategory: VoidFunction\n}\n\nexport function QuickActionsInputIcon({ activeCategoryType, onExitCategory }: QuickActionsInputIconProps) {\n\tconst showBackButton =\n\t\tactiveCategoryType === QuickActionsCategoryType.Plugins ||\n\t\tactiveCategoryType === QuickActionsCategoryType.ManagedCollectionPlugins\n\n\tif (showBackButton) {\n\t\treturn (\n\t\t\t<Button onClick={onExitCategory} variant=\"clean\" className={styles.backButton}>\n\t\t\t\t<IconArrowLeft />\n\t\t\t</Button>\n\t\t)\n\t}\n\n\treturn <IconSearchSmall />\n}\n", "import type { MenuOptionIcon } from \"@framerjs/framer-services\"\nimport { assertNever } from \"@framerjs/shared\"\nimport type { PreferenceAction } from \"app/AppActions.ts\"\nimport { IconWithInnerShadow, PluginIcon } from \"plugins/PluginIcon.tsx\"\nimport type React from \"react\"\nimport { isFunction, isObject, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport {\n\ttype QuickActionsItem,\n\tQuickActionsType,\n\tQuickActionsCategoryType,\n\tisQuickActionsExternalURLIcon,\n} from \"../types.ts\"\nimport * as icons from \"./icons.tsx\"\n\nconst allPreferenceActions: Record<PreferenceAction, true> = {\n\tnewContentAsDraft: true,\n\tuseDirectSelect: true,\n\tautoSwitchToLayers: true,\n\tuseSmartLayoutPins: true,\n\treverseZoomDirection: true,\n\tfastZoom: true,\n\tanimateOnZoom: true,\n\tkeyboardZoomsToSelection: true,\n\tshowScrollToContentToast: true,\n\tresetDefaultFrameBackground: true,\n\tnudgePreferences: true,\n\ttogglePerformanceMode: true,\n\ttoggleCanvasPages: true,\n\texitCanvasOnDoubleClick: true,\n\ttemplatesModalOnNewProject: true,\n}\n\nexport function isPreferenceAction(action: string): action is PreferenceAction {\n\treturn Object.hasOwn(allPreferenceActions, action)\n}\n\nfunction isMenuOptionIcon(icon: QuickActionsItem[\"icon\"]): icon is MenuOptionIcon {\n\treturn isObject(icon) && !isQuickActionsExternalURLIcon(icon) && \"src\" in icon\n}\n\nfunction QuickActionsMenuOptionIcon({ icon }: { icon: MenuOptionIcon }) {\n\tconst iconStyle: React.CSSProperties = {\n\t\theight: icon.height ?? 14,\n\t\twidth: icon.width ?? 14,\n\t}\n\n\t// biome-ignore lint/security/noDangerouslySetInnerHtml: Menu inline SVG sources are trusted app assets.\n\treturn <span style={iconStyle} dangerouslySetInnerHTML={{ __html: icon.src }} />\n}\n\nfunction getQuickActionIconForAppAction(item: QuickActionsItem): NonNullable<React.ReactNode> {\n\tconst appAction = item.appAction\n\n\tif (!appAction) return <icons.IconArrowRight />\n\tif (isPreferenceAction(appAction)) {\n\t\treturn item.checked ? <icons.IconToggleOn /> : <icons.IconToggleOff />\n\t}\n\tswitch (appAction) {\n\t\tcase \"publishSite\":\n\t\tcase \"openPublishedSite\":\n\t\tcase \"toggleLocalization\":\n\t\t\treturn <icons.IconGlobe />\n\t\tcase \"inviteCollaborators\":\n\t\tcase \"openCommunity\":\n\t\t\treturn <icons.IconPerson />\n\t\tcase \"requestFeature\":\n\t\t\treturn <icons.IconLinkChain />\n\t\tcase \"addLocale\":\n\t\tcase \"createAIKit\":\n\t\tcase \"createCodeComponent\":\n\t\tcase \"createOverride\":\n\t\tcase \"makeComponent\":\n\t\tcase \"makeCodeComponent\":\n\t\tcase \"newCollectionItem\":\n\t\tcase \"newWebPage\":\n\t\tcase \"openTemplates\":\n\t\t\treturn <icons.IconPlus />\n\t\tcase \"newWebPageFolder\":\n\t\tcase \"newCollectionFolder\":\n\t\t\treturn <icons.IconFolder />\n\t\tcase \"toggleContentManagement\":\n\t\tcase \"newCollection\":\n\t\t\treturn <icons.IconCMS />\n\t\tcase \"delete\":\n\t\tcase \"deleteCollection\":\n\t\tcase \"deleteCollectionItem\":\n\t\t\treturn <icons.IconTrashCan />\n\t\tcase \"editFields\":\n\t\tcase \"editLocale\":\n\t\t\treturn <icons.IconEditPencil />\n\t\tcase \"importCollection\":\n\t\t\treturn <icons.IconArrowDown />\n\t\tcase \"showPreview\":\n\t\tcase \"sitesGetStarted\":\n\t\t\treturn <icons.IconPreview />\n\t\tcase \"showAPIDocumentation\":\n\t\t\treturn <icons.IconInfo />\n\t\tcase \"saveCodeFile\":\n\t\tcase \"pasteCollection\":\n\t\tcase \"draftCollectionItem\":\n\t\tcase \"undraftCollectionItem\":\n\t\tcase \"saveSiteSettings\":\n\t\t\treturn <icons.IconFile />\n\t\tcase \"copy\":\n\t\tcase \"copyCSS\":\n\t\tcase \"copyLink\":\n\t\tcase \"copyNodeId\":\n\t\tcase \"copyLinkToCollectionItem\":\n\t\tcase \"copyCollectionItemAsMarkdown\":\n\t\tcase \"copyGrid\":\n\t\tcase \"copyFill\":\n\t\tcase \"copyEffects\":\n\t\tcase \"copyCursor\":\n\t\tcase \"copyURL\":\n\t\tcase \"copyProjectLink\":\n\t\tcase \"copyRemixLink\":\n\t\tcase \"copySVG\":\n\t\tcase \"copyStyle\":\n\t\tcase \"copyText\":\n\t\tcase \"copyVersion\":\n\t\tcase \"duplicateCollection\":\n\t\t\treturn <icons.IconCopy />\n\t\tcase \"generateWebPage\":\n\t\t\treturn <icons.IconSparkleLarge />\n\t\tcase \"toggleVersionHistory\":\n\t\t\treturn <icons.IconClock />\n\t\tcase \"filterLocalizationByScope\":\n\t\tcase \"filterLocalizationByStatus\":\n\t\t\treturn <icons.IconFilter />\n\t\tcase \"viewLocaleOnCanvas\":\n\t\t\treturn <icons.IconArrowRightUp />\n\t\tcase \"batchTranslateAll\":\n\t\t\treturn <icons.IconSparkleLarge />\n\t\tcase \"openPlugins\":\n\t\t\treturn <icons.IconPlugins />\n\t\tcase \"openAnalytics\":\n\t\t\treturn <icons.IconAnalytics />\n\t\tcase \"keyboardShortcuts\":\n\t\t\treturn <icons.IconCommandKey />\n\t\tcase \"browseMarketplace\":\n\t\t\treturn <icons.IconGlobe />\n\t\tcase \"createVectorSet\":\n\t\tcase \"addToVectorSet\":\n\t\t\treturn <icons.IconVectorSet />\n\t}\n\n\treturn <icons.IconArrowRight />\n}\n\nfunction getIconForQuickActionItemWithoutShadow(\n\titem: QuickActionsItem,\n\tisHighlighted: boolean,\n): NonNullable<React.ReactNode> {\n\tif (!isUndefined(item.icon)) {\n\t\tif (isString(item.icon)) {\n\t\t\tconst Icon = icons[item.icon as keyof typeof icons]\n\t\t\treturn <Icon />\n\t\t}\n\t\tif (isFunction(item.icon)) {\n\t\t\treturn <item.icon />\n\t\t}\n\n\t\tif (isQuickActionsExternalURLIcon(item.icon)) {\n\t\t\treturn <PluginIcon src={item.icon.iconURL} hideInnerShadow={isHighlighted} />\n\t\t}\n\t\tif (isMenuOptionIcon(item.icon)) {\n\t\t\treturn <QuickActionsMenuOptionIcon icon={item.icon} />\n\t\t}\n\n\t\treturn item.icon\n\t}\n\n\tconst type = item.type\n\n\tswitch (type) {\n\t\tcase QuickActionsType.CreateCollection:\n\t\t\treturn <icons.IconPlus />\n\t\tcase QuickActionsType.CreateCollectionFolder:\n\t\t\treturn <icons.IconFolder />\n\t\tcase QuickActionsType.CodeFile:\n\t\tcase QuickActionsType.Handshake:\n\t\t\treturn <icons.IconCode />\n\t\tcase QuickActionsType.AssetStyles:\n\t\tcase QuickActionsType.CodeImport:\n\t\tcase QuickActionsType.Component:\n\t\tcase QuickActionsType.TeamLibrary:\n\t\t\treturn <icons.IconComponent />\n\t\tcase QuickActionsType.LayoutTemplate:\n\t\t\treturn <icons.IconLayoutTemplate />\n\t\tcase QuickActionsType.ContextMenuItem:\n\t\tcase QuickActionsType.MainMenuItem:\n\t\t\treturn getQuickActionIconForAppAction(item)\n\t\tcase QuickActionsType.Collection:\n\t\tcase QuickActionsType.CanvasScope:\n\t\tcase QuickActionsType.SmartComponent:\n\t\tcase QuickActionsType.CollectionPageItem:\n\t\tcase QuickActionsType.SelectCategory:\n\t\tcase QuickActionsType.LocaleStatusFilter:\n\t\t\treturn <icons.IconArrowRight />\n\t\tcase QuickActionsType.VersionHistory:\n\t\t\treturn <icons.IconClock />\n\t\tcase QuickActionsType.FindNodes:\n\t\t\treturn <icons.IconArrowRight />\n\t\tcase QuickActionsType.OpenModal:\n\t\tcase QuickActionsType.OpenExternalUrl:\n\t\t\treturn <icons.IconGlobe />\n\t\tcase QuickActionsType.LocaleScopeFilter:\n\t\t\treturn <icons.IconGlobe />\n\t\tcase QuickActionsType.WorkspacePlugin:\n\t\t\treturn <icons.IconExperiment />\n\t\tcase QuickActionsType.Plugin:\n\t\t\treturn <icons.IconExperiment />\n\t\tcase QuickActionsType.OpenDevelopmentPlugin:\n\t\t\treturn <icons.IconCode />\n\t\tcase QuickActionsType.GoToCodeCrashSourceNode:\n\t\t\treturn <icons.IconArrowRight />\n\t\tdefault:\n\t\t\tassertNever(type, \"getIconForQuickActionType() - all quick action items should be handled\")\n\t}\n}\n\nexport function getIconForQuickActionItem(\n\titem: QuickActionsItem,\n\tisHighlighted: boolean,\n): NonNullable<React.ReactNode> {\n\tconst icon = getIconForQuickActionItemWithoutShadow(item, isHighlighted)\n\tif (!item.withInnerShadow) return icon\n\treturn <IconWithInnerShadow hideInnerShadow={isHighlighted}>{icon}</IconWithInnerShadow>\n}\n\nexport function getEmptyStateIcon(category: QuickActionsCategoryType, emptySearchTerm: boolean) {\n\tif (!emptySearchTerm) return <icons.IconSearch />\n\tif (category === QuickActionsCategoryType.WorkspacePlugins) return <icons.IconPlugins />\n\treturn <icons.IconSearch />\n}\n", "import type { QuickActionsItem, QuickActionsItemIdentifier } from \"../types.ts\"\n\n/**\n * Generates a unique identifier for a quick action item based on its type and id.\n * Optionally includes a group title to differentiate items.\n */\nexport function getQuickActionItemIdentifier(\n\titem: QuickActionsItem,\n\tgroupTitle: string | string[] = \"no-group\",\n): QuickActionsItemIdentifier {\n\tconst normalizedGroupTitle = Array.isArray(groupTitle) ? groupTitle.join(\":\") : groupTitle\n\treturn `${normalizedGroupTitle}:${item.type}:${item.id}`\n}\n", "import {\n\tassert,\n\tasGlobalId,\n\texternalModuleIdentifier,\n\tgetLogger,\n\tisExternalModuleIdentifier,\n\tisLocalModuleIdentifier,\n\tparseModuleIdentifier,\n} from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport { getModuleImportStatement } from \"modules/utils.ts\"\n\nconst log = getLogger(\"quick-actions:code-import\")\n\nexport async function performImportAction(id: string) {\n\ttry {\n\t\tconst moduleInfo = await getModuleInfoForImportStatement(id)\n\t\tif (!moduleInfo) return\n\t\tconst importStatement = getModuleImportStatement(moduleInfo)\n\t\tengine.stores.codeEditorStore.queueImportToAdd(importStatement)\n\t} catch (err) {\n\t\tlog.reportError(err)\n\t\treturn\n\t}\n}\n\nexport async function performTeamLibraryImportAction(moduleId: string) {\n\tconst libraryModule = engine.stores.libraryStore.lookupLibraryModule(moduleId)\n\tif (!libraryModule) return\n\tconst { module, exportSpecifier } = libraryModule\n\tconst { saveId, files } = module\n\tassert(moduleId === module.id, \"Code Import: lookup module id is different\", moduleId, module.id)\n\n\tconst globalModuleId = asGlobalId(module.id)\n\tassert(files.module, \"module file must exist for a saved module\")\n\tconst moduleIdentifier = externalModuleIdentifier(globalModuleId, saveId, files.module, exportSpecifier)\n\tawait performImportAction(moduleIdentifier.value)\n}\n\n// Clears the current DOM selection if the current range is contained by the Modal element.\nasync function getModuleInfoForImportStatement(\n\tcodeComponentIdentifier: string,\n): Promise<Parameters<typeof getModuleImportStatement>[0] | undefined> {\n\tconst identifier = parseModuleIdentifier(codeComponentIdentifier)\n\tconst { modulesStore } = engine.stores\n\tif (isLocalModuleIdentifier(identifier)) {\n\t\t// Component from the current project: use relative import.\n\t\tconst entry = modulesStore.getModuleEntryByLocalId(identifier.localId)\n\t\t// TODO: We should be able to fall back to the in-memory analyzed module here if it's not persisted yet.\n\t\tconst persistedModule = modulesStore.getPersistedModuleByLocalId(identifier.localId)\n\t\tif (!entry || !persistedModule) return\n\t\treturn {\n\t\t\tkind: \"local\",\n\t\t\ttypeSlashName: entry.type + \"/\" + entry.name,\n\t\t\ttitle: persistedModule.title,\n\t\t\texports: persistedModule.exports,\n\t\t}\n\t}\n\n\tif (isExternalModuleIdentifier(identifier)) {\n\t\t// Component from another project, but it needs to be decorated from the backend.\n\t\tconst { moduleId, saveId } = identifier\n\t\tconst { module } = await modulesStore.lookUpModule({ moduleId, saveId })\n\t\t// TODO: Prefer to use published namespace, name, and version if available.\n\t\treturn {\n\t\t\tkind: \"external\",\n\t\t\t// TODO: Share this logic with other places doing the same thing.\n\t\t\tspecifier: `${module.importURL}@${module.saveId}`,\n\t\t\ttitle: module.title,\n\t\t\texports: module.exports,\n\t\t}\n\t}\n}\n", "import { assertNever, emptyArray } from \"@framerjs/shared\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { ColorStyleTokenListNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { ComponentPresetNode } from \"document/models/CanvasTree/nodes/ComponentPresetNode.ts\"\nimport type { ImageStylePresetNode } from \"document/models/CanvasTree/nodes/ImageStylePresetNode.ts\"\nimport { InlineCodeStylePresetNode } from \"document/models/CanvasTree/nodes/InlineCodeStylePresetNode.ts\"\nimport { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport type { TableStylePresetNode } from \"document/models/CanvasTree/nodes/TableStylePresetNode.ts\"\nimport { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { isStylePresetNode } from \"document/models/CanvasTree/nodes/utils/isStylePresetNode.ts\"\nimport {\n\tisBlockquoteStylePresetNode,\n\tisColorStyleTokenNode,\n\tisComponentPresetNode,\n\tisImageStylePresetNode,\n\tisInlineCodeStylePresetNode,\n\tisLinkStylePresetNode,\n\tisRichTextNode,\n\tisTableStylePresetNode,\n\tisTextStylePresetNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { withOptionalFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { withGetName } from \"document/models/CanvasTree/traits/WithGetName.ts\"\nimport { tokenToCSSVariable } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport type { SelectionStore } from \"document/stores/SelectionStore.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { ActiveContentPanelTab, ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { useMemo } from \"react\"\nimport type { ComponentWithPreset } from \"utils/getComponentsWithPresets.ts\"\nimport { canDeleteStylePreset } from \"utils/stylePresetUtils.ts\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { PresetIcon } from \"../../presetsPanel/PresetIcon.tsx\"\nimport { selectBlockquoteStylePreset } from \"../../properties/panels/SelectBlockquoteStyleEntityAssetPopout.tsx\"\nimport { selectLinkStylePreset } from \"../../properties/panels/SelectLinkStyleEntityAssetPopout.tsx\"\nimport { selectTableStylePreset } from \"../../properties/panels/SelectTableStyleEntityAssetPopout.tsx\"\nimport { selectTextStylePreset } from \"../../properties/panels/SelectTextStyleEntityAssetPopout.tsx\"\nimport { useComponentsWithPresets } from \"../../properties/panels/utils/useComponentsWithPresets.ts\"\nimport { getAssetStylePopoutId } from \"../../properties/rows/StyleAssetRow.tsx\"\nimport { ColorTokenPreview } from \"../../shared/ColorPicker/tokens/ColorPickerTokenRowPreview.tsx\"\nimport { getPopoutElementById } from \"../../shared/PopoutButton.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport type { QuickActionsCategory, QuickActionsGroup, QuickActionsIconType, QuickActionsItem } from \"../types.ts\"\nimport { FindNodesType, QuickActionsCategoryType, QuickActionsTintType, QuickActionsType } from \"../types.ts\"\nimport { IconImage, IconTable } from \"./icons.tsx\"\nimport type { FindNodesOptions } from \"./useFindNodesQuickActions.tsx\"\n\nexport function useAssetStylesActions(activeCategory: QuickActionsCategory | undefined): readonly QuickActionsGroup[] {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\tconst { isPreviewingLocaleOnCanvas, mainView } = engine.stores.chromeStore.useState()\n\tconst componentsWithPresets = useComponentsWithPresets()\n\n\tconst { presetsListNode, colorStyleTokenListNode } = useEngineState(\n\t\t() => ({\n\t\t\tpresetsListNode: PresetsListNode.get(engine.tree),\n\t\t\tcolorStyleTokenListNode: ColorStyleTokenListNode.get(engine.tree),\n\t\t}),\n\t\t[],\n\t\tEngineChange.Tree,\n\t)\n\n\tconst groups = useMemo((): readonly QuickActionsGroup[] => {\n\t\tif (isPreviewingLocaleOnCanvas) return emptyArray()\n\t\tif (!shouldDisplayAssetStylesInQuickActions(mainView)) return emptyArray()\n\n\t\t// Only show selected item actions if there is an active item\n\t\tif (activeCategory?.type === QuickActionsCategoryType.AssetStyles) {\n\t\t\tconst activePreset = engine.tree.get<AssetStyleNode>(activeCategory.activeItemId)\n\t\t\tif (!activePreset) return emptyArray()\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Actions\",\n\t\t\t\t\titems: getAssetStyleActions(activePreset, isViewOnly),\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\n\t\tconst assetStylesActionGroups: QuickActionsGroup[] = []\n\n\t\tif (presetsListNode) {\n\t\t\tconst textStylePresets = presetsListNode.getTextStylePresets()\n\t\t\tif (textStylePresets.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Text Styles\",\n\t\t\t\t\titems: assetStyleToQuickActionsItems(textStylePresets),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst linkStylePresets = presetsListNode.getLinkStylePresets()\n\t\t\tif (linkStylePresets.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Link Styles\",\n\t\t\t\t\titems: assetStyleToQuickActionsItems(linkStylePresets),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst blockquoteStylePresets = presetsListNode.getBlockquoteStylePresets()\n\t\t\tif (blockquoteStylePresets.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Blockquote Styles\",\n\t\t\t\t\titems: assetStyleToQuickActionsItems(blockquoteStylePresets),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst inlineCodeStylePresets = presetsListNode.getInlineCodeStylePresets()\n\t\t\tif (inlineCodeStylePresets.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Code Styles\",\n\t\t\t\t\titems: assetStyleToQuickActionsItems(inlineCodeStylePresets),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (colorStyleTokenListNode) {\n\t\t\tconst colorStyleTokens = colorStyleTokenListNode.children.toArray()\n\t\t\tif (colorStyleTokens.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: \"Color Styles\",\n\t\t\t\t\titems: assetStyleToQuickActionsItems(colorStyleTokens),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tif (presetsListNode) {\n\t\t\tconst componentPresets = presetsListNode.getComponentPresets()\n\t\t\tconst imageStylePresets = presetsListNode.getImageStylePresets()\n\t\t\tconst tableStylePresets = presetsListNode.getTableStylePresets()\n\t\t\tconst cmsStylePresets = [...componentPresets, ...imageStylePresets, ...tableStylePresets]\n\t\t\tif (cmsStylePresets.length > 0) {\n\t\t\t\tassetStylesActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\t\t\ttitle: `${Dictionary.Cms} Styles`,\n\t\t\t\t\titems: assetStyleToQuickActionsItems(cmsStylePresets, componentsWithPresets),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn assetStylesActionGroups\n\t}, [\n\t\tisPreviewingLocaleOnCanvas,\n\t\tactiveCategory,\n\t\tpresetsListNode,\n\t\tcolorStyleTokenListNode,\n\t\tcomponentsWithPresets,\n\t\tisViewOnly,\n\t\tmainView,\n\t])\n\n\treturn groups\n}\n\nexport function executeAssetStyleAction(actionType: AppAction, activeCategory: QuickActionsCategory | undefined) {\n\tif (activeCategory?.type !== QuickActionsCategoryType.AssetStyles) return\n\n\tconst activePreset = engine.tree.get<AssetStyleNode>(activeCategory.activeItemId)\n\tif (!activePreset) return\n\n\tswitch (actionType) {\n\t\tcase \"editAssetStyle\":\n\t\t\tperformEditAction(activePreset)\n\t\t\tbreak\n\t\tcase \"applyAssetStyle\":\n\t\t\tperformApplyAction(activePreset, engine.stores.selectionStore)\n\t\t\tbreak\n\t\tcase \"deleteAssetStyle\":\n\t\t\tperformDeleteAction(activePreset)\n\t\t\tbreak\n\t}\n}\n\nexport type AssetStyleNode =\n\t| TextStylePresetNode\n\t| LinkStylePresetNode\n\t| BlockquoteStylePresetNode\n\t| TableStylePresetNode\n\t| InlineCodeStylePresetNode\n\t| ImageStylePresetNode\n\t| ColorStyleTokenNode\n\t| ComponentPresetNode\n\nfunction assetStyleToQuickActionsItems(\n\tstylePresetNodes: readonly AssetStyleNode[],\n\tcomponentsWithPreset: ComponentWithPreset[] = [],\n): QuickActionsItem[] {\n\treturn stylePresetNodes.map(preset => {\n\t\treturn {\n\t\t\tkind: \"item\",\n\t\t\tid: preset.id,\n\t\t\tname: getAssetStyleQuickActionsName(preset),\n\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\ticon: getAssetStyleQuickActionsIcon(preset, componentsWithPreset),\n\t\t\ttint: getAssetStyleQuickActionsTint(preset),\n\t\t\tcategory: { type: QuickActionsCategoryType.AssetStyles, activeItemId: preset.id },\n\t\t}\n\t})\n}\n\nfunction getAssetStyleActions(preset: AssetStyleNode, isViewOnly: boolean): QuickActionsItem[] {\n\tconst visibleActions: QuickActionsItem[] = [\n\t\t{\n\t\t\tkind: \"item\",\n\t\t\tid: `${preset.id}-find`,\n\t\t\tname: Dictionary.Find,\n\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\ticon: \"IconSearch\",\n\t\t\tcategory: {\n\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\toptions: getFindNodeOptions(preset),\n\t\t\t},\n\t\t},\n\t]\n\n\tif (isViewOnly) return visibleActions\n\n\tvisibleActions.unshift({\n\t\tkind: \"item\",\n\t\tid: `${preset.id}-edit`,\n\t\tname: Dictionary.Edit,\n\t\ttype: QuickActionsType.AssetStyles,\n\t\ticon: \"IconEditPencil\",\n\t\tappAction: \"editAssetStyle\",\n\t})\n\n\tconst selectedNodes = engine.stores.selectionStore.nodes\n\n\tconst applyLink =\n\t\tisLinkStylePresetNode(preset) &&\n\t\tselectedNodes\n\t\t\t.filter(isRichTextNode)\n\t\t\t.filter(node => node.hasLinks)\n\t\t\t.map(node => node.id).length > 0\n\n\tconst applyBlockquote =\n\t\tisBlockquoteStylePresetNode(preset) &&\n\t\tselectedNodes\n\t\t\t.filter(isRichTextNode)\n\t\t\t.filter(node => node.hasBlockquotes())\n\t\t\t.map(node => node.id).length > 0\n\n\tconst applyText =\n\t\tisTextStylePresetNode(preset) && selectedNodes.filter(isRichTextNode).map(node => node.id).length > 0\n\n\tconst applyColor = isColorStyleTokenNode(preset) && selectedNodes.filter(withOptionalFill).length > 0\n\n\tif (applyLink || applyText || applyColor || applyBlockquote) {\n\t\tvisibleActions.unshift({\n\t\t\tkind: \"item\",\n\t\t\tid: `${preset.id}-apply`,\n\t\t\tname: \"Apply\",\n\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\ticon: \"IconArrowRight\",\n\t\t\tappAction: \"applyAssetStyle\",\n\t\t})\n\t}\n\n\tif (\n\t\t(isStylePresetNode(preset) && canDeleteStylePreset(engine.stores.treeStore, preset)) ||\n\t\t(isColorStyleTokenNode(preset) && !preset.installed) ||\n\t\tisComponentPresetNode(preset)\n\t) {\n\t\tvisibleActions.push({\n\t\t\tkind: \"item\",\n\t\t\tid: `${preset.id}-delete`,\n\t\t\tname: Dictionary.Delete,\n\t\t\ttype: QuickActionsType.AssetStyles,\n\t\t\ticon: \"IconTrashCan\",\n\t\t\tappAction: \"deleteAssetStyle\",\n\t\t})\n\t}\n\n\treturn visibleActions\n}\n\nfunction getAssetStyleQuickActionsIcon(\n\tpreset: AssetStyleNode,\n\tcomponentsWithPreset: ComponentWithPreset[],\n): QuickActionsIconType {\n\tif (isTextStylePresetNode(preset)) {\n\t\treturn <PresetIcon icon={preset.tag} color=\"currentColor\" />\n\t}\n\tif (isColorStyleTokenNode(preset)) {\n\t\treturn <ColorTokenPreviewIcon preset={preset} />\n\t}\n\tif (isLinkStylePresetNode(preset)) {\n\t\treturn \"IconLinkChain\"\n\t}\n\tif (isBlockquoteStylePresetNode(preset)) {\n\t\treturn <PresetIcon icon=\"B\" color=\"currentColor\" />\n\t}\n\tif (isTableStylePresetNode(preset)) {\n\t\treturn <PresetIcon icon={<IconTable />} color=\"currentColor\" />\n\t}\n\tif (isInlineCodeStylePresetNode(preset)) {\n\t\treturn \"IconCodeBlock\"\n\t}\n\tif (isImageStylePresetNode(preset)) {\n\t\treturn <PresetIcon icon={<IconImage />} color=\"currentColor\" />\n\t}\n\tif (isComponentPresetNode(preset)) {\n\t\tconst presetComponent = componentsWithPreset.find(\n\t\t\tcomponent => component.componentIdentifier === preset.componentIdentifier,\n\t\t)\n\t\treturn getComponentIcon(presetComponent?.name ?? Dictionary.Unknown)\n\t}\n\treturn \"IconArrowRight\"\n}\n\nexport function getAssetStyleQuickActionsName(preset: AssetStyleNode): string {\n\tif (withGetName(preset)) return preset.getName()\n\treturn preset.resolveValue(\"name\") ?? Dictionary.Unknown\n}\n\nfunction getAssetStyleQuickActionsTint(preset: AssetStyleNode): QuickActionsTintType | undefined {\n\tswitch (preset.constructor) {\n\t\tcase ColorStyleTokenNode:\n\t\tcase TextStylePresetNode:\n\t\t\treturn QuickActionsTintType.AssetStyleIcon\n\t\tcase LinkStylePresetNode:\n\t\tcase BlockquoteStylePresetNode:\n\t\tcase InlineCodeStylePresetNode:\n\t\tcase ComponentPresetNode:\n\t\t\treturn undefined\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\nfunction getComponentIcon(name: string) {\n\tconst lowerName = name.toLowerCase()\n\n\tif (lowerName.includes(\"code\")) return \"IconCode\"\n\tif (lowerName.includes(\"youtube\") || lowerName.includes(\"vimeo\")) return \"IconPlay\"\n\treturn \"IconCMS\"\n}\n\nfunction performDeleteAction(preset: AssetStyleNode) {\n\tengine.tree.removeNode(preset)\n}\n\n/** Exported only for testing. */\nexport function performApplyAction(preset: AssetStyleNode, selectionStore: SelectionStore) {\n\tif (isTextStylePresetNode(preset)) {\n\t\tselectTextStylePreset(selectionStore.ids, preset)\n\t}\n\tif (isLinkStylePresetNode(preset)) {\n\t\tselectLinkStylePreset(selectionStore.ids, preset)\n\t}\n\tif (isBlockquoteStylePresetNode(preset)) {\n\t\tselectBlockquoteStylePreset(selectionStore.ids, preset)\n\t}\n\tif (isTableStylePresetNode(preset)) {\n\t\tselectTableStylePreset(selectionStore.ids, preset)\n\t}\n\tif (isColorStyleTokenNode(preset)) {\n\t\tconst colorNodes = selectionStore.nodes.filter(withOptionalFill)\n\t\tconst colorToken = tokenToCSSVariable(preset)\n\t\tcolorNodes.forEach(node => {\n\t\t\tnode.set({\n\t\t\t\tfillColor: colorToken,\n\t\t\t\tfillEnabled: true,\n\t\t\t\tfillType: \"color\",\n\t\t\t})\n\t\t})\n\t}\n}\n\nfunction getFindNodeOptions(preset: AssetStyleNode): FindNodesOptions {\n\tif (\n\t\tisTextStylePresetNode(preset) ||\n\t\tisLinkStylePresetNode(preset) ||\n\t\tisBlockquoteStylePresetNode(preset) ||\n\t\tisTableStylePresetNode(preset) ||\n\t\tisInlineCodeStylePresetNode(preset) ||\n\t\tisImageStylePresetNode(preset)\n\t) {\n\t\treturn {\n\t\t\ttype: FindNodesType.StylePreset,\n\t\t\ttitle: preset.getName(),\n\t\t\tpresetId: preset.id,\n\t\t}\n\t}\n\tif (isComponentPresetNode(preset)) {\n\t\treturn {\n\t\t\ttype: FindNodesType.ComponentPreset,\n\t\t\ttitle: preset.resolveValue(\"name\") ?? Dictionary.Unknown,\n\t\t\tpresetId: preset.id,\n\t\t\tcomponentIdentifier: preset.componentIdentifier,\n\t\t}\n\t}\n\tif (isColorStyleTokenNode(preset)) {\n\t\treturn {\n\t\t\ttype: FindNodesType.ColorStyleToken,\n\t\t\ttitle: preset.name,\n\t\t\ttokenId: preset.id,\n\t\t}\n\t}\n\tassertNever(preset)\n}\n\nfunction performEditAction(preset: AssetStyleNode) {\n\t// assets panel needs to be open and style category expanded for the popout to work\n\tengine.stores.chromeStore.contentPanelTab = ActiveContentPanelTab.Assets\n\tif (isTextStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelTextStylePresetsExpanded = true\n\t}\n\tif (isLinkStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelLinkStylePresetsExpanded = true\n\t}\n\tif (isBlockquoteStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelBlockquoteStylePresetsExpanded = true\n\t}\n\tif (isInlineCodeStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelInlineCodeStylePresetsExpanded = true\n\t}\n\tif (isImageStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelCmsPresetsExpanded = true\n\t}\n\tif (isTableStylePresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelCmsPresetsExpanded = true\n\t}\n\tif (isColorStyleTokenNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelColorStyleTokensExpanded = true\n\t}\n\tif (isComponentPresetNode(preset)) {\n\t\tengine.stores.chromeStore.assetPanelCmsPresetsExpanded = true\n\t}\n\n\tengine.scheduler.runBeforeNextFrame(() => {\n\t\tconst popoutId = getAssetStylePopoutId(preset.id)\n\t\tconst element = getPopoutElementById(popoutId)\n\t\telement?.scrollIntoView()\n\n\t\tif (popoutWindow.navigation.isPresenting(popoutId)) return // already open\n\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t})\n}\n\nfunction ColorTokenPreviewIcon({ preset }: { preset: ColorStyleTokenNode }) {\n\tconst { isDarkMode } = useDarkMode()\n\tconst color = preset.colorForMode(isDarkMode)\n\treturn <ColorTokenPreview value={color} size=\"small\" />\n}\n\n/**\n * We want to display asset styles in quick actions only when the user is in\n * specific views and not in others.\n */\nfunction shouldDisplayAssetStylesInQuickActions(mainView: ActiveMainView): boolean {\n\tswitch (mainView) {\n\t\tcase ActiveMainView.ContentManagement:\n\t\tcase ActiveMainView.Preview:\n\t\tcase ActiveMainView.Localizations:\n\t\tcase ActiveMainView.SiteSettings:\n\t\tcase ActiveMainView.Analytics:\n\t\tcase ActiveMainView.CodeEditor:\n\t\t\treturn false\n\t\tcase ActiveMainView.Canvas:\n\t\t\treturn true\n\t\tdefault:\n\t\t\tassertNever(mainView)\n\t}\n}\n", "import { IconLine, IconTextStylePreset, NumberInputWithTickerAndStepper, Stack } from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport engine from \"document/engine.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport type { RelativeOrFourPixelNumberShorthand } from \"document/models/CanvasTree/traits/NumberShorthand.ts\"\nimport { paddingDefinedDefaults } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport { getReducedBorderDefaults, reduceBorder } from \"document/models/CanvasTree/traits/utils/reduceBorder.ts\"\nimport { useStableCallback } from \"library/utils/useStableCallback.ts\"\nimport type { Dispatch, SetStateAction } from \"react\"\nimport { useEffect, useId, useMemo, useState } from \"react\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { PopoutButtonPreviewIconWrapper } from \"../../shared/PopoutButtonPreviewIconWrapper.tsx\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { NumberShorthandInput } from \"../inputs/NumberShorthandInput.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { StylePresetBreakpointTypeRow } from \"../rows/StylePresetRows/StylePresetBreakpointTypeRow.tsx\"\nimport { StylePresetBreakpointWidthRow } from \"../rows/StylePresetRows/StylePresetBreakpointWidthRow.tsx\"\nimport { StylePresetCornerRows } from \"../rows/StylePresetRows/StylePresetCornerRows.tsx\"\nimport { StylePresetFillRow } from \"../rows/StylePresetRows/StylePresetFillRow.tsx\"\nimport { StylePresetFontRow } from \"../rows/StylePresetRows/StylePresetFontRow.tsx\"\nimport { StylePresetFontSizeRow } from \"../rows/StylePresetRows/StylePresetFontSizeRow.tsx\"\nimport { StylePresetFontVariantsRow } from \"../rows/StylePresetRows/StylePresetFontVariantsRow.tsx\"\nimport { StylePresetLetterSpacingRow } from \"../rows/StylePresetRows/StylePresetLetterSpacingRow.tsx\"\nimport { StylePresetLineHeightRow } from \"../rows/StylePresetRows/StylePresetLineHeightRow.tsx\"\nimport { StylePresetParagraphSpacingRow } from \"../rows/StylePresetRows/StylePresetParagraphSpacingRow.tsx\"\nimport { StylePresetTextAlignmentRow } from \"../rows/StylePresetRows/StylePresetTextAlignmentRow.tsx\"\nimport { StylePresetTextColorRow } from \"../rows/StylePresetRows/StylePresetTextColorRow.tsx\"\nimport { StylePresetTextDecorationRow } from \"../rows/StylePresetRows/StylePresetTextDecorationRow.tsx\"\nimport { StylePresetTextTransformRow } from \"../rows/StylePresetRows/StylePresetTextTransformRow.tsx\"\nimport { doubleColumnClass } from \"../utils/doubleColumn.styles.ts\"\nimport { BorderPanel } from \"./BorderPanel.tsx\"\nimport * as styles from \"./EditBlockquoteStylePresetPopout.styles.ts\"\nimport { PaddingRow } from \"./PaddingRow.tsx\"\nimport { Panel } from \"./Panel.tsx\"\nimport { PanelSectionHeader } from \"./PanelSectionHeader.tsx\"\nimport { PresetPopoutContainer } from \"./PresetPopoutContainer.tsx\"\nimport { getBreakpointFromActiveScreen } from \"./breakpointUtils.tsx\"\nimport { useBlockquoteStylePresetBreakpoints } from \"./utils/useBlockquoteStylePresetBreakpoints.ts\"\n\ninterface Props {\n\tpreset: BlockquoteStylePresetNode\n}\n\nexport function EditBlockquoteStylePresetPopout({ preset }: Props) {\n\tconst selection = engine.stores.selectionStore.useState()\n\tconst breakpoints = useBlockquoteStylePresetBreakpoints(preset)\n\n\t// Get the id of the breakpoint that matches the the first selected node.\n\tconst getBreakpointIdFromActiveScreen = useStableCallback(() => {\n\t\treturn getBreakpointFromActiveScreen(engine, breakpoints)?.id\n\t})\n\n\tconst [breakpointId, setBreakpointId] = useState(getBreakpointIdFromActiveScreen)\n\n\t// The breakpoint tabs should follow the selection on the canvas.\n\tuseEffect(() => {\n\t\tconst id = getBreakpointIdFromActiveScreen()\n\t\tsetBreakpointId(id)\n\t}, [selection.ids, getBreakpointIdFromActiveScreen])\n\n\tconst index = breakpoints.findIndex(breakpoint => breakpoint.id === breakpointId)\n\tconst breakpoint = breakpoints[index]\n\n\treturn (\n\t\t<PresetPopoutContainer withPanelHeader={false}>\n\t\t\t<Panel>\n\t\t\t\t<BlockquoteFontRow\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tbreakpoint={breakpoint}\n\t\t\t\t\tbreakpoints={breakpoints}\n\t\t\t\t\tindex={index}\n\t\t\t\t\tsetBreakpointId={setBreakpointId}\n\t\t\t\t/>\n\n\t\t\t\t<StylePresetFillRow preset={preset} />\n\t\t\t\t<BlockquoteBorderRow preset={preset} />\n\t\t\t\t<StylePresetCornerRows preset={preset} />\n\t\t\t\t<PaddingRow\n\t\t\t\t\tpadding={preset.padding ?? paddingDefinedDefaults.padding}\n\t\t\t\t\tpaddingPerSide={preset.paddingPerSide ?? paddingDefinedDefaults.paddingPerSide}\n\t\t\t\t\tpaddingBottom={preset.paddingBottom ?? paddingDefinedDefaults.paddingBottom}\n\t\t\t\t\tpaddingLeft={preset.paddingLeft ?? paddingDefinedDefaults.paddingLeft}\n\t\t\t\t\tpaddingRight={preset.paddingRight ?? paddingDefinedDefaults.paddingRight}\n\t\t\t\t\tpaddingTop={preset.paddingTop ?? paddingDefinedDefaults.paddingTop}\n\t\t\t\t\tnodeIds={[preset.id]}\n\t\t\t\t\tsupportsVariables={false}\n\t\t\t\t/>\n\n\t\t\t\t<BlockquoteLineRow preset={preset} />\n\t\t\t</Panel>\n\t\t</PresetPopoutContainer>\n\t)\n}\n\ninterface BlockquoteFontRowProps {\n\tpreset: BlockquoteStylePresetNode\n\tbreakpoint: BlockquoteStylePresetNode | undefined\n\tbreakpoints: BlockquoteStylePresetNode[]\n\tindex: number\n\tsetBreakpointId: Dispatch<SetStateAction<string | undefined>>\n}\n\nfunction BlockquoteFontPopout({ preset, breakpoint, breakpoints, index, setBreakpointId }: BlockquoteFontRowProps) {\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tdirection=\"column\"\n\t\t\tpadding={dimensions.css.popoverPadding}\n\t\t\tpaddingTop={0}\n\t\t\tpaddingBottom={0}\n\t\t\tclassName={styles.background}\n\t\t>\n\t\t\t<Panel className={cx(styles.panelScreen, styles.panelScreenTop)}>\n\t\t\t\t<StylePresetFontRow preset={preset} deleteEnabled emptyLabel={Dictionary.Inherit} />\n\t\t\t\t<StylePresetFontVariantsRow preset={preset} deleteEnabled emptyLabel={Dictionary.Inherit} />\n\t\t\t\t<StylePresetTextColorRow preset={preset} deleteEnabled emptyLabel={Dictionary.Inherit} />\n\t\t\t\t<StylePresetTextTransformRow preset={preset} deleteEnabled />\n\t\t\t\t<StylePresetTextDecorationRow preset={preset} deleteEnabled />\n\t\t\t\t<StylePresetTextAlignmentRow preset={preset} deleteEnabled />\n\t\t\t</Panel>\n\t\t\t<Panel className={styles.panelScreen} header={<PanelSectionHeader title=\"Breakpoints\" />}>\n\t\t\t\t<StylePresetBreakpointTypeRow\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tbreakpoints={breakpoints}\n\t\t\t\t\tselectedId={breakpoint?.id}\n\t\t\t\t\tonSelect={setBreakpointId}\n\t\t\t\t/>\n\n\t\t\t\t<StylePresetBreakpointWidthRow breakpoints={breakpoints} index={index} />\n\t\t\t\t<StylePresetFontSizeRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetLetterSpacingRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetLineHeightRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetParagraphSpacingRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t</Panel>\n\t\t</Stack>\n\t)\n}\n\nfunction BlockquoteFontRow({ preset, breakpoint, breakpoints, setBreakpointId, index }: BlockquoteFontRowProps) {\n\tconst blockquoteTextStylePopoutId = useId()\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\n\tconst onDelete = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ textStyleEnabled: false })\n\t})\n\n\tconst onOpen = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ textStyleEnabled: true })\n\t\tpopoutWindow.navigation.presentPopoutOnRegistration(blockquoteTextStylePopoutId)\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Font\">\n\t\t\t{preset.textStyleEnabled ? (\n\t\t\t\t<PopoutButtonWithPreview\n\t\t\t\t\tid={blockquoteTextStylePopoutId}\n\t\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\t\tnavigationTitle=\"Text Style\"\n\t\t\t\t\ttitle=\"Style\"\n\t\t\t\t\tpreview={\n\t\t\t\t\t\t<PopoutButtonPreviewIconWrapper background={colors.tint} strokedIcon={agentExperimentEnabled}>\n\t\t\t\t\t\t\t<IconTextStylePreset compact={agentExperimentEnabled} />\n\t\t\t\t\t\t</PopoutButtonPreviewIconWrapper>\n\t\t\t\t\t}\n\t\t\t\t\tdisplayDivider\n\t\t\t\t\tstrokedIconPreview={agentExperimentEnabled}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tpopout={\n\t\t\t\t\t\t<BlockquoteFontPopout\n\t\t\t\t\t\t\tpreset={preset}\n\t\t\t\t\t\t\tbreakpoint={breakpoint}\n\t\t\t\t\t\t\tbreakpoints={breakpoints}\n\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\tsetBreakpointId={setBreakpointId}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"font\" onClick={onOpen} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction BlockquoteLinePopout({ preset }: Props) {\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tdirection=\"column\"\n\t\t\tpadding={dimensions.css.popoverPadding}\n\t\t\tpaddingTop={0}\n\t\t\tpaddingBottom={0}\n\t\t\tclassName={styles.background}\n\t\t>\n\t\t\t<Panel className={styles.panelScreen}>\n\t\t\t\t<BlockquoteLineColorRow preset={preset} />\n\t\t\t\t<BlockquoteLineSizeRow preset={preset} />\n\t\t\t\t<BlockquoteLineRadiusRow preset={preset} />\n\t\t\t</Panel>\n\t\t</Stack>\n\t)\n}\n\nfunction BlockquoteLineRow({ preset }: Props) {\n\tconst blockquoteLineStylePopoutId = useId()\n\n\tconst onDelete = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ lineEnabled: false })\n\t})\n\n\tconst onOpen = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ lineEnabled: true })\n\t\tpopoutWindow.navigation.presentPopoutOnRegistration(blockquoteLineStylePopoutId)\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Line\">\n\t\t\t{preset.lineEnabled ? (\n\t\t\t\t<PopoutButtonWithPreview\n\t\t\t\t\tid={blockquoteLineStylePopoutId}\n\t\t\t\t\tpopout={<BlockquoteLinePopout preset={preset} />}\n\t\t\t\t\tnavigationTitle=\"Line Style\"\n\t\t\t\t\ttitle=\"Style\"\n\t\t\t\t\tdisplayDivider\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\tpreview={\n\t\t\t\t\t\t<PopoutButtonPreviewIconWrapper background={colors.tint}>\n\t\t\t\t\t\t\t<IconLine />\n\t\t\t\t\t\t</PopoutButtonPreviewIconWrapper>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"line\" onClick={onOpen} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction BlockquoteBorderRow({ preset }: Props) {\n\tconst reducedProps = useMemo(() => {\n\t\tconst result = getReducedBorderDefaults()\n\n\t\treduceBorder(preset, result)\n\n\t\treturn result\n\t}, [preset])\n\n\treturn <BorderPanel nodeIds={[preset.id]} onlyBreakpointNodes={false} {...reducedProps} />\n}\n\nfunction BlockquoteLineColorRow({ preset }: Props) {\n\tconst changeLineColor = engine.scheduler.wrapHandler((lineColor?: string) => {\n\t\tengine.tree.current(preset)?.set({ lineColor })\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Color\">\n\t\t\t<ColorPopoutButton navigationTitle=\"Color\" value={preset.lineColor} onChange={changeLineColor} />\n\t\t</PanelRow>\n\t)\n}\n\nfunction BlockquoteLineSizeRow({ preset }: Props) {\n\tconst changeLineWidth = engine.scheduler.wrapHandler((lineWidth: number) => {\n\t\tengine.tree.current(preset)?.set({ lineWidth })\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Width\">\n\t\t\t<NumberInputWithTickerAndStepper onChange={changeLineWidth} value={preset.lineWidth} min={1} />\n\t\t</PanelRow>\n\t)\n}\n\nfunction BlockquoteLineRadiusRow({ preset }: Props) {\n\tconst changeLineRadiusWidth = engine.scheduler.wrapHandler((lineRadius: RelativeOrFourPixelNumberShorthand) => {\n\t\tengine.tree.current(preset)?.set({ lineRadius })\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Radius\">\n\t\t\t<NumberShorthandInput variant=\"borderRadius\" value={preset.lineRadius} onChange={changeLineRadiusWidth} />\n\t\t</PanelRow>\n\t)\n}\n", "import {\n\tIconBorderAll,\n\tIconBorderDivided,\n\tIconRadiusAll,\n\tIconRadiusDivided,\n\tNumberInputWithTicker,\n\tSegmentedControl,\n\tSegmentedControlItem,\n} from \"@framerjs/fresco\"\nimport { Mixed, assertNever, isMixed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport type {\n\tFourPixelNumberShorthand,\n\tRelativeOrFourPixelNumberShorthand,\n\tTwoPixelNumberShorthand,\n} from \"document/models/CanvasTree/traits/NumberShorthand.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { RelativeNumber } from \"library/render/types/RelativeNumber.ts\"\nimport { memo, useEffect, useRef, useState } from \"react\"\nimport { isNumber, isString } from \"utils/typeChecks.ts\"\nimport { doubleColumnClass, spanAllColumnClass } from \"../utils/doubleColumn.styles.ts\"\nimport { FusedNumberInputs } from \"./FusedNumberInputs.tsx\"\nimport * as styles from \"./NumberShorthandInput.styles.ts\"\n\nconst fourLonghandDefaults = [0, 0, 0, 0] as const\n\ntype Props =\n\t| {\n\t\t\tvariant: \"padding\"\n\t\t\tvalue: Reduced<FourPixelNumberShorthand>\n\t\t\tonChange: (value: FourPixelNumberShorthand) => void\n\t  }\n\t| {\n\t\t\tvariant: \"borderRadius\"\n\t\t\tvalue: Reduced<RelativeOrFourPixelNumberShorthand>\n\t\t\tonChange: (value: RelativeOrFourPixelNumberShorthand) => void\n\t  }\n\nexport const NumberShorthandInput = memo(function NumberShorthandInput({ value, onChange, variant }: Props) {\n\tconst shorthandInputRef = useRef<HTMLInputElement | null>(null)\n\tconst longhandInputsRef = useRef<FusedNumberInputs | null>(null)\n\n\tconst isShorthand = !isString(value) || !value.includes(\" \")\n\tconst isLonghand = !isShorthand\n\n\tconst shouldFocusInputRef = useRef(false)\n\n\tuseEffect(() => {\n\t\tif (!shouldFocusInputRef.current) return\n\t\tshouldFocusInputRef.current = false\n\t\tif (isShorthand) {\n\t\t\tshorthandInputRef.current?.focus()\n\t\t} else {\n\t\t\tlonghandInputsRef.current?.focus()\n\t\t}\n\t}, [isShorthand])\n\n\tconst [longhandInputFocusIndex, setLonghandInputFocusIndex] = useState(-1)\n\n\tconst toShorthand = () => {\n\t\tif (isShorthand) return\n\t\tconst firstLonghandValue = getFirstLonghandValueWithFallback(value)\n\t\tonChange(`${firstLonghandValue}px`)\n\t\tshouldFocusInputRef.current = true\n\t}\n\n\tconst toLonghand = () => {\n\t\tif (isLonghand) return\n\t\tconst shorthandValue = getShorthandValueWithFallback(value)\n\t\tonChange(`${shorthandValue}px ${shorthandValue}px ${shorthandValue}px ${shorthandValue}px`)\n\t\tshouldFocusInputRef.current = true\n\t}\n\n\tconst handleShorthandChange = (newValue: number, rawValue: string | undefined, reset: VoidFunction) => {\n\t\tconst isRelative = rawValue ? rawValue.endsWith(\"%\") : isString(value) && value.includes(\"%\")\n\t\tif (!isRelative) {\n\t\t\tonChange(`${newValue}px`)\n\t\t\treturn\n\t\t}\n\n\t\tif (variant === \"borderRadius\") {\n\t\t\tonChange(`${newValue}%`)\n\t\t} else {\n\t\t\treset()\n\t\t}\n\t}\n\n\tconst handleLonghandChange = (index: number, newValue: number) => {\n\t\tconst longhandValues = getFourLonghandValuesWithFallback(value)\n\t\tlonghandValues[index] = newValue\n\t\tonChange(`${longhandValues[0]}px ${longhandValues[1]}px ${longhandValues[2]}px ${longhandValues[3]}px`)\n\t}\n\n\treturn (\n\t\t<div className={cx(doubleColumnClass, styles.container)}>\n\t\t\t<NumberInputWithTicker\n\t\t\t\tref={shorthandInputRef}\n\t\t\t\tvalue={isShorthand ? getShorthandValue(value) : undefined}\n\t\t\t\tonChange={handleShorthandChange}\n\t\t\t\tmin={0}\n\t\t\t\tstep=\"nudge\"\n\t\t\t\tdefaultValue={0}\n\t\t\t/>\n\t\t\t<SegmentedControl>\n\t\t\t\t<SegmentedControlItem title={getToggleShorthandTitle(variant)} selected={isShorthand} onSelect={toShorthand}>\n\t\t\t\t\t{variant === \"padding\" ? <IconBorderAll /> : <IconRadiusAll />}\n\t\t\t\t</SegmentedControlItem>\n\t\t\t\t<SegmentedControlItem title={getToggleLonghandTitle(variant)} selected={isLonghand} onSelect={toLonghand}>\n\t\t\t\t\t{variant === \"padding\" ? (\n\t\t\t\t\t\t<IconBorderDivided activeBorder={longhandInputFocusIndex} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<IconRadiusDivided activeBorder={longhandInputFocusIndex} />\n\t\t\t\t\t)}\n\t\t\t\t</SegmentedControlItem>\n\t\t\t</SegmentedControl>\n\t\t\t{isLonghand && (\n\t\t\t\t<div className={spanAllColumnClass}>\n\t\t\t\t\t<FusedNumberInputs\n\t\t\t\t\t\tminValue={0}\n\t\t\t\t\t\tstep=\"nudge\"\n\t\t\t\t\t\tref={longhandInputsRef}\n\t\t\t\t\t\tdefaultValues={fourLonghandDefaults}\n\t\t\t\t\t\tvalues={getFourLonghandValues(value)}\n\t\t\t\t\t\tlabels={getFourLonghandLabels(variant)}\n\t\t\t\t\t\tonValueChange={handleLonghandChange}\n\t\t\t\t\t\tonFocusChange={setLonghandInputFocusIndex}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\nconst borderRadiusLonghandLabels = [\"TL\", \"TR\", \"BR\", \"BL\"] as const\nconst paddingLonghandLabels = [\"T\", \"R\", \"B\", \"L\"] as const\n\nfunction getFourLonghandLabels(variant: Props[\"variant\"]): readonly [string, string, string, string] {\n\tif (variant === \"borderRadius\") return borderRadiusLonghandLabels\n\tif (variant === \"padding\") return paddingLonghandLabels\n\tassertNever(variant)\n}\n\nfunction getToggleShorthandTitle(variant: Props[\"variant\"]): string {\n\tif (variant === \"padding\") return \"Padding\"\n\tif (variant === \"borderRadius\") return \"Radius\"\n\tassertNever(variant)\n}\n\nfunction getToggleLonghandTitle(variant: Props[\"variant\"]): string {\n\tif (variant === \"padding\") return \"Padding per side\"\n\tif (variant === \"borderRadius\") return \"Radius per corner\"\n\tassertNever(variant)\n}\n\ntype OptionalNumber = number | undefined\n\nfunction parseOptionalNumber(value: string | undefined): OptionalNumber {\n\tif (!isString(value)) return undefined\n\tconst parsed = parseFloat(value)\n\treturn isNumber(parsed) ? parsed : undefined\n}\n\nfunction getShorthandValue(\n\tvalue: Reduced<FourPixelNumberShorthand | TwoPixelNumberShorthand | RelativeOrFourPixelNumberShorthand>,\n): number | RelativeNumber | Mixed | undefined {\n\tif (isMixed(value)) return value\n\tif (isNotFound(value)) return undefined\n\tconst segments = value.split(\" \")\n\tif (segments.length !== 1) return Mixed\n\tconst firstSegment = segments[0]\n\tconst parsed = parseOptionalNumber(firstSegment)\n\tif (!isNumber(parsed)) return Mixed\n\tconst isRelative = firstSegment.endsWith(\"%\")\n\tif (isRelative) return `${parsed}%`\n\treturn parsed\n}\n\nfunction getShorthandValueWithFallback(\n\tvalue: Reduced<FourPixelNumberShorthand | TwoPixelNumberShorthand | RelativeOrFourPixelNumberShorthand>,\n): number {\n\tconst shorthandValue = getShorthandValue(value)\n\tif (isNumber(shorthandValue)) return shorthandValue\n\treturn 0\n}\n\nfunction getFourLonghandValues(\n\tvalue: Reduced<FourPixelNumberShorthand | RelativeOrFourPixelNumberShorthand>,\n): [OptionalNumber, OptionalNumber, OptionalNumber, OptionalNumber] {\n\tif (!isString(value)) return [undefined, undefined, undefined, undefined]\n\tconst segments = value.split(\" \")\n\tif (segments.length !== 4) return [undefined, undefined, undefined, undefined]\n\tconst [a, b, c, d] = segments\n\tconst parsedA = parseOptionalNumber(a)\n\tconst parsedB = parseOptionalNumber(b)\n\tconst parsedC = parseOptionalNumber(c)\n\tconst parsedD = parseOptionalNumber(d)\n\treturn [parsedA, parsedB, parsedC, parsedD]\n}\n\nfunction getFourLonghandValuesWithFallback(\n\tvalue: Reduced<FourPixelNumberShorthand | RelativeOrFourPixelNumberShorthand>,\n): [number, number, number, number] {\n\tconst [a, b, c, d] = getFourLonghandValues(value)\n\treturn [a ?? 0, b ?? 0, c ?? 0, d ?? 0]\n}\n\nfunction getFirstLonghandValueWithFallback(\n\tvalue: Reduced<FourPixelNumberShorthand | TwoPixelNumberShorthand | RelativeOrFourPixelNumberShorthand>,\n): number {\n\tif (!isString(value)) return 0\n\tconst segments = value.split(\" \")\n\tfor (const segment of segments) {\n\t\tconst parsed = parseFloat(segment)\n\t\tif (isNumber(parsed)) return parsed\n\t}\n\treturn 0\n}\n", "import type { NumberInputProps, NumberInputWithTickerProps } from \"@framerjs/fresco\"\nimport { LabelWithTickerControl, NumberInputWithTicker } from \"@framerjs/fresco\"\nimport { assert, isMixed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { notFoundToUndefined } from \"document/models/CanvasTree/traits/utils/notFoundToUndefined.ts\"\nimport { isEqual } from \"library/index.ts\"\nimport React, { forwardRef, useCallback } from \"react\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { doubleColumnClass } from \"../utils/doubleColumn.styles.ts\"\nimport * as styles from \"./FusedNumberInputs.styles.ts\"\n\ntype Value = number | undefined\n\ntype Props = {\n\tstep?: NumberInputProps[\"step\"]\n\tminValue?: number\n\tmaxValue?: number\n\tonValueChange: (index: number, value: number) => void\n\tonFocusChange?: (index: number) => void\n\tdoubleColumn?: boolean\n\tunit?: NumberInputProps[\"unit\"]\n} & (\n\t| {\n\t\t\tids?: readonly [string, string, string, string]\n\t\t\tvalues: readonly [Reduced<Value>, Reduced<Value>, Reduced<Value>, Reduced<Value>]\n\t\t\tlabels: readonly [string, string, string, string]\n\t\t\tdefaultValues?: readonly [Value, Value, Value, Value]\n\t\t\tenabled?: [boolean, boolean, boolean, boolean]\n\t  }\n\t| {\n\t\t\tids?: readonly [string, string, string]\n\t\t\tvalues: readonly [Reduced<Value>, Reduced<Value>, Reduced<Value>]\n\t\t\tlabels: readonly [string, string, string]\n\t\t\tdefaultValues?: readonly [Value, Value, Value]\n\t\t\tenabled?: [boolean, boolean, boolean]\n\t  }\n)\n\ninterface State {\n\tfocusedItem: number\n}\n\nexport class FusedNumberInputs extends React.Component<Props, State> {\n\tprivate firstElement = React.createRef<HTMLInputElement>()\n\tprivate containerRef = React.createRef<HTMLDivElement>()\n\n\toverride state = { focusedItem: -1 }\n\n\toverride shouldComponentUpdate(nextProps: Props, nextState: State) {\n\t\treturn !isEqual(this.props, nextProps) || this.state.focusedItem !== nextState.focusedItem\n\t}\n\n\tfocus = () => {\n\t\tconst firstElement = this.firstElement.current\n\t\tif (firstElement) firstElement.focus()\n\t}\n\n\tonFocus = (focusedItem: 0 | 1 | 2 | 3) => {\n\t\tthis.setState({ focusedItem })\n\n\t\tif (this.props.onFocusChange) {\n\t\t\tthis.props.onFocusChange(focusedItem)\n\t\t}\n\t}\n\n\tonBlur = (event: React.FocusEvent<HTMLElement>) => {\n\t\tconst nextFocusedElement = event.relatedTarget\n\t\tif (nextFocusedElement instanceof Node && this.containerRef.current?.contains(nextFocusedElement)) return\n\n\t\tthis.setState({ focusedItem: -1 })\n\n\t\tif (this.props.onFocusChange) {\n\t\t\tthis.props.onFocusChange(-1)\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst {\n\t\t\tlabels,\n\t\t\tids,\n\t\t\tvalues,\n\t\t\tminValue,\n\t\t\tmaxValue,\n\t\t\tenabled,\n\t\t\tdefaultValues,\n\t\t\tstep,\n\t\t\tdoubleColumn = true,\n\t\t\tunit,\n\t\t} = this.props\n\n\t\tconst fuseInputsTogether = values.length > 2\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={this.containerRef}\n\t\t\t\tclassName={cx(\n\t\t\t\t\tstyles.inputContainer,\n\t\t\t\t\tvalues.length > 2 && styles.fusedNumberInputs,\n\t\t\t\t\tdoubleColumn && doubleColumnClass,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{values.map((value, index) => {\n\t\t\t\t\tconst label = labels[index]\n\t\t\t\t\tassert(isString(label), \"Labels must be strings\")\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<NumberInputWithLabel\n\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: the amount of inputs is constant so we can use the index.\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tmin={minValue}\n\t\t\t\t\t\t\tmax={maxValue}\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tfuseInputsTogether={fuseInputsTogether}\n\t\t\t\t\t\t\tdefaultValue={defaultValues?.[index]}\n\t\t\t\t\t\t\tonChange={this.props.onValueChange}\n\t\t\t\t\t\t\tonBlur={this.onBlur}\n\t\t\t\t\t\t\tonFocus={this.onFocus}\n\t\t\t\t\t\t\tref={index === 0 ? this.firstElement : null}\n\t\t\t\t\t\t\tenabled={enabled ? enabled[index] : true}\n\t\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tid={ids?.[index]}\n\t\t\t\t\t\t\tposition={index}\n\t\t\t\t\t\t\tunit={unit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</div>\n\t\t)\n\t}\n}\n\ninterface NumberInputWithLabelProps extends Omit<NumberInputWithTickerProps, \"value\" | \"onFocus\" | \"onChange\"> {\n\tposition: number\n\tlabel: string\n\tfuseInputsTogether: boolean\n\tvalue: Reduced<number | undefined>\n\tonFocus: (position: number) => void\n\tonChange: (position: number, value: number) => void\n}\n\nconst NumberInputWithLabel = forwardRef<HTMLInputElement, NumberInputWithLabelProps>(\n\t({ className, position, label, value, onChange, onFocus, fuseInputsTogether, ...props }, ref) => {\n\t\tconst { enabled, min, step, max } = props\n\n\t\tconst tickerValue = isMixed(value) ? undefined : notFoundToUndefined(value)\n\n\t\tconst onFocusHandler = useCallback(() => {\n\t\t\tonFocus?.(position)\n\t\t}, [onFocus, position])\n\n\t\tconst onChangeHandler = useCallback(\n\t\t\t(newValue: number) => {\n\t\t\t\tonChange?.(position, newValue)\n\t\t\t},\n\t\t\t[onChange, position],\n\t\t)\n\n\t\treturn (\n\t\t\t<div className={cx(styles.inputLabelWrapper, className)}>\n\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\tref={ref}\n\t\t\t\t\tvalue={notFoundToUndefined(value)}\n\t\t\t\t\tonChange={onChangeHandler}\n\t\t\t\t\tonFocus={onFocusHandler}\n\t\t\t\t\tdisplayTicker={!fuseInputsTogether}\n\t\t\t\t\tlabel={fuseInputsTogether ? undefined : label}\n\t\t\t\t\tisFused={fuseInputsTogether}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{fuseInputsTogether && (\n\t\t\t\t\t<LabelWithTickerControl\n\t\t\t\t\t\tclassName={styles.label}\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tvalue={tickerValue}\n\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tenabled={enabled}\n\t\t\t\t\t\tonlyUpdateWhileDragging\n\t\t\t\t\t\tonChange={onChangeHandler}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n", "import \"FusedNumberInputs.styles_le9o92.wyw.css\"; export const inputContainer = \"inputContainer_iae4d26\";\nexport const fusedNumberInputs = \"fusedNumberInputs_f1idai8v\";\nexport const inputLabelWrapper = \"inputLabelWrapper_i1gbk7xh\";\nexport const label = \"label_l123ciep\";", "import \"NumberShorthandInput.styles_f2x8p.wyw.css\"; export const container = \"container_cizp6i0\";", "import { Button, SegmentedControl, SegmentedControlItem, useReadOnly } from \"@framerjs/fresco\"\nimport { assert } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { TemplateHelper } from \"document/models/CanvasTree/nodes/TemplateHelper.ts\"\nimport type { WithStylePresetBreakpoint } from \"document/models/CanvasTree/traits/WithStylePresetBreakpoint.ts\"\nimport type { WithTemplate } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { isMaster } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { OmitVariables } from \"document/models/CanvasTree/traits/utils/OmitVariables.ts\"\nimport type React from \"react\"\nimport {\n\tgetBreakpointLabel,\n\tgetBreakpointWidths,\n\tpickStylePresetBreakpointWidth,\n\tscaleStylePresetFontSize,\n\tstylePresetFallbackWidths,\n} from \"../../panels/breakpointUtils.tsx\"\nimport { doubleColumn } from \"../../utils/doubleColumn.ts\"\nimport { PanelRow } from \"../PanelRow.tsx\"\n\ntype BreakpointPresetNode = CanvasNode & OmitVariables<WithTextStyle> & WithStylePresetBreakpoint & WithTemplate\n\ninterface BreakpointTypeProps {\n\tpreset: BreakpointPresetNode\n\tbreakpoints: BreakpointPresetNode[]\n\tselectedId: string | undefined\n\tonSelect(id: string | undefined): void\n}\n\nexport function StylePresetBreakpointTypeRow({ preset, breakpoints, selectedId, onSelect }: BreakpointTypeProps) {\n\tconst isReadOnly = useReadOnly()\n\tconst title = \"Type\"\n\n\tif (breakpoints.length === 0) {\n\t\treturn (\n\t\t\t<PanelRow title={title}>\n\t\t\t\t<Button style={doubleColumn} enabled={!isReadOnly} onClick={() => createBreakpoints(preset)}>\n\t\t\t\t\tAdd Breakpoints\u2026\n\t\t\t\t</Button>\n\t\t\t</PanelRow>\n\t\t)\n\t}\n\n\tfunction showBreakpointContextMenu(event: React.MouseEvent, breakpoint: BreakpointPresetNode | undefined) {\n\t\tconst canAdd = breakpoints.length < stylePresetFallbackWidths.length\n\t\tconst canDelete = breakpoint !== undefined\n\t\tif (!canAdd && !canDelete) return\n\t\tengine.stores.contextMenuStore.show(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Add\",\n\t\t\t\t\tenabled: !isReadOnly,\n\t\t\t\t\tclick() {\n\t\t\t\t\t\tconst newBreakpoint = addBreakpoint(preset, breakpoints)\n\t\t\t\t\t\tonSelect(newBreakpoint.id)\n\t\t\t\t\t},\n\t\t\t\t\tvisible: canAdd,\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Delete\",\n\t\t\t\t\tenabled: !isReadOnly,\n\t\t\t\t\tclick() {\n\t\t\t\t\t\tif (canDelete) {\n\t\t\t\t\t\t\tdeleteBreakpoint(breakpoint)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tvisible: canDelete,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{ location: { x: event.clientX, y: event.clientY } },\n\t\t)\n\t}\n\n\tconst totalBreakpoints = breakpoints.length + 1\n\n\treturn (\n\t\t<PanelRow title={title}>\n\t\t\t<SegmentedControl\n\t\t\t\tstyle={doubleColumn}\n\t\t\t\treadOnly={false}\n\t\t\t\t// It should not be possible to have more than 5 breakpoints but somehow a user got into this state.\n\t\t\t\t// While we don't figure out the cause we just display the breakpoints vertically when there are more than 5.\n\t\t\t\t// Slack thread: https://framer-team.slack.com/archives/C083WMT1ESC/p1741687956711729\n\t\t\t\tdirection={totalBreakpoints > 5 ? \"vertical\" : \"horizontal\"}\n\t\t\t>\n\t\t\t\t<SegmentedControlItem\n\t\t\t\t\ttitle={getBreakpointLabel(0, totalBreakpoints)}\n\t\t\t\t\tidentifier={undefined}\n\t\t\t\t\tselected={selectedId === undefined}\n\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\tonContextMenu={event => showBreakpointContextMenu(event, undefined)}\n\t\t\t\t/>\n\n\t\t\t\t{breakpoints.map((breakpoint, index) => (\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tid={breakpoint.id}\n\t\t\t\t\t\ttitle={getBreakpointLabel(index + 1, totalBreakpoints)}\n\t\t\t\t\t\tkey={breakpoint.id}\n\t\t\t\t\t\tidentifier={breakpoint.id}\n\t\t\t\t\t\tselected={selectedId === breakpoint.id}\n\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\tonContextMenu={event => showBreakpointContextMenu(event, breakpoint)}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</SegmentedControl>\n\t\t</PanelRow>\n\t)\n}\n\nconst createBreakpoints = engine.scheduler.wrapHandler((preset: BreakpointPresetNode) => {\n\tconst listNode = PresetsListNode.ensure(engine.tree)\n\tconst breakpointWidths = getBreakpointWidths(engine)\n\n\tengine.tree.current(preset)?.set({\n\t\tisMaster: true,\n\t\treplicaInfo: null,\n\t\toriginalid: null,\n\t})\n\n\tconst master = engine.tree.current(preset)\n\tassert(master && isMaster(master), \"Master for breakpoint not in tree\")\n\n\tfor (let i = 0; i < breakpointWidths.length; i++) {\n\t\tengine.tree.insertNode(\n\t\t\tTemplateHelper.create(engine.tree, master, {\n\t\t\t\toverrides: {\n\t\t\t\t\t[master.id]: {\n\t\t\t\t\t\tbreakpointWidth: breakpointWidths[i],\n\t\t\t\t\t\tfontSize: scaleStylePresetFontSize(master.fontSize, i),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\tlistNode.id,\n\t\t)\n\t}\n})\n\nconst addBreakpoint = engine.scheduler.wrapHandler(\n\t(preset: BreakpointPresetNode, breakpoints: BreakpointPresetNode[]) => {\n\t\tconst listNode = PresetsListNode.ensure(engine.tree)\n\t\tconst breakpointWidths = getBreakpointWidths(engine)\n\n\t\tengine.tree.current(preset)?.set({\n\t\t\tisMaster: true,\n\t\t\treplicaInfo: null,\n\t\t\toriginalid: null,\n\t\t})\n\n\t\tconst master = engine.tree.current(preset)\n\t\tassert(master && isMaster(master), \"Master for breakpoint not in tree\")\n\n\t\tconst existingSizes = new Set(breakpoints.map(node => node.breakpointWidth ?? 0))\n\t\tconst lastBreakpointWidth = breakpoints[breakpoints.length - 1]?.breakpointWidth\n\t\tconst breakpointWidth = pickStylePresetBreakpointWidth(breakpointWidths, existingSizes, lastBreakpointWidth)\n\n\t\t// Find the smallest breakpoint that is larger than the new breakpoint width.\n\t\tconst prevBreakpoint = [...breakpoints].reverse().find(node => (node.breakpointWidth ?? 0) > breakpointWidth)\n\t\tconst prevFontSize = (prevBreakpoint ?? preset).fontSize\n\n\t\tconst replica = TemplateHelper.create(engine.tree, master, {\n\t\t\toverrides: {\n\t\t\t\t[master.id]: {\n\t\t\t\t\tbreakpointWidth,\n\t\t\t\t\tfontSize: scaleStylePresetFontSize(prevFontSize, 0),\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\n\t\treturn engine.tree.insertNode(replica, listNode.id)\n\t},\n)\n\nconst deleteBreakpoint = engine.scheduler.wrapHandler((breakpoint: BreakpointPresetNode) => {\n\tengine.tree.remove(breakpoint.id)\n})\n", "import { NumberInputWithTicker, NumberInputWithTickerAndStepper, Stepper } from \"@framerjs/fresco\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { WithStylePresetBreakpoint } from \"document/models/CanvasTree/traits/WithStylePresetBreakpoint.ts\"\nimport { PanelRow } from \"../PanelRow.tsx\"\n\ntype BreakpointPresetNode = CanvasNode & WithStylePresetBreakpoint\n\ninterface BreakpointWidthProps {\n\tbreakpoints: BreakpointPresetNode[]\n\tindex: number\n}\n\nexport function StylePresetBreakpointWidthRow({ breakpoints, index }: BreakpointWidthProps) {\n\tconst title = \"Min Width\"\n\n\t// To change the min-width of the breakpoint we need to change the max-width\n\t// of the next breakpoint.\n\tconst breakpoint = breakpoints[index]\n\tconst nextBreakpoint = breakpoints[index + 1]\n\tconst nextNextBreakpoint = breakpoints[index + 2]\n\n\tif (nextBreakpoint === undefined) {\n\t\treturn (\n\t\t\t<PanelRow title={title}>\n\t\t\t\t<NumberInputWithTicker value={0} onChange={noop} enabled={false} />\n\t\t\t\t<Stepper value={0} onChange={noop} min={0} max={0} />\n\t\t\t</PanelRow>\n\t\t)\n\t}\n\n\tconst changeWidth = engine.scheduler.wrapHandler((breakpointWidth: number) => {\n\t\tengine.tree.current(nextBreakpoint)?.set({\n\t\t\tbreakpointWidth,\n\t\t})\n\t})\n\n\tconst value = nextBreakpoint.breakpointWidth ?? 0\n\n\tconst max = (breakpoint?.breakpointWidth ?? Infinity) - 1\n\tconst min = (nextNextBreakpoint?.breakpointWidth ?? 0) + 1\n\n\treturn (\n\t\t<PanelRow title={title}>\n\t\t\t<NumberInputWithTickerAndStepper\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={changeWidth}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={10}\n\t\t\t\tstepperStep={100}\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n}\n", "import { memo } from \"react\"\nimport { CornerShapePanel, type CornerShapePanelProps } from \"./CornerShapePanel.tsx\"\nimport { RadiusPanel, type RadiusPanelProps } from \"./RadiusPanel.tsx\"\n\ninterface Props extends RadiusPanelProps, CornerShapePanelProps {}\n\nexport const CornerPanel = memo(function CornerPanel(props: Props) {\n\treturn (\n\t\t<>\n\t\t\t<RadiusPanel {...props} />\n\t\t\t<CornerShapePanel {...props} />\n\t\t</>\n\t)\n})\n", "import type { CornerShapeUpdateData } from \"@framerjs/events\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { record } from \"web/lib/tracker.ts\"\n\nconst nodeToTimeoutId = new Map<NodeID, ReturnType<typeof setTimeout>>()\nconst delay = 5_000 // We just want the \"final\" value\n\n/** Debounced version of `record(\"corner_shape_update\", ...)`. */\nexport function recordCornerShapeUpdate(node: CanvasNode, data: Data) {\n\tclearTimeout(nodeToTimeoutId.get(node.id))\n\tnodeToTimeoutId.set(node.id, setTimeout(callback, delay, node, data))\n}\n\ntype Data = Omit<CornerShapeUpdateData, \"nodeClass\" | \"nodeId\">\n\nfunction callback(node: CanvasNode, data: Data) {\n\trecord(\"corner_shape_update\", { nodeClass: node.__class, nodeId: node.id, ...data })\n\tnodeToTimeoutId.delete(node.id)\n}\n", "import { NumberInputWithTickerAndStepper } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { recordCornerShapeUpdate } from \"document/components/utils/recordCornerShapeUpdate.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport type { ComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { type DynamicValue, isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport {\n\ttype ReducedCornerShape,\n\tcornerShapeBrowserDefault,\n\tcornerShapeBrowserDefaultPercentage,\n\tcornerShapeDefaults,\n\tcornerShapeOptionalDefaultPercentage,\n\tcornerShapeTitle,\n\tcornerShapeToPercentage,\n\tpercentageToCornerShape,\n\tunknownPercentageToCornerShape,\n\twithCornerShape,\n} from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport { isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { memo, useCallback } from \"react\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { useCopyAndPasteSingleProperty } from \"./utils/useCopyAndPasteSingleProperty.ts\"\n\nconst traitTypes = [TraitType.CornerShape] as const\nconst variableTypes = [ControlType.Number] as const\nconst popoutId = \"corner-shape-popout\"\n\nexport interface CornerShapePanelProps extends ReducedCornerShape {\n\texpandedSelectionForShapeGeometryIds: NodeID[]\n\tshowUnconditionally?: boolean | undefined\n}\n\nexport const CornerShapePanel = memo(function CornerShapePanel({\n\tcornerShape,\n\texpandedSelectionForShapeGeometryIds: nodeIds,\n\tshowUnconditionally,\n}: CornerShapePanelProps) {\n\tconst isSquircleExperimentOn = useExperimentIsOn(\"squircle\")\n\n\tconst copyEnabled = !isMixed(cornerShape)\n\tconst [pasteEnabled, onPaste, onCopy] = useCopyAndPasteSingleProperty(TraitType.CornerShape, nodeIds, copyEnabled)\n\n\tconst onDelete = useEngineCallback((): void => {\n\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withCornerShape)) {\n\t\t\tnode.set(cornerShapeDefaults)\n\t\t\trecord(\"corner_shape_delete\", { nodeClass: node.__class, nodeId: node.id })\n\t\t}\n\t}, [nodeIds])\n\n\tconst onChange = useEngineCallback(\n\t\t(newPercentage: number) => {\n\t\t\tconst newCornerShape = percentageToCornerShape(newPercentage)\n\t\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withCornerShape)) {\n\t\t\t\tnode.set({ cornerShape: newCornerShape })\n\t\t\t\trecordCornerShapeUpdate(node, { value: newCornerShape })\n\t\t\t}\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableReference = createVariableInScope({\n\t\t\t\tinitialValue: cornerShapeToPercentage(isNumber(cornerShape) ? cornerShape : cornerShapeBrowserDefault),\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Number,\n\t\t\t\tname: cornerShapeTitle,\n\t\t\t\toptions: { min: 0, max: 100, unit: \"%\", displayStepper: true },\n\t\t\t})\n\n\t\t\tif (!variableReference) return\n\n\t\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withCornerShape)) {\n\t\t\t\tnode.set({ cornerShape: variableReference })\n\t\t\t\trecord(\"corner_shape_use_variable\", { nodeClass: node.__class, nodeId: node.id })\n\t\t\t}\n\t\t},\n\t\t[cornerShape, nodeIds],\n\t)\n\n\tconst onChangeDynamicValue = useEngineCallback(\n\t\t(dynamicValue: DynamicValue) => {\n\t\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withCornerShape)) {\n\t\t\t\tnode.set({ cornerShape: dynamicValue })\n\t\t\t\trecord(\"corner_shape_use_variable\", { nodeClass: node.__class, nodeId: node.id })\n\t\t\t}\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\tconst onRemoveDynamicValue = useEngineCallback(() => {\n\t\tif (!isDynamicValue(cornerShape)) return\n\n\t\tconst newCornerShape = isVariableReference(cornerShape)\n\t\t\t? (unknownPercentageToCornerShape(getVariableValue(engine, cornerShape)) ?? cornerShapeBrowserDefault)\n\t\t\t: cornerShapeBrowserDefault\n\n\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withCornerShape)) {\n\t\t\tnode.set({ cornerShape: newCornerShape })\n\t\t\trecordCornerShapeUpdate(node, { value: newCornerShape, isDynamicRemoval: true })\n\t\t}\n\t}, [cornerShape, nodeIds])\n\n\tconst onSelectComputedValue = useCallback(\n\t\t(computedValue: ComputedValue) => {\n\t\t\tonChangeDynamicValue(computedValue)\n\t\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t\t},\n\t\t[onChangeDynamicValue],\n\t)\n\n\tif (!isSquircleExperimentOn) return null\n\tif (!isFoundAndNotUndefined(cornerShape) && !showUnconditionally) return null\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={cornerShapeTitle}\n\t\t\ttraitTypes={traitTypes}\n\t\t\tcopyEnabled={copyEnabled}\n\t\t\tonCopy={onCopy}\n\t\t\tpasteEnabled={pasteEnabled}\n\t\t\tonPaste={onPaste}\n\t\t\tonDelete={onDelete}\n\t\t\tsupportsVariables\n\t\t\tsupportsComputedValues\n\t\t\tvariableType={variableTypes}\n\t\t\tdynamicValue={isDynamicValue(cornerShape) ? cornerShape : null}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tcomputedValuePopoutId={popoutId}\n\t\t\tonSelectComputedValue={onSelectComputedValue}\n\t\t>\n\t\t\t{isDynamicValue(cornerShape) ? (\n\t\t\t\t<DynamicValueButton\n\t\t\t\t\ttitle={cornerShapeTitle}\n\t\t\t\t\tvalue={cornerShape}\n\t\t\t\t\tsupportsComputedValues\n\t\t\t\t\texpectedType={variableTypes}\n\t\t\t\t\tonChangeDynamicValue={onChangeDynamicValue}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t\toutputControl={undefined}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<NumberInputWithTickerAndStepper\n\t\t\t\t\tvalue={isNumber(cornerShape) ? cornerShapeToPercentage(cornerShape) : cornerShapeBrowserDefaultPercentage}\n\t\t\t\t\tunit=\"%\"\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={100}\n\t\t\t\t\tdefaultValue={\n\t\t\t\t\t\tshowUnconditionally ? cornerShapeBrowserDefaultPercentage : cornerShapeOptionalDefaultPercentage\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n})\n", "import { dispatchAction } from \"document/components/actions/ActionResponder.tsx\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport type { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport { useMemo } from \"react\"\nimport { canReadClipboardWithoutPromptingUser, isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { Clipboard } from \"utils/clipboard/document.ts\"\nimport { getPasteableTraits } from \"utils/clipboard/helpers/styles.ts\"\nimport { isArray, isBoolean, isUndefined } from \"utils/typeChecks.ts\"\n\nconst canPasteSingleProperty = async (type: TraitType | TraitType[]) => {\n\t// In Safari, we cannot read the clipboard on right-click. So when the menu\n\t// is opened, we cannot know what the clipboard contains. We assume the\n\t// happy flow here, and enable pasting if we cannot read the clipboard, even\n\t// though clicking the Paste action can lead to a noop.\n\tif (!isClipboardSupported()) return false\n\tif (!(await canReadClipboardWithoutPromptingUser())) return true\n\tconst styleData = await Clipboard.getStyleData(undefined)\n\tif (!styleData) return false\n\n\tconst pasteableTraits = getPasteableTraits(styleData.limitToTrait, type)\n\n\t// we only allow pasting if one or more desired trait can be pasted\n\treturn !(isArray(pasteableTraits) && pasteableTraits.length === 0)\n}\n\n// This function cannot be async, because Safari will not allow pasting after\n// waiting for a promise to resolve\nconst pasteSingleProperty = (type: TraitType | TraitType[]) => {\n\tdispatchAction(\"pasteStyle\", { type })\n}\n\nconst copySingleProperty = async (\n\ttype: TraitType | TraitType[],\n\tnodeIds: NodeID[] | undefined,\n\tcanCopy: (() => boolean) | boolean,\n) => {\n\tif (isUndefined(nodeIds)) return\n\tif (isBoolean(canCopy) ? !canCopy : !canCopy()) return\n\tconst node = engine.tree.get(nodeIds[0])\n\tif (!node) return\n\tconst sourceProjectId = engine.stores.projectStore.projectId\n\tawait Clipboard.copyStyle(engine.tree, engine.componentLoader, node, sourceProjectId, type)\n}\n\nexport const useCopyAndPasteSingleProperty = (\n\ttype: TraitType | TraitType[],\n\tnodeIds: NodeID[] | undefined,\n\tcanCopy: (() => boolean) | boolean,\n) => {\n\treturn useMemo(() => {\n\t\tconst canPasteCallback = () => canPasteSingleProperty(type)\n\t\tconst pasteCallback = () => pasteSingleProperty(type)\n\t\tconst copyCallback = () => copySingleProperty(type, nodeIds, canCopy)\n\t\treturn [canPasteCallback, pasteCallback, copyCallback] as const\n\t}, [type, nodeIds, canCopy])\n}\n", "import { AutoSized } from \"@framerjs/fresco/layout-transitions\"\nimport { assert, isMixed, shouldBeNever } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport type { ComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { RelativeOrFourPixelNumberShorthand } from \"document/models/CanvasTree/traits/NumberShorthand.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { cornerShapeDefaults, withCornerShape } from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport type { ReducedRadius, WithRadius, WithRelativeRadius } from \"document/models/CanvasTree/traits/WithRadius.ts\"\nimport {\n\tisOptionalRadiusVisible,\n\tisRadiusOptional,\n\tradiusDefaultsWhenRemoved,\n\trelativeRadiusDefaultsWhenRemoved,\n\twithRadius,\n\twithRelativeRadius,\n} from \"document/models/CanvasTree/traits/WithRadius.ts\"\nimport type {\n\tReducedRadiusPerCorner,\n\tWithRadiusPerCorner,\n} from \"document/models/CanvasTree/traits/WithRadiusPerCorner.ts\"\nimport { radiusPerCornerKeys, withRadiusPerCorner } from \"document/models/CanvasTree/traits/WithRadiusPerCorner.ts\"\nimport { useSupportsVariable } from \"document/models/CanvasTree/traits/utils/reduceEnabledVariableProperties.ts\"\nimport { radiusVariableValueToNodeUpdate } from \"document/models/CanvasTree/utils/getNodeUpdateResolvingDynamicValues.ts\"\nimport { getNodePropertyControlDescription } from \"document/models/CanvasTree/utils/nodePropertyControlDefinitions.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport React, { useCallback } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isNumber, isString } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { SplitInFourInputsRow } from \"../rows/SplitInFourInputsRow.tsx\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { useCopyAndPasteSingleProperty } from \"./utils/useCopyAndPasteSingleProperty.ts\"\n\nconst popoutId = \"radiusValueTransform\"\n\nconst radiusTraitTypes = [TraitType.Radius]\n\nconst variableCreationType = ControlType.BorderRadius\nconst supportedVariableTypes = [ControlType.BorderRadius, ControlType.Number] as const\n\nfunction supportsRadiusPerCorner(node: CanvasNode) {\n\treturn withRadiusPerCorner(node) && (!withRelativeRadius(node) || !node.radiusIsRelative)\n}\n\nfunction nodesWithRadius(nodeIds: NodeID[]): (CanvasNode & WithRadius)[] {\n\treturn engine.tree.getNodesWithTrait(nodeIds, withRadius)\n}\n\nfunction getBorderRadiusShorthandValue(\n\tprops: ReducedRadius & ReducedRadiusPerCorner,\n): RelativeOrFourPixelNumberShorthand {\n\tif (props.radiusPerCorner === true) {\n\t\tconst radiusTopLeft = isNumber(props.radiusTopLeft) ? props.radiusTopLeft : 0\n\t\tconst radiusTopRight = isNumber(props.radiusTopRight) ? props.radiusTopRight : 0\n\t\tconst radiusBottomRight = isNumber(props.radiusBottomRight) ? props.radiusBottomRight : 0\n\t\tconst radiusBottomLeft = isNumber(props.radiusBottomLeft) ? props.radiusBottomLeft : 0\n\t\treturn `${radiusTopLeft}px ${radiusTopRight}px ${radiusBottomRight}px ${radiusBottomLeft}px`\n\t}\n\tif (isString(props.radius)) return props.radius\n\treturn `${isNumber(props.radius) ? props.radius : 0}px`\n}\n\nfunction getRadiusDynamicValueUpdate(\n\tnode: CanvasNode & WithRadius,\n\tdynamicValue: DynamicValue,\n): WithRadius & Partial<WithRelativeRadius & WithRadiusPerCorner> {\n\tconst update: WithRadius & Partial<WithRelativeRadius & WithRadiusPerCorner> = {\n\t\tradius: dynamicValue,\n\t}\n\n\tif (withRelativeRadius(node)) {\n\t\tupdate.radiusIsRelative = false\n\t}\n\tif (withRadiusPerCorner(node)) {\n\t\tupdate.radiusPerCorner = false\n\t}\n\n\treturn update\n}\n\nexport interface RadiusPanelProps extends ReducedRadiusPerCorner, ReducedRadius {\n\texpandedSelectionForShapeGeometryIds: NodeID[]\n\tonlyBreakpointNodes: boolean\n\tonlyRelativeRadiusNodes: boolean\n\tselectionDidChange?: boolean\n}\n\nexport const RadiusPanel = React.memo(function RadiusPanel(props: RadiusPanelProps) {\n\tconst {\n\t\texpandedSelectionForShapeGeometryIds,\n\t\tradius,\n\t\tradiusTopLeft,\n\t\tradiusTopRight,\n\t\tradiusBottomRight,\n\t\tradiusBottomLeft,\n\t\tradiusPerCorner,\n\t\tonlyRelativeRadiusNodes,\n\t\tselectionDidChange,\n\t\tonlyBreakpointNodes,\n\t} = props\n\n\tconst canCopyRadius = useCallback(() => {\n\t\tif (!isClipboardSupported()) return false\n\t\tif (isMixed(radiusPerCorner)) return false\n\n\t\tif (radiusPerCorner === false && isMixed(radius)) return false\n\t\tif (\n\t\t\tradiusPerCorner === true &&\n\t\t\t(isMixed(radiusTopLeft) || isMixed(radiusTopRight) || isMixed(radiusBottomLeft) || isMixed(radiusBottomRight))\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}, [radius, radiusTopLeft, radiusTopRight, radiusBottomLeft, radiusBottomRight, radiusPerCorner])\n\n\tconst [canPasteRadius, pasteRadius, copyRadius] = useCopyAndPasteSingleProperty(\n\t\tTraitType.Radius,\n\t\tprops.expandedSelectionForShapeGeometryIds,\n\t\tcanCopyRadius,\n\t)\n\n\tconst willChange = (_value?: number, rawValue?: string) => {\n\t\tconst nodes = nodesWithRadius(expandedSelectionForShapeGeometryIds)\n\n\t\t// Change the \u201Crelative radius\u201D based on the raw input\n\t\tif (rawValue !== undefined) {\n\t\t\tconst relative = rawValue.trim().slice(-1) === \"%\"\n\t\t\tfor (const node of nodes) {\n\t\t\t\tif (withRelativeRadius(node) && node.radiusIsRelative !== relative) {\n\t\t\t\t\tnode.set({ radiusIsRelative: relative })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst onCreateRadiusVariable = engine.scheduler.wrapHandler((scopeId: NodeID) => {\n\t\tconst variableRef = createVariableInScope({\n\t\t\tengine,\n\t\t\tscopeId,\n\t\t\ttype: ControlType.BorderRadius,\n\t\t\tname: \"radius\",\n\t\t\tinitialValue: getBorderRadiusShorthandValue(props),\n\t\t})\n\n\t\tif (variableRef) {\n\t\t\tconst nodes = nodesWithRadius(expandedSelectionForShapeGeometryIds)\n\t\t\tnodes.forEach(node => {\n\t\t\t\tnode.set(getRadiusDynamicValueUpdate(node, variableRef))\n\t\t\t})\n\t\t}\n\t})\n\n\tconst onRemoveDynamicValue = engine.scheduler.wrapHandler(() => {\n\t\tconst { radius } = props\n\t\tif (!isDynamicValue(radius)) return\n\n\t\tconst nodes = nodesWithRadius(expandedSelectionForShapeGeometryIds)\n\t\tif (isVariableReference(radius)) {\n\t\t\tconst variableValue = getVariableValue(engine, radius)\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst update = radiusVariableValueToNodeUpdate(node, variableValue)\n\t\t\t\tif (update) node.set(update)\n\t\t\t}\n\t\t} else if (isComputedValue(radius)) {\n\t\t\tnodes.forEach(node => node.set({ radius: 0 }))\n\t\t} else {\n\t\t\tshouldBeNever(radius)\n\t\t}\n\t})\n\n\tconst onChangeDynamicValue = engine.scheduler.wrapHandler((dynamicValue: DynamicValue) => {\n\t\tconst nodes = nodesWithRadius(expandedSelectionForShapeGeometryIds)\n\t\tnodes.forEach(node => {\n\t\t\tnode.set(getRadiusDynamicValueUpdate(node, dynamicValue))\n\t\t})\n\t})\n\n\tconst onSelectComputedValue = (computedValue: ComputedValue) => {\n\t\tonChangeDynamicValue(computedValue)\n\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t}\n\n\tconst hideOptionalRadius = engine.scheduler.wrapHandler(() => {\n\t\tassert(isRadiusOptional(props.radius, props.onlyBreakpointNodes), \"Radius should be optional to allow to be hidden\")\n\n\t\tfor (const node of nodesWithRadius(expandedSelectionForShapeGeometryIds)) {\n\t\t\tnode.set(radiusDefaultsWhenRemoved)\n\t\t\tif (withRelativeRadius(node)) node.set(relativeRadiusDefaultsWhenRemoved)\n\t\t\tif (withRadiusPerCorner(node)) node.set({ radiusPerCorner: false })\n\t\t\tif (withCornerShape(node)) {\n\t\t\t\tnode.set(cornerShapeDefaults)\n\t\t\t\trecord(\"corner_shape_delete\", { nodeClass: node.__class, nodeId: node.id, isViaRadius: true })\n\t\t\t}\n\t\t}\n\t})\n\n\tconst supportsVariables = useSupportsVariable(\"radius\")\n\tconst hasOptionalRadius = isRadiusOptional(radius, onlyBreakpointNodes)\n\tif (hasOptionalRadius && !isOptionalRadiusVisible(radius, radiusPerCorner)) {\n\t\treturn null\n\t}\n\n\t// 0: we use the main input\n\t// 1: we use the four number inputs\n\t// -1: indeterminate, some nodes use main other four separate values\n\tlet segmentedIndex = -1\n\n\tif (onlyRelativeRadiusNodes) {\n\t\t// Relative radius overrides radiusPerCorner, so select main input\n\t\tsegmentedIndex = 0\n\t} else {\n\t\tswitch (radiusPerCorner) {\n\t\t\tcase false:\n\t\t\t\tsegmentedIndex = 0\n\t\t\t\tbreak\n\t\t\tcase true:\n\t\t\t\tsegmentedIndex = 1\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tif (isDynamicValue(radius)) {\n\t\treturn (\n\t\t\t<PanelRow\n\t\t\t\ttitle=\"Radius\"\n\t\t\t\ttraitTypes={radiusTraitTypes}\n\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\t\tcomputedValuePopoutId={popoutId}\n\t\t\t\tvariableType={supportedVariableTypes}\n\t\t\t\tvariableCreationType={variableCreationType}\n\t\t\t\tonCreateVariable={onCreateRadiusVariable}\n\t\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\t\tonSelectComputedValue={onSelectComputedValue}\n\t\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\t\tdynamicValue={isDynamicValue(radius) ? radius : null}\n\t\t\t>\n\t\t\t\t<DynamicValueButton\n\t\t\t\t\ttitle=\"Radius\"\n\t\t\t\t\tvalue={radius}\n\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\t\t\texpectedType={supportedVariableTypes}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t\tonChangeDynamicValue={onChangeDynamicValue}\n\t\t\t\t\toutputControl={getNodePropertyControlDescription(\"radius\")}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t)\n\t}\n\n\treturn (\n\t\t<AutoSized animationEnabled={!selectionDidChange} dependencies={segmentedIndex}>\n\t\t\t<SplitInFourInputsRow\n\t\t\t\ttitle=\"Radius\"\n\t\t\t\tmainValue={radius}\n\t\t\t\tmainDefaultValue={0}\n\t\t\t\tsegmentedControlIndex={segmentedIndex}\n\t\t\t\tfusedValues={[radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft]}\n\t\t\t\tfusedDefaultValues={[0, 0, 0, 0]}\n\t\t\t\tnodeIds={expandedSelectionForShapeGeometryIds}\n\t\t\t\tsplitInFourKey=\"radiusPerCorner\"\n\t\t\t\tmainProperty=\"radius\"\n\t\t\t\tfusedProperties={radiusPerCornerKeys}\n\t\t\t\ticonType=\"radius\"\n\t\t\t\tfusedLabels={[\"tl\", \"tr\", \"br\", \"bl\"]}\n\t\t\t\tmainTraitFilter={withRadius}\n\t\t\t\tfusedTraitFilter={supportsRadiusPerCorner}\n\t\t\t\ttoggleTitles={[\"Radius\", \"Radius per corner\"]}\n\t\t\t\twillChange={willChange}\n\t\t\t\tminValue={0}\n\t\t\t\tstep=\"nudge\"\n\t\t\t\tmaxValue={onlyRelativeRadiusNodes ? 50 : undefined}\n\t\t\t\ttraitTypes={radiusTraitTypes}\n\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\t\tcomputedValuePopoutId={popoutId}\n\t\t\t\tvariableType={supportedVariableTypes}\n\t\t\t\tvariableCreationType={variableCreationType}\n\t\t\t\tonCreateVariable={onCreateRadiusVariable}\n\t\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\t\tonSelectComputedValue={onSelectComputedValue}\n\t\t\t\tdynamicValue={isDynamicValue(radius) ? radius : null}\n\t\t\t\tonDelete={hasOptionalRadius ? hideOptionalRadius : undefined}\n\t\t\t\tonCopy={copyRadius}\n\t\t\t\tonPaste={pasteRadius}\n\t\t\t\tcopyEnabled={canCopyRadius}\n\t\t\t\tpasteEnabled={canPasteRadius}\n\t\t\t/>\n\t\t</AutoSized>\n\t)\n})\n", "import type { NumberInputProps } from \"@framerjs/fresco\"\nimport {\n\tIconBorderAll,\n\tIconBorderDivided,\n\tIconRadiusAll,\n\tIconRadiusDivided,\n\tNumberInputWithTicker,\n\tSegmentedControl,\n\tSegmentedControlItem,\n\tSlider,\n} from \"@framerjs/fresco\"\nimport { assert, assertNever } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { OptionalToUndefined } from \"document/models/CanvasTree/traits/utils/OptionalToUndefined.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { notFoundToUndefined } from \"document/models/CanvasTree/traits/utils/notFoundToUndefined.ts\"\nimport { default as React } from \"react\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { FusedNumberInputs } from \"../inputs/FusedNumberInputs.tsx\"\nimport type { VariableAssignmentOptions } from \"../utils/useDisplayVariableAssignmentOptions.ts\"\nimport type { PanelRowResetReplicaOverridesOptions } from \"./PanelRow.tsx\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ntype Props = PanelRowResetReplicaOverridesOptions &\n\tVariableAssignmentOptions & {\n\t\tmainValue: Reduced<number | string | undefined>\n\t\tmainDefaultValue?: number\n\t\tsegmentedControlIndex: number\n\t\tfusedValues: [\n\t\t\tReduced<number | undefined>,\n\t\t\tReduced<number | undefined>,\n\t\t\tReduced<number | undefined>,\n\t\t\tReduced<number | undefined>,\n\t\t]\n\t\tfusedDefaultValues?: readonly [number | undefined, number | undefined, number | undefined, number | undefined]\n\t\ttestId?: string\n\t\tsortable?: boolean\n\n\t\tnodeIds: NodeID[]\n\t\tmainProperty: string\n\t\tfusedProperties: readonly [string, string, string, string]\n\t\tmainInputId?: string\n\t\tfusedInputIds?: readonly [string, string, string, string]\n\t\tsplitInFourKey: string\n\n\t\ticonType: \"border\" | \"radius\"\n\n\t\tfusedLabels: readonly [string, string, string, string]\n\t\ttitle?: string\n\t\tmainTraitFilter: (node: CanvasNode) => boolean\n\t\tfusedTraitFilter: (node: CanvasNode) => boolean\n\t\ttoggleTitles: string[]\n\n\t\tminValue?: number\n\t\tmaxValue?: number\n\t\tstep?: NumberInputProps[\"step\"]\n\n\t\tonContextMenu?: (event: React.MouseEvent<HTMLElement>) => void\n\n\t\twillChange?: (value?: number, rawValue?: string) => void\n\t\tonChange?: (value: object) => void\n\t\tonDelete?: () => void\n\t\tpasteEnabled?: () => Promise<boolean>\n\t\tonPaste?: () => void\n\t\tonCopy?: () => void\n\t\tcopyEnabled?: () => boolean\n\t}\n\ninterface State {\n\tfusedActiveIndex: number\n}\n\nexport class SplitInFourInputsRow extends React.PureComponent<Props, State> {\n\tprivate mainInputRef = React.createRef<HTMLInputElement>()\n\tprivate fusedNumberInputRef = React.createRef<FusedNumberInputs>()\n\tprivate shouldFocusCorrespondingInput = false\n\n\toverride state = { fusedActiveIndex: -1 }\n\n\t// Lifecycle\n\n\toverride componentDidUpdate(prevProps: Props) {\n\t\tif (!this.shouldFocusCorrespondingInput) return\n\t\tthis.shouldFocusCorrespondingInput = false\n\n\t\tconst prevIndex = prevProps.segmentedControlIndex\n\t\tconst currentIndex = this.props.segmentedControlIndex\n\n\t\tif (prevIndex !== currentIndex && prevProps.nodeIds === this.props.nodeIds) {\n\t\t\tif (currentIndex === 0 && this.mainInputRef.current) {\n\t\t\t\tthis.mainInputRef.current.focus()\n\t\t\t}\n\t\t\tif (currentIndex === 1 && this.fusedNumberInputRef.current) {\n\t\t\t\tthis.fusedNumberInputRef.current.focus()\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tconst {\n\t\t\ttitle,\n\t\t\tonContextMenu,\n\t\t\ticonType,\n\t\t\tmainValue,\n\t\t\tsegmentedControlIndex,\n\t\t\tfusedLabels,\n\t\t\tfusedValues,\n\t\t\ttoggleTitles,\n\t\t\tstep,\n\t\t\tminValue,\n\t\t\tmaxValue,\n\t\t\tmainDefaultValue,\n\t\t\tfusedDefaultValues,\n\t\t\ttraitTypes,\n\t\t\ttraitTypeKeys,\n\t\t\ttestId,\n\t\t\tsortable,\n\t\t\tsupportsVariables,\n\t\t\tvariableType,\n\t\t\tvariableCreationType,\n\t\t\tdynamicValue,\n\t\t\tonCreateVariable,\n\t\t\tonRemoveDynamicValue,\n\t\t\tonSelectVariable,\n\t\t\tsupportsComputedValues,\n\t\t\tonSelectComputedValue,\n\t\t\tonDelete,\n\t\t\tonCopy,\n\t\t\tonPaste,\n\t\t\tcopyEnabled,\n\t\t\tpasteEnabled,\n\t\t\tmainInputId,\n\t\t\tfusedInputIds,\n\t\t} = this.props\n\t\tif (isNotFound(mainValue)) return null\n\t\tconst resetOverrideProps = {\n\t\t\ttraitTypes,\n\t\t\ttraitTypeKeys,\n\t\t}\n\n\t\t// This is some unfortunate complexity but it makes sure that these properties stay in sync with VariableAssignmentOptions\n\t\tconst variableProps: OptionalToUndefined<\n\t\t\tPartial<\n\t\t\t\tOmit<\n\t\t\t\t\tVariableAssignmentOptions,\n\t\t\t\t\t| \"variableReferenceType\"\n\t\t\t\t\t| \"collectionReferenceDataIdentifier\"\n\t\t\t\t\t| \"vectorSetIdentifier\"\n\t\t\t\t\t| \"controlSourceIdentifier\"\n\t\t\t\t\t| \"controlKey\"\n\t\t\t\t\t| \"allowedFileTypes\"\n\t\t\t\t\t| \"displayTransformOptions\"\n\t\t\t\t\t| \"computedValuePopoutId\"\n\t\t\t\t\t| \"variableFilter\"\n\t\t\t\t>\n\t\t\t>\n\t\t> = {\n\t\t\tsupportsVariables,\n\t\t\tvariableType,\n\t\t\tvariableCreationType,\n\t\t\tdynamicValue,\n\t\t\tonCreateVariable,\n\t\t\tonRemoveDynamicValue,\n\t\t\tonSelectVariable,\n\t\t\tsupportsComputedValues,\n\t\t\tonSelectComputedValue,\n\t\t}\n\n\t\tconst valueForSlider = typeof mainValue === \"string\" ? parseFloat(mainValue) : mainValue\n\n\t\tconst segmentedControlVisible = this.shouldDisplaySegmentedControl(this.props)\n\t\tconst shouldDisplayMainValue = !segmentedControlVisible || segmentedControlIndex === 0\n\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<PanelRow\n\t\t\t\t\ttitle={sortable ? undefined : title}\n\t\t\t\t\tonContextMenu={onContextMenu}\n\t\t\t\t\tonCopy={onCopy}\n\t\t\t\t\tonPaste={onPaste}\n\t\t\t\t\tcopyEnabled={copyEnabled}\n\t\t\t\t\tpasteEnabled={pasteEnabled}\n\t\t\t\t\twithReorderControl={sortable}\n\t\t\t\t\treorderColumnCount={sortable ? 2 : undefined}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\t{...(variableProps as VariableAssignmentOptions)}\n\t\t\t\t\t{...resetOverrideProps}\n\t\t\t\t>\n\t\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\t\tvalue={shouldDisplayMainValue ? notFoundToUndefined(mainValue) : undefined}\n\t\t\t\t\t\tonChange={this.onMainInputChange}\n\t\t\t\t\t\tmin={minValue}\n\t\t\t\t\t\tmax={maxValue}\n\t\t\t\t\t\tref={this.mainInputRef}\n\t\t\t\t\t\tid={mainInputId}\n\t\t\t\t\t\tdefaultValue={mainDefaultValue}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tdata-testid={testId ? `${testId}-main-input` : undefined}\n\t\t\t\t\t/>\n\t\t\t\t\t{segmentedControlVisible ? (\n\t\t\t\t\t\t<SegmentedControl>\n\t\t\t\t\t\t\t{toggleTitles.map((toggleTitle, idx) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\t\t\tkey={idx}\n\t\t\t\t\t\t\t\t\t\tidentifier={idx}\n\t\t\t\t\t\t\t\t\t\ttitle={toggleTitle}\n\t\t\t\t\t\t\t\t\t\tselected={segmentedControlIndex === idx}\n\t\t\t\t\t\t\t\t\t\tonSelect={this.onSegmentedSelect}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SplitIntoFourInputsSegmentIcon\n\t\t\t\t\t\t\t\t\t\t\ticonType={iconType}\n\t\t\t\t\t\t\t\t\t\t\tsegmentType={idx === 0 ? \"all\" : \"split\"}\n\t\t\t\t\t\t\t\t\t\t\tactiveBorderIdx={this.state.fusedActiveIndex}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</SegmentedControl>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Slider\n\t\t\t\t\t\t\tvalue={segmentedControlIndex !== 1 ? notFoundToUndefined(valueForSlider) : undefined}\n\t\t\t\t\t\t\tonChange={this.onMainInputChange}\n\t\t\t\t\t\t\tmin={minValue}\n\t\t\t\t\t\t\tmax={maxValue}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</PanelRow>\n\t\t\t\t{segmentedControlVisible && segmentedControlIndex === 1 && (\n\t\t\t\t\t<PanelRow\n\t\t\t\t\t\tonContextMenu={onContextMenu}\n\t\t\t\t\t\ttitle={sortable ? undefined : \" \"}\n\t\t\t\t\t\twithReorderControl={sortable}\n\t\t\t\t\t\treorderControlHidden\n\t\t\t\t\t>\n\t\t\t\t\t\t<FusedNumberInputs\n\t\t\t\t\t\t\tref={this.fusedNumberInputRef}\n\t\t\t\t\t\t\tvalues={fusedValues}\n\t\t\t\t\t\t\tminValue={minValue}\n\t\t\t\t\t\t\tonValueChange={this.onFusedInputChange}\n\t\t\t\t\t\t\tonFocusChange={this.onFusedFocusChange}\n\t\t\t\t\t\t\tdefaultValues={fusedDefaultValues}\n\t\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\t\tdoubleColumn={!sortable}\n\t\t\t\t\t\t\tids={fusedInputIds}\n\t\t\t\t\t\t\tlabels={fusedLabels}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Events\n\n\tonSegmentedSelect = engine.scheduler.wrapHandler((index: number) => {\n\t\tthis.shouldFocusCorrespondingInput = true\n\t\tconst { fusedTraitFilter, onChange } = this.props\n\t\tlet nodes = this.nodes()\n\t\tif (fusedTraitFilter) {\n\t\t\tnodes = nodes.filter(node => {\n\t\t\t\treturn fusedTraitFilter(node)\n\t\t\t})\n\t\t}\n\t\tconst update = { [this.props.splitInFourKey]: index !== 0 }\n\t\tif (onChange) {\n\t\t\tonChange(update)\n\t\t} else {\n\t\t\tnodes.forEach(node => node.set(update))\n\t\t}\n\t})\n\n\tonMainInputChange = engine.scheduler.wrapHandler((value: number, rawValue?: string) => {\n\t\tconst {\n\t\t\tmainProperty,\n\t\t\tfusedProperties,\n\t\t\tsplitInFourKey,\n\t\t\tfusedTraitFilter,\n\t\t\twillChange,\n\t\t\tonChange,\n\t\t\tfusedValues,\n\t\t\tmainValue,\n\t\t} = this.props\n\n\t\tif (willChange) {\n\t\t\twillChange(value, rawValue)\n\t\t}\n\n\t\tif (onChange) {\n\t\t\tconst update = {\n\t\t\t\t[mainProperty]: value,\n\t\t\t\t[splitInFourKey]: false,\n\t\t\t}\n\t\t\tcollectFusedNumbersIfAllEqualToMainValue(fusedValues, mainValue, fusedProperties, value, update)\n\t\t\tonChange(update)\n\t\t} else {\n\t\t\tthis.nodes().forEach(node => {\n\t\t\t\tconst update: Record<string, unknown> = {}\n\n\t\t\t\tconst parsedFusedValues = parseShorthandString(rawValue ?? \"\")\n\n\t\t\t\tif (parsedFusedValues && fusedProperties.length === 4) {\n\t\t\t\t\tupdate[splitInFourKey] = true\n\n\t\t\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\t\t\tconst property = fusedProperties[i]\n\t\t\t\t\t\tassert(property, \"property should exist in fusedProperties\")\n\t\t\t\t\t\tupdate[property] = parsedFusedValues[i]\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tupdate[mainProperty] = value\n\n\t\t\t\t\tif (fusedTraitFilter(node)) {\n\t\t\t\t\t\tupdate[splitInFourKey] = false\n\n\t\t\t\t\t\tconst fourValues: Reduced<number | undefined>[] = fusedProperties.map(\n\t\t\t\t\t\t\tproperty => node[property as keyof typeof node] as Reduced<number | undefined>,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcollectFusedNumbersIfAllEqualToMainValue(\n\t\t\t\t\t\t\tfourValues,\n\t\t\t\t\t\t\tnode[mainProperty as keyof typeof node] as Reduced<number | undefined>,\n\t\t\t\t\t\t\tfusedProperties,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\tupdate,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// TODO: Should not fuse when relative\n\t\t\t\tnode.set(update)\n\t\t\t})\n\t\t}\n\t})\n\n\tonFusedInputChange = engine.scheduler.wrapHandler((index: number, value: number) => {\n\t\tconst { fusedProperties, willChange, onChange } = this.props\n\t\tconst property = fusedProperties[index]\n\t\tassert(property, \"property should exist in fusedProperties\")\n\n\t\tif (willChange) {\n\t\t\twillChange()\n\t\t}\n\n\t\tconst update = {\n\t\t\t[property]: value,\n\t\t}\n\n\t\tif (onChange) {\n\t\t\tonChange(update)\n\t\t} else {\n\t\t\tconst nodes = engine.tree.getNodes(this.nodeIds())\n\t\t\tnodes.forEach(node => node.set(update))\n\t\t}\n\t})\n\n\tonFusedFocusChange = (index: number) => {\n\t\tthis.setState({ fusedActiveIndex: index })\n\t}\n\n\t// Helpers\n\n\tnodes = (props?: Props): CanvasNode[] => {\n\t\tlet nodesToFilter: NodeID[] = this.props.nodeIds\n\n\t\tif (props !== undefined) {\n\t\t\tnodesToFilter = props.nodeIds\n\t\t}\n\n\t\t// TODO: use trait\n\t\tconst { mainTraitFilter } = props !== undefined ? props : this.props\n\t\tconst nodes = engine.tree.getNodes(nodesToFilter)\n\t\treturn mainTraitFilter ? nodes.filter(mainTraitFilter) : nodes\n\t}\n\n\tshouldDisplaySegmentedControl = (props?: Props): boolean => {\n\t\tconst { fusedTraitFilter } = props !== undefined ? props : this.props\n\t\tconst nodes = this.nodes(props)\n\t\treturn fusedTraitFilter ? nodes.filter(fusedTraitFilter).length === nodes.length : true\n\t}\n\n\tnodeIds = (): NodeID[] => {\n\t\treturn this.nodes().map(node => {\n\t\t\treturn node.id\n\t\t})\n\t}\n}\n\nconst collectFusedNumbersIfAllEqualToMainValue = (\n\tfourValues: Reduced<number | undefined>[],\n\tmainValue: Props[\"mainValue\"],\n\tfusedProperties: readonly string[],\n\tvalue: number,\n\tupdate: Record<string, unknown>,\n) => {\n\tconst uniqueCommonValue = commonValue([...fourValues, mainValue])\n\n\t// Also update the individual values but only if they\u2019re exactly the same as the main value\n\tif (!isNumber(uniqueCommonValue)) return\n\tfusedProperties.forEach(property => {\n\t\tupdate[property] = value\n\t})\n}\n\nconst hasNonDigitCharsRegex = /\\D/\n\nfunction parseShorthandString(string: string) {\n\tconst values = string.split(\" \")\n\tconst numbers: number[] = []\n\n\tfor (const value of values) {\n\t\t// Math expression like \"1 + 2\" should not be parsed\n\t\tif (hasNonDigitCharsRegex.test(value) || value === \"\") return\n\n\t\tconst number = parseFloat(value)\n\t\tnumbers.push(number)\n\t}\n\n\tif (numbers.length === 2) {\n\t\treturn [...numbers, ...numbers]\n\t}\n\n\tif (numbers.length === 3) {\n\t\tconst left = numbers[1]\n\t\treturn [...numbers, left]\n\t}\n\n\tif (numbers.length === 4) {\n\t\treturn numbers\n\t}\n}\n\ninterface SplitIntoFourInputsSegmentIconProps {\n\ticonType: \"border\" | \"radius\"\n\tsegmentType: \"all\" | \"split\"\n\tactiveBorderIdx: number\n}\nexport function SplitIntoFourInputsSegmentIcon({\n\ticonType,\n\tsegmentType,\n\tactiveBorderIdx,\n}: SplitIntoFourInputsSegmentIconProps) {\n\tswitch (segmentType) {\n\t\tcase \"all\":\n\t\t\tswitch (iconType) {\n\t\t\t\tcase \"border\":\n\t\t\t\t\treturn <IconBorderAll />\n\t\t\t\tcase \"radius\":\n\t\t\t\t\treturn <IconRadiusAll />\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(iconType)\n\t\t\t}\n\t\t\tbreak\n\t\tcase \"split\":\n\t\t\tswitch (iconType) {\n\t\t\t\tcase \"border\":\n\t\t\t\t\treturn <IconBorderDivided activeBorder={activeBorderIdx} />\n\t\t\t\tcase \"radius\":\n\t\t\t\t\treturn <IconRadiusDivided activeBorder={activeBorderIdx} />\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(iconType)\n\t\t\t}\n\t\t\tbreak\n\t\tdefault:\n\t\t\tassertNever(segmentType)\n\t}\n}\n", "import type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { WithCornerShape } from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport type { RadiusValue, WithRelativeRadius } from \"document/models/CanvasTree/traits/WithRadius.ts\"\nimport type { WithRadiusPerCorner } from \"document/models/CanvasTree/traits/WithRadiusPerCorner.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { CornerPanel } from \"../../panels/CornerPanel.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithRelativeRadius & WithRadiusPerCorner & WithCornerShape\n}\n\nexport function StylePresetCornerRows({ preset }: Props) {\n\tconst radiusForDisplay: RadiusValue =\n\t\tpreset.radiusIsRelative && isNumber(preset.radius) ? `${preset.radius}%` : preset.radius\n\n\treturn (\n\t\t<CornerPanel\n\t\t\texpandedSelectionForShapeGeometryIds={[preset.id]}\n\t\t\tonlyBreakpointNodes={false}\n\t\t\tonlyRelativeRadiusNodes={preset.radiusIsRelative}\n\t\t\tradius={radiusForDisplay}\n\t\t\tradiusTopLeft={preset.radiusTopLeft}\n\t\t\tradiusTopRight={preset.radiusTopRight}\n\t\t\tradiusBottomRight={preset.radiusBottomRight}\n\t\t\tradiusBottomLeft={preset.radiusBottomLeft}\n\t\t\tradiusPerCorner={preset.radiusPerCorner}\n\t\t\tcornerShape={preset.cornerShape}\n\t\t\tshowUnconditionally\n\t\t/>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { WithOptionalFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { getReducedAltTextDefaults, reduceAltText } from \"document/models/CanvasTree/traits/utils/reduceAltText.ts\"\nimport { getReducedFillDefaults, reduceFill } from \"document/models/CanvasTree/traits/utils/reduceFill.ts\"\nimport { useMemo } from \"react\"\nimport { FillPanel } from \"../../panels/FillPanel.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithOptionalFill\n}\n\nexport function StylePresetFillRow({ preset }: Props) {\n\tconst reducedProps = useMemo(() => {\n\t\tconst result = { ...getReducedFillDefaults(), ...getReducedAltTextDefaults() }\n\t\treduceFill(engine.tree, preset, result)\n\t\treduceAltText(preset, result)\n\n\t\treturn result\n\t}, [preset])\n\n\treturn (\n\t\t<FillPanel\n\t\t\t{...reducedProps}\n\t\t\tnodeIds={[preset.id]}\n\t\t\texpandedSelectionForShapeStylesIds={[preset.id]}\n\t\t\tonlyFrameNodes={false}\n\t\t\tonlyNodesSupportingConicGradient={true}\n\t\t\tonlyNodesSupportingImageFill={false}\n\t\t\tscopeType={null}\n\t\t\tonlyNodesSupportingFillImageAlts={false}\n\t\t/>\n\t)\n}\n", "import type { AssetSize } from \"@framerjs/assets\"\nimport { isAssetReference, updateAssetReferencePreferredSize } from \"@framerjs/assets\"\nimport { Stack } from \"@framerjs/fresco\"\nimport { assert, List, assertNever, isMixed, shouldBeNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { PanelRow } from \"document/components/chrome/properties/rows/PanelRow.tsx\"\nimport { normalizeGradientStopPositions } from \"document/components/tools/gradient/utils.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { isFrameNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { ComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport {\n\tcreateComputedValue,\n\tisComputedValue,\n\tisComputedValueFromFetchData,\n} from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { createFetchDataValue } from \"document/models/CanvasTree/traits/FetchDataValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { withAltText } from \"document/models/CanvasTree/traits/WithAltText.ts\"\nimport type {\n\tFillImagePositionX,\n\tFillImagePositionY,\n\tFillType,\n\tWithFill,\n} from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { isGradientFillType, withFill, withOptionalFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { type WithSize, withSize } from \"document/models/CanvasTree/traits/WithSize.ts\"\nimport {\n\ttype WithSizeDimensionType,\n\twithSizeDimensionType,\n} from \"document/models/CanvasTree/traits/WithSizeDimensionType.ts\"\nimport type { VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { isFoundAndNotMixed } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { ReducedAltText } from \"document/models/CanvasTree/traits/utils/reduceAltText.ts\"\nimport { useSupportsVariable } from \"document/models/CanvasTree/traits/utils/reduceEnabledVariableProperties.ts\"\nimport type { ReducedFill } from \"document/models/CanvasTree/traits/utils/reduceFill.ts\"\nimport { getFrameFillColor } from \"document/models/CanvasTree/utils/getFrameFillColor.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport {\n\tConicGradient,\n\tconicGradientUpdate,\n\tgradientFillType,\n\tisGradient,\n\tlinearGradientUpdate,\n\tradialGradientUpdate,\n} from \"document/models/Gradient.ts\"\nimport type { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { LinearGradient } from \"document/models/LinearGradientClass.ts\"\nimport { RadialGradient } from \"document/models/RadialGradientClass.ts\"\nimport type { ImageControlProp } from \"document/models/controlProps/ControlProp.ts\"\nimport { Tools } from \"document/stores/ToolEnum.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { DimensionType } from \"library/index.ts\"\nimport type { ImageFit } from \"library/render/types/BackgroundImage.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { isRelativeNumber } from \"library/render/types/RelativeNumber.ts\"\nimport React, { useCallback } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { isShallowEqual } from \"utils/isShallowEqual.ts\"\nimport { isBoolean, isString } from \"utils/typeChecks.ts\"\nimport { fileFromURL } from \"web/lib/fileFromURL.ts\"\nimport type { ImageUploadResultWithOptionalAssetSize } from \"web/pages/project/lib/UploadService.ts\"\nimport { uploadService } from \"web/pages/project/lib/UploadService.ts\"\nimport type { ColorPickerTab } from \"../../shared/ColorPicker/ColorPickerFillTypeTabs.tsx\"\nimport {\n\tcolorPickerFillTypeTabsWithoutConic,\n\tcolorPickerFillTypeTabsWithoutImage,\n\tcolorPickerFillTypeTabsWithoutImageAndConic,\n} from \"../../shared/ColorPicker/ColorPickerFillTypeTabs.tsx\"\nimport { FillPopoutButton } from \"../../shared/ColorPicker/FillPopoutButton.tsx\"\nimport { trackingMetadata } from \"../../shared/ColorPicker/trackingMetadata.tsx\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { PopoutNavigationId } from \"../../shared/PopoutNavigationId.ts\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport type {\n\tTilingBackgroundPatternPreset,\n\tTilingBackgroundPatternPresetName,\n} from \"../rows/FillImagePatternPresetsRow/presetOptions.ts\"\nimport { FillImagePositionRow } from \"../rows/FillImagePositionRow.tsx\"\nimport { FillImageResizeRow } from \"../rows/FillImageResizeRow.tsx\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport type { FillUpdate } from \"../utils/imageFill.ts\"\nimport { applyImageFillToNode } from \"../utils/imageFill.ts\"\nimport { regenerateModulesForFitImage } from \"../utils/regenerateModulesForFitImage.ts\"\nimport { FillImageAltRows } from \"./FillImageAltRows.tsx\"\nimport { addFillForNodes } from \"./utils/addFillForNodes.ts\"\nimport { getDefaultGradientStops } from \"./utils/getDefaultGradientStops.ts\"\nimport { PanelElementId } from \"./utils/highlightPanel.ts\"\nimport { useCopyAndPasteSingleProperty } from \"./utils/useCopyAndPasteSingleProperty.ts\"\n\nconst popoutId = PopoutNavigationId.FillValueTransform\n\nconst fillTraitTypes = [TraitType.Fill]\nconst colorAndImageFillVariableTypes: readonly VariableType[] = [ControlType.Color, ControlType.Image]\nconst tool = Tools.FillGradient\n\ninterface Props extends ReducedAltText, Omit<ReducedFill, \"anyNodesWithImageFill\"> {\n\texpandedSelectionForShapeStylesIds: NodeID[]\n\tonlyFrameNodes: boolean\n\tonlyNodesSupportingConicGradient: boolean\n\tonlyNodesSupportingImageFill: boolean\n\tonlyNodesSupportingFillImageAlts: boolean\n\tscopeType: ScopeType | null\n\tnodeIds: NodeID[]\n}\n\nexport const FillPanel = React.memo(function FillPanel(props: Props) {\n\tconst {\n\t\tfillEnabled,\n\t\tfillType,\n\t\tfillColor,\n\t\tfillImage,\n\t\tfillGradientCSS,\n\t\tfillImagePositionX,\n\t\tfillImagePositionY,\n\t\tfillImageTileSize,\n\t} = props\n\n\tconst canCopyFill = useCallback(() => {\n\t\tif (!isClipboardSupported()) return false\n\t\tif (!isBoolean(fillEnabled) || !fillEnabled) return false\n\t\tif (isMixed(fillType) || isMixed(fillColor) || isMixed(fillImage) || isMixed(fillGradientCSS)) return false\n\t\treturn true\n\t}, [fillColor, fillEnabled, fillImage, fillType, fillGradientCSS])\n\n\tconst [canPasteFill, pasteFill, copyFill] = useCopyAndPasteSingleProperty(\n\t\tTraitType.Fill,\n\t\tprops.expandedSelectionForShapeStylesIds,\n\t\tcanCopyFill,\n\t)\n\tconst supportsVariables = useSupportsVariable(\"fillColor\")\n\n\treturn (\n\t\t<FillPanelInner\n\t\t\tnodeIds={props.nodeIds}\n\t\t\tcanPasteFill={canPasteFill}\n\t\t\tpasteFill={pasteFill}\n\t\t\tcopyFill={copyFill}\n\t\t\tcanCopyFill={canCopyFill}\n\t\t\texpandedSelectionForShapeStylesIds={props.expandedSelectionForShapeStylesIds}\n\t\t\tanyNodesWithFill={props.anyNodesWithFill}\n\t\t\tanyNodeWithNonOptionalFill={props.anyNodeWithNonOptionalFill}\n\t\t\tonlyNodesSupportingImageFill={props.onlyNodesSupportingImageFill}\n\t\t\tonlyFrameNodes={props.onlyFrameNodes}\n\t\t\tonlyNodesSupportingConicGradient={props.onlyNodesSupportingConicGradient}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tfillColor={props.fillColor}\n\t\t\tfillEnabled={props.fillEnabled}\n\t\t\tfillType={props.fillType}\n\t\t\tfillImage={props.fillImage}\n\t\t\tfillImages={props.fillImages}\n\t\t\tgradientFillSupported={props.gradientFillSupported}\n\t\t\tfillImageResize={props.fillImageResize}\n\t\t\taltAttribute={props.altAttribute}\n\t\t\tonlyNodesWithAltAttribute={props.onlyNodesWithAltAttribute}\n\t\t\tfillGradientCSS={fillGradientCSS}\n\t\t\tfillImagePositionX={fillImagePositionX}\n\t\t\tfillImagePositionY={fillImagePositionY}\n\t\t\tfillImageTileSize={fillImageTileSize}\n\t\t\tscopeType={props.scopeType}\n\t\t\t// Kit fill image alts\n\t\t\tfillImageAlts={props.fillImageAlts}\n\t\t\tonlyNodesSupportingFillImageAlts={props.onlyNodesSupportingFillImageAlts}\n\t\t/>\n\t)\n})\n\nclass FillPanelInner extends React.Component<\n\tProps & {\n\t\tcanPasteFill: () => Promise<boolean>\n\t\tpasteFill: () => void\n\t\tcopyFill: () => Promise<void>\n\t\tcanCopyFill: () => boolean\n\t\tsupportsVariables?: boolean\n\t}\n> {\n\tnodes = () => {\n\t\treturn engine.tree.getNodesWithTrait(this.props.expandedSelectionForShapeStylesIds, withFill)\n\t}\n\n\tvalue = (nodes: CanvasNode[]) => {\n\t\tconst { gradientFillSupported, fillColor, fillImage } = this.props\n\n\t\tconst type = this.currentType(nodes)\n\t\tif (type === \"image\" && isDynamicValue(fillImage)) {\n\t\t\treturn fillImage\n\t\t}\n\n\t\tif (gradientFillSupported && nodes.length) {\n\t\t\tconst node = nodes[0]\n\t\t\tif (!node) return \"\"\n\t\t\tif (withFill(node) && node.fillType) {\n\t\t\t\tswitch (node.fillType) {\n\t\t\t\t\tcase \"linear-gradient\":\n\t\t\t\t\t\treturn node.fillLinearGradient || new LinearGradient()\n\t\t\t\t\tcase \"radial-gradient\":\n\t\t\t\t\t\treturn node.fillRadialGradient || new RadialGradient()\n\t\t\t\t\tcase \"conic-gradient\":\n\t\t\t\t\t\treturn node.fillConicGradient || new ConicGradient()\n\t\t\t\t\tcase \"color\":\n\t\t\t\t\tcase \"image\":\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(node.fillType)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn isString(fillColor) || isDynamicValue(fillColor) ? fillColor : \"\"\n\t}\n\n\tcurrentType = (nodes: CanvasNode[]): FillType | undefined => {\n\t\tconst node = nodes[0]\n\t\tif (!node) return\n\t\tif (!withFill(node)) return\n\t\tif (isGradientFillType(node.fillType) && !this.props.gradientFillSupported) return\n\t\treturn node.fillType\n\t}\n\n\tenableFill = engine.scheduler.wrapHandler(() => {\n\t\taddFillForNodes(engine, this.props.expandedSelectionForShapeStylesIds)\n\t})\n\n\tonChangeAltText = engine.scheduler.wrapHandler((altAttribute: string) => {\n\t\tconst nodes = engine.tree.getNodesWithTrait(this.props.expandedSelectionForShapeStylesIds, withAltText)\n\n\t\tfor (const node of nodes) {\n\t\t\tnode.set({ altAttribute })\n\t\t}\n\t})\n\n\tonFillColorChange = engine.scheduler.wrapHandler((color: string, colorStopSelection: NodeID) => {\n\t\tconst nodes = this.nodes()\n\t\tconst currentValue = this.value(nodes)\n\n\t\tnodes.forEach(node => {\n\t\t\tconst update: FillUpdate = {}\n\t\t\tif (typeof currentValue === \"string\") {\n\t\t\t\tupdate.fillColor = color\n\t\t\t\tupdate.fillType = \"color\"\n\t\t\t} else if (isGradient(currentValue)) {\n\t\t\t\tconst index = currentValue.stops.findIndex(({ id }) => id === colorStopSelection)\n\t\t\t\tconst stops = List.update(currentValue.stops, index, item => item.merge({ value: color }))\n\t\t\t\tupdate.fillLinearGradient = linearGradientUpdate(node, { stops }, tool)\n\t\t\t\tupdate.fillRadialGradient = radialGradientUpdate(node, { stops }, tool)\n\t\t\t\tupdate.fillConicGradient = conicGradientUpdate(node, { stops }, tool)\n\t\t\t\tupdate.fillType = gradientFillType(currentValue)\n\t\t\t}\n\t\t\tif (this.props.fillEnabled === false && withOptionalFill(node)) {\n\t\t\t\tupdate.fillEnabled = true\n\t\t\t}\n\t\t\tnode.set(update)\n\t\t})\n\t})\n\n\tonChangeColorStops = engine.scheduler.wrapHandler((stops: readonly GradientColorStop[]) => {\n\t\tconst nodes = this.nodes()\n\t\tconst currentValue = this.value(nodes)\n\t\tnodes.forEach(node => {\n\t\t\tconst fillLinearGradient = linearGradientUpdate(node, { stops }, tool)\n\t\t\tconst fillRadialGradient = radialGradientUpdate(node, { stops }, tool)\n\t\t\tconst fillConicGradient = conicGradientUpdate(node, { stops }, tool)\n\t\t\tconst update: FillUpdate = {\n\t\t\t\tfillLinearGradient,\n\t\t\t\tfillRadialGradient,\n\t\t\t\tfillConicGradient,\n\t\t\t\tfillType: gradientFillType(currentValue),\n\t\t\t}\n\n\t\t\tif (this.props.fillEnabled === false) {\n\t\t\t\tupdate.fillEnabled = true\n\t\t\t}\n\n\t\t\tnode.set(update)\n\t\t})\n\t})\n\n\thandleUploadedImages = engine.scheduler.wrapHandler(\n\t\t(\n\t\t\tlatestNodes: (CanvasNode & WithFill)[],\n\t\t\timages: ImageUploadResultWithOptionalAssetSize[],\n\t\t\tpresetName?: TilingBackgroundPatternPresetName,\n\t\t) => {\n\t\t\tlatestNodes.forEach((node, index) => {\n\t\t\t\tconst imageInfo = images[index % images.length]\n\t\t\t\tassert(imageInfo, \"Missing image in list\")\n\n\t\t\t\tapplyImageFillToNode(node, imageInfo, presetName, imageInfo.preferredSize)\n\t\t\t})\n\t\t},\n\t)\n\n\tonRemoveImageFill = engine.scheduler.wrapHandler(() => {\n\t\tconst update: FillUpdate = {\n\t\t\t// We need to keep the fill type so that the fill image tab remains visible\n\t\t\t// after an image has been deleted from the fill image picker.\n\t\t\tfillType: \"image\",\n\t\t\tfillImage: undefined,\n\t\t\tfillImageOriginalName: undefined,\n\t\t\tfillImagePixelWidth: undefined,\n\t\t\tfillImagePixelHeight: undefined,\n\t\t\tfillImageTileSize: undefined,\n\t\t\tfillImageResize: undefined,\n\t\t}\n\n\t\tif (this.props.fillEnabled === false) {\n\t\t\tupdate.fillEnabled = true\n\t\t}\n\n\t\tthis.nodes().forEach(node => node.set(update))\n\t})\n\n\tonChangeImageFill = engine.scheduler.wrapHandler(\n\t\tasync (imageUpload: Promise<ImageUploadResultWithOptionalAssetSize[]>) => {\n\t\t\t// We determine the nodes to be updates already at the point of starting\n\t\t\t// the image upload; if we'd do it later (when the image is uploaded) the selection\n\t\t\t// may have changed, and we would update the wrong nodes.\n\t\t\tconst ids = this.props.expandedSelectionForShapeStylesIds\n\n\t\t\ttry {\n\t\t\t\tconst images = await imageUpload\n\t\t\t\tif (images.length === 0) return\n\t\t\t\tconst latestNodes = engine.tree.getNodesWithTrait(ids, withFill)\n\t\t\t\tif (latestNodes.length === 0) return\n\t\t\t\tthis.handleUploadedImages(latestNodes, images)\n\t\t\t} catch (reason) {\n\t\t\t\t// biome-ignore lint/suspicious/noConsole: <explanation>\n\t\t\t\tconsole.log(\"Could not apply images\", reason)\n\t\t\t}\n\t\t},\n\t)\n\n\tonChangeAssetSize = engine.scheduler.wrapHandler((size: AssetSize) => {\n\t\tthis.nodes().forEach(node => {\n\t\t\tif (!isString(node.fillImage)) return\n\t\t\tconst fillImage = updateAssetReferencePreferredSize(node.fillImage, size)\n\t\t\tnode.set({ fillImage })\n\t\t})\n\t})\n\n\tonChangeImageResize = engine.scheduler.wrapHandler((fillImageResize: ImageFit) => {\n\t\tconst update: FillUpdate = { fillImageResize }\n\n\t\tthis.nodes().forEach(node => node.set(update))\n\t})\n\n\tonChangeImagePosition = engine.scheduler.wrapHandler(\n\t\t(fillImagePositionX: FillImagePositionX | undefined, fillImagePositionY: FillImagePositionY | undefined) => {\n\t\t\tthis.nodes().forEach(node => node.set({ fillImagePositionX, fillImagePositionY }))\n\t\t},\n\t)\n\n\tonChangeFillImageSize = engine.scheduler.wrapHandler((fillImageTileSize: number) => {\n\t\tthis.nodes().forEach(node => node.set({ fillImageTileSize }))\n\t})\n\n\tonSelectTilePatternPreset = engine.scheduler.wrapHandler(async (preset: TilingBackgroundPatternPreset) => {\n\t\tconst file = await fileFromURL(preset.originalImage, `${preset.name}.${preset.extension}`)\n\t\tconst nodeIds = this.nodes().map(n => n.id)\n\t\tconst uploadResult = await uploadService.uploadImage(file, { silent: true })\n\n\t\tif (uploadResult) {\n\t\t\tconst latestNodes = engine.tree.getNodesWithTrait(nodeIds, withFill)\n\t\t\tif (latestNodes.length === 0) return\n\t\t\tthis.handleUploadedImages(latestNodes, [uploadResult], preset.name)\n\t\t}\n\t})\n\n\tonChangeFillType = engine.scheduler.wrapHandler((fillType: FillType) => {\n\t\tconst update: FillUpdate = { fillType }\n\n\t\tif (this.props.fillEnabled === false) {\n\t\t\tupdate.fillEnabled = true\n\t\t}\n\n\t\tthis.nodes().forEach(node => {\n\t\t\tconst nodeUpdate = updateWithGradientIfRequired(node, update, fillType)\n\t\t\tif (fillType !== \"image\" && node.fillType === \"image\") {\n\t\t\t\tnode.set(updateWithFitImageDimensionReset(node, nodeUpdate))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tnode.set(nodeUpdate)\n\t\t})\n\t})\n\n\tdisableFill = engine.scheduler.wrapHandler(() => {\n\t\tthis.nodes().forEach(node => {\n\t\t\tif (!withOptionalFill(node)) return\n\n\t\t\tconst update: FillUpdate = {\n\t\t\t\tfillImage: undefined,\n\t\t\t\tfillEnabled: false,\n\t\t\t\tfillImageOriginalName: undefined,\n\t\t\t\tfillImagePixelWidth: undefined,\n\t\t\t\tfillImagePixelHeight: undefined,\n\t\t\t\tfillImageTileSize: undefined,\n\t\t\t\tfillImageResize: undefined,\n\t\t\t}\n\n\t\t\tnode.set(updateWithFitImageDimensionReset(node, update))\n\t\t})\n\t})\n\n\t// Set Default\n\n\tonSetAsDefault = engine.scheduler.wrapHandler(() => {\n\t\tconst node = this.nodes()[0]\n\t\tif (!isFrameNode(node)) return\n\t\tconst fillColor = getFrameFillColor(engine.tree, node)\n\t\tif (fillColor) engine.stores.persistedUserDefaults.frameBackground = fillColor\n\t})\n\n\tsetAsDefaultVisible = (type: FillType | undefined, currentValue: string | DynamicValue | Gradient) => {\n\t\tif (type !== \"color\") return false\n\t\tconst { onlyFrameNodes, fillEnabled } = this.props\n\t\tif (!onlyFrameNodes || fillEnabled !== true) return false\n\t\treturn isString(currentValue) && currentValue.length > 0\n\t}\n\n\t// Variables\n\n\tassignDynamicValueToFill = (update: Partial<WithFill>) => {\n\t\tthis.nodes().forEach(node => {\n\t\t\tif (withOptionalFill(node) && !node.fillEnabled) {\n\t\t\t\tnode.set({ fillEnabled: true })\n\t\t\t}\n\t\t\tnode.set(update)\n\t\t})\n\n\t\t// If a node has a FitImage dimension and the fill is being set to a variable then we may need to regenerate some modules\n\t\t// to ensure the dimensions are supplied correctly\n\t\tvoid regenerateModulesForFitImage(\n\t\t\t{\n\t\t\t\ttreeStore: engine.stores.treeStore,\n\t\t\t\tcodeGenerationStore: engine.stores.codeGenerationStore,\n\t\t\t\tscopeStore: engine.stores.scopeStore,\n\t\t\t\tmodulesStore: engine.stores.modulesStore,\n\t\t\t},\n\t\t\tengine.scheduler,\n\t\t\tthis.nodes().filter(\n\t\t\t\tnode =>\n\t\t\t\t\twithSizeDimensionType(node) &&\n\t\t\t\t\t(node.heightType === DimensionType.FitImage || node.widthType === DimensionType.FitImage),\n\t\t\t),\n\t\t)\n\t}\n\n\tonCreateVariable = engine.scheduler.wrapHandler((scopeId: NodeID, type: VariableType) => {\n\t\tconst nodes = this.nodes()\n\t\tconst currentValue = this.value(nodes)\n\n\t\tif (type === ControlType.Image) {\n\t\t\tlet initialValue: ImageControlProp | undefined = undefined\n\n\t\t\tif (isString(this.props.fillImage)) {\n\t\t\t\tconst responsiveImage: ImageControlProp = {\n\t\t\t\t\ttype: ControlType.Image,\n\t\t\t\t\tvalue: this.props.fillImage,\n\t\t\t\t}\n\n\t\t\t\tinitialValue = responsiveImage\n\n\t\t\t\tif (isString(this.props.altAttribute)) {\n\t\t\t\t\tresponsiveImage.alt = this.props.altAttribute\n\t\t\t\t}\n\n\t\t\t\tif (isRelativeNumber(this.props.fillImagePositionX) && isRelativeNumber(this.props.fillImagePositionY)) {\n\t\t\t\t\tresponsiveImage.positionX = this.props.fillImagePositionX\n\t\t\t\t\tresponsiveImage.positionY = this.props.fillImagePositionY\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Image,\n\t\t\t\tname: \"image\",\n\t\t\t\tinitialValue,\n\t\t\t})\n\n\t\t\tif (variableRef) {\n\t\t\t\tthis.assignDynamicValueToFill({\n\t\t\t\t\tfillImage: variableRef,\n\t\t\t\t\tfillType: \"image\",\n\t\t\t\t\tfillImagePositionX: undefined,\n\t\t\t\t\tfillImagePositionY: undefined,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (type === ControlType.Color) {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Color,\n\t\t\t\tname: \"Fill\",\n\t\t\t\tinitialValue: isString(currentValue) ? currentValue : \"white\",\n\t\t\t})\n\t\t\tif (variableRef) {\n\t\t\t\tthis.assignDynamicValueToFill({ fillColor: variableRef, fillType: \"color\" })\n\t\t\t}\n\t\t}\n\t})\n\n\tonRemoveDynamicValue = engine.scheduler.wrapHandler(() => {\n\t\tfor (const node of this.nodes()) {\n\t\t\tconst { fillImage, fillColor } = node\n\t\t\tif (node.fillType === \"image\") {\n\t\t\t\tif (!isDynamicValue(fillImage)) continue\n\t\t\t\tif (isVariableReference(fillImage)) {\n\t\t\t\t\tconst variableValue = getVariableValue(engine, fillImage)\n\t\t\t\t\tconst newFillImage = isString(variableValue) && isAssetReference(variableValue) ? variableValue : undefined\n\t\t\t\t\tnode.set({\n\t\t\t\t\t\tfillImage: newFillImage,\n\t\t\t\t\t\t// Setting image position to undefined because the focal point only makes\n\t\t\t\t\t\t// sense for the previous image.\n\t\t\t\t\t\tfillImagePositionX: undefined,\n\t\t\t\t\t\tfillImagePositionY: undefined,\n\t\t\t\t\t})\n\t\t\t\t} else if (isComputedValue(fillImage)) {\n\t\t\t\t\tnode.set({ fillImage: undefined })\n\t\t\t\t} else {\n\t\t\t\t\tshouldBeNever(fillImage)\n\t\t\t\t}\n\t\t\t} else if (node.fillType === \"color\") {\n\t\t\t\tif (!isDynamicValue(fillColor)) continue\n\t\t\t\tif (isVariableReference(fillColor)) {\n\t\t\t\t\tconst variableValue = getVariableValue(engine, fillColor)\n\t\t\t\t\tconst newFillColor = isString(variableValue) ? variableValue : \"white\"\n\t\t\t\t\tnode.set({ fillColor: newFillColor })\n\t\t\t\t} else if (isComputedValue(fillColor)) {\n\t\t\t\t\tnode.set({ fillColor: \"white\" })\n\t\t\t\t} else {\n\t\t\t\t\tshouldBeNever(fillColor)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\tonSelectFetchDataValue = () => {\n\t\tconst initialValue =\n\t\t\tisString(this.props.fillImage) && isAssetReference(this.props.fillImage) ? this.props.fillImage : undefined\n\t\tconst fetchDataValue = createFetchDataValue({\n\t\t\ttype: ControlType.Image,\n\t\t\tvalue: initialValue,\n\t\t})\n\n\t\tconst computedValue = createComputedValue(ControlType.Image, fetchDataValue, [])\n\n\t\tthis.assignDynamicValueToFill({\n\t\t\tfillImage: computedValue,\n\t\t\t// At the moment fetch values only support image fills.\n\t\t\t// If we'd want to support other type of fills, we'd need a UI to indicate that.\n\t\t\tfillType: \"image\",\n\t\t\t// For fetch you cannot set the focal point, so we always center the image.\n\t\t\tfillImagePositionX: \"center\",\n\t\t\tfillImagePositionY: \"center\",\n\t\t\tfillColor: undefined,\n\t\t})\n\n\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\n\t\treturn computedValue\n\t}\n\n\tonSelectVariableReference = engine.scheduler.wrapHandler((variableRef: VariableReference, type: VariableType) => {\n\t\tif (type === ControlType.Image) {\n\t\t\tthis.assignDynamicValueToFill({\n\t\t\t\tfillImage: variableRef,\n\t\t\t\tfillType: \"image\",\n\t\t\t\t// Setting image position to undefined because the focal point only makes sense for\n\t\t\t\t// the previous image.\n\t\t\t\tfillImagePositionX: undefined,\n\t\t\t\tfillImagePositionY: undefined,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.assignDynamicValueToFill({ fillColor: variableRef, fillType: \"color\" })\n\t\t}\n\t})\n\n\tonSelectComputedValue = engine.scheduler.wrapHandler((computedValue: ComputedValue) => {\n\t\tassert(computedValue.outputType === ControlType.Color)\n\t\tthis.assignDynamicValueToFill({ fillColor: computedValue, fillType: \"color\" })\n\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t})\n\n\tonChangeDynamicValue = engine.scheduler.wrapHandler((computedValue: DynamicValue, outputType: VariableType) => {\n\t\tfor (const node of this.nodes()) {\n\t\t\tconst { fillImage, fillColor } = node\n\t\t\tif (node.fillType === \"image\" && isComputedValueFromFetchData(fillImage) && outputType === ControlType.Image) {\n\t\t\t\tassert(\n\t\t\t\t\tisComputedValueFromFetchData(computedValue),\n\t\t\t\t\t\"ComputedValueFromVariable are not supported for image fills\",\n\t\t\t\t)\n\t\t\t\t// Setting image position to undefined because the focal point only makes\n\t\t\t\t// sense for the previous image.\n\t\t\t\tnode.set({ fillImage: computedValue, fillImagePositionX: undefined, fillImagePositionY: undefined })\n\t\t\t}\n\t\t\tif (node.fillType === \"color\" && isComputedValue(fillColor) && outputType === ControlType.Color) {\n\t\t\t\tnode.set({ fillColor: computedValue })\n\t\t\t}\n\t\t}\n\t})\n\n\t// memo\n\tpreviousTracking: any\n\n\toverride render() {\n\t\tconst {\n\t\t\tnodeIds,\n\t\t\texpandedSelectionForShapeStylesIds,\n\t\t\tanyNodesWithFill,\n\t\t\tonlyNodesSupportingImageFill,\n\t\t\tanyNodeWithNonOptionalFill,\n\t\t\tfillEnabled,\n\t\t\tfillImages,\n\t\t\taltAttribute,\n\t\t\tonlyNodesWithAltAttribute,\n\t\t\tfillGradientCSS,\n\t\t\tfillImagePositionX,\n\t\t\tfillImagePositionY,\n\t\t\tfillImageResize,\n\t\t\tfillImageTileSize,\n\t\t\tsupportsVariables = false,\n\t\t\tscopeType,\n\t\t\tonlyNodesSupportingFillImageAlts,\n\t\t\tfillImageAlts,\n\t\t} = this.props\n\n\t\tconst nodes = this.nodes()\n\n\t\tif (!anyNodesWithFill) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst currentType = this.currentType(nodes)\n\t\tconst value = this.value(nodes)\n\n\t\tlet tracking = trackingMetadata(expandedSelectionForShapeStylesIds, \"fillColor\")\n\t\tif (tracking && this.previousTracking && isShallowEqual(tracking, this.previousTracking)) {\n\t\t\ttracking = this.previousTracking\n\t\t} else {\n\t\t\tthis.previousTracking = tracking\n\t\t}\n\t\tconst hasOptionalFillEnabled = fillEnabled === undefined || fillEnabled === true\n\t\tconst displayCurrentFill = anyNodeWithNonOptionalFill || hasOptionalFillEnabled\n\t\tconst tabsToShow = getFillTabsToShow(this.props)\n\t\tconst supportsFetchDataValues = scopeType === ScopeType.SmartComponent && supportsVariables\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<PanelRow\n\t\t\t\t\tid={PanelElementId.FillPanel}\n\t\t\t\t\ttitle=\"Fill\"\n\t\t\t\t\tonAdd={this.enableFill}\n\t\t\t\t\taddEnabled={!anyNodeWithNonOptionalFill && !hasOptionalFillEnabled}\n\t\t\t\t\tonDelete={this.disableFill}\n\t\t\t\t\tdeleteEnabled={!anyNodeWithNonOptionalFill && hasOptionalFillEnabled}\n\t\t\t\t\tonCopy={this.props.copyFill}\n\t\t\t\t\tcopyEnabled={this.props.canCopyFill}\n\t\t\t\t\tonPaste={this.props.pasteFill}\n\t\t\t\t\tpasteEnabled={this.props.canPasteFill}\n\t\t\t\t\ttraitTypes={fillTraitTypes}\n\t\t\t\t\tvariableType={onlyNodesSupportingImageFill ? colorAndImageFillVariableTypes : ControlType.Color}\n\t\t\t\t\tonCreateVariable={this.onCreateVariable}\n\t\t\t\t\tonRemoveDynamicValue={this.onRemoveDynamicValue}\n\t\t\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\t\t\tonSelectVariable={this.onSelectVariableReference}\n\t\t\t\t\tonSetAsDefault={this.onSetAsDefault}\n\t\t\t\t\tsetAsDefaultVisible={this.setAsDefaultVisible(currentType, value)}\n\t\t\t\t\tonSelectComputedValue={this.onSelectComputedValue}\n\t\t\t\t\tsupportsVariables={supportsVariables}\n\t\t\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\t\t\tsupportsFetchDataValues={supportsFetchDataValues}\n\t\t\t\t\tonSelectFetchDataValue={this.onSelectFetchDataValue}\n\t\t\t\t\tcomputedValuePopoutId={popoutId}\n\t\t\t\t>\n\t\t\t\t\t<Stack style={doubleColumn}>\n\t\t\t\t\t\t{displayCurrentFill ? (\n\t\t\t\t\t\t\tisDynamicValue(value) ? (\n\t\t\t\t\t\t\t\t<DynamicValueButton\n\t\t\t\t\t\t\t\t\ttitle={Dictionary.Fill}\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t\t\t\t\t\tsupportsComputedValues\n\t\t\t\t\t\t\t\t\toutputControl={undefined}\n\t\t\t\t\t\t\t\t\texpectedType={colorAndImageFillVariableTypes}\n\t\t\t\t\t\t\t\t\tonRemove={this.onRemoveDynamicValue}\n\t\t\t\t\t\t\t\t\tonChangeDynamicValue={this.onChangeDynamicValue}\n\t\t\t\t\t\t\t\t\tsupportsFetchDataValues\n\t\t\t\t\t\t\t\t\tnodeIds={this.props.expandedSelectionForShapeStylesIds}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<FillPopoutButton\n\t\t\t\t\t\t\t\t\tvalue={isVariableReference(value) ? \"\" : value}\n\t\t\t\t\t\t\t\t\tcurrentType={currentType}\n\t\t\t\t\t\t\t\t\ttabsToShow={tabsToShow}\n\t\t\t\t\t\t\t\t\tonChange={this.onFillColorChange}\n\t\t\t\t\t\t\t\t\tonChangeFillType={this.props.gradientFillSupported ? this.onChangeFillType : undefined}\n\t\t\t\t\t\t\t\t\tonChangeColorStops={this.onChangeColorStops}\n\t\t\t\t\t\t\t\t\tfillImageResize={fillImageResize}\n\t\t\t\t\t\t\t\t\timageReferences={fillImages}\n\t\t\t\t\t\t\t\t\tonChangeImages={this.onChangeImageFill}\n\t\t\t\t\t\t\t\t\tonRemoveImage={this.onRemoveImageFill}\n\t\t\t\t\t\t\t\t\tonChangeAssetSize={this.onChangeAssetSize}\n\t\t\t\t\t\t\t\t\tonChangeImageResize={this.onChangeImageResize}\n\t\t\t\t\t\t\t\t\tonClearFill={this.disableFill}\n\t\t\t\t\t\t\t\t\tclearFillEnabled={!anyNodeWithNonOptionalFill}\n\t\t\t\t\t\t\t\t\ttrackingMetadata={tracking}\n\t\t\t\t\t\t\t\t\taltText={altAttribute}\n\t\t\t\t\t\t\t\t\tonChangeAltText={\n\t\t\t\t\t\t\t\t\t\tonlyNodesWithAltAttribute && commonValue(fillImageResize) !== \"tile\"\n\t\t\t\t\t\t\t\t\t\t\t? this.onChangeAltText\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfillGradientCSS={isFoundAndNotMixed(fillGradientCSS) ? fillGradientCSS : undefined}\n\t\t\t\t\t\t\t\t\tfillImagePositionX={fillImagePositionX}\n\t\t\t\t\t\t\t\t\tfillImagePositionY={fillImagePositionY}\n\t\t\t\t\t\t\t\t\tonChangeImagePosition={this.onChangeImagePosition}\n\t\t\t\t\t\t\t\t\tfillImageTileSize={fillImageTileSize}\n\t\t\t\t\t\t\t\t\tonChangeFillImageSize={this.onChangeFillImageSize}\n\t\t\t\t\t\t\t\t\tonSelectTilePatternPreset={this.onSelectTilePatternPreset}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"fill\" onClick={this.enableFill} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{onlyNodesSupportingFillImageAlts && <FillImageAltRows nodeIds={nodeIds} fillImageAlts={fillImageAlts} />}\n\t\t\t\t\t</Stack>\n\t\t\t\t</PanelRow>\n\t\t\t\t{currentType === \"image\" &&\n\t\t\t\t\tonlyNodesSupportingImageFill &&\n\t\t\t\t\t(anyNodeWithNonOptionalFill || fillEnabled === true) &&\n\t\t\t\t\tisDynamicValue(value) && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<FillImageResizeRow fillImageResize={fillImageResize} onChangeImageResize={this.onChangeImageResize} />\n\n\t\t\t\t\t\t\t<FillImagePositionRow\n\t\t\t\t\t\t\t\thasImageVariable\n\t\t\t\t\t\t\t\tfillImagePositionX={fillImagePositionX}\n\t\t\t\t\t\t\t\tfillImagePositionY={fillImagePositionY}\n\t\t\t\t\t\t\t\tfillImageResize={fillImageResize}\n\t\t\t\t\t\t\t\tonChangeImagePosition={this.onChangeImagePosition}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n}\n\n// Constraints the tabs to show in the color picker popout based on\n// the current selection of nodes. If undefined is returned, then all\n// tabs are shown\nfunction getFillTabsToShow({\n\tonlyNodesSupportingImageFill,\n\tonlyNodesSupportingConicGradient,\n}: Props): ColorPickerTab[] | undefined {\n\tif (!onlyNodesSupportingConicGradient && !onlyNodesSupportingImageFill) {\n\t\treturn colorPickerFillTypeTabsWithoutImageAndConic\n\t}\n\n\tif (!onlyNodesSupportingImageFill) {\n\t\treturn colorPickerFillTypeTabsWithoutImage\n\t}\n\n\tif (!onlyNodesSupportingConicGradient) {\n\t\treturn colorPickerFillTypeTabsWithoutConic\n\t}\n\n\treturn\n}\n\n/**\n * Returns a node update with FitImage height or width reset to Fixed if required. If the fill changes from image\n * without this the layout can collapse.\n */\nfunction updateWithFitImageDimensionReset(node: CanvasNode, update: FillUpdate) {\n\tif (!withSize(node) || !withSizeDimensionType(node)) return update\n\tif (node.heightType !== DimensionType.FitImage && node.widthType !== DimensionType.FitImage) return update\n\n\tconst updateWithReset: FillUpdate & Partial<WithSizeDimensionType & WithSize> = { ...update }\n\tif (node.heightType === DimensionType.FitImage) {\n\t\tupdateWithReset.heightType = DimensionType.FixedNumber\n\t\tupdateWithReset.height = node.rect().height\n\t}\n\tif (node.widthType === DimensionType.FitImage) {\n\t\tupdateWithReset.widthType = DimensionType.FixedNumber\n\t\tupdateWithReset.width = node.rect().width\n\t}\n\n\treturn updateWithReset\n}\n\nfunction updateWithGradientIfRequired(node: CanvasNode & WithFill, update: FillUpdate, fillType: FillType) {\n\tif (!isGradientFillType(fillType)) return update\n\n\tconst updateWithResetGradient: FillUpdate & Partial<WithSizeDimensionType & WithSize> = { ...update }\n\t// Create optional gradients when they don't exist yet\n\tif (\n\t\tnode.fillLinearGradient === undefined ||\n\t\tnode.fillRadialGradient === undefined ||\n\t\tnode.fillConicGradient === undefined\n\t) {\n\t\tconst stops = getDefaultGradientStops(node.resolveValue(\"fillColor\") || \"black\")\n\t\tif (!node.fillLinearGradient) {\n\t\t\tupdateWithResetGradient.fillLinearGradient = linearGradientUpdate(node, { stops }, tool)\n\t\t}\n\t\tif (!node.fillRadialGradient) {\n\t\t\tupdateWithResetGradient.fillRadialGradient = radialGradientUpdate(node, { stops }, tool)\n\t\t}\n\t\tif (!node.fillConicGradient) {\n\t\t\tupdateWithResetGradient.fillConicGradient = conicGradientUpdate(node, { stops }, tool)\n\t\t}\n\t}\n\n\t// If we are changing to conic/radial gradient, remap the position to a 0~1 range\n\tlet nextGradientToRemap: Gradient | undefined = undefined\n\tif (fillType === \"radial-gradient\") {\n\t\tnextGradientToRemap = node.fillRadialGradient\n\t} else if (fillType === \"conic-gradient\") {\n\t\tnextGradientToRemap = node.fillConicGradient\n\t}\n\n\tif (nextGradientToRemap) {\n\t\tconst remappedGradientStops = normalizeGradientStopPositions(nextGradientToRemap)\n\t\tif (remappedGradientStops) {\n\t\t\tupdateWithResetGradient.fillRadialGradient = radialGradientUpdate(node, { stops: remappedGradientStops }, tool)\n\t\t\tupdateWithResetGradient.fillConicGradient = conicGradientUpdate(node, { stops: remappedGradientStops }, tool)\n\t\t}\n\t}\n\n\treturn updateWithResetGradient\n}\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport { type BaseEngine, useBaseEngine } from \"document/base-engine/BaseEngine.ts\"\nimport { useResolvedImageThumbnail } from \"document/components/utils/useResolvedImageThumbnail.ts\"\nimport type { FillType } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport { getFirstItemFromIterable } from \"utils/getFirstItemFromIterable.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { PanelElementId, highlightPanel } from \"../../properties/panels/utils/highlightPanel.ts\"\nimport { useSubscribeToFillValue } from \"../../properties/utils/useSubscribeToFillValue.ts\"\nimport { PopoutButtonBackgroundPreview } from \"../PopoutButtonBackgroundPreview.tsx\"\nimport { PopoutButtonWithPreview } from \"../PopoutButtonWithPreview.tsx\"\nimport type { ColorPickerPopoutProps } from \"./ColorPickerPopout.tsx\"\nimport { ColorPickerPopout } from \"./ColorPickerPopout.tsx\"\nimport { colorFillDisplayValue } from \"./utils.ts\"\n\ninterface Props extends Omit<ColorPickerPopoutProps, \"PopoutContent\"> {\n\tonClearFill: () => void\n\tclearFillEnabled: boolean\n\tid?: string\n}\n\nfunction scrollFillPanelIntoView() {\n\thighlightPanel({ id: PanelElementId.FillPanel, flash: false })\n}\n\nexport function FillPopoutButton(props: Props) {\n\tconst engine = useBaseEngine()\n\tconst localToken = useSubscribeToFillValue(props.value)\n\tconst value = localToken?.value ?? props.value\n\tconst title = localToken?.name ?? titleForType(props.currentType, value, engine)\n\tconst isImage = props.currentType === \"image\"\n\tconst fillImagePositionX = isString(props.fillImagePositionX) && isImage ? props.fillImagePositionX : undefined\n\tconst fillImagePositionY = isString(props.fillImagePositionY) && isImage ? props.fillImagePositionY : undefined\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tid={props.id ?? \"fill\"}\n\t\t\tpopout={<ColorPickerPopout {...props} />}\n\t\t\tnavigationTitle=\"Fill\"\n\t\t\ttitle={title}\n\t\t\tonDelete={props.clearFillEnabled ? props.onClearFill : undefined}\n\t\t\tonPresent={scrollFillPanelIntoView}\n\t\t\tpreview={\n\t\t\t\t<PopoutButtonBackgroundPreview\n\t\t\t\t\tbackground={useBackgroundCSSString(value, props)}\n\t\t\t\t\tbackgroundPositionX={fillImagePositionX}\n\t\t\t\t\tbackgroundPositionY={fillImagePositionY}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction titleForType(type: FillType | undefined, value: unknown, engine: BaseEngine) {\n\tconst stringValue = isString(value) ? value : \"\"\n\n\tswitch (type) {\n\t\tcase \"color\":\n\t\t\treturn colorFillDisplayValue(stringValue, engine).title\n\t\tcase \"linear-gradient\":\n\t\t\treturn \"Linear\"\n\t\tcase \"radial-gradient\":\n\t\t\treturn \"Radial\"\n\t\tcase \"conic-gradient\":\n\t\t\treturn \"Conic\"\n\t\tcase \"image\":\n\t\t\treturn \"Image\"\n\t\tdefault:\n\t\t\treturn Dictionary.Mixed\n\t}\n}\n\nexport function useBackgroundCSSString(\n\tvalue: string | Gradient,\n\t{ currentType, imageReferences }: Pick<Props, \"currentType\" | \"imageReferences\">,\n) {\n\tlet result: string\n\tlet isImage = false\n\tif (currentType === \"image\") {\n\t\tconst image = imageReferences ? getFirstItemFromIterable(imageReferences) : undefined\n\t\tif (image) {\n\t\t\tisImage = true\n\t\t\tresult = image\n\t\t} else {\n\t\t\tresult = \"transparent\"\n\t\t}\n\t} else if (isString(value)) {\n\t\tresult = value\n\t} else {\n\t\tresult = value.toCSS()\n\t}\n\n\tconst resolvedImage = useResolvedImageThumbnail(isImage ? result : undefined)\n\tif (resolvedImage) result = resolvedImage\n\n\treturn result\n}\n", "import engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { ColorPickerTrackingMetadata } from \"./ColorPickerPopout.tsx\"\n\nexport function trackingMetadata(nodes: NodeID[], property: string): ColorPickerTrackingMetadata | undefined {\n\tif (!nodes.length) return\n\tconst nodeId = nodes[0]\n\tif (!nodeId) return\n\tconst node = engine.tree.getNode(nodeId)\n\tif (!node) return\n\treturn { nodeType: node.__class, nodeProperty: property }\n}\n", "import { parseAssetReference } from \"@framerjs/assets\"\nimport { Sortable } from \"@framerjs/fresco/layout-transitions\"\nimport { List, getLogger } from \"@framerjs/shared\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { WithFillImageAlts } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { withFillImageAlts } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { ReducedFillImageAlt } from \"document/models/CanvasTree/traits/utils/reduceFill.ts\"\nimport { createAssetReferenceForUploadImageResult } from \"document/utils/createAssetReferenceFromImageUpload.ts\"\nimport { useCallback } from \"react\"\nimport { isArray, isString } from \"utils/typeChecks.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport type { ImageUploadResult } from \"web/pages/project/lib/UploadService.ts\"\nimport { FillPopoutButton } from \"../../shared/ColorPicker/FillPopoutButton.tsx\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport type { TilingBackgroundPatternPresetName } from \"../rows/FillImagePatternPresetsRow/presetOptions.ts\"\nimport * as styles from \"./FillImageAltRows.styles.ts\"\nimport { addFillImageAltForNodes } from \"./utils/addFillImageAltForNodes.ts\"\nimport { getFillImageAltPopoutId } from \"./utils/getFillImageAltPopoutId.ts\"\n\ninterface Props {\n\tnodeIds: NodeID[]\n\tfillImageAlts: Reduced<ReducedFillImageAlt[] | undefined>\n}\n\nconst log = getLogger(\"failed-fill-image-alt-image-upload\")\n\nexport function FillImageAltRows({ nodeIds, fillImageAlts }: Props) {\n\tconst hasAlternatives = isArray(fillImageAlts)\n\tconst alternativesCount = hasAlternatives ? fillImageAlts.length : 0\n\tconst canSort = alternativesCount > 1\n\n\tconst handleCreate = useCallback(() => createFillImageAlt(nodeIds), [nodeIds])\n\n\tconst handleMove = useCallback((from: number, to: number) => moveFillImageAlt(nodeIds, from, to), [nodeIds])\n\n\tconst handleRemove = useCallback((index: number) => removeFillImageAlt(nodeIds, index), [nodeIds])\n\n\treturn (\n\t\t<>\n\t\t\t{alternativesCount > 0 && (\n\t\t\t\t<Sortable\n\t\t\t\t\tenabled={canSort}\n\t\t\t\t\tclassName={styles.sortable}\n\t\t\t\t\titems={hasAlternatives ? fillImageAlts : []}\n\t\t\t\t\tmoveItem={handleMove}\n\t\t\t\t\tkeyForItem={getFillImageAltId}\n\t\t\t\t\tremoveItem={handleRemove}\n\t\t\t\t\tonDragStart={popoutWindow.close}\n\t\t\t\t>\n\t\t\t\t\t{({ item: alternative, index }) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<FillPopoutButton\n\t\t\t\t\t\t\t\tid={getFillImageAltPopoutId(alternative.id)}\n\t\t\t\t\t\t\t\tcurrentType=\"image\"\n\t\t\t\t\t\t\t\timageReferences={isString(alternative.image) ? new Set([alternative.image]) : undefined}\n\t\t\t\t\t\t\t\tonChangeImages={imageUpload => updateFillImageAltImage(nodeIds, index, imageUpload)}\n\t\t\t\t\t\t\t\taltText={isFound(alternative.alt) ? alternative.alt : undefined}\n\t\t\t\t\t\t\t\tonChangeAltText={alt => updateFillImageAltText(nodeIds, index, alt)}\n\t\t\t\t\t\t\t\tonRemoveImage={() => handleRemove(index)}\n\t\t\t\t\t\t\t\tonClearFill={() => handleRemove(index)}\n\t\t\t\t\t\t\t\tclearFillEnabled={true}\n\t\t\t\t\t\t\t\tallowColorStyles={false}\n\t\t\t\t\t\t\t\t// because we only want to support image, we can safely ignore the value and onChange\n\t\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t\tonChange={noop}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t</Sortable>\n\t\t\t)}\n\t\t\t<PopoutButtonWithPreviewSuggestion type=\"fill\" onClick={handleCreate} />\n\t\t</>\n\t)\n}\n\nconst createFillImageAlt = engine.scheduler.wrapHandler((nodeIds: NodeID[]) => {\n\taddFillImageAltForNodes(engine.tree, nodeIds)\n})\n\nconst moveFillImageAlt = engine.scheduler.wrapHandler((nodeIds: NodeID[], from: number, to: number) => {\n\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withFillImageAlts)) {\n\t\tif (!node.fillImageAlts) return\n\t\tnode.set({ fillImageAlts: List.move(node.fillImageAlts, from, to) })\n\t}\n})\n\nconst removeFillImageAlt = engine.scheduler.wrapHandler((nodeIds: NodeID[], index: number) => {\n\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withFillImageAlts)) {\n\t\tif (!node.fillImageAlts) return\n\t\tnode.set({ fillImageAlts: List.remove(node.fillImageAlts, index) })\n\t}\n})\n\nconst updateFillImageAltText = engine.scheduler.wrapHandler((nodeIds: NodeID[], index: number, alt: string) => {\n\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withFillImageAlts)) {\n\t\tif (!node.fillImageAlts || index >= node.fillImageAlts.length) return\n\n\t\tconst fillImageAlt = node.fillImageAlts[index]\n\t\tif (!fillImageAlt) return\n\n\t\tnode.set({ fillImageAlts: List.replace(node.fillImageAlts, index, { ...fillImageAlt, alt }) })\n\t}\n})\n\nasync function updateFillImageAltImage(\n\tnodeIds: NodeID[],\n\talternativeIndex: number,\n\timageUpload: Promise<ImageUploadResult[]>,\n) {\n\ttry {\n\t\tconst images = await imageUpload\n\t\tif (images.length === 0) return\n\n\t\tengine.scheduler.wrapHandler(() => {\n\t\t\tconst latestNodes = engine.tree.getNodesWithTrait(nodeIds, withFillImageAlts)\n\t\t\tif (latestNodes.length === 0) return\n\n\t\t\tuploadedImages(alternativeIndex, latestNodes, images)\n\t\t})()\n\t} catch (reason) {\n\t\ttoast({\n\t\t\tkey: `unsuccessful-fill-image-alt-image-upload`,\n\t\t\ttype: \"add\",\n\t\t\tvariant: \"error\",\n\t\t\ttext: `Could not upload the image.`,\n\t\t\ticon: \"error\",\n\t\t\tduration: 5000,\n\t\t})\n\t\tlog.reportError(reason)\n\t}\n}\n\nfunction getFillImageAltId(alt: ReducedFillImageAlt): string {\n\treturn alt.id\n}\n\nfunction uploadedImages(\n\talternativeIndex: number,\n\tlatestNodes: (CanvasNode & WithFillImageAlts)[],\n\timages: ImageUploadResult[],\n\tpresetName?: TilingBackgroundPatternPresetName,\n) {\n\tconst [image] = images\n\tif (!image) return\n\n\tlatestNodes.forEach(node => {\n\t\tif (!node.fillImageAlts || alternativeIndex >= node.fillImageAlts.length) return\n\n\t\tconst fillImageAlt = node.fillImageAlts[alternativeIndex]\n\t\tif (!fillImageAlt) return\n\n\t\tconst currentSize = isString(fillImageAlt.image)\n\t\t\t? parseAssetReference(fillImageAlt.image)?.preferredSize\n\t\t\t: undefined\n\n\t\tconst assetReference = createAssetReferenceForUploadImageResult(image, currentSize, presetName)\n\n\t\tnode.set({\n\t\t\tfillImageAlts: List.replace(node.fillImageAlts, alternativeIndex, {\n\t\t\t\t...fillImageAlt,\n\t\t\t\timage: assetReference,\n\t\t\t}),\n\t\t})\n\t})\n}\n", "import \"FillImageAltRows.styles_1h190fi.wyw.css\"; export const sortable = \"sortable_s14rcm56\";", "import type { NodeID } from \"document/models/CanvasTree/index.ts\"\n\nexport function getFillImageAltPopoutId(id: NodeID): string {\n\treturn `fill-image-alt-${id}`\n}\n", "import { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport type { CanvasTree, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { randomID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { type FillImageAlt, withFillImageAlts } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport { getFillImageAltPopoutId } from \"./getFillImageAltPopoutId.ts\"\n\nexport function addFillImageAltForNodes(tree: CanvasTree, nodeIds: NodeID[]) {\n\tconst nodes = tree.getNodesWithTrait(nodeIds, withFillImageAlts)\n\tlet popoutId: string | undefined\n\n\tfor (const node of nodes) {\n\t\tconst id = randomID()\n\t\tif (!popoutId) popoutId = id\n\n\t\tconst fillImageAltSettings: FillImageAlt = { id, image: \"\", alt: \"\" }\n\t\tconst fillImageAltsForNode = !node.fillImageAlts\n\t\t\t? [fillImageAltSettings]\n\t\t\t: [...node.fillImageAlts, fillImageAltSettings]\n\t\tnode.set({ fillImageAlts: fillImageAltsForNode }, tree)\n\t}\n\n\tif (popoutId) {\n\t\tpopoutWindow.navigation.presentPopoutOnRegistration(getFillImageAltPopoutId(popoutId))\n\t}\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { withOptionalFill } from \"document/models/CanvasTree/traits/WithFill.ts\"\n\nexport const addFillForNodes = (engine: VekterEngine, nodeIds: NodeID[]) => {\n\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withOptionalFill)\n\tnodes.forEach(node => node.set({ fillEnabled: true }))\n\tpopoutWindow.navigation.presentPopoutOnRegistration(\"fill\")\n}\n", "import { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { ConvertColor } from \"library/index.ts\"\n\nexport function getDefaultGradientStops(color: string | undefined): GradientColorStop[] {\n\tconst targetColor = color ?? \"black\"\n\tconst endColor = ConvertColor.setAlpha(targetColor, 1)\n\tconst hsl = ConvertColor.toHSL(endColor)\n\tconst isDark = hsl.l < 0.5\n\tconst startColor = ConvertColor.hslToRgbString({ ...hsl, l: hsl.l + (isDark ? 0.33 : -0.33) })\n\n\treturn [\n\t\tnew GradientColorStop({ value: isDark ? startColor : endColor, position: 0 }),\n\t\tnew GradientColorStop({ value: isDark ? endColor : startColor, position: 1 }),\n\t]\n}\n", "import type { AssetService } from \"@framerjs/assets\"\nimport { unhandledError } from \"@framerjs/shared\"\nimport { experiments } from \"app/experiments.ts\"\nimport { isRichTextEditTool } from \"document/components/tools/RichTextEditTool.ts\"\nimport { getClosestToRegularFont } from \"document/components/utils/getClosestToRegularFont.ts\"\nimport { getFontUpdateValues, getFontVariantSelectors } from \"document/components/utils/getFontUpdateValues.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { WithFontVariants } from \"document/models/CanvasTree/traits/WithFontVariants.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { VariationAxesToValues } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport {\n\tcssToVariationAxes,\n\tisFontVariable,\n\tparseAxesFromFontSelector,\n} from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { fontStore } from \"library/index.ts\"\nimport type { ReadonlyFont, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport React, { useCallback, useRef } from \"react\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { getSimilarFontForSelector } from \"../../panels/utils/textStyle.ts\"\nimport { FontRow } from \"../FontRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle & WithFontVariants\n\tdeleteEnabled?: boolean\n\temptyLabel?: string\n}\n\nconst emptyVariationAxes: Readonly<VariationAxesToValues> = {}\n\nfunction duplicateTeamFontAssetIfNeeded(selector: string) {\n\tconst font = fontStore.getFontBySelector(selector)\n\tif (font?.owner !== \"team\") return\n\tconst assetKey = font.assetKey\n\tconst teamId = engine.stores.projectStore.project?.space.ownerId\n\tconst assetService: AssetService | undefined = engine.stores.assetStore.assetService\n\n\tif (assetKey && teamId && assetService) {\n\t\tvoid assetService.duplicateWorkspaceAssets([assetKey], teamId).catch(unhandledError)\n\t}\n}\n\nexport function StylePresetFontRow({ preset, deleteEnabled, emptyLabel }: Props) {\n\t// Track the requested selector to handle out-of-order async font loading\n\tconst pendingFontPreviewSelector = useRef<string | null>(null)\n\n\tconst changeFont = engine.scheduler.wrapHandler(({ selector: font }: ReadonlyFont) => {\n\t\tduplicateTeamFontAssetIfNeeded(font)\n\t\tconst fontVariantUpdates = getFontUpdateValues(preset, font)\n\t\tengine.tree.current(preset)?.set({ font, ...fontVariantUpdates })\n\t})\n\n\tconst changeFontFamily = engine.scheduler.wrapHandler((fontFamily: ReadonlyFontFamily) => {\n\t\tconst defaultFont = getClosestToRegularFont(fontFamily)\n\t\tconst font = getSimilarFontForSelector(preset.font, fontFamily) ?? defaultFont\n\n\t\tduplicateTeamFontAssetIfNeeded(font.selector)\n\n\t\tconst variants = getFontVariantSelectors(font)\n\n\t\tengine.tree.current(preset)?.set({\n\t\t\tfont: font.selector,\n\t\t\t...variants,\n\t\t})\n\t})\n\n\tconst deleteFont = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({\n\t\t\tfont: undefined,\n\t\t\tfontBold: undefined,\n\t\t\tfontBoldItalic: undefined,\n\t\t\tfontItalic: undefined,\n\t\t})\n\t})\n\n\tconst onHighlightFontFamily = useCallback(\n\t\t(fontFamily: ReadonlyFontFamily) => {\n\t\t\tif (!experiments.isOn(\"fontPreviewStylePresets\")) return\n\n\t\t\tconst regularFontVariant = getClosestToRegularFont(fontFamily)\n\t\t\tconst font = getSimilarFontForSelector(preset.font, fontFamily) ?? regularFontVariant\n\t\t\tconst isVariable = isFontVariable(font)\n\n\t\t\tconst variantSelectors = {\n\t\t\t\tfontBold: (isVariable && font.selectorVariable) || font.selectorBold,\n\t\t\t\tfontItalic: (isVariable && font.selectorVariableItalic) || font.selectorItalic,\n\t\t\t\tfontBoldItalic: (isVariable && font.selectorVariableItalic) || font.selectorBoldItalic,\n\t\t\t}\n\n\t\t\tif (isRichTextEditTool(engine.tool)) {\n\t\t\t\t// When editing text, we load the fonts in the app's Chrome/HUD context, where the editor is\n\t\t\t\t// rendered\n\t\t\t\tconst fontsToLoad = [\n\t\t\t\t\tfont.selector,\n\t\t\t\t\tvariantSelectors.fontBold,\n\t\t\t\t\tvariantSelectors.fontItalic,\n\t\t\t\t\tvariantSelectors.fontBoldItalic,\n\t\t\t\t].filter(isString)\n\n\t\t\t\tpendingFontPreviewSelector.current = font.selector\n\n\t\t\t\tvoid fontStore.loadFonts(fontsToLoad).then(() => {\n\t\t\t\t\t// Only apply preview if this is still the most recent request\n\t\t\t\t\tif (pendingFontPreviewSelector.current === font.selector) {\n\t\t\t\t\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t\t\t\t\tengine.stores.fontPreviewStore.enterPreviewForStylePreset(preset.id, font.selector, variantSelectors)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t\t\tengine.stores.fontPreviewStore.enterPreviewForStylePreset(preset.id, font.selector, variantSelectors)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[preset.font, preset.id],\n\t)\n\n\tconst onHighlightEnd = useCallback(() => {\n\t\tif (!experiments.isOn(\"fontPreviewStylePresets\")) return\n\n\t\tpendingFontPreviewSelector.current = null\n\t\tengine.scheduler.processWhenReady(engine.stores.fontPreviewStore.exitPreviewForStylePreset)\n\t}, [])\n\n\tconst [variationAxes, fontSelector] = React.useMemo(() => {\n\t\tif (isUndefined(preset.font)) return [emptyVariationAxes, undefined]\n\t\tconst { selector, axesCSS } = parseAxesFromFontSelector(preset.font)\n\t\tconst axes = isUndefined(axesCSS) ? emptyVariationAxes : (cssToVariationAxes(axesCSS) ?? emptyVariationAxes)\n\t\treturn [axes, selector]\n\t}, [preset.font])\n\n\tconst selectedFonts = preset.font ? new Set([fontSelector]) : new Set<string>()\n\n\tconst onDelete = deleteEnabled && preset.font !== undefined ? deleteFont : undefined\n\n\treturn (\n\t\t<FontRow\n\t\t\tpopoutIdentifier=\"text-style-preset-typeface\"\n\t\t\tselectedFonts={selectedFonts}\n\t\t\tvariationAxes={variationAxes}\n\t\t\tonChange={changeFont}\n\t\t\tonChangeFontFamily={changeFontFamily}\n\t\t\tonDelete={onDelete}\n\t\t\temptyLabel={emptyLabel}\n\t\t\tonHighlightFontFamily={onHighlightFontFamily}\n\t\t\tonHighlightEnd={onHighlightEnd}\n\t\t/>\n\t)\n}\n", "import { REGULAR_FONT_WEIGHT } from \"@framerjs/app-shared\"\nimport { assertNever } from \"@framerjs/shared\"\nimport type {\n\tFontSizeCSSDimension,\n\tFontSizeUnit,\n\tLetterSpacingUnit,\n\tLineHeightUnit,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport {\n\tconvertFontSizeValue,\n\tisFontSizeCSSDimension,\n\tisLetterSpacingUnit,\n\tisLineHeightUnit,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { ReadonlyFont, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { isNumber, isString } from \"utils/typeChecks.ts\"\n\n// excludes `auto` as not everywhere supports that\nexport function getFontSizeUnitFromValue(rawValue?: string): FontSizeUnit | undefined {\n\t// If the user types px, convert the preset to px if possible.\n\tif (rawValue?.toLowerCase().endsWith(\"px\")) return \"px\"\n\t// If the user types rem, convert the preset to rem if possible.\n\tif (rawValue?.toLowerCase().endsWith(\"rem\")) return \"rem\"\n}\n\n// excludes `auto` as not everywhere supports that\nexport const supportedFontSizeUnits: FontSizeUnit[] = [\"px\", \"rem\"]\n\n// Letter spacing\nexport const letterSpacingDefaultValue = 0\n\nexport function getLetterSpacingUnitFromValue(value: unknown): LetterSpacingUnit | undefined {\n\tif (!isString(value)) return\n\tconst [, unit] = parseCSSDimension(value)\n\tif (isLetterSpacingUnit(unit)) return unit\n}\n\n// Line height\n\nexport function getLineHeightDefaultForUnit(unit: LineHeightUnit, fontSize?: number | FontSizeCSSDimension): number {\n\tswitch (unit) {\n\t\tcase \"em\":\n\t\t\treturn 1.2\n\t\tcase \"%\":\n\t\t\treturn 100\n\t\tcase \"px\":\n\t\t\tif (isNumber(fontSize)) return fontSize\n\t\t\tif (isFontSizeCSSDimension(fontSize)) {\n\t\t\t\tconst [size, unitFromFontSize] = parseCSSDimension(fontSize)\n\t\t\t\treturn convertFontSizeValue(size, unitFromFontSize, \"px\")\n\t\t\t}\n\t\t\treturn 12\n\t\tdefault:\n\t\t\tassertNever(unit)\n\t}\n}\n\nexport function getLineHeightUnitFromValue(value: unknown): LineHeightUnit | undefined {\n\tif (typeof value !== \"string\") return\n\tconst [, unit] = parseCSSDimension(value)\n\tif (isLineHeightUnit(unit)) return unit\n}\n\n// Font\n\nfunction getFontVariant(selector: string) {\n\tconst index = selector.indexOf(\"-\")\n\tif (index < 0) return \"regular\"\n\treturn selector.slice(index + 1).toLowerCase()\n}\n\nfunction parseFontSelector(selector: string, font: ReadonlyFont | undefined) {\n\tconst variant = getFontVariant(selector)\n\n\tlet weight: number\n\tlet style: string\n\n\tif (font?.weight) {\n\t\tweight = font.weight\n\t} else {\n\t\tweight = parseInt(variant, 10) || REGULAR_FONT_WEIGHT\n\t}\n\n\tif (font?.style) {\n\t\tstyle = font.style\n\t} else {\n\t\tstyle = variant.includes(\"italic\") ? \"italic\" : \"normal\"\n\t}\n\n\treturn [weight, style] as const\n}\n\nexport function getSimilarFontForSelector(selector: string | undefined, fontFamily: ReadonlyFontFamily) {\n\tif (selector === undefined) return\n\n\tconst prevFont = fontStore.getFontBySelector(selector)\n\tconst [prevWeight, prevStyle] = parseFontSelector(selector, prevFont)\n\n\tfor (const font of fontFamily.fonts) {\n\t\tconst [weight, style] = parseFontSelector(font.selector, font)\n\n\t\tif (weight === prevWeight && style === prevStyle) {\n\t\t\treturn font\n\t\t}\n\t}\n}\n", "import { PopupButton, PopupButtonItem, useReadOnly } from \"@framerjs/fresco\"\nimport { assert, isEmptyObject } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport { isFontVariable } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { getFontsSortedByWeightAndStyle } from \"library/render/fonts/getFontsSortedByWeightAndStyle.ts\"\nimport type { FontSelector, ReadonlyFont, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { useCallback, useMemo, useState } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { getFirstItemFromIterable } from \"utils/getFirstItemFromIterable.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { FontSource } from \"../../shared/FontPopout/FontCategoryPicker.tsx\"\nimport { FontPopoutButton } from \"../../shared/FontPopout/FontPopoutButton.tsx\"\nimport { useFontPopoutInfo } from \"../../shared/FontPopout/useFontPopoutInfo.ts\"\nimport { formatFamilyName } from \"../../shared/FontPopout/utils/formatFontFamily.ts\"\nimport { selectAllNodesWithMissingFont } from \"../../shared/FontPopout/utils/selectAllFonts.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport { getFontVariantName } from \"../utils/getFontVariantName.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nconst fontTraitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"font\", \"html\"]\n\ninterface FontRowProps {\n\tnodeIds?: NodeID[]\n\tpopoutIdentifier?: string\n\t/** A list of font selectors */\n\tselectedFonts: Set<FontSelector | undefined>\n\tsupportsCopyPaste?: boolean\n\tvariationAxes?: ReducedFontVariationAxes\n\tonChange: (font: ReadonlyFont) => void\n\tonChangeFontFamily: (fontFamily: ReadonlyFontFamily) => void\n\tonDelete?: () => void\n\temptyLabel?: string\n\tonHighlightFontFamily?: (fontFamily: ReadonlyFontFamily) => void\n\tonHighlightEnd?: () => void\n}\n\nexport function FontRow({\n\tnodeIds,\n\tselectedFonts,\n\tpopoutIdentifier,\n\tvariationAxes,\n\tsupportsCopyPaste = false,\n\tonChange,\n\tonChangeFontFamily,\n\tonHighlightFontFamily,\n\tonHighlightEnd,\n\tonDelete,\n\temptyLabel,\n}: FontRowProps) {\n\tconst [source, setSource] = useState(FontSource.All)\n\n\tconst canCopyFont = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && selectedFonts.size === 1,\n\t\t[selectedFonts, supportsCopyPaste],\n\t)\n\n\tconst [canPasteFont, pasteFont, copyFont] = useCopyAndPasteSingleProperty(TraitType.Font, nodeIds, canCopyFont)\n\n\tconst { missingFontSelectors, selectedFontFamilies, selectedFontObjects } = useFontPopoutInfo({\n\t\tengine,\n\t\tselectedFonts,\n\t\tsource,\n\t})\n\n\t// Only when a single font family is selected\n\tlet availableFonts: readonly ReadonlyFont[] | undefined\n\n\tif (selectedFontFamilies.size === 1 && missingFontSelectors.size === 0) {\n\t\tconst [selectedFontFamily] = selectedFontFamilies\n\t\tassert(selectedFontFamily, \"Selected font family should exist\")\n\n\t\tavailableFonts = getFontsSortedByWeightAndStyle(selectedFontFamily.fonts)\n\t}\n\n\tconst customFontGroupingEnabled = useExperimentIsOn(\"customFontGrouping\")\n\tconst fontVariantItems = createFontVariantItems(\n\t\tavailableFonts,\n\t\tvariationAxes,\n\t\tselectedFontObjects,\n\t\tcustomFontGroupingEnabled,\n\t)\n\tconst readOnly = useReadOnly()\n\tconst onContextMenu = useCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tconst { clientX: x, clientY: y } = event\n\t\t\tconst hasMissingFonts = missingFontSelectors.size > 0\n\t\t\tconst onCopy = supportsCopyPaste ? copyFont : undefined\n\t\t\tconst onPaste = supportsCopyPaste ? pasteFont : undefined\n\t\t\tconst canDelete = Boolean(onDelete && !readOnly)\n\n\t\t\tconst items: MenuItemOptions[] = []\n\t\t\tif (hasMissingFonts) {\n\t\t\t\titems.push({\n\t\t\t\t\tlabel: \"Select All\",\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tconst missingFontSelector = getFirstItemFromIterable(missingFontSelectors)\n\t\t\t\t\t\tif (missingFontSelector) {\n\t\t\t\t\t\t\tselectAllNodesWithMissingFont(missingFontSelector)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tvisible: hasMissingFonts,\n\t\t\t\t\t// Only show the select all button if there is exactly one missing font\n\t\t\t\t\t// selector, when you multiselect layers with different missing fonts, we\n\t\t\t\t\t// disable select all, because we take the first missing font anyway.\n\t\t\t\t\tenabled: missingFontSelectors.size === 1,\n\t\t\t\t})\n\t\t\t\titems.push({\n\t\t\t\t\ttype: \"separator\",\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (onCopy) {\n\t\t\t\titems.push({\n\t\t\t\t\tlabel: \"Copy\",\n\t\t\t\t\tclick: onCopy,\n\t\t\t\t\tvisible: !!onCopy,\n\t\t\t\t\tenabled: canCopyFont && !hasMissingFonts,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (onPaste) {\n\t\t\t\titems.push({\n\t\t\t\t\tlabel: \"Paste\",\n\t\t\t\t\tclick: onPaste,\n\t\t\t\t\tvisible: !!onPaste,\n\t\t\t\t\tenabled: async () => {\n\t\t\t\t\t\treturn !readOnly && (await canPasteFont())\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (onDelete) {\n\t\t\t\titems.push({\n\t\t\t\t\ttype: \"separator\",\n\t\t\t\t})\n\t\t\t\titems.push({\n\t\t\t\t\tlabel: Dictionary.Remove,\n\t\t\t\t\tclick: onDelete,\n\t\t\t\t\tvisible: canDelete,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (items.length > 0) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tengine.stores.contextMenuStore.show(items, { location: { x, y } })\n\t\t\t}\n\t\t},\n\t\t[canCopyFont, copyFont, canPasteFont, pasteFont, onDelete, readOnly, missingFontSelectors, supportsCopyPaste],\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title=\"Font\" traitTypeKeys={fontTraitTypeKeys} onContextMenu={onContextMenu}>\n\t\t\t\t<FontPopoutButton\n\t\t\t\t\tpopoutIdentifier={popoutIdentifier}\n\t\t\t\t\tonSelectFontFamily={onChangeFontFamily}\n\t\t\t\t\tselectedFontFamilies={selectedFontFamilies}\n\t\t\t\t\tmissingFontSelectors={missingFontSelectors}\n\t\t\t\t\tselectedFonts={selectedFonts}\n\t\t\t\t\tselectedSource={source}\n\t\t\t\t\tonSelectSource={setSource}\n\t\t\t\t\temptyLabel={emptyLabel}\n\t\t\t\t\tonHighlightFontFamily={onHighlightFontFamily}\n\t\t\t\t\tonHighlightEnd={onHighlightEnd}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\n\t\t\t{missingFontSelectors.size === 0 && (\n\t\t\t\t<PanelRow\n\t\t\t\t\ttitle=\"Weight\"\n\t\t\t\t\tcopyEnabled={canCopyFont}\n\t\t\t\t\tonCopy={supportsCopyPaste ? copyFont : undefined}\n\t\t\t\t\tpasteEnabled={canPasteFont}\n\t\t\t\t\tonPaste={supportsCopyPaste ? pasteFont : undefined}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t>\n\t\t\t\t\t<div style={doubleColumn}>\n\t\t\t\t\t\t<PopupButton enabled={selectedFontFamilies.size === 1 && fontVariantItems.length > 0}>\n\t\t\t\t\t\t\t{selectedFonts.size === 0 && <PopupButtonItem title={Dictionary.Inherit} selected={true} />}\n\t\t\t\t\t\t\t{fontVariantItems.map(item => {\n\t\t\t\t\t\t\t\tif (item.type === \"divider\") return <PopupButtonItem key={item.id} type={item.type} />\n\t\t\t\t\t\t\t\tconst { title, selected, hidden, font } = item\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\t\tkey={font.selector}\n\t\t\t\t\t\t\t\t\t\tidentifier={font.selector}\n\t\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\t\tselected={selected}\n\t\t\t\t\t\t\t\t\t\tvisible={!hidden}\n\t\t\t\t\t\t\t\t\t\tonSelect={() => onChange(font)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t</div>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t</>\n\t)\n}\n\ninterface FontVariantItem {\n\ttype: \"variant\"\n\tvariantType: \"static\" | \"variable\"\n\ttitle: string\n\tselected: boolean\n\thidden?: boolean\n\tfont: ReadonlyFont\n}\n\ninterface VariantDivider {\n\ttype: \"divider\"\n\tid: string\n}\n\nfunction createFontVariantItems(\n\tvariants: readonly ReadonlyFont[] | undefined,\n\tvariationAxes: ReducedFontVariationAxes | undefined,\n\tselectedFontObjects: Set<ReadonlyFont>,\n\tcustomFontGroupingEnabled: boolean,\n): (FontVariantItem | VariantDivider)[] {\n\tif (!variants) return []\n\n\tconst staticVariants: FontVariantItem[] = []\n\tconst variableVariants: FontVariantItem[] = []\n\n\tfor (const font of variants) {\n\t\tconst isValidVariableFont = !isUndefined(variationAxes) && !isEmptyObject(variationAxes)\n\t\tconst rawTitle = getFontVariantName(font, variationAxes)\n\t\tconst title = formatFamilyName(rawTitle)\n\n\t\tif (isFontVariable(font)) {\n\t\t\tconst variantType = \"variable\"\n\t\t\tconst selected = selectedFontObjects.has(font) && isValidVariableFont\n\t\t\tvariableVariants.push({\n\t\t\t\ttype: \"variant\",\n\t\t\t\tvariantType,\n\t\t\t\ttitle,\n\t\t\t\tselected,\n\t\t\t\thidden: customFontGroupingEnabled ? false : !selected,\n\t\t\t\tfont,\n\t\t\t})\n\t\t} else {\n\t\t\tconst selected = selectedFontObjects.has(font)\n\t\t\tstaticVariants.push({ type: \"variant\", variantType: \"static\", title, selected, font })\n\t\t}\n\t}\n\n\tif (variableVariants.length > 0 && variableVariants.some(item => !item.hidden)) {\n\t\treturn [...staticVariants, { type: \"divider\", id: \"divider\" }, ...variableVariants]\n\t}\n\treturn staticVariants\n}\n", "import { PopupButton, PopupButtonItem } from \"@framerjs/fresco\"\nimport type { MetricsInteractionViews } from \"app/metrics.ts\"\n\nexport enum FontSource {\n\tAll = \"All\",\n\tLocal = \"Local\",\n\tWeb = \"Web\",\n\tCustom = \"Custom\",\n\tVariable = \"Variable\",\n\tFontshare = \"Fontshare\",\n\tBuiltIn = \"Open Source\",\n\tCollletttivo = \"Collletttivo\",\n\tGoogle = \"Google\",\n}\n\ninterface Props {\n\tselected: FontSource\n\tmetricsView: MetricsInteractionViews\n\tonChange: (source: FontSource) => void\n}\n\nconst FontCategoryItem = {\n\t...FontSource,\n\tDivider: \"Divider\",\n} as const\n\ntype FontCategory = (typeof FontCategoryItem)[keyof typeof FontCategoryItem]\n\nconst fontCategories: FontCategory[] = [\n\tFontCategoryItem.All,\n\tFontCategoryItem.Divider,\n\tFontCategoryItem.Web,\n\tFontCategoryItem.Custom,\n\tFontCategoryItem.Divider,\n\tFontCategoryItem.Google,\n\tFontCategoryItem.Fontshare,\n\tFontCategoryItem.Divider,\n\tFontCategoryItem.BuiltIn,\n\tFontCategoryItem.Collletttivo,\n\tFontCategoryItem.Divider,\n\tFontCategoryItem.Variable,\n]\n\nexport function FontCategoryPicker({ selected, onChange, metricsView }: Props) {\n\treturn (\n\t\t<PopupButton>\n\t\t\t{fontCategories.map((category, index) => {\n\t\t\t\tif (category === FontCategoryItem.Divider) {\n\t\t\t\t\treturn <PopupButtonItem key={`${category}-${index}`} type=\"divider\" />\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tkey={category}\n\t\t\t\t\t\ttitle={category}\n\t\t\t\t\t\tidentifier={category}\n\t\t\t\t\t\tselected={category === selected}\n\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\tdata-metric-id={metricIdForFontSource(category)}\n\t\t\t\t\t\tdata-metric-view={metricsView}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</PopupButton>\n\t)\n}\n\nfunction metricIdForFontSource(source: FontSource): string {\n\tswitch (source) {\n\t\tcase FontSource.All:\n\t\t\treturn \"tab-typeface-all\"\n\t\tcase FontSource.Local:\n\t\t\treturn \"tab-typeface-local\"\n\t\tcase FontSource.Web:\n\t\t\treturn \"tab-typeface-google\"\n\t\tcase FontSource.Custom:\n\t\t\treturn \"tab-typeface-custom\"\n\t\tcase FontSource.Variable:\n\t\t\treturn \"tab-typeface-variable\"\n\t\tcase FontSource.Fontshare:\n\t\t\treturn \"tab-typeface-fontshare\"\n\t\tcase FontSource.Google:\n\t\t\treturn \"tab-typeface-google\"\n\t\tcase FontSource.BuiltIn:\n\t\t\treturn \"tab-typeface-builtin\"\n\t\tcase FontSource.Collletttivo:\n\t\t\treturn \"tab-typeface-collletttivo\"\n\t}\n}\n", "import { dashboardPath } from \"@framerjs/app-shared\"\nimport type { VirtualListProps } from \"@framerjs/fresco\"\nimport { SearchBar, Stack, VirtualList, useReadOnly } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { debounce, getServiceMap } from \"@framerjs/shared\"\nimport { noop } from \"@framerjs/shared/src/noop.ts\"\nimport { cx } from \"@linaria/core\"\nimport { MetricsViewContext } from \"app/metrics.ts\"\nimport engine from \"document/engine.ts\"\nimport type { FontSelector, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport type { Point } from \"library/render/types/Point.ts\"\nimport { useCallbackOne, useMemoOne } from \"library/utils/useMemoOne.ts\"\nimport { useStableCallback } from \"library/utils/useStableCallback.ts\"\nimport React from \"react\"\nimport { getFirstItemFromIterable } from \"utils/getFirstItemFromIterable.ts\"\nimport { popoutWindow } from \"../PopoutWindow.tsx\"\nimport { useWebProjectService } from \"../utils/useWebProjectService.ts\"\nimport { FontCategoryPicker, FontSource } from \"./FontCategoryPicker.tsx\"\nimport * as classes from \"./FontPopout.styles.ts\"\nimport { usePreloadFontPreviews } from \"./FontPreview.tsx\"\nimport { fontFamilyPreviewHeight } from \"./ListItem.styles.ts\"\nimport { ListItem } from \"./ListItem.tsx\"\nimport { ListStateWrapper } from \"./ListStateWrapper.tsx\"\nimport { useFontPopoutInfo } from \"./useFontPopoutInfo.ts\"\n\nexport interface FontPopoutProps {\n\tselectedFonts: Set<FontSelector | undefined>\n\tonSelectFontFamily: (fontFamily: ReadonlyFontFamily) => void\n\tonSelectSource: (source: FontSource) => void\n\tselectedSource: FontSource\n\tonHighlightFontFamily?: (fontFamily: ReadonlyFontFamily) => void\n\tonHighlightEnd?: () => void\n}\n\nexport function FontPopout({\n\tselectedFonts,\n\tonSelectFontFamily,\n\tonSelectSource,\n\tselectedSource,\n\tonHighlightFontFamily = noop,\n\tonHighlightEnd = noop,\n}: FontPopoutProps) {\n\tconst isReadOnly = useReadOnly()\n\n\tconst { allFontFamilies, missingFontSelectors, selectedFontFamilies, selectedFontObjects } = useFontPopoutInfo({\n\t\tengine,\n\t\tselectedFonts,\n\t\tsource: selectedSource,\n\t})\n\n\tconst metricsView = React.useContext(MetricsViewContext)\n\tconst [search, setSearch] = React.useState(\"\")\n\tconst [highlight, setHighlight] = React.useState(-1)\n\tconst [highlightVisible, setHighlightVisible] = React.useState(true)\n\tconst [scrollToIndex, setScrollToIndex] = React.useState(-1)\n\tconst [scrollToAlignment, setScrollToAlignment] = React.useState<VirtualListProps[\"scrollToAlignment\"]>(\"center\")\n\n\tconst normalizedSearch = search.toLowerCase().trim()\n\tconst filteredFontFamilies = normalizedSearch\n\t\t? allFontFamilies.filter(fontFamily => fontFamily.name.toLowerCase().includes(normalizedSearch))\n\t\t: allFontFamilies\n\n\tconst searchInputRef = React.useRef<HTMLInputElement>(null)\n\n\tconst highlightRef = React.useRef(highlight)\n\thighlightRef.current = highlight\n\n\tconst { webProjectServiceRef, canMoveProject, currentSpace } = useWebProjectService()\n\n\tconst teamFontSettingsPath = `${\n\t\tgetServiceMap().app\n\t}${dashboardPath}?team=${currentSpace?.id}&open-settings=1&settings-tab=fonts`\n\n\tconst [scrollToState, setScrollToState] = React.useState<{ search: string; selectedSource: FontSource } | null>(null)\n\n\tconst { debouncedOnHighlightFontFamily, immediateOnHighlightFontFamily, immediateOnHighlightEnd } =\n\t\tuseDebouncedOnHighlightFontFamily(onHighlightFontFamily, onHighlightEnd)\n\n\t// Scroll selected item into view on first render or when the search or selected source changes\n\tif (!scrollToState || scrollToState.search !== search || scrollToState.selectedSource !== selectedSource) {\n\t\tsetScrollToState({ search, selectedSource })\n\n\t\tconst firstSelectedFontFamily = getFirstItemFromIterable(selectedFontFamilies)\n\t\tconst indexOfSelectedFontFamily = firstSelectedFontFamily\n\t\t\t? filteredFontFamilies.indexOf(firstSelectedFontFamily)\n\t\t\t: -1\n\n\t\tconst newScrollToIndex = indexOfSelectedFontFamily !== -1 ? indexOfSelectedFontFamily : 0\n\t\tsetScrollToAlignment(\"center\")\n\t\tsetScrollToIndex(newScrollToIndex)\n\t\tsetHighlight(newScrollToIndex)\n\t\tsetHighlightVisible(true)\n\t\tconst highlightedFontFamily = filteredFontFamilies[newScrollToIndex]\n\t\tif (highlightedFontFamily) {\n\t\t\tdebouncedOnHighlightFontFamily(highlightedFontFamily)\n\t\t} else {\n\t\t\timmediateOnHighlightEnd()\n\t\t}\n\t}\n\n\tconst handleMoveToTeam = ({ x, y }: Point) => {\n\t\tif (!webProjectServiceRef.current || !canMoveProject || isReadOnly) return\n\n\t\tvoid webProjectServiceRef.current.showMoveProjectMenu({\n\t\t\tlocation: { x, y },\n\t\t})\n\t}\n\n\tconst selectFontFamily = React.useCallback(\n\t\t(value: ReadonlyFontFamily) => {\n\t\t\tif (isReadOnly) return\n\t\t\tonSelectFontFamily(value)\n\t\t\tconst index = filteredFontFamilies.indexOf(value)\n\t\t\tsetScrollToIndex(index)\n\t\t},\n\t\t[onSelectFontFamily, filteredFontFamilies, isReadOnly],\n\t)\n\n\tconst searchHandler = React.useCallback(\n\t\t(value: string) => {\n\t\t\tif (search === value) return\n\t\t\tsetSearch(value)\n\t\t\tsetScrollToIndex(-1)\n\t\t},\n\t\t[search],\n\t)\n\n\tconst sourceChangeHandler = React.useCallback(\n\t\t(source: FontSource) => {\n\t\t\tonSelectSource(source)\n\t\t\tsetScrollToIndex(-1)\n\t\t\tsearchInputRef.current?.focus()\n\t\t},\n\t\t[onSelectSource],\n\t)\n\n\tconst keydownHandler = React.useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"Enter\": {\n\t\t\t\t\tconst currentHighlight = highlightRef.current\n\t\t\t\t\tconst selectedItem = filteredFontFamilies[currentHighlight]\n\t\t\t\t\tif (!selectedItem) break\n\t\t\t\t\tselectFontFamily(selectedItem)\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\tconst currentHighlight = highlightRef.current\n\t\t\t\t\tlet newIndex = event.key === \"ArrowUp\" ? currentHighlight - 1 : currentHighlight + 1\n\t\t\t\t\t// If the key is repeating we don't want to move to the other end of the list\n\t\t\t\t\tif (newIndex >= filteredFontFamilies.length) {\n\t\t\t\t\t\tnewIndex = event.repeat ? filteredFontFamilies.length - 1 : 0\n\t\t\t\t\t} else if (newIndex < 0) {\n\t\t\t\t\t\tnewIndex = event.repeat ? 0 : filteredFontFamilies.length - 1\n\t\t\t\t\t}\n\t\t\t\t\tsetScrollToIndex(newIndex)\n\t\t\t\t\tsetHighlight(newIndex)\n\t\t\t\t\tsetScrollToAlignment(\"nearest-edge\")\n\t\t\t\t\tsetHighlightVisible(true)\n\n\t\t\t\t\tconst highlightedFontFamily = filteredFontFamilies[newIndex]\n\t\t\t\t\tif (highlightedFontFamily) {\n\t\t\t\t\t\timmediateOnHighlightFontFamily(highlightedFontFamily)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\tpopoutWindow.navigation.goBack()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t},\n\t\t[filteredFontFamilies, selectFontFamily, immediateOnHighlightFontFamily],\n\t)\n\n\tconst highlightClientRef = React.useRef<Point | null>(null)\n\tconst highlightHandler = React.useCallback(\n\t\t(index: number, event: React.MouseEvent, fontFamily: ReadonlyFontFamily) => {\n\t\t\tconst client = { x: event.clientX, y: event.clientY }\n\t\t\tconst previousClient = highlightClientRef.current\n\t\t\thighlightClientRef.current = client\n\n\t\t\tif (previousClient && previousClient.x === client.x && previousClient.y === client.y) return\n\t\t\tif (highlightVisible && highlight === index) return\n\n\t\t\tsetHighlight(index)\n\t\t\tsetScrollToIndex(-1)\n\t\t\tsetHighlightVisible(true)\n\t\t\timmediateOnHighlightFontFamily(fontFamily)\n\t\t},\n\t\t[highlight, highlightVisible, immediateOnHighlightFontFamily],\n\t)\n\n\tconst mouseLeaveHandler = React.useCallback(() => {\n\t\tsetHighlightVisible(false)\n\t\timmediateOnHighlightEnd()\n\t}, [immediateOnHighlightEnd])\n\n\t// Clear font preview when the popout unmounts (e.g. if user presses escape)\n\tReact.useEffect(() => {\n\t\treturn immediateOnHighlightEnd\n\t}, [immediateOnHighlightEnd])\n\n\tusePreloadFontPreviews(scrollToIndex, allFontFamilies)\n\n\treturn (\n\t\t<div className={classes.popoutContent}>\n\t\t\t<Stack padding={dimensions.css.popoverPadding} paddingTop={0}>\n\t\t\t\t<SearchBar\n\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonChange={searchHandler}\n\t\t\t\t\tonKeyDown={keydownHandler}\n\t\t\t\t\tisIconVisible={false}\n\t\t\t\t/>\n\t\t\t\t<FontCategoryPicker metricsView={metricsView} onChange={sourceChangeHandler} selected={selectedSource} />\n\t\t\t</Stack>\n\n\t\t\t<ListStateWrapper\n\t\t\t\treadOnly={isReadOnly}\n\t\t\t\tsource={selectedSource}\n\t\t\t\tmissingFontSelectors={missingFontSelectors}\n\t\t\t\tselectedFonts={selectedFontObjects}\n\t\t\t\tisEmpty={filteredFontFamilies.length === 0}\n\t\t\t\tisSearching={normalizedSearch.length > 0}\n\t\t\t\tcanMoveProject={canMoveProject}\n\t\t\t\tcurrentSpace={currentSpace || null}\n\t\t\t\tteamFontSettingsPath={teamFontSettingsPath}\n\t\t\t\tselectFontFamily={selectFontFamily}\n\t\t\t\thandleMoveToTeam={handleMoveToTeam}\n\t\t\t>\n\t\t\t\t<VirtualList\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-label=\"Font selection\"\n\t\t\t\t\titems={filteredFontFamilies}\n\t\t\t\t\theightForItem={fontFamilyPreviewHeight}\n\t\t\t\t\tkeyForItem={keyForItem}\n\t\t\t\t\tclassName={cx(classes.scroll)}\n\t\t\t\t\tscrollToIndex={scrollToIndex}\n\t\t\t\t\tscrollToAlignment={scrollToAlignment}\n\t\t\t\t\tonMouseLeave={mouseLeaveHandler}\n\t\t\t\t\tonKeyDown={keydownHandler}\n\t\t\t\t>\n\t\t\t\t\t{({ item, index }) => (\n\t\t\t\t\t\t<ListItem\n\t\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\t\tfontFamily={item}\n\t\t\t\t\t\t\treadOnly={isReadOnly}\n\t\t\t\t\t\t\tisHighlighted={highlightVisible && index === highlight}\n\t\t\t\t\t\t\tisSelected={selectedFontFamilies.has(item)}\n\t\t\t\t\t\t\tonSelect={onSelectFontFamily}\n\t\t\t\t\t\t\tonHighlight={highlightHandler}\n\t\t\t\t\t\t\trenderUsingFontFamily={selectedSource === FontSource.Local}\n\t\t\t\t\t\t\tteamFontSettingsPath={teamFontSettingsPath}\n\t\t\t\t\t\t\tmetricId={`typeface-source-${item.source}`}\n\t\t\t\t\t\t\tmetricsView={metricsView}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</VirtualList>\n\t\t\t</ListStateWrapper>\n\t\t</div>\n\t)\n}\n\nfunction keyForItem(fontFamily: ReadonlyFontFamily): string {\n\treturn `${fontFamily.name};${fontFamily.source}`\n}\n\nfunction useDebouncedOnHighlightFontFamily(\n\tonHighlightFontFamily: (fontFamily: ReadonlyFontFamily) => void,\n\tonHighlightEnd: () => void,\n) {\n\tconst stableOnHighlightFontFamily = useStableCallback(onHighlightFontFamily)\n\tconst stableOnHighlightEnd = useStableCallback(onHighlightEnd)\n\tconst debouncedOnHighlightFontFamily = useMemoOne(() => debounce(stableOnHighlightFontFamily, 200), [])\n\n\tconst immediateOnHighlightFontFamily = useCallbackOne(\n\t\t(fontFamily: ReadonlyFontFamily) => {\n\t\t\t// Cancel any possibly pending debouncedOnHighlightFontFamily calls\n\t\t\tdebouncedOnHighlightFontFamily.cancel()\n\t\t\tstableOnHighlightFontFamily(fontFamily)\n\t\t},\n\t\t[debouncedOnHighlightFontFamily],\n\t)\n\n\tconst immediateOnHighlightEnd = useCallbackOne(() => {\n\t\t// Cancel any possibly pending debouncedOnHighlightFontFamily calls\n\t\tdebouncedOnHighlightFontFamily.cancel()\n\t\tstableOnHighlightEnd()\n\t}, [debouncedOnHighlightFontFamily])\n\n\treturn { debouncedOnHighlightFontFamily, immediateOnHighlightFontFamily, immediateOnHighlightEnd }\n}\n", "import type { ServiceStream } from \"@framerjs/framer-services\"\nimport { WebProject, localChannel } from \"@framerjs/framer-services\"\nimport { getLogger } from \"@framerjs/shared\"\nimport React from \"react\"\n\nconst log = getLogger(\"app:useWebProjectService\")\n\nexport function useWebProjectService() {\n\tconst webProjectServiceRef = React.useRef<WebProject.Interface | null>(null)\n\tconst [currentSpace, setCurrentSpace] = React.useState<WebProject.ProjectSpace | undefined>(undefined)\n\tconst [canMoveProject, setCanMoveProject] = React.useState<boolean>(false)\n\n\tReact.useEffect(() => {\n\t\tlet stream: ServiceStream<WebProject.CurrentProjectEvent> | undefined\n\n\t\tWebProject.on(localChannel)\n\t\t\t.discover()\n\t\t\t.then(webProjectService => {\n\t\t\t\twebProjectServiceRef.current = webProjectService\n\n\t\t\t\tstream = webProjectService.currentProjectStream({ replay: \"latest\" })\n\t\t\t\treturn stream.read(async event => {\n\t\t\t\t\tsetCurrentSpace(event.space)\n\t\t\t\t\tsetCanMoveProject(event.canMoveProject)\n\t\t\t\t})\n\t\t\t})\n\t\t\t.catch(error => log.error(\"Error with WebProject service in Insert Menu:\", error))\n\n\t\treturn () => {\n\t\t\tstream?.cancel().catch(error => log.error(\"Error with canceling WebProject service in Insert Menu: \", error))\n\t\t}\n\t}, [])\n\n\treturn { webProjectServiceRef, canMoveProject, currentSpace, setCurrentSpace }\n}\n", "import \"FontPopout.styles_z80acb.wyw.css\"; export const popoutContent = \"popoutContent_psyfoao\";\nexport const scroll = \"scroll_s1lgtlix\";", "import { truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { getLogger, unhandledError } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { getClosestToRegularFont } from \"document/components/utils/getClosestToRegularFont.ts\"\nimport { FontSourceNames, fontStore } from \"library/index.ts\"\nimport type { ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { slugify } from \"library/utils/slugify.ts\"\nimport React, { useContext, useEffect, useMemo, useRef, useState } from \"react\"\nimport { getFontStyleProperties } from \"text\"\nimport { useDarkMode } from \"web/lib/useDarkMode.ts\"\nimport * as classes from \"./FontPreview.styles.ts\"\nimport { previews } from \"./previews/index.ts\"\nimport { getDeprecatedFontFamilyDisplayName, isDeprecatedFontFamily } from \"./utils/deprecatedFonts.ts\"\nimport { formatFamilyName } from \"./utils/formatFontFamily.ts\"\n\nconst log = getLogger(\"fontPreview\")\ninterface Props {\n\tselected: boolean\n\tfontFamily: ReadonlyFontFamily\n}\n\nexport function* generateAlternatingIndices(index: number, length: number) {\n\tconst startIndex = Math.min(length, Math.max(index, 0))\n\n\tlet step = 1\n\n\tyield startIndex\n\n\twhile (true) {\n\t\tconst indexBefore = startIndex - 1 * step\n\t\tconst indexAfter = startIndex + 1 * step\n\n\t\tconst indexBeforeInRange = indexBefore > -1\n\t\tconst indexAfterInRange = indexAfter < length\n\n\t\tif (indexBeforeInRange) yield indexBefore\n\t\tif (indexAfterInRange) yield indexAfter\n\n\t\tif (!indexBeforeInRange && !indexAfterInRange) return\n\n\t\tstep++\n\t}\n}\n\nfunction preloadImage(url: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst image = new Image()\n\n\t\timage.src = url\n\t\timage.onload = () => resolve(image)\n\t\timage.onerror = err => reject(err)\n\t})\n}\n\nfunction getPreviewUrl(familyName: string): string | undefined {\n\treturn previews[slugify(familyName) as keyof typeof previews]\n}\n\ntype Index = number\ntype FontFamily = string\n\ninterface PreloadData {\n\t// Items from the map are removed once they are preloaded, eventually emptying out once everything is preloaded.\n\tfontFamiliesToPreload: Map<Index, FontFamily>\n\ttotalCount: number\n}\n\nconst preloadedFontPreviewsContext = React.createContext<{ preloadData: PreloadData | null }>({\n\tpreloadData: null,\n})\n\nfunction usePreloadData(fonts: ReadonlyFontFamily[]): PreloadData {\n\tconst preloadedFontPreviews = useContext(preloadedFontPreviewsContext)\n\n\tif (!preloadedFontPreviews.preloadData) {\n\t\tconst fontFamiliesToPreload = new Map<Index, FontFamily>()\n\n\t\tfonts.forEach((font, index) => fontFamiliesToPreload.set(index, font.name))\n\t\tpreloadedFontPreviews.preloadData = { fontFamiliesToPreload, totalCount: fonts.length }\n\t}\n\n\treturn preloadedFontPreviews.preloadData\n}\n\nexport function usePreloadFontPreviews(currentIndex: number, fonts: ReadonlyFontFamily[]) {\n\tconst preloadData = usePreloadData(fonts)\n\n\tuseEffect(() => {\n\t\tif (currentIndex === -1 || preloadData.fontFamiliesToPreload.size === 0) return\n\n\t\tlet isActive = true\n\n\t\tasync function preloadFontFamilies() {\n\t\t\t// Font previews are preloaded by alternating between a font above and a font below the currently selected\n\t\t\t// font until all previews are loaded. This is because we don't know which way the user will scroll when opening\n\t\t\tfor await (const index of generateAlternatingIndices(currentIndex, preloadData.totalCount)) {\n\t\t\t\tif (!isActive) break\n\n\t\t\t\tconst familyName = preloadData.fontFamiliesToPreload.get(index)\n\n\t\t\t\tif (!familyName) continue\n\n\t\t\t\tconst url = getPreviewUrl(familyName)\n\n\t\t\t\tif (!url) continue\n\n\t\t\t\tawait preloadImage(url).catch(error => {\n\t\t\t\t\tlog.debug(\"failed to preload:\", url, error)\n\t\t\t\t})\n\t\t\t\tpreloadData.fontFamiliesToPreload.delete(index)\n\t\t\t}\n\t\t}\n\n\t\tpreloadFontFamilies().catch(unhandledError)\n\n\t\treturn () => {\n\t\t\tisActive = false\n\t\t}\n\t}, [currentIndex, preloadData])\n}\n\nexport function FontPreview({ selected, fontFamily }: Props) {\n\tconst fontPreviewElement = useRef<HTMLDivElement>(null)\n\tconst [isLoaded, setIsLoaded] = useState(false)\n\tconst [isImageTooWide, setIsImageTooWide] = useState(false)\n\tconst { isDarkMode } = useDarkMode()\n\tconst isWebFontSource =\n\t\tfontFamily.source === FontSourceNames.Google ||\n\t\tfontFamily.source === FontSourceNames.Fontshare ||\n\t\tfontFamily.source === FontSourceNames.BuiltIn\n\tconst isDeprecated = isDeprecatedFontFamily(fontFamily)\n\tconst imagePath = getPreviewUrl(fontFamily.name)\n\tconst isCustomFontGroupingEnabled = useExperimentIsOn(\"customFontGrouping\")\n\n\tuseEffect(() => {\n\t\tif (!isWebFontSource || !imagePath) return\n\n\t\tpreloadImage(imagePath)\n\t\t\t.then(image => {\n\t\t\t\tif (fontPreviewElement.current && image.width > fontPreviewElement.current.clientWidth) {\n\t\t\t\t\tsetIsImageTooWide(true)\n\t\t\t\t}\n\n\t\t\t\tsetIsLoaded(true)\n\t\t\t})\n\t\t\t.catch(unhandledError)\n\t}, [fontPreviewElement, isWebFontSource, imagePath])\n\tconst regularFont = useMemo(() => {\n\t\tif (!isCustomFontGroupingEnabled) return\n\t\tif (fontFamily.source !== FontSourceNames.Custom) return\n\t\treturn getClosestToRegularFont(fontFamily)\n\t}, [fontFamily, isCustomFontGroupingEnabled])\n\tuseEffect(() => {\n\t\tif (!isCustomFontGroupingEnabled) return\n\t\tif (fontFamily.source !== FontSourceNames.Custom) return\n\t\tif (!regularFont) return\n\t\tvoid fontStore.loadFonts([regularFont.selector])\n\t}, [fontFamily, regularFont, isCustomFontGroupingEnabled])\n\n\tif (isWebFontSource && isLoaded && !isDeprecated) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={fontPreviewElement}\n\t\t\t\tclassName={cx(classes.fontPreview, isImageTooWide && classes.fontPreviewFadeOut)}\n\t\t\t\ttitle={fontFamily.name}\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\tclasses.fontImage,\n\t\t\t\t\t\tisLoaded && classes.fontImageLoaded,\n\t\t\t\t\t\t(isDarkMode || selected) && classes.invertFontImage,\n\t\t\t\t\t)}\n\t\t\t\t\tsrc={imagePath}\n\t\t\t\t\talt={fontFamily.name}\n\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tlet fontFamilyStyle: React.CSSProperties = {}\n\tswitch (fontFamily.source) {\n\t\tcase FontSourceNames.Local:\n\t\t\tfontFamilyStyle = getFontStyleProperties(fontFamily.name)\n\t\t\tbreak\n\t\tcase FontSourceNames.Custom:\n\t\t\tif (!isCustomFontGroupingEnabled) break\n\t\t\tif (!regularFont) break\n\t\t\tfontFamilyStyle = { fontFamily: regularFont.cssFamilyName }\n\t\t\tbreak\n\t}\n\n\tconst fontFamilyName = isDeprecated ? getDeprecatedFontFamilyDisplayName(fontFamily) : fontFamily.name\n\treturn (\n\t\t<div ref={fontPreviewElement} className={classes.fontPreview} style={fontFamilyStyle}>\n\t\t\t<div className={cx(truncateWithEllipsis, classes.titleWrapper)}>{formatFamilyName(fontFamilyName)}</div>\n\t\t</div>\n\t)\n}\n", "import \"FontPreview.styles_1gq4ao7.wyw.css\"; export const fontPreview = \"fontPreview_f1tx5bqc\";\nexport const fontPreviewFadeOut = \"fontPreviewFadeOut_f1vf11c9\";\nexport const fontImage = \"fontImage_fzmz7jy\";\nexport const fontImageLoaded = \"fontImageLoaded_f1hu2qe6\";\nexport const invertFontImage = \"invertFontImage_i1sg2nd\";\nexport const titleWrapper = \"titleWrapper_t1wuq31r\";", "/* eslint-disable */\n/*\n * This file is auto-generated!\n *\n * To update this file, see more info here: `./tools/font-previews/README.md`\n */\nimport _42dotSans from \"./svgs/42dot-sans.svg\"\nimport _abeezee from \"./svgs/abeezee.svg\"\nimport _abel from \"./svgs/abel.svg\"\nimport _abhayaLibre from \"./svgs/abhaya-libre.svg\"\nimport _aboreto from \"./svgs/aboreto.svg\"\nimport _abrilFatface from \"./svgs/abril-fatface.svg\"\nimport _absans from \"./svgs/absans.svg\"\nimport _abyssinicaSil from \"./svgs/abyssinica-sil.svg\"\nimport _aclonica from \"./svgs/aclonica.svg\"\nimport _acme from \"./svgs/acme.svg\"\nimport _actor from \"./svgs/actor.svg\"\nimport _adamina from \"./svgs/adamina.svg\"\nimport _adlamDisplay from \"./svgs/adlam-display.svg\"\nimport _adventPro from \"./svgs/advent-pro.svg\"\nimport _afacadFlux from \"./svgs/afacad-flux.svg\"\nimport _afacad from \"./svgs/afacad.svg\"\nimport _affigere from \"./svgs/affigere.svg\"\nimport _agbalumo from \"./svgs/agbalumo.svg\"\nimport _agdasima from \"./svgs/agdasima.svg\"\nimport _aguDisplay from \"./svgs/agu-display.svg\"\nimport _aguafinaScript from \"./svgs/aguafina-script.svg\"\nimport _aileron from \"./svgs/aileron.svg\"\nimport _akatab from \"./svgs/akatab.svg\"\nimport _akayaKanadaka from \"./svgs/akaya-kanadaka.svg\"\nimport _akayaTelivigala from \"./svgs/akaya-telivigala.svg\"\nimport _akronim from \"./svgs/akronim.svg\"\nimport _akshar from \"./svgs/akshar.svg\"\nimport _akt from \"./svgs/akt.svg\"\nimport _aktura from \"./svgs/aktura.svg\"\nimport _aladin from \"./svgs/aladin.svg\"\nimport _alanSans from \"./svgs/alan-sans.svg\"\nimport _alata from \"./svgs/alata.svg\"\nimport _alatsi from \"./svgs/alatsi.svg\"\nimport _albertSans from \"./svgs/albert-sans.svg\"\nimport _aldrich from \"./svgs/aldrich.svg\"\nimport _alef from \"./svgs/alef.svg\"\nimport _alegreyaSansSc from \"./svgs/alegreya-sans-sc.svg\"\nimport _alegreyaSans from \"./svgs/alegreya-sans.svg\"\nimport _alegreyaSc from \"./svgs/alegreya-sc.svg\"\nimport _alegreya from \"./svgs/alegreya.svg\"\nimport _aleo from \"./svgs/aleo.svg\"\nimport _alexBrush from \"./svgs/alex-brush.svg\"\nimport _alexandria from \"./svgs/alexandria.svg\"\nimport _alfaSlabOne from \"./svgs/alfa-slab-one.svg\"\nimport _alice from \"./svgs/alice.svg\"\nimport _alikeAngular from \"./svgs/alike-angular.svg\"\nimport _alike from \"./svgs/alike.svg\"\nimport _alkalami from \"./svgs/alkalami.svg\"\nimport _alkatra from \"./svgs/alkatra.svg\"\nimport _allan from \"./svgs/allan.svg\"\nimport _allertaStencil from \"./svgs/allerta-stencil.svg\"\nimport _allerta from \"./svgs/allerta.svg\"\nimport _allison from \"./svgs/allison.svg\"\nimport _allkin from \"./svgs/allkin.svg\"\nimport _allura from \"./svgs/allura.svg\"\nimport _almarai from \"./svgs/almarai.svg\"\nimport _almendraDisplay from \"./svgs/almendra-display.svg\"\nimport _almendraSc from \"./svgs/almendra-sc.svg\"\nimport _almendra from \"./svgs/almendra.svg\"\nimport _alphaLyrae from \"./svgs/alpha-lyrae.svg\"\nimport _alpino from \"./svgs/alpino.svg\"\nimport _alumniSansCollegiateOne from \"./svgs/alumni-sans-collegiate-one.svg\"\nimport _alumniSansInlineOne from \"./svgs/alumni-sans-inline-one.svg\"\nimport _alumniSansPinstripe from \"./svgs/alumni-sans-pinstripe.svg\"\nimport _alumniSansSc from \"./svgs/alumni-sans-sc.svg\"\nimport _alumniSans from \"./svgs/alumni-sans.svg\"\nimport _alyamama from \"./svgs/alyamama.svg\"\nimport _amarante from \"./svgs/amarante.svg\"\nimport _amaranth from \"./svgs/amaranth.svg\"\nimport _amarna from \"./svgs/amarna.svg\"\nimport _amaticSc from \"./svgs/amatic-sc.svg\"\nimport _americaine from \"./svgs/americaine.svg\"\nimport _amethysta from \"./svgs/amethysta.svg\"\nimport _amiamie from \"./svgs/amiamie.svg\"\nimport _amiko from \"./svgs/amiko.svg\"\nimport _amiriQuran from \"./svgs/amiri-quran.svg\"\nimport _amiri from \"./svgs/amiri.svg\"\nimport _amita from \"./svgs/amita.svg\"\nimport _amulya from \"./svgs/amulya.svg\"\nimport _anaheim from \"./svgs/anaheim.svg\"\nimport _ancizarSans from \"./svgs/ancizar-sans.svg\"\nimport _ancizarSerif from \"./svgs/ancizar-serif.svg\"\nimport _andadaPro from \"./svgs/andada-pro.svg\"\nimport _andika from \"./svgs/andika.svg\"\nimport _anekBangla from \"./svgs/anek-bangla.svg\"\nimport _anekDevanagari from \"./svgs/anek-devanagari.svg\"\nimport _anekGujarati from \"./svgs/anek-gujarati.svg\"\nimport _anekGurmukhi from \"./svgs/anek-gurmukhi.svg\"\nimport _anekKannada from \"./svgs/anek-kannada.svg\"\nimport _anekLatin from \"./svgs/anek-latin.svg\"\nimport _anekMalayalam from \"./svgs/anek-malayalam.svg\"\nimport _anekOdia from \"./svgs/anek-odia.svg\"\nimport _anekTamil from \"./svgs/anek-tamil.svg\"\nimport _anekTelugu from \"./svgs/anek-telugu.svg\"\nimport _angkor from \"./svgs/angkor.svg\"\nimport _annapurnaSil from \"./svgs/annapurna-sil.svg\"\nimport _annieUseYourTelescope from \"./svgs/annie-use-your-telescope.svg\"\nimport _anonymousPro from \"./svgs/anonymous-pro.svg\"\nimport _anta from \"./svgs/anta.svg\"\nimport _anticDidone from \"./svgs/antic-didone.svg\"\nimport _anticSlab from \"./svgs/antic-slab.svg\"\nimport _antic from \"./svgs/antic.svg\"\nimport _antonSc from \"./svgs/anton-sc.svg\"\nimport _anton from \"./svgs/anton.svg\"\nimport _antonio from \"./svgs/antonio.svg\"\nimport _anuphan from \"./svgs/anuphan.svg\"\nimport _anybody from \"./svgs/anybody.svg\"\nimport _aoboshiOne from \"./svgs/aoboshi-one.svg\"\nimport _apfelGrotezk from \"./svgs/apfel-grotezk.svg\"\nimport _arOneSans from \"./svgs/ar-one-sans.svg\"\nimport _arapey from \"./svgs/arapey.svg\"\nimport _arbutusSlab from \"./svgs/arbutus-slab.svg\"\nimport _arbutus from \"./svgs/arbutus.svg\"\nimport _arcane from \"./svgs/arcane.svg\"\nimport _architectsDaughter from \"./svgs/architects-daughter.svg\"\nimport _archivoBlack from \"./svgs/archivo-black.svg\"\nimport _archivoNarrow from \"./svgs/archivo-narrow.svg\"\nimport _archivo from \"./svgs/archivo.svg\"\nimport _areYouSerious from \"./svgs/are-you-serious.svg\"\nimport _arefRuqaaInk from \"./svgs/aref-ruqaa-ink.svg\"\nimport _arefRuqaa from \"./svgs/aref-ruqaa.svg\"\nimport _arimaMadurai from \"./svgs/arima-madurai.svg\"\nimport _arima from \"./svgs/arima.svg\"\nimport _arimo from \"./svgs/arimo.svg\"\nimport _arizonia from \"./svgs/arizonia.svg\"\nimport _arkEs from \"./svgs/ark-es.svg\"\nimport _armata from \"./svgs/armata.svg\"\nimport _array from \"./svgs/array.svg\"\nimport _arsenalSc from \"./svgs/arsenal-sc.svg\"\nimport _arsenal from \"./svgs/arsenal.svg\"\nimport _artifika from \"./svgs/artifika.svg\"\nimport _arvo from \"./svgs/arvo.svg\"\nimport _arya from \"./svgs/arya.svg\"\nimport _asapCondensed from \"./svgs/asap-condensed.svg\"\nimport _asap from \"./svgs/asap.svg\"\nimport _asar from \"./svgs/asar.svg\"\nimport _asimovian from \"./svgs/asimovian.svg\"\nimport _aspektaVariable from \"./svgs/aspekta-variable.svg\"\nimport _asset from \"./svgs/asset.svg\"\nimport _assistant from \"./svgs/assistant.svg\"\nimport _astaSans from \"./svgs/asta-sans.svg\"\nimport _astloch from \"./svgs/astloch.svg\"\nimport _asul from \"./svgs/asul.svg\"\nimport _athiti from \"./svgs/athiti.svg\"\nimport _atkinsonHyperlegibleMono from \"./svgs/atkinson-hyperlegible-mono.svg\"\nimport _atkinsonHyperlegibleNext from \"./svgs/atkinson-hyperlegible-next.svg\"\nimport _atkinsonHyperlegible from \"./svgs/atkinson-hyperlegible.svg\"\nimport _atma from \"./svgs/atma.svg\"\nimport _atomicAge from \"./svgs/atomic-age.svg\"\nimport _aubrey from \"./svgs/aubrey.svg\"\nimport _audioJunglism from \"./svgs/audio-junglism.svg\"\nimport _audiowide from \"./svgs/audiowide.svg\"\nimport _aujournuit from \"./svgs/aujournuit.svg\"\nimport _author from \"./svgs/author.svg\"\nimport _autourOne from \"./svgs/autour-one.svg\"\nimport _averageSans from \"./svgs/average-sans.svg\"\nimport _average from \"./svgs/average.svg\"\nimport _averiaGruesaLibre from \"./svgs/averia-gruesa-libre.svg\"\nimport _averiaLibre from \"./svgs/averia-libre.svg\"\nimport _averiaSansLibre from \"./svgs/averia-sans-libre.svg\"\nimport _averiaSerifLibre from \"./svgs/averia-serif-libre.svg\"\nimport _azeretMono from \"./svgs/azeret-mono.svg\"\nimport _b612Mono from \"./svgs/b612-mono.svg\"\nimport _b612 from \"./svgs/b612.svg\"\nimport _babylonica from \"./svgs/babylonica.svg\"\nimport _bacasimeAntique from \"./svgs/bacasime-antique.svg\"\nimport _badScript from \"./svgs/bad-script.svg\"\nimport _badeenDisplay from \"./svgs/badeen-display.svg\"\nimport _bagelFatOne from \"./svgs/bagel-fat-one.svg\"\nimport _bagnard from \"./svgs/bagnard.svg\"\nimport _bahiana from \"./svgs/bahiana.svg\"\nimport _bahianita from \"./svgs/bahianita.svg\"\nimport _baiJamjuree from \"./svgs/bai-jamjuree.svg\"\nimport _bakbakOne from \"./svgs/bakbak-one.svg\"\nimport _ballet from \"./svgs/ballet.svg\"\nimport _baloo2 from \"./svgs/baloo-2.svg\"\nimport _balooBhai2 from \"./svgs/baloo-bhai-2.svg\"\nimport _balooBhaijaan2 from \"./svgs/baloo-bhaijaan-2.svg\"\nimport _balooBhaina2 from \"./svgs/baloo-bhaina-2.svg\"\nimport _balooChettan2 from \"./svgs/baloo-chettan-2.svg\"\nimport _balooDa2 from \"./svgs/baloo-da-2.svg\"\nimport _balooPaaji2 from \"./svgs/baloo-paaji-2.svg\"\nimport _balooTamma2 from \"./svgs/baloo-tamma-2.svg\"\nimport _balooTammudu2 from \"./svgs/baloo-tammudu-2.svg\"\nimport _balooThambi2 from \"./svgs/baloo-thambi-2.svg\"\nimport _balsamiqSans from \"./svgs/balsamiq-sans.svg\"\nimport _balthazar from \"./svgs/balthazar.svg\"\nimport _bangers from \"./svgs/bangers.svg\"\nimport _bankaraGrotesk from \"./svgs/bankara-grotesk.svg\"\nimport _barlowCondensed from \"./svgs/barlow-condensed.svg\"\nimport _barlowSemiCondensed from \"./svgs/barlow-semi-condensed.svg\"\nimport _barlow from \"./svgs/barlow.svg\"\nimport _barlowfold from \"./svgs/barlowfold.svg\"\nimport _barriecito from \"./svgs/barriecito.svg\"\nimport _barrio from \"./svgs/barrio.svg\"\nimport _basementGrotesque from \"./svgs/basement-grotesque.svg\"\nimport _basic from \"./svgs/basic.svg\"\nimport _baskervvilleSc from \"./svgs/baskervville-sc.svg\"\nimport _baskervville from \"./svgs/baskervville.svg\"\nimport _battambang from \"./svgs/battambang.svg\"\nimport _baumans from \"./svgs/baumans.svg\"\nimport _bayon from \"./svgs/bayon.svg\"\nimport _bbbKarrik from \"./svgs/bbb-karrik.svg\"\nimport _bbhBartle from \"./svgs/bbh-bartle.svg\"\nimport _bbhBogle from \"./svgs/bbh-bogle.svg\"\nimport _bbhHegarty from \"./svgs/bbh-hegarty.svg\"\nimport _bbhSansBartle from \"./svgs/bbh-sans-bartle.svg\"\nimport _bbhSansBogle from \"./svgs/bbh-sans-bogle.svg\"\nimport _bbhSansHegarty from \"./svgs/bbh-sans-hegarty.svg\"\nimport _bdoGrotesk from \"./svgs/bdo-grotesk.svg\"\nimport _beVietnamPro from \"./svgs/be-vietnam-pro.svg\"\nimport _beast from \"./svgs/beast.svg\"\nimport _beauRivage from \"./svgs/beau-rivage.svg\"\nimport _bebasNeue from \"./svgs/bebas-neue.svg\"\nimport _beiruti from \"./svgs/beiruti.svg\"\nimport _belanosima from \"./svgs/belanosima.svg\"\nimport _belgrano from \"./svgs/belgrano.svg\"\nimport _bellefair from \"./svgs/bellefair.svg\"\nimport _belleza from \"./svgs/belleza.svg\"\nimport _bellotaText from \"./svgs/bellota-text.svg\"\nimport _bellota from \"./svgs/bellota.svg\"\nimport _benchnine from \"./svgs/benchnine.svg\"\nimport _benne from \"./svgs/benne.svg\"\nimport _bentham from \"./svgs/bentham.svg\"\nimport _berkshireSwash from \"./svgs/berkshire-swash.svg\"\nimport _berzulisPizius from \"./svgs/berzulis-pizius.svg\"\nimport _besley from \"./svgs/besley.svg\"\nimport _bespokeSans from \"./svgs/bespoke-sans.svg\"\nimport _bespokeSerif from \"./svgs/bespoke-serif.svg\"\nimport _bespokeSlab from \"./svgs/bespoke-slab.svg\"\nimport _bespokeStencil from \"./svgs/bespoke-stencil.svg\"\nimport _betaniaPatmosGdl from \"./svgs/betania-patmos-gdl.svg\"\nimport _betaniaPatmosInGdl from \"./svgs/betania-patmos-in-gdl.svg\"\nimport _betaniaPatmosIn from \"./svgs/betania-patmos-in.svg\"\nimport _betaniaPatmos from \"./svgs/betania-patmos.svg\"\nimport _bethEllen from \"./svgs/beth-ellen.svg\"\nimport _bevan from \"./svgs/bevan.svg\"\nimport _bevellier from \"./svgs/bevellier.svg\"\nimport _bhutukaExpandedOne from \"./svgs/bhutuka-expanded-one.svg\"\nimport _bianzhidai from \"./svgs/bianzhidai.svg\"\nimport _bigShouldersDisplay from \"./svgs/big-shoulders-display.svg\"\nimport _bigShouldersInlineDisplay from \"./svgs/big-shoulders-inline-display.svg\"\nimport _bigShouldersInlineText from \"./svgs/big-shoulders-inline-text.svg\"\nimport _bigShouldersInline from \"./svgs/big-shoulders-inline.svg\"\nimport _bigShouldersStencilDisplay from \"./svgs/big-shoulders-stencil-display.svg\"\nimport _bigShouldersStencilText from \"./svgs/big-shoulders-stencil-text.svg\"\nimport _bigShouldersStencil from \"./svgs/big-shoulders-stencil.svg\"\nimport _bigShouldersText from \"./svgs/big-shoulders-text.svg\"\nimport _bigShoulders from \"./svgs/big-shoulders.svg\"\nimport _bigelowRules from \"./svgs/bigelow-rules.svg\"\nimport _bigshotOne from \"./svgs/bigshot-one.svg\"\nimport _bilboSwashCaps from \"./svgs/bilbo-swash-caps.svg\"\nimport _bilbo from \"./svgs/bilbo.svg\"\nimport _biorhymeExpanded from \"./svgs/biorhyme-expanded.svg\"\nimport _biorhyme from \"./svgs/biorhyme.svg\"\nimport _birthstoneBounce from \"./svgs/birthstone-bounce.svg\"\nimport _birthstone from \"./svgs/birthstone.svg\"\nimport _biryani from \"./svgs/biryani.svg\"\nimport _bitcountGridDoubleInk from \"./svgs/bitcount-grid-double-ink.svg\"\nimport _bitcountGridDouble from \"./svgs/bitcount-grid-double.svg\"\nimport _bitcountGridSingleInk from \"./svgs/bitcount-grid-single-ink.svg\"\nimport _bitcountGridSingle from \"./svgs/bitcount-grid-single.svg\"\nimport _bitcountInk from \"./svgs/bitcount-ink.svg\"\nimport _bitcountPropDoubleInk from \"./svgs/bitcount-prop-double-ink.svg\"\nimport _bitcountPropDouble from \"./svgs/bitcount-prop-double.svg\"\nimport _bitcountPropSingleInk from \"./svgs/bitcount-prop-single-ink.svg\"\nimport _bitcountPropSingle from \"./svgs/bitcount-prop-single.svg\"\nimport _bitcountSingleInk from \"./svgs/bitcount-single-ink.svg\"\nimport _bitcountSingle from \"./svgs/bitcount-single.svg\"\nimport _bitcount from \"./svgs/bitcount.svg\"\nimport _bitter from \"./svgs/bitter.svg\"\nimport _bizUdgothic from \"./svgs/biz-udgothic.svg\"\nimport _bizUdmincho from \"./svgs/biz-udmincho.svg\"\nimport _bizUdpgothic from \"./svgs/biz-udpgothic.svg\"\nimport _bizUdpmincho from \"./svgs/biz-udpmincho.svg\"\nimport _bjCree from \"./svgs/bj-cree.svg\"\nimport _bjcree from \"./svgs/bjcree.svg\"\nimport _blackAndWhitePicture from \"./svgs/black-and-white-picture.svg\"\nimport _blackHanSans from \"./svgs/black-han-sans.svg\"\nimport _blackOpsOne from \"./svgs/black-ops-one.svg\"\nimport _blakaHollow from \"./svgs/blaka-hollow.svg\"\nimport _blakaInk from \"./svgs/blaka-ink.svg\"\nimport _blaka from \"./svgs/blaka.svg\"\nimport _blinker from \"./svgs/blinker.svg\"\nimport _bodoniModaSc from \"./svgs/bodoni-moda-sc.svg\"\nimport _bodoniModa from \"./svgs/bodoni-moda.svg\"\nimport _bokor from \"./svgs/bokor.svg\"\nimport _boldonse from \"./svgs/boldonse.svg\"\nimport _bonaNovaSc from \"./svgs/bona-nova-sc.svg\"\nimport _bonaNova from \"./svgs/bona-nova.svg\"\nimport _bonbance from \"./svgs/bonbance.svg\"\nimport _bonbon from \"./svgs/bonbon.svg\"\nimport _bonheurRoyale from \"./svgs/bonheur-royale.svg\"\nimport _bonny from \"./svgs/bonny.svg\"\nimport _boogaloo from \"./svgs/boogaloo.svg\"\nimport _borel from \"./svgs/borel.svg\"\nimport _boris from \"./svgs/boris.svg\"\nimport _boska from \"./svgs/boska.svg\"\nimport _bouclEs from \"./svgs/boucl\u00E9es.svg\"\nimport _bowlbyOneSc from \"./svgs/bowlby-one-sc.svg\"\nimport _bowlbyOne from \"./svgs/bowlby-one.svg\"\nimport _boxing from \"./svgs/boxing.svg\"\nimport _bpmfHuninn from \"./svgs/bpmf-huninn.svg\"\nimport _bpmfIansui from \"./svgs/bpmf-iansui.svg\"\nimport _bpmfZihiKaiStd from \"./svgs/bpmf-zihi-kai-std.svg\"\nimport _braahOne from \"./svgs/braah-one.svg\"\nimport _brawler from \"./svgs/brawler.svg\"\nimport _breeSerif from \"./svgs/bree-serif.svg\"\nimport _bricolageGrotesque from \"./svgs/bricolage-grotesque.svg\"\nimport _briemHand from \"./svgs/briem-hand.svg\"\nimport _britney from \"./svgs/britney.svg\"\nimport _brunoAceSc from \"./svgs/bruno-ace-sc.svg\"\nimport _brunoAce from \"./svgs/bruno-ace.svg\"\nimport _brygada1918 from \"./svgs/brygada-1918.svg\"\nimport _bubblegumSans from \"./svgs/bubblegum-sans.svg\"\nimport _bubblerOne from \"./svgs/bubbler-one.svg\"\nimport _buda from \"./svgs/buda.svg\"\nimport _buenard from \"./svgs/buenard.svg\"\nimport _bungeeHairline from \"./svgs/bungee-hairline.svg\"\nimport _bungeeInline from \"./svgs/bungee-inline.svg\"\nimport _bungeeOutline from \"./svgs/bungee-outline.svg\"\nimport _bungeeShade from \"./svgs/bungee-shade.svg\"\nimport _bungeeSpice from \"./svgs/bungee-spice.svg\"\nimport _bungeeTint from \"./svgs/bungee-tint.svg\"\nimport _bungee from \"./svgs/bungee.svg\"\nimport _butcherman from \"./svgs/butcherman.svg\"\nimport _butterflyKids from \"./svgs/butterfly-kids.svg\"\nimport _bvllet from \"./svgs/bvllet.svg\"\nimport _bytesized from \"./svgs/bytesized.svg\"\nimport _cabinCondensed from \"./svgs/cabin-condensed.svg\"\nimport _cabinSketch from \"./svgs/cabin-sketch.svg\"\nimport _cabin from \"./svgs/cabin.svg\"\nimport _cabinetGrotesk from \"./svgs/cabinet-grotesk.svg\"\nimport _cactusClassicalSerif from \"./svgs/cactus-classical-serif.svg\"\nimport _caesarDressing from \"./svgs/caesar-dressing.svg\"\nimport _cagliostro from \"./svgs/cagliostro.svg\"\nimport _cairoPlay from \"./svgs/cairo-play.svg\"\nimport _cairo from \"./svgs/cairo.svg\"\nimport _calSans from \"./svgs/cal-sans.svg\"\nimport _caladea from \"./svgs/caladea.svg\"\nimport _calistoga from \"./svgs/calistoga.svg\"\nimport _calligraffitti from \"./svgs/calligraffitti.svg\"\nimport _cambay from \"./svgs/cambay.svg\"\nimport _cambo from \"./svgs/cambo.svg\"\nimport _candal from \"./svgs/candal.svg\"\nimport _cantarell from \"./svgs/cantarell.svg\"\nimport _cantataOne from \"./svgs/cantata-one.svg\"\nimport _cantoraOne from \"./svgs/cantora-one.svg\"\nimport _caprasimo from \"./svgs/caprasimo.svg\"\nimport _capriola from \"./svgs/capriola.svg\"\nimport _caramel from \"./svgs/caramel.svg\"\nimport _carattere from \"./svgs/carattere.svg\"\nimport _cardo from \"./svgs/cardo.svg\"\nimport _carlito from \"./svgs/carlito.svg\"\nimport _carme from \"./svgs/carme.svg\"\nimport _carroisGothicSc from \"./svgs/carrois-gothic-sc.svg\"\nimport _carroisGothic from \"./svgs/carrois-gothic.svg\"\nimport _carterOne from \"./svgs/carter-one.svg\"\nimport _cascadiaCode from \"./svgs/cascadia-code.svg\"\nimport _cascadiaMono from \"./svgs/cascadia-mono.svg\"\nimport _castoroTitling from \"./svgs/castoro-titling.svg\"\nimport _castoro from \"./svgs/castoro.svg\"\nimport _catamaran from \"./svgs/catamaran.svg\"\nimport _caudex from \"./svgs/caudex.svg\"\nimport _cause from \"./svgs/cause.svg\"\nimport _caveatBrush from \"./svgs/caveat-brush.svg\"\nimport _caveat from \"./svgs/caveat.svg\"\nimport _cedarvilleCursive from \"./svgs/cedarville-cursive.svg\"\nimport _cesare from \"./svgs/cesare.svg\"\nimport _cevicheOne from \"./svgs/ceviche-one.svg\"\nimport _chakraPetch from \"./svgs/chakra-petch.svg\"\nimport _changaOne from \"./svgs/changa-one.svg\"\nimport _changa from \"./svgs/changa.svg\"\nimport _chango from \"./svgs/chango.svg\"\nimport _chaos16 from \"./svgs/chaos16.svg\"\nimport _charisSil from \"./svgs/charis-sil.svg\"\nimport _charm from \"./svgs/charm.svg\"\nimport _charmonman from \"./svgs/charmonman.svg\"\nimport _chathura from \"./svgs/chathura.svg\"\nimport _chauPhilomeneOne from \"./svgs/chau-philomene-one.svg\"\nimport _chaumontScript from \"./svgs/chaumont-script.svg\"\nimport _chelaOne from \"./svgs/chela-one.svg\"\nimport _chelseaMarket from \"./svgs/chelsea-market.svg\"\nimport _cherish from \"./svgs/cherish.svg\"\nimport _cherryBombOne from \"./svgs/cherry-bomb-one.svg\"\nimport _cherryCreamSoda from \"./svgs/cherry-cream-soda.svg\"\nimport _cherrySwash from \"./svgs/cherry-swash.svg\"\nimport _chewy from \"./svgs/chewy.svg\"\nimport _chicle from \"./svgs/chicle.svg\"\nimport _chilanka from \"./svgs/chilanka.svg\"\nimport _chillax from \"./svgs/chillax.svg\"\nimport _chironGoroundTc from \"./svgs/chiron-goround-tc.svg\"\nimport _chironHeiHk from \"./svgs/chiron-hei-hk.svg\"\nimport _chironSungHk from \"./svgs/chiron-sung-hk.svg\"\nimport _chivoMono from \"./svgs/chivo-mono.svg\"\nimport _chivo from \"./svgs/chivo.svg\"\nimport _chocolateClassicalSans from \"./svgs/chocolate-classical-sans.svg\"\nimport _chokokutai from \"./svgs/chokokutai.svg\"\nimport _chonburi from \"./svgs/chonburi.svg\"\nimport _choso from \"./svgs/choso.svg\"\nimport _chubbo from \"./svgs/chubbo.svg\"\nimport _cinzelDecorative from \"./svgs/cinzel-decorative.svg\"\nimport _cinzel from \"./svgs/cinzel.svg\"\nimport _clashDisplay from \"./svgs/clash-display.svg\"\nimport _clashGrotesk from \"./svgs/clash-grotesk.svg\"\nimport _clickerScript from \"./svgs/clicker-script.svg\"\nimport _climateCrisis from \"./svgs/climate-crisis.svg\"\nimport _coasterSans from \"./svgs/coaster-sans.svg\"\nimport _coconat from \"./svgs/coconat.svg\"\nimport _codaCaption from \"./svgs/coda-caption.svg\"\nimport _coda from \"./svgs/coda.svg\"\nimport _codystar from \"./svgs/codystar.svg\"\nimport _coiny from \"./svgs/coiny.svg\"\nimport _combo from \"./svgs/combo.svg\"\nimport _comfortaa from \"./svgs/comfortaa.svg\"\nimport _comforterBrush from \"./svgs/comforter-brush.svg\"\nimport _comforter from \"./svgs/comforter.svg\"\nimport _comicNeue from \"./svgs/comic-neue.svg\"\nimport _comicRelief from \"./svgs/comic-relief.svg\"\nimport _comico from \"./svgs/comico.svg\"\nimport _comingSoon from \"./svgs/coming-soon.svg\"\nimport _comme from \"./svgs/comme.svg\"\nimport _commissioner from \"./svgs/commissioner.svg\"\nimport _concertOne from \"./svgs/concert-one.svg\"\nimport _condenbitmap from \"./svgs/condenbitmap.svg\"\nimport _condiment from \"./svgs/condiment.svg\"\nimport _contrailOne from \"./svgs/contrail-one.svg\"\nimport _convergence from \"./svgs/convergence.svg\"\nimport _cookie from \"./svgs/cookie.svg\"\nimport _cooperHewitt from \"./svgs/cooper-hewitt.svg\"\nimport _copse from \"./svgs/copse.svg\"\nimport _coralPixels from \"./svgs/coral-pixels.svg\"\nimport _corben from \"./svgs/corben.svg\"\nimport _corinthia from \"./svgs/corinthia.svg\"\nimport _cormorantGaramond from \"./svgs/cormorant-garamond.svg\"\nimport _cormorantInfant from \"./svgs/cormorant-infant.svg\"\nimport _cormorantSc from \"./svgs/cormorant-sc.svg\"\nimport _cormorantUnicase from \"./svgs/cormorant-unicase.svg\"\nimport _cormorantUpright from \"./svgs/cormorant-upright.svg\"\nimport _cormorant from \"./svgs/cormorant.svg\"\nimport _cossetteTexte from \"./svgs/cossette-texte.svg\"\nimport _cossetteTitre from \"./svgs/cossette-titre.svg\"\nimport _courgette from \"./svgs/courgette.svg\"\nimport _courierPrime from \"./svgs/courier-prime.svg\"\nimport _cousine from \"./svgs/cousine.svg\"\nimport _coustard from \"./svgs/coustard.svg\"\nimport _coveredByYourGrace from \"./svgs/covered-by-your-grace.svg\"\nimport _craftyGirls from \"./svgs/crafty-girls.svg\"\nimport _creepster from \"./svgs/creepster.svg\"\nimport _creteRound from \"./svgs/crete-round.svg\"\nimport _crimsonPro from \"./svgs/crimson-pro.svg\"\nimport _crimsonText from \"./svgs/crimson-text.svg\"\nimport _croissantOne from \"./svgs/croissant-one.svg\"\nimport _crushed from \"./svgs/crushed.svg\"\nimport _cuprum from \"./svgs/cuprum.svg\"\nimport _cuteFont from \"./svgs/cute-font.svg\"\nimport _cutiveMono from \"./svgs/cutive-mono.svg\"\nimport _cutive from \"./svgs/cutive.svg\"\nimport _daiBannaSil from \"./svgs/dai-banna-sil.svg\"\nimport _damion from \"./svgs/damion.svg\"\nimport _dancingScript from \"./svgs/dancing-script.svg\"\nimport _danfo from \"./svgs/danfo.svg\"\nimport _dangrek from \"./svgs/dangrek.svg\"\nimport _darkerGrotesque from \"./svgs/darker-grotesque.svg\"\nimport _darumadropOne from \"./svgs/darumadrop-one.svg\"\nimport _datatype from \"./svgs/datatype.svg\"\nimport _davidLibre from \"./svgs/david-libre.svg\"\nimport _dawningOfANewDay from \"./svgs/dawning-of-a-new-day.svg\"\nimport _daysOne from \"./svgs/days-one.svg\"\nimport _defekt from \"./svgs/defekt.svg\"\nimport _dekko from \"./svgs/dekko.svg\"\nimport _delaGothicOne from \"./svgs/dela-gothic-one.svg\"\nimport _deliciousHandrawn from \"./svgs/delicious-handrawn.svg\"\nimport _deliusSwashCaps from \"./svgs/delius-swash-caps.svg\"\nimport _deliusUnicase from \"./svgs/delius-unicase.svg\"\nimport _delius from \"./svgs/delius.svg\"\nimport _dellaRespira from \"./svgs/della-respira.svg\"\nimport _demMoMono from \"./svgs/dem-mo-mono.svg\"\nimport _denkOne from \"./svgs/denk-one.svg\"\nimport _destra from \"./svgs/destra.svg\"\nimport _devonshire from \"./svgs/devonshire.svg\"\nimport _dhurjati from \"./svgs/dhurjati.svg\"\nimport _didactGothic from \"./svgs/didact-gothic.svg\"\nimport _diphylleia from \"./svgs/diphylleia.svg\"\nimport _diplomataSc from \"./svgs/diplomata-sc.svg\"\nimport _diplomata from \"./svgs/diplomata.svg\"\nimport _dmMono from \"./svgs/dm-mono.svg\"\nimport _dmRetrograde from \"./svgs/dm-retrograde.svg\"\nimport _dmSans from \"./svgs/dm-sans.svg\"\nimport _dmSerifDisplay from \"./svgs/dm-serif-display.svg\"\nimport _dmSerifText from \"./svgs/dm-serif-text.svg\"\nimport _doHyeon from \"./svgs/do-hyeon.svg\"\nimport _dokdo from \"./svgs/dokdo.svg\"\nimport _domine from \"./svgs/domine.svg\"\nimport _donegalOne from \"./svgs/donegal-one.svg\"\nimport _dongle from \"./svgs/dongle.svg\"\nimport _doppioOne from \"./svgs/doppio-one.svg\"\nimport _dorsa from \"./svgs/dorsa.svg\"\nimport _dosis from \"./svgs/dosis.svg\"\nimport _dotgothic16 from \"./svgs/dotgothic16.svg\"\nimport _doto from \"./svgs/doto.svg\"\nimport _drSugiyama from \"./svgs/dr-sugiyama.svg\"\nimport _drabina from \"./svgs/drabina.svg\"\nimport _droideAnthroLight from \"./svgs/droide-anthro-light.svg\"\nimport _dtGetaiGroteskDisplay from \"./svgs/dt-getai-grotesk-display.svg\"\nimport _dtNightingale from \"./svgs/dt-nightingale.svg\"\nimport _duruSans from \"./svgs/duru-sans.svg\"\nimport _dynalight from \"./svgs/dynalight.svg\"\nimport _dynapuff from \"./svgs/dynapuff.svg\"\nimport _eagleLake from \"./svgs/eagle-lake.svg\"\nimport _eastSeaDokdo from \"./svgs/east-sea-dokdo.svg\"\nimport _eater from \"./svgs/eater.svg\"\nimport _ebGaramond from \"./svgs/eb-garamond.svg\"\nimport _economica from \"./svgs/economica.svg\"\nimport _eczar from \"./svgs/eczar.svg\"\nimport _eduAuVicWaNtArrows from \"./svgs/edu-au-vic-wa-nt-arrows.svg\"\nimport _eduAuVicWaNtDots from \"./svgs/edu-au-vic-wa-nt-dots.svg\"\nimport _eduAuVicWaNtGuides from \"./svgs/edu-au-vic-wa-nt-guides.svg\"\nimport _eduAuVicWaNtHand from \"./svgs/edu-au-vic-wa-nt-hand.svg\"\nimport _eduAuVicWaNtPre from \"./svgs/edu-au-vic-wa-nt-pre.svg\"\nimport _eduNswActCursive from \"./svgs/edu-nsw-act-cursive.svg\"\nimport _eduNswActFoundation from \"./svgs/edu-nsw-act-foundation.svg\"\nimport _eduNswActHandPre from \"./svgs/edu-nsw-act-hand-pre.svg\"\nimport _eduQldBeginner from \"./svgs/edu-qld-beginner.svg\"\nimport _eduQldHand from \"./svgs/edu-qld-hand.svg\"\nimport _eduSaBeginner from \"./svgs/edu-sa-beginner.svg\"\nimport _eduSaHand from \"./svgs/edu-sa-hand.svg\"\nimport _eduTasBeginner from \"./svgs/edu-tas-beginner.svg\"\nimport _eduVicWaNtBeginner from \"./svgs/edu-vic-wa-nt-beginner.svg\"\nimport _eduVicWaNtHandPre from \"./svgs/edu-vic-wa-nt-hand-pre.svg\"\nimport _eduVicWaNtHand from \"./svgs/edu-vic-wa-nt-hand.svg\"\nimport _elMessiri from \"./svgs/el-messiri.svg\"\nimport _elastic from \"./svgs/elastic.svg\"\nimport _electrolize from \"./svgs/electrolize.svg\"\nimport _elmsSans from \"./svgs/elms-sans.svg\"\nimport _elsieSwashCaps from \"./svgs/elsie-swash-caps.svg\"\nimport _elsie from \"./svgs/elsie.svg\"\nimport _elstob from \"./svgs/elstob.svg\"\nimport _emblemaOne from \"./svgs/emblema-one.svg\"\nimport _emilysCandy from \"./svgs/emilys-candy.svg\"\nimport _encodeSansCondensed from \"./svgs/encode-sans-condensed.svg\"\nimport _encodeSansExpanded from \"./svgs/encode-sans-expanded.svg\"\nimport _encodeSansSc from \"./svgs/encode-sans-sc.svg\"\nimport _encodeSansSemiCondensed from \"./svgs/encode-sans-semi-condensed.svg\"\nimport _encodeSansSemiExpanded from \"./svgs/encode-sans-semi-expanded.svg\"\nimport _encodeSans from \"./svgs/encode-sans.svg\"\nimport _engagement from \"./svgs/engagement.svg\"\nimport _englebert from \"./svgs/englebert.svg\"\nimport _enriqueta from \"./svgs/enriqueta.svg\"\nimport _ephesis from \"./svgs/ephesis.svg\"\nimport _epilogue from \"./svgs/epilogue.svg\"\nimport _epundaSans from \"./svgs/epunda-sans.svg\"\nimport _epundaSlab from \"./svgs/epunda-slab.svg\"\nimport _erbarre from \"./svgs/erbarre.svg\"\nimport _ericaOne from \"./svgs/erica-one.svg\"\nimport _erode from \"./svgs/erode.svg\"\nimport _esteban from \"./svgs/esteban.svg\"\nimport _estedad from \"./svgs/estedad.svg\"\nimport _estonia from \"./svgs/estonia.svg\"\nimport _euphoriaScript from \"./svgs/euphoria-script.svg\"\nimport _ewert from \"./svgs/ewert.svg\"\nimport _excon from \"./svgs/excon.svg\"\nimport _exile from \"./svgs/exile.svg\"\nimport _exo2 from \"./svgs/exo-2.svg\"\nimport _exo from \"./svgs/exo.svg\"\nimport _expletusSans from \"./svgs/expletus-sans.svg\"\nimport _explora from \"./svgs/explora.svg\"\nimport _expose from \"./svgs/expose.svg\"\nimport _f18 from \"./svgs/f1-8.svg\"\nimport _fa1 from \"./svgs/fa-1.svg\"\nimport _fablab from \"./svgs/fablab.svg\"\nimport _facultyGlyphic from \"./svgs/faculty-glyphic.svg\"\nimport _fahkwang from \"./svgs/fahkwang.svg\"\nimport _familjenGrotesk from \"./svgs/familjen-grotesk.svg\"\nimport _fanwoodText from \"./svgs/fanwood-text.svg\"\nimport _farro from \"./svgs/farro.svg\"\nimport _farsan from \"./svgs/farsan.svg\"\nimport _fascinateInline from \"./svgs/fascinate-inline.svg\"\nimport _fascinate from \"./svgs/fascinate.svg\"\nimport _fasterOne from \"./svgs/faster-one.svg\"\nimport _fasthand from \"./svgs/fasthand.svg\"\nimport _faunaOne from \"./svgs/fauna-one.svg\"\nimport _faustina from \"./svgs/faustina.svg\"\nimport _federant from \"./svgs/federant.svg\"\nimport _federo from \"./svgs/federo.svg\"\nimport _felipa from \"./svgs/felipa.svg\"\nimport _fenix from \"./svgs/fenix.svg\"\nimport _festive from \"./svgs/festive.svg\"\nimport _fffTuoiTre from \"./svgs/fff-tuoi-tre.svg\"\nimport _figtree from \"./svgs/figtree.svg\"\nimport _fingerPaint from \"./svgs/finger-paint.svg\"\nimport _finlandicaHeadline from \"./svgs/finlandica-headline.svg\"\nimport _finlandicaText from \"./svgs/finlandica-text.svg\"\nimport _finlandica from \"./svgs/finlandica.svg\"\nimport _firaCode from \"./svgs/fira-code.svg\"\nimport _firaMono from \"./svgs/fira-mono.svg\"\nimport _firaSansCondensed from \"./svgs/fira-sans-condensed.svg\"\nimport _firaSansExtraCondensed from \"./svgs/fira-sans-extra-condensed.svg\"\nimport _firaSans from \"./svgs/fira-sans.svg\"\nimport _fjallaOne from \"./svgs/fjalla-one.svg\"\nimport _fjordOne from \"./svgs/fjord-one.svg\"\nimport _flamenco from \"./svgs/flamenco.svg\"\nimport _flavors from \"./svgs/flavors.svg\"\nimport _fleurDeLeah from \"./svgs/fleur-de-leah.svg\"\nimport _fleuron from \"./svgs/fleuron.svg\"\nimport _fliegeMono from \"./svgs/fliege-mono.svg\"\nimport _flowBlock from \"./svgs/flow-block.svg\"\nimport _flowCircular from \"./svgs/flow-circular.svg\"\nimport _flowRounded from \"./svgs/flow-rounded.svg\"\nimport _flux from \"./svgs/flux.svg\"\nimport _fluxischElse from \"./svgs/fluxisch-else.svg\"\nimport _foldit from \"./svgs/foldit.svg\"\nimport _fondamento from \"./svgs/fondamento.svg\"\nimport _fontdinerSwanky from \"./svgs/fontdiner-swanky.svg\"\nimport _forum from \"./svgs/forum.svg\"\nimport _fragmentMono from \"./svgs/fragment-mono.svg\"\nimport _frakturmeta from \"./svgs/frakturmeta.svg\"\nimport _francoisOne from \"./svgs/francois-one.svg\"\nimport _frankRuhlLibre from \"./svgs/frank-ruhl-libre.svg\"\nimport _fraunces from \"./svgs/fraunces.svg\"\nimport _freakGroteskNext from \"./svgs/freak-grotesk-next.svg\"\nimport _freckleFace from \"./svgs/freckle-face.svg\"\nimport _frederickaTheGreat from \"./svgs/fredericka-the-great.svg\"\nimport _fredokaOne from \"./svgs/fredoka-one.svg\"\nimport _fredoka from \"./svgs/fredoka.svg\"\nimport _freehand from \"./svgs/freehand.svg\"\nimport _freeman from \"./svgs/freeman.svg\"\nimport _fresca from \"./svgs/fresca.svg\"\nimport _frijole from \"./svgs/frijole.svg\"\nimport _fruktur from \"./svgs/fruktur.svg\"\nimport _ft88 from \"./svgs/ft88.svg\"\nimport _fugazOne from \"./svgs/fugaz-one.svg\"\nimport _fuggles from \"./svgs/fuggles.svg\"\nimport _funnelDisplay from \"./svgs/funnel-display.svg\"\nimport _funnelSans from \"./svgs/funnel-sans.svg\"\nimport _fustat from \"./svgs/fustat.svg\"\nimport _fuzzyBubbles from \"./svgs/fuzzy-bubbles.svg\"\nimport _gaMaamli from \"./svgs/ga-maamli.svg\"\nimport _gabarito from \"./svgs/gabarito.svg\"\nimport _gabriela from \"./svgs/gabriela.svg\"\nimport _gaegu from \"./svgs/gaegu.svg\"\nimport _gafata from \"./svgs/gafata.svg\"\nimport _gajrajOne from \"./svgs/gajraj-one.svg\"\nimport _galada from \"./svgs/galada.svg\"\nimport _galdeano from \"./svgs/galdeano.svg\"\nimport _galindo from \"./svgs/galindo.svg\"\nimport _gambarino from \"./svgs/gambarino.svg\"\nimport _gambetta from \"./svgs/gambetta.svg\"\nimport _gamjaFlower from \"./svgs/gamja-flower.svg\"\nimport _gantari from \"./svgs/gantari.svg\"\nimport _gapSans from \"./svgs/gap-sans.svg\"\nimport _gasoekOne from \"./svgs/gasoek-one.svg\"\nimport _gayathri from \"./svgs/gayathri.svg\"\nimport _geistMono from \"./svgs/geist-mono.svg\"\nimport _geist from \"./svgs/geist.svg\"\nimport _gelasio from \"./svgs/gelasio.svg\"\nimport _gemunuLibre from \"./svgs/gemunu-libre.svg\"\nimport _generalSans from \"./svgs/general-sans.svg\"\nimport _genos from \"./svgs/genos.svg\"\nimport _gentiumBookBasic from \"./svgs/gentium-book-basic.svg\"\nimport _gentiumBookPlus from \"./svgs/gentium-book-plus.svg\"\nimport _gentiumPlus from \"./svgs/gentium-plus.svg\"\nimport _geo from \"./svgs/geo.svg\"\nimport _geologica from \"./svgs/geologica.svg\"\nimport _geom from \"./svgs/geom.svg\"\nimport _georama from \"./svgs/georama.svg\"\nimport _geostarFill from \"./svgs/geostar-fill.svg\"\nimport _geostar from \"./svgs/geostar.svg\"\nimport _germaniaOne from \"./svgs/germania-one.svg\"\nimport _gfsDidot from \"./svgs/gfs-didot.svg\"\nimport _gfsNeohellenic from \"./svgs/gfs-neohellenic.svg\"\nimport _gideonRoman from \"./svgs/gideon-roman.svg\"\nimport _gidole from \"./svgs/gidole.svg\"\nimport _gidugu from \"./svgs/gidugu.svg\"\nimport _gildaDisplay from \"./svgs/gilda-display.svg\"\nimport _girassol from \"./svgs/girassol.svg\"\nimport _giveYouGlory from \"./svgs/give-you-glory.svg\"\nimport _glassAntiqua from \"./svgs/glass-antiqua.svg\"\nimport _glegoo from \"./svgs/glegoo.svg\"\nimport _gloock from \"./svgs/gloock.svg\"\nimport _gloriaHallelujah from \"./svgs/gloria-hallelujah.svg\"\nimport _glory from \"./svgs/glory.svg\"\nimport _gluten from \"./svgs/gluten.svg\"\nimport _gnomon from \"./svgs/gnomon.svg\"\nimport _goblinOne from \"./svgs/goblin-one.svg\"\nimport _gochiHand from \"./svgs/gochi-hand.svg\"\nimport _goldman from \"./svgs/goldman.svg\"\nimport _golosText from \"./svgs/golos-text.svg\"\nimport _googleSansCode from \"./svgs/google-sans-code.svg\"\nimport _googleSansFlex from \"./svgs/google-sans-flex.svg\"\nimport _googleSans from \"./svgs/google-sans.svg\"\nimport _gorditas from \"./svgs/gorditas.svg\"\nimport _gothicA1 from \"./svgs/gothic-a1.svg\"\nimport _gotu from \"./svgs/gotu.svg\"\nimport _goudyBookletter1911 from \"./svgs/goudy-bookletter-1911.svg\"\nimport _gowunBatang from \"./svgs/gowun-batang.svg\"\nimport _gowunDodum from \"./svgs/gowun-dodum.svg\"\nimport _graduate from \"./svgs/graduate.svg\"\nimport _grandHotel from \"./svgs/grand-hotel.svg\"\nimport _grandifloraOne from \"./svgs/grandiflora-one.svg\"\nimport _grandstander from \"./svgs/grandstander.svg\"\nimport _grapeNuts from \"./svgs/grape-nuts.svg\"\nimport _gravePresse from \"./svgs/grave-presse.svg\"\nimport _gravitasOne from \"./svgs/gravitas-one.svg\"\nimport _greatVibes from \"./svgs/great-vibes.svg\"\nimport _grechenFuemen from \"./svgs/grechen-fuemen.svg\"\nimport _grenzeGotisch from \"./svgs/grenze-gotisch.svg\"\nimport _grenze from \"./svgs/grenze.svg\"\nimport _greyQo from \"./svgs/grey-qo.svg\"\nimport _griffy from \"./svgs/griffy.svg\"\nimport _grith from \"./svgs/grith.svg\"\nimport _gruppo from \"./svgs/gruppo.svg\"\nimport _gudea from \"./svgs/gudea.svg\"\nimport _gugi from \"./svgs/gugi.svg\"\nimport _gulzar from \"./svgs/gulzar.svg\"\nimport _gupter from \"./svgs/gupter.svg\"\nimport _gurajada from \"./svgs/gurajada.svg\"\nimport _gveretLevin from \"./svgs/gveret-levin.svg\"\nimport _gwendolyn from \"./svgs/gwendolyn.svg\"\nimport _habibi from \"./svgs/habibi.svg\"\nimport _hachiMaruPop from \"./svgs/hachi-maru-pop.svg\"\nimport _hahmlet from \"./svgs/hahmlet.svg\"\nimport _halant from \"./svgs/halant.svg\"\nimport _halibut from \"./svgs/halibut.svg\"\nimport _hammersmithOne from \"./svgs/hammersmith-one.svg\"\nimport _hanaleiFill from \"./svgs/hanalei-fill.svg\"\nimport _hanalei from \"./svgs/hanalei.svg\"\nimport _handjet from \"./svgs/handjet.svg\"\nimport _handlee from \"./svgs/handlee.svg\"\nimport _hankenGrotesk from \"./svgs/hanken-grotesk.svg\"\nimport _hanuman from \"./svgs/hanuman.svg\"\nimport _happyMonkey from \"./svgs/happy-monkey.svg\"\nimport _harmattan from \"./svgs/harmattan.svg\"\nimport _hauora from \"./svgs/hauora.svg\"\nimport _havana from \"./svgs/havana.svg\"\nimport _headlandOne from \"./svgs/headland-one.svg\"\nimport _hedvigLettersSans from \"./svgs/hedvig-letters-sans.svg\"\nimport _hedvigLettersSerif from \"./svgs/hedvig-letters-serif.svg\"\nimport _heebo from \"./svgs/heebo.svg\"\nimport _hennyPenny from \"./svgs/henny-penny.svg\"\nimport _heptaSlab from \"./svgs/hepta-slab.svg\"\nimport _herrVonMuellerhoff from \"./svgs/herr-von-muellerhoff.svg\"\nimport _hersheyNoaillesTimes from \"./svgs/hershey-noailles-times.svg\"\nimport _hiMelody from \"./svgs/hi-melody.svg\"\nimport _hikasami from \"./svgs/hikasami.svg\"\nimport _hinaMincho from \"./svgs/hina-mincho.svg\"\nimport _hindGuntur from \"./svgs/hind-guntur.svg\"\nimport _hindMadurai from \"./svgs/hind-madurai.svg\"\nimport _hindMysuru from \"./svgs/hind-mysuru.svg\"\nimport _hindSiliguri from \"./svgs/hind-siliguri.svg\"\nimport _hindVadodara from \"./svgs/hind-vadodara.svg\"\nimport _hind from \"./svgs/hind.svg\"\nimport _holtwoodOneSc from \"./svgs/holtwood-one-sc.svg\"\nimport _homemadeApple from \"./svgs/homemade-apple.svg\"\nimport _homenaje from \"./svgs/homenaje.svg\"\nimport _honk from \"./svgs/honk.svg\"\nimport _hooskaiChamferedSquare from \"./svgs/hooskai-chamfered-square.svg\"\nimport _hoover from \"./svgs/hoover.svg\"\nimport _hostGrotesk from \"./svgs/host-grotesk.svg\"\nimport _huab from \"./svgs/huab.svg\"\nimport _hubballi from \"./svgs/hubballi.svg\"\nimport _hubotSans from \"./svgs/hubot-sans.svg\"\nimport _huninn from \"./svgs/huninn.svg\"\nimport _hurricane from \"./svgs/hurricane.svg\"\nimport _iansui from \"./svgs/iansui.svg\"\nimport _ibarraRealNova from \"./svgs/ibarra-real-nova.svg\"\nimport _ibmPlexMono from \"./svgs/ibm-plex-mono.svg\"\nimport _ibmPlexSansArabic from \"./svgs/ibm-plex-sans-arabic.svg\"\nimport _ibmPlexSansCondensed from \"./svgs/ibm-plex-sans-condensed.svg\"\nimport _ibmPlexSansDevanagari from \"./svgs/ibm-plex-sans-devanagari.svg\"\nimport _ibmPlexSansHebrew from \"./svgs/ibm-plex-sans-hebrew.svg\"\nimport _ibmPlexSansJp from \"./svgs/ibm-plex-sans-jp.svg\"\nimport _ibmPlexSansKr from \"./svgs/ibm-plex-sans-kr.svg\"\nimport _ibmPlexSansThaiLooped from \"./svgs/ibm-plex-sans-thai-looped.svg\"\nimport _ibmPlexSansThai from \"./svgs/ibm-plex-sans-thai.svg\"\nimport _ibmPlexSans from \"./svgs/ibm-plex-sans.svg\"\nimport _ibmPlexSerif from \"./svgs/ibm-plex-serif.svg\"\nimport _iceberg from \"./svgs/iceberg.svg\"\nimport _iceland from \"./svgs/iceland.svg\"\nimport _idiqlat from \"./svgs/idiqlat.svg\"\nimport _imFellDoublePicaSc from \"./svgs/im-fell-double-pica-sc.svg\"\nimport _imFellDoublePica from \"./svgs/im-fell-double-pica.svg\"\nimport _imFellDwPicaSc from \"./svgs/im-fell-dw-pica-sc.svg\"\nimport _imFellDwPica from \"./svgs/im-fell-dw-pica.svg\"\nimport _imFellEnglishSc from \"./svgs/im-fell-english-sc.svg\"\nimport _imFellEnglish from \"./svgs/im-fell-english.svg\"\nimport _imFellFrenchCanonSc from \"./svgs/im-fell-french-canon-sc.svg\"\nimport _imFellFrenchCanon from \"./svgs/im-fell-french-canon.svg\"\nimport _imFellGreatPrimerSc from \"./svgs/im-fell-great-primer-sc.svg\"\nimport _imFellGreatPrimer from \"./svgs/im-fell-great-primer.svg\"\nimport _imbue from \"./svgs/imbue.svg\"\nimport _imperialScript from \"./svgs/imperial-script.svg\"\nimport _imprima from \"./svgs/imprima.svg\"\nimport _inclusiveSans from \"./svgs/inclusive-sans.svg\"\nimport _inconsolata from \"./svgs/inconsolata.svg\"\nimport _inder from \"./svgs/inder.svg\"\nimport _indieFlower from \"./svgs/indie-flower.svg\"\nimport _ingridDarling from \"./svgs/ingrid-darling.svg\"\nimport _inika from \"./svgs/inika.svg\"\nimport _inknutAntiqua from \"./svgs/inknut-antiqua.svg\"\nimport _inriaSans from \"./svgs/inria-sans.svg\"\nimport _inriaSerif from \"./svgs/inria-serif.svg\"\nimport _inspiration from \"./svgs/inspiration.svg\"\nimport _instrumentSans from \"./svgs/instrument-sans.svg\"\nimport _instrumentSerif from \"./svgs/instrument-serif.svg\"\nimport _intelOneMono from \"./svgs/intel-one-mono.svg\"\nimport _interTight from \"./svgs/inter-tight.svg\"\nimport _inter from \"./svgs/inter.svg\"\nimport _iosevkaCharonMono from \"./svgs/iosevka-charon-mono.svg\"\nimport _iosevkaCharon from \"./svgs/iosevka-charon.svg\"\nimport _irishGrover from \"./svgs/irish-grover.svg\"\nimport _islandMoments from \"./svgs/island-moments.svg\"\nimport _istokWeb from \"./svgs/istok-web.svg\"\nimport _italiana from \"./svgs/italiana.svg\"\nimport _italianno from \"./svgs/italianno.svg\"\nimport _itim from \"./svgs/itim.svg\"\nimport _jacquard12Charted from \"./svgs/jacquard-12-charted.svg\"\nimport _jacquard12 from \"./svgs/jacquard-12.svg\"\nimport _jacquard24Charted from \"./svgs/jacquard-24-charted.svg\"\nimport _jacquard24 from \"./svgs/jacquard-24.svg\"\nimport _jacquardaBastarda9Charted from \"./svgs/jacquarda-bastarda-9-charted.svg\"\nimport _jacquardaBastarda9 from \"./svgs/jacquarda-bastarda-9.svg\"\nimport _jacquesFrancoisShadow from \"./svgs/jacques-francois-shadow.svg\"\nimport _jacquesFrancois from \"./svgs/jacques-francois.svg\"\nimport _jainiPurva from \"./svgs/jaini-purva.svg\"\nimport _jaini from \"./svgs/jaini.svg\"\nimport _jakob from \"./svgs/jakob.svg\"\nimport _jaldi from \"./svgs/jaldi.svg\"\nimport _jaro from \"./svgs/jaro.svg\"\nimport _jersey10Charted from \"./svgs/jersey-10-charted.svg\"\nimport _jersey10 from \"./svgs/jersey-10.svg\"\nimport _jersey15Charted from \"./svgs/jersey-15-charted.svg\"\nimport _jersey15 from \"./svgs/jersey-15.svg\"\nimport _jersey20Charted from \"./svgs/jersey-20-charted.svg\"\nimport _jersey20 from \"./svgs/jersey-20.svg\"\nimport _jersey25Charted from \"./svgs/jersey-25-charted.svg\"\nimport _jersey25 from \"./svgs/jersey-25.svg\"\nimport _jetbrainsMono from \"./svgs/jetbrains-mono.svg\"\nimport _jimNightshade from \"./svgs/jim-nightshade.svg\"\nimport _joan from \"./svgs/joan.svg\"\nimport _jockeyOne from \"./svgs/jockey-one.svg\"\nimport _jollyLodger from \"./svgs/jolly-lodger.svg\"\nimport _jomhuria from \"./svgs/jomhuria.svg\"\nimport _jomolhari from \"./svgs/jomolhari.svg\"\nimport _josefinSans from \"./svgs/josefin-sans.svg\"\nimport _josefinSlab from \"./svgs/josefin-slab.svg\"\nimport _jost from \"./svgs/jost.svg\"\nimport _jotiOne from \"./svgs/joti-one.svg\"\nimport _jua from \"./svgs/jua.svg\"\nimport _judson from \"./svgs/judson.svg\"\nimport _julee from \"./svgs/julee.svg\"\nimport _juliusSansOne from \"./svgs/julius-sans-one.svg\"\nimport _junge from \"./svgs/junge.svg\"\nimport _junicodeVf from \"./svgs/junicode-vf.svg\"\nimport _jura from \"./svgs/jura.svg\"\nimport _justAnotherHand from \"./svgs/just-another-hand.svg\"\nimport _justMeAgainDownHere from \"./svgs/just-me-again-down-here.svg\"\nimport _k2d from \"./svgs/k2d.svg\"\nimport _kablammo from \"./svgs/kablammo.svg\"\nimport _kadwa from \"./svgs/kadwa.svg\"\nimport _kaiseiDecol from \"./svgs/kaisei-decol.svg\"\nimport _kaiseiHarunoumi from \"./svgs/kaisei-harunoumi.svg\"\nimport _kaiseiOpti from \"./svgs/kaisei-opti.svg\"\nimport _kaiseiTokumin from \"./svgs/kaisei-tokumin.svg\"\nimport _kalam from \"./svgs/kalam.svg\"\nimport _kalniaGlaze from \"./svgs/kalnia-glaze.svg\"\nimport _kalnia from \"./svgs/kalnia.svg\"\nimport _kameron from \"./svgs/kameron.svg\"\nimport _kanchenjunga from \"./svgs/kanchenjunga.svg\"\nimport _kanit from \"./svgs/kanit.svg\"\nimport _kantumruyPro from \"./svgs/kantumruy-pro.svg\"\nimport _kapakana from \"./svgs/kapakana.svg\"\nimport _karantina from \"./svgs/karantina.svg\"\nimport _karla from \"./svgs/karla.svg\"\nimport _karma from \"./svgs/karma.svg\"\nimport _katibeh from \"./svgs/katibeh.svg\"\nimport _kaushanScript from \"./svgs/kaushan-script.svg\"\nimport _kavivanar from \"./svgs/kavivanar.svg\"\nimport _kavoon from \"./svgs/kavoon.svg\"\nimport _kayPhoDu from \"./svgs/kay-pho-du.svg\"\nimport _kdamThmorPro from \"./svgs/kdam-thmor-pro.svg\"\nimport _keaniaOne from \"./svgs/keania-one.svg\"\nimport _kedebideri from \"./svgs/kedebideri.svg\"\nimport _kellySlab from \"./svgs/kelly-slab.svg\"\nimport _kenia from \"./svgs/kenia.svg\"\nimport _khand from \"./svgs/khand.svg\"\nimport _khula from \"./svgs/khula.svg\"\nimport _kihim from \"./svgs/kihim.svg\"\nimport _kings from \"./svgs/kings.svg\"\nimport _kirangHaerang from \"./svgs/kirang-haerang.svg\"\nimport _kiteOne from \"./svgs/kite-one.svg\"\nimport _kiwiMaru from \"./svgs/kiwi-maru.svg\"\nimport _kleeOne from \"./svgs/klee-one.svg\"\nimport _knewave from \"./svgs/knewave.svg\"\nimport _kobata from \"./svgs/kobata.svg\"\nimport _kodchasan from \"./svgs/kodchasan.svg\"\nimport _kodeMono from \"./svgs/kode-mono.svg\"\nimport _kohSantepheap from \"./svgs/koh-santepheap.svg\"\nimport _koho from \"./svgs/koho.svg\"\nimport _kola from \"./svgs/kola.svg\"\nimport _kolkerBrush from \"./svgs/kolker-brush.svg\"\nimport _konkhmerSleokchher from \"./svgs/konkhmer-sleokchher.svg\"\nimport _kosugiMaru from \"./svgs/kosugi-maru.svg\"\nimport _kosugi from \"./svgs/kosugi.svg\"\nimport _kottaOne from \"./svgs/kotta-one.svg\"\nimport _koulen from \"./svgs/koulen.svg\"\nimport _kranky from \"./svgs/kranky.svg\"\nimport _kreon from \"./svgs/kreon.svg\"\nimport _kristi from \"./svgs/kristi.svg\"\nimport _kronaOne from \"./svgs/krona-one.svg\"\nimport _krub from \"./svgs/krub.svg\"\nimport _kufam from \"./svgs/kufam.svg\"\nimport _kulimPark from \"./svgs/kulim-park.svg\"\nimport _kumarOneOutline from \"./svgs/kumar-one-outline.svg\"\nimport _kumarOne from \"./svgs/kumar-one.svg\"\nimport _kumbhSans from \"./svgs/kumbh-sans.svg\"\nimport _kurale from \"./svgs/kurale.svg\"\nimport _laBelleAurore from \"./svgs/la-belle-aurore.svg\"\nimport _labrada from \"./svgs/labrada.svg\"\nimport _lacquer from \"./svgs/lacquer.svg\"\nimport _laila from \"./svgs/laila.svg\"\nimport _lakkiReddy from \"./svgs/lakki-reddy.svg\"\nimport _lalezar from \"./svgs/lalezar.svg\"\nimport _lancelot from \"./svgs/lancelot.svg\"\nimport _langar from \"./svgs/langar.svg\"\nimport _lateef from \"./svgs/lateef.svg\"\nimport _lato from \"./svgs/lato.svg\"\nimport _lavishlyYours from \"./svgs/lavishly-yours.svg\"\nimport _lavoir from \"./svgs/lavoir.svg\"\nimport _lctCiburial from \"./svgs/lct-ciburial.svg\"\nimport _lctIptex from \"./svgs/lct-iptex.svg\"\nimport _leagueGothic from \"./svgs/league-gothic.svg\"\nimport _leagueScript from \"./svgs/league-script.svg\"\nimport _leagueSpartan from \"./svgs/league-spartan.svg\"\nimport _leckerliOne from \"./svgs/leckerli-one.svg\"\nimport _ledger from \"./svgs/ledger.svg\"\nimport _lekton from \"./svgs/lekton.svg\"\nimport _lemon from \"./svgs/lemon.svg\"\nimport _lemonada from \"./svgs/lemonada.svg\"\nimport _lexendDeca from \"./svgs/lexend-deca.svg\"\nimport _lexendExa from \"./svgs/lexend-exa.svg\"\nimport _lexendGiga from \"./svgs/lexend-giga.svg\"\nimport _lexendMega from \"./svgs/lexend-mega.svg\"\nimport _lexendPeta from \"./svgs/lexend-peta.svg\"\nimport _lexendTera from \"./svgs/lexend-tera.svg\"\nimport _lexendZetta from \"./svgs/lexend-zetta.svg\"\nimport _lexend from \"./svgs/lexend.svg\"\nimport _libertinusKeyboard from \"./svgs/libertinus-keyboard.svg\"\nimport _libertinusMath from \"./svgs/libertinus-math.svg\"\nimport _libertinusMono from \"./svgs/libertinus-mono.svg\"\nimport _libertinusSans from \"./svgs/libertinus-sans.svg\"\nimport _libertinusSerifDisplay from \"./svgs/libertinus-serif-display.svg\"\nimport _libertinusSerif from \"./svgs/libertinus-serif.svg\"\nimport _libreBarcode39ExtendedText from \"./svgs/libre-barcode-39-extended-text.svg\"\nimport _libreBarcode39Extended from \"./svgs/libre-barcode-39-extended.svg\"\nimport _libreBarcode39Text from \"./svgs/libre-barcode-39-text.svg\"\nimport _libreBarcode39 from \"./svgs/libre-barcode-39.svg\"\nimport _libreBarcode128Text from \"./svgs/libre-barcode-128-text.svg\"\nimport _libreBarcode128 from \"./svgs/libre-barcode-128.svg\"\nimport _libreBarcodeEan13Text from \"./svgs/libre-barcode-ean13-text.svg\"\nimport _libreBaskerville from \"./svgs/libre-baskerville.svg\"\nimport _libreBodoni from \"./svgs/libre-bodoni.svg\"\nimport _libreCaslonCondensed from \"./svgs/libre-caslon-condensed.svg\"\nimport _libreCaslonDisplay from \"./svgs/libre-caslon-display.svg\"\nimport _libreCaslonText from \"./svgs/libre-caslon-text.svg\"\nimport _libreFranklin from \"./svgs/libre-franklin.svg\"\nimport _licorice from \"./svgs/licorice.svg\"\nimport _lifeSavers from \"./svgs/life-savers.svg\"\nimport _ligaSans from \"./svgs/liga-sans.svg\"\nimport _lilex from \"./svgs/lilex.svg\"\nimport _lilitaOne from \"./svgs/lilita-one.svg\"\nimport _lilyScriptOne from \"./svgs/lily-script-one.svg\"\nimport _limelight from \"./svgs/limelight.svg\"\nimport _lindenHill from \"./svgs/linden-hill.svg\"\nimport _lineSeedJp from \"./svgs/line-seed-jp.svg\"\nimport _lisuBosa from \"./svgs/lisu-bosa.svg\"\nimport _liter from \"./svgs/liter.svg\"\nimport _literata from \"./svgs/literata.svg\"\nimport _liuJianMaoCao from \"./svgs/liu-jian-mao-cao.svg\"\nimport _livvic from \"./svgs/livvic.svg\"\nimport _lobsterTwo from \"./svgs/lobster-two.svg\"\nimport _lobster from \"./svgs/lobster.svg\"\nimport _londrinaOutline from \"./svgs/londrina-outline.svg\"\nimport _londrinaShadow from \"./svgs/londrina-shadow.svg\"\nimport _londrinaSketch from \"./svgs/londrina-sketch.svg\"\nimport _londrinaSolid from \"./svgs/londrina-solid.svg\"\nimport _longCang from \"./svgs/long-cang.svg\"\nimport _lora from \"./svgs/lora.svg\"\nimport _loveLight from \"./svgs/love-light.svg\"\nimport _loveYaLikeASister from \"./svgs/love-ya-like-a-sister.svg\"\nimport _lovedByTheKing from \"./svgs/loved-by-the-king.svg\"\nimport _loversQuarrel from \"./svgs/lovers-quarrel.svg\"\nimport _ltAvocado from \"./svgs/lt-avocado.svg\"\nimport _ltRemark from \"./svgs/lt-remark.svg\"\nimport _luckiestGuy from \"./svgs/luckiest-guy.svg\"\nimport _lugrasimo from \"./svgs/lugrasimo.svg\"\nimport _lumanosimo from \"./svgs/lumanosimo.svg\"\nimport _lunasima from \"./svgs/lunasima.svg\"\nimport _lunchtype25 from \"./svgs/lunchtype25.svg\"\nimport _lusitana from \"./svgs/lusitana.svg\"\nimport _lustria from \"./svgs/lustria.svg\"\nimport _luxuriousRoman from \"./svgs/luxurious-roman.svg\"\nimport _luxuriousScript from \"./svgs/luxurious-script.svg\"\nimport _lxgwMarkerGothic from \"./svgs/lxgw-marker-gothic.svg\"\nimport _lxgwWenkaiMonoTc from \"./svgs/lxgw-wenkai-mono-tc.svg\"\nimport _lxgwWenkaiTc from \"./svgs/lxgw-wenkai-tc.svg\"\nimport _mPlus1Code from \"./svgs/m-plus-1-code.svg\"\nimport _mPlus1 from \"./svgs/m-plus-1.svg\"\nimport _mPlus1p from \"./svgs/m-plus-1p.svg\"\nimport _mPlus2 from \"./svgs/m-plus-2.svg\"\nimport _mPlusCodeLatin from \"./svgs/m-plus-code-latin.svg\"\nimport _mPlusRounded1c from \"./svgs/m-plus-rounded-1c.svg\"\nimport _mPlusU from \"./svgs/m-plus-u.svg\"\nimport _maShanZheng from \"./svgs/ma-shan-zheng.svg\"\nimport _macondoSwashCaps from \"./svgs/macondo-swash-caps.svg\"\nimport _macondo from \"./svgs/macondo.svg\"\nimport _mada from \"./svgs/mada.svg\"\nimport _madimiOne from \"./svgs/madimi-one.svg\"\nimport _magiel from \"./svgs/magiel.svg\"\nimport _magra from \"./svgs/magra.svg\"\nimport _maidenOrange from \"./svgs/maiden-orange.svg\"\nimport _maitree from \"./svgs/maitree.svg\"\nimport _majorMonoDisplay from \"./svgs/major-mono-display.svg\"\nimport _mako from \"./svgs/mako.svg\"\nimport _mali from \"./svgs/mali.svg\"\nimport _mallanna from \"./svgs/mallanna.svg\"\nimport _maname from \"./svgs/maname.svg\"\nimport _mandali from \"./svgs/mandali.svg\"\nimport _manjari from \"./svgs/manjari.svg\"\nimport _manrope from \"./svgs/manrope.svg\"\nimport _mansalva from \"./svgs/mansalva.svg\"\nimport _manuale from \"./svgs/manuale.svg\"\nimport _manufacturingConsent from \"./svgs/manufacturing-consent.svg\"\nimport _marcellusSc from \"./svgs/marcellus-sc.svg\"\nimport _marcellus from \"./svgs/marcellus.svg\"\nimport _marckScript from \"./svgs/marck-script.svg\"\nimport _margarine from \"./svgs/margarine.svg\"\nimport _marhey from \"./svgs/marhey.svg\"\nimport _markaziText from \"./svgs/markazi-text.svg\"\nimport _markoOne from \"./svgs/marko-one.svg\"\nimport _marmelad from \"./svgs/marmelad.svg\"\nimport _martelSans from \"./svgs/martel-sans.svg\"\nimport _martel from \"./svgs/martel.svg\"\nimport _martianMono from \"./svgs/martian-mono.svg\"\nimport _marvel from \"./svgs/marvel.svg\"\nimport _matangi from \"./svgs/matangi.svg\"\nimport _mateSc from \"./svgs/mate-sc.svg\"\nimport _mate from \"./svgs/mate.svg\"\nimport _matemasie from \"./svgs/matemasie.svg\"\nimport _mattone from \"./svgs/mattone.svg\"\nimport _mavenPro from \"./svgs/maven-pro.svg\"\nimport _maziusDisplay from \"./svgs/mazius-display.svg\"\nimport _mclaren from \"./svgs/mclaren.svg\"\nimport _meaCulpa from \"./svgs/mea-culpa.svg\"\nimport _meddon from \"./svgs/meddon.svg\"\nimport _medievalsharp from \"./svgs/medievalsharp.svg\"\nimport _medulaOne from \"./svgs/medula-one.svg\"\nimport _meeraInimai from \"./svgs/meera-inimai.svg\"\nimport _megrim from \"./svgs/megrim.svg\"\nimport _meieScript from \"./svgs/meie-script.svg\"\nimport _melodrama from \"./svgs/melodrama.svg\"\nimport _menbere from \"./svgs/menbere.svg\"\nimport _meowScript from \"./svgs/meow-script.svg\"\nimport _meriendaOne from \"./svgs/merienda-one.svg\"\nimport _merienda from \"./svgs/merienda.svg\"\nimport _merriweatherSans from \"./svgs/merriweather-sans.svg\"\nimport _merriweather from \"./svgs/merriweather.svg\"\nimport _messapia from \"./svgs/messapia.svg\"\nimport _metalMania from \"./svgs/metal-mania.svg\"\nimport _metal from \"./svgs/metal.svg\"\nimport _metamorphous from \"./svgs/metamorphous.svg\"\nimport _metrophobic from \"./svgs/metrophobic.svg\"\nimport _michroma from \"./svgs/michroma.svg\"\nimport _micro5Charted from \"./svgs/micro-5-charted.svg\"\nimport _micro5 from \"./svgs/micro-5.svg\"\nimport _milkman from \"./svgs/milkman.svg\"\nimport _milonga from \"./svgs/milonga.svg\"\nimport _miltonianTattoo from \"./svgs/miltonian-tattoo.svg\"\nimport _miltonian from \"./svgs/miltonian.svg\"\nimport _mina from \"./svgs/mina.svg\"\nimport _mingzat from \"./svgs/mingzat.svg\"\nimport _miniver from \"./svgs/miniver.svg\"\nimport _mirandaSans from \"./svgs/miranda-sans.svg\"\nimport _miriamLibre from \"./svgs/miriam-libre.svg\"\nimport _mirza from \"./svgs/mirza.svg\"\nimport _missFajardose from \"./svgs/miss-fajardose.svg\"\nimport _mitr from \"./svgs/mitr.svg\"\nimport _mluvka from \"./svgs/mluvka.svg\"\nimport _mochiyPopOne from \"./svgs/mochiy-pop-one.svg\"\nimport _mochiyPopPOne from \"./svgs/mochiy-pop-p-one.svg\"\nimport _modak from \"./svgs/modak.svg\"\nimport _modernAntiqua from \"./svgs/modern-antiqua.svg\"\nimport _moderustic from \"./svgs/moderustic.svg\"\nimport _mogra from \"./svgs/mogra.svg\"\nimport _mohave from \"./svgs/mohave.svg\"\nimport _moiraiOne from \"./svgs/moirai-one.svg\"\nimport _molengo from \"./svgs/molengo.svg\"\nimport _molle from \"./svgs/molle.svg\"\nimport _momoSignature from \"./svgs/momo-signature.svg\"\nimport _momoTrustDisplay from \"./svgs/momo-trust-display.svg\"\nimport _momoTrustSans from \"./svgs/momo-trust-sans.svg\"\nimport _monaSans from \"./svgs/mona-sans.svg\"\nimport _monda from \"./svgs/monda.svg\"\nimport _monofett from \"./svgs/monofett.svg\"\nimport _monomakh from \"./svgs/monomakh.svg\"\nimport _monomaniacOne from \"./svgs/monomaniac-one.svg\"\nimport _monoton from \"./svgs/monoton.svg\"\nimport _monsieurLaDoulaise from \"./svgs/monsieur-la-doulaise.svg\"\nimport _montaga from \"./svgs/montaga.svg\"\nimport _montaguSlab from \"./svgs/montagu-slab.svg\"\nimport _montecarlo from \"./svgs/montecarlo.svg\"\nimport _montez from \"./svgs/montez.svg\"\nimport _montserratAlternates from \"./svgs/montserrat-alternates.svg\"\nimport _montserratSubrayada from \"./svgs/montserrat-subrayada.svg\"\nimport _montserratUnderline from \"./svgs/montserrat-underline.svg\"\nimport _montserrat from \"./svgs/montserrat.svg\"\nimport _mooLahLah from \"./svgs/moo-lah-lah.svg\"\nimport _mooli from \"./svgs/mooli.svg\"\nimport _moonDance from \"./svgs/moon-dance.svg\"\nimport _moul from \"./svgs/moul.svg\"\nimport _moulpali from \"./svgs/moulpali.svg\"\nimport _mountainsOfChristmas from \"./svgs/mountains-of-christmas.svg\"\nimport _mourier from \"./svgs/mourier.svg\"\nimport _mouseMemoirs from \"./svgs/mouse-memoirs.svg\"\nimport _mozillaHeadline from \"./svgs/mozilla-headline.svg\"\nimport _mozillaText from \"./svgs/mozilla-text.svg\"\nimport _mrBedfort from \"./svgs/mr-bedfort.svg\"\nimport _mrDafoe from \"./svgs/mr-dafoe.svg\"\nimport _mrDeHaviland from \"./svgs/mr-de-haviland.svg\"\nimport _mrsSaintDelafield from \"./svgs/mrs-saint-delafield.svg\"\nimport _mrsSheppards from \"./svgs/mrs-sheppards.svg\"\nimport _msMadi from \"./svgs/ms-madi.svg\"\nimport _muktaMahee from \"./svgs/mukta-mahee.svg\"\nimport _muktaMalar from \"./svgs/mukta-malar.svg\"\nimport _muktaVaani from \"./svgs/mukta-vaani.svg\"\nimport _mukta from \"./svgs/mukta.svg\"\nimport _mulish from \"./svgs/mulish.svg\"\nimport _murecho from \"./svgs/murecho.svg\"\nimport _museomoderno from \"./svgs/museomoderno.svg\"\nimport _mySoul from \"./svgs/my-soul.svg\"\nimport _mynerve from \"./svgs/mynerve.svg\"\nimport _mysteryQuest from \"./svgs/mystery-quest.svg\"\nimport _nabla from \"./svgs/nabla.svg\"\nimport _namdhinggo from \"./svgs/namdhinggo.svg\"\nimport _nanumBrushScript from \"./svgs/nanum-brush-script.svg\"\nimport _nanumGothicCoding from \"./svgs/nanum-gothic-coding.svg\"\nimport _nanumGothic from \"./svgs/nanum-gothic.svg\"\nimport _nanumMyeongjo from \"./svgs/nanum-myeongjo.svg\"\nimport _nanumPenScript from \"./svgs/nanum-pen-script.svg\"\nimport _narnoor from \"./svgs/narnoor.svg\"\nimport _nataSans from \"./svgs/nata-sans.svg\"\nimport _nationalPark from \"./svgs/national-park.svg\"\nimport _neco from \"./svgs/neco.svg\"\nimport _nectoMono from \"./svgs/necto-mono.svg\"\nimport _nemoy from \"./svgs/nemoy.svg\"\nimport _neonderthaw from \"./svgs/neonderthaw.svg\"\nimport _nerkoOne from \"./svgs/nerko-one.svg\"\nimport _neucha from \"./svgs/neucha.svg\"\nimport _neuton from \"./svgs/neuton.svg\"\nimport _neutralSans from \"./svgs/neutral-sans.svg\"\nimport _newAmsterdam from \"./svgs/new-amsterdam.svg\"\nimport _newRocker from \"./svgs/new-rocker.svg\"\nimport _newTegomin from \"./svgs/new-tegomin.svg\"\nimport _newTitle from \"./svgs/new-title.svg\"\nimport _newsCycle from \"./svgs/news-cycle.svg\"\nimport _newsreader from \"./svgs/newsreader.svg\"\nimport _niconne from \"./svgs/niconne.svg\"\nimport _nippo from \"./svgs/nippo.svg\"\nimport _niramit from \"./svgs/niramit.svg\"\nimport _nixieOne from \"./svgs/nixie-one.svg\"\nimport _nobile from \"./svgs/nobile.svg\"\nimport _nocurvesboustrophedon from \"./svgs/nocurvesboustrophedon.svg\"\nimport _nokora from \"./svgs/nokora.svg\"\nimport _norican from \"./svgs/norican.svg\"\nimport _norm from \"./svgs/norm.svg\"\nimport _nosifer from \"./svgs/nosifer.svg\"\nimport _notable from \"./svgs/notable.svg\"\nimport _nothingYouCouldDo from \"./svgs/nothing-you-could-do.svg\"\nimport _noticiaText from \"./svgs/noticia-text.svg\"\nimport _notoKufiArabic from \"./svgs/noto-kufi-arabic.svg\"\nimport _notoMusic from \"./svgs/noto-music.svg\"\nimport _notoNaskhArabic from \"./svgs/noto-naskh-arabic.svg\"\nimport _notoNastaliqUrdu from \"./svgs/noto-nastaliq-urdu.svg\"\nimport _notoRashiHebrew from \"./svgs/noto-rashi-hebrew.svg\"\nimport _notoSansAdlamUnjoined from \"./svgs/noto-sans-adlam-unjoined.svg\"\nimport _notoSansAdlam from \"./svgs/noto-sans-adlam.svg\"\nimport _notoSansAnatolianHieroglyphs from \"./svgs/noto-sans-anatolian-hieroglyphs.svg\"\nimport _notoSansArabic from \"./svgs/noto-sans-arabic.svg\"\nimport _notoSansArmenian from \"./svgs/noto-sans-armenian.svg\"\nimport _notoSansAvestan from \"./svgs/noto-sans-avestan.svg\"\nimport _notoSansBalinese from \"./svgs/noto-sans-balinese.svg\"\nimport _notoSansBamum from \"./svgs/noto-sans-bamum.svg\"\nimport _notoSansBassaVah from \"./svgs/noto-sans-bassa-vah.svg\"\nimport _notoSansBatak from \"./svgs/noto-sans-batak.svg\"\nimport _notoSansBengali from \"./svgs/noto-sans-bengali.svg\"\nimport _notoSansBhaiksuki from \"./svgs/noto-sans-bhaiksuki.svg\"\nimport _notoSansBrahmi from \"./svgs/noto-sans-brahmi.svg\"\nimport _notoSansBuginese from \"./svgs/noto-sans-buginese.svg\"\nimport _notoSansBuhid from \"./svgs/noto-sans-buhid.svg\"\nimport _notoSansCanadianAboriginal from \"./svgs/noto-sans-canadian-aboriginal.svg\"\nimport _notoSansCarian from \"./svgs/noto-sans-carian.svg\"\nimport _notoSansCaucasianAlbanian from \"./svgs/noto-sans-caucasian-albanian.svg\"\nimport _notoSansChakma from \"./svgs/noto-sans-chakma.svg\"\nimport _notoSansCham from \"./svgs/noto-sans-cham.svg\"\nimport _notoSansCherokee from \"./svgs/noto-sans-cherokee.svg\"\nimport _notoSansChorasmian from \"./svgs/noto-sans-chorasmian.svg\"\nimport _notoSansCoptic from \"./svgs/noto-sans-coptic.svg\"\nimport _notoSansCuneiform from \"./svgs/noto-sans-cuneiform.svg\"\nimport _notoSansCypriot from \"./svgs/noto-sans-cypriot.svg\"\nimport _notoSansCyproMinoan from \"./svgs/noto-sans-cypro-minoan.svg\"\nimport _notoSansDeseret from \"./svgs/noto-sans-deseret.svg\"\nimport _notoSansDevanagari from \"./svgs/noto-sans-devanagari.svg\"\nimport _notoSansDisplay from \"./svgs/noto-sans-display.svg\"\nimport _notoSansDuployan from \"./svgs/noto-sans-duployan.svg\"\nimport _notoSansEgyptianHieroglyphs from \"./svgs/noto-sans-egyptian-hieroglyphs.svg\"\nimport _notoSansElbasan from \"./svgs/noto-sans-elbasan.svg\"\nimport _notoSansElymaic from \"./svgs/noto-sans-elymaic.svg\"\nimport _notoSansEthiopic from \"./svgs/noto-sans-ethiopic.svg\"\nimport _notoSansGeorgian from \"./svgs/noto-sans-georgian.svg\"\nimport _notoSansGlagolitic from \"./svgs/noto-sans-glagolitic.svg\"\nimport _notoSansGothic from \"./svgs/noto-sans-gothic.svg\"\nimport _notoSansGrantha from \"./svgs/noto-sans-grantha.svg\"\nimport _notoSansGujarati from \"./svgs/noto-sans-gujarati.svg\"\nimport _notoSansGunjalaGondi from \"./svgs/noto-sans-gunjala-gondi.svg\"\nimport _notoSansGurmukhi from \"./svgs/noto-sans-gurmukhi.svg\"\nimport _notoSansHanifiRohingya from \"./svgs/noto-sans-hanifi-rohingya.svg\"\nimport _notoSansHanunoo from \"./svgs/noto-sans-hanunoo.svg\"\nimport _notoSansHatran from \"./svgs/noto-sans-hatran.svg\"\nimport _notoSansHebrew from \"./svgs/noto-sans-hebrew.svg\"\nimport _notoSansHk from \"./svgs/noto-sans-hk.svg\"\nimport _notoSansImperialAramaic from \"./svgs/noto-sans-imperial-aramaic.svg\"\nimport _notoSansIndicSiyaqNumbers from \"./svgs/noto-sans-indic-siyaq-numbers.svg\"\nimport _notoSansInscriptionalPahlavi from \"./svgs/noto-sans-inscriptional-pahlavi.svg\"\nimport _notoSansInscriptionalParthian from \"./svgs/noto-sans-inscriptional-parthian.svg\"\nimport _notoSansJavanese from \"./svgs/noto-sans-javanese.svg\"\nimport _notoSansJp from \"./svgs/noto-sans-jp.svg\"\nimport _notoSansKaithi from \"./svgs/noto-sans-kaithi.svg\"\nimport _notoSansKannada from \"./svgs/noto-sans-kannada.svg\"\nimport _notoSansKawi from \"./svgs/noto-sans-kawi.svg\"\nimport _notoSansKayahLi from \"./svgs/noto-sans-kayah-li.svg\"\nimport _notoSansKharoshthi from \"./svgs/noto-sans-kharoshthi.svg\"\nimport _notoSansKhmer from \"./svgs/noto-sans-khmer.svg\"\nimport _notoSansKhojki from \"./svgs/noto-sans-khojki.svg\"\nimport _notoSansKhudawadi from \"./svgs/noto-sans-khudawadi.svg\"\nimport _notoSansKr from \"./svgs/noto-sans-kr.svg\"\nimport _notoSansLaoLooped from \"./svgs/noto-sans-lao-looped.svg\"\nimport _notoSansLao from \"./svgs/noto-sans-lao.svg\"\nimport _notoSansLepcha from \"./svgs/noto-sans-lepcha.svg\"\nimport _notoSansLimbu from \"./svgs/noto-sans-limbu.svg\"\nimport _notoSansLinearA from \"./svgs/noto-sans-linear-a.svg\"\nimport _notoSansLinearB from \"./svgs/noto-sans-linear-b.svg\"\nimport _notoSansLisu from \"./svgs/noto-sans-lisu.svg\"\nimport _notoSansLydian from \"./svgs/noto-sans-lydian.svg\"\nimport _notoSansMahajani from \"./svgs/noto-sans-mahajani.svg\"\nimport _notoSansMalayalam from \"./svgs/noto-sans-malayalam.svg\"\nimport _notoSansMandaic from \"./svgs/noto-sans-mandaic.svg\"\nimport _notoSansManichaean from \"./svgs/noto-sans-manichaean.svg\"\nimport _notoSansMarchen from \"./svgs/noto-sans-marchen.svg\"\nimport _notoSansMasaramGondi from \"./svgs/noto-sans-masaram-gondi.svg\"\nimport _notoSansMath from \"./svgs/noto-sans-math.svg\"\nimport _notoSansMayanNumerals from \"./svgs/noto-sans-mayan-numerals.svg\"\nimport _notoSansMedefaidrin from \"./svgs/noto-sans-medefaidrin.svg\"\nimport _notoSansMeeteiMayek from \"./svgs/noto-sans-meetei-mayek.svg\"\nimport _notoSansMendeKikakui from \"./svgs/noto-sans-mende-kikakui.svg\"\nimport _notoSansMeroitic from \"./svgs/noto-sans-meroitic.svg\"\nimport _notoSansMiao from \"./svgs/noto-sans-miao.svg\"\nimport _notoSansModi from \"./svgs/noto-sans-modi.svg\"\nimport _notoSansMongolian from \"./svgs/noto-sans-mongolian.svg\"\nimport _notoSansMono from \"./svgs/noto-sans-mono.svg\"\nimport _notoSansMro from \"./svgs/noto-sans-mro.svg\"\nimport _notoSansMultani from \"./svgs/noto-sans-multani.svg\"\nimport _notoSansMyanmar from \"./svgs/noto-sans-myanmar.svg\"\nimport _notoSansNabataean from \"./svgs/noto-sans-nabataean.svg\"\nimport _notoSansNagMundari from \"./svgs/noto-sans-nag-mundari.svg\"\nimport _notoSansNandinagari from \"./svgs/noto-sans-nandinagari.svg\"\nimport _notoSansNewTaiLue from \"./svgs/noto-sans-new-tai-lue.svg\"\nimport _notoSansNewa from \"./svgs/noto-sans-newa.svg\"\nimport _notoSansNkoUnjoined from \"./svgs/noto-sans-nko-unjoined.svg\"\nimport _notoSansNko from \"./svgs/noto-sans-nko.svg\"\nimport _notoSansNushu from \"./svgs/noto-sans-nushu.svg\"\nimport _notoSansOgham from \"./svgs/noto-sans-ogham.svg\"\nimport _notoSansOlChiki from \"./svgs/noto-sans-ol-chiki.svg\"\nimport _notoSansOldHungarian from \"./svgs/noto-sans-old-hungarian.svg\"\nimport _notoSansOldItalic from \"./svgs/noto-sans-old-italic.svg\"\nimport _notoSansOldNorthArabian from \"./svgs/noto-sans-old-north-arabian.svg\"\nimport _notoSansOldPermic from \"./svgs/noto-sans-old-permic.svg\"\nimport _notoSansOldPersian from \"./svgs/noto-sans-old-persian.svg\"\nimport _notoSansOldSogdian from \"./svgs/noto-sans-old-sogdian.svg\"\nimport _notoSansOldSouthArabian from \"./svgs/noto-sans-old-south-arabian.svg\"\nimport _notoSansOldTurkic from \"./svgs/noto-sans-old-turkic.svg\"\nimport _notoSansOriya from \"./svgs/noto-sans-oriya.svg\"\nimport _notoSansOsage from \"./svgs/noto-sans-osage.svg\"\nimport _notoSansOsmanya from \"./svgs/noto-sans-osmanya.svg\"\nimport _notoSansPahawhHmong from \"./svgs/noto-sans-pahawh-hmong.svg\"\nimport _notoSansPalmyrene from \"./svgs/noto-sans-palmyrene.svg\"\nimport _notoSansPauCinHau from \"./svgs/noto-sans-pau-cin-hau.svg\"\nimport _notoSansPhagspa from \"./svgs/noto-sans-phagspa.svg\"\nimport _notoSansPhoenician from \"./svgs/noto-sans-phoenician.svg\"\nimport _notoSansPsalterPahlavi from \"./svgs/noto-sans-psalter-pahlavi.svg\"\nimport _notoSansRejang from \"./svgs/noto-sans-rejang.svg\"\nimport _notoSansRunic from \"./svgs/noto-sans-runic.svg\"\nimport _notoSansSamaritan from \"./svgs/noto-sans-samaritan.svg\"\nimport _notoSansSaurashtra from \"./svgs/noto-sans-saurashtra.svg\"\nimport _notoSansSc from \"./svgs/noto-sans-sc.svg\"\nimport _notoSansSharada from \"./svgs/noto-sans-sharada.svg\"\nimport _notoSansShavian from \"./svgs/noto-sans-shavian.svg\"\nimport _notoSansSiddham from \"./svgs/noto-sans-siddham.svg\"\nimport _notoSansSignwriting from \"./svgs/noto-sans-signwriting.svg\"\nimport _notoSansSinhala from \"./svgs/noto-sans-sinhala.svg\"\nimport _notoSansSogdian from \"./svgs/noto-sans-sogdian.svg\"\nimport _notoSansSoraSompeng from \"./svgs/noto-sans-sora-sompeng.svg\"\nimport _notoSansSoyombo from \"./svgs/noto-sans-soyombo.svg\"\nimport _notoSansSundanese from \"./svgs/noto-sans-sundanese.svg\"\nimport _notoSansSunuwar from \"./svgs/noto-sans-sunuwar.svg\"\nimport _notoSansSylotiNagri from \"./svgs/noto-sans-syloti-nagri.svg\"\nimport _notoSansSymbols2 from \"./svgs/noto-sans-symbols-2.svg\"\nimport _notoSansSymbols from \"./svgs/noto-sans-symbols.svg\"\nimport _notoSansSyriacEastern from \"./svgs/noto-sans-syriac-eastern.svg\"\nimport _notoSansSyriacWestern from \"./svgs/noto-sans-syriac-western.svg\"\nimport _notoSansSyriac from \"./svgs/noto-sans-syriac.svg\"\nimport _notoSansTagalog from \"./svgs/noto-sans-tagalog.svg\"\nimport _notoSansTagbanwa from \"./svgs/noto-sans-tagbanwa.svg\"\nimport _notoSansTaiLe from \"./svgs/noto-sans-tai-le.svg\"\nimport _notoSansTaiTham from \"./svgs/noto-sans-tai-tham.svg\"\nimport _notoSansTaiViet from \"./svgs/noto-sans-tai-viet.svg\"\nimport _notoSansTakri from \"./svgs/noto-sans-takri.svg\"\nimport _notoSansTamilSupplement from \"./svgs/noto-sans-tamil-supplement.svg\"\nimport _notoSansTamil from \"./svgs/noto-sans-tamil.svg\"\nimport _notoSansTangsa from \"./svgs/noto-sans-tangsa.svg\"\nimport _notoSansTc from \"./svgs/noto-sans-tc.svg\"\nimport _notoSansTelugu from \"./svgs/noto-sans-telugu.svg\"\nimport _notoSansThaana from \"./svgs/noto-sans-thaana.svg\"\nimport _notoSansThaiLooped from \"./svgs/noto-sans-thai-looped.svg\"\nimport _notoSansThai from \"./svgs/noto-sans-thai.svg\"\nimport _notoSansTifinagh from \"./svgs/noto-sans-tifinagh.svg\"\nimport _notoSansTirhuta from \"./svgs/noto-sans-tirhuta.svg\"\nimport _notoSansUgaritic from \"./svgs/noto-sans-ugaritic.svg\"\nimport _notoSansVai from \"./svgs/noto-sans-vai.svg\"\nimport _notoSansVithkuqi from \"./svgs/noto-sans-vithkuqi.svg\"\nimport _notoSansWancho from \"./svgs/noto-sans-wancho.svg\"\nimport _notoSansWarangCiti from \"./svgs/noto-sans-warang-citi.svg\"\nimport _notoSansYi from \"./svgs/noto-sans-yi.svg\"\nimport _notoSansZanabazarSquare from \"./svgs/noto-sans-zanabazar-square.svg\"\nimport _notoSans from \"./svgs/noto-sans.svg\"\nimport _notoSerifAhom from \"./svgs/noto-serif-ahom.svg\"\nimport _notoSerifArmenian from \"./svgs/noto-serif-armenian.svg\"\nimport _notoSerifBalinese from \"./svgs/noto-serif-balinese.svg\"\nimport _notoSerifBengali from \"./svgs/noto-serif-bengali.svg\"\nimport _notoSerifDevanagari from \"./svgs/noto-serif-devanagari.svg\"\nimport _notoSerifDisplay from \"./svgs/noto-serif-display.svg\"\nimport _notoSerifDivesAkuru from \"./svgs/noto-serif-dives-akuru.svg\"\nimport _notoSerifDogra from \"./svgs/noto-serif-dogra.svg\"\nimport _notoSerifEthiopic from \"./svgs/noto-serif-ethiopic.svg\"\nimport _notoSerifGeorgian from \"./svgs/noto-serif-georgian.svg\"\nimport _notoSerifGrantha from \"./svgs/noto-serif-grantha.svg\"\nimport _notoSerifGujarati from \"./svgs/noto-serif-gujarati.svg\"\nimport _notoSerifGurmukhi from \"./svgs/noto-serif-gurmukhi.svg\"\nimport _notoSerifHebrew from \"./svgs/noto-serif-hebrew.svg\"\nimport _notoSerifHentaigana from \"./svgs/noto-serif-hentaigana.svg\"\nimport _notoSerifHk from \"./svgs/noto-serif-hk.svg\"\nimport _notoSerifJp from \"./svgs/noto-serif-jp.svg\"\nimport _notoSerifKannada from \"./svgs/noto-serif-kannada.svg\"\nimport _notoSerifKhitanSmallScript from \"./svgs/noto-serif-khitan-small-script.svg\"\nimport _notoSerifKhmer from \"./svgs/noto-serif-khmer.svg\"\nimport _notoSerifKhojki from \"./svgs/noto-serif-khojki.svg\"\nimport _notoSerifKr from \"./svgs/noto-serif-kr.svg\"\nimport _notoSerifLao from \"./svgs/noto-serif-lao.svg\"\nimport _notoSerifMakasar from \"./svgs/noto-serif-makasar.svg\"\nimport _notoSerifMalayalam from \"./svgs/noto-serif-malayalam.svg\"\nimport _notoSerifNpHmong from \"./svgs/noto-serif-np-hmong.svg\"\nimport _notoSerifOldUyghur from \"./svgs/noto-serif-old-uyghur.svg\"\nimport _notoSerifOriya from \"./svgs/noto-serif-oriya.svg\"\nimport _notoSerifOttomanSiyaq from \"./svgs/noto-serif-ottoman-siyaq.svg\"\nimport _notoSerifSc from \"./svgs/noto-serif-sc.svg\"\nimport _notoSerifSinhala from \"./svgs/noto-serif-sinhala.svg\"\nimport _notoSerifTamil from \"./svgs/noto-serif-tamil.svg\"\nimport _notoSerifTangut from \"./svgs/noto-serif-tangut.svg\"\nimport _notoSerifTc from \"./svgs/noto-serif-tc.svg\"\nimport _notoSerifTelugu from \"./svgs/noto-serif-telugu.svg\"\nimport _notoSerifThai from \"./svgs/noto-serif-thai.svg\"\nimport _notoSerifTibetan from \"./svgs/noto-serif-tibetan.svg\"\nimport _notoSerifTodhri from \"./svgs/noto-serif-todhri.svg\"\nimport _notoSerifToto from \"./svgs/noto-serif-toto.svg\"\nimport _notoSerifVithkuqi from \"./svgs/noto-serif-vithkuqi.svg\"\nimport _notoSerifYezidi from \"./svgs/noto-serif-yezidi.svg\"\nimport _notoSerif from \"./svgs/noto-serif.svg\"\nimport _notoTraditionalNushu from \"./svgs/noto-traditional-nushu.svg\"\nimport _notoZnamennyMusicalNotation from \"./svgs/noto-znamenny-musical-notation.svg\"\nimport _nouvelleGrotesquerie from \"./svgs/nouvelle-grotesquerie.svg\"\nimport _novaCut from \"./svgs/nova-cut.svg\"\nimport _novaFlat from \"./svgs/nova-flat.svg\"\nimport _novaMono from \"./svgs/nova-mono.svg\"\nimport _novaOval from \"./svgs/nova-oval.svg\"\nimport _novaRound from \"./svgs/nova-round.svg\"\nimport _novaScript from \"./svgs/nova-script.svg\"\nimport _novaSlim from \"./svgs/nova-slim.svg\"\nimport _novaSquare from \"./svgs/nova-square.svg\"\nimport _now from \"./svgs/now.svg\"\nimport _ntr from \"./svgs/ntr.svg\"\nimport _numans from \"./svgs/numans.svg\"\nimport _nunitoSans from \"./svgs/nunito-sans.svg\"\nimport _nunito from \"./svgs/nunito.svg\"\nimport _nuosuSil from \"./svgs/nuosu-sil.svg\"\nimport _nOCastel from \"./svgs/n\u00E9o-castel.svg\"\nimport _odibeeSans from \"./svgs/odibee-sans.svg\"\nimport _odorMeanChey from \"./svgs/odor-mean-chey.svg\"\nimport _offside from \"./svgs/offside.svg\"\nimport _oi from \"./svgs/oi.svg\"\nimport _ojuju from \"./svgs/ojuju.svg\"\nimport _oldStandardTt from \"./svgs/old-standard-tt.svg\"\nimport _oldenburg from \"./svgs/oldenburg.svg\"\nimport _ole from \"./svgs/ole.svg\"\nimport _oleoScriptSwashCaps from \"./svgs/oleo-script-swash-caps.svg\"\nimport _oleoScript from \"./svgs/oleo-script.svg\"\nimport _onest from \"./svgs/onest.svg\"\nimport _ooohBaby from \"./svgs/oooh-baby.svg\"\nimport _openRunde from \"./svgs/open-runde.svg\"\nimport _openSans from \"./svgs/open-sans.svg\"\nimport _openSauceOne from \"./svgs/open-sauce-one.svg\"\nimport _openSauceSans from \"./svgs/open-sauce-sans.svg\"\nimport _openSauceTwo from \"./svgs/open-sauce-two.svg\"\nimport _openingHoursSans from \"./svgs/opening-hours-sans.svg\"\nimport _opticianSans from \"./svgs/optician-sans.svg\"\nimport _oranienbaum from \"./svgs/oranienbaum.svg\"\nimport _orbit from \"./svgs/orbit.svg\"\nimport _orbitron from \"./svgs/orbitron.svg\"\nimport _oregano from \"./svgs/oregano.svg\"\nimport _orelegaOne from \"./svgs/orelega-one.svg\"\nimport _orienta from \"./svgs/orienta.svg\"\nimport _originalSurfer from \"./svgs/original-surfer.svg\"\nimport _orticaAngular from \"./svgs/ortica-angular.svg\"\nimport _orticaLinear from \"./svgs/ortica-linear.svg\"\nimport _oswald from \"./svgs/oswald.svg\"\nimport _outfit from \"./svgs/outfit.svg\"\nimport _overTheRainbow from \"./svgs/over-the-rainbow.svg\"\nimport _overlockSc from \"./svgs/overlock-sc.svg\"\nimport _overlock from \"./svgs/overlock.svg\"\nimport _overpassMono from \"./svgs/overpass-mono.svg\"\nimport _overpass from \"./svgs/overpass.svg\"\nimport _ovo from \"./svgs/ovo.svg\"\nimport _oxanium from \"./svgs/oxanium.svg\"\nimport _oxygenMono from \"./svgs/oxygen-mono.svg\"\nimport _oxygen from \"./svgs/oxygen.svg\"\nimport _pacifico from \"./svgs/pacifico.svg\"\nimport _padauk from \"./svgs/padauk.svg\"\nimport _padyakkeExpandedOne from \"./svgs/padyakke-expanded-one.svg\"\nimport _palanquinDark from \"./svgs/palanquin-dark.svg\"\nimport _palanquin from \"./svgs/palanquin.svg\"\nimport _paletteMosaic from \"./svgs/palette-mosaic.svg\"\nimport _pally from \"./svgs/pally.svg\"\nimport _panchang from \"./svgs/panchang.svg\"\nimport _pangolin from \"./svgs/pangolin.svg\"\nimport _paprika from \"./svgs/paprika.svg\"\nimport _paquito from \"./svgs/paquito.svg\"\nimport _parastoo from \"./svgs/parastoo.svg\"\nimport _parisienne from \"./svgs/parisienne.svg\"\nimport _parkinsans from \"./svgs/parkinsans.svg\"\nimport _passeroOne from \"./svgs/passero-one.svg\"\nimport _passionOne from \"./svgs/passion-one.svg\"\nimport _passionsConflict from \"./svgs/passions-conflict.svg\"\nimport _pathwayExtreme from \"./svgs/pathway-extreme.svg\"\nimport _pathwayGothicOne from \"./svgs/pathway-gothic-one.svg\"\nimport _patrickHandSc from \"./svgs/patrick-hand-sc.svg\"\nimport _patrickHand from \"./svgs/patrick-hand.svg\"\nimport _patriot from \"./svgs/patriot.svg\"\nimport _pattaya from \"./svgs/pattaya.svg\"\nimport _patuaOne from \"./svgs/patua-one.svg\"\nimport _pavanam from \"./svgs/pavanam.svg\"\nimport _paytoneOne from \"./svgs/paytone-one.svg\"\nimport _pecita from \"./svgs/pecita.svg\"\nimport _peddana from \"./svgs/peddana.svg\"\nimport _pencerio from \"./svgs/pencerio.svg\"\nimport _peralta from \"./svgs/peralta.svg\"\nimport _permanentMarker from \"./svgs/permanent-marker.svg\"\nimport _petemoss from \"./svgs/petemoss.svg\"\nimport _petitFormalScript from \"./svgs/petit-formal-script.svg\"\nimport _petrona from \"./svgs/petrona.svg\"\nimport _philosopher from \"./svgs/philosopher.svg\"\nimport _phudu from \"./svgs/phudu.svg\"\nimport _piazzolla from \"./svgs/piazzolla.svg\"\nimport _piedra from \"./svgs/piedra.svg\"\nimport _pilcrowRounded from \"./svgs/pilcrow-rounded.svg\"\nimport _pinyonScript from \"./svgs/pinyon-script.svg\"\nimport _pirataOne from \"./svgs/pirata-one.svg\"\nimport _pixelcastle from \"./svgs/pixelcastle.svg\"\nimport _pixelifySans from \"./svgs/pixelify-sans.svg\"\nimport _plaster from \"./svgs/plaster.svg\"\nimport _platypi from \"./svgs/platypi.svg\"\nimport _play from \"./svgs/play.svg\"\nimport _playball from \"./svgs/playball.svg\"\nimport _playerSansMono8x8 from \"./svgs/player-sans-mono-8x8.svg\"\nimport _playfairDisplaySc from \"./svgs/playfair-display-sc.svg\"\nimport _playfairDisplay from \"./svgs/playfair-display.svg\"\nimport _playfair from \"./svgs/playfair.svg\"\nimport _playpenSansArabic from \"./svgs/playpen-sans-arabic.svg\"\nimport _playpenSansDeva from \"./svgs/playpen-sans-deva.svg\"\nimport _playpenSansHebrew from \"./svgs/playpen-sans-hebrew.svg\"\nimport _playpenSansThai from \"./svgs/playpen-sans-thai.svg\"\nimport _playpenSans from \"./svgs/playpen-sans.svg\"\nimport _playwriteArGuides from \"./svgs/playwrite-ar-guides.svg\"\nimport _playwriteAr from \"./svgs/playwrite-ar.svg\"\nimport _playwriteAtGuides from \"./svgs/playwrite-at-guides.svg\"\nimport _playwriteAt from \"./svgs/playwrite-at.svg\"\nimport _playwriteAuNswGuides from \"./svgs/playwrite-au-nsw-guides.svg\"\nimport _playwriteAuNsw from \"./svgs/playwrite-au-nsw.svg\"\nimport _playwriteAuQldGuides from \"./svgs/playwrite-au-qld-guides.svg\"\nimport _playwriteAuQld from \"./svgs/playwrite-au-qld.svg\"\nimport _playwriteAuSaGuides from \"./svgs/playwrite-au-sa-guides.svg\"\nimport _playwriteAuSa from \"./svgs/playwrite-au-sa.svg\"\nimport _playwriteAuTasGuides from \"./svgs/playwrite-au-tas-guides.svg\"\nimport _playwriteAuTas from \"./svgs/playwrite-au-tas.svg\"\nimport _playwriteAuVicGuides from \"./svgs/playwrite-au-vic-guides.svg\"\nimport _playwriteAuVic from \"./svgs/playwrite-au-vic.svg\"\nimport _playwriteBeVlgGuides from \"./svgs/playwrite-be-vlg-guides.svg\"\nimport _playwriteBeVlg from \"./svgs/playwrite-be-vlg.svg\"\nimport _playwriteBeWalGuides from \"./svgs/playwrite-be-wal-guides.svg\"\nimport _playwriteBeWal from \"./svgs/playwrite-be-wal.svg\"\nimport _playwriteBrGuides from \"./svgs/playwrite-br-guides.svg\"\nimport _playwriteBr from \"./svgs/playwrite-br.svg\"\nimport _playwriteCaGuides from \"./svgs/playwrite-ca-guides.svg\"\nimport _playwriteCa from \"./svgs/playwrite-ca.svg\"\nimport _playwriteClGuides from \"./svgs/playwrite-cl-guides.svg\"\nimport _playwriteCl from \"./svgs/playwrite-cl.svg\"\nimport _playwriteCoGuides from \"./svgs/playwrite-co-guides.svg\"\nimport _playwriteCo from \"./svgs/playwrite-co.svg\"\nimport _playwriteCuGuides from \"./svgs/playwrite-cu-guides.svg\"\nimport _playwriteCu from \"./svgs/playwrite-cu.svg\"\nimport _playwriteCzGuides from \"./svgs/playwrite-cz-guides.svg\"\nimport _playwriteCz from \"./svgs/playwrite-cz.svg\"\nimport _playwriteDeGrundGuides from \"./svgs/playwrite-de-grund-guides.svg\"\nimport _playwriteDeGrund from \"./svgs/playwrite-de-grund.svg\"\nimport _playwriteDeLaGuides from \"./svgs/playwrite-de-la-guides.svg\"\nimport _playwriteDeLa from \"./svgs/playwrite-de-la.svg\"\nimport _playwriteDeSasGuides from \"./svgs/playwrite-de-sas-guides.svg\"\nimport _playwriteDeSas from \"./svgs/playwrite-de-sas.svg\"\nimport _playwriteDeVaGuides from \"./svgs/playwrite-de-va-guides.svg\"\nimport _playwriteDeVa from \"./svgs/playwrite-de-va.svg\"\nimport _playwriteDkLoopetGuides from \"./svgs/playwrite-dk-loopet-guides.svg\"\nimport _playwriteDkLoopet from \"./svgs/playwrite-dk-loopet.svg\"\nimport _playwriteDkUloopetGuides from \"./svgs/playwrite-dk-uloopet-guides.svg\"\nimport _playwriteDkUloopet from \"./svgs/playwrite-dk-uloopet.svg\"\nimport _playwriteEsDecoGuides from \"./svgs/playwrite-es-deco-guides.svg\"\nimport _playwriteEsDeco from \"./svgs/playwrite-es-deco.svg\"\nimport _playwriteEsGuides from \"./svgs/playwrite-es-guides.svg\"\nimport _playwriteEs from \"./svgs/playwrite-es.svg\"\nimport _playwriteFrModerneGuides from \"./svgs/playwrite-fr-moderne-guides.svg\"\nimport _playwriteFrModerne from \"./svgs/playwrite-fr-moderne.svg\"\nimport _playwriteFrTradGuides from \"./svgs/playwrite-fr-trad-guides.svg\"\nimport _playwriteFrTrad from \"./svgs/playwrite-fr-trad.svg\"\nimport _playwriteGbJGuides from \"./svgs/playwrite-gb-j-guides.svg\"\nimport _playwriteGbJ from \"./svgs/playwrite-gb-j.svg\"\nimport _playwriteGbSGuides from \"./svgs/playwrite-gb-s-guides.svg\"\nimport _playwriteGbS from \"./svgs/playwrite-gb-s.svg\"\nimport _playwriteHrGuides from \"./svgs/playwrite-hr-guides.svg\"\nimport _playwriteHrLijevaGuides from \"./svgs/playwrite-hr-lijeva-guides.svg\"\nimport _playwriteHrLijeva from \"./svgs/playwrite-hr-lijeva.svg\"\nimport _playwriteHr from \"./svgs/playwrite-hr.svg\"\nimport _playwriteHuGuides from \"./svgs/playwrite-hu-guides.svg\"\nimport _playwriteHu from \"./svgs/playwrite-hu.svg\"\nimport _playwriteIdGuides from \"./svgs/playwrite-id-guides.svg\"\nimport _playwriteId from \"./svgs/playwrite-id.svg\"\nimport _playwriteIeGuides from \"./svgs/playwrite-ie-guides.svg\"\nimport _playwriteIe from \"./svgs/playwrite-ie.svg\"\nimport _playwriteInGuides from \"./svgs/playwrite-in-guides.svg\"\nimport _playwriteIn from \"./svgs/playwrite-in.svg\"\nimport _playwriteIsGuides from \"./svgs/playwrite-is-guides.svg\"\nimport _playwriteIs from \"./svgs/playwrite-is.svg\"\nimport _playwriteItModernaGuides from \"./svgs/playwrite-it-moderna-guides.svg\"\nimport _playwriteItModerna from \"./svgs/playwrite-it-moderna.svg\"\nimport _playwriteItTradGuides from \"./svgs/playwrite-it-trad-guides.svg\"\nimport _playwriteItTrad from \"./svgs/playwrite-it-trad.svg\"\nimport _playwriteMxGuides from \"./svgs/playwrite-mx-guides.svg\"\nimport _playwriteMx from \"./svgs/playwrite-mx.svg\"\nimport _playwriteNgModernGuides from \"./svgs/playwrite-ng-modern-guides.svg\"\nimport _playwriteNgModern from \"./svgs/playwrite-ng-modern.svg\"\nimport _playwriteNlGuides from \"./svgs/playwrite-nl-guides.svg\"\nimport _playwriteNl from \"./svgs/playwrite-nl.svg\"\nimport _playwriteNoGuides from \"./svgs/playwrite-no-guides.svg\"\nimport _playwriteNo from \"./svgs/playwrite-no.svg\"\nimport _playwriteNzBasicGuides from \"./svgs/playwrite-nz-basic-guides.svg\"\nimport _playwriteNzBasic from \"./svgs/playwrite-nz-basic.svg\"\nimport _playwriteNzGuides from \"./svgs/playwrite-nz-guides.svg\"\nimport _playwriteNz from \"./svgs/playwrite-nz.svg\"\nimport _playwritePeGuides from \"./svgs/playwrite-pe-guides.svg\"\nimport _playwritePe from \"./svgs/playwrite-pe.svg\"\nimport _playwritePlGuides from \"./svgs/playwrite-pl-guides.svg\"\nimport _playwritePl from \"./svgs/playwrite-pl.svg\"\nimport _playwritePtGuides from \"./svgs/playwrite-pt-guides.svg\"\nimport _playwritePt from \"./svgs/playwrite-pt.svg\"\nimport _playwriteRoGuides from \"./svgs/playwrite-ro-guides.svg\"\nimport _playwriteRo from \"./svgs/playwrite-ro.svg\"\nimport _playwriteSkGuides from \"./svgs/playwrite-sk-guides.svg\"\nimport _playwriteSk from \"./svgs/playwrite-sk.svg\"\nimport _playwriteTzGuides from \"./svgs/playwrite-tz-guides.svg\"\nimport _playwriteTz from \"./svgs/playwrite-tz.svg\"\nimport _playwriteUsModernGuides from \"./svgs/playwrite-us-modern-guides.svg\"\nimport _playwriteUsModern from \"./svgs/playwrite-us-modern.svg\"\nimport _playwriteUsTradGuides from \"./svgs/playwrite-us-trad-guides.svg\"\nimport _playwriteUsTrad from \"./svgs/playwrite-us-trad.svg\"\nimport _playwriteVnGuides from \"./svgs/playwrite-vn-guides.svg\"\nimport _playwriteVn from \"./svgs/playwrite-vn.svg\"\nimport _playwriteZaGuides from \"./svgs/playwrite-za-guides.svg\"\nimport _playwriteZa from \"./svgs/playwrite-za.svg\"\nimport _plein from \"./svgs/plein.svg\"\nimport _plusJakartaSans from \"./svgs/plus-jakarta-sans.svg\"\nimport _pochaevsk from \"./svgs/pochaevsk.svg\"\nimport _podkova from \"./svgs/podkova.svg\"\nimport _poetsenOne from \"./svgs/poetsen-one.svg\"\nimport _poiretOne from \"./svgs/poiret-one.svg\"\nimport _pollerOne from \"./svgs/poller-one.svg\"\nimport _poltawskiNowy from \"./svgs/poltawski-nowy.svg\"\nimport _poly from \"./svgs/poly.svg\"\nimport _pompiere from \"./svgs/pompiere.svg\"\nimport _ponnala from \"./svgs/ponnala.svg\"\nimport _ponomar from \"./svgs/ponomar.svg\"\nimport _pontanoSans from \"./svgs/pontano-sans.svg\"\nimport _poorStory from \"./svgs/poor-story.svg\"\nimport _poppins from \"./svgs/poppins.svg\"\nimport _portLligatSans from \"./svgs/port-lligat-sans.svg\"\nimport _portLligatSlab from \"./svgs/port-lligat-slab.svg\"\nimport _pottaOne from \"./svgs/potta-one.svg\"\nimport _pragatiNarrow from \"./svgs/pragati-narrow.svg\"\nimport _praise from \"./svgs/praise.svg\"\nimport _pramukhRounded from \"./svgs/pramukh-rounded.svg\"\nimport _prata from \"./svgs/prata.svg\"\nimport _preahvihear from \"./svgs/preahvihear.svg\"\nimport _pressStart2p from \"./svgs/press-start-2p.svg\"\nimport _pretendardVariable from \"./svgs/pretendard-variable.svg\"\nimport _pridi from \"./svgs/pridi.svg\"\nimport _princessSofia from \"./svgs/princess-sofia.svg\"\nimport _prociono from \"./svgs/prociono.svg\"\nimport _projektBlackbird from \"./svgs/projekt-blackbird.svg\"\nimport _prompt from \"./svgs/prompt.svg\"\nimport _prostoOne from \"./svgs/prosto-one.svg\"\nimport _protestGuerrilla from \"./svgs/protest-guerrilla.svg\"\nimport _protestRevolution from \"./svgs/protest-revolution.svg\"\nimport _protestRiot from \"./svgs/protest-riot.svg\"\nimport _protestStrike from \"./svgs/protest-strike.svg\"\nimport _prozaLibre from \"./svgs/proza-libre.svg\"\nimport _ptMono from \"./svgs/pt-mono.svg\"\nimport _ptSansCaption from \"./svgs/pt-sans-caption.svg\"\nimport _ptSansNarrow from \"./svgs/pt-sans-narrow.svg\"\nimport _ptSans from \"./svgs/pt-sans.svg\"\nimport _ptSerifCaption from \"./svgs/pt-serif-caption.svg\"\nimport _ptSerif from \"./svgs/pt-serif.svg\"\nimport _publicSans from \"./svgs/public-sans.svg\"\nimport _puppiesPlay from \"./svgs/puppies-play.svg\"\nimport _puritan from \"./svgs/puritan.svg\"\nimport _purplePurse from \"./svgs/purple-purse.svg\"\nimport _pushster from \"./svgs/pushster.svg\"\nimport _qahiri from \"./svgs/qahiri.svg\"\nimport _quando from \"./svgs/quando.svg\"\nimport _quantico from \"./svgs/quantico.svg\"\nimport _quarantype from \"./svgs/quarantype.svg\"\nimport _quattrocentoSans from \"./svgs/quattrocento-sans.svg\"\nimport _quattrocento from \"./svgs/quattrocento.svg\"\nimport _questrial from \"./svgs/questrial.svg\"\nimport _quicksand from \"./svgs/quicksand.svg\"\nimport _quilon from \"./svgs/quilon.svg\"\nimport _quintessential from \"./svgs/quintessential.svg\"\nimport _qwigley from \"./svgs/qwigley.svg\"\nimport _qwitcherGrypen from \"./svgs/qwitcher-grypen.svg\"\nimport _racingSansOne from \"./svgs/racing-sans-one.svg\"\nimport _radioCanadaBig from \"./svgs/radio-canada-big.svg\"\nimport _radioCanada from \"./svgs/radio-canada.svg\"\nimport _radley from \"./svgs/radley.svg\"\nimport _rag from \"./svgs/rag.svg\"\nimport _rajdhani from \"./svgs/rajdhani.svg\"\nimport _rakkas from \"./svgs/rakkas.svg\"\nimport _ralewayDots from \"./svgs/raleway-dots.svg\"\nimport _raleway from \"./svgs/raleway.svg\"\nimport _ramabhadra from \"./svgs/ramabhadra.svg\"\nimport _ramaraja from \"./svgs/ramaraja.svg\"\nimport _rambla from \"./svgs/rambla.svg\"\nimport _rammettoOne from \"./svgs/rammetto-one.svg\"\nimport _rampartOne from \"./svgs/rampart-one.svg\"\nimport _ramsina from \"./svgs/ramsina.svg\"\nimport _ranade from \"./svgs/ranade.svg\"\nimport _ranchers from \"./svgs/ranchers.svg\"\nimport _rancho from \"./svgs/rancho.svg\"\nimport _ranga from \"./svgs/ranga.svg\"\nimport _rasa from \"./svgs/rasa.svg\"\nimport _rationale from \"./svgs/rationale.svg\"\nimport _raveoVariable from \"./svgs/raveo-variable.svg\"\nimport _raviPrakash from \"./svgs/ravi-prakash.svg\"\nimport _readexPro from \"./svgs/readex-pro.svg\"\nimport _rechteck from \"./svgs/rechteck.svg\"\nimport _recia from \"./svgs/recia.svg\"\nimport _recursive from \"./svgs/recursive.svg\"\nimport _redHatDisplay from \"./svgs/red-hat-display.svg\"\nimport _redHatMono from \"./svgs/red-hat-mono.svg\"\nimport _redHatText from \"./svgs/red-hat-text.svg\"\nimport _redRose from \"./svgs/red-rose.svg\"\nimport _redactedScript from \"./svgs/redacted-script.svg\"\nimport _redacted from \"./svgs/redacted.svg\"\nimport _redditMono from \"./svgs/reddit-mono.svg\"\nimport _redditSansCondensed from \"./svgs/reddit-sans-condensed.svg\"\nimport _redditSans from \"./svgs/reddit-sans.svg\"\nimport _redressed from \"./svgs/redressed.svg\"\nimport _reemKufiFun from \"./svgs/reem-kufi-fun.svg\"\nimport _reemKufiInk from \"./svgs/reem-kufi-ink.svg\"\nimport _reemKufi from \"./svgs/reem-kufi.svg\"\nimport _reenieBeanie from \"./svgs/reenie-beanie.svg\"\nimport _reggaeOne from \"./svgs/reggae-one.svg\"\nimport _rem from \"./svgs/rem.svg\"\nimport _rena from \"./svgs/rena.svg\"\nimport _rethinkSans from \"./svgs/rethink-sans.svg\"\nimport _revalia from \"./svgs/revalia.svg\"\nimport _rhodiumLibre from \"./svgs/rhodium-libre.svg\"\nimport _ribes from \"./svgs/ribes.svg\"\nimport _ribeyeMarrow from \"./svgs/ribeye-marrow.svg\"\nimport _ribeye from \"./svgs/ribeye.svg\"\nimport _righteous from \"./svgs/righteous.svg\"\nimport _risque from \"./svgs/risque.svg\"\nimport _roadRage from \"./svgs/road-rage.svg\"\nimport _robotoCondensed from \"./svgs/roboto-condensed.svg\"\nimport _robotoFlex from \"./svgs/roboto-flex.svg\"\nimport _robotoMono from \"./svgs/roboto-mono.svg\"\nimport _robotoSerif from \"./svgs/roboto-serif.svg\"\nimport _robotoSlab from \"./svgs/roboto-slab.svg\"\nimport _roboto from \"./svgs/roboto.svg\"\nimport _rochester from \"./svgs/rochester.svg\"\nimport _rock3d from \"./svgs/rock-3d.svg\"\nimport _rockSalt from \"./svgs/rock-salt.svg\"\nimport _rocknrollOne from \"./svgs/rocknroll-one.svg\"\nimport _rokkitt from \"./svgs/rokkitt.svg\"\nimport _romanesco from \"./svgs/romanesco.svg\"\nimport _ronzino from \"./svgs/ronzino.svg\"\nimport _ropaSans from \"./svgs/ropa-sans.svg\"\nimport _rosaline from \"./svgs/rosaline.svg\"\nimport _rosario from \"./svgs/rosario.svg\"\nimport _rosarivo from \"./svgs/rosarivo.svg\"\nimport _rougeScript from \"./svgs/rouge-script.svg\"\nimport _roundo from \"./svgs/roundo.svg\"\nimport _rowan from \"./svgs/rowan.svg\"\nimport _rowdies from \"./svgs/rowdies.svg\"\nimport _rozhaOne from \"./svgs/rozha-one.svg\"\nimport _rubik80sFade from \"./svgs/rubik-80s-fade.svg\"\nimport _rubikBeastly from \"./svgs/rubik-beastly.svg\"\nimport _rubikBrokenFax from \"./svgs/rubik-broken-fax.svg\"\nimport _rubikBubbles from \"./svgs/rubik-bubbles.svg\"\nimport _rubikBurned from \"./svgs/rubik-burned.svg\"\nimport _rubikDirt from \"./svgs/rubik-dirt.svg\"\nimport _rubikDistressed from \"./svgs/rubik-distressed.svg\"\nimport _rubikDoodleShadow from \"./svgs/rubik-doodle-shadow.svg\"\nimport _rubikDoodleTriangles from \"./svgs/rubik-doodle-triangles.svg\"\nimport _rubikGemstones from \"./svgs/rubik-gemstones.svg\"\nimport _rubikGlitchPop from \"./svgs/rubik-glitch-pop.svg\"\nimport _rubikGlitch from \"./svgs/rubik-glitch.svg\"\nimport _rubikIso from \"./svgs/rubik-iso.svg\"\nimport _rubikLines from \"./svgs/rubik-lines.svg\"\nimport _rubikMaps from \"./svgs/rubik-maps.svg\"\nimport _rubikMarkerHatch from \"./svgs/rubik-marker-hatch.svg\"\nimport _rubikMaze from \"./svgs/rubik-maze.svg\"\nimport _rubikMicrobe from \"./svgs/rubik-microbe.svg\"\nimport _rubikMonoOne from \"./svgs/rubik-mono-one.svg\"\nimport _rubikMoonrocks from \"./svgs/rubik-moonrocks.svg\"\nimport _rubikPixels from \"./svgs/rubik-pixels.svg\"\nimport _rubikPuddles from \"./svgs/rubik-puddles.svg\"\nimport _rubikScribble from \"./svgs/rubik-scribble.svg\"\nimport _rubikSprayPaint from \"./svgs/rubik-spray-paint.svg\"\nimport _rubikStorm from \"./svgs/rubik-storm.svg\"\nimport _rubikVinyl from \"./svgs/rubik-vinyl.svg\"\nimport _rubikWetPaint from \"./svgs/rubik-wet-paint.svg\"\nimport _rubik from \"./svgs/rubik.svg\"\nimport _ruda from \"./svgs/ruda.svg\"\nimport _rufina from \"./svgs/rufina.svg\"\nimport _rugeBoogie from \"./svgs/ruge-boogie.svg\"\nimport _ruluko from \"./svgs/ruluko.svg\"\nimport _rumRaisin from \"./svgs/rum-raisin.svg\"\nimport _ruslanDisplay from \"./svgs/ruslan-display.svg\"\nimport _russoOne from \"./svgs/russo-one.svg\"\nimport _ruthie from \"./svgs/ruthie.svg\"\nimport _ruwudu from \"./svgs/ruwudu.svg\"\nimport _rx100 from \"./svgs/rx100.svg\"\nimport _rye from \"./svgs/rye.svg\"\nimport _sacramento from \"./svgs/sacramento.svg\"\nimport _sahitya from \"./svgs/sahitya.svg\"\nimport _sail from \"./svgs/sail.svg\"\nimport _sairaCondensed from \"./svgs/saira-condensed.svg\"\nimport _sairaExtraCondensed from \"./svgs/saira-extra-condensed.svg\"\nimport _sairaSemiCondensed from \"./svgs/saira-semi-condensed.svg\"\nimport _sairaStencilOne from \"./svgs/saira-stencil-one.svg\"\nimport _sairaStencil from \"./svgs/saira-stencil.svg\"\nimport _saira from \"./svgs/saira.svg\"\nimport _salsa from \"./svgs/salsa.svg\"\nimport _sanchez from \"./svgs/sanchez.svg\"\nimport _sancreek from \"./svgs/sancreek.svg\"\nimport _sankofaDisplay from \"./svgs/sankofa-display.svg\"\nimport _sansation from \"./svgs/sansation.svg\"\nimport _sansitaSwashed from \"./svgs/sansita-swashed.svg\"\nimport _sansita from \"./svgs/sansita.svg\"\nimport _sarabun from \"./svgs/sarabun.svg\"\nimport _sarala from \"./svgs/sarala.svg\"\nimport _sarina from \"./svgs/sarina.svg\"\nimport _sarpanch from \"./svgs/sarpanch.svg\"\nimport _sassyFrass from \"./svgs/sassy-frass.svg\"\nimport _satisfy from \"./svgs/satisfy.svg\"\nimport _satoshi from \"./svgs/satoshi.svg\"\nimport _savate from \"./svgs/savate.svg\"\nimport _sawarabiGothic from \"./svgs/sawarabi-gothic.svg\"\nimport _sawarabiMincho from \"./svgs/sawarabi-mincho.svg\"\nimport _scada from \"./svgs/scada.svg\"\nimport _scheherazadeNew from \"./svgs/scheherazade-new.svg\"\nimport _schibstedGrotesk from \"./svgs/schibsted-grotesk.svg\"\nimport _schoolbell from \"./svgs/schoolbell.svg\"\nimport _schrofferMono from \"./svgs/schroffer-mono.svg\"\nimport _scienceGothic from \"./svgs/science-gothic.svg\"\nimport _scopeOne from \"./svgs/scope-one.svg\"\nimport _seaweedScript from \"./svgs/seaweed-script.svg\"\nimport _secularOne from \"./svgs/secular-one.svg\"\nimport _sedanSc from \"./svgs/sedan-sc.svg\"\nimport _sedan from \"./svgs/sedan.svg\"\nimport _sedgwickAveDisplay from \"./svgs/sedgwick-ave-display.svg\"\nimport _sedgwickAve from \"./svgs/sedgwick-ave.svg\"\nimport _segment from \"./svgs/segment.svg\"\nimport _sekuya from \"./svgs/sekuya.svg\"\nimport _sen from \"./svgs/sen.svg\"\nimport _sendFlowers from \"./svgs/send-flowers.svg\"\nimport _sentient from \"./svgs/sentient.svg\"\nimport _serverMono from \"./svgs/server-mono.svg\"\nimport _sevillana from \"./svgs/sevillana.svg\"\nimport _seymourOne from \"./svgs/seymour-one.svg\"\nimport _shadowsIntoLightTwo from \"./svgs/shadows-into-light-two.svg\"\nimport _shadowsIntoLight from \"./svgs/shadows-into-light.svg\"\nimport _shafarik from \"./svgs/shafarik.svg\"\nimport _shalimar from \"./svgs/shalimar.svg\"\nimport _shantellSans from \"./svgs/shantell-sans.svg\"\nimport _shanti from \"./svgs/shanti.svg\"\nimport _shareTechMono from \"./svgs/share-tech-mono.svg\"\nimport _shareTech from \"./svgs/share-tech.svg\"\nimport _share from \"./svgs/share.svg\"\nimport _sharpie from \"./svgs/sharpie.svg\"\nimport _shipporiAntiqueB1 from \"./svgs/shippori-antique-b1.svg\"\nimport _shipporiAntique from \"./svgs/shippori-antique.svg\"\nimport _shipporiMinchoB1 from \"./svgs/shippori-mincho-b1.svg\"\nimport _shipporiMincho from \"./svgs/shippori-mincho.svg\"\nimport _shizuru from \"./svgs/shizuru.svg\"\nimport _shojumaru from \"./svgs/shojumaru.svg\"\nimport _shortStack from \"./svgs/short-stack.svg\"\nimport _shrikhand from \"./svgs/shrikhand.svg\"\nimport _sideAInflated from \"./svgs/side-a-inflated.svg\"\nimport _sigmarOne from \"./svgs/sigmar-one.svg\"\nimport _sigmar from \"./svgs/sigmar.svg\"\nimport _signikaNegative from \"./svgs/signika-negative.svg\"\nimport _signika from \"./svgs/signika.svg\"\nimport _silkscreen from \"./svgs/silkscreen.svg\"\nimport _simonetta from \"./svgs/simonetta.svg\"\nimport _singleDay from \"./svgs/single-day.svg\"\nimport _sinistre from \"./svgs/sinistre.svg\"\nimport _sintony from \"./svgs/sintony.svg\"\nimport _sirinStencil from \"./svgs/sirin-stencil.svg\"\nimport _sirivennela from \"./svgs/sirivennela.svg\"\nimport _sixCaps from \"./svgs/six-caps.svg\"\nimport _sixtyfourConvergence from \"./svgs/sixtyfour-convergence.svg\"\nimport _sixtyfour from \"./svgs/sixtyfour.svg\"\nimport _skranji from \"./svgs/skranji.svg\"\nimport _slabo13px from \"./svgs/slabo-13px.svg\"\nimport _slabo27px from \"./svgs/slabo-27px.svg\"\nimport _slackey from \"./svgs/slackey.svg\"\nimport _slacksideOne from \"./svgs/slackside-one.svg\"\nimport _smokum from \"./svgs/smokum.svg\"\nimport _smoochSans from \"./svgs/smooch-sans.svg\"\nimport _smooch from \"./svgs/smooch.svg\"\nimport _smythe from \"./svgs/smythe.svg\"\nimport _snPro from \"./svgs/sn-pro.svg\"\nimport _sneaky from \"./svgs/sneaky.svg\"\nimport _sniglet from \"./svgs/sniglet.svg\"\nimport _snippet from \"./svgs/snippet.svg\"\nimport _snowburstOne from \"./svgs/snowburst-one.svg\"\nimport _sofadiOne from \"./svgs/sofadi-one.svg\"\nimport _sofiaSansCondensed from \"./svgs/sofia-sans-condensed.svg\"\nimport _sofiaSansExtraCondensed from \"./svgs/sofia-sans-extra-condensed.svg\"\nimport _sofiaSansSemiCondensed from \"./svgs/sofia-sans-semi-condensed.svg\"\nimport _sofiaSans from \"./svgs/sofia-sans.svg\"\nimport _sofia from \"./svgs/sofia.svg\"\nimport _solitreo from \"./svgs/solitreo.svg\"\nimport _solway from \"./svgs/solway.svg\"\nimport _sometypeMono from \"./svgs/sometype-mono.svg\"\nimport _songMyung from \"./svgs/song-myung.svg\"\nimport _sono from \"./svgs/sono.svg\"\nimport _sonsieOne from \"./svgs/sonsie-one.svg\"\nimport _sora from \"./svgs/sora.svg\"\nimport _soria from \"./svgs/soria.svg\"\nimport _sortsMillGoudy from \"./svgs/sorts-mill-goudy.svg\"\nimport _sourGummy from \"./svgs/sour-gummy.svg\"\nimport _sourceCodePro from \"./svgs/source-code-pro.svg\"\nimport _sourceSans3 from \"./svgs/source-sans-3.svg\"\nimport _sourceSansPro from \"./svgs/source-sans-pro.svg\"\nimport _sourceSerif4 from \"./svgs/source-serif-4.svg\"\nimport _sourceSerifPro from \"./svgs/source-serif-pro.svg\"\nimport _spaceGrotesk from \"./svgs/space-grotesk.svg\"\nimport _spaceMono from \"./svgs/space-mono.svg\"\nimport _specialElite from \"./svgs/special-elite.svg\"\nimport _specialGothicCondensedOne from \"./svgs/special-gothic-condensed-one.svg\"\nimport _specialGothicExpandedOne from \"./svgs/special-gothic-expanded-one.svg\"\nimport _specialGothic from \"./svgs/special-gothic.svg\"\nimport _spectralSc from \"./svgs/spectral-sc.svg\"\nimport _spectral from \"./svgs/spectral.svg\"\nimport _spicyRice from \"./svgs/spicy-rice.svg\"\nimport _spinnaker from \"./svgs/spinnaker.svg\"\nimport _spirax from \"./svgs/spirax.svg\"\nimport _splash from \"./svgs/splash.svg\"\nimport _splineSansMono from \"./svgs/spline-sans-mono.svg\"\nimport _splineSans from \"./svgs/spline-sans.svg\"\nimport _sprat from \"./svgs/sprat.svg\"\nimport _squadaOne from \"./svgs/squada-one.svg\"\nimport _squarePeg from \"./svgs/square-peg.svg\"\nimport _sreeKrushnadevaraya from \"./svgs/sree-krushnadevaraya.svg\"\nimport _sriracha from \"./svgs/sriracha.svg\"\nimport _srisakdi from \"./svgs/srisakdi.svg\"\nimport _stMartin from \"./svgs/st-martin.svg\"\nimport _staatliches from \"./svgs/staatliches.svg\"\nimport _stackSansHeadline from \"./svgs/stack-sans-headline.svg\"\nimport _stackSansNotch from \"./svgs/stack-sans-notch.svg\"\nimport _stackSansText from \"./svgs/stack-sans-text.svg\"\nimport _stalemate from \"./svgs/stalemate.svg\"\nimport _stalinistOne from \"./svgs/stalinist-one.svg\"\nimport _stardom from \"./svgs/stardom.svg\"\nimport _stardosStencil from \"./svgs/stardos-stencil.svg\"\nimport _stickNoBills from \"./svgs/stick-no-bills.svg\"\nimport _stick from \"./svgs/stick.svg\"\nimport _stintUltraCondensed from \"./svgs/stint-ultra-condensed.svg\"\nimport _stintUltraExpanded from \"./svgs/stint-ultra-expanded.svg\"\nimport _stixTwoMath from \"./svgs/stix-two-math.svg\"\nimport _stixTwoText from \"./svgs/stix-two-text.svg\"\nimport _stoke from \"./svgs/stoke.svg\"\nimport _storyScript from \"./svgs/story-script.svg\"\nimport _strait from \"./svgs/strait.svg\"\nimport _strichpunktSans from \"./svgs/strichpunkt-sans.svg\"\nimport _striper from \"./svgs/striper.svg\"\nimport _styleScript from \"./svgs/style-script.svg\"\nimport _stylish from \"./svgs/stylish.svg\"\nimport _styro from \"./svgs/styro.svg\"\nimport _sueEllenFrancisco from \"./svgs/sue-ellen-francisco.svg\"\nimport _suezOne from \"./svgs/suez-one.svg\"\nimport _sulphurPoint from \"./svgs/sulphur-point.svg\"\nimport _sumana from \"./svgs/sumana.svg\"\nimport _sunflower from \"./svgs/sunflower.svg\"\nimport _sunshiney from \"./svgs/sunshiney.svg\"\nimport _supermercadoOne from \"./svgs/supermercado-one.svg\"\nimport _supreme from \"./svgs/supreme.svg\"\nimport _sura from \"./svgs/sura.svg\"\nimport _suranna from \"./svgs/suranna.svg\"\nimport _suravaram from \"./svgs/suravaram.svg\"\nimport _suseMono from \"./svgs/suse-mono.svg\"\nimport _suse from \"./svgs/suse.svg\"\nimport _suwannaphum from \"./svgs/suwannaphum.svg\"\nimport _swankyAndMooMoo from \"./svgs/swanky-and-moo-moo.svg\"\nimport _switzer from \"./svgs/switzer.svg\"\nimport _syncopate from \"./svgs/syncopate.svg\"\nimport _syneMono from \"./svgs/syne-mono.svg\"\nimport _syneTactile from \"./svgs/syne-tactile.svg\"\nimport _syne from \"./svgs/syne.svg\"\nimport _synonym from \"./svgs/synonym.svg\"\nimport _tabular from \"./svgs/tabular.svg\"\nimport _tacOne from \"./svgs/tac-one.svg\"\nimport _tachyo from \"./svgs/tachyo.svg\"\nimport _tagesschrift from \"./svgs/tagesschrift.svg\"\nimport _taiHeritagePro from \"./svgs/tai-heritage-pro.svg\"\nimport _tajawal from \"./svgs/tajawal.svg\"\nimport _tangerine from \"./svgs/tangerine.svg\"\nimport _tanker from \"./svgs/tanker.svg\"\nimport _tanklager from \"./svgs/tanklager.svg\"\nimport _tapestry from \"./svgs/tapestry.svg\"\nimport _taprom from \"./svgs/taprom.svg\"\nimport _tasaExplorerVf from \"./svgs/tasa-explorer-vf.svg\"\nimport _tasaExplorer from \"./svgs/tasa-explorer.svg\"\nimport _tasaOrbiterVf from \"./svgs/tasa-orbiter-vf.svg\"\nimport _tasaOrbiter from \"./svgs/tasa-orbiter.svg\"\nimport _tauri from \"./svgs/tauri.svg\"\nimport _taviraj from \"./svgs/taviraj.svg\"\nimport _teachers from \"./svgs/teachers.svg\"\nimport _technor from \"./svgs/technor.svg\"\nimport _tecnica from \"./svgs/tecnica.svg\"\nimport _teko from \"./svgs/teko.svg\"\nimport _tektur from \"./svgs/tektur.svg\"\nimport _telex from \"./svgs/telex.svg\"\nimport _telma from \"./svgs/telma.svg\"\nimport _tenaliRamakrishna from \"./svgs/tenali-ramakrishna.svg\"\nimport _tenorSans from \"./svgs/tenor-sans.svg\"\nimport _terminalGrotesque from \"./svgs/terminal-grotesque.svg\"\nimport _textMeOne from \"./svgs/text-me-one.svg\"\nimport _texturina from \"./svgs/texturina.svg\"\nimport _thasadith from \"./svgs/thasadith.svg\"\nimport _theGirlNextDoor from \"./svgs/the-girl-next-door.svg\"\nimport _theNautigal from \"./svgs/the-nautigal.svg\"\nimport _thestralNeue from \"./svgs/thestral-neue.svg\"\nimport _tienne from \"./svgs/tienne.svg\"\nimport _tiktokSans from \"./svgs/tiktok-sans.svg\"\nimport _tillana from \"./svgs/tillana.svg\"\nimport _tiltNeon from \"./svgs/tilt-neon.svg\"\nimport _tiltPrism from \"./svgs/tilt-prism.svg\"\nimport _tiltWarp from \"./svgs/tilt-warp.svg\"\nimport _timmana from \"./svgs/timmana.svg\"\nimport _tinos from \"./svgs/tinos.svg\"\nimport _tiny5 from \"./svgs/tiny5.svg\"\nimport _tiroBangla from \"./svgs/tiro-bangla.svg\"\nimport _tiroDevanagariHindi from \"./svgs/tiro-devanagari-hindi.svg\"\nimport _tiroDevanagariMarathi from \"./svgs/tiro-devanagari-marathi.svg\"\nimport _tiroDevanagariSanskrit from \"./svgs/tiro-devanagari-sanskrit.svg\"\nimport _tiroGurmukhi from \"./svgs/tiro-gurmukhi.svg\"\nimport _tiroKannada from \"./svgs/tiro-kannada.svg\"\nimport _tiroTamil from \"./svgs/tiro-tamil.svg\"\nimport _tiroTelugu from \"./svgs/tiro-telugu.svg\"\nimport _tirra from \"./svgs/tirra.svg\"\nimport _titanOne from \"./svgs/titan-one.svg\"\nimport _titilliumWeb from \"./svgs/titillium-web.svg\"\nimport _tmtLimkinPixel from \"./svgs/tmt-limkin-pixel.svg\"\nimport _tmtLimkin from \"./svgs/tmt-limkin.svg\"\nimport _tmtMiniMochi from \"./svgs/tmt-mini-mochi.svg\"\nimport _tmtPaint from \"./svgs/tmt-paint.svg\"\nimport _tomorrow from \"./svgs/tomorrow.svg\"\nimport _tourney from \"./svgs/tourney.svg\"\nimport _tradeWinds from \"./svgs/trade-winds.svg\"\nimport _trainOne from \"./svgs/train-one.svg\"\nimport _trancheType from \"./svgs/tranche-type.svg\"\nimport _transomHoog from \"./svgs/transom-hoog.svg\"\nimport _trenchSlab from \"./svgs/trench-slab.svg\"\nimport _triodion from \"./svgs/triodion.svg\"\nimport _trirong from \"./svgs/trirong.svg\"\nimport _trispace from \"./svgs/trispace.svg\"\nimport _trocchi from \"./svgs/trocchi.svg\"\nimport _trochut from \"./svgs/trochut.svg\"\nimport _truculenta from \"./svgs/truculenta.svg\"\nimport _trykker from \"./svgs/trykker.svg\"\nimport _tsukimiRounded from \"./svgs/tsukimi-rounded.svg\"\nimport _tuffy from \"./svgs/tuffy.svg\"\nimport _tulpenOne from \"./svgs/tulpen-one.svg\"\nimport _turretRoad from \"./svgs/turret-road.svg\"\nimport _twinkleStar from \"./svgs/twinkle-star.svg\"\nimport _ubuntuCondensed from \"./svgs/ubuntu-condensed.svg\"\nimport _ubuntuMono from \"./svgs/ubuntu-mono.svg\"\nimport _ubuntuSansMono from \"./svgs/ubuntu-sans-mono.svg\"\nimport _ubuntuSans from \"./svgs/ubuntu-sans.svg\"\nimport _ubuntu from \"./svgs/ubuntu.svg\"\nimport _uchen from \"./svgs/uchen.svg\"\nimport _ufo from \"./svgs/ufo.svg\"\nimport _ultra from \"./svgs/ultra.svg\"\nimport _unbounded from \"./svgs/unbounded.svg\"\nimport _uncialAntiqua from \"./svgs/uncial-antiqua.svg\"\nimport _uncutSansVariable from \"./svgs/uncut-sans-variable.svg\"\nimport _undefined from \"./svgs/undefined.svg\"\nimport _underdog from \"./svgs/underdog.svg\"\nimport _unicaOne from \"./svgs/unica-one.svg\"\nimport _unifrakturcook from \"./svgs/unifrakturcook.svg\"\nimport _unifrakturmaguntia from \"./svgs/unifrakturmaguntia.svg\"\nimport _unkempt from \"./svgs/unkempt.svg\"\nimport _unlock from \"./svgs/unlock.svg\"\nimport _unna from \"./svgs/unna.svg\"\nimport _uoqmunthenkhung from \"./svgs/uoqmunthenkhung.svg\"\nimport _updock from \"./svgs/updock.svg\"\nimport _urbanist from \"./svgs/urbanist.svg\"\nimport _urlaubGrotesk from \"./svgs/urlaub-grotesk.svg\"\nimport _utara from \"./svgs/utara.svg\"\nimport _vampiroOne from \"./svgs/vampiro-one.svg\"\nimport _varelaRound from \"./svgs/varela-round.svg\"\nimport _varela from \"./svgs/varela.svg\"\nimport _varta from \"./svgs/varta.svg\"\nimport _vastShadow from \"./svgs/vast-shadow.svg\"\nimport _vazirmatn from \"./svgs/vazirmatn.svg\"\nimport _vendSans from \"./svgs/vend-sans.svg\"\nimport _vesperLibre from \"./svgs/vesper-libre.svg\"\nimport _viaodaLibre from \"./svgs/viaoda-libre.svg\"\nimport _vibes from \"./svgs/vibes.svg\"\nimport _vibur from \"./svgs/vibur.svg\"\nimport _victorMono from \"./svgs/victor-mono.svg\"\nimport _vidaloka from \"./svgs/vidaloka.svg\"\nimport _viga from \"./svgs/viga.svg\"\nimport _vinaSans from \"./svgs/vina-sans.svg\"\nimport _voces from \"./svgs/voces.svg\"\nimport _volkhov from \"./svgs/volkhov.svg\"\nimport _vollkornSc from \"./svgs/vollkorn-sc.svg\"\nimport _vollkorn from \"./svgs/vollkorn.svg\"\nimport _voltaire from \"./svgs/voltaire.svg\"\nimport _voyager from \"./svgs/voyager.svg\"\nimport _vt323 from \"./svgs/vt323.svg\"\nimport _vujahdayScript from \"./svgs/vujahday-script.svg\"\nimport _waitingForTheSunrise from \"./svgs/waiting-for-the-sunrise.svg\"\nimport _wallpoet from \"./svgs/wallpoet.svg\"\nimport _walterTurncoat from \"./svgs/walter-turncoat.svg\"\nimport _warnes from \"./svgs/warnes.svg\"\nimport _waterBrush from \"./svgs/water-brush.svg\"\nimport _waterfall from \"./svgs/waterfall.svg\"\nimport _wavetosh from \"./svgs/wavetosh.svg\"\nimport _wdxlLubrifontJpN from \"./svgs/wdxl-lubrifont-jp-n.svg\"\nimport _wdxlLubrifontSc from \"./svgs/wdxl-lubrifont-sc.svg\"\nimport _wdxlLubrifontTc from \"./svgs/wdxl-lubrifont-tc.svg\"\nimport _wellfleet from \"./svgs/wellfleet.svg\"\nimport _wendyOne from \"./svgs/wendy-one.svg\"\nimport _whisper from \"./svgs/whisper.svg\"\nimport _windsong from \"./svgs/windsong.svg\"\nimport _winkyRough from \"./svgs/winky-rough.svg\"\nimport _winkySans from \"./svgs/winky-sans.svg\"\nimport _wireOne from \"./svgs/wire-one.svg\"\nimport _wittgenstein from \"./svgs/wittgenstein.svg\"\nimport _wixMadeforDisplay from \"./svgs/wix-madefor-display.svg\"\nimport _wixMadeforText from \"./svgs/wix-madefor-text.svg\"\nimport _workSans from \"./svgs/work-sans.svg\"\nimport _workbench from \"./svgs/workbench.svg\"\nimport _writer from \"./svgs/writer.svg\"\nimport _xanhMono from \"./svgs/xanh-mono.svg\"\nimport _xxLibert\u00E9 from \"./svgs/xx-libert\u00E9.svg\"\nimport _xxStardust from \"./svgs/xx-stardust.svg\"\nimport _yaldevi from \"./svgs/yaldevi.svg\"\nimport _yanoneKaffeesatz from \"./svgs/yanone-kaffeesatz.svg\"\nimport _yantramanav from \"./svgs/yantramanav.svg\"\nimport _yarndings12Charted from \"./svgs/yarndings-12-charted.svg\"\nimport _yarndings12 from \"./svgs/yarndings-12.svg\"\nimport _yarndings20Charted from \"./svgs/yarndings-20-charted.svg\"\nimport _yarndings20 from \"./svgs/yarndings-20.svg\"\nimport _yatraOne from \"./svgs/yatra-one.svg\"\nimport _yellowtail from \"./svgs/yellowtail.svg\"\nimport _yeonSung from \"./svgs/yeon-sung.svg\"\nimport _yesevaOne from \"./svgs/yeseva-one.svg\"\nimport _yesteryear from \"./svgs/yesteryear.svg\"\nimport _yomogi from \"./svgs/yomogi.svg\"\nimport _youngSerif from \"./svgs/young-serif.svg\"\nimport _yrsa from \"./svgs/yrsa.svg\"\nimport _ysabeauInfant from \"./svgs/ysabeau-infant.svg\"\nimport _ysabeauOffice from \"./svgs/ysabeau-office.svg\"\nimport _ysabeauSc from \"./svgs/ysabeau-sc.svg\"\nimport _ysabeau from \"./svgs/ysabeau.svg\"\nimport _yujiBoku from \"./svgs/yuji-boku.svg\"\nimport _yujiHentaiganaAkari from \"./svgs/yuji-hentaigana-akari.svg\"\nimport _yujiHentaiganaAkebono from \"./svgs/yuji-hentaigana-akebono.svg\"\nimport _yujiMai from \"./svgs/yuji-mai.svg\"\nimport _yujiSyuku from \"./svgs/yuji-syuku.svg\"\nimport _yunga from \"./svgs/yunga.svg\"\nimport _yuseiMagic from \"./svgs/yusei-magic.svg\"\nimport _zain from \"./svgs/zain.svg\"\nimport _zalandoSansExpanded from \"./svgs/zalando-sans-expanded.svg\"\nimport _zalandoSansSemiexpanded from \"./svgs/zalando-sans-semiexpanded.svg\"\nimport _zalandoSans from \"./svgs/zalando-sans.svg\"\nimport _zcoolKuaile from \"./svgs/zcool-kuaile.svg\"\nimport _zcoolQingkeHuangyou from \"./svgs/zcool-qingke-huangyou.svg\"\nimport _zcoolXiaowei from \"./svgs/zcool-xiaowei.svg\"\nimport _zenAntiqueSoft from \"./svgs/zen-antique-soft.svg\"\nimport _zenAntique from \"./svgs/zen-antique.svg\"\nimport _zenDots from \"./svgs/zen-dots.svg\"\nimport _zenKakuGothicAntique from \"./svgs/zen-kaku-gothic-antique.svg\"\nimport _zenKakuGothicNew from \"./svgs/zen-kaku-gothic-new.svg\"\nimport _zenKurenaido from \"./svgs/zen-kurenaido.svg\"\nimport _zenLoop from \"./svgs/zen-loop.svg\"\nimport _zenMaruGothic from \"./svgs/zen-maru-gothic.svg\"\nimport _zenOldMincho from \"./svgs/zen-old-mincho.svg\"\nimport _zenTokyoZoo from \"./svgs/zen-tokyo-zoo.svg\"\nimport _zeyada from \"./svgs/zeyada.svg\"\nimport _zhiMangXing from \"./svgs/zhi-mang-xing.svg\"\nimport _zillaSlabHighlight from \"./svgs/zilla-slab-highlight.svg\"\nimport _zillaSlab from \"./svgs/zilla-slab.svg\"\nimport _zina from \"./svgs/zina.svg\"\nimport _zodiak from \"./svgs/zodiak.svg\"\n\nexport const previews = {\n\t\"42dot-sans\": _42dotSans,\n\tabeezee: _abeezee,\n\tabel: _abel,\n\t\"abhaya-libre\": _abhayaLibre,\n\taboreto: _aboreto,\n\t\"abril-fatface\": _abrilFatface,\n\tabsans: _absans,\n\t\"abyssinica-sil\": _abyssinicaSil,\n\taclonica: _aclonica,\n\tacme: _acme,\n\tactor: _actor,\n\tadamina: _adamina,\n\t\"adlam-display\": _adlamDisplay,\n\t\"advent-pro\": _adventPro,\n\t\"afacad-flux\": _afacadFlux,\n\tafacad: _afacad,\n\taffigere: _affigere,\n\tagbalumo: _agbalumo,\n\tagdasima: _agdasima,\n\t\"agu-display\": _aguDisplay,\n\t\"aguafina-script\": _aguafinaScript,\n\taileron: _aileron,\n\takatab: _akatab,\n\t\"akaya-kanadaka\": _akayaKanadaka,\n\t\"akaya-telivigala\": _akayaTelivigala,\n\takronim: _akronim,\n\takshar: _akshar,\n\takt: _akt,\n\taktura: _aktura,\n\taladin: _aladin,\n\t\"alan-sans\": _alanSans,\n\talata: _alata,\n\talatsi: _alatsi,\n\t\"albert-sans\": _albertSans,\n\taldrich: _aldrich,\n\talef: _alef,\n\t\"alegreya-sans-sc\": _alegreyaSansSc,\n\t\"alegreya-sans\": _alegreyaSans,\n\t\"alegreya-sc\": _alegreyaSc,\n\talegreya: _alegreya,\n\taleo: _aleo,\n\t\"alex-brush\": _alexBrush,\n\talexandria: _alexandria,\n\t\"alfa-slab-one\": _alfaSlabOne,\n\talice: _alice,\n\t\"alike-angular\": _alikeAngular,\n\talike: _alike,\n\talkalami: _alkalami,\n\talkatra: _alkatra,\n\tallan: _allan,\n\t\"allerta-stencil\": _allertaStencil,\n\tallerta: _allerta,\n\tallison: _allison,\n\tallkin: _allkin,\n\tallura: _allura,\n\talmarai: _almarai,\n\t\"almendra-display\": _almendraDisplay,\n\t\"almendra-sc\": _almendraSc,\n\talmendra: _almendra,\n\t\"alpha-lyrae\": _alphaLyrae,\n\talpino: _alpino,\n\t\"alumni-sans-collegiate-one\": _alumniSansCollegiateOne,\n\t\"alumni-sans-inline-one\": _alumniSansInlineOne,\n\t\"alumni-sans-pinstripe\": _alumniSansPinstripe,\n\t\"alumni-sans-sc\": _alumniSansSc,\n\t\"alumni-sans\": _alumniSans,\n\talyamama: _alyamama,\n\tamarante: _amarante,\n\tamaranth: _amaranth,\n\tamarna: _amarna,\n\t\"amatic-sc\": _amaticSc,\n\tamericaine: _americaine,\n\tamethysta: _amethysta,\n\tamiamie: _amiamie,\n\tamiko: _amiko,\n\t\"amiri-quran\": _amiriQuran,\n\tamiri: _amiri,\n\tamita: _amita,\n\tamulya: _amulya,\n\tanaheim: _anaheim,\n\t\"ancizar-sans\": _ancizarSans,\n\t\"ancizar-serif\": _ancizarSerif,\n\t\"andada-pro\": _andadaPro,\n\tandika: _andika,\n\t\"anek-bangla\": _anekBangla,\n\t\"anek-devanagari\": _anekDevanagari,\n\t\"anek-gujarati\": _anekGujarati,\n\t\"anek-gurmukhi\": _anekGurmukhi,\n\t\"anek-kannada\": _anekKannada,\n\t\"anek-latin\": _anekLatin,\n\t\"anek-malayalam\": _anekMalayalam,\n\t\"anek-odia\": _anekOdia,\n\t\"anek-tamil\": _anekTamil,\n\t\"anek-telugu\": _anekTelugu,\n\tangkor: _angkor,\n\t\"annapurna-sil\": _annapurnaSil,\n\t\"annie-use-your-telescope\": _annieUseYourTelescope,\n\t\"anonymous-pro\": _anonymousPro,\n\tanta: _anta,\n\t\"antic-didone\": _anticDidone,\n\t\"antic-slab\": _anticSlab,\n\tantic: _antic,\n\t\"anton-sc\": _antonSc,\n\tanton: _anton,\n\tantonio: _antonio,\n\tanuphan: _anuphan,\n\tanybody: _anybody,\n\t\"aoboshi-one\": _aoboshiOne,\n\t\"apfel-grotezk\": _apfelGrotezk,\n\t\"ar-one-sans\": _arOneSans,\n\tarapey: _arapey,\n\t\"arbutus-slab\": _arbutusSlab,\n\tarbutus: _arbutus,\n\tarcane: _arcane,\n\t\"architects-daughter\": _architectsDaughter,\n\t\"archivo-black\": _archivoBlack,\n\t\"archivo-narrow\": _archivoNarrow,\n\tarchivo: _archivo,\n\t\"are-you-serious\": _areYouSerious,\n\t\"aref-ruqaa-ink\": _arefRuqaaInk,\n\t\"aref-ruqaa\": _arefRuqaa,\n\t\"arima-madurai\": _arimaMadurai,\n\tarima: _arima,\n\tarimo: _arimo,\n\tarizonia: _arizonia,\n\t\"ark-es\": _arkEs,\n\tarmata: _armata,\n\tarray: _array,\n\t\"arsenal-sc\": _arsenalSc,\n\tarsenal: _arsenal,\n\tartifika: _artifika,\n\tarvo: _arvo,\n\tarya: _arya,\n\t\"asap-condensed\": _asapCondensed,\n\tasap: _asap,\n\tasar: _asar,\n\tasimovian: _asimovian,\n\t\"aspekta-variable\": _aspektaVariable,\n\tasset: _asset,\n\tassistant: _assistant,\n\t\"asta-sans\": _astaSans,\n\tastloch: _astloch,\n\tasul: _asul,\n\tathiti: _athiti,\n\t\"atkinson-hyperlegible-mono\": _atkinsonHyperlegibleMono,\n\t\"atkinson-hyperlegible-next\": _atkinsonHyperlegibleNext,\n\t\"atkinson-hyperlegible\": _atkinsonHyperlegible,\n\tatma: _atma,\n\t\"atomic-age\": _atomicAge,\n\taubrey: _aubrey,\n\t\"audio-junglism\": _audioJunglism,\n\taudiowide: _audiowide,\n\taujournuit: _aujournuit,\n\tauthor: _author,\n\t\"autour-one\": _autourOne,\n\t\"average-sans\": _averageSans,\n\taverage: _average,\n\t\"averia-gruesa-libre\": _averiaGruesaLibre,\n\t\"averia-libre\": _averiaLibre,\n\t\"averia-sans-libre\": _averiaSansLibre,\n\t\"averia-serif-libre\": _averiaSerifLibre,\n\t\"azeret-mono\": _azeretMono,\n\t\"b612-mono\": _b612Mono,\n\tb612: _b612,\n\tbabylonica: _babylonica,\n\t\"bacasime-antique\": _bacasimeAntique,\n\t\"bad-script\": _badScript,\n\t\"badeen-display\": _badeenDisplay,\n\t\"bagel-fat-one\": _bagelFatOne,\n\tbagnard: _bagnard,\n\tbahiana: _bahiana,\n\tbahianita: _bahianita,\n\t\"bai-jamjuree\": _baiJamjuree,\n\t\"bakbak-one\": _bakbakOne,\n\tballet: _ballet,\n\t\"baloo-2\": _baloo2,\n\t\"baloo-bhai-2\": _balooBhai2,\n\t\"baloo-bhaijaan-2\": _balooBhaijaan2,\n\t\"baloo-bhaina-2\": _balooBhaina2,\n\t\"baloo-chettan-2\": _balooChettan2,\n\t\"baloo-da-2\": _balooDa2,\n\t\"baloo-paaji-2\": _balooPaaji2,\n\t\"baloo-tamma-2\": _balooTamma2,\n\t\"baloo-tammudu-2\": _balooTammudu2,\n\t\"baloo-thambi-2\": _balooThambi2,\n\t\"balsamiq-sans\": _balsamiqSans,\n\tbalthazar: _balthazar,\n\tbangers: _bangers,\n\t\"bankara-grotesk\": _bankaraGrotesk,\n\t\"barlow-condensed\": _barlowCondensed,\n\t\"barlow-semi-condensed\": _barlowSemiCondensed,\n\tbarlow: _barlow,\n\tbarlowfold: _barlowfold,\n\tbarriecito: _barriecito,\n\tbarrio: _barrio,\n\t\"basement-grotesque\": _basementGrotesque,\n\tbasic: _basic,\n\t\"baskervville-sc\": _baskervvilleSc,\n\tbaskervville: _baskervville,\n\tbattambang: _battambang,\n\tbaumans: _baumans,\n\tbayon: _bayon,\n\t\"bbb-karrik\": _bbbKarrik,\n\t\"bbh-bartle\": _bbhBartle,\n\t\"bbh-bogle\": _bbhBogle,\n\t\"bbh-hegarty\": _bbhHegarty,\n\t\"bbh-sans-bartle\": _bbhSansBartle,\n\t\"bbh-sans-bogle\": _bbhSansBogle,\n\t\"bbh-sans-hegarty\": _bbhSansHegarty,\n\t\"bdo-grotesk\": _bdoGrotesk,\n\t\"be-vietnam-pro\": _beVietnamPro,\n\tbeast: _beast,\n\t\"beau-rivage\": _beauRivage,\n\t\"bebas-neue\": _bebasNeue,\n\tbeiruti: _beiruti,\n\tbelanosima: _belanosima,\n\tbelgrano: _belgrano,\n\tbellefair: _bellefair,\n\tbelleza: _belleza,\n\t\"bellota-text\": _bellotaText,\n\tbellota: _bellota,\n\tbenchnine: _benchnine,\n\tbenne: _benne,\n\tbentham: _bentham,\n\t\"berkshire-swash\": _berkshireSwash,\n\t\"berzulis-pizius\": _berzulisPizius,\n\tbesley: _besley,\n\t\"bespoke-sans\": _bespokeSans,\n\t\"bespoke-serif\": _bespokeSerif,\n\t\"bespoke-slab\": _bespokeSlab,\n\t\"bespoke-stencil\": _bespokeStencil,\n\t\"betania-patmos-gdl\": _betaniaPatmosGdl,\n\t\"betania-patmos-in-gdl\": _betaniaPatmosInGdl,\n\t\"betania-patmos-in\": _betaniaPatmosIn,\n\t\"betania-patmos\": _betaniaPatmos,\n\t\"beth-ellen\": _bethEllen,\n\tbevan: _bevan,\n\tbevellier: _bevellier,\n\t\"bhutuka-expanded-one\": _bhutukaExpandedOne,\n\tbianzhidai: _bianzhidai,\n\t\"big-shoulders-display\": _bigShouldersDisplay,\n\t\"big-shoulders-inline-display\": _bigShouldersInlineDisplay,\n\t\"big-shoulders-inline-text\": _bigShouldersInlineText,\n\t\"big-shoulders-inline\": _bigShouldersInline,\n\t\"big-shoulders-stencil-display\": _bigShouldersStencilDisplay,\n\t\"big-shoulders-stencil-text\": _bigShouldersStencilText,\n\t\"big-shoulders-stencil\": _bigShouldersStencil,\n\t\"big-shoulders-text\": _bigShouldersText,\n\t\"big-shoulders\": _bigShoulders,\n\t\"bigelow-rules\": _bigelowRules,\n\t\"bigshot-one\": _bigshotOne,\n\t\"bilbo-swash-caps\": _bilboSwashCaps,\n\tbilbo: _bilbo,\n\t\"biorhyme-expanded\": _biorhymeExpanded,\n\tbiorhyme: _biorhyme,\n\t\"birthstone-bounce\": _birthstoneBounce,\n\tbirthstone: _birthstone,\n\tbiryani: _biryani,\n\t\"bitcount-grid-double-ink\": _bitcountGridDoubleInk,\n\t\"bitcount-grid-double\": _bitcountGridDouble,\n\t\"bitcount-grid-single-ink\": _bitcountGridSingleInk,\n\t\"bitcount-grid-single\": _bitcountGridSingle,\n\t\"bitcount-ink\": _bitcountInk,\n\t\"bitcount-prop-double-ink\": _bitcountPropDoubleInk,\n\t\"bitcount-prop-double\": _bitcountPropDouble,\n\t\"bitcount-prop-single-ink\": _bitcountPropSingleInk,\n\t\"bitcount-prop-single\": _bitcountPropSingle,\n\t\"bitcount-single-ink\": _bitcountSingleInk,\n\t\"bitcount-single\": _bitcountSingle,\n\tbitcount: _bitcount,\n\tbitter: _bitter,\n\t\"biz-udgothic\": _bizUdgothic,\n\t\"biz-udmincho\": _bizUdmincho,\n\t\"biz-udpgothic\": _bizUdpgothic,\n\t\"biz-udpmincho\": _bizUdpmincho,\n\t\"bj-cree\": _bjCree,\n\tbjcree: _bjcree,\n\t\"black-and-white-picture\": _blackAndWhitePicture,\n\t\"black-han-sans\": _blackHanSans,\n\t\"black-ops-one\": _blackOpsOne,\n\t\"blaka-hollow\": _blakaHollow,\n\t\"blaka-ink\": _blakaInk,\n\tblaka: _blaka,\n\tblinker: _blinker,\n\t\"bodoni-moda-sc\": _bodoniModaSc,\n\t\"bodoni-moda\": _bodoniModa,\n\tbokor: _bokor,\n\tboldonse: _boldonse,\n\t\"bona-nova-sc\": _bonaNovaSc,\n\t\"bona-nova\": _bonaNova,\n\tbonbance: _bonbance,\n\tbonbon: _bonbon,\n\t\"bonheur-royale\": _bonheurRoyale,\n\tbonny: _bonny,\n\tboogaloo: _boogaloo,\n\tborel: _borel,\n\tboris: _boris,\n\tboska: _boska,\n\tboucl\u00E9es: _bouclEs,\n\t\"bowlby-one-sc\": _bowlbyOneSc,\n\t\"bowlby-one\": _bowlbyOne,\n\tboxing: _boxing,\n\t\"bpmf-huninn\": _bpmfHuninn,\n\t\"bpmf-iansui\": _bpmfIansui,\n\t\"bpmf-zihi-kai-std\": _bpmfZihiKaiStd,\n\t\"braah-one\": _braahOne,\n\tbrawler: _brawler,\n\t\"bree-serif\": _breeSerif,\n\t\"bricolage-grotesque\": _bricolageGrotesque,\n\t\"briem-hand\": _briemHand,\n\tbritney: _britney,\n\t\"bruno-ace-sc\": _brunoAceSc,\n\t\"bruno-ace\": _brunoAce,\n\t\"brygada-1918\": _brygada1918,\n\t\"bubblegum-sans\": _bubblegumSans,\n\t\"bubbler-one\": _bubblerOne,\n\tbuda: _buda,\n\tbuenard: _buenard,\n\t\"bungee-hairline\": _bungeeHairline,\n\t\"bungee-inline\": _bungeeInline,\n\t\"bungee-outline\": _bungeeOutline,\n\t\"bungee-shade\": _bungeeShade,\n\t\"bungee-spice\": _bungeeSpice,\n\t\"bungee-tint\": _bungeeTint,\n\tbungee: _bungee,\n\tbutcherman: _butcherman,\n\t\"butterfly-kids\": _butterflyKids,\n\tbvllet: _bvllet,\n\tbytesized: _bytesized,\n\t\"cabin-condensed\": _cabinCondensed,\n\t\"cabin-sketch\": _cabinSketch,\n\tcabin: _cabin,\n\t\"cabinet-grotesk\": _cabinetGrotesk,\n\t\"cactus-classical-serif\": _cactusClassicalSerif,\n\t\"caesar-dressing\": _caesarDressing,\n\tcagliostro: _cagliostro,\n\t\"cairo-play\": _cairoPlay,\n\tcairo: _cairo,\n\t\"cal-sans\": _calSans,\n\tcaladea: _caladea,\n\tcalistoga: _calistoga,\n\tcalligraffitti: _calligraffitti,\n\tcambay: _cambay,\n\tcambo: _cambo,\n\tcandal: _candal,\n\tcantarell: _cantarell,\n\t\"cantata-one\": _cantataOne,\n\t\"cantora-one\": _cantoraOne,\n\tcaprasimo: _caprasimo,\n\tcapriola: _capriola,\n\tcaramel: _caramel,\n\tcarattere: _carattere,\n\tcardo: _cardo,\n\tcarlito: _carlito,\n\tcarme: _carme,\n\t\"carrois-gothic-sc\": _carroisGothicSc,\n\t\"carrois-gothic\": _carroisGothic,\n\t\"carter-one\": _carterOne,\n\t\"cascadia-code\": _cascadiaCode,\n\t\"cascadia-mono\": _cascadiaMono,\n\t\"castoro-titling\": _castoroTitling,\n\tcastoro: _castoro,\n\tcatamaran: _catamaran,\n\tcaudex: _caudex,\n\tcause: _cause,\n\t\"caveat-brush\": _caveatBrush,\n\tcaveat: _caveat,\n\t\"cedarville-cursive\": _cedarvilleCursive,\n\tcesare: _cesare,\n\t\"ceviche-one\": _cevicheOne,\n\t\"chakra-petch\": _chakraPetch,\n\t\"changa-one\": _changaOne,\n\tchanga: _changa,\n\tchango: _chango,\n\tchaos16: _chaos16,\n\t\"charis-sil\": _charisSil,\n\tcharm: _charm,\n\tcharmonman: _charmonman,\n\tchathura: _chathura,\n\t\"chau-philomene-one\": _chauPhilomeneOne,\n\t\"chaumont-script\": _chaumontScript,\n\t\"chela-one\": _chelaOne,\n\t\"chelsea-market\": _chelseaMarket,\n\tcherish: _cherish,\n\t\"cherry-bomb-one\": _cherryBombOne,\n\t\"cherry-cream-soda\": _cherryCreamSoda,\n\t\"cherry-swash\": _cherrySwash,\n\tchewy: _chewy,\n\tchicle: _chicle,\n\tchilanka: _chilanka,\n\tchillax: _chillax,\n\t\"chiron-goround-tc\": _chironGoroundTc,\n\t\"chiron-hei-hk\": _chironHeiHk,\n\t\"chiron-sung-hk\": _chironSungHk,\n\t\"chivo-mono\": _chivoMono,\n\tchivo: _chivo,\n\t\"chocolate-classical-sans\": _chocolateClassicalSans,\n\tchokokutai: _chokokutai,\n\tchonburi: _chonburi,\n\tchoso: _choso,\n\tchubbo: _chubbo,\n\t\"cinzel-decorative\": _cinzelDecorative,\n\tcinzel: _cinzel,\n\t\"clash-display\": _clashDisplay,\n\t\"clash-grotesk\": _clashGrotesk,\n\t\"clicker-script\": _clickerScript,\n\t\"climate-crisis\": _climateCrisis,\n\t\"coaster-sans\": _coasterSans,\n\tcoconat: _coconat,\n\t\"coda-caption\": _codaCaption,\n\tcoda: _coda,\n\tcodystar: _codystar,\n\tcoiny: _coiny,\n\tcombo: _combo,\n\tcomfortaa: _comfortaa,\n\t\"comforter-brush\": _comforterBrush,\n\tcomforter: _comforter,\n\t\"comic-neue\": _comicNeue,\n\t\"comic-relief\": _comicRelief,\n\tcomico: _comico,\n\t\"coming-soon\": _comingSoon,\n\tcomme: _comme,\n\tcommissioner: _commissioner,\n\t\"concert-one\": _concertOne,\n\tcondenbitmap: _condenbitmap,\n\tcondiment: _condiment,\n\t\"contrail-one\": _contrailOne,\n\tconvergence: _convergence,\n\tcookie: _cookie,\n\t\"cooper-hewitt\": _cooperHewitt,\n\tcopse: _copse,\n\t\"coral-pixels\": _coralPixels,\n\tcorben: _corben,\n\tcorinthia: _corinthia,\n\t\"cormorant-garamond\": _cormorantGaramond,\n\t\"cormorant-infant\": _cormorantInfant,\n\t\"cormorant-sc\": _cormorantSc,\n\t\"cormorant-unicase\": _cormorantUnicase,\n\t\"cormorant-upright\": _cormorantUpright,\n\tcormorant: _cormorant,\n\t\"cossette-texte\": _cossetteTexte,\n\t\"cossette-titre\": _cossetteTitre,\n\tcourgette: _courgette,\n\t\"courier-prime\": _courierPrime,\n\tcousine: _cousine,\n\tcoustard: _coustard,\n\t\"covered-by-your-grace\": _coveredByYourGrace,\n\t\"crafty-girls\": _craftyGirls,\n\tcreepster: _creepster,\n\t\"crete-round\": _creteRound,\n\t\"crimson-pro\": _crimsonPro,\n\t\"crimson-text\": _crimsonText,\n\t\"croissant-one\": _croissantOne,\n\tcrushed: _crushed,\n\tcuprum: _cuprum,\n\t\"cute-font\": _cuteFont,\n\t\"cutive-mono\": _cutiveMono,\n\tcutive: _cutive,\n\t\"dai-banna-sil\": _daiBannaSil,\n\tdamion: _damion,\n\t\"dancing-script\": _dancingScript,\n\tdanfo: _danfo,\n\tdangrek: _dangrek,\n\t\"darker-grotesque\": _darkerGrotesque,\n\t\"darumadrop-one\": _darumadropOne,\n\tdatatype: _datatype,\n\t\"david-libre\": _davidLibre,\n\t\"dawning-of-a-new-day\": _dawningOfANewDay,\n\t\"days-one\": _daysOne,\n\tdefekt: _defekt,\n\tdekko: _dekko,\n\t\"dela-gothic-one\": _delaGothicOne,\n\t\"delicious-handrawn\": _deliciousHandrawn,\n\t\"delius-swash-caps\": _deliusSwashCaps,\n\t\"delius-unicase\": _deliusUnicase,\n\tdelius: _delius,\n\t\"della-respira\": _dellaRespira,\n\t\"dem-mo-mono\": _demMoMono,\n\t\"denk-one\": _denkOne,\n\tdestra: _destra,\n\tdevonshire: _devonshire,\n\tdhurjati: _dhurjati,\n\t\"didact-gothic\": _didactGothic,\n\tdiphylleia: _diphylleia,\n\t\"diplomata-sc\": _diplomataSc,\n\tdiplomata: _diplomata,\n\t\"dm-mono\": _dmMono,\n\t\"dm-retrograde\": _dmRetrograde,\n\t\"dm-sans\": _dmSans,\n\t\"dm-serif-display\": _dmSerifDisplay,\n\t\"dm-serif-text\": _dmSerifText,\n\t\"do-hyeon\": _doHyeon,\n\tdokdo: _dokdo,\n\tdomine: _domine,\n\t\"donegal-one\": _donegalOne,\n\tdongle: _dongle,\n\t\"doppio-one\": _doppioOne,\n\tdorsa: _dorsa,\n\tdosis: _dosis,\n\tdotgothic16: _dotgothic16,\n\tdoto: _doto,\n\t\"dr-sugiyama\": _drSugiyama,\n\tdrabina: _drabina,\n\t\"droide-anthro-light\": _droideAnthroLight,\n\t\"dt-getai-grotesk-display\": _dtGetaiGroteskDisplay,\n\t\"dt-nightingale\": _dtNightingale,\n\t\"duru-sans\": _duruSans,\n\tdynalight: _dynalight,\n\tdynapuff: _dynapuff,\n\t\"eagle-lake\": _eagleLake,\n\t\"east-sea-dokdo\": _eastSeaDokdo,\n\teater: _eater,\n\t\"eb-garamond\": _ebGaramond,\n\teconomica: _economica,\n\teczar: _eczar,\n\t\"edu-au-vic-wa-nt-arrows\": _eduAuVicWaNtArrows,\n\t\"edu-au-vic-wa-nt-dots\": _eduAuVicWaNtDots,\n\t\"edu-au-vic-wa-nt-guides\": _eduAuVicWaNtGuides,\n\t\"edu-au-vic-wa-nt-hand\": _eduAuVicWaNtHand,\n\t\"edu-au-vic-wa-nt-pre\": _eduAuVicWaNtPre,\n\t\"edu-nsw-act-cursive\": _eduNswActCursive,\n\t\"edu-nsw-act-foundation\": _eduNswActFoundation,\n\t\"edu-nsw-act-hand-pre\": _eduNswActHandPre,\n\t\"edu-qld-beginner\": _eduQldBeginner,\n\t\"edu-qld-hand\": _eduQldHand,\n\t\"edu-sa-beginner\": _eduSaBeginner,\n\t\"edu-sa-hand\": _eduSaHand,\n\t\"edu-tas-beginner\": _eduTasBeginner,\n\t\"edu-vic-wa-nt-beginner\": _eduVicWaNtBeginner,\n\t\"edu-vic-wa-nt-hand-pre\": _eduVicWaNtHandPre,\n\t\"edu-vic-wa-nt-hand\": _eduVicWaNtHand,\n\t\"el-messiri\": _elMessiri,\n\telastic: _elastic,\n\telectrolize: _electrolize,\n\t\"elms-sans\": _elmsSans,\n\t\"elsie-swash-caps\": _elsieSwashCaps,\n\telsie: _elsie,\n\telstob: _elstob,\n\t\"emblema-one\": _emblemaOne,\n\t\"emilys-candy\": _emilysCandy,\n\t\"encode-sans-condensed\": _encodeSansCondensed,\n\t\"encode-sans-expanded\": _encodeSansExpanded,\n\t\"encode-sans-sc\": _encodeSansSc,\n\t\"encode-sans-semi-condensed\": _encodeSansSemiCondensed,\n\t\"encode-sans-semi-expanded\": _encodeSansSemiExpanded,\n\t\"encode-sans\": _encodeSans,\n\tengagement: _engagement,\n\tenglebert: _englebert,\n\tenriqueta: _enriqueta,\n\tephesis: _ephesis,\n\tepilogue: _epilogue,\n\t\"epunda-sans\": _epundaSans,\n\t\"epunda-slab\": _epundaSlab,\n\terbarre: _erbarre,\n\t\"erica-one\": _ericaOne,\n\terode: _erode,\n\testeban: _esteban,\n\testedad: _estedad,\n\testonia: _estonia,\n\t\"euphoria-script\": _euphoriaScript,\n\tewert: _ewert,\n\texcon: _excon,\n\texile: _exile,\n\t\"exo-2\": _exo2,\n\texo: _exo,\n\t\"expletus-sans\": _expletusSans,\n\texplora: _explora,\n\texpose: _expose,\n\t\"f1-8\": _f18,\n\t\"fa-1\": _fa1,\n\tfablab: _fablab,\n\t\"faculty-glyphic\": _facultyGlyphic,\n\tfahkwang: _fahkwang,\n\t\"familjen-grotesk\": _familjenGrotesk,\n\t\"fanwood-text\": _fanwoodText,\n\tfarro: _farro,\n\tfarsan: _farsan,\n\t\"fascinate-inline\": _fascinateInline,\n\tfascinate: _fascinate,\n\t\"faster-one\": _fasterOne,\n\tfasthand: _fasthand,\n\t\"fauna-one\": _faunaOne,\n\tfaustina: _faustina,\n\tfederant: _federant,\n\tfedero: _federo,\n\tfelipa: _felipa,\n\tfenix: _fenix,\n\tfestive: _festive,\n\t\"fff-tuoi-tre\": _fffTuoiTre,\n\tfigtree: _figtree,\n\t\"finger-paint\": _fingerPaint,\n\t\"finlandica-headline\": _finlandicaHeadline,\n\t\"finlandica-text\": _finlandicaText,\n\tfinlandica: _finlandica,\n\t\"fira-code\": _firaCode,\n\t\"fira-mono\": _firaMono,\n\t\"fira-sans-condensed\": _firaSansCondensed,\n\t\"fira-sans-extra-condensed\": _firaSansExtraCondensed,\n\t\"fira-sans\": _firaSans,\n\t\"fjalla-one\": _fjallaOne,\n\t\"fjord-one\": _fjordOne,\n\tflamenco: _flamenco,\n\tflavors: _flavors,\n\t\"fleur-de-leah\": _fleurDeLeah,\n\tfleuron: _fleuron,\n\t\"fliege-mono\": _fliegeMono,\n\t\"flow-block\": _flowBlock,\n\t\"flow-circular\": _flowCircular,\n\t\"flow-rounded\": _flowRounded,\n\tflux: _flux,\n\t\"fluxisch-else\": _fluxischElse,\n\tfoldit: _foldit,\n\tfondamento: _fondamento,\n\t\"fontdiner-swanky\": _fontdinerSwanky,\n\tforum: _forum,\n\t\"fragment-mono\": _fragmentMono,\n\tfrakturmeta: _frakturmeta,\n\t\"francois-one\": _francoisOne,\n\t\"frank-ruhl-libre\": _frankRuhlLibre,\n\tfraunces: _fraunces,\n\t\"freak-grotesk-next\": _freakGroteskNext,\n\t\"freckle-face\": _freckleFace,\n\t\"fredericka-the-great\": _frederickaTheGreat,\n\t\"fredoka-one\": _fredokaOne,\n\tfredoka: _fredoka,\n\tfreehand: _freehand,\n\tfreeman: _freeman,\n\tfresca: _fresca,\n\tfrijole: _frijole,\n\tfruktur: _fruktur,\n\tft88: _ft88,\n\t\"fugaz-one\": _fugazOne,\n\tfuggles: _fuggles,\n\t\"funnel-display\": _funnelDisplay,\n\t\"funnel-sans\": _funnelSans,\n\tfustat: _fustat,\n\t\"fuzzy-bubbles\": _fuzzyBubbles,\n\t\"ga-maamli\": _gaMaamli,\n\tgabarito: _gabarito,\n\tgabriela: _gabriela,\n\tgaegu: _gaegu,\n\tgafata: _gafata,\n\t\"gajraj-one\": _gajrajOne,\n\tgalada: _galada,\n\tgaldeano: _galdeano,\n\tgalindo: _galindo,\n\tgambarino: _gambarino,\n\tgambetta: _gambetta,\n\t\"gamja-flower\": _gamjaFlower,\n\tgantari: _gantari,\n\t\"gap-sans\": _gapSans,\n\t\"gasoek-one\": _gasoekOne,\n\tgayathri: _gayathri,\n\t\"geist-mono\": _geistMono,\n\tgeist: _geist,\n\tgelasio: _gelasio,\n\t\"gemunu-libre\": _gemunuLibre,\n\t\"general-sans\": _generalSans,\n\tgenos: _genos,\n\t\"gentium-book-basic\": _gentiumBookBasic,\n\t\"gentium-book-plus\": _gentiumBookPlus,\n\t\"gentium-plus\": _gentiumPlus,\n\tgeo: _geo,\n\tgeologica: _geologica,\n\tgeom: _geom,\n\tgeorama: _georama,\n\t\"geostar-fill\": _geostarFill,\n\tgeostar: _geostar,\n\t\"germania-one\": _germaniaOne,\n\t\"gfs-didot\": _gfsDidot,\n\t\"gfs-neohellenic\": _gfsNeohellenic,\n\t\"gideon-roman\": _gideonRoman,\n\tgidole: _gidole,\n\tgidugu: _gidugu,\n\t\"gilda-display\": _gildaDisplay,\n\tgirassol: _girassol,\n\t\"give-you-glory\": _giveYouGlory,\n\t\"glass-antiqua\": _glassAntiqua,\n\tglegoo: _glegoo,\n\tgloock: _gloock,\n\t\"gloria-hallelujah\": _gloriaHallelujah,\n\tglory: _glory,\n\tgluten: _gluten,\n\tgnomon: _gnomon,\n\t\"goblin-one\": _goblinOne,\n\t\"gochi-hand\": _gochiHand,\n\tgoldman: _goldman,\n\t\"golos-text\": _golosText,\n\t\"google-sans-code\": _googleSansCode,\n\t\"google-sans-flex\": _googleSansFlex,\n\t\"google-sans\": _googleSans,\n\tgorditas: _gorditas,\n\t\"gothic-a1\": _gothicA1,\n\tgotu: _gotu,\n\t\"goudy-bookletter-1911\": _goudyBookletter1911,\n\t\"gowun-batang\": _gowunBatang,\n\t\"gowun-dodum\": _gowunDodum,\n\tgraduate: _graduate,\n\t\"grand-hotel\": _grandHotel,\n\t\"grandiflora-one\": _grandifloraOne,\n\tgrandstander: _grandstander,\n\t\"grape-nuts\": _grapeNuts,\n\t\"grave-presse\": _gravePresse,\n\t\"gravitas-one\": _gravitasOne,\n\t\"great-vibes\": _greatVibes,\n\t\"grechen-fuemen\": _grechenFuemen,\n\t\"grenze-gotisch\": _grenzeGotisch,\n\tgrenze: _grenze,\n\t\"grey-qo\": _greyQo,\n\tgriffy: _griffy,\n\tgrith: _grith,\n\tgruppo: _gruppo,\n\tgudea: _gudea,\n\tgugi: _gugi,\n\tgulzar: _gulzar,\n\tgupter: _gupter,\n\tgurajada: _gurajada,\n\t\"gveret-levin\": _gveretLevin,\n\tgwendolyn: _gwendolyn,\n\thabibi: _habibi,\n\t\"hachi-maru-pop\": _hachiMaruPop,\n\thahmlet: _hahmlet,\n\thalant: _halant,\n\thalibut: _halibut,\n\t\"hammersmith-one\": _hammersmithOne,\n\t\"hanalei-fill\": _hanaleiFill,\n\thanalei: _hanalei,\n\thandjet: _handjet,\n\thandlee: _handlee,\n\t\"hanken-grotesk\": _hankenGrotesk,\n\thanuman: _hanuman,\n\t\"happy-monkey\": _happyMonkey,\n\tharmattan: _harmattan,\n\thauora: _hauora,\n\thavana: _havana,\n\t\"headland-one\": _headlandOne,\n\t\"hedvig-letters-sans\": _hedvigLettersSans,\n\t\"hedvig-letters-serif\": _hedvigLettersSerif,\n\theebo: _heebo,\n\t\"henny-penny\": _hennyPenny,\n\t\"hepta-slab\": _heptaSlab,\n\t\"herr-von-muellerhoff\": _herrVonMuellerhoff,\n\t\"hershey-noailles-times\": _hersheyNoaillesTimes,\n\t\"hi-melody\": _hiMelody,\n\thikasami: _hikasami,\n\t\"hina-mincho\": _hinaMincho,\n\t\"hind-guntur\": _hindGuntur,\n\t\"hind-madurai\": _hindMadurai,\n\t\"hind-mysuru\": _hindMysuru,\n\t\"hind-siliguri\": _hindSiliguri,\n\t\"hind-vadodara\": _hindVadodara,\n\thind: _hind,\n\t\"holtwood-one-sc\": _holtwoodOneSc,\n\t\"homemade-apple\": _homemadeApple,\n\thomenaje: _homenaje,\n\thonk: _honk,\n\t\"hooskai-chamfered-square\": _hooskaiChamferedSquare,\n\thoover: _hoover,\n\t\"host-grotesk\": _hostGrotesk,\n\thuab: _huab,\n\thubballi: _hubballi,\n\t\"hubot-sans\": _hubotSans,\n\thuninn: _huninn,\n\thurricane: _hurricane,\n\tiansui: _iansui,\n\t\"ibarra-real-nova\": _ibarraRealNova,\n\t\"ibm-plex-mono\": _ibmPlexMono,\n\t\"ibm-plex-sans-arabic\": _ibmPlexSansArabic,\n\t\"ibm-plex-sans-condensed\": _ibmPlexSansCondensed,\n\t\"ibm-plex-sans-devanagari\": _ibmPlexSansDevanagari,\n\t\"ibm-plex-sans-hebrew\": _ibmPlexSansHebrew,\n\t\"ibm-plex-sans-jp\": _ibmPlexSansJp,\n\t\"ibm-plex-sans-kr\": _ibmPlexSansKr,\n\t\"ibm-plex-sans-thai-looped\": _ibmPlexSansThaiLooped,\n\t\"ibm-plex-sans-thai\": _ibmPlexSansThai,\n\t\"ibm-plex-sans\": _ibmPlexSans,\n\t\"ibm-plex-serif\": _ibmPlexSerif,\n\ticeberg: _iceberg,\n\ticeland: _iceland,\n\tidiqlat: _idiqlat,\n\t\"im-fell-double-pica-sc\": _imFellDoublePicaSc,\n\t\"im-fell-double-pica\": _imFellDoublePica,\n\t\"im-fell-dw-pica-sc\": _imFellDwPicaSc,\n\t\"im-fell-dw-pica\": _imFellDwPica,\n\t\"im-fell-english-sc\": _imFellEnglishSc,\n\t\"im-fell-english\": _imFellEnglish,\n\t\"im-fell-french-canon-sc\": _imFellFrenchCanonSc,\n\t\"im-fell-french-canon\": _imFellFrenchCanon,\n\t\"im-fell-great-primer-sc\": _imFellGreatPrimerSc,\n\t\"im-fell-great-primer\": _imFellGreatPrimer,\n\timbue: _imbue,\n\t\"imperial-script\": _imperialScript,\n\timprima: _imprima,\n\t\"inclusive-sans\": _inclusiveSans,\n\tinconsolata: _inconsolata,\n\tinder: _inder,\n\t\"indie-flower\": _indieFlower,\n\t\"ingrid-darling\": _ingridDarling,\n\tinika: _inika,\n\t\"inknut-antiqua\": _inknutAntiqua,\n\t\"inria-sans\": _inriaSans,\n\t\"inria-serif\": _inriaSerif,\n\tinspiration: _inspiration,\n\t\"instrument-sans\": _instrumentSans,\n\t\"instrument-serif\": _instrumentSerif,\n\t\"intel-one-mono\": _intelOneMono,\n\t\"inter-tight\": _interTight,\n\tinter: _inter,\n\t\"iosevka-charon-mono\": _iosevkaCharonMono,\n\t\"iosevka-charon\": _iosevkaCharon,\n\t\"irish-grover\": _irishGrover,\n\t\"island-moments\": _islandMoments,\n\t\"istok-web\": _istokWeb,\n\titaliana: _italiana,\n\titalianno: _italianno,\n\titim: _itim,\n\t\"jacquard-12-charted\": _jacquard12Charted,\n\t\"jacquard-12\": _jacquard12,\n\t\"jacquard-24-charted\": _jacquard24Charted,\n\t\"jacquard-24\": _jacquard24,\n\t\"jacquarda-bastarda-9-charted\": _jacquardaBastarda9Charted,\n\t\"jacquarda-bastarda-9\": _jacquardaBastarda9,\n\t\"jacques-francois-shadow\": _jacquesFrancoisShadow,\n\t\"jacques-francois\": _jacquesFrancois,\n\t\"jaini-purva\": _jainiPurva,\n\tjaini: _jaini,\n\tjakob: _jakob,\n\tjaldi: _jaldi,\n\tjaro: _jaro,\n\t\"jersey-10-charted\": _jersey10Charted,\n\t\"jersey-10\": _jersey10,\n\t\"jersey-15-charted\": _jersey15Charted,\n\t\"jersey-15\": _jersey15,\n\t\"jersey-20-charted\": _jersey20Charted,\n\t\"jersey-20\": _jersey20,\n\t\"jersey-25-charted\": _jersey25Charted,\n\t\"jersey-25\": _jersey25,\n\t\"jetbrains-mono\": _jetbrainsMono,\n\t\"jim-nightshade\": _jimNightshade,\n\tjoan: _joan,\n\t\"jockey-one\": _jockeyOne,\n\t\"jolly-lodger\": _jollyLodger,\n\tjomhuria: _jomhuria,\n\tjomolhari: _jomolhari,\n\t\"josefin-sans\": _josefinSans,\n\t\"josefin-slab\": _josefinSlab,\n\tjost: _jost,\n\t\"joti-one\": _jotiOne,\n\tjua: _jua,\n\tjudson: _judson,\n\tjulee: _julee,\n\t\"julius-sans-one\": _juliusSansOne,\n\tjunge: _junge,\n\t\"junicode-vf\": _junicodeVf,\n\tjura: _jura,\n\t\"just-another-hand\": _justAnotherHand,\n\t\"just-me-again-down-here\": _justMeAgainDownHere,\n\tk2d: _k2d,\n\tkablammo: _kablammo,\n\tkadwa: _kadwa,\n\t\"kaisei-decol\": _kaiseiDecol,\n\t\"kaisei-harunoumi\": _kaiseiHarunoumi,\n\t\"kaisei-opti\": _kaiseiOpti,\n\t\"kaisei-tokumin\": _kaiseiTokumin,\n\tkalam: _kalam,\n\t\"kalnia-glaze\": _kalniaGlaze,\n\tkalnia: _kalnia,\n\tkameron: _kameron,\n\tkanchenjunga: _kanchenjunga,\n\tkanit: _kanit,\n\t\"kantumruy-pro\": _kantumruyPro,\n\tkapakana: _kapakana,\n\tkarantina: _karantina,\n\tkarla: _karla,\n\tkarma: _karma,\n\tkatibeh: _katibeh,\n\t\"kaushan-script\": _kaushanScript,\n\tkavivanar: _kavivanar,\n\tkavoon: _kavoon,\n\t\"kay-pho-du\": _kayPhoDu,\n\t\"kdam-thmor-pro\": _kdamThmorPro,\n\t\"keania-one\": _keaniaOne,\n\tkedebideri: _kedebideri,\n\t\"kelly-slab\": _kellySlab,\n\tkenia: _kenia,\n\tkhand: _khand,\n\tkhula: _khula,\n\tkihim: _kihim,\n\tkings: _kings,\n\t\"kirang-haerang\": _kirangHaerang,\n\t\"kite-one\": _kiteOne,\n\t\"kiwi-maru\": _kiwiMaru,\n\t\"klee-one\": _kleeOne,\n\tknewave: _knewave,\n\tkobata: _kobata,\n\tkodchasan: _kodchasan,\n\t\"kode-mono\": _kodeMono,\n\t\"koh-santepheap\": _kohSantepheap,\n\tkoho: _koho,\n\tkola: _kola,\n\t\"kolker-brush\": _kolkerBrush,\n\t\"konkhmer-sleokchher\": _konkhmerSleokchher,\n\t\"kosugi-maru\": _kosugiMaru,\n\tkosugi: _kosugi,\n\t\"kotta-one\": _kottaOne,\n\tkoulen: _koulen,\n\tkranky: _kranky,\n\tkreon: _kreon,\n\tkristi: _kristi,\n\t\"krona-one\": _kronaOne,\n\tkrub: _krub,\n\tkufam: _kufam,\n\t\"kulim-park\": _kulimPark,\n\t\"kumar-one-outline\": _kumarOneOutline,\n\t\"kumar-one\": _kumarOne,\n\t\"kumbh-sans\": _kumbhSans,\n\tkurale: _kurale,\n\t\"la-belle-aurore\": _laBelleAurore,\n\tlabrada: _labrada,\n\tlacquer: _lacquer,\n\tlaila: _laila,\n\t\"lakki-reddy\": _lakkiReddy,\n\tlalezar: _lalezar,\n\tlancelot: _lancelot,\n\tlangar: _langar,\n\tlateef: _lateef,\n\tlato: _lato,\n\t\"lavishly-yours\": _lavishlyYours,\n\tlavoir: _lavoir,\n\t\"lct-ciburial\": _lctCiburial,\n\t\"lct-iptex\": _lctIptex,\n\t\"league-gothic\": _leagueGothic,\n\t\"league-script\": _leagueScript,\n\t\"league-spartan\": _leagueSpartan,\n\t\"leckerli-one\": _leckerliOne,\n\tledger: _ledger,\n\tlekton: _lekton,\n\tlemon: _lemon,\n\tlemonada: _lemonada,\n\t\"lexend-deca\": _lexendDeca,\n\t\"lexend-exa\": _lexendExa,\n\t\"lexend-giga\": _lexendGiga,\n\t\"lexend-mega\": _lexendMega,\n\t\"lexend-peta\": _lexendPeta,\n\t\"lexend-tera\": _lexendTera,\n\t\"lexend-zetta\": _lexendZetta,\n\tlexend: _lexend,\n\t\"libertinus-keyboard\": _libertinusKeyboard,\n\t\"libertinus-math\": _libertinusMath,\n\t\"libertinus-mono\": _libertinusMono,\n\t\"libertinus-sans\": _libertinusSans,\n\t\"libertinus-serif-display\": _libertinusSerifDisplay,\n\t\"libertinus-serif\": _libertinusSerif,\n\t\"libre-barcode-128-text\": _libreBarcode128Text,\n\t\"libre-barcode-128\": _libreBarcode128,\n\t\"libre-barcode-39-extended-text\": _libreBarcode39ExtendedText,\n\t\"libre-barcode-39-extended\": _libreBarcode39Extended,\n\t\"libre-barcode-39-text\": _libreBarcode39Text,\n\t\"libre-barcode-39\": _libreBarcode39,\n\t\"libre-barcode-ean13-text\": _libreBarcodeEan13Text,\n\t\"libre-baskerville\": _libreBaskerville,\n\t\"libre-bodoni\": _libreBodoni,\n\t\"libre-caslon-condensed\": _libreCaslonCondensed,\n\t\"libre-caslon-display\": _libreCaslonDisplay,\n\t\"libre-caslon-text\": _libreCaslonText,\n\t\"libre-franklin\": _libreFranklin,\n\tlicorice: _licorice,\n\t\"life-savers\": _lifeSavers,\n\t\"liga-sans\": _ligaSans,\n\tlilex: _lilex,\n\t\"lilita-one\": _lilitaOne,\n\t\"lily-script-one\": _lilyScriptOne,\n\tlimelight: _limelight,\n\t\"linden-hill\": _lindenHill,\n\t\"line-seed-jp\": _lineSeedJp,\n\t\"lisu-bosa\": _lisuBosa,\n\tliter: _liter,\n\tliterata: _literata,\n\t\"liu-jian-mao-cao\": _liuJianMaoCao,\n\tlivvic: _livvic,\n\t\"lobster-two\": _lobsterTwo,\n\tlobster: _lobster,\n\t\"londrina-outline\": _londrinaOutline,\n\t\"londrina-shadow\": _londrinaShadow,\n\t\"londrina-sketch\": _londrinaSketch,\n\t\"londrina-solid\": _londrinaSolid,\n\t\"long-cang\": _longCang,\n\tlora: _lora,\n\t\"love-light\": _loveLight,\n\t\"love-ya-like-a-sister\": _loveYaLikeASister,\n\t\"loved-by-the-king\": _lovedByTheKing,\n\t\"lovers-quarrel\": _loversQuarrel,\n\t\"lt-avocado\": _ltAvocado,\n\t\"lt-remark\": _ltRemark,\n\t\"luckiest-guy\": _luckiestGuy,\n\tlugrasimo: _lugrasimo,\n\tlumanosimo: _lumanosimo,\n\tlunasima: _lunasima,\n\tlunchtype25: _lunchtype25,\n\tlusitana: _lusitana,\n\tlustria: _lustria,\n\t\"luxurious-roman\": _luxuriousRoman,\n\t\"luxurious-script\": _luxuriousScript,\n\t\"lxgw-marker-gothic\": _lxgwMarkerGothic,\n\t\"lxgw-wenkai-mono-tc\": _lxgwWenkaiMonoTc,\n\t\"lxgw-wenkai-tc\": _lxgwWenkaiTc,\n\t\"m-plus-1-code\": _mPlus1Code,\n\t\"m-plus-1\": _mPlus1,\n\t\"m-plus-1p\": _mPlus1p,\n\t\"m-plus-2\": _mPlus2,\n\t\"m-plus-code-latin\": _mPlusCodeLatin,\n\t\"m-plus-rounded-1c\": _mPlusRounded1c,\n\t\"m-plus-u\": _mPlusU,\n\t\"ma-shan-zheng\": _maShanZheng,\n\t\"macondo-swash-caps\": _macondoSwashCaps,\n\tmacondo: _macondo,\n\tmada: _mada,\n\t\"madimi-one\": _madimiOne,\n\tmagiel: _magiel,\n\tmagra: _magra,\n\t\"maiden-orange\": _maidenOrange,\n\tmaitree: _maitree,\n\t\"major-mono-display\": _majorMonoDisplay,\n\tmako: _mako,\n\tmali: _mali,\n\tmallanna: _mallanna,\n\tmaname: _maname,\n\tmandali: _mandali,\n\tmanjari: _manjari,\n\tmanrope: _manrope,\n\tmansalva: _mansalva,\n\tmanuale: _manuale,\n\t\"manufacturing-consent\": _manufacturingConsent,\n\t\"marcellus-sc\": _marcellusSc,\n\tmarcellus: _marcellus,\n\t\"marck-script\": _marckScript,\n\tmargarine: _margarine,\n\tmarhey: _marhey,\n\t\"markazi-text\": _markaziText,\n\t\"marko-one\": _markoOne,\n\tmarmelad: _marmelad,\n\t\"martel-sans\": _martelSans,\n\tmartel: _martel,\n\t\"martian-mono\": _martianMono,\n\tmarvel: _marvel,\n\tmatangi: _matangi,\n\t\"mate-sc\": _mateSc,\n\tmate: _mate,\n\tmatemasie: _matemasie,\n\tmattone: _mattone,\n\t\"maven-pro\": _mavenPro,\n\t\"mazius-display\": _maziusDisplay,\n\tmclaren: _mclaren,\n\t\"mea-culpa\": _meaCulpa,\n\tmeddon: _meddon,\n\tmedievalsharp: _medievalsharp,\n\t\"medula-one\": _medulaOne,\n\t\"meera-inimai\": _meeraInimai,\n\tmegrim: _megrim,\n\t\"meie-script\": _meieScript,\n\tmelodrama: _melodrama,\n\tmenbere: _menbere,\n\t\"meow-script\": _meowScript,\n\t\"merienda-one\": _meriendaOne,\n\tmerienda: _merienda,\n\t\"merriweather-sans\": _merriweatherSans,\n\tmerriweather: _merriweather,\n\tmessapia: _messapia,\n\t\"metal-mania\": _metalMania,\n\tmetal: _metal,\n\tmetamorphous: _metamorphous,\n\tmetrophobic: _metrophobic,\n\tmichroma: _michroma,\n\t\"micro-5-charted\": _micro5Charted,\n\t\"micro-5\": _micro5,\n\tmilkman: _milkman,\n\tmilonga: _milonga,\n\t\"miltonian-tattoo\": _miltonianTattoo,\n\tmiltonian: _miltonian,\n\tmina: _mina,\n\tmingzat: _mingzat,\n\tminiver: _miniver,\n\t\"miranda-sans\": _mirandaSans,\n\t\"miriam-libre\": _miriamLibre,\n\tmirza: _mirza,\n\t\"miss-fajardose\": _missFajardose,\n\tmitr: _mitr,\n\tmluvka: _mluvka,\n\t\"mochiy-pop-one\": _mochiyPopOne,\n\t\"mochiy-pop-p-one\": _mochiyPopPOne,\n\tmodak: _modak,\n\t\"modern-antiqua\": _modernAntiqua,\n\tmoderustic: _moderustic,\n\tmogra: _mogra,\n\tmohave: _mohave,\n\t\"moirai-one\": _moiraiOne,\n\tmolengo: _molengo,\n\tmolle: _molle,\n\t\"momo-signature\": _momoSignature,\n\t\"momo-trust-display\": _momoTrustDisplay,\n\t\"momo-trust-sans\": _momoTrustSans,\n\t\"mona-sans\": _monaSans,\n\tmonda: _monda,\n\tmonofett: _monofett,\n\tmonomakh: _monomakh,\n\t\"monomaniac-one\": _monomaniacOne,\n\tmonoton: _monoton,\n\t\"monsieur-la-doulaise\": _monsieurLaDoulaise,\n\tmontaga: _montaga,\n\t\"montagu-slab\": _montaguSlab,\n\tmontecarlo: _montecarlo,\n\tmontez: _montez,\n\t\"montserrat-alternates\": _montserratAlternates,\n\t\"montserrat-subrayada\": _montserratSubrayada,\n\t\"montserrat-underline\": _montserratUnderline,\n\tmontserrat: _montserrat,\n\t\"moo-lah-lah\": _mooLahLah,\n\tmooli: _mooli,\n\t\"moon-dance\": _moonDance,\n\tmoul: _moul,\n\tmoulpali: _moulpali,\n\t\"mountains-of-christmas\": _mountainsOfChristmas,\n\tmourier: _mourier,\n\t\"mouse-memoirs\": _mouseMemoirs,\n\t\"mozilla-headline\": _mozillaHeadline,\n\t\"mozilla-text\": _mozillaText,\n\t\"mr-bedfort\": _mrBedfort,\n\t\"mr-dafoe\": _mrDafoe,\n\t\"mr-de-haviland\": _mrDeHaviland,\n\t\"mrs-saint-delafield\": _mrsSaintDelafield,\n\t\"mrs-sheppards\": _mrsSheppards,\n\t\"ms-madi\": _msMadi,\n\t\"mukta-mahee\": _muktaMahee,\n\t\"mukta-malar\": _muktaMalar,\n\t\"mukta-vaani\": _muktaVaani,\n\tmukta: _mukta,\n\tmulish: _mulish,\n\tmurecho: _murecho,\n\tmuseomoderno: _museomoderno,\n\t\"my-soul\": _mySoul,\n\tmynerve: _mynerve,\n\t\"mystery-quest\": _mysteryQuest,\n\tnabla: _nabla,\n\tnamdhinggo: _namdhinggo,\n\t\"nanum-brush-script\": _nanumBrushScript,\n\t\"nanum-gothic-coding\": _nanumGothicCoding,\n\t\"nanum-gothic\": _nanumGothic,\n\t\"nanum-myeongjo\": _nanumMyeongjo,\n\t\"nanum-pen-script\": _nanumPenScript,\n\tnarnoor: _narnoor,\n\t\"nata-sans\": _nataSans,\n\t\"national-park\": _nationalPark,\n\tneco: _neco,\n\t\"necto-mono\": _nectoMono,\n\tnemoy: _nemoy,\n\tneonderthaw: _neonderthaw,\n\t\"nerko-one\": _nerkoOne,\n\tneucha: _neucha,\n\tneuton: _neuton,\n\t\"neutral-sans\": _neutralSans,\n\t\"new-amsterdam\": _newAmsterdam,\n\t\"new-rocker\": _newRocker,\n\t\"new-tegomin\": _newTegomin,\n\t\"new-title\": _newTitle,\n\t\"news-cycle\": _newsCycle,\n\tnewsreader: _newsreader,\n\tniconne: _niconne,\n\tnippo: _nippo,\n\tniramit: _niramit,\n\t\"nixie-one\": _nixieOne,\n\tnobile: _nobile,\n\tnocurvesboustrophedon: _nocurvesboustrophedon,\n\tnokora: _nokora,\n\tnorican: _norican,\n\tnorm: _norm,\n\tnosifer: _nosifer,\n\tnotable: _notable,\n\t\"nothing-you-could-do\": _nothingYouCouldDo,\n\t\"noticia-text\": _noticiaText,\n\t\"noto-kufi-arabic\": _notoKufiArabic,\n\t\"noto-music\": _notoMusic,\n\t\"noto-naskh-arabic\": _notoNaskhArabic,\n\t\"noto-nastaliq-urdu\": _notoNastaliqUrdu,\n\t\"noto-rashi-hebrew\": _notoRashiHebrew,\n\t\"noto-sans-adlam-unjoined\": _notoSansAdlamUnjoined,\n\t\"noto-sans-adlam\": _notoSansAdlam,\n\t\"noto-sans-anatolian-hieroglyphs\": _notoSansAnatolianHieroglyphs,\n\t\"noto-sans-arabic\": _notoSansArabic,\n\t\"noto-sans-armenian\": _notoSansArmenian,\n\t\"noto-sans-avestan\": _notoSansAvestan,\n\t\"noto-sans-balinese\": _notoSansBalinese,\n\t\"noto-sans-bamum\": _notoSansBamum,\n\t\"noto-sans-bassa-vah\": _notoSansBassaVah,\n\t\"noto-sans-batak\": _notoSansBatak,\n\t\"noto-sans-bengali\": _notoSansBengali,\n\t\"noto-sans-bhaiksuki\": _notoSansBhaiksuki,\n\t\"noto-sans-brahmi\": _notoSansBrahmi,\n\t\"noto-sans-buginese\": _notoSansBuginese,\n\t\"noto-sans-buhid\": _notoSansBuhid,\n\t\"noto-sans-canadian-aboriginal\": _notoSansCanadianAboriginal,\n\t\"noto-sans-carian\": _notoSansCarian,\n\t\"noto-sans-caucasian-albanian\": _notoSansCaucasianAlbanian,\n\t\"noto-sans-chakma\": _notoSansChakma,\n\t\"noto-sans-cham\": _notoSansCham,\n\t\"noto-sans-cherokee\": _notoSansCherokee,\n\t\"noto-sans-chorasmian\": _notoSansChorasmian,\n\t\"noto-sans-coptic\": _notoSansCoptic,\n\t\"noto-sans-cuneiform\": _notoSansCuneiform,\n\t\"noto-sans-cypriot\": _notoSansCypriot,\n\t\"noto-sans-cypro-minoan\": _notoSansCyproMinoan,\n\t\"noto-sans-deseret\": _notoSansDeseret,\n\t\"noto-sans-devanagari\": _notoSansDevanagari,\n\t\"noto-sans-display\": _notoSansDisplay,\n\t\"noto-sans-duployan\": _notoSansDuployan,\n\t\"noto-sans-egyptian-hieroglyphs\": _notoSansEgyptianHieroglyphs,\n\t\"noto-sans-elbasan\": _notoSansElbasan,\n\t\"noto-sans-elymaic\": _notoSansElymaic,\n\t\"noto-sans-ethiopic\": _notoSansEthiopic,\n\t\"noto-sans-georgian\": _notoSansGeorgian,\n\t\"noto-sans-glagolitic\": _notoSansGlagolitic,\n\t\"noto-sans-gothic\": _notoSansGothic,\n\t\"noto-sans-grantha\": _notoSansGrantha,\n\t\"noto-sans-gujarati\": _notoSansGujarati,\n\t\"noto-sans-gunjala-gondi\": _notoSansGunjalaGondi,\n\t\"noto-sans-gurmukhi\": _notoSansGurmukhi,\n\t\"noto-sans-hanifi-rohingya\": _notoSansHanifiRohingya,\n\t\"noto-sans-hanunoo\": _notoSansHanunoo,\n\t\"noto-sans-hatran\": _notoSansHatran,\n\t\"noto-sans-hebrew\": _notoSansHebrew,\n\t\"noto-sans-hk\": _notoSansHk,\n\t\"noto-sans-imperial-aramaic\": _notoSansImperialAramaic,\n\t\"noto-sans-indic-siyaq-numbers\": _notoSansIndicSiyaqNumbers,\n\t\"noto-sans-inscriptional-pahlavi\": _notoSansInscriptionalPahlavi,\n\t\"noto-sans-inscriptional-parthian\": _notoSansInscriptionalParthian,\n\t\"noto-sans-javanese\": _notoSansJavanese,\n\t\"noto-sans-jp\": _notoSansJp,\n\t\"noto-sans-kaithi\": _notoSansKaithi,\n\t\"noto-sans-kannada\": _notoSansKannada,\n\t\"noto-sans-kawi\": _notoSansKawi,\n\t\"noto-sans-kayah-li\": _notoSansKayahLi,\n\t\"noto-sans-kharoshthi\": _notoSansKharoshthi,\n\t\"noto-sans-khmer\": _notoSansKhmer,\n\t\"noto-sans-khojki\": _notoSansKhojki,\n\t\"noto-sans-khudawadi\": _notoSansKhudawadi,\n\t\"noto-sans-kr\": _notoSansKr,\n\t\"noto-sans-lao-looped\": _notoSansLaoLooped,\n\t\"noto-sans-lao\": _notoSansLao,\n\t\"noto-sans-lepcha\": _notoSansLepcha,\n\t\"noto-sans-limbu\": _notoSansLimbu,\n\t\"noto-sans-linear-a\": _notoSansLinearA,\n\t\"noto-sans-linear-b\": _notoSansLinearB,\n\t\"noto-sans-lisu\": _notoSansLisu,\n\t\"noto-sans-lydian\": _notoSansLydian,\n\t\"noto-sans-mahajani\": _notoSansMahajani,\n\t\"noto-sans-malayalam\": _notoSansMalayalam,\n\t\"noto-sans-mandaic\": _notoSansMandaic,\n\t\"noto-sans-manichaean\": _notoSansManichaean,\n\t\"noto-sans-marchen\": _notoSansMarchen,\n\t\"noto-sans-masaram-gondi\": _notoSansMasaramGondi,\n\t\"noto-sans-math\": _notoSansMath,\n\t\"noto-sans-mayan-numerals\": _notoSansMayanNumerals,\n\t\"noto-sans-medefaidrin\": _notoSansMedefaidrin,\n\t\"noto-sans-meetei-mayek\": _notoSansMeeteiMayek,\n\t\"noto-sans-mende-kikakui\": _notoSansMendeKikakui,\n\t\"noto-sans-meroitic\": _notoSansMeroitic,\n\t\"noto-sans-miao\": _notoSansMiao,\n\t\"noto-sans-modi\": _notoSansModi,\n\t\"noto-sans-mongolian\": _notoSansMongolian,\n\t\"noto-sans-mono\": _notoSansMono,\n\t\"noto-sans-mro\": _notoSansMro,\n\t\"noto-sans-multani\": _notoSansMultani,\n\t\"noto-sans-myanmar\": _notoSansMyanmar,\n\t\"noto-sans-nabataean\": _notoSansNabataean,\n\t\"noto-sans-nag-mundari\": _notoSansNagMundari,\n\t\"noto-sans-nandinagari\": _notoSansNandinagari,\n\t\"noto-sans-new-tai-lue\": _notoSansNewTaiLue,\n\t\"noto-sans-newa\": _notoSansNewa,\n\t\"noto-sans-nko-unjoined\": _notoSansNkoUnjoined,\n\t\"noto-sans-nko\": _notoSansNko,\n\t\"noto-sans-nushu\": _notoSansNushu,\n\t\"noto-sans-ogham\": _notoSansOgham,\n\t\"noto-sans-ol-chiki\": _notoSansOlChiki,\n\t\"noto-sans-old-hungarian\": _notoSansOldHungarian,\n\t\"noto-sans-old-italic\": _notoSansOldItalic,\n\t\"noto-sans-old-north-arabian\": _notoSansOldNorthArabian,\n\t\"noto-sans-old-permic\": _notoSansOldPermic,\n\t\"noto-sans-old-persian\": _notoSansOldPersian,\n\t\"noto-sans-old-sogdian\": _notoSansOldSogdian,\n\t\"noto-sans-old-south-arabian\": _notoSansOldSouthArabian,\n\t\"noto-sans-old-turkic\": _notoSansOldTurkic,\n\t\"noto-sans-oriya\": _notoSansOriya,\n\t\"noto-sans-osage\": _notoSansOsage,\n\t\"noto-sans-osmanya\": _notoSansOsmanya,\n\t\"noto-sans-pahawh-hmong\": _notoSansPahawhHmong,\n\t\"noto-sans-palmyrene\": _notoSansPalmyrene,\n\t\"noto-sans-pau-cin-hau\": _notoSansPauCinHau,\n\t\"noto-sans-phagspa\": _notoSansPhagspa,\n\t\"noto-sans-phoenician\": _notoSansPhoenician,\n\t\"noto-sans-psalter-pahlavi\": _notoSansPsalterPahlavi,\n\t\"noto-sans-rejang\": _notoSansRejang,\n\t\"noto-sans-runic\": _notoSansRunic,\n\t\"noto-sans-samaritan\": _notoSansSamaritan,\n\t\"noto-sans-saurashtra\": _notoSansSaurashtra,\n\t\"noto-sans-sc\": _notoSansSc,\n\t\"noto-sans-sharada\": _notoSansSharada,\n\t\"noto-sans-shavian\": _notoSansShavian,\n\t\"noto-sans-siddham\": _notoSansSiddham,\n\t\"noto-sans-signwriting\": _notoSansSignwriting,\n\t\"noto-sans-sinhala\": _notoSansSinhala,\n\t\"noto-sans-sogdian\": _notoSansSogdian,\n\t\"noto-sans-sora-sompeng\": _notoSansSoraSompeng,\n\t\"noto-sans-soyombo\": _notoSansSoyombo,\n\t\"noto-sans-sundanese\": _notoSansSundanese,\n\t\"noto-sans-sunuwar\": _notoSansSunuwar,\n\t\"noto-sans-syloti-nagri\": _notoSansSylotiNagri,\n\t\"noto-sans-symbols-2\": _notoSansSymbols2,\n\t\"noto-sans-symbols\": _notoSansSymbols,\n\t\"noto-sans-syriac-eastern\": _notoSansSyriacEastern,\n\t\"noto-sans-syriac-western\": _notoSansSyriacWestern,\n\t\"noto-sans-syriac\": _notoSansSyriac,\n\t\"noto-sans-tagalog\": _notoSansTagalog,\n\t\"noto-sans-tagbanwa\": _notoSansTagbanwa,\n\t\"noto-sans-tai-le\": _notoSansTaiLe,\n\t\"noto-sans-tai-tham\": _notoSansTaiTham,\n\t\"noto-sans-tai-viet\": _notoSansTaiViet,\n\t\"noto-sans-takri\": _notoSansTakri,\n\t\"noto-sans-tamil-supplement\": _notoSansTamilSupplement,\n\t\"noto-sans-tamil\": _notoSansTamil,\n\t\"noto-sans-tangsa\": _notoSansTangsa,\n\t\"noto-sans-tc\": _notoSansTc,\n\t\"noto-sans-telugu\": _notoSansTelugu,\n\t\"noto-sans-thaana\": _notoSansThaana,\n\t\"noto-sans-thai-looped\": _notoSansThaiLooped,\n\t\"noto-sans-thai\": _notoSansThai,\n\t\"noto-sans-tifinagh\": _notoSansTifinagh,\n\t\"noto-sans-tirhuta\": _notoSansTirhuta,\n\t\"noto-sans-ugaritic\": _notoSansUgaritic,\n\t\"noto-sans-vai\": _notoSansVai,\n\t\"noto-sans-vithkuqi\": _notoSansVithkuqi,\n\t\"noto-sans-wancho\": _notoSansWancho,\n\t\"noto-sans-warang-citi\": _notoSansWarangCiti,\n\t\"noto-sans-yi\": _notoSansYi,\n\t\"noto-sans-zanabazar-square\": _notoSansZanabazarSquare,\n\t\"noto-sans\": _notoSans,\n\t\"noto-serif-ahom\": _notoSerifAhom,\n\t\"noto-serif-armenian\": _notoSerifArmenian,\n\t\"noto-serif-balinese\": _notoSerifBalinese,\n\t\"noto-serif-bengali\": _notoSerifBengali,\n\t\"noto-serif-devanagari\": _notoSerifDevanagari,\n\t\"noto-serif-display\": _notoSerifDisplay,\n\t\"noto-serif-dives-akuru\": _notoSerifDivesAkuru,\n\t\"noto-serif-dogra\": _notoSerifDogra,\n\t\"noto-serif-ethiopic\": _notoSerifEthiopic,\n\t\"noto-serif-georgian\": _notoSerifGeorgian,\n\t\"noto-serif-grantha\": _notoSerifGrantha,\n\t\"noto-serif-gujarati\": _notoSerifGujarati,\n\t\"noto-serif-gurmukhi\": _notoSerifGurmukhi,\n\t\"noto-serif-hebrew\": _notoSerifHebrew,\n\t\"noto-serif-hentaigana\": _notoSerifHentaigana,\n\t\"noto-serif-hk\": _notoSerifHk,\n\t\"noto-serif-jp\": _notoSerifJp,\n\t\"noto-serif-kannada\": _notoSerifKannada,\n\t\"noto-serif-khitan-small-script\": _notoSerifKhitanSmallScript,\n\t\"noto-serif-khmer\": _notoSerifKhmer,\n\t\"noto-serif-khojki\": _notoSerifKhojki,\n\t\"noto-serif-kr\": _notoSerifKr,\n\t\"noto-serif-lao\": _notoSerifLao,\n\t\"noto-serif-makasar\": _notoSerifMakasar,\n\t\"noto-serif-malayalam\": _notoSerifMalayalam,\n\t\"noto-serif-np-hmong\": _notoSerifNpHmong,\n\t\"noto-serif-old-uyghur\": _notoSerifOldUyghur,\n\t\"noto-serif-oriya\": _notoSerifOriya,\n\t\"noto-serif-ottoman-siyaq\": _notoSerifOttomanSiyaq,\n\t\"noto-serif-sc\": _notoSerifSc,\n\t\"noto-serif-sinhala\": _notoSerifSinhala,\n\t\"noto-serif-tamil\": _notoSerifTamil,\n\t\"noto-serif-tangut\": _notoSerifTangut,\n\t\"noto-serif-tc\": _notoSerifTc,\n\t\"noto-serif-telugu\": _notoSerifTelugu,\n\t\"noto-serif-thai\": _notoSerifThai,\n\t\"noto-serif-tibetan\": _notoSerifTibetan,\n\t\"noto-serif-todhri\": _notoSerifTodhri,\n\t\"noto-serif-toto\": _notoSerifToto,\n\t\"noto-serif-vithkuqi\": _notoSerifVithkuqi,\n\t\"noto-serif-yezidi\": _notoSerifYezidi,\n\t\"noto-serif\": _notoSerif,\n\t\"noto-traditional-nushu\": _notoTraditionalNushu,\n\t\"noto-znamenny-musical-notation\": _notoZnamennyMusicalNotation,\n\t\"nouvelle-grotesquerie\": _nouvelleGrotesquerie,\n\t\"nova-cut\": _novaCut,\n\t\"nova-flat\": _novaFlat,\n\t\"nova-mono\": _novaMono,\n\t\"nova-oval\": _novaOval,\n\t\"nova-round\": _novaRound,\n\t\"nova-script\": _novaScript,\n\t\"nova-slim\": _novaSlim,\n\t\"nova-square\": _novaSquare,\n\tnow: _now,\n\tntr: _ntr,\n\tnumans: _numans,\n\t\"nunito-sans\": _nunitoSans,\n\tnunito: _nunito,\n\t\"nuosu-sil\": _nuosuSil,\n\t\"n\u00E9o-castel\": _nOCastel,\n\t\"odibee-sans\": _odibeeSans,\n\t\"odor-mean-chey\": _odorMeanChey,\n\toffside: _offside,\n\toi: _oi,\n\tojuju: _ojuju,\n\t\"old-standard-tt\": _oldStandardTt,\n\toldenburg: _oldenburg,\n\tole: _ole,\n\t\"oleo-script-swash-caps\": _oleoScriptSwashCaps,\n\t\"oleo-script\": _oleoScript,\n\tonest: _onest,\n\t\"oooh-baby\": _ooohBaby,\n\t\"open-runde\": _openRunde,\n\t\"open-sans\": _openSans,\n\t\"open-sauce-one\": _openSauceOne,\n\t\"open-sauce-sans\": _openSauceSans,\n\t\"open-sauce-two\": _openSauceTwo,\n\t\"opening-hours-sans\": _openingHoursSans,\n\t\"optician-sans\": _opticianSans,\n\toranienbaum: _oranienbaum,\n\torbit: _orbit,\n\torbitron: _orbitron,\n\toregano: _oregano,\n\t\"orelega-one\": _orelegaOne,\n\torienta: _orienta,\n\t\"original-surfer\": _originalSurfer,\n\t\"ortica-angular\": _orticaAngular,\n\t\"ortica-linear\": _orticaLinear,\n\toswald: _oswald,\n\toutfit: _outfit,\n\t\"over-the-rainbow\": _overTheRainbow,\n\t\"overlock-sc\": _overlockSc,\n\toverlock: _overlock,\n\t\"overpass-mono\": _overpassMono,\n\toverpass: _overpass,\n\tovo: _ovo,\n\toxanium: _oxanium,\n\t\"oxygen-mono\": _oxygenMono,\n\toxygen: _oxygen,\n\tpacifico: _pacifico,\n\tpadauk: _padauk,\n\t\"padyakke-expanded-one\": _padyakkeExpandedOne,\n\t\"palanquin-dark\": _palanquinDark,\n\tpalanquin: _palanquin,\n\t\"palette-mosaic\": _paletteMosaic,\n\tpally: _pally,\n\tpanchang: _panchang,\n\tpangolin: _pangolin,\n\tpaprika: _paprika,\n\tpaquito: _paquito,\n\tparastoo: _parastoo,\n\tparisienne: _parisienne,\n\tparkinsans: _parkinsans,\n\t\"passero-one\": _passeroOne,\n\t\"passion-one\": _passionOne,\n\t\"passions-conflict\": _passionsConflict,\n\t\"pathway-extreme\": _pathwayExtreme,\n\t\"pathway-gothic-one\": _pathwayGothicOne,\n\t\"patrick-hand-sc\": _patrickHandSc,\n\t\"patrick-hand\": _patrickHand,\n\tpatriot: _patriot,\n\tpattaya: _pattaya,\n\t\"patua-one\": _patuaOne,\n\tpavanam: _pavanam,\n\t\"paytone-one\": _paytoneOne,\n\tpecita: _pecita,\n\tpeddana: _peddana,\n\tpencerio: _pencerio,\n\tperalta: _peralta,\n\t\"permanent-marker\": _permanentMarker,\n\tpetemoss: _petemoss,\n\t\"petit-formal-script\": _petitFormalScript,\n\tpetrona: _petrona,\n\tphilosopher: _philosopher,\n\tphudu: _phudu,\n\tpiazzolla: _piazzolla,\n\tpiedra: _piedra,\n\t\"pilcrow-rounded\": _pilcrowRounded,\n\t\"pinyon-script\": _pinyonScript,\n\t\"pirata-one\": _pirataOne,\n\tpixelcastle: _pixelcastle,\n\t\"pixelify-sans\": _pixelifySans,\n\tplaster: _plaster,\n\tplatypi: _platypi,\n\tplay: _play,\n\tplayball: _playball,\n\t\"player-sans-mono-8x8\": _playerSansMono8x8,\n\t\"playfair-display-sc\": _playfairDisplaySc,\n\t\"playfair-display\": _playfairDisplay,\n\tplayfair: _playfair,\n\t\"playpen-sans-arabic\": _playpenSansArabic,\n\t\"playpen-sans-deva\": _playpenSansDeva,\n\t\"playpen-sans-hebrew\": _playpenSansHebrew,\n\t\"playpen-sans-thai\": _playpenSansThai,\n\t\"playpen-sans\": _playpenSans,\n\t\"playwrite-ar-guides\": _playwriteArGuides,\n\t\"playwrite-ar\": _playwriteAr,\n\t\"playwrite-at-guides\": _playwriteAtGuides,\n\t\"playwrite-at\": _playwriteAt,\n\t\"playwrite-au-nsw-guides\": _playwriteAuNswGuides,\n\t\"playwrite-au-nsw\": _playwriteAuNsw,\n\t\"playwrite-au-qld-guides\": _playwriteAuQldGuides,\n\t\"playwrite-au-qld\": _playwriteAuQld,\n\t\"playwrite-au-sa-guides\": _playwriteAuSaGuides,\n\t\"playwrite-au-sa\": _playwriteAuSa,\n\t\"playwrite-au-tas-guides\": _playwriteAuTasGuides,\n\t\"playwrite-au-tas\": _playwriteAuTas,\n\t\"playwrite-au-vic-guides\": _playwriteAuVicGuides,\n\t\"playwrite-au-vic\": _playwriteAuVic,\n\t\"playwrite-be-vlg-guides\": _playwriteBeVlgGuides,\n\t\"playwrite-be-vlg\": _playwriteBeVlg,\n\t\"playwrite-be-wal-guides\": _playwriteBeWalGuides,\n\t\"playwrite-be-wal\": _playwriteBeWal,\n\t\"playwrite-br-guides\": _playwriteBrGuides,\n\t\"playwrite-br\": _playwriteBr,\n\t\"playwrite-ca-guides\": _playwriteCaGuides,\n\t\"playwrite-ca\": _playwriteCa,\n\t\"playwrite-cl-guides\": _playwriteClGuides,\n\t\"playwrite-cl\": _playwriteCl,\n\t\"playwrite-co-guides\": _playwriteCoGuides,\n\t\"playwrite-co\": _playwriteCo,\n\t\"playwrite-cu-guides\": _playwriteCuGuides,\n\t\"playwrite-cu\": _playwriteCu,\n\t\"playwrite-cz-guides\": _playwriteCzGuides,\n\t\"playwrite-cz\": _playwriteCz,\n\t\"playwrite-de-grund-guides\": _playwriteDeGrundGuides,\n\t\"playwrite-de-grund\": _playwriteDeGrund,\n\t\"playwrite-de-la-guides\": _playwriteDeLaGuides,\n\t\"playwrite-de-la\": _playwriteDeLa,\n\t\"playwrite-de-sas-guides\": _playwriteDeSasGuides,\n\t\"playwrite-de-sas\": _playwriteDeSas,\n\t\"playwrite-de-va-guides\": _playwriteDeVaGuides,\n\t\"playwrite-de-va\": _playwriteDeVa,\n\t\"playwrite-dk-loopet-guides\": _playwriteDkLoopetGuides,\n\t\"playwrite-dk-loopet\": _playwriteDkLoopet,\n\t\"playwrite-dk-uloopet-guides\": _playwriteDkUloopetGuides,\n\t\"playwrite-dk-uloopet\": _playwriteDkUloopet,\n\t\"playwrite-es-deco-guides\": _playwriteEsDecoGuides,\n\t\"playwrite-es-deco\": _playwriteEsDeco,\n\t\"playwrite-es-guides\": _playwriteEsGuides,\n\t\"playwrite-es\": _playwriteEs,\n\t\"playwrite-fr-moderne-guides\": _playwriteFrModerneGuides,\n\t\"playwrite-fr-moderne\": _playwriteFrModerne,\n\t\"playwrite-fr-trad-guides\": _playwriteFrTradGuides,\n\t\"playwrite-fr-trad\": _playwriteFrTrad,\n\t\"playwrite-gb-j-guides\": _playwriteGbJGuides,\n\t\"playwrite-gb-j\": _playwriteGbJ,\n\t\"playwrite-gb-s-guides\": _playwriteGbSGuides,\n\t\"playwrite-gb-s\": _playwriteGbS,\n\t\"playwrite-hr-guides\": _playwriteHrGuides,\n\t\"playwrite-hr-lijeva-guides\": _playwriteHrLijevaGuides,\n\t\"playwrite-hr-lijeva\": _playwriteHrLijeva,\n\t\"playwrite-hr\": _playwriteHr,\n\t\"playwrite-hu-guides\": _playwriteHuGuides,\n\t\"playwrite-hu\": _playwriteHu,\n\t\"playwrite-id-guides\": _playwriteIdGuides,\n\t\"playwrite-id\": _playwriteId,\n\t\"playwrite-ie-guides\": _playwriteIeGuides,\n\t\"playwrite-ie\": _playwriteIe,\n\t\"playwrite-in-guides\": _playwriteInGuides,\n\t\"playwrite-in\": _playwriteIn,\n\t\"playwrite-is-guides\": _playwriteIsGuides,\n\t\"playwrite-is\": _playwriteIs,\n\t\"playwrite-it-moderna-guides\": _playwriteItModernaGuides,\n\t\"playwrite-it-moderna\": _playwriteItModerna,\n\t\"playwrite-it-trad-guides\": _playwriteItTradGuides,\n\t\"playwrite-it-trad\": _playwriteItTrad,\n\t\"playwrite-mx-guides\": _playwriteMxGuides,\n\t\"playwrite-mx\": _playwriteMx,\n\t\"playwrite-ng-modern-guides\": _playwriteNgModernGuides,\n\t\"playwrite-ng-modern\": _playwriteNgModern,\n\t\"playwrite-nl-guides\": _playwriteNlGuides,\n\t\"playwrite-nl\": _playwriteNl,\n\t\"playwrite-no-guides\": _playwriteNoGuides,\n\t\"playwrite-no\": _playwriteNo,\n\t\"playwrite-nz-basic-guides\": _playwriteNzBasicGuides,\n\t\"playwrite-nz-basic\": _playwriteNzBasic,\n\t\"playwrite-nz-guides\": _playwriteNzGuides,\n\t\"playwrite-nz\": _playwriteNz,\n\t\"playwrite-pe-guides\": _playwritePeGuides,\n\t\"playwrite-pe\": _playwritePe,\n\t\"playwrite-pl-guides\": _playwritePlGuides,\n\t\"playwrite-pl\": _playwritePl,\n\t\"playwrite-pt-guides\": _playwritePtGuides,\n\t\"playwrite-pt\": _playwritePt,\n\t\"playwrite-ro-guides\": _playwriteRoGuides,\n\t\"playwrite-ro\": _playwriteRo,\n\t\"playwrite-sk-guides\": _playwriteSkGuides,\n\t\"playwrite-sk\": _playwriteSk,\n\t\"playwrite-tz-guides\": _playwriteTzGuides,\n\t\"playwrite-tz\": _playwriteTz,\n\t\"playwrite-us-modern-guides\": _playwriteUsModernGuides,\n\t\"playwrite-us-modern\": _playwriteUsModern,\n\t\"playwrite-us-trad-guides\": _playwriteUsTradGuides,\n\t\"playwrite-us-trad\": _playwriteUsTrad,\n\t\"playwrite-vn-guides\": _playwriteVnGuides,\n\t\"playwrite-vn\": _playwriteVn,\n\t\"playwrite-za-guides\": _playwriteZaGuides,\n\t\"playwrite-za\": _playwriteZa,\n\tplein: _plein,\n\t\"plus-jakarta-sans\": _plusJakartaSans,\n\tpochaevsk: _pochaevsk,\n\tpodkova: _podkova,\n\t\"poetsen-one\": _poetsenOne,\n\t\"poiret-one\": _poiretOne,\n\t\"poller-one\": _pollerOne,\n\t\"poltawski-nowy\": _poltawskiNowy,\n\tpoly: _poly,\n\tpompiere: _pompiere,\n\tponnala: _ponnala,\n\tponomar: _ponomar,\n\t\"pontano-sans\": _pontanoSans,\n\t\"poor-story\": _poorStory,\n\tpoppins: _poppins,\n\t\"port-lligat-sans\": _portLligatSans,\n\t\"port-lligat-slab\": _portLligatSlab,\n\t\"potta-one\": _pottaOne,\n\t\"pragati-narrow\": _pragatiNarrow,\n\tpraise: _praise,\n\t\"pramukh-rounded\": _pramukhRounded,\n\tprata: _prata,\n\tpreahvihear: _preahvihear,\n\t\"press-start-2p\": _pressStart2p,\n\t\"pretendard-variable\": _pretendardVariable,\n\tpridi: _pridi,\n\t\"princess-sofia\": _princessSofia,\n\tprociono: _prociono,\n\t\"projekt-blackbird\": _projektBlackbird,\n\tprompt: _prompt,\n\t\"prosto-one\": _prostoOne,\n\t\"protest-guerrilla\": _protestGuerrilla,\n\t\"protest-revolution\": _protestRevolution,\n\t\"protest-riot\": _protestRiot,\n\t\"protest-strike\": _protestStrike,\n\t\"proza-libre\": _prozaLibre,\n\t\"pt-mono\": _ptMono,\n\t\"pt-sans-caption\": _ptSansCaption,\n\t\"pt-sans-narrow\": _ptSansNarrow,\n\t\"pt-sans\": _ptSans,\n\t\"pt-serif-caption\": _ptSerifCaption,\n\t\"pt-serif\": _ptSerif,\n\t\"public-sans\": _publicSans,\n\t\"puppies-play\": _puppiesPlay,\n\tpuritan: _puritan,\n\t\"purple-purse\": _purplePurse,\n\tpushster: _pushster,\n\tqahiri: _qahiri,\n\tquando: _quando,\n\tquantico: _quantico,\n\tquarantype: _quarantype,\n\t\"quattrocento-sans\": _quattrocentoSans,\n\tquattrocento: _quattrocento,\n\tquestrial: _questrial,\n\tquicksand: _quicksand,\n\tquilon: _quilon,\n\tquintessential: _quintessential,\n\tqwigley: _qwigley,\n\t\"qwitcher-grypen\": _qwitcherGrypen,\n\t\"racing-sans-one\": _racingSansOne,\n\t\"radio-canada-big\": _radioCanadaBig,\n\t\"radio-canada\": _radioCanada,\n\tradley: _radley,\n\trag: _rag,\n\trajdhani: _rajdhani,\n\trakkas: _rakkas,\n\t\"raleway-dots\": _ralewayDots,\n\traleway: _raleway,\n\tramabhadra: _ramabhadra,\n\tramaraja: _ramaraja,\n\trambla: _rambla,\n\t\"rammetto-one\": _rammettoOne,\n\t\"rampart-one\": _rampartOne,\n\tramsina: _ramsina,\n\tranade: _ranade,\n\tranchers: _ranchers,\n\trancho: _rancho,\n\tranga: _ranga,\n\trasa: _rasa,\n\trationale: _rationale,\n\t\"raveo-variable\": _raveoVariable,\n\t\"ravi-prakash\": _raviPrakash,\n\t\"readex-pro\": _readexPro,\n\trechteck: _rechteck,\n\trecia: _recia,\n\trecursive: _recursive,\n\t\"red-hat-display\": _redHatDisplay,\n\t\"red-hat-mono\": _redHatMono,\n\t\"red-hat-text\": _redHatText,\n\t\"red-rose\": _redRose,\n\t\"redacted-script\": _redactedScript,\n\tredacted: _redacted,\n\t\"reddit-mono\": _redditMono,\n\t\"reddit-sans-condensed\": _redditSansCondensed,\n\t\"reddit-sans\": _redditSans,\n\tredressed: _redressed,\n\t\"reem-kufi-fun\": _reemKufiFun,\n\t\"reem-kufi-ink\": _reemKufiInk,\n\t\"reem-kufi\": _reemKufi,\n\t\"reenie-beanie\": _reenieBeanie,\n\t\"reggae-one\": _reggaeOne,\n\trem: _rem,\n\trena: _rena,\n\t\"rethink-sans\": _rethinkSans,\n\trevalia: _revalia,\n\t\"rhodium-libre\": _rhodiumLibre,\n\tribes: _ribes,\n\t\"ribeye-marrow\": _ribeyeMarrow,\n\tribeye: _ribeye,\n\trighteous: _righteous,\n\trisque: _risque,\n\t\"road-rage\": _roadRage,\n\t\"roboto-condensed\": _robotoCondensed,\n\t\"roboto-flex\": _robotoFlex,\n\t\"roboto-mono\": _robotoMono,\n\t\"roboto-serif\": _robotoSerif,\n\t\"roboto-slab\": _robotoSlab,\n\troboto: _roboto,\n\trochester: _rochester,\n\t\"rock-3d\": _rock3d,\n\t\"rock-salt\": _rockSalt,\n\t\"rocknroll-one\": _rocknrollOne,\n\trokkitt: _rokkitt,\n\tromanesco: _romanesco,\n\tronzino: _ronzino,\n\t\"ropa-sans\": _ropaSans,\n\trosaline: _rosaline,\n\trosario: _rosario,\n\trosarivo: _rosarivo,\n\t\"rouge-script\": _rougeScript,\n\troundo: _roundo,\n\trowan: _rowan,\n\trowdies: _rowdies,\n\t\"rozha-one\": _rozhaOne,\n\t\"rubik-80s-fade\": _rubik80sFade,\n\t\"rubik-beastly\": _rubikBeastly,\n\t\"rubik-broken-fax\": _rubikBrokenFax,\n\t\"rubik-bubbles\": _rubikBubbles,\n\t\"rubik-burned\": _rubikBurned,\n\t\"rubik-dirt\": _rubikDirt,\n\t\"rubik-distressed\": _rubikDistressed,\n\t\"rubik-doodle-shadow\": _rubikDoodleShadow,\n\t\"rubik-doodle-triangles\": _rubikDoodleTriangles,\n\t\"rubik-gemstones\": _rubikGemstones,\n\t\"rubik-glitch-pop\": _rubikGlitchPop,\n\t\"rubik-glitch\": _rubikGlitch,\n\t\"rubik-iso\": _rubikIso,\n\t\"rubik-lines\": _rubikLines,\n\t\"rubik-maps\": _rubikMaps,\n\t\"rubik-marker-hatch\": _rubikMarkerHatch,\n\t\"rubik-maze\": _rubikMaze,\n\t\"rubik-microbe\": _rubikMicrobe,\n\t\"rubik-mono-one\": _rubikMonoOne,\n\t\"rubik-moonrocks\": _rubikMoonrocks,\n\t\"rubik-pixels\": _rubikPixels,\n\t\"rubik-puddles\": _rubikPuddles,\n\t\"rubik-scribble\": _rubikScribble,\n\t\"rubik-spray-paint\": _rubikSprayPaint,\n\t\"rubik-storm\": _rubikStorm,\n\t\"rubik-vinyl\": _rubikVinyl,\n\t\"rubik-wet-paint\": _rubikWetPaint,\n\trubik: _rubik,\n\truda: _ruda,\n\trufina: _rufina,\n\t\"ruge-boogie\": _rugeBoogie,\n\truluko: _ruluko,\n\t\"rum-raisin\": _rumRaisin,\n\t\"ruslan-display\": _ruslanDisplay,\n\t\"russo-one\": _russoOne,\n\truthie: _ruthie,\n\truwudu: _ruwudu,\n\trx100: _rx100,\n\trye: _rye,\n\tsacramento: _sacramento,\n\tsahitya: _sahitya,\n\tsail: _sail,\n\t\"saira-condensed\": _sairaCondensed,\n\t\"saira-extra-condensed\": _sairaExtraCondensed,\n\t\"saira-semi-condensed\": _sairaSemiCondensed,\n\t\"saira-stencil-one\": _sairaStencilOne,\n\t\"saira-stencil\": _sairaStencil,\n\tsaira: _saira,\n\tsalsa: _salsa,\n\tsanchez: _sanchez,\n\tsancreek: _sancreek,\n\t\"sankofa-display\": _sankofaDisplay,\n\tsansation: _sansation,\n\t\"sansita-swashed\": _sansitaSwashed,\n\tsansita: _sansita,\n\tsarabun: _sarabun,\n\tsarala: _sarala,\n\tsarina: _sarina,\n\tsarpanch: _sarpanch,\n\t\"sassy-frass\": _sassyFrass,\n\tsatisfy: _satisfy,\n\tsatoshi: _satoshi,\n\tsavate: _savate,\n\t\"sawarabi-gothic\": _sawarabiGothic,\n\t\"sawarabi-mincho\": _sawarabiMincho,\n\tscada: _scada,\n\t\"scheherazade-new\": _scheherazadeNew,\n\t\"schibsted-grotesk\": _schibstedGrotesk,\n\tschoolbell: _schoolbell,\n\t\"schroffer-mono\": _schrofferMono,\n\t\"science-gothic\": _scienceGothic,\n\t\"scope-one\": _scopeOne,\n\t\"seaweed-script\": _seaweedScript,\n\t\"secular-one\": _secularOne,\n\t\"sedan-sc\": _sedanSc,\n\tsedan: _sedan,\n\t\"sedgwick-ave-display\": _sedgwickAveDisplay,\n\t\"sedgwick-ave\": _sedgwickAve,\n\tsegment: _segment,\n\tsekuya: _sekuya,\n\tsen: _sen,\n\t\"send-flowers\": _sendFlowers,\n\tsentient: _sentient,\n\t\"server-mono\": _serverMono,\n\tsevillana: _sevillana,\n\t\"seymour-one\": _seymourOne,\n\t\"shadows-into-light-two\": _shadowsIntoLightTwo,\n\t\"shadows-into-light\": _shadowsIntoLight,\n\tshafarik: _shafarik,\n\tshalimar: _shalimar,\n\t\"shantell-sans\": _shantellSans,\n\tshanti: _shanti,\n\t\"share-tech-mono\": _shareTechMono,\n\t\"share-tech\": _shareTech,\n\tshare: _share,\n\tsharpie: _sharpie,\n\t\"shippori-antique-b1\": _shipporiAntiqueB1,\n\t\"shippori-antique\": _shipporiAntique,\n\t\"shippori-mincho-b1\": _shipporiMinchoB1,\n\t\"shippori-mincho\": _shipporiMincho,\n\tshizuru: _shizuru,\n\tshojumaru: _shojumaru,\n\t\"short-stack\": _shortStack,\n\tshrikhand: _shrikhand,\n\t\"side-a-inflated\": _sideAInflated,\n\t\"sigmar-one\": _sigmarOne,\n\tsigmar: _sigmar,\n\t\"signika-negative\": _signikaNegative,\n\tsignika: _signika,\n\tsilkscreen: _silkscreen,\n\tsimonetta: _simonetta,\n\t\"single-day\": _singleDay,\n\tsinistre: _sinistre,\n\tsintony: _sintony,\n\t\"sirin-stencil\": _sirinStencil,\n\tsirivennela: _sirivennela,\n\t\"six-caps\": _sixCaps,\n\t\"sixtyfour-convergence\": _sixtyfourConvergence,\n\tsixtyfour: _sixtyfour,\n\tskranji: _skranji,\n\t\"slabo-13px\": _slabo13px,\n\t\"slabo-27px\": _slabo27px,\n\tslackey: _slackey,\n\t\"slackside-one\": _slacksideOne,\n\tsmokum: _smokum,\n\t\"smooch-sans\": _smoochSans,\n\tsmooch: _smooch,\n\tsmythe: _smythe,\n\t\"sn-pro\": _snPro,\n\tsneaky: _sneaky,\n\tsniglet: _sniglet,\n\tsnippet: _snippet,\n\t\"snowburst-one\": _snowburstOne,\n\t\"sofadi-one\": _sofadiOne,\n\t\"sofia-sans-condensed\": _sofiaSansCondensed,\n\t\"sofia-sans-extra-condensed\": _sofiaSansExtraCondensed,\n\t\"sofia-sans-semi-condensed\": _sofiaSansSemiCondensed,\n\t\"sofia-sans\": _sofiaSans,\n\tsofia: _sofia,\n\tsolitreo: _solitreo,\n\tsolway: _solway,\n\t\"sometype-mono\": _sometypeMono,\n\t\"song-myung\": _songMyung,\n\tsono: _sono,\n\t\"sonsie-one\": _sonsieOne,\n\tsora: _sora,\n\tsoria: _soria,\n\t\"sorts-mill-goudy\": _sortsMillGoudy,\n\t\"sour-gummy\": _sourGummy,\n\t\"source-code-pro\": _sourceCodePro,\n\t\"source-sans-3\": _sourceSans3,\n\t\"source-sans-pro\": _sourceSansPro,\n\t\"source-serif-4\": _sourceSerif4,\n\t\"source-serif-pro\": _sourceSerifPro,\n\t\"space-grotesk\": _spaceGrotesk,\n\t\"space-mono\": _spaceMono,\n\t\"special-elite\": _specialElite,\n\t\"special-gothic-condensed-one\": _specialGothicCondensedOne,\n\t\"special-gothic-expanded-one\": _specialGothicExpandedOne,\n\t\"special-gothic\": _specialGothic,\n\t\"spectral-sc\": _spectralSc,\n\tspectral: _spectral,\n\t\"spicy-rice\": _spicyRice,\n\tspinnaker: _spinnaker,\n\tspirax: _spirax,\n\tsplash: _splash,\n\t\"spline-sans-mono\": _splineSansMono,\n\t\"spline-sans\": _splineSans,\n\tsprat: _sprat,\n\t\"squada-one\": _squadaOne,\n\t\"square-peg\": _squarePeg,\n\t\"sree-krushnadevaraya\": _sreeKrushnadevaraya,\n\tsriracha: _sriracha,\n\tsrisakdi: _srisakdi,\n\t\"st-martin\": _stMartin,\n\tstaatliches: _staatliches,\n\t\"stack-sans-headline\": _stackSansHeadline,\n\t\"stack-sans-notch\": _stackSansNotch,\n\t\"stack-sans-text\": _stackSansText,\n\tstalemate: _stalemate,\n\t\"stalinist-one\": _stalinistOne,\n\tstardom: _stardom,\n\t\"stardos-stencil\": _stardosStencil,\n\t\"stick-no-bills\": _stickNoBills,\n\tstick: _stick,\n\t\"stint-ultra-condensed\": _stintUltraCondensed,\n\t\"stint-ultra-expanded\": _stintUltraExpanded,\n\t\"stix-two-math\": _stixTwoMath,\n\t\"stix-two-text\": _stixTwoText,\n\tstoke: _stoke,\n\t\"story-script\": _storyScript,\n\tstrait: _strait,\n\t\"strichpunkt-sans\": _strichpunktSans,\n\tstriper: _striper,\n\t\"style-script\": _styleScript,\n\tstylish: _stylish,\n\tstyro: _styro,\n\t\"sue-ellen-francisco\": _sueEllenFrancisco,\n\t\"suez-one\": _suezOne,\n\t\"sulphur-point\": _sulphurPoint,\n\tsumana: _sumana,\n\tsunflower: _sunflower,\n\tsunshiney: _sunshiney,\n\t\"supermercado-one\": _supermercadoOne,\n\tsupreme: _supreme,\n\tsura: _sura,\n\tsuranna: _suranna,\n\tsuravaram: _suravaram,\n\t\"suse-mono\": _suseMono,\n\tsuse: _suse,\n\tsuwannaphum: _suwannaphum,\n\t\"swanky-and-moo-moo\": _swankyAndMooMoo,\n\tswitzer: _switzer,\n\tsyncopate: _syncopate,\n\t\"syne-mono\": _syneMono,\n\t\"syne-tactile\": _syneTactile,\n\tsyne: _syne,\n\tsynonym: _synonym,\n\ttabular: _tabular,\n\t\"tac-one\": _tacOne,\n\ttachyo: _tachyo,\n\ttagesschrift: _tagesschrift,\n\t\"tai-heritage-pro\": _taiHeritagePro,\n\ttajawal: _tajawal,\n\ttangerine: _tangerine,\n\ttanker: _tanker,\n\ttanklager: _tanklager,\n\ttapestry: _tapestry,\n\ttaprom: _taprom,\n\t\"tasa-explorer-vf\": _tasaExplorerVf,\n\t\"tasa-explorer\": _tasaExplorer,\n\t\"tasa-orbiter-vf\": _tasaOrbiterVf,\n\t\"tasa-orbiter\": _tasaOrbiter,\n\ttauri: _tauri,\n\ttaviraj: _taviraj,\n\tteachers: _teachers,\n\ttechnor: _technor,\n\ttecnica: _tecnica,\n\tteko: _teko,\n\ttektur: _tektur,\n\ttelex: _telex,\n\ttelma: _telma,\n\t\"tenali-ramakrishna\": _tenaliRamakrishna,\n\t\"tenor-sans\": _tenorSans,\n\t\"terminal-grotesque\": _terminalGrotesque,\n\t\"text-me-one\": _textMeOne,\n\ttexturina: _texturina,\n\tthasadith: _thasadith,\n\t\"the-girl-next-door\": _theGirlNextDoor,\n\t\"the-nautigal\": _theNautigal,\n\t\"thestral-neue\": _thestralNeue,\n\ttienne: _tienne,\n\t\"tiktok-sans\": _tiktokSans,\n\ttillana: _tillana,\n\t\"tilt-neon\": _tiltNeon,\n\t\"tilt-prism\": _tiltPrism,\n\t\"tilt-warp\": _tiltWarp,\n\ttimmana: _timmana,\n\ttinos: _tinos,\n\ttiny5: _tiny5,\n\t\"tiro-bangla\": _tiroBangla,\n\t\"tiro-devanagari-hindi\": _tiroDevanagariHindi,\n\t\"tiro-devanagari-marathi\": _tiroDevanagariMarathi,\n\t\"tiro-devanagari-sanskrit\": _tiroDevanagariSanskrit,\n\t\"tiro-gurmukhi\": _tiroGurmukhi,\n\t\"tiro-kannada\": _tiroKannada,\n\t\"tiro-tamil\": _tiroTamil,\n\t\"tiro-telugu\": _tiroTelugu,\n\ttirra: _tirra,\n\t\"titan-one\": _titanOne,\n\t\"titillium-web\": _titilliumWeb,\n\t\"tmt-limkin-pixel\": _tmtLimkinPixel,\n\t\"tmt-limkin\": _tmtLimkin,\n\t\"tmt-mini-mochi\": _tmtMiniMochi,\n\t\"tmt-paint\": _tmtPaint,\n\ttomorrow: _tomorrow,\n\ttourney: _tourney,\n\t\"trade-winds\": _tradeWinds,\n\t\"train-one\": _trainOne,\n\t\"tranche-type\": _trancheType,\n\t\"transom-hoog\": _transomHoog,\n\t\"trench-slab\": _trenchSlab,\n\ttriodion: _triodion,\n\ttrirong: _trirong,\n\ttrispace: _trispace,\n\ttrocchi: _trocchi,\n\ttrochut: _trochut,\n\ttruculenta: _truculenta,\n\ttrykker: _trykker,\n\t\"tsukimi-rounded\": _tsukimiRounded,\n\ttuffy: _tuffy,\n\t\"tulpen-one\": _tulpenOne,\n\t\"turret-road\": _turretRoad,\n\t\"twinkle-star\": _twinkleStar,\n\t\"ubuntu-condensed\": _ubuntuCondensed,\n\t\"ubuntu-mono\": _ubuntuMono,\n\t\"ubuntu-sans-mono\": _ubuntuSansMono,\n\t\"ubuntu-sans\": _ubuntuSans,\n\tubuntu: _ubuntu,\n\tuchen: _uchen,\n\tufo: _ufo,\n\tultra: _ultra,\n\tunbounded: _unbounded,\n\t\"uncial-antiqua\": _uncialAntiqua,\n\t\"uncut-sans-variable\": _uncutSansVariable,\n\tundefined: _undefined,\n\tunderdog: _underdog,\n\t\"unica-one\": _unicaOne,\n\tunifrakturcook: _unifrakturcook,\n\tunifrakturmaguntia: _unifrakturmaguntia,\n\tunkempt: _unkempt,\n\tunlock: _unlock,\n\tunna: _unna,\n\tuoqmunthenkhung: _uoqmunthenkhung,\n\tupdock: _updock,\n\turbanist: _urbanist,\n\t\"urlaub-grotesk\": _urlaubGrotesk,\n\tutara: _utara,\n\t\"vampiro-one\": _vampiroOne,\n\t\"varela-round\": _varelaRound,\n\tvarela: _varela,\n\tvarta: _varta,\n\t\"vast-shadow\": _vastShadow,\n\tvazirmatn: _vazirmatn,\n\t\"vend-sans\": _vendSans,\n\t\"vesper-libre\": _vesperLibre,\n\t\"viaoda-libre\": _viaodaLibre,\n\tvibes: _vibes,\n\tvibur: _vibur,\n\t\"victor-mono\": _victorMono,\n\tvidaloka: _vidaloka,\n\tviga: _viga,\n\t\"vina-sans\": _vinaSans,\n\tvoces: _voces,\n\tvolkhov: _volkhov,\n\t\"vollkorn-sc\": _vollkornSc,\n\tvollkorn: _vollkorn,\n\tvoltaire: _voltaire,\n\tvoyager: _voyager,\n\tvt323: _vt323,\n\t\"vujahday-script\": _vujahdayScript,\n\t\"waiting-for-the-sunrise\": _waitingForTheSunrise,\n\twallpoet: _wallpoet,\n\t\"walter-turncoat\": _walterTurncoat,\n\twarnes: _warnes,\n\t\"water-brush\": _waterBrush,\n\twaterfall: _waterfall,\n\twavetosh: _wavetosh,\n\t\"wdxl-lubrifont-jp-n\": _wdxlLubrifontJpN,\n\t\"wdxl-lubrifont-sc\": _wdxlLubrifontSc,\n\t\"wdxl-lubrifont-tc\": _wdxlLubrifontTc,\n\twellfleet: _wellfleet,\n\t\"wendy-one\": _wendyOne,\n\twhisper: _whisper,\n\twindsong: _windsong,\n\t\"winky-rough\": _winkyRough,\n\t\"winky-sans\": _winkySans,\n\t\"wire-one\": _wireOne,\n\twittgenstein: _wittgenstein,\n\t\"wix-madefor-display\": _wixMadeforDisplay,\n\t\"wix-madefor-text\": _wixMadeforText,\n\t\"work-sans\": _workSans,\n\tworkbench: _workbench,\n\twriter: _writer,\n\t\"xanh-mono\": _xanhMono,\n\t\"xx-libert\u00E9\": _xxLibert\u00E9,\n\t\"xx-stardust\": _xxStardust,\n\tyaldevi: _yaldevi,\n\t\"yanone-kaffeesatz\": _yanoneKaffeesatz,\n\tyantramanav: _yantramanav,\n\t\"yarndings-12-charted\": _yarndings12Charted,\n\t\"yarndings-12\": _yarndings12,\n\t\"yarndings-20-charted\": _yarndings20Charted,\n\t\"yarndings-20\": _yarndings20,\n\t\"yatra-one\": _yatraOne,\n\tyellowtail: _yellowtail,\n\t\"yeon-sung\": _yeonSung,\n\t\"yeseva-one\": _yesevaOne,\n\tyesteryear: _yesteryear,\n\tyomogi: _yomogi,\n\t\"young-serif\": _youngSerif,\n\tyrsa: _yrsa,\n\t\"ysabeau-infant\": _ysabeauInfant,\n\t\"ysabeau-office\": _ysabeauOffice,\n\t\"ysabeau-sc\": _ysabeauSc,\n\tysabeau: _ysabeau,\n\t\"yuji-boku\": _yujiBoku,\n\t\"yuji-hentaigana-akari\": _yujiHentaiganaAkari,\n\t\"yuji-hentaigana-akebono\": _yujiHentaiganaAkebono,\n\t\"yuji-mai\": _yujiMai,\n\t\"yuji-syuku\": _yujiSyuku,\n\tyunga: _yunga,\n\t\"yusei-magic\": _yuseiMagic,\n\tzain: _zain,\n\t\"zalando-sans-expanded\": _zalandoSansExpanded,\n\t\"zalando-sans-semiexpanded\": _zalandoSansSemiexpanded,\n\t\"zalando-sans\": _zalandoSans,\n\t\"zcool-kuaile\": _zcoolKuaile,\n\t\"zcool-qingke-huangyou\": _zcoolQingkeHuangyou,\n\t\"zcool-xiaowei\": _zcoolXiaowei,\n\t\"zen-antique-soft\": _zenAntiqueSoft,\n\t\"zen-antique\": _zenAntique,\n\t\"zen-dots\": _zenDots,\n\t\"zen-kaku-gothic-antique\": _zenKakuGothicAntique,\n\t\"zen-kaku-gothic-new\": _zenKakuGothicNew,\n\t\"zen-kurenaido\": _zenKurenaido,\n\t\"zen-loop\": _zenLoop,\n\t\"zen-maru-gothic\": _zenMaruGothic,\n\t\"zen-old-mincho\": _zenOldMincho,\n\t\"zen-tokyo-zoo\": _zenTokyoZoo,\n\tzeyada: _zeyada,\n\t\"zhi-mang-xing\": _zhiMangXing,\n\t\"zilla-slab-highlight\": _zillaSlabHighlight,\n\t\"zilla-slab\": _zillaSlab,\n\tzina: _zina,\n\tzodiak: _zodiak,\n}\n", "import { capitalizeFirstLetterOfEachWord } from \"utils/capitalizeFirstLetter.ts\"\n\n/**\n * Formats a font family name by replacing dashes and underscores with spaces,\n * and capitalizing the first letter of each word.\n *\n * This is especially useful for built-in fonts, as we utilize the preferred\n * font family name defined by the font creator. Since some font names may\n * not be capitalized, this function ensures consistency by capitalizing\n * all words in the font family name.\n */\nexport function formatFamilyName(familyName: string): string {\n\tconst familyNameWithoutDash = familyName.replace(/[-_]/gu, \" \")\n\treturn capitalizeFirstLetterOfEachWord(familyNameWithoutDash)\n}\n", "import \"ListItem.styles_uz4t07.wyw.css\"; export const fontFamilyPreviewHeight = 30;\nexport const fontFamilyRow = \"fontFamilyRow_f1n90hmg\";\nexport const fontFamilyRowHighlighted = \"fontFamilyRowHighlighted_f1jc60k6\";\nexport const fontFamilyRowSelected = \"fontFamilyRowSelected_fljblp3\";\nexport const disabled = \"disabled_d1ift3ob\";\nexport const fontFamilyRowMore = \"fontFamilyRowMore_f6tha0f\";", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { IconFontMore } from \"@framerjs/fresco\"\nimport { Events } from \"@framerjs/fresco/layout-transitions\"\nimport { cx } from \"@linaria/core\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport type { MetricsInteractionViews } from \"app/metrics.ts\"\nimport engine from \"document/engine.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport type { ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { slugify } from \"library/utils/slugify.ts\"\nimport React, { useRef, useState } from \"react\"\nimport { getFontStyleProperties } from \"text\"\nimport { FontPreview } from \"./FontPreview.tsx\"\nimport * as classes from \"./ListItem.styles.ts\"\nimport { selectAllNodesWithFontFamily } from \"./utils/selectAllFonts.ts\"\n\ninterface Props {\n\tfontFamily: ReadonlyFontFamily\n\tindex: number\n\treadOnly: boolean\n\tisSelected: boolean\n\tisHighlighted: boolean\n\tonSelect: (fontface: ReadonlyFontFamily) => void\n\tonHighlight: (index: number, event: React.MouseEvent, fontFamily: ReadonlyFontFamily) => void\n\tteamFontSettingsPath: string | undefined\n\trenderUsingFontFamily: boolean\n\tmetricId: string\n\tmetricsView: MetricsInteractionViews\n}\n\nconst showDeleteModal = engine.scheduler.wrapHandler((fontFamily: ReadonlyFontFamily) => {\n\tconst assetKeysToDelete = fontFamily.fonts.reduce((assetKeys, font) => {\n\t\tif (font.assetKey && font.owner === \"project\") {\n\t\t\tassetKeys.push(font.assetKey)\n\t\t}\n\t\treturn assetKeys\n\t}, [] as string[])\n\tif (!assetKeysToDelete.length) return\n\tengine.stores.modalStore.set({\n\t\ttype: ModalType.DeleteCustomFont,\n\t\tsource: \"delete_custom_font\",\n\t\tassetKeysToDelete,\n\t})\n})\n\nconst sourcesWithContextMenu = [\"custom\", \"fontshare\"]\n\nexport const ListItem = React.memo(function FontFamilyRow({\n\tindex,\n\tfontFamily,\n\treadOnly,\n\tisHighlighted,\n\tisSelected,\n\tonSelect,\n\tonHighlight,\n\tmetricId,\n\tmetricsView,\n\tteamFontSettingsPath,\n\trenderUsingFontFamily,\n}: Props) {\n\tconst optionsRef = useRef<HTMLDivElement | null>(null)\n\tconst [showingOptions, setShowingOptions] = useState(false)\n\n\tconst removeProjectFontUploads = useExperimentIsOn(\"removeProjectFontUploads\")\n\n\tconst highlightHandler = (event: React.MouseEvent) => {\n\t\tonHighlight(index, event, fontFamily)\n\t}\n\n\tlet fontStyle: React.CSSProperties | undefined\n\n\tif (renderUsingFontFamily) {\n\t\tfontStyle = getFontStyleProperties(fontFamily.name)\n\t}\n\n\t// Doesn't need to be memoized because the component already is\n\tconst selectionHandler = (event: React.MouseEvent) => {\n\t\tif (Events.isLeftMouseClick(event)) {\n\t\t\tonSelect(fontFamily)\n\t\t}\n\t}\n\n\tconst contextMenu =\n\t\t(openAtCursor: boolean = false) =>\n\t\t(event: React.MouseEvent) => {\n\t\t\tif (!sourcesWithContextMenu.includes(fontFamily.source) && !removeProjectFontUploads) return\n\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\n\t\t\tconst menuOptions: MenuItemOptions[] = []\n\n\t\t\tif (removeProjectFontUploads) {\n\t\t\t\tmenuOptions.push({\n\t\t\t\t\tlabel: \"Select All\",\n\t\t\t\t\tclick: () => selectAllNodesWithFontFamily(fontFamily),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (fontFamily.source === \"fontshare\") {\n\t\t\t\tmenuOptions.push({\n\t\t\t\t\tlabel: \"On Fontshare\u2026\",\n\t\t\t\t\tclick: () => openNewTab(`https://www.fontshare.com/fonts/${slugify(fontFamily.name)}`),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (fontFamily.source === \"custom\") {\n\t\t\t\tif (showTeamFontOptions(fontFamily) && !!teamFontSettingsPath) {\n\t\t\t\t\tmenuOptions.push({\n\t\t\t\t\t\tlabel: \"Manage\",\n\t\t\t\t\t\tclick: () => openNewTab(teamFontSettingsPath),\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tmenuOptions.push({\n\t\t\t\t\t\tlabel: \"Delete\",\n\t\t\t\t\t\tclick: () => showDeleteModal(fontFamily),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet location = { x: event.clientX, y: event.clientY }\n\n\t\t\tif (!openAtCursor && optionsRef.current) {\n\t\t\t\tconst { left, bottom } = optionsRef.current.getBoundingClientRect()\n\t\t\t\tlocation = { x: left, y: bottom }\n\t\t\t}\n\n\t\t\tsetShowingOptions(true)\n\t\t\tengine.stores.contextMenuStore.show(menuOptions, { location, onDone: () => setShowingOptions(false) })\n\t\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"option\"\n\t\t\taria-selected={isSelected}\n\t\t\tstyle={fontStyle}\n\t\t\tclassName={cx(\n\t\t\t\tclasses.fontFamilyRow,\n\t\t\t\t(isHighlighted || showingOptions) && classes.fontFamilyRowHighlighted,\n\t\t\t\tisSelected && classes.fontFamilyRowSelected,\n\t\t\t\treadOnly && classes.disabled,\n\t\t\t)}\n\t\t\tdata-metric-id={metricId}\n\t\t\tdata-metric-view={metricsView}\n\t\t\tonMouseDown={selectionHandler}\n\t\t\tonMouseMove={highlightHandler}\n\t\t\tonContextMenu={contextMenu(true)}\n\t\t\ttitle={fontFamily.name}\n\t\t>\n\t\t\t<FontPreview fontFamily={fontFamily} selected={isSelected} />\n\t\t\t{(sourcesWithContextMenu.includes(fontFamily.source) || removeProjectFontUploads) && (\n\t\t\t\t<div className={classes.fontFamilyRowMore} onMouseDown={contextMenu()} ref={optionsRef}>\n\t\t\t\t\t<IconFontMore />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\n// Only show team font options if there are no project fonts.\nfunction showTeamFontOptions(fontFamily: ReadonlyFontFamily): boolean {\n\treturn !fontFamily.fonts.some(font => font.owner === \"project\")\n}\n", "import engine from \"document/engine.ts\"\nimport { type AnyTextNode, isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { type ReadonlyFontFamily, fontStore } from \"library/index.ts\"\n\nfunction nodesWithFontFamily(fontFamily: ReadonlyFontFamily): AnyTextNode[] {\n\tconst textNodes: AnyTextNode[] = []\n\tfor (const node of engine.stores.scopeStore.active.descendants()) {\n\t\tif (!isAnyTextNode(node)) continue\n\n\t\tfor (const fontSelector of node.getFonts(false)) {\n\t\t\tif (!fontSelector) continue\n\t\t\tconst currentFontFamily = fontStore.getFontBySelector(fontSelector)?.family\n\t\t\tif (!currentFontFamily) continue\n\t\t\tif (currentFontFamily.name !== fontFamily.name) continue\n\t\t\ttextNodes.push(node)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn textNodes\n}\n\nfunction nodesWithMissingFont(missingFontSelector: string): AnyTextNode[] {\n\tconst textNodes: AnyTextNode[] = []\n\tfor (const node of engine.stores.scopeStore.active.descendants()) {\n\t\tif (!isAnyTextNode(node)) continue\n\n\t\tfor (const fontSelector of node.getFonts(false)) {\n\t\t\tif (!fontSelector) continue\n\t\t\tif (fontSelector !== missingFontSelector) continue\n\t\t\ttextNodes.push(node)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn textNodes\n}\n\nexport const selectAllNodesWithFontFamily = engine.scheduler.wrapHandler((fontFamily: ReadonlyFontFamily) => {\n\tconst textNodes = nodesWithFontFamily(fontFamily)\n\tif (textNodes.length > 0) {\n\t\tengine.stores.selectionStore.set(textNodes)\n\t}\n})\n\nexport const selectAllNodesWithMissingFont = engine.scheduler.wrapHandler((missingFontSelector: string) => {\n\tconst textNodes = nodesWithMissingFont(missingFontSelector)\n\tif (textNodes.length > 0) {\n\t\tengine.stores.selectionStore.set(textNodes)\n\t}\n})\n", "import \"ListStateWrapper.styles_1p9gfyb.wyw.css\"; export const listStateWrapper = \"listStateWrapper_l18jy4n2\";\nexport const listStateLink = \"listStateLink_lh4m16m\";\nexport const listStateDescriptionLink = \"listStateDescriptionLink_l1cbglfb\";\nexport const listStateDescription = \"listStateDescription_l1ayt3ed\";\nexport const listStateButton = \"listStateButton_l4ltz2t\";\nexport const listStateButtonSelectAll = \"listStateButtonSelectAll_lulkyys\";\nexport const button = \"button_b1quqbml\";", "import { ACCEPTED_FONT_EXTENSIONS, openNewTab, readFiles } from \"@framerjs/app-shared\"\nimport type { WebProject } from \"@framerjs/framer-services\"\nimport { Button, IconPlus, Translatable as T, UploadButton } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport engine from \"document/engine.ts\"\nimport { getLegacyFontFamilyName } from \"library/render/fonts/CustomFontSource.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { ReadonlyFont, ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport type { Point } from \"library/render/types/Point.ts\"\nimport { getFirstItemFromIterable } from \"utils/getFirstItemFromIterable.ts\"\nimport { termsOfServiceURL } from \"utils/staticURLs.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport type { FontInfo } from \"web/pages/project/lib/UploadService.ts\"\nimport { uploadService } from \"web/pages/project/lib/UploadService.ts\"\nimport { FontSource } from \"./FontCategoryPicker.tsx\"\nimport * as classes from \"./ListStateWrapper.styles.ts\"\nimport { selectAllNodesWithFontFamily, selectAllNodesWithMissingFont } from \"./utils/selectAllFonts.ts\"\n\ninterface Props {\n\treadOnly: boolean\n\tchildren: React.ReactNode\n\tsource: FontSource\n\tmissingFontSelectors: Set<string>\n\tselectedFonts: Set<ReadonlyFont>\n\tisSearching: boolean\n\tisEmpty: boolean\n\tcanMoveProject: boolean\n\tcurrentSpace: WebProject.ProjectSpace | null\n\tteamFontSettingsPath: string | undefined\n\tselectFontFamily: (value: ReadonlyFontFamily) => void\n\thandleMoveToTeam: (point: Point) => void\n}\n\nexport function ListStateWrapper({\n\tchildren,\n\tsource,\n\treadOnly,\n\tmissingFontSelectors,\n\tselectedFonts,\n\tcurrentSpace,\n\tteamFontSettingsPath,\n\tisEmpty,\n\tisSearching,\n\tcanMoveProject,\n\tselectFontFamily,\n}: Props) {\n\tconst isInTeamSpace = currentSpace && currentSpace.scope !== \"user\"\n\tconst removeProjectFontUploads = useExperimentIsOn(\"removeProjectFontUploads\")\n\t// Only team editors, not project editors, are allowed to upload custom\n\t// fonts. See comment `useMoveProjectPermissions.ts` for more details about\n\t// which users have permission to move projects.\n\tconst allowUpload = canMoveProject && isInTeamSpace && !removeProjectFontUploads\n\tlet description: React.ReactNode | string = \"\"\n\tlet button: React.ReactElement | null = null\n\tlet link: React.ReactElement | null = null\n\n\tconst handleManageFonts = teamFontSettingsPath ? () => openNewTab(teamFontSettingsPath) : undefined\n\n\tconst handleFontUploaded = (fontFamilies: FontInfo[]) => {\n\t\tconst fontFamilyObjects: ReadonlyFontFamily[] = fontFamilies\n\t\t\t.map(family => {\n\t\t\t\tconst fontFamilyName = getLegacyFontFamilyName({\n\t\t\t\t\tkind: \"font\",\n\t\t\t\t\tfont: family.properties,\n\t\t\t\t})\n\t\t\t\tconst fontFamily = fontStore.custom.getFontFamilyByName(fontFamilyName)\n\t\t\t\treturn fontFamily\n\t\t\t})\n\t\t\t.filter(family => family !== null)\n\t\tconst firstFontFamily = fontFamilyObjects[0]\n\t\tif (firstFontFamily) {\n\t\t\tselectFontFamily(firstFontFamily)\n\t\t}\n\t\tengine.stores.customFontStore.detectMissingFonts(fontFamilyObjects)\n\t}\n\n\tswitch (source) {\n\t\tcase FontSource.All:\n\t\t\tdescription = \"No fonts could be loaded.\"\n\t\t\tbreak\n\t\tcase FontSource.Web:\n\t\t\tdescription = \"Can't load Google Fonts. Please check your internet connection and try again.\"\n\t\t\tbreak\n\t\tcase FontSource.Custom:\n\t\t\tif (removeProjectFontUploads) {\n\t\t\t\tdescription = <T>You can upload fonts in your Workspace Settings.</T>\n\t\t\t} else {\n\t\t\t\tdescription = (\n\t\t\t\t\t<>\n\t\t\t\t\t\tUpload fonts from your computer to add them to your project. You can also upload to use on Workspace\n\t\t\t\t\t\tprojects in{\" \"}\n\t\t\t\t\t\t<a target=\"_blank\" href={teamFontSettingsPath} className={classes.listStateLink}>\n\t\t\t\t\t\t\tWorkspace Settings\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</>\n\t\t\t\t)\n\t\t\t\tlink = (\n\t\t\t\t\t<a target=\"_blank\" href={termsOfServiceURL} className={classes.listStateLink}>\n\t\t\t\t\t\tTerms of Service\n\t\t\t\t\t</a>\n\t\t\t\t)\n\t\t\t}\n\t\t\tbreak\n\t}\n\n\tif (isSearching) {\n\t\tdescription = Dictionary.NoSearchResults\n\t}\n\n\tif (allowUpload) {\n\t\tbutton = (\n\t\t\t<div className={classes.listStateButton}>\n\t\t\t\t<UploadButton\n\t\t\t\t\tenabled={!readOnly}\n\t\t\t\t\tacceptedExtensions={ACCEPTED_FONT_EXTENSIONS}\n\t\t\t\t\tuploadFileHandler={uploadFonts}\n\t\t\t\t\tonUploadSuccess={handleFontUploaded}\n\t\t\t\t>\n\t\t\t\t\t<IconPlus />\n\t\t\t\t\tUpload\n\t\t\t\t</UploadButton>\n\t\t\t</div>\n\t\t)\n\t}\n\tif (removeProjectFontUploads && handleManageFonts && source === FontSource.Custom) {\n\t\tbutton = (\n\t\t\t<div className={classes.listStateButton}>\n\t\t\t\t<Button onClick={handleManageFonts} variant=\"default\" className={classes.button}>\n\t\t\t\t\t{isEmpty ? <T>Upload</T> : <T>Manage</T>} <T>Fonts</T>\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (source !== FontSource.Custom && !removeProjectFontUploads) {\n\t\t// This grabs the first item in the set\n\t\tconst missingFontSelector = getFirstItemFromIterable(missingFontSelectors)\n\t\tfunction selectAllFonts() {\n\t\t\tif (missingFontSelector !== undefined) {\n\t\t\t\tselectAllNodesWithMissingFont(missingFontSelector)\n\t\t\t\treturn\n\t\t\t} else if (!removeProjectFontUploads) {\n\t\t\t\tconst selectedFamily = getFirstItemFromIterable(selectedFonts)?.family\n\t\t\t\tif (selectedFamily) {\n\t\t\t\t\tselectAllNodesWithFontFamily(selectedFamily)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbutton = (\n\t\t\t<div className={cx(classes.listStateButton, classes.listStateButtonSelectAll)}>\n\t\t\t\t<Button variant=\"link\" onClick={selectAllFonts}>\n\t\t\t\t\tSelect all elements with this font\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (isEmpty) {\n\t\treturn (\n\t\t\t<div className={classes.listStateWrapper}>\n\t\t\t\t<div className={classes.listStateDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t\t{link && <div className={classes.listStateDescriptionLink}>{link}</div>}\n\t\t\t\t</div>\n\t\t\t\t{button}\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{children}\n\t\t\t{button}\n\t\t</>\n\t)\n}\n\nfunction notifyFailedUploads(totalFiles: number, onNotify?: () => void) {\n\tif (totalFiles === 0) return\n\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tkey: \"customFontsUploadedError\",\n\t\ttext: `Failed to upload ${totalFiles} ${totalFiles > 1 ? \"fonts\" : \"font\"}. Please check your files.`,\n\t\ticon: \"error\",\n\t})\n\n\tonNotify?.()\n}\n\nasync function uploadFonts(\n\tfontFiles: File[],\n\t{ onBegin, onSuccess, onError }: { onBegin: () => void; onSuccess: (fonts: FontInfo[]) => void; onError: () => void },\n) {\n\tif (fontFiles.length === 0) return\n\n\tonBegin()\n\n\ttry {\n\t\tconst fontData = await readFiles(fontFiles)\n\t\tconst uploaded = await uploadService.uploadFonts(fontData)\n\t\tif (uploaded.length > 0) {\n\t\t\tconst multipleFonts = uploaded.length > 1\n\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tkey: \"customFontsUploaded\",\n\t\t\t\ttext: `${uploaded.length} ${multipleFonts ? \"fonts have\" : \"font has\"} been uploaded`,\n\t\t\t\ticon: \"success\",\n\t\t\t\tshowCloseButton: \"never\",\n\t\t\t})\n\n\t\t\tonSuccess(uploaded)\n\t\t}\n\n\t\tnotifyFailedUploads(fontFiles.length - uploaded.length, onError)\n\t} catch (e) {\n\t\tnotifyFailedUploads(fontFiles.length, onError)\n\t}\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { systemFontFamilyName } from \"library/render/fonts/LocalFontSource.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport {\n\ttype FontSelector,\n\tFontSourceNames,\n\ttype ReadonlyFont,\n\ttype ReadonlyFontFamily,\n} from \"library/render/fonts/types.ts\"\nimport { useMemo } from \"react\"\nimport { FontSource } from \"./FontCategoryPicker.tsx\"\nimport { filterDeprecatedFonts } from \"./utils/deprecatedFonts.ts\"\n\ninterface FontPopoutInfo {\n\tallFontFamilies: ReadonlyFontFamily[]\n\tmissingFontSelectors: Set<string>\n\tselectedFontFamilies: Set<ReadonlyFontFamily>\n\tselectedFontObjects: Set<ReadonlyFont>\n}\n\nexport function useFontPopoutInfo({\n\tengine,\n\tselectedFonts,\n\tsource,\n}: {\n\tengine: VekterEngine\n\tselectedFonts: Set<FontSelector | undefined>\n\tsource: FontSource\n}): FontPopoutInfo {\n\tconst { allFonts, fontStoreHash } = useEngineState(\n\t\t() => ({\n\t\t\tallFonts: fontStore.getAvailableFonts(),\n\t\t\tfontStoreHash: fontStore.hash,\n\t\t}),\n\t\t[],\n\t\t[EngineChange.CustomFontStore, engine.stores.webFontStore],\n\t)\n\n\tconst allFontFamilies = useMemo(() => {\n\t\tconst fontFamilySet = new Set<ReadonlyFontFamily>()\n\t\tallFonts.forEach(font => fontFamilySet.add(font.family))\n\n\t\tconst availableFontFamilies = filterDeprecatedFonts(Array.from(fontFamilySet), selectedFonts)\n\t\tconst visibleFontFamilies = getVisibleFontFamiliesForSource(source, availableFontFamilies)\n\n\t\tvisibleFontFamilies.sort((firstFontFamily, secondFontFamily) => {\n\t\t\treturn firstFontFamily.name.localeCompare(secondFontFamily.name)\n\t\t})\n\n\t\treturn visibleFontFamilies\n\t}, [allFonts, selectedFonts, source])\n\n\tconst { selectedFontFamilyObjects, selectedFontObjects, missingFontSelectors } = useMemo(() => {\n\t\t// We don't use the hash directly but we need to use it as a dependency, because it means\n\t\t// the font store state has changed.\n\t\tconst _currentFontStoreHash = fontStoreHash\n\n\t\tconst result = {\n\t\t\tselectedFontFamilyObjects: new Set<ReadonlyFontFamily>(),\n\t\t\tselectedFontObjects: new Set<ReadonlyFont>(),\n\t\t\tmissingFontSelectors: new Set<string>(),\n\t\t}\n\n\t\tfor (const fontFamilySelector of selectedFonts) {\n\t\t\tconst font = fontStore.getFontBySelector(fontFamilySelector)\n\n\t\t\tif (font) {\n\t\t\t\tresult.selectedFontObjects.add(font)\n\t\t\t\tresult.selectedFontFamilyObjects.add(font.family)\n\t\t\t} else if (fontFamilySelector) {\n\t\t\t\tresult.missingFontSelectors.add(fontFamilySelector)\n\t\t\t}\n\t\t}\n\n\t\treturn result\n\t}, [selectedFonts, fontStoreHash])\n\n\treturn {\n\t\tallFontFamilies,\n\t\tmissingFontSelectors,\n\t\tselectedFontFamilies: selectedFontFamilyObjects,\n\t\tselectedFontObjects,\n\t}\n}\n\nfunction getVisibleFontFamiliesForSource(source: FontSource, availableFontFamilies: ReadonlyFontFamily[]) {\n\tswitch (source) {\n\t\tcase FontSource.All:\n\t\t\treturn availableFontFamilies\n\t\tcase FontSource.Local:\n\t\t\treturn availableFontFamilies.filter(\n\t\t\t\tfontFamily => fontFamily.source === FontSourceNames.Local || fontFamily.source === FontSourceNames.Framer,\n\t\t\t)\n\t\tcase FontSource.Web:\n\t\t\treturn availableFontFamilies.filter(\n\t\t\t\tfontFamily =>\n\t\t\t\t\tfontFamily.source === FontSourceNames.Google ||\n\t\t\t\t\tfontFamily.source === FontSourceNames.Fontshare ||\n\t\t\t\t\t(fontFamily.source === FontSourceNames.Local && fontFamily.name === systemFontFamilyName) ||\n\t\t\t\t\tfontFamily.source === FontSourceNames.Framer,\n\t\t\t)\n\t\tcase FontSource.Custom:\n\t\t\treturn availableFontFamilies.filter(fontFamily => fontFamily.source === FontSourceNames.Custom)\n\t\tcase FontSource.Variable:\n\t\t\treturn availableFontFamilies.filter(fontFamily => fontFamily.fonts.some(font => font.variationAxes))\n\t\tcase FontSource.Fontshare:\n\t\t\treturn availableFontFamilies.filter(fontFamily => fontFamily.source === FontSourceNames.Fontshare)\n\t\tcase FontSource.Google:\n\t\t\treturn availableFontFamilies.filter(fontFamily => fontFamily.source === FontSourceNames.Google)\n\t\tcase FontSource.BuiltIn:\n\t\t\treturn availableFontFamilies.filter(fontFamily => fontFamily.source === FontSourceNames.BuiltIn)\n\t\tcase FontSource.Collletttivo:\n\t\t\treturn availableFontFamilies.filter(\n\t\t\t\tfontFamily => fontFamily.source === FontSourceNames.BuiltIn && fontFamily.foundryName === \"collletttivo\",\n\t\t\t)\n\t\tdefault:\n\t\t\tassertNever(source)\n\t}\n}\n", "import \"FontPopoutButton.styles_1mbx462.wyw.css\"; export const popoutButton = \"popoutButton_po8x6nf\";\nexport const popoutButtonMissingFont = \"popoutButtonMissingFont_pj1o4u0\";\nexport const fontFamilyInput = \"fontFamilyInput_feuvz8z\";\nexport const fontFamilyInputMissingFont = \"fontFamilyInputMissingFont_f14asadu\";\nexport const fontFamilyInputTitle = \"fontFamilyInputTitle_f1i9ns4w\";\nexport const fontFamilyInputTitleMissingFont = \"fontFamilyInputTitleMissingFont_f2gw4ya\";\nexport const iconInputDropdown = \"iconInputDropdown_i1rv172\";", "import { IconAlert, IconInputDropdown, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { ReadonlyFontFamily } from \"library/render/fonts/types.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { doubleColumnClass } from \"../../properties/utils/doubleColumn.styles.ts\"\nimport { PopoutButton } from \"../PopoutButton.tsx\"\nimport { PopoutButtonWithPreview } from \"../PopoutButtonWithPreview.tsx\"\nimport type { FontPopoutProps } from \"./FontPopout.tsx\"\nimport { FontPopout } from \"./FontPopout.tsx\"\nimport * as classes from \"./FontPopoutButton.styles.ts\"\nimport { getDeprecatedFontFamilyDisplayName, isDeprecatedFontFamily } from \"./utils/deprecatedFonts.ts\"\nimport { formatFamilyName } from \"./utils/formatFontFamily.ts\"\n\ninterface Props extends FontPopoutProps {\n\tpopoutIdentifier?: string\n\temptyLabel?: string\n\tselectedFontFamilies: Set<ReadonlyFontFamily>\n\tmissingFontSelectors: Set<string>\n}\n\nexport function FontPopoutButton({\n\tpopoutIdentifier,\n\tselectedFonts,\n\tonSelectFontFamily,\n\tonSelectSource,\n\tselectedSource,\n\tonHighlightFontFamily,\n\tonHighlightEnd,\n\temptyLabel,\n\tselectedFontFamilies,\n\tmissingFontSelectors,\n}: Props) {\n\tconst hasMissingFonts = missingFontSelectors.size > 0\n\n\tconst commonProps = {\n\t\tid: popoutIdentifier,\n\t\tclassName: cx(classes.popoutButton, doubleColumnClass, hasMissingFonts && classes.popoutButtonMissingFont),\n\t\tnavigationTitle: \"Fonts\",\n\t\tpreview: hasMissingFonts ? <IconAlert /> : null,\n\t\tpopout: (\n\t\t\t<FontPopout\n\t\t\t\tselectedFonts={selectedFonts}\n\t\t\t\tonSelectFontFamily={onSelectFontFamily}\n\t\t\t\tonSelectSource={onSelectSource}\n\t\t\t\tselectedSource={selectedSource}\n\t\t\t\tonHighlightFontFamily={onHighlightFontFamily}\n\t\t\t\tonHighlightEnd={onHighlightEnd}\n\t\t\t/>\n\t\t),\n\t} satisfies Partial<React.ComponentProps<typeof PopoutButtonWithPreview> & React.ComponentProps<typeof PopoutButton>>\n\n\tconst content = (\n\t\t<div className={cx(classes.fontFamilyInput, hasMissingFonts && classes.fontFamilyInputMissingFont)}>\n\t\t\t<div\n\t\t\t\tclassName={cx(\n\t\t\t\t\ttruncateWithEllipsis,\n\t\t\t\t\tclasses.fontFamilyInputTitle,\n\t\t\t\t\thasMissingFonts && classes.fontFamilyInputTitleMissingFont,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{previewTitle(selectedFontFamilies, missingFontSelectors, emptyLabel)}\n\t\t\t</div>\n\n\t\t\t<IconInputDropdown className={classes.iconInputDropdown} />\n\t\t</div>\n\t)\n\n\treturn hasMissingFonts ? (\n\t\t<PopoutButtonWithPreview\n\t\t\t{...commonProps}\n\t\t\ttestId=\"typeface-popout-button\"\n\t\t\tswatchBackgroundColor={colors.popupButtonWarningBackground}\n\t\t\tpreview={<IconAlert />}\n\t\t\ttitle={content}\n\t\t/>\n\t) : (\n\t\t<PopoutButton\n\t\t\t{...commonProps}\n\t\t\tdata-testid=\"typeface-popout-button\"\n\t\t\tpopout={\n\t\t\t\t<FontPopout\n\t\t\t\t\tselectedFonts={selectedFonts}\n\t\t\t\t\tonSelectFontFamily={onSelectFontFamily}\n\t\t\t\t\tonSelectSource={onSelectSource}\n\t\t\t\t\tselectedSource={selectedSource}\n\t\t\t\t\tonHighlightFontFamily={onHighlightFontFamily}\n\t\t\t\t\tonHighlightEnd={onHighlightEnd}\n\t\t\t\t/>\n\t\t\t}\n\t\t>\n\t\t\t{content}\n\t\t</PopoutButton>\n\t)\n}\n\nfunction previewTitle(\n\tselectedFontFamilies: Set<ReadonlyFontFamily>,\n\tmissingFontSelectors: Set<string>,\n\temptyLabel?: string,\n) {\n\tif (missingFontSelectors.size > 0) {\n\t\tconst [selector] = missingFontSelectors\n\n\t\tif (selector === undefined) {\n\t\t\treturn emptyLabel ?? Dictionary.None\n\t\t}\n\n\t\tconst fromIndex = selector.indexOf(\";\") + 1\n\t\tlet toIndex = selector.lastIndexOf(\"-\")\n\n\t\tif (toIndex < 0) {\n\t\t\ttoIndex = selector.length\n\t\t}\n\n\t\treturn selector.slice(fromIndex, toIndex < 0 ? selector.length : toIndex)\n\t}\n\n\tif (selectedFontFamilies.size === 0) {\n\t\treturn emptyLabel ?? Dictionary.None\n\t}\n\n\tif (selectedFontFamilies.size > 1) {\n\t\treturn Dictionary.Mixed\n\t}\n\n\tconst firstSelectedFontFamily = selectedFontFamilies.values().next()\n\t// We have to do an assert, or else `firstSelectedFontFamily.value` will be of type `any`\n\tassert(firstSelectedFontFamily.done === false, \"Expected the selectedFontFamilies set to have a size of 1\")\n\n\t// check if the font family is deprecated font\n\tif (isDeprecatedFontFamily(firstSelectedFontFamily.value)) {\n\t\treturn getDeprecatedFontFamilyDisplayName(firstSelectedFontFamily.value)\n\t}\n\n\treturn formatFamilyName(firstSelectedFontFamily.value.name)\n}\n", "import { REGULAR_FONT_WEIGHT } from \"@framerjs/app-shared\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport { getVariationAxesTitle, isFontVariable } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { FontshareSource } from \"library/render/fonts/FontshareSource.ts\"\nimport { GoogleFontSource } from \"library/render/fonts/GoogleFontSource.ts\"\nimport type { ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport { FontSourceNames, isSuccessfullyParsedFontVariant } from \"library/render/fonts/types.ts\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\n\nconst fontWeightNames: Record<string | number, string> = {\n\tvariable: \"Variable\",\n\t100: \"Thin\",\n\t200: \"Extra Light\",\n\t300: \"Light\",\n\t400: \"Regular\",\n\t500: \"Medium\",\n\t600: \"Semibold\",\n\t700: \"Bold\",\n\t800: \"Extra Bold\",\n\t900: \"Black\",\n}\n\nexport function getFontVariantName(font: ReadonlyFont, variationAxes?: ReducedFontVariationAxes): string {\n\tconst variantName = font.variant\n\tconst source = font.family.source\n\n\tif (isFontVariable(font)) {\n\t\treturn getVariationAxesTitle(font, variationAxes)\n\t}\n\n\tif (source !== FontSourceNames.Google && source !== FontSourceNames.Fontshare) {\n\t\treturn capitalizeFirstLetter(variantName)\n\t}\n\n\tconst variant =\n\t\tsource === FontSourceNames.Google\n\t\t\t? GoogleFontSource.parseVariant(variantName)\n\t\t\t: FontshareSource.parseVariant(variantName)\n\n\tif (!isSuccessfullyParsedFontVariant(variant)) return \"\"\n\n\tconst styleName = variant.style === \"normal\" ? \"\" : ` ${capitalizeFirstLetter(variant.style)}`\n\tconst weightName = fontWeightNames[variant.weight]\n\n\tif (variant.weight === REGULAR_FONT_WEIGHT && variant.style === \"italic\") {\n\t\treturn styleName\n\t}\n\n\treturn `${weightName}${styleName}`\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { FontSizeUnit, WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport {\n\tconvertFontSizeCSSDimension,\n\tconvertFontSizeValue,\n\tisFontSizeCSSDimension,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { createCSSDimension, parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport React from \"react\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { getFontSizeUnitFromValue, supportedFontSizeUnits } from \"../../panels/utils/textStyle.ts\"\nimport { FontSizeRow } from \"../FontSizeRow.tsx\"\n\nconst defaultFontSizeUnits = new Set<FontSizeUnit>([\"px\"])\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n}\n\nexport function StylePresetFontSizeRow({ preset }: Props) {\n\t// Because presets uses `WithTextStyle`, which includes old values for `fontSize`, we must consider the case\n\t// where the value could still be a number, in addition to allowing it to be a variable reference.\n\tconst { fontSize, units } = React.useMemo(() => {\n\t\tif (isVariableReference(preset.fontSize)) {\n\t\t\treturn { fontSize: preset.fontSize, units: defaultFontSizeUnits }\n\t\t}\n\t\tif (isNumber(preset.fontSize)) {\n\t\t\treturn { fontSize: preset.fontSize, units: defaultFontSizeUnits }\n\t\t}\n\t\tconst [size, unit] = parseCSSDimension(preset.fontSize)\n\t\treturn { fontSize: size, units: new Set<FontSizeUnit>([unit]) }\n\t}, [preset.fontSize])\n\n\tconst handleChangeFontSize = useEngineCallback(\n\t\t(sizeUpdate: VariableReference | number, rawValue?: string) => {\n\t\t\tif (isVariableReference(sizeUpdate)) return\n\t\t\tconst unitFromValue = getFontSizeUnitFromValue(rawValue)\n\n\t\t\t// handle the case where the user types in a supported unit in the input\n\t\t\tif (unitFromValue) {\n\t\t\t\tengine.tree.current(preset)?.set({ fontSize: createCSSDimension(sizeUpdate, unitFromValue) })\n\t\t\t\tconst isNewUnit = !units.has(unitFromValue)\n\t\t\t\tif (isNewUnit) record(\"preset_font_size_update\", { unit: unitFromValue })\n\t\t\t} else if (isFontSizeCSSDimension(preset.fontSize)) {\n\t\t\t\t// handle the case where the preset already has a unit\n\t\t\t\tconst parsed = parseCSSDimension(preset.fontSize)\n\t\t\t\tconst [_, unit] = parsed\n\t\t\t\tengine.tree.current(preset)?.set({ fontSize: createCSSDimension(sizeUpdate, unit) })\n\t\t\t} else {\n\t\t\t\t// handle the case where the preset is a number; therefore, it's px.\n\t\t\t\tengine.tree.current(preset)?.set({ fontSize: createCSSDimension(sizeUpdate, \"px\") })\n\t\t\t}\n\t\t},\n\t\t[preset, units],\n\t)\n\n\t// We do a simple conversion back-and-forth between px and rem units, based on 16px.\n\tconst handleChangeFontSizeUnit = useEngineCallback(\n\t\t(unit: FontSizeUnit) => {\n\t\t\tif (isVariableReference(preset.fontSize)) return\n\t\t\tif (isNumber(preset.fontSize)) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ fontSize: createCSSDimension(convertFontSizeValue(preset.fontSize, \"px\", unit), unit) })\n\t\t\t} else {\n\t\t\t\tengine.tree.current(preset)?.set({ fontSize: convertFontSizeCSSDimension(preset.fontSize, unit) })\n\t\t\t}\n\t\t\trecord(\"preset_font_size_update\", { unit })\n\t\t},\n\t\t[preset],\n\t)\n\n\treturn (\n\t\t<FontSizeRow\n\t\t\tfontSize={fontSize}\n\t\t\tunits={units}\n\t\t\tonChange={handleChangeFontSize}\n\t\t\tonChangeUnit={handleChangeFontSizeUnit}\n\t\t\tsupportedUnits={supportedFontSizeUnits}\n\t\t/>\n\t)\n}\n", "import { NumberInputWithTicker, PopupButton, PopupButtonDisplayTitle, PopupButtonItem, Slider } from \"@framerjs/fresco\"\nimport { Mixed, assertNever, isMixed, shouldBeNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { RichTextFontSizeUnit } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { convertFontSizeValue, textStyleDefaults } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { NotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { notFoundToUndefined } from \"document/models/CanvasTree/traits/utils/notFoundToUndefined.ts\"\nimport { getRootFontSize } from \"document/models/CanvasTree/traits/utils/rootFontSizeHelpers.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { VariableReferenceButton } from \"../../shared/VariableReferenceButton.tsx\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport * as styles from \"./FontSizeRow.styles.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nconst fontSizeTraitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"fontSize\", \"html\"]\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\tfontSize: Reduced<number | VariableReference | undefined>\n\tunits?: Set<RichTextFontSizeUnit>\n\ttextFitScale?: Reduced<number>\n\ttestId?: string\n\tsupportsCopyPaste?: boolean\n\tsupportsVariables?: boolean\n\tsupportedUnits?: readonly RichTextFontSizeUnit[]\n\tonChange(value: number | VariableReference, rawValue?: string): void\n\tonChangeUnit?(value: RichTextFontSizeUnit): void\n\tonDelete?(): void\n}\n\nconst validRawValues = new Set([\"auto\"])\nconst defaultUnits = new Set<RichTextFontSizeUnit>([\"px\"])\nconst defaultSupportedUnits: readonly RichTextFontSizeUnit[] = [\"px\"]\nconst maxAutoSizingValue = 100\n\nexport function FontSizeRow({\n\tnodeIds,\n\ttestId,\n\tfontSize,\n\ttextFitScale,\n\tonChange,\n\tunits = defaultUnits,\n\tonChangeUnit,\n\tonDelete,\n\tsupportsCopyPaste = false,\n\tsupportsVariables = false,\n\tsupportedUnits = defaultSupportedUnits,\n}: Props) {\n\tconst canCopyFontSize = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(fontSize),\n\t\t[fontSize, supportsCopyPaste],\n\t)\n\n\tconst [canPasteFontSize, pasteFontSize, copyFontSize] = useCopyAndPasteSingleProperty(\n\t\tTraitType.FontSize,\n\t\tnodeIds,\n\t\tcanCopyFontSize,\n\t)\n\n\tconst onSelectVariable = engine.scheduler.wrapHandler((variableRef: VariableReference) => {\n\t\tif (!supportsVariables) return\n\t\tonChange(variableRef)\n\t})\n\n\tconst onCreateVariable = engine.scheduler.wrapHandler((scopeId: NodeID) => {\n\t\tif (!supportsVariables) return\n\n\t\tconst variableRef = createVariableInScope({\n\t\t\tengine,\n\t\t\tscopeId,\n\t\t\ttype: ControlType.Number,\n\t\t\tname: \"fontSize\",\n\t\t\tinitialValue: getInitialValueForVariable(units, fontSize),\n\t\t})\n\n\t\tif (variableRef) {\n\t\t\tonSelectVariable(variableRef)\n\t\t}\n\t})\n\n\tconst onRemoveDynamicValue = engine.scheduler.wrapHandler(() => {\n\t\tif (!isDynamicValue(fontSize)) return\n\t\tif (isVariableReference(fontSize)) {\n\t\t\tconst variableValue = getVariableValue(engine, fontSize)\n\t\t\tconst fontSizeValue = isNumber(variableValue) ? variableValue : parseCSSDimension(textStyleDefaults.fontSize)[0]\n\t\t\tonChange(fontSizeValue)\n\t\t} else if (isComputedValue(fontSize)) {\n\t\t\tonChange(parseCSSDimension(textStyleDefaults.fontSize)[0])\n\t\t} else {\n\t\t\tshouldBeNever(fontSize)\n\t\t}\n\t})\n\n\tconst isAutoSizing = commonValue(units) === \"auto\"\n\tconst isRem = commonValue(units) === \"rem\"\n\tconst value = formatValue({ isAutoSizing, fontSize, textFitScale })\n\n\tconst onSelectUnit = (unit: RichTextFontSizeUnit) => {\n\t\tonChangeUnit?.(unit)\n\t}\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle=\"Size\"\n\t\t\tonDelete={onDelete}\n\t\t\tvariableType={ControlType.Number}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tdynamicValue={isDynamicValue(fontSize) ? fontSize : null}\n\t\t\tonSelectVariable={onSelectVariable}\n\t\t\tsupportsVariables={supportsVariables && !isAutoSizing}\n\t\t\ttraitTypeKeys={fontSizeTraitTypeKeys}\n\t\t\tcopyEnabled={canCopyFontSize}\n\t\t\tonCopy={supportsCopyPaste ? copyFontSize : undefined}\n\t\t\tpasteEnabled={canPasteFontSize}\n\t\t\tonPaste={supportsCopyPaste ? pasteFontSize : undefined}\n\t\t>\n\t\t\t{isVariableReference(fontSize) && supportsVariables ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\texpectedType={ControlType.Number}\n\t\t\t\t\treference={fontSize}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\tmax={isAutoSizing ? maxAutoSizingValue : undefined}\n\t\t\t\t\t\tstep={isRem ? 0.1 : \"nudge\"}\n\t\t\t\t\t\tdefaultValue={getDefaultValueForUnit(units)}\n\t\t\t\t\t\tvalidRawValues={validRawValues}\n\t\t\t\t\t\tdisplayTicker\n\t\t\t\t\t\tdata-testid={testId}\n\t\t\t\t\t/>\n\t\t\t\t\t{supportedUnits.length > 1 ? (\n\t\t\t\t\t\t<PopupButtonDisplayTitle displayTitle={shortTitle(units)} testId=\"textpanel-size-unit\">\n\t\t\t\t\t\t\t<PopupButton wrapperClassName={styles.popupButtonWrapper}>\n\t\t\t\t\t\t\t\t{supportedUnits.map(unit => (\n\t\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\t\tkey={unit}\n\t\t\t\t\t\t\t\t\t\tidentifier={unit}\n\t\t\t\t\t\t\t\t\t\ttitle={dimensionTitle(unit)}\n\t\t\t\t\t\t\t\t\t\tselected={units.has(unit)}\n\t\t\t\t\t\t\t\t\t\tonSelect={onSelectUnit}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t\t</PopupButtonDisplayTitle>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Slider\n\t\t\t\t\t\t\tvalue={isDynamicValue(fontSize) ? undefined : notFoundToUndefined(fontSize)}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction getInitialValueForVariable(\n\tunits: Set<RichTextFontSizeUnit>,\n\tfontSize: Reduced<number | VariableReference | undefined>,\n): number {\n\tif (!isNumber(fontSize)) return parseCSSDimension(textStyleDefaults.fontSize)[0]\n\n\tconst currentUnit = commonValue(units)\n\treturn currentUnit === \"rem\"\n\t\t? convertFontSizeValue(\n\t\t\t\tfontSize,\n\t\t\t\tcurrentUnit,\n\t\t\t\t\"px\",\n\t\t\t\tgetRootFontSize(engine.stores.scopeStore.active, engine.tree, engine.stores.modulesStore),\n\t\t\t)\n\t\t: fontSize\n}\n\nfunction formatValue({\n\tisAutoSizing,\n\ttextFitScale,\n\tfontSize,\n}: Pick<Props, \"textFitScale\" | \"fontSize\"> & { isAutoSizing: boolean }): number | string | Mixed | undefined {\n\tconst value = isAutoSizing ? textFitScale : fontSize\n\tif (isAutoSizing && isNumber(value)) return `${value}%`\n\n\tif (isDynamicValue(value)) return undefined\n\n\treturn notFoundToUndefined(value)\n}\n\nfunction getDefaultValueForUnit(units: Set<RichTextFontSizeUnit>): number {\n\tconst unit = commonValue(units)\n\tswitch (unit) {\n\t\tcase \"rem\":\n\t\t\treturn 1\n\t\tcase \"auto\":\n\t\t\treturn maxAutoSizingValue\n\t\tcase \"px\":\n\t\tcase Mixed:\n\t\tcase NotFound:\n\t\t\treturn parseCSSDimension(textStyleDefaults.fontSize)[0]\n\t\tdefault:\n\t\t\tassertNever(unit)\n\t}\n}\n\nfunction dimensionTitle(type: RichTextFontSizeUnit): string {\n\tswitch (type) {\n\t\tcase \"px\":\n\t\t\treturn Dictionary.Pixels\n\t\tcase \"rem\":\n\t\t\treturn Dictionary.Rem\n\t\tcase \"auto\":\n\t\t\treturn Dictionary.Fit\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n\nfunction shortTitle(dimensions: Set<RichTextFontSizeUnit>): string {\n\tconst commonDimension = commonValue(dimensions)\n\tswitch (commonDimension) {\n\t\tcase \"px\":\n\t\t\treturn Dictionary.Pixels\n\t\tcase \"rem\":\n\t\t\treturn Dictionary.Rem\n\t\tcase \"auto\":\n\t\t\treturn Dictionary.Fit\n\t\tcase Mixed:\n\t\tcase NotFound:\n\t\t\treturn Dictionary.Mixed\n\t\tdefault:\n\t\t\tassertNever(commonDimension, \"All resolved dimension types should be handled\")\n\t}\n}\n", "import \"FontSizeRow.styles_1vgfn8k.wyw.css\"; export const popupButtonWrapper = \"popupButtonWrapper_piw044r\";", "import \"PresetIcon.styles_65ed5d.wyw.css\"; export const icon = \"icon_iuztapw\";\nexport const iconCompact = \"iconCompact_imkx7yx\";\nexport const iconWithBorder = \"iconWithBorder_i78llb\";\nexport const checkerboard = \"checkerboard_c18ef80b\";", "import { IconImageStylePreset, IconTableStylePreset } from \"@framerjs/fresco\"\nimport { colors, palette } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport type { InlineCodeStylePresetNode } from \"document/models/CanvasTree/nodes/InlineCodeStylePresetNode.ts\"\nimport type { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { Color } from \"library/render/types/Color/index.ts\"\nimport type React from \"react\"\nimport { IconAgentLayerImage } from \"../layers/AgentLayerIcons.tsx\"\nimport { IconAgentLayerGrid } from \"../layers/IconAgentLayerGrid.tsx\"\nimport { useSubscribeToFillValue } from \"../properties/utils/useSubscribeToFillValue.ts\"\nimport * as styles from \"./PresetIcon.styles.ts\"\n\ninterface PresetIconProps {\n\tbackground?: string\n\ticon: React.ReactNode\n}\n\n/**\n * Preset icon that uses the background color to determine the foreground color.\n */\nexport function PresetIcon({ background, icon }: PresetIconProps) {\n\tconst isTransparent = background === \"transparent\"\n\tconst className = cx(styles.icon, isTransparent && styles.checkerboard)\n\tconst localToken = useSubscribeToFillValue(background)\n\tconst iconBackground = localToken?.value ?? background\n\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\tstyle={{\n\t\t\t\tbackgroundColor: iconBackground ?? colors.stylesPresetsIconBackground,\n\t\t\t\tcolor: iconBackground ? getColorWithHighestContrast(iconBackground) : colors.stylesPresetsIconText,\n\t\t\t}}\n\t\t>\n\t\t\t{icon}\n\t\t</div>\n\t)\n}\n\ninterface PresetIconInvertedProps {\n\tforeground?: string\n\ticon: React.ReactNode\n\twithBorder?: boolean\n\t/** Render at 21.5\u00D721.5 instead of the default 22\u00D722, for use with the new stroke-style T glyph. */\n\tcompact?: boolean\n}\n\n/**\n * Inverted preset icon that uses the foreground color to determine the background color.\n */\nexport function PresetIconInverted({ foreground, icon, withBorder, compact }: PresetIconInvertedProps) {\n\tconst isTransparent = foreground === \"transparent\"\n\tconst className = cx(\n\t\tstyles.icon,\n\t\twithBorder && styles.iconWithBorder,\n\t\tisTransparent && styles.checkerboard,\n\t\tcompact && styles.iconCompact,\n\t)\n\tconst localToken = useSubscribeToFillValue(foreground)\n\tconst iconForeground = localToken?.value ?? foreground\n\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\tstyle={{\n\t\t\t\tbackgroundColor: iconForeground\n\t\t\t\t\t? getColorWithHighestContrast(iconForeground)\n\t\t\t\t\t: colors.stylesPresetsIconBackground,\n\t\t\t\tcolor: iconForeground ?? colors.stylesPresetsIconText,\n\t\t\t}}\n\t\t>\n\t\t\t{icon}\n\t\t</div>\n\t)\n}\n\nfunction getColorWithHighestContrast(inputColor: string) {\n\tconst color = Color(inputColor)\n\n\t// For now it works ok based on https://stackoverflow.com/a/58427960\n\t// A more accurate brightness calculation could be consider based on https://stackoverflow.com/a/56678483\n\tconst brightness = color.r * 0.299 + color.g * 0.587 + color.b * 0.114 + (1 - color.a) * 255\n\n\tif (brightness > 150) {\n\t\treturn palette.black100\n\t}\n\n\treturn palette.white100\n}\n\ninterface TextStylePresetIconProps {\n\tpreset: TextStylePresetNode\n\twithBorder?: boolean\n}\n\nexport function TextStylePresetIcon({ preset, withBorder }: TextStylePresetIconProps) {\n\treturn <PresetIconInverted icon={preset.tag} foreground={preset.textColor} withBorder={withBorder} />\n}\n\ninterface LinkStylePresetIconProps {\n\tpreset: LinkStylePresetNode\n\twithBorder?: boolean\n}\n\nexport function LinkStylePresetIcon({ preset, withBorder }: LinkStylePresetIconProps) {\n\treturn <PresetIconInverted icon=\"a\" foreground={preset.linkTextColor ?? \"transparent\"} withBorder={withBorder} />\n}\n\ninterface BlockquoteStylePresetIconProps {\n\tpreset: BlockquoteStylePresetNode\n\twithBorder?: boolean\n}\n\nexport function BlockquoteStylePresetIcon({ preset, withBorder }: BlockquoteStylePresetIconProps) {\n\treturn <PresetIconInverted icon=\"B\" foreground={preset.textColor ?? \"transparent\"} withBorder={withBorder} />\n}\n\nexport function TableStylePresetIcon() {\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\treturn <PresetIcon icon={agentExperimentEnabled ? <IconAgentLayerGrid /> : <IconTableStylePreset />} />\n}\n\ninterface InlineCodeStylePresetIconProps {\n\tpreset: InlineCodeStylePresetNode\n\twithBorder?: boolean\n}\n\nexport function InlineCodeStylePresetIcon({ preset, withBorder }: InlineCodeStylePresetIconProps) {\n\treturn <PresetIconInverted icon=\"c\" foreground={preset.inlineCodeTextColor ?? \"#000\"} withBorder={withBorder} />\n}\n\nexport function ImageStylePresetIcon() {\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\treturn <PresetIcon icon={agentExperimentEnabled ? <IconAgentLayerImage /> : <IconImageStylePreset />} />\n}\n", "import { IconInputDropdown, PopupButton, PopupButtonItem, Stack, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { isEmptyObject } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { experiments } from \"app/experiments.ts\"\nimport {\n\tfontFamilyInput,\n\tfontFamilyInputTitle,\n} from \"document/components/chrome/shared/FontPopout/FontPopoutButton.styles.ts\"\nimport { PopoutButton } from \"document/components/chrome/shared/PopoutButton.tsx\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport type { VariationAxisTag } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport {\n\taddEncodedAxesToSelector,\n\tcssToVariationAxes,\n\tisFontVariable,\n\tparseAxesFromFontSelector,\n\tremoveEncodedAxesFromSelector,\n\tupdateVariationAxes,\n} from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport { getFontsSortedByWeightAndStyle } from \"library/render/fonts/getFontsSortedByWeightAndStyle.ts\"\nimport type { FontSelector, ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport { FontSourceNames } from \"library/render/fonts/types.ts\"\nimport React, { useMemo } from \"react\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { doubleColumnClass } from \"../../utils/doubleColumn.styles.ts\"\nimport { doubleColumn } from \"../../utils/doubleColumn.ts\"\nimport { getFontVariantName } from \"../../utils/getFontVariantName.ts\"\nimport { PanelRow } from \"../PanelRow.tsx\"\nimport { VariableFontRow } from \"../VariableFontRow/VariableFontRow.tsx\"\nimport { CustomFontPopout } from \"./CustomFontPopout.tsx\"\n\ninterface Props {\n\tcustomFonts: ReadonlyFont[]\n\tselectedBoldFont: string | undefined\n\tselectedBoldItalicFont: string | undefined\n\tselectedItalicFont: string | undefined\n\tselectedFont: FontSelector | undefined\n\tonChangeFontBold: (selector: string) => void\n\tonChangeFontBoldItalic: (selector: string) => void\n\tonChangeFontItalic: (selector: string) => void\n}\n\nexport function FontVariantsPopout({\n\tcustomFonts,\n\tselectedFont,\n\tonChangeFontBold,\n\tonChangeFontBoldItalic,\n\tonChangeFontItalic,\n\tselectedBoldFont,\n\tselectedBoldItalicFont,\n\tselectedItalicFont,\n}: Props) {\n\tconst [baseFontVariationAxes, baseFontSelector] = React.useMemo(() => {\n\t\tif (isUndefined(selectedFont)) return [{}, undefined]\n\t\tconst { axesCSS } = parseAxesFromFontSelector(selectedFont)\n\t\tconst axes = isUndefined(axesCSS) ? {} : (cssToVariationAxes(axesCSS) ?? {})\n\t\tconst selector = removeEncodedAxesFromSelector(selectedFont)\n\t\treturn [axes, selector]\n\t}, [selectedFont])\n\n\tconst baseFont = fontStore.getFontBySelector(baseFontSelector)\n\tconst baseFontIsVariable = !isUndefined(baseFontVariationAxes) && !isEmptyObject(baseFontVariationAxes)\n\tconst isCustomFontSource = baseFont?.family.source === FontSourceNames.Custom\n\n\t// When the customFontGrouping experiment is removed, we can also remove the getCustomFontVariants function completely\n\tconst fontVariants =\n\t\tisCustomFontSource && !experiments.isOn(\"customFontGrouping\")\n\t\t\t? getCustomFontVariants(customFonts)\n\t\t\t: getAvailableFontsPerVariant(baseFont)\n\n\treturn (\n\t\t<Stack gap={0} direction=\"column\" padding={dimensions.css.popoverPadding} paddingTop={0}>\n\t\t\t<VariantPanelRow\n\t\t\t\ttype=\"bold\"\n\t\t\t\ttitle=\"Bold\"\n\t\t\t\tavailableFonts={fontVariants.boldVariants}\n\t\t\t\tisVariableFont={baseFontIsVariable}\n\t\t\t\tselectedFont={selectedBoldFont}\n\t\t\t\tonSelect={onChangeFontBold}\n\t\t\t\tisCustomFontSource={isCustomFontSource}\n\t\t\t/>\n\t\t\t<VariantPanelRow\n\t\t\t\ttype=\"italic\"\n\t\t\t\ttitle=\"Italic\"\n\t\t\t\tavailableFonts={fontVariants.italicVariants}\n\t\t\t\tisVariableFont={baseFontIsVariable}\n\t\t\t\tselectedFont={selectedItalicFont}\n\t\t\t\tonSelect={onChangeFontItalic}\n\t\t\t\tisCustomFontSource={isCustomFontSource}\n\t\t\t/>\n\t\t\t<VariantPanelRow\n\t\t\t\ttype=\"boldItalic\"\n\t\t\t\ttitle=\"Bold & Italic\"\n\t\t\t\tavailableFonts={fontVariants.boldItalicVariants}\n\t\t\t\tisVariableFont={baseFontIsVariable}\n\t\t\t\tselectedFont={selectedBoldItalicFont}\n\t\t\t\tonSelect={onChangeFontBoldItalic}\n\t\t\t\tisCustomFontSource={isCustomFontSource}\n\t\t\t/>\n\t\t</Stack>\n\t)\n}\n\ntype VariantType = \"bold\" | \"italic\" | \"boldItalic\"\n\ninterface FontVariantRowProps {\n\ttype: VariantType\n\ttitle: string\n\tavailableFonts: ReadonlyFont[]\n\tselectedFont: string | undefined\n\tonSelect: (value: string | undefined) => void\n}\n\ninterface VariantPanelRowProps extends FontVariantRowProps {\n\tisVariableFont: boolean\n\tisCustomFontSource: boolean\n}\n\nconst VariantPanelRow = ({ isVariableFont, isCustomFontSource, ...rest }: VariantPanelRowProps) => {\n\tif (isVariableFont) return <VariableFontVariantRow {...rest} />\n\t// When the customFontGrouping experiment is removed, we can also remove the CustomFontVariantRow completely\n\tif (isCustomFontSource && !experiments.isOn(\"customFontGrouping\")) return <CustomFontVariantRow {...rest} />\n\treturn <FontVariantRow {...rest} />\n}\n\nconst CustomFontVariantRow = ({ title, availableFonts, selectedFont, onSelect }: FontVariantRowProps) => {\n\treturn (\n\t\t<PanelRow title={title}>\n\t\t\t<PopoutButton\n\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\tnavigationTitle=\"Custom Fonts\"\n\t\t\t\ttitle={title}\n\t\t\t\tpopout={<CustomFontPopout customFonts={availableFonts} selectedFont={selectedFont} onSelect={onSelect} />}\n\t\t\t>\n\t\t\t\t<div className={fontFamilyInput}>\n\t\t\t\t\t<div className={cx(truncateWithEllipsis, fontFamilyInputTitle)}>\n\t\t\t\t\t\t{selectedFont ? fontStore.getFontBySelector(selectedFont)?.family.name : \"Select\u2026\"}\n\t\t\t\t\t</div>\n\t\t\t\t\t<IconInputDropdown />\n\t\t\t\t</div>\n\t\t\t</PopoutButton>\n\t\t</PanelRow>\n\t)\n}\n\nconst FontVariantRow = ({ title, availableFonts, selectedFont, onSelect }: FontVariantRowProps) => {\n\treturn (\n\t\t<PanelRow title={title}>\n\t\t\t<div style={doubleColumn}>\n\t\t\t\t<PopupButton enabled={availableFonts.length > 0}>\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tvisible={!selectedFont || !availableFonts.length}\n\t\t\t\t\t\tselected={!selectedFont || !availableFonts.length}\n\t\t\t\t\t\ttitle=\"Select\u2026\"\n\t\t\t\t\t\tenabled={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<PopupButtonItem type=\"divider\" />\n\t\t\t\t\t{availableFonts.map(font => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={font.selector}\n\t\t\t\t\t\t\tidentifier={font.selector}\n\t\t\t\t\t\t\ttitle={getFontVariantName(font)}\n\t\t\t\t\t\t\tselected={font.selector === selectedFont}\n\t\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</div>\n\t\t</PanelRow>\n\t)\n}\n\nconst VariableFontVariantRow = ({ title, selectedFont, type, onSelect }: FontVariantRowProps) => {\n\tconst [axes, selector] = React.useMemo(() => {\n\t\tif (isUndefined(selectedFont)) return [{}, undefined]\n\t\tconst { axesCSS } = parseAxesFromFontSelector(selectedFont)\n\t\tconst parsedAxes = axesCSS ? (cssToVariationAxes(axesCSS) ?? {}) : {}\n\t\tconst parsedSelector = removeEncodedAxesFromSelector(selectedFont)\n\t\treturn [parsedAxes, parsedSelector]\n\t}, [selectedFont])\n\n\tconst fontsSet = useMemo(() => {\n\t\tif (selector) return new Set([selector])\n\t\treturn new Set<string>()\n\t}, [selector])\n\n\tconst handleAxisChange = React.useCallback(\n\t\t(axisTag: VariationAxisTag | VariationAxisTag[], value: number | number[] | undefined) => {\n\t\t\tif (!selector) return\n\t\t\tconst updatedAxes = updateVariationAxes(axisTag, value, axes)\n\t\t\tif (isUndefined(updatedAxes)) return\n\n\t\t\tconst selectorWithAxes = addEncodedAxesToSelector(selector, updatedAxes)\n\t\t\tonSelect(selectorWithAxes)\n\t\t},\n\t\t[axes, selector, onSelect],\n\t)\n\n\treturn (\n\t\t<VariableFontRow\n\t\t\tisPreset\n\t\t\tid={type}\n\t\t\ttitle={title}\n\t\t\tpopoutButtonPreview={getVariableFontPopoutPreview(type, axes)}\n\t\t\tfonts={fontsSet}\n\t\t\tvariationAxesValues={axes}\n\t\t\tonChange={handleAxisChange}\n\t\t/>\n\t)\n}\n\ninterface FontVariants {\n\tboldVariants: ReadonlyFont[]\n\titalicVariants: ReadonlyFont[]\n\tboldItalicVariants: ReadonlyFont[]\n}\n\nfunction getCustomFontVariants(customFonts: ReadonlyFont[]): FontVariants {\n\treturn { boldVariants: customFonts, italicVariants: customFonts, boldItalicVariants: customFonts }\n}\n\nfunction getAvailableFontsPerVariant(baseFont: ReadonlyFont | undefined): FontVariants {\n\tif (!baseFont) return { boldVariants: [], italicVariants: [], boldItalicVariants: [] }\n\n\tconst sortedFonts = getFontsSortedByWeightAndStyle(baseFont.family.fonts)\n\n\tconst isBaseFontVariable = isFontVariable(baseFont)\n\tconst boldVariants: ReadonlyFont[] = []\n\tconst italicVariants: ReadonlyFont[] = []\n\tconst boldItalicVariants: ReadonlyFont[] = []\n\tsortedFonts.forEach(font => {\n\t\tif (!font.weight) return\n\t\tif (isBaseFontVariable !== isFontVariable(font)) return\n\t\tif (font.style === baseFont.style) boldVariants.push(font)\n\t\tif (font.weight === baseFont.weight && font.style !== \"normal\") italicVariants.push(font)\n\t\tif (font.style !== \"normal\") boldItalicVariants.push(font)\n\t})\n\n\treturn { boldVariants, italicVariants, boldItalicVariants }\n}\n\nconst defaultVariableFontPopoutPreview = \"Variable\"\nfunction getVariableFontPopoutPreview(type: VariantType, axes: ReducedFontVariationAxes) {\n\tconst { wght, slnt } = axes\n\n\tswitch (type) {\n\t\tcase \"bold\":\n\t\t\treturn !isUndefined(wght) ? String(wght) : defaultVariableFontPopoutPreview\n\t\tcase \"italic\":\n\t\t\treturn !isUndefined(slnt) ? String(slnt) : defaultVariableFontPopoutPreview\n\t\tcase \"boldItalic\":\n\t\t\tif (!isUndefined(wght) && !isUndefined(slnt)) {\n\t\t\t\treturn `${String(wght)}, ${String(slnt)}`\n\t\t\t} else if (!isUndefined(wght)) {\n\t\t\t\treturn String(wght)\n\t\t\t} else if (!isUndefined(slnt)) {\n\t\t\t\treturn String(slnt)\n\t\t\t} else {\n\t\t\t\treturn defaultVariableFontPopoutPreview\n\t\t\t}\n\t\tdefault:\n\t\t\treturn defaultVariableFontPopoutPreview\n\t}\n}\n", "import { isEmptyObject, isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport React from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"../PanelRow.tsx\"\nimport type { VariableFontPopoutProps } from \"./VariableFontPopout.tsx\"\nimport { VariableFontPopoutButton } from \"./VariableFontPopoutButton.tsx\"\nimport { supportsVariableFont } from \"./utils/supportsVariableFont.ts\"\n\ninterface Props extends Pick<VariableFontPopoutProps, \"variationAxesValues\" | \"onChange\"> {\n\tfonts: Set<string>\n\tisPreset: boolean\n\tnodeIds?: NodeID[]\n\tonDelete?: () => void\n\tid?: string\n\ttitle?: string\n\tpopoutButtonPreview?: string\n}\n\nconst variableFontTraitTypes = [TraitType.Font]\nconst variableFontTraitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"font\", \"html\"]\n\nfunction canCopyVariationAxes(variationAxesValues: ReducedFontVariationAxes | undefined) {\n\tfor (const key in variationAxesValues) {\n\t\tconst value = variationAxesValues[key]\n\t\tif (isMixed(value)) return false\n\t}\n\treturn true\n}\n\nconst VariableFontRowInner = React.memo(function VariableFontRowInner({\n\tfonts,\n\tnodeIds,\n\tisPreset,\n\tvariationAxesValues,\n\tid,\n\ttitle,\n\tpopoutButtonPreview,\n\tonChange,\n\tonDelete,\n}: Props) {\n\tconst canCopy =\n\t\t!isPreset &&\n\t\t!isEmptyObject(variationAxesValues) &&\n\t\tisClipboardSupported() &&\n\t\tcanCopyVariationAxes(variationAxesValues)\n\n\tconst [canPaste, paste, copy] = useCopyAndPasteSingleProperty(TraitType.Font, nodeIds, canCopy)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title ?? \"Variable\"}\n\t\t\tonCopy={isPreset ? undefined : copy}\n\t\t\tonPaste={isPreset ? undefined : paste}\n\t\t\tcopyEnabled={canCopy}\n\t\t\tpasteEnabled={canPaste}\n\t\t\ttraitTypes={variableFontTraitTypes}\n\t\t\ttraitTypeKeys={variableFontTraitTypeKeys}\n\t\t>\n\t\t\t<VariableFontPopoutButton\n\t\t\t\tid={id}\n\t\t\t\tvariationAxesValues={variationAxesValues}\n\t\t\t\tonChange={onChange}\n\t\t\t\tonDelete={onDelete}\n\t\t\t\tfontSelectors={fonts}\n\t\t\t\tpreview={popoutButtonPreview}\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n})\n\nexport const VariableFontRow = (props: Props) => {\n\tconst shouldShow = supportsVariableFont(props.fonts)\n\tif (!shouldShow) return null\n\n\treturn <VariableFontRowInner {...props} />\n}\n", "import { colors } from \"@framerjs/fresco/tokens\"\nimport { isEmptyObject, isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { PopoutButtonWithPreview } from \"document/components/chrome/shared/PopoutButtonWithPreview.tsx\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport {\n\tgetCommonVariableFont,\n\tgetDefaultVariationAxesValues,\n\tisFontVariable,\n} from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport React from \"react\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { containsMixedValue } from \"utils/containsMixedValue.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { BooleanPopoutButtonPreview } from \"../utils/BooleanPopoutButtonPreview.tsx\"\nimport type { VariableFontPopoutProps } from \"./VariableFontPopout.tsx\"\nimport { VariableFontPopout } from \"./VariableFontPopout.tsx\"\nimport { categorizeVariationAxes } from \"./utils/categorizeVariationAxes.ts\"\n\ninterface Props extends Pick<VariableFontPopoutProps, \"variationAxesValues\" | \"onChange\"> {\n\tfontSelectors: Set<string>\n\tonDelete?: () => void\n\tid?: string\n\tpreview?: string\n}\n\nexport const VariableFontPopoutButton = React.memo(function VariableFontPopoutButtonInner({\n\tfontSelectors,\n\tvariationAxesValues,\n\tpreview,\n\tid,\n\tonChange,\n\tonDelete,\n}: Props) {\n\tconst popoutId = `variable-font${id ? `-${id}` : \"\"}`\n\tconst anyVariationAxes = !isEmptyObject(variationAxesValues)\n\n\tconst commonVariableFont = React.useMemo(() => getCommonVariableFont(fontSelectors), [fontSelectors])\n\tconst isNonValidVariableFont = isMixed(commonVariableFont) || isUndefined(commonVariableFont)\n\n\tconst supportedVariationAxes = React.useMemo(() => {\n\t\tif (isNonValidVariableFont) return undefined\n\t\treturn commonVariableFont.variationAxes\n\t}, [commonVariableFont, isNonValidVariableFont])\n\n\tconst onlyVariableFonts =\n\t\t!isMixed(commonVariableFont) &&\n\t\t!isUndefined(commonVariableFont) &&\n\t\tcommonVariableFont.family.fonts.every(font => isFontVariable(font))\n\tconst canDelete = !onlyVariableFonts && !isNonValidVariableFont && !!onDelete\n\n\tconst handleDelete = React.useCallback(() => {\n\t\tif (!canDelete) return\n\t\tpopoutWindow.navigation.dismiss(popoutId)\n\t\tonDelete()\n\t}, [canDelete, popoutId, onDelete])\n\n\tconst handleAddVariationAxes = React.useCallback(() => {\n\t\tif (!supportedVariationAxes) return false\n\n\t\tconst selector = commonValue(fontSelectors)\n\t\tlet nonVariableFontWeight: number | undefined\n\t\t// The initial weight of the static font, before it has been updated to\n\t\t// a variable font and the variation axes have been applied. This is used\n\t\t// to determine the default variable font's weight we should use if the\n\t\t// variable font has a variation axis for weight ('wght').\n\t\tif (isString(selector)) {\n\t\t\tconst currentFont = fontStore.getFontBySelector(selector)\n\t\t\tif (currentFont && !isFontVariable(currentFont)) {\n\t\t\t\tnonVariableFontWeight = currentFont?.weight\n\t\t\t}\n\t\t}\n\n\t\t// When there are no variation axes values set, we want to set\n\t\t// the default values provided by the font for each variation axis.\n\t\tif (isEmptyObject(variationAxesValues)) {\n\t\t\tconst { tags, values } = getDefaultVariationAxesValues(supportedVariationAxes, nonVariableFontWeight)\n\t\t\tvoid onChange(tags, values, supportedVariationAxes)\n\t\t}\n\t\treturn true\n\t}, [fontSelectors, supportedVariationAxes, variationAxesValues, onChange])\n\n\tconst variationAxes = React.useMemo(() => categorizeVariationAxes(supportedVariationAxes), [supportedVariationAxes])\n\n\t// If the popout is already open, and we select a node that doesn't have any variation axes,\n\t// we want to close the popout.\n\tif (popoutWindow.navigation.isPresenting(popoutId) && !anyVariationAxes) {\n\t\tpopoutWindow.navigation.dismiss(popoutId)\n\t}\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tid={popoutId}\n\t\t\tpopout={\n\t\t\t\t<VariableFontPopout\n\t\t\t\t\tvariationAxes={variationAxes}\n\t\t\t\t\tvariationAxesValues={variationAxesValues}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tdisplayDivider\n\t\t\tonBeforePresent={handleAddVariationAxes}\n\t\t\tpreview={<BooleanPopoutButtonPreview enabled={anyVariationAxes} />}\n\t\t\tnavigationTitle=\"Variable\"\n\t\t\ttitle={preview ?? getFallbackTitle(variationAxesValues)}\n\t\t\ttitleColor={anyVariationAxes ? undefined : colors.inputLabel}\n\t\t\tonDelete={anyVariationAxes && canDelete ? handleDelete : undefined}\n\t\t\tenabled={!isNonValidVariableFont}\n\t\t/>\n\t)\n})\n\nfunction getFallbackTitle(variationAxesValues: ReducedFontVariationAxes): string {\n\tif (containsMixedValue(variationAxesValues)) {\n\t\treturn Dictionary.Mixed\n\t}\n\tif (isEmptyObject(variationAxesValues)) {\n\t\treturn Dictionary.AddEllipsis\n\t}\n\treturn \"Enabled\"\n}\n", "import { isMixed } from \"@framerjs/shared\"\nimport { isArray, isObject } from \"utils/typeChecks.ts\"\n\n/** Returns whether a value contains `Mixed` anywhere inside nested arrays or objects. */\nexport function containsMixedValue(value: unknown): boolean {\n\treturn containsMixedValueRecursively(value, new WeakSet<object>())\n}\n\nfunction containsMixedValueRecursively(value: unknown, visited: WeakSet<object>): boolean {\n\tif (isMixed(value)) return true\n\tif (!isArray(value) && !isObject(value)) return false\n\tif (visited.has(value)) return false\n\n\tvisited.add(value)\n\n\tif (isArray(value)) {\n\t\tfor (const item of value) {\n\t\t\tif (containsMixedValueRecursively(item, visited)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tfor (const key of Object.keys(value)) {\n\t\tif (containsMixedValueRecursively(value[key], visited)) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n", "import type { SVGProps } from \"react\"\n\nexport function IconAgentToggleOff(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\trole=\"presentation\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tfill=\"none\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tfill=\"transparent\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M.75 6.25a4 4 0 0 1 4-4h2.5a4 4 0 0 1 0 8h-2.5a4 4 0 0 1-4-4Z\"\n\t\t\t/>\n\t\t\t<path fill=\"currentColor\" d=\"M4.5 4.75a1.5 1.5 0 1 1-.001 3.001A1.5 1.5 0 0 1 4.5 4.75\" />\n\t\t</svg>\n\t)\n}\n", "import type { SVGProps } from \"react\"\n\nexport function IconAgentToggleOn(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\trole=\"presentation\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tfill=\"none\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity={0.2}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M.75 6.25a4 4 0 0 1 4-4h2.5a4 4 0 0 1 0 8h-2.5a4 4 0 0 1-4-4Z\"\n\t\t\t/>\n\t\t\t<path fill=\"currentColor\" d=\"M7.5 4.75a1.5 1.5 0 1 1-.001 3.001A1.5 1.5 0 0 1 7.5 4.75\" />\n\t\t</svg>\n\t)\n}\n", "import { colors } from \"@framerjs/fresco/tokens\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { PopoutButtonPreviewIconWrapper } from \"document/components/chrome/shared/PopoutButtonPreviewIconWrapper.tsx\"\nimport { IconAgentToggleOff } from \"./icons/IconAgentToggleOff.tsx\"\nimport { IconAgentToggleOn } from \"./icons/IconAgentToggleOn.tsx\"\n\ninterface Props {\n\tenabled: boolean\n}\n\nexport const BooleanPopoutButtonPreview = ({ enabled }: Props) => {\n\tconst agentExperimentEnabled = useExperimentIsOn(\"agent\")\n\n\treturn (\n\t\t<PopoutButtonPreviewIconWrapper background={enabled ? colors.tint : colors.stylesPresetsIconBackground}>\n\t\t\t{agentExperimentEnabled ? (\n\t\t\t\tenabled ? (\n\t\t\t\t\t<IconAgentToggleOn />\n\t\t\t\t) : (\n\t\t\t\t\t<IconAgentToggleOff />\n\t\t\t\t)\n\t\t\t) : (\n\t\t\t\t<svg\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tfocusable=\"false\"\n\t\t\t\t>\n\t\t\t\t\t<BooleanPopoutButtonPreviewIconPath enabled={enabled} />\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</PopoutButtonPreviewIconWrapper>\n\t)\n}\n\nconst BooleanPopoutButtonPreviewIconPath = ({ enabled }: { enabled: boolean }) => {\n\tif (enabled) {\n\t\treturn (\n\t\t\t<path\n\t\t\t\td=\"M 6 4 L 10 4 C 12.209 4 14 5.791 14 8 C 14 10.209 12.209 12 10 12 L 6 12 C 3.791 12 2 10.209 2 8 C 2 5.791 3.791 4 6 4 Z M 7.5 8 C 7.5 9.381 8.619 10.5 10 10.5 C 11.381 10.5 12.5 9.381 12.5 8 C 12.5 6.619 11.381 5.5 10 5.5 C 8.619 5.5 7.5 6.619 7.5 8 Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t/>\n\t\t)\n\t}\n\n\treturn (\n\t\t<path\n\t\t\td=\"M 6 4 L 10 4 C 12.209 4 14 5.791 14 8 C 14 10.209 12.209 12 10 12 L 6 12 C 3.791 12 2 10.209 2 8 C 2 5.791 3.791 4 6 4 Z M 3.5 8 C 3.5 9.381 4.619 10.5 6 10.5 C 7.381 10.5 8.5 9.381 8.5 8 C 8.5 6.619 7.381 5.5 6 5.5 C 4.619 5.5 3.5 6.619 3.5 8 Z\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t)\n}\n", "import { NumberInputWithTicker, Scroll, Slider, Stack, Translatable as T } from \"@framerjs/fresco\"\nimport type { Mixed } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { ReducedFontVariationAxes } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport type { VariationAxis, VariationAxisTag } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport type { ReadonlyFontVariationAxes } from \"library/render/fonts/types.ts\"\nimport React from \"react\"\nimport { PanelRow } from \"../PanelRow.tsx\"\nimport * as styles from \"./VariableFontPopout.styles.ts\"\nimport type { CategorizedVariationAxes } from \"./utils/categorizeVariationAxes.ts\"\n\ninterface ChangeVariationAxisHandler {\n\t(axisTag: VariationAxisTag, value: number | undefined, availableVariationAxes?: undefined): Promise<void> | void\n\t(\n\t\taxisTag: VariationAxisTag[],\n\t\tvalue: number[] | undefined,\n\t\tavailableVariationAxes: ReadonlyFontVariationAxes,\n\t): Promise<void> | void\n}\n\nexport interface VariableFontPopoutProps {\n\tvariationAxes: CategorizedVariationAxes | undefined\n\tvariationAxesValues: ReducedFontVariationAxes\n\tonChange: ChangeVariationAxisHandler\n}\n\nexport const VariableFontPopout = React.memo(function VariableFontPopout({\n\tvariationAxes,\n\tonChange,\n\tvariationAxesValues,\n}: VariableFontPopoutProps) {\n\treturn (\n\t\t<Scroll direction=\"vertical\" className={styles.scroll}>\n\t\t\t<Stack gap={0} shrink={1} paddingTop={15}>\n\t\t\t\t{variationAxes?.uncategorized?.map(axis => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<VariationSettingRow\n\t\t\t\t\t\t\tkey={axis.tag}\n\t\t\t\t\t\t\taxis={axis}\n\t\t\t\t\t\t\tvalue={variationAxesValues?.[axis.tag]}\n\t\t\t\t\t\t\tonValueChange={onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\n\t\t\t\t{variationAxes?.categorized &&\n\t\t\t\t\tObject.entries(variationAxes.categorized).map(([category, axes]) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Stack key={category} gap={0} shrink={1}>\n\t\t\t\t\t\t\t\t<div className={styles.categoryTitleWrapper}>\n\t\t\t\t\t\t\t\t\t<div className={styles.categoryTitleContainer}>\n\t\t\t\t\t\t\t\t\t\t<T className={styles.categoryTitle}>{category}</T>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<Stack key={category} gap={0} shrink={1}>\n\t\t\t\t\t\t\t\t\t{axes?.map(axis => {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<VariationSettingRow\n\t\t\t\t\t\t\t\t\t\t\t\tkey={axis.tag}\n\t\t\t\t\t\t\t\t\t\t\t\taxis={axis}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={variationAxesValues?.[axis.tag]}\n\t\t\t\t\t\t\t\t\t\t\t\tonValueChange={onChange}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</Stack>\n\t\t</Scroll>\n\t)\n})\n\ninterface VariationSettingRowProps {\n\taxis: VariationAxis\n\tvalue: number | Mixed | undefined\n\tonValueChange: ChangeVariationAxisHandler\n}\n\nconst VariationSettingRow = React.memo(function VariationSettingRow({\n\tvalue,\n\taxis,\n\tonValueChange,\n}: VariationSettingRowProps) {\n\tconst { minValue, maxValue, defaultValue } = axis\n\tconst currentValue = value ?? defaultValue\n\tconst { name, dimension } = axis.name ? parsedName(axis.name) : { name: axis.tag }\n\n\tconst handleContextMenu = (event: React.MouseEvent) => {\n\t\tengine.stores.contextMenuStore.show(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Reset to default\",\n\t\t\t\t\tenabled: currentValue !== defaultValue,\n\t\t\t\t\tclick: () => onValueChange(axis.tag, defaultValue),\n\t\t\t\t},\n\t\t\t],\n\t\t\t{ location: { x: event.clientX, y: event.clientY } },\n\t\t)\n\t}\n\n\tconst handleValueChange = async (newValue: number) => {\n\t\tawait onValueChange(axis.tag, newValue)\n\t}\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={name}\n\t\t\ttitleClassName={styles.panelRowTitle}\n\t\t\ttitleTooltip={axis.name ?? axis.tag}\n\t\t\tclassName={styles.panelRow}\n\t\t\tonContextMenu={handleContextMenu}\n\t\t>\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={currentValue}\n\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\tonChange={handleValueChange}\n\t\t\t\tmin={minValue}\n\t\t\t\tmax={maxValue}\n\t\t\t\tstep={1}\n\t\t\t\tlabel={dimension?.charAt(0).toLocaleUpperCase()}\n\t\t\t/>\n\t\t\t<Slider value={currentValue} onChange={handleValueChange} min={minValue} max={maxValue} step={1} />\n\t\t</PanelRow>\n\t)\n})\n\nconst axisDimensions = [\"width\", \"height\", \"weight\", \"depth\", \"stroke\", \"size\"] as const\ntype AxisDimension = (typeof axisDimensions)[number]\n\nfunction parsedName(name: string): { name: string; dimension?: AxisDimension } {\n\tif (name.split(\" \").length === 1) return { name }\n\n\tconst dimension = axisDimensions.find(dimension => name.toLowerCase().includes(dimension))\n\tif (dimension) return { name: name.toLowerCase().replace(dimension, \"\").trim(), dimension }\n\treturn { name }\n}\n", "import \"VariableFontPopout.styles_1g9itxj.wyw.css\"; export const panelRow = \"panelRow_pbi000k\";\nexport const panelRowTitle = \"panelRowTitle_pskvpy9\";\nexport const categoryTitleWrapper = \"categoryTitleWrapper_ccc9i9p\";\nexport const categoryTitleContainer = \"categoryTitleContainer_c125igxg\";\nexport const categoryTitle = \"categoryTitle_c134xsiq\";\nexport const scroll = \"scroll_s143lwoh\";", "import type { VariationAxis } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport type { ReadonlyFontVariationAxes } from \"library/render/fonts/types.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\n\nexport interface CategorizedVariationAxes {\n\tuncategorized: VariationAxis[]\n\tcategorized: { [key: string]: VariationAxis[] }\n}\n\nfunction getCommonPrefixWords(str1: string, str2: string): string[] {\n\tconst words1 = str1.split(\" \")\n\tconst words2 = str2.split(\" \")\n\tconst commonPrefixWords: string[] = []\n\n\t// Only consider words from the start of both strings\n\tfor (let i = 0; i < Math.min(words1.length, words2.length); i++) {\n\t\tif (words1[i]?.toLowerCase() === words2[i]?.toLowerCase()) {\n\t\t\tconst word = words1[i]\n\t\t\tif (word) commonPrefixWords.push(word)\n\t\t} else {\n\t\t\tbreak // Stop at first non-matching word\n\t\t}\n\t}\n\n\treturn commonPrefixWords\n}\n\nfunction findMaxCommonPrefixAxis(\n\tcurrentAxis: VariationAxis,\n\taxes: ReadonlyFontVariationAxes,\n): [string, VariationAxis | null] {\n\tlet maxCommonPrefix = \"\"\n\tlet maxCommonPrefixAxis: VariationAxis | null = null\n\n\tfor (const axis of axes) {\n\t\t// Skip if same axis or if either axis has no name\n\t\tif (currentAxis === axis || !currentAxis.name || !axis.name) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst commonPrefixWords = getCommonPrefixWords(currentAxis.name, axis.name).join(\" \")\n\t\tif (commonPrefixWords && commonPrefixWords.length > maxCommonPrefix.length) {\n\t\t\tmaxCommonPrefix = commonPrefixWords\n\t\t\tmaxCommonPrefixAxis = axis\n\t\t}\n\t}\n\n\treturn [maxCommonPrefix, maxCommonPrefixAxis]\n}\n\nfunction addToCategoryIfUnique(category: VariationAxis[], axis: VariationAxis, commonPrefix: string): void {\n\tconst name = axis.name ?? \"\"\n\tif (category.some(existing => existing.tag === axis.tag)) return\n\tcategory.push({ ...axis, name: name.slice(commonPrefix.length).trim() })\n}\n\nfunction processAxisPair(\n\tcategorizedAxes: { [key: string]: VariationAxis[] },\n\taxis: VariationAxis,\n\tcommonPrefixWords: string,\n\tpairedAxis: VariationAxis,\n): void {\n\tconst category = categorizedAxes[commonPrefixWords] ?? []\n\n\taddToCategoryIfUnique(category, axis, commonPrefixWords)\n\taddToCategoryIfUnique(category, pairedAxis, commonPrefixWords)\n\n\tcategorizedAxes[commonPrefixWords] = category\n}\n\n/**\n * Moves lone axes into the uncategorized list\n * Example: If \"Style\" category only has \"Italic\":\n * - Moves it to uncategorized list\n * - Restores full name: \"Style Italic\"\n * - Removes the empty \"Style\" category\n */\nfunction consolidateSingleItemCategories(\n\tcategorizedAxes: { [key: string]: VariationAxis[] },\n\tuncategorizedAxes: VariationAxis[],\n): void {\n\tfor (const category in categorizedAxes) {\n\t\tconst axes = categorizedAxes[category]\n\t\tif (isUndefined(axes)) continue\n\t\tconst firstAxis = axes[0]\n\t\tif (!firstAxis || axes.length !== 1) continue\n\n\t\tuncategorizedAxes.push({ ...firstAxis, name: `${category} ${firstAxis.name ?? \"\"}`.trim() })\n\t\tdelete categorizedAxes[category]\n\t}\n}\n\n/**\n * Organizes font variation axes into logical groups\n * Example:\n * - Input: [\"Width\", \"Slant\", \"Parametric Thick Stroke\", \"Parametric Thin Stroke\"]\n * - Output:\n *    - Category \"Parametric\" contains \"Thick Stroke\" and \"Thin Stroke\"\n *    - Uncategorized contains \"Width\" and \"Slant\"\n */\nexport function categorizeVariationAxes(axes?: ReadonlyFontVariationAxes): CategorizedVariationAxes {\n\tif (!axes) return { uncategorized: [], categorized: {} }\n\n\tconst categorizedAxes: { [key: string]: VariationAxis[] } = {}\n\tconst uncategorizedAxes: VariationAxis[] = []\n\n\taxes.forEach(axis => {\n\t\tif (!axis.name) {\n\t\t\tuncategorizedAxes.push(axis)\n\t\t\treturn\n\t\t}\n\n\t\tconst [commonPrefixWords, maxCommonPrefixAxis] = findMaxCommonPrefixAxis(axis, axes)\n\n\t\t// Only categorize if we found a common prefix and a matching axis\n\t\tif (commonPrefixWords && maxCommonPrefixAxis) {\n\t\t\tprocessAxisPair(categorizedAxes, axis, commonPrefixWords, maxCommonPrefixAxis)\n\t\t} else {\n\t\t\tuncategorizedAxes.push(axis)\n\t\t}\n\t})\n\n\tconsolidateSingleItemCategories(categorizedAxes, uncategorizedAxes)\n\n\treturn { categorized: categorizedAxes, uncategorized: uncategorizedAxes }\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport { experiments } from \"app/experiments.ts\"\nimport { fontStore } from \"library/index.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\n\nexport function supportsVariableFont(fonts: Set<string>): boolean {\n\tif (!fonts.size) return false\n\tfor (const fontSelector of fonts) {\n\t\tconst font = fontStore.getFontBySelector(fontSelector)\n\t\tconst source = font?.family.source\n\t\tif (isUndefined(source)) return false\n\n\t\tswitch (source) {\n\t\t\tcase \"builtIn\":\n\t\t\t\tif (font?.variationAxes) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase \"custom\":\n\t\t\t\t// TODO: this can be combined with the other cases below once the experiment is removed\n\t\t\t\tif (experiments.isOn(\"customFontGrouping\")) {\n\t\t\t\t\tif (!isUndefined(font?.selectorVariable)) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (font?.variationAxes) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase \"google\":\n\t\t\tcase \"fontshare\":\n\t\t\tcase \"framer\":\n\t\t\t\tif (!isUndefined(font?.selectorVariable)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase \"local\":\n\t\t\t\treturn false\n\t\t\tdefault:\n\t\t\t\tassertNever(source)\n\t\t}\n\t}\n\treturn false\n}\n", "import type { VirtualListProps } from \"@framerjs/fresco\"\nimport { SearchBar, Stack, VirtualList, truncateWithEllipsis, useReadOnly } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { isCommandKeyPressed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport {\n\tfontFamilyRow,\n\tfontFamilyRowHighlighted,\n\tfontFamilyRowSelected,\n} from \"document/components/chrome/shared/FontPopout/ListItem.styles.ts\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport type { Point } from \"library/render/types/Point.ts\"\nimport React from \"react\"\nimport * as classes from \"./CustomFontPopout.styles.ts\"\n\ninterface Props {\n\tcustomFonts: ReadonlyFont[]\n\tonSelect: (selector: string) => void\n\tselectedFont: string | undefined\n}\n\n/** Simplified version of TypefacePopout */\nexport function CustomFontPopout({ customFonts, onSelect, selectedFont }: Props) {\n\tconst isReadOnly = useReadOnly()\n\n\tconst [search, setSearch] = React.useState(\"\")\n\tconst [highlight, setHighlight] = React.useState(-1)\n\tconst [highlightVisible, setHighlightVisble] = React.useState(true)\n\tconst [scrollToIndex, setScrollToIndex] = React.useState(-1)\n\tconst [scrollToAlignment, setScrollToAlignment] = React.useState<VirtualListProps[\"scrollToAlignment\"]>(\"center\")\n\n\tconst normalizedSearch = search.toLowerCase().trim()\n\tconst filteredFonts = normalizedSearch\n\t\t? customFonts.filter(fontFamily => fontFamily.family.name.toLowerCase().includes(normalizedSearch))\n\t\t: customFonts\n\n\tconst searchInputRef = React.useRef<HTMLInputElement>(null)\n\n\tconst highlightRef = React.useRef(highlight)\n\thighlightRef.current = highlight\n\tconst selectedFontsRef = React.useRef(selectedFont)\n\tselectedFontsRef.current = selectedFont\n\tconst filteredFontsRef = React.useRef(filteredFonts)\n\tfilteredFontsRef.current = filteredFonts\n\n\tReact.useEffect(() => {\n\t\tconst currentSeletedItem = selectedFontsRef.current\n\t\tconst currentFilteredFontFamilies = filteredFontsRef.current\n\n\t\tlet newIndex = 0\n\n\t\tconst selectedItemIndex = currentFilteredFontFamilies.findIndex(font => font.selector === currentSeletedItem)\n\t\tif (selectedItemIndex !== -1) newIndex = selectedItemIndex\n\n\t\tsetScrollToAlignment(\"center\")\n\t\tsetScrollToIndex(newIndex)\n\t\tsetHighlight(newIndex)\n\t}, [filteredFonts.length])\n\n\tconst selectFont = React.useCallback(\n\t\t(value: string) => {\n\t\t\tif (isReadOnly) return\n\t\t\tonSelect(value)\n\t\t\tconst index = filteredFonts.findIndex(font => font.selector === value)\n\t\t\tsetScrollToIndex(index)\n\t\t},\n\t\t[onSelect, filteredFonts, isReadOnly],\n\t)\n\n\tconst searchHandler = React.useCallback(\n\t\t(value: string) => {\n\t\t\tif (search === value) return\n\t\t\tsetSearch(value)\n\t\t\tsetScrollToIndex(-1)\n\t\t},\n\t\t[search],\n\t)\n\n\tconst keydownHandler = React.useCallback(\n\t\t(event: React.KeyboardEvent) => {\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"f\":\n\t\t\t\tcase \"l\": {\n\t\t\t\t\tif (isCommandKeyPressed(event) && searchInputRef.current) {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tsearchInputRef.current.focus()\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"Enter\": {\n\t\t\t\t\t// Control+Enter (Force use custom font)\n\t\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\t\tif (search) {\n\t\t\t\t\t\t\tconst selectedItem = fontStore.getFontBySelector(search)\n\t\t\t\t\t\t\tif (!selectedItem?.selector) return\n\t\t\t\t\t\t\tselectFont(selectedItem.selector)\n\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\t// Enter\n\t\t\t\t\tconst currentHighlight = highlightRef.current\n\t\t\t\t\tconst selectedItem = filteredFonts[currentHighlight]\n\t\t\t\t\tif (!selectedItem) break\n\t\t\t\t\tselectFont(selectedItem.selector)\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\tconst currentHighlight = highlightRef.current\n\t\t\t\t\tlet newIndex = event.key === \"ArrowUp\" ? currentHighlight - 1 : currentHighlight + 1\n\t\t\t\t\t// If the key is repeating we don't want to move to the other end of the list\n\t\t\t\t\tif (newIndex >= filteredFonts.length) {\n\t\t\t\t\t\tnewIndex = event.repeat ? filteredFonts.length - 1 : 0\n\t\t\t\t\t} else if (newIndex < 0) {\n\t\t\t\t\t\tnewIndex = event.repeat ? 0 : filteredFonts.length - 1\n\t\t\t\t\t}\n\t\t\t\t\tsetScrollToIndex(newIndex)\n\t\t\t\t\tsetHighlight(newIndex)\n\t\t\t\t\tsetScrollToAlignment(\"nearest-edge\")\n\t\t\t\t\tsetHighlightVisble(true)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\tpopoutWindow.navigation.goBack()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t},\n\t\t[filteredFonts, selectFont, search],\n\t)\n\n\tconst highlightClientRef = React.useRef<Point | null>(null)\n\tconst highlightHandler = React.useCallback(\n\t\t(index: number, event: React.MouseEvent) => {\n\t\t\tconst client = { x: event.clientX, y: event.clientY }\n\t\t\tconst previousClient = highlightClientRef.current\n\t\t\thighlightClientRef.current = client\n\n\t\t\tif (previousClient && previousClient.x === client.x && previousClient.y === client.y) return\n\t\t\tif (highlightVisible && highlight === index) return\n\n\t\t\tsetHighlight(index)\n\t\t\tsetScrollToIndex(-1)\n\t\t\tsetHighlightVisble(true)\n\t\t},\n\t\t[highlight, highlightVisible],\n\t)\n\n\tconst hideHighlight = React.useCallback(() => {\n\t\tsetHighlightVisble(false)\n\t}, [])\n\n\treturn (\n\t\t<div className={classes.popoutContent} onKeyDown={keydownHandler}>\n\t\t\t<Stack padding={dimensions.css.popoverPadding} paddingTop={0}>\n\t\t\t\t<SearchBar\n\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonChange={searchHandler}\n\t\t\t\t\tonKeyDown={keydownHandler}\n\t\t\t\t\tisIconVisible={false}\n\t\t\t\t/>\n\t\t\t</Stack>\n\n\t\t\t<VirtualList\n\t\t\t\titems={filteredFonts}\n\t\t\t\theightForItem={30}\n\t\t\t\tkeyForItem={keyForItem}\n\t\t\t\tclassName={classes.scroll}\n\t\t\t\tscrollToIndex={scrollToIndex}\n\t\t\t\tscrollToAlignment={scrollToAlignment}\n\t\t\t\tonMouseLeave={hideHighlight}\n\t\t\t\tstyle={{ paddingBottom: 10 }}\n\t\t\t>\n\t\t\t\t{({ item: font, index }) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tonClick={() => onSelect(font.selector)}\n\t\t\t\t\t\tonMouseMove={event => highlightHandler(index, event)}\n\t\t\t\t\t\tclassName={cx(\n\t\t\t\t\t\t\tfontFamilyRow,\n\t\t\t\t\t\t\thighlight === index && fontFamilyRowHighlighted,\n\t\t\t\t\t\t\tfont.selector === selectedFont && fontFamilyRowSelected,\n\t\t\t\t\t\t\tisReadOnly && classes.disabled,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className={cx(truncateWithEllipsis, classes.titleWrapper)}>{font.family.name}</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</VirtualList>\n\t\t</div>\n\t)\n}\n\nfunction keyForItem(font: ReadonlyFont): string {\n\treturn font.selector\n}\n", "import \"CustomFontPopout.styles_1uugha3.wyw.css\"; export const popoutContent = \"popoutContent_p1tmwa2k\";\nexport const scroll = \"scroll_s1vwizfh\";\nexport const titleWrapper = \"titleWrapper_te5beix\";\nexport const disabled = \"disabled_d1kuhare\";", "import { palette } from \"@framerjs/fresco/tokens\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithFontVariants } from \"document/models/CanvasTree/traits/WithFontVariants.ts\"\nimport { fontVariantsDefaults } from \"document/models/CanvasTree/traits/WithFontVariants.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { FontSourceNames, fontStore } from \"library/index.ts\"\nimport { PopoutButtonWithPreview } from \"../../../shared/PopoutButtonWithPreview.tsx\"\nimport { PresetIcon } from \"../../../shared/PresetIcon.tsx\"\nimport { doubleColumnClass } from \"../../utils/doubleColumn.styles.ts\"\nimport { PanelRow } from \"../PanelRow.tsx\"\nimport { FontVariantsPopout } from \"./FontVariantsPopout.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle & WithFontVariants\n\tdeleteEnabled?: boolean\n\temptyLabel?: string\n}\n\nexport function StylePresetFontVariantsRow({ preset, deleteEnabled, emptyLabel }: Props) {\n\tconst customFonts = useDeprecatedEngineState([EngineChange.CustomFontStore], () =>\n\t\tfontStore\n\t\t\t.getAvailableFonts()\n\t\t\t.filter(font => font.family.source === FontSourceNames.Custom)\n\t\t\t.sort((firstFont, secondFont) => {\n\t\t\t\treturn firstFont.family.name.localeCompare(secondFont.family.name)\n\t\t\t}),\n\t)\n\n\tconst changeFontBold = engine.scheduler.wrapHandler((fontBold: string | undefined) => {\n\t\tengine.tree.current(preset)?.set({ fontBold })\n\t})\n\n\tconst changeFontBoldItalic = engine.scheduler.wrapHandler((fontBoldItalic: string | undefined) => {\n\t\tengine.tree.current(preset)?.set({ fontBoldItalic })\n\t})\n\n\tconst changeFontItalic = engine.scheduler.wrapHandler((fontItalic: string | undefined) => {\n\t\tengine.tree.current(preset)?.set({ fontItalic })\n\t})\n\n\tconst hasFontVariants = preset.fontBold || preset.fontBoldItalic || preset.fontItalic\n\n\tconst deleteFontVariants = () => {\n\t\tengine.tree.current(preset)?.set(fontVariantsDefaults)\n\t}\n\n\tconst onDelete = deleteEnabled && hasFontVariants ? deleteFontVariants : undefined\n\n\treturn (\n\t\t<PanelRow title=\"Styles\" onDelete={onDelete}>\n\t\t\t<PopoutButtonWithPreview\n\t\t\t\tclassName={doubleColumnClass}\n\t\t\t\tnavigationTitle=\"Styles\"\n\t\t\t\ttitle={hasFontVariants ? \"Bold, Italic\" : emptyLabel || Dictionary.None}\n\t\t\t\tpreview={<PresetIcon background={palette.blue60} icon={<BoldAndItalicIcon />} />}\n\t\t\t\tenabled={!!preset.font}\n\t\t\t\tpopout={\n\t\t\t\t\t<FontVariantsPopout\n\t\t\t\t\t\tcustomFonts={customFonts}\n\t\t\t\t\t\tselectedFont={preset.font}\n\t\t\t\t\t\tonChangeFontBold={changeFontBold}\n\t\t\t\t\t\tonChangeFontBoldItalic={changeFontBoldItalic}\n\t\t\t\t\t\tonChangeFontItalic={changeFontItalic}\n\t\t\t\t\t\tselectedBoldFont={preset.fontBold}\n\t\t\t\t\t\tselectedBoldItalicFont={preset.fontBoldItalic}\n\t\t\t\t\t\tselectedItalicFont={preset.fontItalic}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n}\n\nfunction BoldAndItalicIcon() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\">\n\t\t\t<g fill=\"transparent\" stroke=\"hsl(0, 0%, 100%)\" strokeWidth=\"2\">\n\t\t\t\t<path d=\"M7.627 11a.127.127 0 0 1-.127-.127V7.127c0-.07.057-.127.127-.127H12a2 2 0 1 1 0 4ZM7.647 15a.147.147 0 0 1-.147-.147v-3.706c0-.081.066-.147.147-.147H13a2 2 0 1 1 0 4Z\" />\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { LetterSpacingUnit, WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { migrateLetterSpacing } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport React from \"react\"\nimport { getLetterSpacingUnitFromValue } from \"../../panels/utils/textStyle.ts\"\nimport { LetterSpacingRow } from \"../LetterSpacingRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n}\n\nexport const StylePresetLetterSpacingRow = React.memo(function TextStylePresetLetterSpacingRow({ preset }: Props) {\n\tconst letterSpacing = migrateLetterSpacing(preset.letterSpacing)\n\n\tconst changeLetterSpacingValue = engine.scheduler.wrapHandler((value: number, rawValue?: string) => {\n\t\tconst [, prevUnit] = letterSpacing\n\t\tconst unit = getLetterSpacingUnitFromValue(rawValue) ?? prevUnit\n\n\t\tengine.tree.current(preset)?.set({ letterSpacing: [value, unit] })\n\t})\n\n\tconst changeLetterSpacingUnit = engine.scheduler.wrapHandler((unit: LetterSpacingUnit) => {\n\t\tconst [_, prevUnit] = letterSpacing\n\t\tif (prevUnit === unit) return\n\n\t\t// Reset value back to 0 when switching unit\n\t\tengine.tree.current(preset)?.set({ letterSpacing: [0, unit] })\n\t})\n\n\tconst [value, unit] = letterSpacing\n\tconst units = React.useMemo(() => new Set([unit]), [unit])\n\treturn (\n\t\t<LetterSpacingRow\n\t\t\tvalue={value}\n\t\t\tunits={units}\n\t\t\tonChangeValue={changeLetterSpacingValue}\n\t\t\tonChangeUnit={changeLetterSpacingUnit}\n\t\t/>\n\t)\n})\n", "import { NumberInputWithTicker, PopupButton, PopupButtonItem } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { LetterSpacingUnit } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { textStyleDefaults } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { notFoundToUndefined } from \"document/models/CanvasTree/traits/utils/notFoundToUndefined.ts\"\nimport { useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\n// Similar order as the line height row.\nconst letterSpacingUnits: LetterSpacingUnit[] = [\"em\", \"px\"]\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\tvalue: Reduced<number | undefined>\n\tunits: Set<LetterSpacingUnit | undefined>\n\tsupportsCopyPaste?: boolean\n\tonChangeValue(value: number, rawValue?: string): void\n\tonChangeUnit(value: LetterSpacingUnit): void\n}\n\nconst traitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"letterSpacing\", \"html\"]\n\nexport function LetterSpacingRow({\n\tnodeIds,\n\tvalue,\n\tunits,\n\tsupportsCopyPaste = false,\n\tonChangeUnit,\n\tonChangeValue,\n}: Props) {\n\tconst canCopyLetterSpacing = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(value),\n\t\t[supportsCopyPaste, value],\n\t)\n\n\tconst [canPasteLetterSpacing, pasteLetterSpacing, copyLetterSpacing] = useCopyAndPasteSingleProperty(\n\t\tTraitType.LetterSpacing,\n\t\tnodeIds,\n\t\tcanCopyLetterSpacing,\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\ttitle=\"Letter\"\n\t\t\tcopyEnabled={canCopyLetterSpacing}\n\t\t\tonCopy={supportsCopyPaste ? copyLetterSpacing : undefined}\n\t\t\tpasteEnabled={canPasteLetterSpacing}\n\t\t\tonPaste={supportsCopyPaste ? pasteLetterSpacing : undefined}\n\t\t>\n\t\t\t<NumberInputWithTicker\n\t\t\t\tonChange={onChangeValue}\n\t\t\t\tvalue={notFoundToUndefined(value)}\n\t\t\t\tdefaultValue={textStyleDefaults.letterSpacing[0]}\n\t\t\t\tstep={units.has(\"px\") ? 0.1 : 0.01}\n\t\t\t\tdata-testid=\"textpanel-letterspacing-input\"\n\t\t\t/>\n\t\t\t<PopupButton>\n\t\t\t\t{letterSpacingUnits.map(unit => (\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tkey={unit}\n\t\t\t\t\t\tidentifier={unit}\n\t\t\t\t\t\ttitle={getTitleForUnit}\n\t\t\t\t\t\tselected={units.has(unit)}\n\t\t\t\t\t\tonSelect={onChangeUnit}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</PopupButton>\n\t\t</PanelRow>\n\t)\n}\n\nfunction getTitleForUnit(unit: LetterSpacingUnit) {\n\tswitch (unit) {\n\t\tcase \"em\":\n\t\t\treturn Dictionary.Em\n\t\tcase \"px\":\n\t\t\treturn Dictionary.Pixels\n\t}\n}\n", "import { NumberInputWithTicker, PopupButton, PopupButtonItem } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { LineHeightUnit } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { textStyleDefaults } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { notFoundToUndefined } from \"document/models/CanvasTree/traits/utils/notFoundToUndefined.ts\"\nimport { useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\tvalue: Reduced<number | undefined>\n\tunits: Set<LineHeightUnit | undefined>\n\tsupportsCopyPaste?: boolean\n\tonChangeValue(value: number, rawValue?: string): void\n\tonChangeUnit(value: LineHeightUnit): void\n}\n\nconst traitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"lineHeight\", \"html\"]\n\nexport function LineHeightRow({\n\tnodeIds,\n\tvalue,\n\tunits,\n\tsupportsCopyPaste = false,\n\tonChangeValue,\n\tonChangeUnit,\n}: Props) {\n\tconst valueStep = getLineHeightValueStep(units)\n\n\tconst canCopyLineHeight = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(value),\n\t\t[supportsCopyPaste, value],\n\t)\n\n\tconst [canPasteLineHeight, pasteLineHeight, copyLineHeight] = useCopyAndPasteSingleProperty(\n\t\tTraitType.LineHeight,\n\t\tnodeIds,\n\t\tcanCopyLineHeight,\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\ttitle=\"Line\"\n\t\t\tcopyEnabled={canCopyLineHeight}\n\t\t\tonCopy={supportsCopyPaste ? copyLineHeight : undefined}\n\t\t\tpasteEnabled={canPasteLineHeight}\n\t\t\tonPaste={supportsCopyPaste ? pasteLineHeight : undefined}\n\t\t>\n\t\t\t<NumberInputWithTicker\n\t\t\t\tonChange={onChangeValue}\n\t\t\t\tvalue={notFoundToUndefined(value)}\n\t\t\t\tdefaultValue={units.has(\"em\") ? textStyleDefaults.lineHeight[0] : undefined}\n\t\t\t\tmin={0.1}\n\t\t\t\tstep={valueStep}\n\t\t\t\tdata-testid=\"textpanel-lineheight-input\"\n\t\t\t/>\n\n\t\t\t<PopupButton>\n\t\t\t\t<PopupButtonItem identifier=\"em\" title={Dictionary.Em} selected={units.has(\"em\")} onSelect={onChangeUnit} />\n\t\t\t\t<PopupButtonItem identifier=\"px\" title={Dictionary.Pixels} selected={units.has(\"px\")} onSelect={onChangeUnit} />\n\t\t\t\t<PopupButtonItem identifier=\"%\" title=\"%\" selected={units.has(\"%\")} onSelect={onChangeUnit} />\n\t\t\t</PopupButton>\n\t\t</PanelRow>\n\t)\n}\n\nconst unitStepMap: Record<LineHeightUnit, number> = {\n\tem: 0.1,\n\t\"%\": 10,\n\tpx: 1,\n}\n\nfunction getLineHeightValueStep(units: Set<LineHeightUnit | undefined>) {\n\tif (units.size === 1) {\n\t\tconst [unit] = units\n\n\t\tif (unit !== undefined) {\n\t\t\treturn unitStepMap[unit]\n\t\t}\n\t}\n\n\treturn unitStepMap.em\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { LineHeightUnit, WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { OmitVariables } from \"document/models/CanvasTree/traits/utils/OmitVariables.ts\"\nimport { getLineHeightDefaultForUnit, getLineHeightUnitFromValue } from \"../../panels/utils/textStyle.ts\"\nimport { LineHeightRow } from \"../LineHeightRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & OmitVariables<WithTextStyle>\n}\n\nexport function StylePresetLineHeightRow({ preset }: Props) {\n\tconst changeLineHeightValue = engine.scheduler.wrapHandler((value: number, rawValue?: string) => {\n\t\tconst [, prevUnit] = preset.lineHeight\n\t\tconst unit = getLineHeightUnitFromValue(rawValue) ?? prevUnit\n\n\t\tengine.tree.current(preset)?.set({ lineHeight: [value, unit] })\n\t})\n\n\tconst changeLineHeightUnit = engine.scheduler.wrapHandler((unit: LineHeightUnit) => {\n\t\tconst [prevValue, prevUnit] = preset.lineHeight\n\t\tconst defaultValue = getLineHeightDefaultForUnit(prevUnit, preset.fontSize)\n\t\tconst value = prevValue === defaultValue ? getLineHeightDefaultForUnit(unit, preset.fontSize) : prevValue\n\n\t\tengine.tree.current(preset)?.set({ lineHeight: [value, unit] })\n\t})\n\n\tconst [lineHeightValue, unit] = preset.lineHeight\n\tconst lineHeightUnits = new Set<LineHeightUnit>([unit])\n\n\treturn (\n\t\t<LineHeightRow\n\t\t\tvalue={lineHeightValue}\n\t\t\tunits={lineHeightUnits}\n\t\t\tonChangeValue={changeLineHeightValue}\n\t\t\tonChangeUnit={changeLineHeightUnit}\n\t\t/>\n\t)\n}\n", "import { NumberInputWithTickerAndStepper } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isNumber, isUndefined } from \"utils/typeChecks.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nconst traitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"paragraphSpacing\", \"html\"]\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\ttitle: string\n\tparagraphSpacing: Reduced<number | undefined>\n\tsupportsCopyPaste?: boolean\n\tonChange(value: number): void\n\tonDelete?: () => void\n}\n\nexport function hasParagraphSpacing(\n\tparagraphSpacing: Reduced<number | undefined>,\n\tanyNodeWithParagraphSpacing: boolean,\n) {\n\treturn !(isUndefined(paragraphSpacing) || isNotFound(paragraphSpacing)) || anyNodeWithParagraphSpacing\n}\n\nexport function ParagraphSpacingRow({\n\tnodeIds,\n\ttitle,\n\tparagraphSpacing,\n\tsupportsCopyPaste = false,\n\tonChange,\n\tonDelete,\n}: Props) {\n\tconst value = isNumber(paragraphSpacing) || isMixed(paragraphSpacing) ? paragraphSpacing : 0\n\n\tconst canCopyParagraphSpacing = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(paragraphSpacing),\n\t\t[paragraphSpacing, supportsCopyPaste],\n\t)\n\n\tconst [canPasteParagraphSpacing, pasteParagraphSpacing, copyParagraphSpacing] = useCopyAndPasteSingleProperty(\n\t\tTraitType.ParagraphSpacing,\n\t\tnodeIds,\n\t\tcanCopyParagraphSpacing,\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\ttitle={title}\n\t\t\tcopyEnabled={canCopyParagraphSpacing}\n\t\t\tonCopy={supportsCopyPaste ? copyParagraphSpacing : undefined}\n\t\t\tpasteEnabled={canPasteParagraphSpacing}\n\t\t\tonPaste={supportsCopyPaste ? pasteParagraphSpacing : undefined}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t<NumberInputWithTickerAndStepper onChange={onChange} value={value} defaultValue={0} min={0} />\n\t\t</PanelRow>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithParagraphSpacing } from \"document/models/CanvasTree/traits/WithParagraphSpacing.ts\"\nimport { ParagraphSpacingRow } from \"../ParagraphSpacingRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithParagraphSpacing\n}\n\nexport function StylePresetParagraphSpacingRow({ preset }: Props) {\n\tconst changeParagraphSpacing = engine.scheduler.wrapHandler((paragraphSpacing: number) => {\n\t\tengine.tree.current(preset)?.set({ paragraphSpacing })\n\t})\n\n\treturn (\n\t\t<ParagraphSpacingRow\n\t\t\ttitle=\"Paragraph\"\n\t\t\tparagraphSpacing={preset.paragraphSpacing}\n\t\t\tonChange={changeParagraphSpacing}\n\t\t/>\n\t)\n}\n", "import {\n\tIconTextAlignCenter,\n\tIconTextAlignJustify,\n\tIconTextAlignLeft,\n\tIconTextAlignRight,\n\tSegmentedControl,\n\tSegmentedControlItem,\n} from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { TextAlignment } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { useMemo } from \"react\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\ttextAlignment: Reduced<TextAlignment | undefined>\n\tsupportsCopyPaste?: boolean\n\tonChange: (textAlignment: TextAlignment) => void\n\tonDelete?: () => void\n}\n\nconst textAlignmentOptions: TextAlignment[] = [\"left\", \"center\", \"right\", \"justify\"]\nconst textAlignmentIcons = [IconTextAlignLeft, IconTextAlignCenter, IconTextAlignRight, IconTextAlignJustify]\nconst traitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"textAlignment\", \"html\"]\n\nexport function TextAlignmentRow({ nodeIds, textAlignment, supportsCopyPaste = false, onChange, onDelete }: Props) {\n\tconst canCopyTextAlignment = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(textAlignment),\n\t\t[supportsCopyPaste, textAlignment],\n\t)\n\n\tconst [canPasteTextAlignment, pasteTextAlignment, copyTextAlignment] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextAlignment,\n\t\tnodeIds,\n\t\tcanCopyTextAlignment,\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\ttitle=\"Align\"\n\t\t\tcopyEnabled={canCopyTextAlignment}\n\t\t\tonCopy={supportsCopyPaste ? copyTextAlignment : undefined}\n\t\t\tpasteEnabled={canPasteTextAlignment}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextAlignment : undefined}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t<SegmentedControl style={doubleColumn}>\n\t\t\t\t{textAlignmentOptions.map((option, index) => {\n\t\t\t\t\tconst Icon = textAlignmentIcons[index]\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\ttitle={capitalizeFirstLetter(option)}\n\t\t\t\t\t\t\tselected={textAlignment === option}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{Icon && <Icon />}\n\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</SegmentedControl>\n\t\t</PanelRow>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { TextAlignment, WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { TextAlignmentRow } from \"../TextAlignmentRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tdeleteEnabled?: boolean\n}\n\nexport function StylePresetTextAlignmentRow({ preset, deleteEnabled }: Props) {\n\tconst changeTextAlignment = engine.scheduler.wrapHandler((textAlignment?: TextAlignment) => {\n\t\tengine.tree.current(preset)?.set({ textAlignment })\n\t})\n\n\tconst onDelete = deleteEnabled && preset.textAlignment !== undefined ? changeTextAlignment : undefined\n\n\treturn <TextAlignmentRow textAlignment={preset.textAlignment} onChange={changeTextAlignment} onDelete={onDelete} />\n}\n", "import { Record } from \"immutable\"\n\nconst colorDefaults = {\n\ttype: \"rgb\",\n\tr: 0,\n\tg: 0,\n\tb: 0,\n\ta: 1,\n\th: 0,\n\ts: 0,\n\tl: 0,\n\troundA: 0,\n}\n\nexport const ColorRecord = Record({\n\t...colorDefaults,\n})\n", "import { ColorRecord } from \"document/models/CanvasTree/records/ColorRecord.ts\"\nimport type { ColorMixOptions } from \"library/render/types/Color/index.ts\"\nimport { Color as ColorInterface } from \"library/render/types/Color/index.ts\"\nimport type {\n\tColorFormat,\n\tColorHSL,\n\tColorHSLA,\n\tColorHSVA,\n\tColorMixModelType,\n\tColorRGBA,\n\tIncomingColor,\n} from \"library/render/types/Color/types.ts\"\nimport { withClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\n\nexport class Color extends withClassDiscriminator(\"Color\", ColorRecord) implements ColorInterface {\n\tprivate _rgb?: ColorRGBA\n\tprivate _hsl?: ColorHSLA\n\tprivate _husl?: ColorHSL\n\tprivate _hsv?: ColorHSVA\n\tprivate _hslString: string | undefined\n\tprivate _hsvString: string | undefined\n\tprivate _rgbString: string | undefined\n\n\t// Safely using a non-null assertion operator (`!`) here because these fields\n\t// are initialized in the constructor, but the constructor has an early return\n\tprivate _format!: ColorFormat\n\tpublic get format(): ColorFormat {\n\t\treturn this._format\n\t}\n\n\tprivate _initialValue: string | undefined\n\n\tprivate _roundA!: number\n\tpublic get roundA(): number {\n\t\treturn this._roundA\n\t}\n\tprivate _r!: number\n\tpublic get r(): number {\n\t\treturn this._r\n\t}\n\tprivate _g!: number\n\tpublic get g(): number {\n\t\treturn this._g\n\t}\n\tprivate _b!: number\n\tpublic get b(): number {\n\t\treturn this._b\n\t}\n\tprivate _a!: number\n\tpublic get a(): number {\n\t\treturn this._a\n\t}\n\tprivate _h!: number\n\tpublic get h(): number {\n\t\treturn this._h\n\t}\n\tprivate _s!: number\n\tpublic get s(): number {\n\t\treturn this._s\n\t}\n\tprivate _l!: number\n\n\tpublic get l(): number {\n\t\treturn this._l\n\t}\n\n\tconstructor(colorOrR: IncomingColor | Color | number, g?: number, b?: number, a?: number) {\n\t\t// biome-ignore lint/correctness/noConstructorReturn: no need to make it a color if it already is\n\t\tif (colorOrR instanceof Color) return colorOrR\n\t\t// biome-ignore lint/correctness/noUnreachableSuper: worked like this for the past 6 years\n\t\tsuper()\n\t\tconst co = ColorInterface(colorOrR, g, b, a)\n\t\tthis._a = co.a\n\t\tthis._r = co.r\n\t\tthis._g = co.g\n\t\tthis._b = co.b\n\t\tthis._h = co.h\n\t\tthis._s = co.s\n\t\tthis._l = co.l\n\t\tthis._roundA = co.roundA\n\t\tthis._format = co.format\n\t\tif (typeof colorOrR === \"string\") {\n\t\t\tthis._initialValue = colorOrR\n\t\t}\n\t}\n\n\toverride toJS() {\n\t\tconst JS = super.toJS()\n\t\tJS[\"__class\"] = this.__class\n\t\treturn JS\n\t}\n\n\ttoJSON() {\n\t\treturn this.toJS()\n\t}\n\n\ttoInspect(): string {\n\t\treturn ColorInterface.inspect(this, this._initialValue)\n\t}\n\n\toverride toString(): string {\n\t\treturn ColorInterface.toString(this)\n\t}\n\n\ttoHex(allow3Char: boolean = false): string {\n\t\treturn ColorInterface.toHex(this, allow3Char)\n\t}\n\n\ttoHexString(allow3Char: boolean = false): string {\n\t\treturn ColorInterface.toHexString(this, allow3Char)\n\t}\n\n\ttoRgb(): ColorRGBA {\n\t\tif (this._rgb === undefined) {\n\t\t\tthis._rgb = ColorInterface.toRgb(this)\n\t\t}\n\t\treturn this._rgb\n\t}\n\n\ttoRgbString(): string {\n\t\tif (this._rgbString === undefined) {\n\t\t\tthis._rgbString = ColorInterface.toRgbString(this)\n\t\t}\n\t\treturn this._rgbString\n\t}\n\n\ttoHsl(): ColorHSLA {\n\t\tif (this._hsl === undefined) {\n\t\t\tthis._hsl = ColorInterface.toHsl(this)\n\t\t}\n\t\treturn this._hsl\n\t}\n\n\ttoHusl(): ColorHSL {\n\t\tif (this._husl === undefined) {\n\t\t\tthis._husl = ColorInterface.toHusl(this)\n\t\t}\n\t\treturn this._husl\n\t}\n\n\ttoHslString(): string {\n\t\tif (this._hslString === undefined) {\n\t\t\tthis._hslString = ColorInterface.toHslString(this)\n\t\t}\n\t\treturn this._hslString\n\t}\n\n\ttoHsv(): ColorHSVA {\n\t\tif (this._hsv === undefined) {\n\t\t\tthis._hsv = ColorInterface.toHsv(this)\n\t\t}\n\t\treturn this._hsv\n\t}\n\n\ttoHsvString(): string {\n\t\tif (this._hsvString === undefined) {\n\t\t\tthis._hsvString = ColorInterface.toHsvString(this)\n\t\t}\n\t\treturn this._hsvString\n\t}\n\n\ttoValue(): string {\n\t\treturn this.toRgbString()\n\t}\n\n\ttoName(): string | false {\n\t\treturn ColorInterface.toName(this)\n\t}\n\n\tlighten(amount = 10): Color {\n\t\treturn new Color(ColorInterface.lighten(this, amount))\n\t}\n\n\tbrighten(amount = 10): Color {\n\t\treturn new Color(ColorInterface.brighten(this, amount))\n\t}\n\n\tdarken(amount = 10): Color {\n\t\treturn new Color(ColorInterface.darken(this, amount))\n\t}\n\n\tdesaturate(amount = 10): Color {\n\t\treturn new Color(ColorInterface.desaturate(this, amount))\n\t}\n\n\tsaturate(amount = 10): Color {\n\t\treturn new Color(ColorInterface.saturate(this, amount))\n\t}\n\n\tgrayscale(): Color {\n\t\treturn new Color(ColorInterface.desaturate(this, 100))\n\t}\n\n\thueRotate(angle: number): Color {\n\t\treturn new Color(ColorInterface.hueRotate(this, angle))\n\t}\n\n\talpha(alpha: number = 1): Color {\n\t\treturn new Color(ColorInterface.alpha(this, alpha))\n\t}\n\n\tmultiplyAlpha(alpha: number): Color {\n\t\treturn new Color(ColorInterface.multiplyAlpha(this, alpha))\n\t}\n\n\ttransparent(): Color {\n\t\treturn new Color(ColorInterface.alpha(this, 0))\n\t}\n\n\tmix(toColor: Color, options: ColorMixOptions): (p: number) => string {\n\t\treturn ColorInterface.mix(this, toColor, options)\n\t}\n\n\tmixAsColor(colorB: Color | string, fraction: number, limit = false, model: ColorMixModelType) {\n\t\tif (typeof colorB === \"string\") colorB = new Color(colorB)\n\t\treturn ColorInterface.mixAsColor(this, colorB, fraction, limit, model)\n\t}\n\n\tisEqual(colorB: Color | string): boolean {\n\t\tif (typeof colorB === \"string\") colorB = new Color(colorB)\n\t\treturn ColorInterface.equal(this, colorB)\n\t}\n}\n", "import { assert, assertNever, isMixed, shouldBeNever } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { isRichTextNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { FillType } from \"document/models/CanvasTree/traits/WithFill.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport { textStyleDefaults } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { Color } from \"document/models/ColorClass.ts\"\nimport { isConicGradient } from \"document/models/ConicGradientClass.ts\"\nimport type { Gradient } from \"document/models/Gradient.ts\"\nimport {\n\tConicGradient,\n\tLinearGradient,\n\tRadialGradient,\n\tgradientFillType,\n\tisGradient,\n} from \"document/models/Gradient.ts\"\nimport { GradientColorStop } from \"document/models/GradientColorStop.ts\"\nimport { isLinearGradient } from \"document/models/LinearGradientClass.ts\"\nimport { isRadialGradient } from \"document/models/RadialGradientClass.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport React, { useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { colorPickerFillTypeTabsWithoutImage } from \"../../shared/ColorPicker/ColorPickerFillTypeTabs.tsx\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { trackingMetadata } from \"../../shared/ColorPicker/trackingMetadata.tsx\"\nimport { VariableReferenceButton } from \"../../shared/VariableReferenceButton.tsx\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { shouldUpdateDefaultStyle } from \"../utils/styledText.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nconst textColorTraitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"textColor\", \"html\"]\n\ninterface TextFillDefinition {\n\ttype: FillType\n\tvalue: Reduced<string | LinearGradient | RadialGradient | ConicGradient | undefined>\n}\n\ninterface SessionFillState {\n\tselectedType: FillType\n\tangle: number\n\tstops: GradientColorStop[]\n\twidthFactor: number\n\theightFactor: number\n\tcenterAnchorX: number\n\tcenterAnchorY: number\n}\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\ttextColor: Reduced<string | VariableReference | undefined>\n\tfills?: Set<string | Gradient | undefined>\n\tsupportsVariables?: boolean\n\tonDelete?(event?: React.MouseEvent | React.KeyboardEvent | undefined): void\n\tonChange?(value: string | VariableReference): void\n\tsupportsTextFill?: boolean\n\tsupportsCopyPaste?: boolean\n\temptyLabel?: string\n\tonPresent?: () => void\n\tonDismiss?: () => void\n}\n\nexport function TextColorRow({\n\tnodeIds,\n\ttextColor,\n\tonDelete,\n\tsupportsTextFill = false,\n\tsupportsVariables = false,\n\tsupportsCopyPaste = false,\n\tfills,\n\temptyLabel,\n\tonPresent,\n\tonDismiss,\n\t...props\n}: Props) {\n\tconst canCopyTextColor = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && !isMixed(textColor),\n\t\t[supportsCopyPaste, textColor],\n\t)\n\n\tconst [canPasteTextColor, pasteTextColor, copyTextColor] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextColor,\n\t\tnodeIds,\n\t\tcanCopyTextColor,\n\t)\n\n\tconst { type, value } = React.useMemo((): TextFillDefinition => {\n\t\tconst color = isVariableReference(textColor) ? \"\" : textColor\n\n\t\tif (!fills || !supportsTextFill) {\n\t\t\treturn { type: \"color\", value: color }\n\t\t} else if (fills.size > 1) {\n\t\t\treturn { type: \"color\", value: \"\" }\n\t\t} else {\n\t\t\tconst [fill] = fills\n\n\t\t\tif (fill) {\n\t\t\t\tif (isGradient(fill)) {\n\t\t\t\t\tconst fillType = gradientFillType(fill)\n\t\t\t\t\tassert(fillType, \"Gradient fill must have a known fill type\", fill)\n\t\t\t\t\treturn { type: fillType, value: fill }\n\t\t\t\t} else {\n\t\t\t\t\treturn { type: \"color\", value: color }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { type: \"color\", value: color }\n\t}, [fills, textColor, supportsTextFill])\n\n\tconst sessionFillState = useSessionFillState(textColor, value)\n\n\tconst onChange =\n\t\tprops.onChange ||\n\t\tengine.scheduler.wrapHandler(\n\t\t\t(\n\t\t\t\tnewValue: string | VariableReference | Gradient,\n\t\t\t\tcolorStopSelection: NodeID | undefined = engine.stores.selectionStore.gradientStopId ?? undefined,\n\t\t\t) => {\n\t\t\t\tif (!nodeIds) return\n\n\t\t\t\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\t\t\t\tif (!nodes.length) return\n\n\t\t\t\tconst isVariable = isVariableReference(newValue)\n\t\t\t\tconst isColor =\n\t\t\t\t\tisString(newValue) &&\n\t\t\t\t\t!newValue.startsWith(\"linear-gradient\") &&\n\t\t\t\t\t!newValue.startsWith(\"radial-gradient\") &&\n\t\t\t\t\t!newValue.startsWith(\"conic-gradient\")\n\n\t\t\t\tconst { selectedType } = sessionFillState.current\n\n\t\t\t\tfor (const node of nodes) {\n\t\t\t\t\tconst nodeSupportsGradients = isRichTextNode(node)\n\n\t\t\t\t\t// DraftJS text nodes only support variables for whole node.\n\t\t\t\t\tlet userSelection = true\n\t\t\t\t\tif (isVariable) {\n\t\t\t\t\t\tuserSelection &&= isRichTextNode(node)\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * If the new value is a color, we either want to set the textColor or, if\n\t\t\t\t\t * we've currently selected a gradient tab, the selected gradient stop.\n\t\t\t\t\t */\n\t\t\t\t\tif (isVariable || (isColor && selectedType === \"color\")) {\n\t\t\t\t\t\tnode.setTextColor(newValue, userSelection)\n\n\t\t\t\t\t\tif (isString(newValue) && shouldUpdateDefaultStyle(nodes)) {\n\t\t\t\t\t\t\tengine.stores.documentSettingsStore.defaultTextStyle.textColor = newValue\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isColor && nodeSupportsGradients) {\n\t\t\t\t\t\tconst { stops } = sessionFillState.current\n\t\t\t\t\t\tconst selectedStopId = colorStopSelection ?? stops[0]?.id\n\t\t\t\t\t\tif (!selectedStopId) return\n\n\t\t\t\t\t\tconst selectedStopIndex = stops.findIndex(stop => stop.id === selectedStopId)\n\t\t\t\t\t\tconst selectedStop = stops[selectedStopIndex]\n\t\t\t\t\t\tif (!selectedStop) return\n\n\t\t\t\t\t\tconst nextStop = selectedStop.merge({ value: newValue })\n\n\t\t\t\t\t\tsessionFillState.current.stops.splice(selectedStopIndex, 1, nextStop)\n\n\t\t\t\t\t\tswitch (selectedType) {\n\t\t\t\t\t\t\tcase \"linear-gradient\": {\n\t\t\t\t\t\t\t\tnode.setFill(new LinearGradient(sessionFillState.current))\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"radial-gradient\": {\n\t\t\t\t\t\t\t\tnode.setFill(new RadialGradient(sessionFillState.current))\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"conic-gradient\": {\n\t\t\t\t\t\t\t\tnode.setFill(new ConicGradient(sessionFillState.current))\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase \"color\":\n\t\t\t\t\t\t\tcase \"image\":\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tassertNever(selectedType)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (nodeSupportsGradients) {\n\t\t\t\t\t\tnode.setFill(newValue)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\tconst onChangeFillType = supportsTextFill\n\t\t? engine.scheduler.wrapHandler((type: FillType) => {\n\t\t\t\tsessionFillState.current.selectedType = type\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase \"color\": {\n\t\t\t\t\t\tif (!nodeIds) return\n\n\t\t\t\t\t\tengine.tree.getNodesWithTrait(nodeIds, isRichTextNode).forEach(node => {\n\t\t\t\t\t\t\tnode.setFill(undefined)\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tonChange(isString(textColor) ? textColor : \"black\")\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"linear-gradient\": {\n\t\t\t\t\t\tonChange(new LinearGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"radial-gradient\": {\n\t\t\t\t\t\tonChange(new RadialGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"conic-gradient\": {\n\t\t\t\t\t\tonChange(new ConicGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"image\": {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(type)\n\t\t\t\t}\n\t\t\t})\n\t\t: undefined\n\n\tconst onSelectVariable = engine.scheduler.wrapHandler((variableRef: VariableReference) => {\n\t\tif (!supportsVariables) return\n\t\tonChange(variableRef)\n\t})\n\n\tconst onChangeColorStops = supportsTextFill\n\t\t? engine.scheduler.wrapHandler((newStops: readonly GradientColorStop[]) => {\n\t\t\t\tsessionFillState.current.stops = [...newStops]\n\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase \"linear-gradient\": {\n\t\t\t\t\t\tonChange(new LinearGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"radial-gradient\": {\n\t\t\t\t\t\tonChange(new RadialGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase \"conic-gradient\": {\n\t\t\t\t\t\tonChange(new ConicGradient(sessionFillState.current))\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t})\n\t\t: undefined\n\n\tconst onCreateVariable = engine.scheduler.wrapHandler((scopeId: NodeID) => {\n\t\tif (!supportsVariables) return\n\n\t\tconst variableRef = createVariableInScope({\n\t\t\tengine,\n\t\t\tscopeId,\n\t\t\ttype: ControlType.Color,\n\t\t\tname: \"color\",\n\t\t\tinitialValue: isString(textColor) ? textColor : textStyleDefaults.textColor,\n\t\t})\n\n\t\tif (variableRef) {\n\t\t\tonSelectVariable(variableRef)\n\t\t}\n\t})\n\n\tconst onRemoveDynamicValue = engine.scheduler.wrapHandler(() => {\n\t\tif (!isDynamicValue(textColor)) return\n\n\t\tif (isVariableReference(textColor)) {\n\t\t\tconst variableValue = getVariableValue(engine, textColor)\n\t\t\tconst textColorValue = isString(variableValue) ? variableValue : textStyleDefaults.textColor\n\t\t\tonChange(textColorValue)\n\t\t} else if (isComputedValue(textColor)) {\n\t\t\tonChange(textStyleDefaults.textColor)\n\t\t} else {\n\t\t\tshouldBeNever(textColor)\n\t\t}\n\t})\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle=\"Color\"\n\t\t\tvariableType={ControlType.Color}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tdynamicValue={isDynamicValue(textColor) ? textColor : null}\n\t\t\tonSelectVariable={onSelectVariable}\n\t\t\ttraitTypeKeys={textColorTraitTypeKeys}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tcopyEnabled={canCopyTextColor}\n\t\t\tonCopy={supportsCopyPaste ? copyTextColor : undefined}\n\t\t\tpasteEnabled={canPasteTextColor}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextColor : undefined}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t{isVariableReference(textColor) ? (\n\t\t\t\t<VariableReferenceButton\n\t\t\t\t\texpectedType={ControlType.Color}\n\t\t\t\t\treference={textColor}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<ColorPopoutButton\n\t\t\t\t\tnavigationTitle=\"Color\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tcurrentType={type}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonChangeFillType={supportsTextFill ? onChangeFillType : undefined}\n\t\t\t\t\tonChangeColorStops={onChangeColorStops}\n\t\t\t\t\tfillGradientCSS={isGradient(value) ? new LinearGradient({ stops: value.stops }).toCSS(90) : undefined}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t\ttabsToShow={supportsTextFill ? colorPickerFillTypeTabsWithoutImage : undefined}\n\t\t\t\t\ttrackingMetadata={nodeIds ? trackingMetadata(nodeIds, \"styledText\") : undefined}\n\t\t\t\t\temptyLabel={emptyLabel}\n\t\t\t\t\tonPresent={onPresent}\n\t\t\t\t\tonDismiss={onDismiss}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction useSessionFillState(\n\ttextColor: Reduced<string | VariableReference | undefined>,\n\tvalue: Reduced<string | LinearGradient | RadialGradient | ConicGradient | undefined>,\n) {\n\ttextColor = typeof textColor === \"string\" ? textColor : \"#000\"\n\tconst sessionFillState = React.useRef() as React.MutableRefObject<SessionFillState>\n\n\tif (!sessionFillState.current) {\n\t\tsessionFillState.current = {\n\t\t\tselectedType: \"color\",\n\t\t\tangle: 0,\n\t\t\tstops: [\n\t\t\t\tnew GradientColorStop({ value: textColor, position: 0 }),\n\t\t\t\tnew GradientColorStop({ value: new Color(textColor).alpha(0).toString(), position: 1 }),\n\t\t\t],\n\t\t\twidthFactor: 0.5,\n\t\t\theightFactor: 0.5,\n\t\t\tcenterAnchorX: 0.5,\n\t\t\tcenterAnchorY: 0.5,\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tupdateSessionFillState(sessionFillState.current, value)\n\t}, [value])\n\n\treturn sessionFillState\n}\n\nfunction updateSessionFillState(\n\tstate: SessionFillState,\n\tvalue: Reduced<string | LinearGradient | RadialGradient | ConicGradient | undefined>,\n): void {\n\tif (isLinearGradient(value)) {\n\t\tstate.selectedType = \"linear-gradient\"\n\t\tstate.angle = value.angle\n\t} else if (isRadialGradient(value)) {\n\t\tstate.selectedType = \"radial-gradient\"\n\t\tstate.centerAnchorX = value.centerAnchorX\n\t\tstate.centerAnchorY = value.centerAnchorY\n\t\tstate.widthFactor = value.widthFactor\n\t\tstate.heightFactor = value.heightFactor\n\t} else if (isConicGradient(value)) {\n\t\tstate.selectedType = \"conic-gradient\"\n\t\tstate.centerAnchorX = value.centerAnchorX\n\t\tstate.centerAnchorY = value.centerAnchorY\n\t\tstate.angle = value.angle\n\t} else {\n\t\tstate.selectedType = \"color\"\n\t}\n\n\tif (isGradient(value)) {\n\t\t// Make mutable\n\t\tstate.stops = [...value.stops]\n\t}\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { TextColorRow } from \"../TextColorRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tdeleteEnabled?: boolean\n\temptyLabel?: string\n}\n\nexport function StylePresetTextColorRow({ preset, deleteEnabled, emptyLabel }: Props) {\n\tconst changeTextColor = engine.scheduler.wrapHandler((textColor: VariableReference | string) => {\n\t\tif (isVariableReference(textColor)) return\n\t\tengine.tree.current(preset)?.set({ textColor })\n\t})\n\n\tconst deleteTextColor = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ textColor: undefined })\n\t})\n\n\tconst onDelete = deleteEnabled && preset.textColor !== undefined ? deleteTextColor : undefined\n\n\treturn (\n\t\t<TextColorRow textColor={preset.textColor} onChange={changeTextColor} onDelete={onDelete} emptyLabel={emptyLabel} />\n\t)\n}\n", "import {\n\tNumberInputWithTicker,\n\tPopupButton,\n\tPopupButtonItem,\n\tSegmentedControl,\n\tSegmentedControlItem,\n\tStack,\n} from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport {\n\ttype TextDecoration,\n\ttype TextDecorationCSSDimension,\n\ttype TextDecorationDimensionUnit,\n\ttype TextDecorationSkipInk,\n\ttype TextDecorationStyle,\n\ttype WithTextStyle,\n\tisTextDecoration,\n\ttextDecorationDimensionUnits,\n\ttextDecorationSkipInkValues,\n\ttextDecorationStyleValues,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { createCSSDimension, parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport {\n\ttype Reduced,\n\ttype ReducedRecord,\n\ttype UnreducedRecord,\n\tisFoundAndNotUndefined,\n} from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport React, { useCallback } from \"react\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isDefined } from \"utils/typeChecks.ts\"\nimport type { ColorPickerTab } from \"../../shared/ColorPicker/ColorPickerFillTypeTabs.tsx\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport * as styles from \"./TextDecorationRow.styles.ts\"\nimport { BooleanPopoutButtonPreview } from \"./utils/BooleanPopoutButtonPreview.tsx\"\n\nfunction IconTextDecoration() {\n\treturn <span className={styles.textDecorationIcon}>Aa</span>\n}\n\nconst textDecorationOptions: TextDecoration[] = [\"none\", \"underline\", \"line-through\"]\n\ntype ReducedTextDecoration = ReducedRecord<Pick<WithTextStyle, Extract<keyof WithTextStyle, `textDecoration${string}`>>>\ntype TextDecorationUpdate = Partial<UnreducedRecord<WithTextStyle>>\ntype Props = {\n\tnodeIds?: NodeID[]\n\tstylePresetType?: \"link\" | \"text\"\n\tsupportsCopyPaste?: boolean\n\tonChange: (update: TextDecorationUpdate) => void\n\tdeleteEnabled?: boolean\n\tonPresent?: () => void\n\tonDismiss?: () => void\n} & ReducedTextDecoration\n\nconst traitTypeKeys: Extract<keyof WithTextStyle, `textDecoration${string}`>[] = [\n\t\"textDecoration\",\n\t\"textDecorationColor\",\n\t\"textDecorationThickness\",\n\t\"textDecorationStyle\",\n\t\"textDecorationSkipInk\",\n\t\"textDecorationOffset\",\n]\n\nexport function hasTextDecoration(value: Reduced<TextDecoration | undefined>, stylePresetType?: \"link\" | \"text\") {\n\tif (value === \"none\" && stylePresetType === \"link\") return true\n\tif (isMixed(value)) return true\n\n\treturn isTextDecoration(value) && value !== \"none\"\n}\n\nexport const TextDecorationRow = React.memo(function TextDecorationRow({\n\ttextDecoration,\n\tonChange,\n\tnodeIds,\n\tstylePresetType,\n\tsupportsCopyPaste,\n\tdeleteEnabled = true,\n\tonPresent,\n\tonDismiss,\n\t...textDecorationProps\n}: Props) {\n\tconst isTextDecorationSet = hasTextDecoration(textDecoration, stylePresetType)\n\n\tconst canCopyTextDecoration = !!supportsCopyPaste && isClipboardSupported() && !isMixed(textDecoration)\n\n\tconst [canPasteTextDecoration, pasteTextDecoration, copyTextDecoration] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextDecoration,\n\t\tnodeIds,\n\t\tcanCopyTextDecoration,\n\t)\n\n\tconst onDeleteTextDecoration = useCallback(() => {\n\t\tonChange({ textDecoration: undefined })\n\t}, [onChange])\n\n\tif (!isTextDecorationSet && !isDefined(stylePresetType)) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={Dictionary.Decoration}\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\tcopyEnabled={canCopyTextDecoration}\n\t\t\tonCopy={supportsCopyPaste ? copyTextDecoration : undefined}\n\t\t\tpasteEnabled={canPasteTextDecoration}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextDecoration : undefined}\n\t\t\tonDelete={deleteEnabled && isTextDecorationSet ? onDeleteTextDecoration : undefined}\n\t\t>\n\t\t\t<PopoutButtonWithPreview\n\t\t\t\ttitle={getTextDecorationTitle(textDecoration, stylePresetType)}\n\t\t\t\ttitleColor={isTextDecorationSet ? undefined : colors.inputLabel}\n\t\t\t\tpreview={<BooleanPopoutButtonPreview enabled={isDefined(textDecoration) && textDecoration !== \"none\"} />}\n\t\t\t\tnavigationTitle={Dictionary.Decoration}\n\t\t\t\tonBeforePresent={() => {\n\t\t\t\t\tif (!isDefined(textDecoration)) {\n\t\t\t\t\t\tonChange({ textDecoration: \"underline\" })\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}}\n\t\t\t\tonPresent={onPresent}\n\t\t\t\tonDismiss={onDismiss}\n\t\t\t\tpopout={\n\t\t\t\t\t<TextDecorationPopout\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\ttextDecoration={textDecoration}\n\t\t\t\t\t\tstylePresetType={stylePresetType}\n\t\t\t\t\t\t{...textDecorationProps}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tdisplayDivider\n\t\t\t\tonDelete={deleteEnabled && isTextDecorationSet ? onDeleteTextDecoration : undefined}\n\t\t\t\ttestId=\"textpanel-decoration-button\"\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n})\n\nfunction SimpleTextDecorationRow({\n\tnodeIds,\n\ttextDecoration,\n\tstylePresetType,\n\tsupportsCopyPaste = false,\n\tdeleteEnabled = true,\n\tonChange,\n\ttitle = \"Decoration\",\n}: Pick<\n\tProps,\n\t\"textDecoration\" | \"onChange\" | \"nodeIds\" | \"stylePresetType\" | \"supportsCopyPaste\" | \"deleteEnabled\"\n> & {\n\ttitle?: string\n}) {\n\t// We want to show the \"none\" option only if there is a style preset applied\n\t// this means that the TextDecorationRow is being rendered in the style preset\n\t// popout and not the text panel\n\tconst options = textDecorationOptions.filter(option => option !== \"none\" || isDefined(stylePresetType))\n\n\tconst canCopyTextDecoration = supportsCopyPaste && isClipboardSupported() && !isMixed(textDecoration)\n\n\tconst [canPasteTextDecoration, pasteTextDecoration, copyTextDecoration] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextDecoration,\n\t\tnodeIds,\n\t\tcanCopyTextDecoration,\n\t)\n\n\tconst onChangeDecoration = useCallback(\n\t\t(decoration: TextDecoration) => {\n\t\t\tonChange({ textDecoration: decoration })\n\t\t},\n\t\t[onChange],\n\t)\n\n\tconst onDeleteDecoration = useCallback(() => {\n\t\tonChange({ textDecoration: undefined })\n\t}, [onChange])\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={title}\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\tcopyEnabled={canCopyTextDecoration}\n\t\t\tonCopy={supportsCopyPaste ? copyTextDecoration : undefined}\n\t\t\tpasteEnabled={canPasteTextDecoration}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextDecoration : undefined}\n\t\t\tonDelete={deleteEnabled ? onDeleteDecoration : undefined}\n\t\t>\n\t\t\t<SegmentedControl\n\t\t\t\tstyle={doubleColumn}\n\t\t\t\t/* make sure the segmented control can have focus,\n                thus when clicking on the segmented control, the text editor loses focus with a relatedTarget,\n                and we'll add a fake selection to keep the selection (see: TextEditor - followFocus()) */\n\t\t\t\ttabIndex={0}\n\t\t\t>\n\t\t\t\t{options.map(option => {\n\t\t\t\t\tconst isSelected = textDecoration === option\n\n\t\t\t\t\tconst className = cx(\n\t\t\t\t\t\toption === \"underline\" && styles.underline,\n\t\t\t\t\t\toption === \"line-through\" && styles.strikeThrough,\n\t\t\t\t\t)\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\ttitle={capitalizeFirstLetter(option)}\n\t\t\t\t\t\t\tselected={isSelected}\n\t\t\t\t\t\t\tonSelect={onChangeDecoration}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<IconTextDecoration />\n\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</SegmentedControl>\n\t\t</PanelRow>\n\t)\n}\n\nfunction getTextDecorationTitle(\n\ttextDecoration: Reduced<TextDecoration | undefined>,\n\tstylePresetType: \"link\" | \"text\" | undefined,\n) {\n\tif (isMixed(textDecoration)) return Dictionary.Mixed\n\tif (!isTextDecoration(textDecoration)) return Dictionary.AddEllipsis\n\t// We only show the \"none\" title for link style presets as they have a cascade like hierarchy, in other uses there\n\t// is no distinction between \"none\" and undefined\n\tif (textDecoration === \"none\" && stylePresetType !== \"link\") return Dictionary.AddEllipsis\n\n\treturn textDecorationLabels[textDecoration]\n}\n\nfunction TextDecorationPopout({\n\ttextDecoration,\n\ttextDecorationColor,\n\ttextDecorationThickness,\n\ttextDecorationOffset,\n\ttextDecorationStyle,\n\ttextDecorationSkipInk,\n\tonChange,\n\tstylePresetType,\n}: Pick<Props, Extract<keyof Props, `textDecoration${string}`> | \"onChange\" | \"stylePresetType\">) {\n\tconst showOptions = textDecoration && textDecoration !== \"none\"\n\tconst showUnderlineOptions = isMixed(textDecoration) || textDecoration === \"underline\"\n\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tshrink={1}\n\t\t\tpaddingTop={`calc(${dimensions.css.panelPadding} - 5px)`}\n\t\t\tpaddingLeft={dimensions.css.panelPadding}\n\t\t\tpaddingRight={dimensions.css.panelPadding}\n\t\t\tpaddingBottom={dimensions.css.panelPadding}\n\t\t>\n\t\t\t<SimpleTextDecorationRow\n\t\t\t\ttextDecoration={textDecoration}\n\t\t\t\tonChange={onChange}\n\t\t\t\ttitle=\"Type\"\n\t\t\t\tstylePresetType={stylePresetType}\n\t\t\t\tdeleteEnabled={false}\n\t\t\t/>\n\t\t\t{showOptions && (\n\t\t\t\t<>\n\t\t\t\t\t<PanelRow title={Dictionary.Color}>\n\t\t\t\t\t\t<DecorationColorInput\n\t\t\t\t\t\t\tvalue={textDecorationColor}\n\t\t\t\t\t\t\tonChange={value => onChange({ textDecorationColor: value })}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t\t<PanelRow title={Dictionary.Style}>\n\t\t\t\t\t\t<div style={doubleColumn}>\n\t\t\t\t\t\t\t<PopupButton mixed={isMixed(textDecorationStyle)}>\n\t\t\t\t\t\t\t\t{textDecorationStyleValues.map(style => (\n\t\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\t\tkey={style}\n\t\t\t\t\t\t\t\t\t\tidentifier={style}\n\t\t\t\t\t\t\t\t\t\ttitle={textDecorationStyleLabels[style]}\n\t\t\t\t\t\t\t\t\t\tonSelect={() => onChange({ textDecorationStyle: style })}\n\t\t\t\t\t\t\t\t\t\tselected={textDecorationStyle === style || (textDecorationStyle === undefined && style === \"solid\")}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t\t<PanelRow title={Dictionary.Thickness}>\n\t\t\t\t\t\t<DecorationDimensionInput\n\t\t\t\t\t\t\tvalue={textDecorationThickness}\n\t\t\t\t\t\t\tonChange={value => onChange({ textDecorationThickness: value })}\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tgetDefaultValueForUnit={getDefaultValueForThicknessUnit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{showUnderlineOptions && (\n\t\t\t\t<>\n\t\t\t\t\t<PanelRow title={Dictionary.Offset}>\n\t\t\t\t\t\t<DecorationDimensionInput\n\t\t\t\t\t\t\tvalue={textDecorationOffset}\n\t\t\t\t\t\t\tonChange={value => onChange({ textDecorationOffset: value })}\n\t\t\t\t\t\t\tgetDefaultValueForUnit={getDefaultValueForOffsetUnit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t\t<PanelRow title={Dictionary.SkipInk}>\n\t\t\t\t\t\t<div style={doubleColumn}>\n\t\t\t\t\t\t\t<PopupButton mixed={isMixed(textDecorationSkipInk)}>\n\t\t\t\t\t\t\t\t{textDecorationSkipInkValues.map(skipInk => (\n\t\t\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\t\t\tkey={skipInk}\n\t\t\t\t\t\t\t\t\t\tidentifier={skipInk}\n\t\t\t\t\t\t\t\t\t\ttitle={textDecorationSkipInkLabels[skipInk]}\n\t\t\t\t\t\t\t\t\t\tonSelect={() => onChange({ textDecorationSkipInk: skipInk })}\n\t\t\t\t\t\t\t\t\t\tselected={\n\t\t\t\t\t\t\t\t\t\t\ttextDecorationSkipInk === skipInk || (textDecorationSkipInk === undefined && skipInk === \"auto\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</PopupButton>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</PanelRow>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Stack>\n\t)\n}\n\ninterface DecorationDimensionInputProps {\n\tvalue: ReducedTextDecoration[\"textDecorationThickness\" | \"textDecorationOffset\"]\n\tonChange: (value: TextDecorationCSSDimension | \"auto\") => void\n\tgetDefaultValueForUnit: (unit: TextDecorationDimensionUnit) => number\n\tmin?: number\n}\nfunction DecorationDimensionInput({ value, onChange, getDefaultValueForUnit, min }: DecorationDimensionInputProps) {\n\tconst isAuto = !value || value === \"auto\"\n\tconst [currentValue, currentUnit] =\n\t\t!isMixed(value) && isFoundAndNotUndefined(value) && !isAuto ? parseCSSDimension(value) : [NaN, \"auto\"]\n\n\treturn (\n\t\t<>\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={currentValue}\n\t\t\t\tstep={getStepForUnit(currentUnit as TextDecorationDimensionUnit)}\n\t\t\t\tonChange={newValue => {\n\t\t\t\t\tonChange(createCSSDimension(newValue, isAuto ? \"px\" : (currentUnit as TextDecorationDimensionUnit)))\n\t\t\t\t}}\n\t\t\t\tmin={min}\n\t\t\t/>\n\t\t\t<PopupButton>\n\t\t\t\t<PopupButtonItem\n\t\t\t\t\tidentifier=\"auto\"\n\t\t\t\t\ttitle={Dictionary.Auto}\n\t\t\t\t\tonSelect={() => onChange(\"auto\")}\n\t\t\t\t\tselected={isAuto}\n\t\t\t\t/>\n\t\t\t\t{textDecorationDimensionUnits.map(unit => (\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\tkey={unit}\n\t\t\t\t\t\tidentifier={unit}\n\t\t\t\t\t\ttitle={dimensionUnitLabels[unit]}\n\t\t\t\t\t\tselected={currentUnit === unit}\n\t\t\t\t\t\tonSelect={() =>\n\t\t\t\t\t\t\tonChange(createCSSDimension(unit !== currentUnit ? getDefaultValueForUnit(unit) : currentValue, unit))\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</PopupButton>\n\t\t</>\n\t)\n}\n\nconst supportedColorTabs: ColorPickerTab[] = [\"solid\"]\ninterface DecorationColorInputProps {\n\tvalue: ReducedTextDecoration[\"textDecorationColor\"]\n\tonChange: (value: WithTextStyle[\"textDecorationColor\"]) => void\n}\nfunction DecorationColorInput({ value, onChange }: DecorationColorInputProps) {\n\tconst currentValue = value === \"currentColor\" ? undefined : value\n\treturn (\n\t\t<ColorPopoutButton\n\t\t\tnavigationTitle={Dictionary.Color}\n\t\t\tvalue={currentValue}\n\t\t\tonChange={onChange}\n\t\t\tcurrentType=\"color\"\n\t\t\ttabsToShow={supportedColorTabs}\n\t\t\temptyLabel={Dictionary.AddEllipsis}\n\t\t\tonDelete={currentValue ? () => onChange(undefined) : undefined}\n\t\t/>\n\t)\n}\n\nfunction getStepForUnit(unit: TextDecorationDimensionUnit) {\n\treturn unit === \"em\" ? 0.01 : 1\n}\n\nfunction getDefaultValueForThicknessUnit(unit: TextDecorationDimensionUnit) {\n\treturn unit === \"em\" ? 0.05 : 1\n}\n\nfunction getDefaultValueForOffsetUnit(unit: TextDecorationDimensionUnit) {\n\treturn unit === \"em\" ? 0.05 : 5\n}\n\nconst textDecorationLabels: Record<TextDecoration, string> = {\n\tnone: \"None\",\n\tunderline: \"Underline\",\n\t\"line-through\": \"Line-through\",\n}\n\nconst dimensionUnitLabels: Record<TextDecorationDimensionUnit, string> = {\n\tpx: Dictionary.Pixels,\n\tem: Dictionary.Em,\n}\n\nconst textDecorationStyleLabels: Record<TextDecorationStyle, string> = {\n\tsolid: \"Solid\",\n\tdouble: \"Double\",\n\tdotted: \"Dotted\",\n\tdashed: \"Dashed\",\n\twavy: \"Wavy\",\n}\n\nconst textDecorationSkipInkLabels: Record<TextDecorationSkipInk, string> = {\n\tauto: Dictionary.Auto,\n\tnone: Dictionary.None,\n\tall: Dictionary.All,\n}\n", "import \"TextDecorationRow.styles_1t7hfg3.wyw.css\"; export const textDecorationIcon = \"textDecorationIcon_twjqxiv\";\nexport const underline = \"underline_ux0ya7i\";\nexport const strikeThrough = \"strikeThrough_s1gywa19\";", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { TextDecorationRow } from \"../TextDecorationRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tdeleteEnabled?: boolean\n}\n\nexport function StylePresetTextDecorationRow({ preset, deleteEnabled }: Props) {\n\tconst changeTextDecoration: React.ComponentProps<typeof TextDecorationRow>[\"onChange\"] = useEngineCallback(\n\t\tupdate => {\n\t\t\tif (\"textDecoration\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecoration: update.textDecoration })\n\t\t\t}\n\t\t\tif (\"textDecorationColor\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecorationColor: update.textDecorationColor })\n\t\t\t}\n\t\t\tif (\"textDecorationThickness\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecorationThickness: update.textDecorationThickness })\n\t\t\t}\n\t\t\tif (\"textDecorationStyle\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecorationStyle: update.textDecorationStyle })\n\t\t\t}\n\t\t\tif (\"textDecorationSkipInk\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecorationSkipInk: update.textDecorationSkipInk })\n\t\t\t}\n\t\t\tif (\"textDecorationOffset\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ textDecorationOffset: update.textDecorationOffset })\n\t\t\t}\n\t\t},\n\t\t[preset],\n\t)\n\n\treturn (\n\t\t<TextDecorationRow\n\t\t\ttextDecoration={preset.textDecoration}\n\t\t\ttextDecorationColor={preset.textDecorationColor}\n\t\t\ttextDecorationThickness={preset.textDecorationThickness}\n\t\t\ttextDecorationStyle={preset.textDecorationStyle}\n\t\t\ttextDecorationSkipInk={preset.textDecorationSkipInk}\n\t\t\ttextDecorationOffset={preset.textDecorationOffset}\n\t\t\tdeleteEnabled={deleteEnabled}\n\t\t\tstylePresetType=\"text\"\n\t\t\tonChange={changeTextDecoration}\n\t\t/>\n\t)\n}\n", "import { PopupButton, PopupButtonItem } from \"@framerjs/fresco\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport type { TextTransform } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { useMemo } from \"react\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\ttextTransforms: Set<TextTransform | undefined>\n\tisStylePreset?: boolean\n\tsupportsCopyPaste?: boolean\n\tonChange: (textTransform: TextTransform) => void\n\tonDelete?: () => void\n}\n\nconst traitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"textTransform\", \"html\"]\n\nexport function hasTextTransform(textTransforms: Set<TextTransform | undefined>) {\n\tconst value = commonValue(textTransforms)\n\tif (isUndefined(value) || value === \"none\") return false\n\treturn true\n}\n\nexport function TextTransformRow({\n\tnodeIds,\n\ttextTransforms,\n\tisStylePreset = false,\n\tsupportsCopyPaste = false,\n\tonChange,\n\tonDelete,\n}: Props) {\n\t// We want to show the \"none\" option only if there is a style preset applied\n\t// this means that the TextTransformRow is being rendered in the style preset\n\t// popout and not the text panel\n\tconst options: TextTransform[] = [\"capitalize\", \"uppercase\", \"lowercase\"]\n\tif (isStylePreset) options.unshift(\"none\")\n\tif (onDelete) options.unshift(\"inherit\")\n\n\tconst canCopyTextTransform = useMemo(\n\t\t() => supportsCopyPaste && isClipboardSupported() && textTransforms.size === 1,\n\t\t[supportsCopyPaste, textTransforms.size],\n\t)\n\n\tconst [canPasteTextTransform, pasteTextTransform, copyTextTransform] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextTransform,\n\t\tnodeIds,\n\t\tcanCopyTextTransform,\n\t)\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttraitTypeKeys={traitTypeKeys}\n\t\t\ttitle=\"Transform\"\n\t\t\tcopyEnabled={canCopyTextTransform}\n\t\t\tonCopy={supportsCopyPaste ? copyTextTransform : undefined}\n\t\t\tpasteEnabled={canPasteTextTransform}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextTransform : undefined}\n\t\t\tonDelete={onDelete}\n\t\t>\n\t\t\t<div style={doubleColumn} data-testid=\"textpanel-transform-select\">\n\t\t\t\t<PopupButton>\n\t\t\t\t\t{options.map(option => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\tidentifier={option}\n\t\t\t\t\t\t\ttitle={capitalizeFirstLetter}\n\t\t\t\t\t\t\tselected={textTransforms.has(option) || (option === \"inherit\" && textTransforms.has(undefined))}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</div>\n\t\t</PanelRow>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { TextTransform, WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { TextTransformRow } from \"../TextTransformRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tdeleteEnabled?: boolean\n}\n\nexport function StylePresetTextTransformRow({ preset, deleteEnabled }: Props) {\n\tconst changeTextTransform = engine.scheduler.wrapHandler((textTransform?: TextTransform) => {\n\t\tengine.tree.current(preset)?.set({ textTransform })\n\t})\n\n\tconst textTransforms = new Set<TextTransform | undefined>([preset.textTransform])\n\n\treturn (\n\t\t<TextTransformRow\n\t\t\ttextTransforms={textTransforms}\n\t\t\tisStylePreset\n\t\t\tonChange={changeTextTransform}\n\t\t\tonDelete={deleteEnabled ? changeTextTransform : undefined}\n\t\t/>\n\t)\n}\n", "import { isMixed } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { BorderValues } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport {\n\tborderDefaults,\n\tisBorderOptional,\n\tisOptionalBorderVisible,\n\twithBorder,\n} from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { ReducedBorder } from \"document/models/CanvasTree/traits/utils/reduceBorder.ts\"\nimport { useSupportsVariable } from \"document/models/CanvasTree/traits/utils/reduceEnabledVariableProperties.ts\"\nimport {\n\tfromNodeBorderValues,\n\tfromReducedNodeBorderTrait,\n\tisBorderValues,\n} from \"document/models/controlProps/BorderControlPropValue.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport React, { useCallback } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { getVariableFromInfo } from \"../useVariableProviderInfo.ts\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { BorderPopoutButton } from \"./BorderPopoutButton.tsx\"\nimport { addBorderForNodes } from \"./utils/addBorderForNodes.ts\"\nimport { useCopyAndPasteSingleProperty } from \"./utils/useCopyAndPasteSingleProperty.ts\"\n\nconst popoutId = \"border-popout\"\nconst borderTraitTypes = [TraitType.Border]\n\ninterface Props extends ReducedBorder {\n\tnodeIds: NodeID[]\n\tonlyBreakpointNodes: boolean\n}\n\nexport const BorderPanel = React.memo(function BorderPanel({ onlyBreakpointNodes, ...props }: Props) {\n\tconst {\n\t\tborderEnabled,\n\t\tborderWidth,\n\t\tborderColor,\n\t\tborderStyle,\n\t\tborderPerSide,\n\t\tborderBottom,\n\t\tborderLeft,\n\t\tborderRight,\n\t\tborderTop,\n\t\tnodeIds,\n\t} = props\n\n\tconst canCopyBorder = useCallback(() => {\n\t\tif (!isClipboardSupported()) return false\n\t\tif (borderEnabled !== true || isMixed(borderWidth) || isMixed(borderColor) || isMixed(borderStyle)) return false\n\t\tif (\n\t\t\tisMixed(borderPerSide) ||\n\t\t\tisMixed(borderBottom) ||\n\t\t\tisMixed(borderLeft) ||\n\t\t\tisMixed(borderRight) ||\n\t\t\tisMixed(borderTop)\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}, [\n\t\tborderEnabled,\n\t\tborderWidth,\n\t\tborderColor,\n\t\tborderStyle,\n\t\tborderPerSide,\n\t\tborderBottom,\n\t\tborderLeft,\n\t\tborderRight,\n\t\tborderTop,\n\t])\n\n\tconst [canPasteBorder, pasteBorder, copyBorder] = useCopyAndPasteSingleProperty(\n\t\tTraitType.Border,\n\t\tprops.nodeIds,\n\t\tcanCopyBorder,\n\t)\n\n\tconst onChangeDynamicValue = useEngineCallback(\n\t\t(value: DynamicValue) => {\n\t\t\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withBorder)\n\t\t\tnodes.forEach(node => node.set({ borderEnabled: value }))\n\t\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\tconst onCreateVariable = useEngineCallback(\n\t\t(scopeId: NodeID) => {\n\t\t\tconst variableRef = createVariableInScope({\n\t\t\t\tinitialValue: fromReducedNodeBorderTrait({\n\t\t\t\t\tborderTop,\n\t\t\t\t\tborderRight,\n\t\t\t\t\tborderBottom,\n\t\t\t\t\tborderLeft,\n\t\t\t\t\tborderWidth,\n\t\t\t\t\tborderColor,\n\t\t\t\t\tborderStyle,\n\t\t\t\t\tborderPerSide,\n\t\t\t\t}),\n\t\t\t\tengine,\n\t\t\t\tscopeId,\n\t\t\t\ttype: ControlType.Border,\n\t\t\t\tname: \"border\",\n\t\t\t})\n\t\t\tif (!variableRef) return\n\t\t\tonChangeDynamicValue(variableRef)\n\t\t},\n\t\t[\n\t\t\tonChangeDynamicValue,\n\t\t\tborderTop,\n\t\t\tborderRight,\n\t\t\tborderBottom,\n\t\t\tborderLeft,\n\t\t\tborderWidth,\n\t\t\tborderColor,\n\t\t\tborderStyle,\n\t\t\tborderPerSide,\n\t\t],\n\t)\n\n\tconst onRemoveDynamicValue = useEngineCallback(() => {\n\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withBorder)) {\n\t\t\tconst nodeValue = node.borderEnabled\n\t\t\tif (!isDynamicValue(nodeValue)) continue\n\n\t\t\tif (isComputedValue(nodeValue)) {\n\t\t\t\tnode.set({ borderEnabled: undefined })\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst variable = getVariableFromInfo(nodeValue, engine.stores.treeStore.variableProviderInfo)\n\n\t\t\tif (variable?.type === ControlType.Border && isBorderValues(variable.initialValue)) {\n\t\t\t\t// We need to add in borderEnabled to the replacement value as\n\t\t\t\t// the variable data model BorderValues purposefully omits it.\n\t\t\t\tnode.set({ ...variable.initialValue, borderEnabled: true })\n\t\t\t} else {\n\t\t\t\tnode.set({ borderEnabled: undefined })\n\t\t\t}\n\t\t}\n\t}, [nodeIds])\n\n\tconst supportsVariables = useSupportsVariable(\"borderEnabled\")\n\tif (isNotFound(props.borderEnabled)) return null\n\tif (isBorderOptional(props.borderEnabled, onlyBreakpointNodes) && !isOptionalBorderVisible(props.borderEnabled)) {\n\t\treturn null\n\t}\n\n\tconst onAdd = engine.scheduler.wrapHandler(() => {\n\t\taddBorderForNodes(engine, props.nodeIds)\n\t})\n\n\tconst onChange = engine.scheduler.wrapHandler((getUpdate: (current: BorderValues) => BorderValues, _: NodeID[]) => {\n\t\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withBorder)\n\n\t\tfor (const node of nodes) {\n\t\t\tconst update = getUpdate(fromNodeBorderValues(node))\n\t\t\tnode.set(update)\n\t\t}\n\t})\n\n\tconst onDelete = engine.scheduler.wrapHandler(() => {\n\t\tconst nodes = engine.tree.getNodesWithTrait(props.nodeIds, withBorder)\n\t\tnodes.forEach(node => node.set(borderDefaults))\n\t})\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle=\"Border\"\n\t\t\tonAdd={onAdd}\n\t\t\tonDelete={onDelete}\n\t\t\taddEnabled={props.borderEnabled !== true}\n\t\t\tdeleteEnabled={props.borderEnabled === true || isMixed(props.borderEnabled)}\n\t\t\ttraitTypes={borderTraitTypes}\n\t\t\tonCopy={copyBorder}\n\t\t\tdynamicValue={isDynamicValue(borderEnabled) ? borderEnabled : null}\n\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\tcopyEnabled={canCopyBorder}\n\t\t\tonPaste={pasteBorder}\n\t\t\tpasteEnabled={canPasteBorder}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\tonSelectComputedValue={onChangeDynamicValue}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tvariableType={ControlType.Border}\n\t\t\tvariableReferenceType={ControlType.Border}\n\t\t\tcomputedValuePopoutId={popoutId}\n\t\t>\n\t\t\t{isDynamicValue(borderEnabled) ? (\n\t\t\t\t<DynamicValueButton\n\t\t\t\t\ttitle=\"Select\"\n\t\t\t\t\tvalue={borderEnabled}\n\t\t\t\t\tsupportsComputedValues={supportsVariables}\n\t\t\t\t\texpectedType={ControlType.Border}\n\t\t\t\t\tonChangeDynamicValue={onChangeDynamicValue}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t\toutputControl={undefined}\n\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t/>\n\t\t\t) : borderEnabled === true ? (\n\t\t\t\t<BorderPopoutButton popoutId=\"border\" {...props} onChange={onChange} onDelete={onDelete} />\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"border\" onClick={onAdd} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n})\n", "import { Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { BorderValues } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport React from \"react\"\nimport type { BorderValuesRowsProps } from \"./BorderValuesRows.tsx\"\nimport { BorderValuesRows } from \"./BorderValuesRows.tsx\"\n\nexport interface BorderPopoutProps extends BorderValuesRowsProps {\n\tnodeIds: NodeID[]\n\tonChange: (getUpdate: (current: BorderValues) => BorderValues, nodeIds: NodeID[]) => void\n}\n\nexport const BorderPopout = React.memo(function BorderPopout(props: BorderPopoutProps) {\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tpadding={dimensions.css.popoverPadding}\n\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t>\n\t\t\t<BorderValuesRows {...props} />\n\t\t</Stack>\n\t)\n})\n", "import { PopupButton, PopupButtonItem } from \"@framerjs/fresco\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { BorderValues } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport { borderStyles, withBorder } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport type { ReducedBorderValues } from \"document/models/controlProps/BorderControlPropValue.ts\"\nimport type { BorderStyle } from \"library/index.ts\"\nimport React from \"react\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { trackingMetadata } from \"../../shared/ColorPicker/trackingMetadata.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { SplitInFourInputsRow } from \"../rows/SplitInFourInputsRow.tsx\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\n\nexport interface BorderValuesRowsProps extends ReducedBorderValues {\n\tonChange: (getUpdate: (current: BorderValues) => BorderValues, nodeIds: NodeID[]) => void\n\tnodeIds: NodeID[]\n\tdisplayColorPopoutInPopover?: boolean\n}\n\nexport const BorderValuesRows = React.memo(function BorderValuesRows({\n\tborderWidth,\n\tborderPerSide,\n\tborderTop,\n\tborderRight,\n\tborderBottom,\n\tborderLeft,\n\tborderColor,\n\tborderStyle,\n\tonChange,\n\tnodeIds,\n\tdisplayColorPopoutInPopover,\n}: BorderValuesRowsProps) {\n\tlet segmentedIndex: number\n\n\tswitch (borderPerSide) {\n\t\tcase false:\n\t\t\tsegmentedIndex = 0\n\t\t\tbreak\n\t\tcase true:\n\t\t\tsegmentedIndex = 1\n\t\t\tbreak\n\t\tdefault:\n\t\t\tsegmentedIndex = -1\n\t}\n\n\tconst onBorderColorChange = engine.scheduler.wrapHandler((newBorderColor: string) => {\n\t\tonChange(current => ({ ...current, borderColor: newBorderColor }), nodeIds)\n\t})\n\n\tconst onStyleChange = engine.scheduler.wrapHandler((newStyle: BorderStyle) => {\n\t\tonChange(current => ({ ...current, borderStyle: newStyle }), nodeIds)\n\t})\n\n\tconst onFusedInputChange = engine.scheduler.wrapHandler((update: Record<string, unknown>) => {\n\t\tonChange(\n\t\t\tcurrent => ({\n\t\t\t\t...current,\n\t\t\t\t...(update as Partial<BorderValues>),\n\t\t\t}),\n\t\t\tnodeIds,\n\t\t)\n\t})\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title=\"Color\">\n\t\t\t\t<ColorPopoutButton\n\t\t\t\t\tnavigationTitle=\"Color\"\n\t\t\t\t\tvalue={borderColor}\n\t\t\t\t\tonChange={onBorderColorChange}\n\t\t\t\t\tdisplayInPopover={displayColorPopoutInPopover}\n\t\t\t\t\ttrackingMetadata={trackingMetadata(nodeIds, \"borderColor\")}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t\t<SplitInFourInputsRow\n\t\t\t\ttitle=\"Width\"\n\t\t\t\tmainValue={borderWidth}\n\t\t\t\tmainDefaultValue={0}\n\t\t\t\tsegmentedControlIndex={segmentedIndex}\n\t\t\t\tfusedValues={[borderTop, borderRight, borderBottom, borderLeft]}\n\t\t\t\tnodeIds={nodeIds}\n\t\t\t\tsplitInFourKey=\"borderPerSide\"\n\t\t\t\tmainProperty=\"borderWidth\"\n\t\t\t\tfusedProperties={[\"borderTop\", \"borderRight\", \"borderBottom\", \"borderLeft\"]}\n\t\t\t\tfusedLabels={[\"t\", \"r\", \"b\", \"l\"]}\n\t\t\t\ticonType=\"border\"\n\t\t\t\tfusedDefaultValues={[0, 0, 0, 0]}\n\t\t\t\tmainTraitFilter={withBorder}\n\t\t\t\tfusedTraitFilter={withBorder}\n\t\t\t\ttoggleTitles={[\"Border\", \"Border per side\"]}\n\t\t\t\tonChange={onFusedInputChange}\n\t\t\t\tminValue={0}\n\t\t\t/>\n\t\t\t<PanelRow title=\"Style\">\n\t\t\t\t<PopupButton wrapperStyle={doubleColumn}>\n\t\t\t\t\t{borderStyles.map(style => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={style}\n\t\t\t\t\t\t\tidentifier={style}\n\t\t\t\t\t\t\ttitle={capitalizeFirstLetter(style)}\n\t\t\t\t\t\t\tselected={borderStyle === style}\n\t\t\t\t\t\t\tonSelect={onStyleChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t</>\n\t)\n})\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFoundAndNotMixed } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { BorderStyle } from \"library/render/style/BorderComponent.tsx\"\nimport { upperCaseFirstChar } from \"utils/names.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { PopoutButtonBackgroundPreview } from \"../../shared/PopoutButtonBackgroundPreview.tsx\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport type { BorderPopoutProps } from \"./BorderPopout.tsx\"\nimport { BorderPopout } from \"./BorderPopout.tsx\"\n\ntype Props = BorderPopoutProps & {\n\tonDelete?: () => void\n\tpopoutId: string\n}\n\nexport function BorderPopoutButton({ onDelete, popoutId, ...props }: Props) {\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tid={popoutId}\n\t\t\tpopout={<BorderPopout {...props} />}\n\t\t\tnavigationTitle=\"Border\"\n\t\t\ttitle={title(props.borderStyle)}\n\t\t\tdisplayDivider\n\t\t\tonDelete={onDelete}\n\t\t\tpreview={<PopoutButtonBackgroundPreview background={isString(props.borderColor) ? props.borderColor : \"white\"} />}\n\t\t/>\n\t)\n}\n\nfunction title(borderStyle: Reduced<BorderStyle | undefined>): string {\n\tif (isUndefined(borderStyle)) return \"\"\n\treturn isFoundAndNotMixed(borderStyle) ? upperCaseFirstChar(borderStyle) : Dictionary.Mixed\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { WithBorder } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport { withBorder } from \"document/models/CanvasTree/traits/WithBorder.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\n\nexport const addBorderForNodes = (engine: VekterEngine, nodeIds: NodeID[]) => {\n\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withBorder)\n\n\tnodes.forEach(node => {\n\t\tconst update: Partial<WithBorder> = { borderEnabled: true }\n\n\t\tif (!isNumber(node.borderWidth)) update.borderWidth = 1\n\t\tif (!node.borderColor) update.borderColor = \"#222\"\n\t\tif (!node.borderStyle) update.borderStyle = \"solid\"\n\t\tupdate.borderPerSide = node.borderPerSide === true\n\t\tif (!isNumber(node.borderTop)) update.borderTop = 1\n\t\tif (!isNumber(node.borderRight)) update.borderRight = 1\n\t\tif (!isNumber(node.borderBottom)) update.borderBottom = 1\n\t\tif (!isNumber(node.borderLeft)) update.borderLeft = 1\n\n\t\tnode.set(update)\n\t})\n\n\tpopoutWindow.navigation.presentPopoutOnRegistration(\"border\")\n}\n", "import \"EditBlockquoteStylePresetPopout.styles_xxh3ya.wyw.css\"; export const background = \"background_b8g137o\";\nexport const panelScreen = \"panelScreen_puuf678\";\nexport const panelScreenTop = \"panelScreenTop_p7o2eqe\";", "import { shouldBeNever } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { FourPixelNumberShorthand } from \"document/models/CanvasTree/traits/NumberShorthand.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithPadding } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport { withPadding } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { getPaddingNumberPerSide } from \"document/models/CanvasTree/traits/utils/applyValueTransform.ts\"\nimport type { ReducedPadding } from \"document/models/CanvasTree/traits/utils/reducePadding.ts\"\nimport { isPaddingFoundAndNotMixed } from \"document/models/CanvasTree/traits/utils/reducePadding.ts\"\nimport { paddingVariableValueToNodeUpdate } from \"document/models/CanvasTree/utils/getNodeUpdateResolvingDynamicValues.ts\"\nimport { getNodePropertyControlDescription } from \"document/models/CanvasTree/utils/nodePropertyControlDefinitions.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { useCallback, useMemo } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { SplitInFourInputsRow } from \"../rows/SplitInFourInputsRow.tsx\"\nimport { FocusedPropertyInputId } from \"./utils/focusPropertyInput.ts\"\nimport { useCopyAndPasteSingleProperty } from \"./utils/useCopyAndPasteSingleProperty.ts\"\nimport { useDynamicLayoutValueUpdate } from \"./utils/useDynamicLayoutValueUpdate.ts\"\n\nconst paddingTraitTypes = [TraitType.Padding]\nconst paddingPopoutId = \"padding-popout\"\n\nconst variableCreationType = ControlType.Padding\nconst supportedVariableTypes = [ControlType.Padding, ControlType.Number] as const\n\nfunction getPaddingWithFallback(value: unknown) {\n\treturn getPaddingNumberPerSide(value).top\n}\n\nfunction getPaddingShorthandValue(props: ReducedPadding): FourPixelNumberShorthand {\n\tif (props.paddingPerSide === true) {\n\t\tconst paddingTop = isNumber(props.paddingTop) ? props.paddingTop : 0\n\t\tconst paddingRight = isNumber(props.paddingRight) ? props.paddingRight : 0\n\t\tconst paddingBottom = isNumber(props.paddingBottom) ? props.paddingBottom : 0\n\t\tconst paddingLeft = isNumber(props.paddingLeft) ? props.paddingLeft : 0\n\t\treturn `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px`\n\t}\n\treturn `${isNumber(props.padding) ? props.padding : 0}px`\n}\n\ninterface Props extends ReducedPadding {\n\tnodeIds: NodeID[]\n\tonlyFormInputNodes?: boolean\n\tsupportsVariables?: boolean\n}\n\nexport function PaddingRow({\n\tnodeIds,\n\tonlyFormInputNodes = false,\n\tsupportsVariables = true,\n\tpadding,\n\tpaddingPerSide,\n\tpaddingTop,\n\tpaddingRight,\n\tpaddingBottom,\n\tpaddingLeft,\n}: Props) {\n\tconst reducedPadding = useMemo<ReducedPadding>(\n\t\t() => ({ padding, paddingPerSide, paddingTop, paddingRight, paddingBottom, paddingLeft }),\n\t\t[padding, paddingPerSide, paddingTop, paddingRight, paddingBottom, paddingLeft],\n\t)\n\n\tconst canCopyPadding = useCallback(() => {\n\t\tif (!isClipboardSupported()) return false\n\t\tif (!onlyFormInputNodes) return false\n\n\t\treturn isPaddingFoundAndNotMixed(reducedPadding)\n\t}, [onlyFormInputNodes, reducedPadding])\n\n\tconst [canPastePadding, pastePadding, copyPadding] = useCopyAndPasteSingleProperty(\n\t\tTraitType.FormInputPadding,\n\t\tnodeIds,\n\t\tcanCopyPadding,\n\t)\n\n\tconst updatePadding = useEngineCallback(\n\t\t(value: DynamicValue | number) => {\n\t\t\tconst update: Partial<WithPadding> = { padding: value }\n\t\t\tif (isDynamicValue(value)) {\n\t\t\t\tupdate.paddingPerSide = false\n\t\t\t}\n\n\t\t\tfor (const node of engine.tree.getNodesWithTrait(nodeIds, withPadding)) {\n\t\t\t\tnode.set(update)\n\t\t\t}\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\tconst { onCreateVariable, onSelectComputedValue, onSelectVariableReference } = useDynamicLayoutValueUpdate(\n\t\t{\n\t\t\ttype: ControlType.Padding,\n\t\t\tname: \"padding\",\n\t\t\tinitialValue: getPaddingShorthandValue(reducedPadding),\n\t\t},\n\t\tpaddingPopoutId,\n\t\tupdatePadding,\n\t\tgetPaddingWithFallback,\n\t)\n\n\tconst onRemoveDynamicValue = useEngineCallback(\n\t\t(dynamicValue: DynamicValue) => {\n\t\t\tif (isVariableReference(dynamicValue)) {\n\t\t\t\tconst variableValue = getVariableValue(engine, dynamicValue)\n\t\t\t\tconst update = paddingVariableValueToNodeUpdate(variableValue)\n\t\t\t\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withPadding)\n\t\t\t\tfor (const node of nodes) {\n\t\t\t\t\tnode.set(update)\n\t\t\t\t}\n\t\t\t} else if (isComputedValue(dynamicValue)) {\n\t\t\t\tupdatePadding(0)\n\t\t\t} else {\n\t\t\t\tshouldBeNever(dynamicValue)\n\t\t\t}\n\t\t},\n\t\t[nodeIds, updatePadding],\n\t)\n\n\tif (isDynamicValue(padding)) {\n\t\treturn (\n\t\t\t<PanelRow\n\t\t\t\ttitle=\"Padding\"\n\t\t\t\ttraitTypes={paddingTraitTypes}\n\t\t\t\tsupportsVariables\n\t\t\t\tsupportsComputedValues\n\t\t\t\tcomputedValuePopoutId={paddingPopoutId}\n\t\t\t\tvariableType={supportedVariableTypes}\n\t\t\t\tvariableCreationType={variableCreationType}\n\t\t\t\tdynamicValue={padding}\n\t\t\t\tonCreateVariable={onCreateVariable}\n\t\t\t\tonSelectComputedValue={onSelectComputedValue}\n\t\t\t\tonSelectVariable={onSelectVariableReference}\n\t\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\t\tonCopy={copyPadding}\n\t\t\t\tonPaste={pastePadding}\n\t\t\t\tcopyEnabled={canCopyPadding}\n\t\t\t\tpasteEnabled={canPastePadding}\n\t\t\t>\n\t\t\t\t<DynamicValueButton\n\t\t\t\t\ttitle=\"Padding\"\n\t\t\t\t\tvalue={padding}\n\t\t\t\t\tpopoutId={paddingPopoutId}\n\t\t\t\t\tsupportsComputedValues\n\t\t\t\t\texpectedType={supportedVariableTypes}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t\tonChangeDynamicValue={updatePadding}\n\t\t\t\t\toutputControl={getNodePropertyControlDescription(\"padding\")}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t)\n\t}\n\n\treturn (\n\t\t<SplitInFourInputsRow\n\t\t\ttitle=\"Padding\"\n\t\t\tmainValue={padding}\n\t\t\tmainDefaultValue={0}\n\t\t\tsegmentedControlIndex={paddingPerSideSegmentIndex(paddingPerSide)}\n\t\t\tfusedValues={[paddingTop, paddingRight, paddingBottom, paddingLeft]}\n\t\t\tfusedDefaultValues={[0, 0, 0, 0]}\n\t\t\tnodeIds={nodeIds}\n\t\t\tsplitInFourKey=\"paddingPerSide\"\n\t\t\tmainProperty=\"padding\"\n\t\t\tfusedProperties={[\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"]}\n\t\t\tmainInputId={FocusedPropertyInputId.Padding}\n\t\t\tfusedInputIds={[\n\t\t\t\tFocusedPropertyInputId.PaddingTop,\n\t\t\t\tFocusedPropertyInputId.PaddingRight,\n\t\t\t\tFocusedPropertyInputId.PaddingBottom,\n\t\t\t\tFocusedPropertyInputId.PaddingLeft,\n\t\t\t]}\n\t\t\ticonType=\"border\"\n\t\t\tfusedLabels={[\"t\", \"r\", \"b\", \"l\"]}\n\t\t\tmainTraitFilter={withPadding}\n\t\t\tfusedTraitFilter={withPadding}\n\t\t\ttoggleTitles={[\"Padding\", \"Padding per side\"]}\n\t\t\tminValue={0}\n\t\t\tstep=\"nudge\"\n\t\t\ttraitTypes={paddingTraitTypes}\n\t\t\ttestId=\"stacklayoutpanel-padding\"\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tsupportsComputedValues\n\t\t\tcomputedValuePopoutId={paddingPopoutId}\n\t\t\tvariableType={supportedVariableTypes}\n\t\t\tvariableCreationType={variableCreationType}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tonSelectComputedValue={onSelectComputedValue}\n\t\t\tonSelectVariable={onSelectVariableReference}\n\t\t\tdynamicValue={isDynamicValue(padding) ? padding : null}\n\t\t\tonCopy={copyPadding}\n\t\t\tonPaste={pastePadding}\n\t\t\tcopyEnabled={canCopyPadding}\n\t\t\tpasteEnabled={canPastePadding}\n\t\t/>\n\t)\n}\n\nexport function paddingPerSideSegmentIndex(paddingPerSide: Reduced<boolean | undefined>) {\n\tswitch (paddingPerSide) {\n\t\tcase false:\n\t\t\treturn 0\n\t\tcase true:\n\t\t\treturn 1\n\t\tdefault:\n\t\t\treturn -1\n\t}\n}\n", "import { shouldBeNever } from \"@framerjs/shared\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport type { ComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport { isComputedValue } from \"document/models/CanvasTree/traits/ComputedValue.ts\"\nimport type { DynamicValue, NonDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithLayout } from \"document/models/CanvasTree/traits/WithLayout.ts\"\nimport type { VariableType } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { isFunction } from \"utils/typeChecks.ts\"\nimport type { CreateVariableOptions } from \"../../utils/createVariable.ts\"\nimport { createVariableInScope } from \"../../utils/createVariableInScope.ts\"\n\nexport function useDynamicLayoutValueUpdate<T extends WithLayout, K extends keyof T>(\n\tcreateOptions: CreateVariableOptions | ((type: VariableType) => CreateVariableOptions),\n\tpopoutId: string,\n\tlayoutUpdateHandler: (value: NonNullable<T[K] | DynamicValue | undefined>) => void,\n\tgetFallbackValueForVariable: (variableValue: unknown) => NonDynamicValue<NonNullable<T[K] | undefined>>,\n) {\n\tconst onCreateVariable = (scopeId: NodeID, type: VariableType) => {\n\t\tconst options = isFunction(createOptions) ? createOptions(type) : createOptions\n\n\t\tconst variableRef = createVariableInScope({\n\t\t\tengine,\n\t\t\tscopeId,\n\t\t\t...options,\n\t\t})\n\n\t\tif (variableRef) layoutUpdateHandler(variableRef)\n\t}\n\n\tconst onRemoveDynamicValue = (variable: unknown) => {\n\t\tif (!isDynamicValue(variable)) return\n\n\t\tif (isVariableReference(variable)) {\n\t\t\tconst variableValue = getVariableValue(engine, variable)\n\t\t\tlayoutUpdateHandler(getFallbackValueForVariable(variableValue))\n\t\t} else if (isComputedValue(variable)) {\n\t\t\tlayoutUpdateHandler(getFallbackValueForVariable(undefined))\n\t\t} else {\n\t\t\tshouldBeNever(variable)\n\t\t}\n\t}\n\n\tconst onSelectVariableReference = (variableReference: DynamicValue) => {\n\t\tlayoutUpdateHandler(variableReference)\n\t}\n\n\tconst onSelectComputedValue = (computedValue: ComputedValue) => {\n\t\tlayoutUpdateHandler(computedValue)\n\t\tpopoutWindow.navigation.presentPopout(popoutId)\n\t}\n\n\treturn { onCreateVariable, onRemoveDynamicValue, onSelectVariableReference, onSelectComputedValue }\n}\n", "import \"Panel.styles_1byffkj.wyw.css\"; export const panelContent = \"panelContent_p5inzda\";\nexport const panel = \"panel_ptswoqr\";\nexport const panelWithHeader = \"panelWithHeader_p14s1oge\";", "import { cx } from \"@linaria/core\"\nimport type React from \"react\"\nimport * as classes from \"./Panel.styles.ts\"\n\ninterface PanelProps extends React.ComponentProps<\"div\"> {\n\theader?: React.ReactNode\n\ttestId?: string\n}\n\n/**\n * @example <Panel header={<PanelSectionHeader title=\"Title\" />}>{rows}</Panel>\n */\nexport function Panel({ header, children, testId, className, ...props }: PanelProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cx(classes.panel, Boolean(header) && classes.panelWithHeader, className)}\n\t\t\tdata-testid={testId}\n\t\t\t{...props}\n\t\t>\n\t\t\t{header}\n\t\t\t<div className={classes.panelContent}>{children}</div>\n\t\t</div>\n\t)\n}\n", "import { useClickHandlers } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { Spacer, truncateWithEllipsis } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport type { EducationKey } from \"app/EducationTooltip.tsx\"\nimport { EducationTooltip } from \"app/EducationTooltip.tsx\"\nimport React from \"react\"\nimport * as styles from \"./PanelSectionHeader.styles.ts\"\n\nexport interface PanelSectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n\ttitle: JSX.Element | string\n\ticon?: JSX.Element\n\tclickable?: boolean\n\tpanelDivider?: boolean\n\tenabled?: boolean\n\teducationTooltipId?: EducationKey\n}\n\nconst ForwardRefPanelSectionHeader = React.forwardRef<HTMLDivElement, PanelSectionHeaderProps>(\n\tfunction ForwardRefPanelSectionHeader(props, ref): JSX.Element {\n\t\t// The reference is optional and its used to calculate the\n\t\t// menu layers position\n\t\tconst localRef = React.useRef(null)\n\t\tconst headerRef = ref ?? localRef\n\n\t\tconst {\n\t\t\ttitle,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\ticon,\n\t\t\tclickable = false,\n\t\t\tpanelDivider = true,\n\t\t\tenabled = true,\n\t\t\teducationTooltipId,\n\t\t\tonClick,\n\t\t\tonMouseDown,\n\t\t\t...rest\n\t\t} = props\n\n\t\tconst clickHandlers = useClickHandlers(onClick, onMouseDown)\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\t{...rest}\n\t\t\t\t{...clickHandlers}\n\t\t\t\tclassName={cx(\n\t\t\t\t\tstyles.header,\n\t\t\t\t\tpanelDivider && styles.panelDivider,\n\t\t\t\t\tclickable && enabled && styles.clickable,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tref={headerRef}\n\t\t\t>\n\t\t\t\t{icon && !educationTooltipId && (\n\t\t\t\t\t<div className={cx(styles.iconWrapper, !enabled && styles.iconWrapperDisabled)}>{icon}</div>\n\t\t\t\t)}\n\t\t\t\t<div className={cx(truncateWithEllipsis, styles.title)}>{title}</div>\n\t\t\t\t{educationTooltipId !== undefined && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Spacer size={dimensions.css.inputSpacing} />\n\t\t\t\t\t\t<EducationTooltip tooltipId={educationTooltipId} />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<Spacer flex minSize={8} />\n\t\t\t\t<div className={styles.headerActions}>{children}</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport const PanelSectionHeader = React.memo(ForwardRefPanelSectionHeader)\n", "import \"PanelSectionHeader.styles_1p2wk9d.wyw.css\"; export const header = \"header_h10l6u5c\";\nexport const panelDivider = \"panelDivider_psmj6sh\";\nexport const title = \"title_t1k6az3b\";\nexport const headerActions = \"headerActions_h161tq0v\";\nexport const iconWrapper = \"iconWrapper_i1jzaapq\";\nexport const iconWrapperDisabled = \"iconWrapperDisabled_ij4gv2m\";\nexport const clickable = \"clickable_c1ao5210\";", "import { Scroll, Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport type React from \"react\"\nimport { useDismissPopoutOnSelectionChange } from \"../utils/useDismissPopoutOnSelectionChange.tsx\"\n\ninterface Props {\n\tchildren: React.ReactNode\n\t/** With panels the container doesn't include any top spacing. */\n\twithPanelHeader: boolean\n}\n\nexport function PresetPopoutContainer({ children, withPanelHeader }: Props) {\n\tuseDismissPopoutOnSelectionChange()\n\n\treturn (\n\t\t<Scroll>\n\t\t\t<Stack\n\t\t\t\tgap={0}\n\t\t\t\tpaddingLeft={dimensions.css.popoverPadding}\n\t\t\t\tpaddingRight={dimensions.css.popoverPadding}\n\t\t\t\tpaddingTop={withPanelHeader ? 0 : `calc(${dimensions.css.popoverPadding} - ${dimensions.css.inputSpacing})`}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Stack>\n\t\t</Scroll>\n\t)\n}\n", "import { assert } from \"@framerjs/shared\"\nimport type { CanvasTree } from \"document/models/CanvasTree/CanvasTree.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { isBlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\n\nfunction getBlockquoteStylePresetBreakpoints(presets: BlockquoteStylePresetNode[], preset: BlockquoteStylePresetNode) {\n\treturn presets\n\t\t.filter(breakpoint => breakpoint.originalid === preset.id)\n\t\t.sort((left, right) => (right.breakpointWidth ?? 0) - (left.breakpointWidth ?? 0))\n}\n\nexport function getBlockquoteStylePresetBreakpointsFromTree(tree: CanvasTree, preset: BlockquoteStylePresetNode) {\n\tconst listNode = PresetsListNode.get(tree)\n\tassert(listNode, \"Can't find PresetsListNode\")\n\n\tconst presets = listNode.children.filter(isBlockquoteStylePresetNode)\n\treturn getBlockquoteStylePresetBreakpoints(presets, preset)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { getBlockquoteStylePresetBreakpointsFromTree } from \"./getBlockquoteStylePresetBreakpoints.ts\"\n\nexport function useBlockquoteStylePresetBreakpoints(preset: BlockquoteStylePresetNode) {\n\treturn useDeprecatedEngineState(\n\t\tEngineChange.Tree,\n\t\t() => getBlockquoteStylePresetBreakpointsFromTree(engine.tree, preset),\n\t\tpreset.id,\n\t)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { duplicateEntityReferenceNode } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isBlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { createBlockquoteStylePreset } from \"utils/blockquoteStylePresetUtils.ts\"\nimport { canDeleteStylePreset } from \"utils/stylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport type { AssetReferencePopoutContentProps } from \"../../assets/types.ts\"\nimport { EditBlockquoteStylePresetPopout } from \"../panels/EditBlockquoteStylePresetPopout.tsx\"\nimport type { ContextMenuOptions } from \"./presetRowProps.ts\"\nimport { removePresetNode } from \"./removePresetNode.ts\"\n\nexport function createBlockquoteItemContextMenuItems(id: NodeID, options: ContextMenuOptions) {\n\tconst node = engine.tree.get<BlockquoteStylePresetNode>(id)\n\tif (isNull(node)) return []\n\tif (!isBlockquoteStylePresetNode(node)) return []\n\n\treturn createContextMenuItems(node, options)\n}\n\nfunction createContextMenuItems(preset: BlockquoteStylePresetNode, { startRenaming }: ContextMenuOptions) {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tfunction findNodes() {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.QuickActions,\n\t\t\tsource: \"styles_panel\",\n\t\t\tinitialCategory: {\n\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\toptions: {\n\t\t\t\t\ttype: FindNodesType.StylePreset,\n\t\t\t\t\ttitle: preset.getName(),\n\t\t\t\t\tpresetId: preset.id,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\tfunction duplicatePreset() {\n\t\tcreateBlockquoteStylePreset(engine, {\n\t\t\tname: preset.getName(),\n\t\t\tblockquoteStyle: preset.getBlockquoteStyle(),\n\t\t\tonCreate(newPreset) {\n\t\t\t\tduplicateEntityReferenceNode(engine, preset.id, newPreset.id)\n\t\t\t},\n\t\t})\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Find\",\n\t\t\tclick: findNodes,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Rename\",\n\t\t\tclick: startRenaming,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Duplicate\",\n\t\t\tclick: duplicatePreset,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\tclick: () => removePresetNode(engine, preset.id),\n\t\t\tenabled: !isViewOnly && canDeleteStylePreset(engine.stores.treeStore, preset),\n\t\t},\n\t]\n}\n\nexport function BlockquoteStylePresetPopoutContent({ referenceItemId }: AssetReferencePopoutContentProps) {\n\tconst node = useEngineState(\n\t\t() => {\n\t\t\treturn engine.tree.get<BlockquoteStylePresetNode>(referenceItemId)\n\t\t},\n\t\t[referenceItemId],\n\t\t[EngineChange.Tree],\n\t)\n\n\tif (isNull(node) || !isBlockquoteStylePresetNode(node)) return null\n\n\treturn <EditBlockquoteStylePresetPopout preset={node} />\n}\n", "import { Button, Scroll, useReadOnly } from \"@framerjs/fresco\"\nimport { palette } from \"@framerjs/fresco/tokens\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { StylePresetNode } from \"document/models/CanvasTree/nodes/utils/isStylePresetNode.ts\"\nimport { useCallback, useLayoutEffect } from \"react\"\nimport { useIsViewOnly } from \"web/pages/project/permissions/useIsViewOnly.ts\"\nimport { EntityRow } from \"../../assets/EntityRow.tsx\"\nimport type { CreateContextMenuItemsHandler } from \"../../assets/types.ts\"\nimport { expandAssetEntityItemsFromNode } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport type { AssetRowComponentType } from \"../../assets/utils/getComponentType.ts\"\nimport type { usePresetAssetRows } from \"../../assets/utils/usePresetAssetRows.ts\"\nimport { PopoutButton } from \"../../shared/PopoutButton.tsx\"\nimport { TableSearchBar } from \"../../shared/TableSearchBar.tsx\"\nimport { stopPropagation } from \"../rows/utils/stopPropagation.ts\"\nimport { EmptyEntityAssetResults } from \"./EmptyEntityAssetResults.tsx\"\nimport * as styles from \"./SelectStyleEntityAssetPopoutContent.styles.ts\"\n\nexport interface EditStyleEntityAssetPopoutProps {\n\tid: NodeID\n}\n\ninterface SelectStyleEntityAssetPopoutContentProps extends ReturnType<\n\ttypeof usePresetAssetRows<StylePresetNode, { description?: string; componentType?: AssetRowComponentType }>\n> {\n\tselectedIds: Set<NodeID | undefined>\n\tPopout: React.ComponentType<EditStyleEntityAssetPopoutProps>\n\tcreateItemContextMenuItems?: CreateContextMenuItemsHandler | undefined\n\tonCreate: (event: React.MouseEvent) => void\n\tonSelect: (id: NodeID) => void\n}\n\nexport function SelectStyleEntityAssetPopoutContent({\n\thasAnyItems,\n\thasSearch,\n\thasUnreferencedItems,\n\ttypeRootId,\n\tPopout,\n\trows,\n\tsearchValue,\n\tselectedIds,\n\tonCreate,\n\tonSelect,\n\tsetSearchValue,\n\tcreateItemContextMenuItems,\n}: SelectStyleEntityAssetPopoutContentProps) {\n\tconst isReadOnly = useReadOnly()\n\n\tconst handleToggleCollapse = useCallback(\n\t\t(id: NodeID) => engine.stores.chromeStore.toggleAssetEntityItem(id, true),\n\t\t[],\n\t)\n\n\tuseLayoutEffect(() => {\n\t\t// We can't update store data while rendering\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tif (!typeRootId) return\n\t\t\tfor (const selectedItemId of selectedIds.values()) {\n\t\t\t\tif (!selectedItemId) return\n\t\t\t\t// Make sure we expand the folders until the selected node\n\t\t\t\texpandAssetEntityItemsFromNode(engine, selectedItemId, typeRootId, true)\n\t\t\t}\n\t\t})\n\t}, [typeRootId, selectedIds])\n\n\tconst getEditButton = useCallback(\n\t\t(id: NodeID, title: string) => {\n\t\t\treturn <EditStyleButton id={id} title={title} Popout={Popout} />\n\t\t},\n\t\t[Popout],\n\t)\n\n\tconst isEmpty = rows?.length === 0\n\n\tconst viewOnly = useIsViewOnly(\"canDesign\")\n\n\treturn (\n\t\t<Scroll className={styles.scroll}>\n\t\t\t<div className={cx(styles.container, styles.scrollWrapper)}>\n\t\t\t\t<div className={cx(styles.listWrapper, styles.noPaddingTop, hasSearch && !isEmpty && styles.paddingBottom)}>\n\t\t\t\t\t{hasAnyItems && (\n\t\t\t\t\t\t<div className={styles.sticky}>\n\t\t\t\t\t\t\t<TableSearchBar\n\t\t\t\t\t\t\t\tvalue={searchValue}\n\t\t\t\t\t\t\t\tenabled\n\t\t\t\t\t\t\t\tonChange={setSearchValue}\n\t\t\t\t\t\t\t\tplaceholder={Dictionary.SearchEllipsis}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<EmptyEntityAssetResults hasSearch={hasSearch} hasResults={!isEmpty} />\n\n\t\t\t\t\t{!isEmpty && typeRootId && (\n\t\t\t\t\t\t<div className={styles.itemsWrapper}>\n\t\t\t\t\t\t\t{rows.map(row => (\n\t\t\t\t\t\t\t\t<EntityRow\n\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\ttype={row.type}\n\t\t\t\t\t\t\t\t\ttypeRootId={typeRootId}\n\t\t\t\t\t\t\t\t\tdepth={row.depth}\n\t\t\t\t\t\t\t\t\tid={row.id}\n\t\t\t\t\t\t\t\t\ttitle={row.title}\n\t\t\t\t\t\t\t\t\tselected={selectedIds.has(row.id)}\n\t\t\t\t\t\t\t\t\tcollapsed={row.collapsed}\n\t\t\t\t\t\t\t\t\tcolor={palette.dark20}\n\t\t\t\t\t\t\t\t\tonToggleCollapse={handleToggleCollapse}\n\t\t\t\t\t\t\t\t\tonSelectItem={!viewOnly && row.type !== \"folder\" ? onSelect : undefined}\n\t\t\t\t\t\t\t\t\treferenceCreateContextMenuItems={createItemContextMenuItems}\n\t\t\t\t\t\t\t\t\treferenceWithPopoutDivider\n\t\t\t\t\t\t\t\t\tgetEditButton={getEditButton}\n\t\t\t\t\t\t\t\t\treferenceClassName={styles.itemWrapper}\n\t\t\t\t\t\t\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\t\t\t\t\t\t\tdescription={row.description}\n\t\t\t\t\t\t\t\t\tcomponentType={row.componentType}\n\t\t\t\t\t\t\t\t\tinsertionIndicatorOffset={15}\n\t\t\t\t\t\t\t\t\tpopout\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{!hasSearch && !isReadOnly && (\n\t\t\t\t\t<div className={styles.newStyleButtonWrapper}>\n\t\t\t\t\t\t<Button className={styles.newStyleButton} title={Dictionary.NewStyle} onClick={onCreate} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Scroll>\n\t)\n}\n\nconst frescoButtonProps = { small: true }\n\ninterface EditStyleButtonProps {\n\tid: NodeID\n\ttitle: string\n\tPopout: React.ComponentType<{ id: NodeID }>\n}\n\nfunction EditStyleButton({ id, title, Popout }: EditStyleButtonProps) {\n\tconst isReadOnly = useReadOnly()\n\n\tif (!Popout || !id) return null\n\n\tconst viewOrEdit = isReadOnly ? Dictionary.View : Dictionary.Edit\n\n\treturn (\n\t\t<PopoutButton\n\t\t\tdisplayDivider\n\t\t\tnavigationTitle={`${viewOrEdit} ${title}`}\n\t\t\tfrescoButtonProps={frescoButtonProps}\n\t\t\tpopout={<Popout id={id} />}\n\t\t\tclassName={styles.editButton}\n\t\t\tonClick={stopPropagation}\n\t\t\tuseFrescoButton\n\t\t>\n\t\t\t{viewOrEdit}\n\t\t</PopoutButton>\n\t)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { BlockquoteStylePresetNode } from \"document/models/CanvasTree/nodes/BlockquoteStylePresetNode.ts\"\nimport { BlockquoteEntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { isBlockquoteStylePresetPrimaryNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { migrateTextNodes } from \"document/utils/migrateTextToRichTextNode.ts\"\nimport { createBlockquoteStylePreset } from \"utils/blockquoteStylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { usePresetAssetRows } from \"../../assets/utils/usePresetAssetRows.ts\"\nimport { createBlockquoteItemContextMenuItems } from \"../utils/getBlockquoteStylePresetRowProps.tsx\"\nimport { EditBlockquoteStylePresetPopout } from \"./EditBlockquoteStylePresetPopout.tsx\"\nimport {\n\ttype EditStyleEntityAssetPopoutProps,\n\tSelectStyleEntityAssetPopoutContent,\n} from \"./SelectStyleEntityAssetPopoutContent.tsx\"\n\ninterface SelectBlockquoteStyleEntityAssetPopoutProps {\n\tnodeIds: string[]\n\tselectedIds: Set<string | undefined>\n}\n\nexport function SelectBlockquoteStyleEntityAssetPopout({\n\tnodeIds,\n\tselectedIds,\n}: SelectBlockquoteStyleEntityAssetPopoutProps) {\n\tconst { rows, hasAnyItems, hasUnreferencedItems, typeRootId, searchValue, setSearchValue, hasSearch } =\n\t\tusePresetAssetRows(\n\t\t\t() => PresetsListNode.getNodes(engine.tree),\n\t\t\t() => BlockquoteEntityTypeRootNode.get(engine.tree),\n\t\t\tundefined,\n\t\t\tisBlockquoteStylePresetPrimaryNode,\n\t\t)\n\n\tconst handleCreateBlockquoteStyle = useEngineCallback(() => {\n\t\tcreateBlockquoteStylePreset(engine, {\n\t\t\tonCreate(preset) {\n\t\t\t\tselectBlockquoteStylePreset(nodeIds, preset)\n\t\t\t},\n\t\t})\n\t}, [nodeIds])\n\n\tconst handleSelect = useEngineCallback(\n\t\t(id: NodeID) => {\n\t\t\tconst preset = engine.tree.get<BlockquoteStylePresetNode>(id)\n\t\t\tif (isNull(preset)) return\n\n\t\t\tselectBlockquoteStylePreset(nodeIds, preset)\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\treturn (\n\t\t<SelectStyleEntityAssetPopoutContent\n\t\t\trows={rows}\n\t\t\thasAnyItems={hasAnyItems}\n\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\ttypeRootId={typeRootId}\n\t\t\tsearchValue={searchValue}\n\t\t\tsetSearchValue={setSearchValue}\n\t\t\thasSearch={hasSearch}\n\t\t\tselectedIds={selectedIds}\n\t\t\tPopout={EditBlockquoteStyleEntityAssetPopout}\n\t\t\tcreateItemContextMenuItems={createBlockquoteItemContextMenuItems}\n\t\t\tonCreate={handleCreateBlockquoteStyle}\n\t\t\tonSelect={handleSelect}\n\t\t/>\n\t)\n}\n\nfunction EditBlockquoteStyleEntityAssetPopout({ id }: EditStyleEntityAssetPopoutProps) {\n\tconst preset = useEngineState(() => engine.tree.get<BlockquoteStylePresetNode>(id), [], EngineChange.Tree)\n\n\tif (isNull(preset)) return null\n\n\treturn <EditBlockquoteStylePresetPopout preset={preset} />\n}\n\nexport const selectBlockquoteStylePreset = engine.scheduler.wrapHandler(\n\t(nodeIds: string[], preset: BlockquoteStylePresetNode) => {\n\t\tconst anyTextNodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\t\tconst richTextNodes = migrateTextNodes(engine, anyTextNodes)\n\n\t\tfor (const node of richTextNodes) {\n\t\t\tnode.setNodeBlockquoteStylePreset(preset)\n\t\t}\n\n\t\trecord(\"styles_preset_add\", {\n\t\t\ttag: \"blockquote\",\n\t\t\tname: preset.getName(),\n\t\t\tid: preset.id,\n\t\t})\n\n\t\tengine.stores.selectionStore.set(richTextNodes)\n\t},\n)\n", "import { Translatable as T } from \"@framerjs/fresco\"\nimport { assertNever } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { recordCornerShapeUpdate } from \"document/components/utils/recordCornerShapeUpdate.ts\"\nimport engine from \"document/engine.ts\"\nimport type { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { cornerShapeTitle } from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport {\n\ttype LinkStyleKeyPrefix,\n\ttype WithLinkStyle,\n\ttype WithoutLinkPrefix,\n\tgetLinkStyleKey,\n} from \"document/models/CanvasTree/traits/WithLinkStyle.ts\"\nimport {\n\ttextBackgroundColorFromTextColor,\n\ttextDecorationAddedDefault,\n\ttextStyleDefaults,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { defaultDurationBasedSpringTransition } from \"document/models/Transition.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { BackgroundStyles } from \"prosemirror/styles.ts\"\nimport { useCallback } from \"react\"\nimport { isDefined } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { useIsViewOnly } from \"web/pages/project/permissions/useIsViewOnly.ts\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { TransitionPopoutButton } from \"../../shared/TransitionEditor/TransitionPopout.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { TextBackgroundColorRow } from \"../rows/TextBackgroundColorRow.tsx\"\nimport { TextBackgroundCornerRows } from \"../rows/TextBackgroundCornerRows.tsx\"\nimport { TextBackgroundPaddingRow } from \"../rows/TextBackgroundPaddingRow.tsx\"\nimport { TextColorRow } from \"../rows/TextColorRow.tsx\"\nimport { TextDecorationRow } from \"../rows/TextDecorationRow.tsx\"\nimport { Panel } from \"./Panel.tsx\"\nimport { PanelSectionHeader } from \"./PanelSectionHeader.tsx\"\nimport { PanelSectionHeaderButton } from \"./PanelSectionHeaderButton.tsx\"\nimport { PresetPopoutContainer } from \"./PresetPopoutContainer.tsx\"\nimport { IconSectionHeaderPlus } from \"./icons/IconSectionHeaderPlus.tsx\"\n\nconst linkStates = [\"default\", \"hover\", \"current\"] as const\ntype LinkState = (typeof linkStates)[number]\n\ninterface Props {\n\tpreset: LinkStylePresetNode\n}\n\nexport function EditLinkStylePresetPopout({ preset }: Props) {\n\treturn (\n\t\t<PresetPopoutContainer withPanelHeader>\n\t\t\t{linkStates.map(linkState => (\n\t\t\t\t<LinkStylePresetPanel key={linkState} linkState={linkState} preset={preset} />\n\t\t\t))}\n\t\t</PresetPopoutContainer>\n\t)\n}\n\ninterface LinkStylePresetPanelProps {\n\tlinkState: LinkState\n\tpreset: LinkStylePresetNode\n}\n\nfunction LinkStylePresetPanel({ linkState, preset }: LinkStylePresetPanelProps) {\n\tconst isBaseState = linkState === \"default\"\n\tconst handlePresent = useCallback(() => {\n\t\tsetActiveLinkStyleState(preset, linkState)\n\t}, [preset, linkState])\n\n\tconst handleDismiss = useCallback(() => {\n\t\tsetActiveLinkStyleState(undefined, undefined)\n\t}, [])\n\n\tconst changeTextBackgroundColor = useEngineCallback(\n\t\t(newTextBackgroundColor?: WithLinkStyle[\"linkTextBackgroundColor\"]) => {\n\t\t\tengine.tree.current(preset)?.set({\n\t\t\t\t[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundColor\")]: newTextBackgroundColor,\n\t\t\t})\n\t\t},\n\t\t[preset, linkState],\n\t)\n\tconst changeTextBackgroundRadius = useEngineCallback(\n\t\t(newTextBackgroundRadius?: WithLinkStyle[\"linkTextBackgroundRadius\"]) => {\n\t\t\tconst key = getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundRadius\")\n\t\t\tif (!isDefined(newTextBackgroundRadius)) {\n\t\t\t\tengine.tree.current(preset)?.set({ [key]: undefined })\n\t\t\t\t// Not touching corner shape because it's possible to delete radius only in hover\n\t\t\t\t// and current states, where these act as \"overrides\" rather than \"root\" values.\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst spreadableRadius = preset[key] ?? BackgroundStyles.defaults.textBackgroundRadius\n\t\t\tengine.tree.current(preset)?.set({\n\t\t\t\t[key]: { ...spreadableRadius, ...newTextBackgroundRadius },\n\t\t\t})\n\t\t},\n\t\t[preset, linkState],\n\t)\n\tconst changeTextBackgroundCornerShape = useEngineCallback(\n\t\t(newTextBackgroundCornerShape: number | undefined) => {\n\t\t\tconst current = engine.tree.current(preset)\n\t\t\tif (!current) return\n\n\t\t\tconst key = getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundCornerShape\")\n\t\t\tif (!isDefined(newTextBackgroundCornerShape)) {\n\t\t\t\tcurrent.set({ [key]: undefined })\n\t\t\t\trecord(\"corner_shape_delete\", {\n\t\t\t\t\tnodeClass: current.__class,\n\t\t\t\t\tnodeId: current.id,\n\t\t\t\t\tlinkState,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcurrent.set({ [key]: { cornerShape: newTextBackgroundCornerShape } })\n\t\t\trecordCornerShapeUpdate(current, { value: newTextBackgroundCornerShape, linkState })\n\t\t},\n\t\t[preset, linkState],\n\t)\n\tconst changeTextBackgroundPadding = useEngineCallback(\n\t\t(newTextBackgroundPadding?: WithLinkStyle[\"linkTextBackgroundPadding\"]) => {\n\t\t\tconst key = getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundPadding\")\n\t\t\tif (!isDefined(newTextBackgroundPadding)) {\n\t\t\t\tengine.tree.current(preset)?.set({ [key]: undefined })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst spreadablePadding = preset[key] ?? BackgroundStyles.defaults.textBackgroundPadding\n\t\t\tengine.tree.current(preset)?.set({\n\t\t\t\t[key]: { ...spreadablePadding, ...newTextBackgroundPadding },\n\t\t\t})\n\t\t},\n\t\t[preset, linkState],\n\t)\n\tconst onPresentBaseStateTextBackgroundColor = useEngineCallback(() => {\n\t\thandlePresent()\n\t\tengine.tree.current(preset)?.set({\n\t\t\tlinkTextBackgroundColor: preset.linkTextColor\n\t\t\t\t? textBackgroundColorFromTextColor(preset.linkTextColor)\n\t\t\t\t: BackgroundStyles.defaults.textBackgroundColor,\n\t\t})\n\t}, [handlePresent, preset])\n\n\tconst hasTextColor = isDefined(preset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextColor\")])\n\tconst hasTextDecoration = isDefined(preset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextDecoration\")])\n\tconst hasTextBackgroundColor = isDefined(\n\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundColor\")],\n\t)\n\tconst hasTextBackgroundRadius = isDefined(\n\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundRadius\")],\n\t)\n\tconst hasTextBackgroundCornerShape = isDefined(\n\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundCornerShape\")],\n\t)\n\tconst hasTextBackgroundPadding = isDefined(\n\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundPadding\")],\n\t)\n\n\treturn (\n\t\t<Panel header={!isBaseState ? <LinkStylePresetPanelHeader linkState={linkState} preset={preset} /> : undefined}>\n\t\t\t{(hasTextColor || isBaseState) && (\n\t\t\t\t<LinkStyleTextColor\n\t\t\t\t\tlinkState={linkState}\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tonPresent={handlePresent}\n\t\t\t\t\tonDismiss={handleDismiss}\n\t\t\t\t\tsupportsDelete={!isBaseState || hasTextColor}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{(hasTextDecoration || isBaseState) && (\n\t\t\t\t<LinkStyleTextDecoration\n\t\t\t\t\tlinkState={linkState}\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tonPresent={handlePresent}\n\t\t\t\t\tonDismiss={handleDismiss}\n\t\t\t\t\tsupportsDelete={!isBaseState || hasTextDecoration}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{(hasTextBackgroundColor || isBaseState) && (\n\t\t\t\t<TextBackgroundColorRow\n\t\t\t\t\tvalue={preset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundColor\")]}\n\t\t\t\t\tonChange={changeTextBackgroundColor}\n\t\t\t\t\tonPresent={isBaseState && !hasTextBackgroundColor ? onPresentBaseStateTextBackgroundColor : handlePresent}\n\t\t\t\t\tonDismiss={handleDismiss}\n\t\t\t\t\tsupportsDelete={!isBaseState || hasTextBackgroundColor}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<TextBackgroundCornerRows\n\t\t\t\ttextBackgroundRadius={\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundRadius\")] ??\n\t\t\t\t\t(isBaseState || hasTextBackgroundRadius ? BackgroundStyles.defaults.textBackgroundRadius : undefined)\n\t\t\t\t}\n\t\t\t\tonChangeTextBackgroundRadius={changeTextBackgroundRadius}\n\t\t\t\ttextBackgroundCornerShape={\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundCornerShape\")] ??\n\t\t\t\t\t(isBaseState || hasTextBackgroundCornerShape\n\t\t\t\t\t\t? BackgroundStyles.defaults.textBackgroundCornerShape\n\t\t\t\t\t\t: undefined)\n\t\t\t\t}\n\t\t\t\tonChangeTextBackgroundCornerShape={changeTextBackgroundCornerShape}\n\t\t\t\tsupportsDelete={!isBaseState}\n\t\t\t/>\n\t\t\t{(hasTextBackgroundPadding || isBaseState) && (\n\t\t\t\t<TextBackgroundPaddingRow\n\t\t\t\t\tvalue={\n\t\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundPadding\")] ??\n\t\t\t\t\t\tBackgroundStyles.defaults.textBackgroundPadding\n\t\t\t\t\t}\n\t\t\t\t\tonChange={changeTextBackgroundPadding}\n\t\t\t\t\tsupportsDelete={!isBaseState}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{isBaseState && <LinkStyleTransition preset={preset} />}\n\t\t</Panel>\n\t)\n}\n\nfunction LinkStylePresetPanelHeader({ linkState, preset }: LinkStylePresetPanelProps) {\n\tconst isViewOnly = useIsViewOnly(\"canDesign\")\n\tconst displayMenu = !isViewOnly\n\t\t? (event: React.MouseEvent) => {\n\t\t\t\tconst hasTextColor = isDefined(preset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextColor\")])\n\t\t\t\tconst hasTextDecoration = isDefined(preset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextDecoration\")])\n\t\t\t\tconst hasTextBackgroundColor = isDefined(\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundColor\")],\n\t\t\t\t)\n\t\t\t\tconst hasTextBackgroundRadius = isDefined(\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundRadius\")],\n\t\t\t\t)\n\t\t\t\tconst hasTextBackgroundCornerShape = isDefined(\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundCornerShape\")],\n\t\t\t\t)\n\t\t\t\tconst hasTextBackgroundPadding = isDefined(\n\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextBackgroundPadding\")],\n\t\t\t\t)\n\t\t\t\tconst isSquircleExperimentOn = experiments.isOn(\"squircle\")\n\t\t\t\tconst menuItems: MenuItemOptions[] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: Dictionary.Color,\n\t\t\t\t\t\tenabled: !hasTextColor,\n\t\t\t\t\t\tchecked: hasTextColor,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\taddPropertyToPreset(preset, getLinkStyleKeyPrefix(linkState), \"TextColor\", textStyleDefaults.textColor)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: Dictionary.Decoration,\n\t\t\t\t\t\tenabled: !hasTextDecoration,\n\t\t\t\t\t\tchecked: hasTextDecoration,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecoration\",\n\t\t\t\t\t\t\t\ttextDecorationAddedDefault,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecorationColor\",\n\t\t\t\t\t\t\t\ttextStyleDefaults.textDecorationColor,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecorationThickness\",\n\t\t\t\t\t\t\t\ttextStyleDefaults.textDecorationThickness,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecorationStyle\",\n\t\t\t\t\t\t\t\ttextStyleDefaults.textDecorationStyle,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecorationSkipInk\",\n\t\t\t\t\t\t\t\ttextStyleDefaults.textDecorationSkipInk,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextDecorationOffset\",\n\t\t\t\t\t\t\t\ttextStyleDefaults.textDecorationOffset,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: Dictionary.Fill,\n\t\t\t\t\t\tenabled: !hasTextBackgroundColor,\n\t\t\t\t\t\tchecked: hasTextBackgroundColor,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tconst textColor =\n\t\t\t\t\t\t\t\tpreset[getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextColor\")] ??\n\t\t\t\t\t\t\t\tpreset[getLinkStyleKey(\"link\", \"TextColor\")]\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextBackgroundColor\",\n\t\t\t\t\t\t\t\ttextColor ? textBackgroundColorFromTextColor(textColor) : BackgroundStyles.defaults.textBackgroundColor,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: Dictionary.Radius,\n\t\t\t\t\t\tenabled: !hasTextBackgroundRadius,\n\t\t\t\t\t\tchecked: hasTextBackgroundRadius,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextBackgroundRadius\",\n\t\t\t\t\t\t\t\tBackgroundStyles.defaults.textBackgroundRadius,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: cornerShapeTitle,\n\t\t\t\t\t\tvisible: isSquircleExperimentOn,\n\t\t\t\t\t\tenabled: !hasTextBackgroundCornerShape,\n\t\t\t\t\t\tchecked: hasTextBackgroundCornerShape,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tconst value = addPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextBackgroundCornerShape\",\n\t\t\t\t\t\t\t\tBackgroundStyles.defaults.textBackgroundCornerShape,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\trecordCornerShapeUpdate(preset, {\n\t\t\t\t\t\t\t\tvalue: value?.cornerShape ?? 1,\n\t\t\t\t\t\t\t\tisAddition: true,\n\t\t\t\t\t\t\t\tlinkState,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: Dictionary.Padding,\n\t\t\t\t\t\tenabled: !hasTextBackgroundPadding,\n\t\t\t\t\t\tchecked: hasTextBackgroundPadding,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\taddPropertyToPreset(\n\t\t\t\t\t\t\t\tpreset,\n\t\t\t\t\t\t\t\tgetLinkStyleKeyPrefix(linkState),\n\t\t\t\t\t\t\t\t\"TextBackgroundPadding\",\n\t\t\t\t\t\t\t\tBackgroundStyles.defaults.textBackgroundPadding,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t\tengine.stores.contextMenuStore.show(menuItems, { location: { x: event.clientX, y: event.clientY } })\n\t\t\t}\n\t\t: undefined\n\n\treturn (\n\t\t<PanelSectionHeader\n\t\t\ttitle={<T>{getTitleForState(linkState)}</T>}\n\t\t\tclickable={Boolean(displayMenu)}\n\t\t\tonMouseDown={displayMenu}\n\t\t>\n\t\t\t{displayMenu && (\n\t\t\t\t<PanelSectionHeaderButton>\n\t\t\t\t\t<IconSectionHeaderPlus />\n\t\t\t\t</PanelSectionHeaderButton>\n\t\t\t)}\n\t\t</PanelSectionHeader>\n\t)\n}\n\nfunction getTitleForState(state: LinkState) {\n\tswitch (state) {\n\t\tcase \"default\":\n\t\t\treturn \"Default\"\n\t\tcase \"hover\":\n\t\t\treturn \"Hover\"\n\t\tcase \"current\":\n\t\t\treturn \"Current\"\n\t\tdefault:\n\t\t\tassertNever(state)\n\t}\n}\n\n/**\n * Sets the target property to the base value if set, otherwise the fallback value.\n */\nfunction addPropertyToPreset<TPrefix extends LinkStyleKeyPrefix, TKey extends WithoutLinkPrefix<keyof WithLinkStyle>>(\n\tpreset: LinkStylePresetNode,\n\tprefix: TPrefix,\n\tkey: TKey,\n\tfallbackValue: WithLinkStyle[`${TPrefix}${TKey}`],\n): WithLinkStyle[`${TPrefix}${TKey}`] | NonNullable<LinkStylePresetNode[`link${TKey}`]> {\n\tconst baseValue = preset[getLinkStyleKey(\"link\", key)]\n\tconst value = baseValue ?? fallbackValue\n\tengine.tree.current(preset)?.set({ [getLinkStyleKey(prefix, key)]: value })\n\treturn value\n}\n\ninterface RowProps {\n\tlinkState: LinkState\n\tpreset: LinkStylePresetNode\n\tonPresent: () => void\n\tonDismiss: () => void\n\tsupportsDelete: boolean\n}\n\nfunction LinkStyleTextColor({ linkState, preset, onPresent, onDismiss, supportsDelete }: RowProps) {\n\tconst key = getLinkStyleKey(getLinkStyleKeyPrefix(linkState), \"TextColor\")\n\tconst textColor = preset[key]\n\n\tconst changeTextColor = engine.scheduler.wrapHandler((newTextColor: VariableReference | string) => {\n\t\tif (isVariableReference(newTextColor)) return\n\t\tengine.tree.current(preset)?.set({ [key]: newTextColor })\n\t})\n\n\tconst deleteTextColor = engine.scheduler.wrapHandler(() => {\n\t\tengine.tree.current(preset)?.set({ [key]: undefined })\n\t})\n\n\treturn (\n\t\t<TextColorRow\n\t\t\ttextColor={textColor}\n\t\t\tonChange={changeTextColor}\n\t\t\tonDelete={supportsDelete && textColor !== undefined ? deleteTextColor : undefined}\n\t\t\tonPresent={onPresent}\n\t\t\tonDismiss={onDismiss}\n\t\t/>\n\t)\n}\n\nfunction LinkStyleTextDecoration({ linkState, preset, onPresent, onDismiss, supportsDelete }: RowProps) {\n\tconst keyPrefix = getLinkStyleKeyPrefix(linkState)\n\tconst textDecoration = preset[getLinkStyleKey(keyPrefix, \"TextDecoration\")]\n\tconst textDecorationColor = preset[getLinkStyleKey(keyPrefix, \"TextDecorationColor\")]\n\tconst textDecorationThickness = getTextDecorationPropertyOrFallback(preset, keyPrefix, \"TextDecorationThickness\")\n\tconst textDecorationStyle = getTextDecorationPropertyOrFallback(preset, keyPrefix, \"TextDecorationStyle\")\n\tconst textDecorationSkipInk = getTextDecorationPropertyOrFallback(preset, keyPrefix, \"TextDecorationSkipInk\")\n\tconst textDecorationOffset = getTextDecorationPropertyOrFallback(preset, keyPrefix, \"TextDecorationOffset\")\n\n\tconst changeTextDecoration: React.ComponentProps<typeof TextDecorationRow>[\"onChange\"] = useEngineCallback(\n\t\tupdate => {\n\t\t\tif (\"textDecoration\" in update) {\n\t\t\t\tengine.tree.current(preset)?.set({ [getLinkStyleKey(keyPrefix, \"TextDecoration\")]: update.textDecoration })\n\t\t\t}\n\t\t\tif (\"textDecorationColor\" in update) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ [getLinkStyleKey(keyPrefix, \"TextDecorationColor\")]: update.textDecorationColor })\n\t\t\t}\n\t\t\tif (\"textDecorationThickness\" in update) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ [getLinkStyleKey(keyPrefix, \"TextDecorationThickness\")]: update.textDecorationThickness })\n\t\t\t}\n\t\t\tif (\"textDecorationStyle\" in update) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ [getLinkStyleKey(keyPrefix, \"TextDecorationStyle\")]: update.textDecorationStyle })\n\t\t\t}\n\t\t\tif (\"textDecorationSkipInk\" in update) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ [getLinkStyleKey(keyPrefix, \"TextDecorationSkipInk\")]: update.textDecorationSkipInk })\n\t\t\t}\n\t\t\tif (\"textDecorationOffset\" in update) {\n\t\t\t\tengine.tree\n\t\t\t\t\t.current(preset)\n\t\t\t\t\t?.set({ [getLinkStyleKey(keyPrefix, \"TextDecorationOffset\")]: update.textDecorationOffset })\n\t\t\t}\n\t\t},\n\t\t[preset, keyPrefix],\n\t)\n\n\treturn (\n\t\t<TextDecorationRow\n\t\t\ttextDecoration={textDecoration}\n\t\t\ttextDecorationColor={textDecorationColor}\n\t\t\ttextDecorationThickness={textDecorationThickness}\n\t\t\ttextDecorationStyle={textDecorationStyle}\n\t\t\ttextDecorationSkipInk={textDecorationSkipInk}\n\t\t\ttextDecorationOffset={textDecorationOffset}\n\t\t\tonPresent={onPresent}\n\t\t\tonDismiss={onDismiss}\n\t\t\tstylePresetType=\"link\"\n\t\t\tonChange={changeTextDecoration}\n\t\t\tdeleteEnabled={supportsDelete}\n\t\t/>\n\t)\n}\n\ntype TextDecorationWithoutLinkPrefix = WithoutLinkPrefix<\n\tExtract<keyof WithLinkStyle, `linkHoverTextDecoration${string}`>\n>\nfunction getTextDecorationPropertyOrFallback<TKey extends TextDecorationWithoutLinkPrefix>(\n\tpreset: WithLinkStyle,\n\tkeyPrefix: LinkStyleKeyPrefix,\n\tkeySuffix: TKey,\n): WithLinkStyle[`link${TKey}`] {\n\tconst fallbackDecoration = preset[getLinkStyleKey(\"link\", \"TextDecoration\")]\n\n\t// if the text decoration properties are not defined then they will fall back to the base style values *if* base text decoration is set\n\tconst canFallback = isDefined(fallbackDecoration) && fallbackDecoration !== \"none\"\n\n\t// we need a type assertion here to make typescript happy, but the types of link${TKey}, linkHover${TKey}, etc. are identical\n\tconst key = getLinkStyleKey(keyPrefix, keySuffix) as `link${TKey}`\n\n\tif (!canFallback) return preset[key]\n\n\treturn preset[key] ?? preset[getLinkStyleKey(\"link\", keySuffix)]\n}\n\nfunction LinkStyleTransition({ preset }: Props) {\n\tconst changeTransition = engine.scheduler.wrapHandler((newTransition?: Transition) => {\n\t\tengine.tree.current(preset)?.set({\n\t\t\tlinkTransition: newTransition\n\t\t\t\t? {\n\t\t\t\t\t\t...newTransition,\n\t\t\t\t\t\t// We only support tween effects for transitions because\n\t\t\t\t\t\t// we can apply them with CSS.\n\t\t\t\t\t\ttype: \"tween\",\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t})\n\t})\n\n\tconst deleteTransition = engine.scheduler.wrapHandler(\n\t\t(_event?: React.MouseEvent | React.KeyboardEvent | undefined) => {\n\t\t\tengine.tree.current(preset)?.set({ linkTransition: undefined })\n\t\t},\n\t)\n\n\treturn (\n\t\t<PanelRow title=\"Transition\" onDelete={changeTransition} deleteEnabled={Boolean(preset.linkTransition)}>\n\t\t\t{preset.linkTransition ? (\n\t\t\t\t<TransitionPopoutButton\n\t\t\t\t\ttitle=\"Transition\"\n\t\t\t\t\ttransition={preset.linkTransition}\n\t\t\t\t\tonChange={changeTransition}\n\t\t\t\t\tonDelete={deleteTransition}\n\t\t\t\t\tshowType={[]}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion\n\t\t\t\t\ttype=\"tween\"\n\t\t\t\t\tonClick={() => changeTransition(defaultDurationBasedSpringTransition)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n\nfunction setActiveLinkStyleState(preset: LinkStylePresetNode | undefined, state: LinkState | undefined) {\n\tengine.scheduler.processWhenReady(() => {\n\t\tengine.stores.propertiesPanelStore.activeLinkStyle =\n\t\t\tpreset?.id && state\n\t\t\t\t? {\n\t\t\t\t\t\tpresetNodeId: preset.id,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\t})\n}\n\nfunction getLinkStyleKeyPrefix(state: LinkState) {\n\tswitch (state) {\n\t\tcase \"default\":\n\t\t\treturn \"link\"\n\t\tcase \"hover\":\n\t\t\treturn \"linkHover\"\n\t\tcase \"current\":\n\t\t\treturn \"linkCurrent\"\n\t\tdefault:\n\t\t\tassertNever(state)\n\t}\n}\n", "import { NumberInputWithTicker, SegmentedControl, SegmentedControlItem, Slider, Stack } from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport { Mixed, assertNever, isMixed, unhandledError } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport engine from \"document/engine.ts\"\nimport { type Reduced, isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { getCommonEffectTransitionOrUndefined } from \"document/models/CanvasTree/traits/utils/effects.ts\"\nimport type { ReducedEffectTransition } from \"document/models/CanvasTree/traits/utils/reduceEffectTransition.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport {\n\tdefaultDurationBasedSpringTransition,\n\tfallbackPhysicsBasedSpringTransition,\n} from \"document/models/Transition.ts\"\nimport type { Tween } from \"framer-motion\"\nimport React, { useMemo } from \"react\"\nimport { Clipboard } from \"utils/clipboard/document.ts\"\nimport { isShallowArrayEqual, isShallowEqual } from \"utils/isShallowEqual.ts\"\nimport { isBoolean, isNumber, isUndefined } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"../../properties/rows/PanelRow.tsx\"\nimport { doubleColumn } from \"../../properties/utils/doubleColumn.ts\"\nimport { ButtonWithPreviewContent } from \"../ButtonWithPreviewContent.tsx\"\nimport { PopoutButton } from \"../PopoutButton.tsx\"\nimport { SpringEditor } from \"./SpringEditor.tsx\"\nimport { TransitionPreview } from \"./TransitionPreview.tsx\"\nimport { TransitionPreviewIcon } from \"./TransitionPreviewIcon.tsx\"\nimport { TweenEditor, easeDefinitions } from \"./TweenEditor.tsx\"\n\nconst defaultTransitionTypes: Transition[\"type\"][] = [\"tween\", \"spring\"]\nObject.freeze(defaultTransitionTypes)\n\ninterface Props {\n\ttitle: string\n\t/**\n\t * Optionally choose which transition types to show in the segmented control. Default to [\"tween\", \"spring\"].\n\t */\n\tshowType?: readonly Transition[\"type\"][]\n\ttransition: Reduced<ReducedEffectTransition | undefined>\n\twrapperStyle?: React.CSSProperties\n\tpopoutId?: string\n\tonChange: (transition: Transition) => void\n\tonDelete?: (event?: React.MouseEvent | React.KeyboardEvent | undefined) => void\n\tshowDelay?: boolean\n\tshowStagger?: boolean\n\tdisplayInPopover?: boolean\n}\n\nconst stopPropagation = (event: React.MouseEvent<unknown>) => event.stopPropagation()\n\nexport function TransitionPopoutButton({\n\ttransition: reducedTransition,\n\ttitle,\n\tonChange,\n\tonDelete,\n\twrapperStyle,\n\tshowType = defaultTransitionTypes,\n\tpopoutId,\n\tshowDelay,\n\tshowStagger,\n\tdisplayInPopover = false,\n}: Props) {\n\t// we need the reduced transition, a transition without mixed and not found values,\n\tlet transition = toSafeTransition(reducedTransition)\n\tconst isMultiple =\n\t\tisMixed(reducedTransition) || isMixed(reducedTransitionOrFallback(reducedTransition, transition).type)\n\n\t// memoize transition\n\tconst lastTransition = React.useRef(transition)\n\tif (isShallowEqual(lastTransition.current, transition)) {\n\t\ttransition = lastTransition.current\n\t} else {\n\t\tlastTransition.current = transition\n\t}\n\n\tconst ease = isMixed(reducedTransition) ? Mixed : reducedTransitionOrFallback(reducedTransition, transition).ease\n\tconst label = useMemo(() => {\n\t\tif (isMultiple) return Dictionary.Mixed\n\n\t\tswitch (transition.type) {\n\t\t\tcase \"tween\": {\n\t\t\t\tif (isMixed(ease)) {\n\t\t\t\t\treturn \"Mixed Ease\"\n\t\t\t\t}\n\n\t\t\t\tif (Array.isArray(ease)) {\n\t\t\t\t\tconst preset = easeDefinitions.find(({ curve }) => isShallowArrayEqual(curve, ease))\n\n\t\t\t\t\tif (preset) {\n\t\t\t\t\t\treturn preset.name\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn \"Ease\"\n\t\t\t}\n\t\t\tcase false:\n\t\t\t\treturn \"Instant\"\n\t\t\tcase \"spring\":\n\t\t\tcase \"inertia\":\n\t\t\t\treturn \"Spring\"\n\t\t\tdefault:\n\t\t\t\tassertNever(transition.type)\n\t\t}\n\t}, [isMultiple, transition.type, ease])\n\n\tconst displayContextMenu = async (event: React.MouseEvent) => {\n\t\tconst location = { x: event.clientX, y: event.clientY }\n\t\tconst clipboardTransition = await Clipboard.getAnimationTransition()\n\t\tconst items: MenuItemOptions[] = [\n\t\t\t{\n\t\t\t\tlabel: \"Copy\",\n\t\t\t\tclick: () => Clipboard.copyAnimationTransition(transition).catch(unhandledError),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Paste\",\n\t\t\t\tenabled: !!clipboardTransition,\n\t\t\t\tclick: () => clipboardTransition && onChange(getCompatibleTransition(clipboardTransition, transition)),\n\t\t\t},\n\t\t]\n\t\tengine.stores.contextMenuStore.show(items, { location })\n\t}\n\n\treturn (\n\t\t<div style={wrapperStyle || doubleColumn}>\n\t\t\t<PopoutButton\n\t\t\t\tid={popoutId}\n\t\t\t\tpopout={\n\t\t\t\t\t<TransitionPopout\n\t\t\t\t\t\tvalue={reducedTransitionOrFallback(reducedTransition, transition)}\n\t\t\t\t\t\tfallbackTransition={transition}\n\t\t\t\t\t\tshowType={showType}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\tshowDelay={showDelay}\n\t\t\t\t\t\tshowStagger={showStagger}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tnavigationTitle={title}\n\t\t\t\tdisplayDivider={showType?.length === 0}\n\t\t\t\tdisplayInPopover={displayInPopover}\n\t\t\t\tonContextMenu={displayContextMenu}\n\t\t\t\tstyle={{ width: \"100%\" }}\n\t\t\t>\n\t\t\t\t<ButtonWithPreviewContent\n\t\t\t\t\ttitle={label}\n\t\t\t\t\tpreview={<TransitionPreviewIcon isMultiple={isMultiple} transition={transition} />}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t</PopoutButton>\n\t\t</div>\n\t)\n}\n\n/**\n * Converts a reduced transition into a Transition that can be used in various cases where we cannot handle mixed values, such as for actions.\n */\nfunction toSafeTransition(reducedTransition: Reduced<ReducedEffectTransition | undefined>): Transition {\n\treturn getCommonEffectTransitionOrUndefined(reducedTransition) ?? fallbackPhysicsBasedSpringTransition\n}\n\nfunction reducedTransitionOrFallback(\n\treducedTransition: Reduced<ReducedEffectTransition | undefined>,\n\tfallback: ReducedEffectTransition,\n): ReducedEffectTransition {\n\tif (isMixed(reducedTransition)) return fallback\n\tif (isNotFound(reducedTransition)) return fallback\n\tif (isUndefined(reducedTransition)) return fallback\n\n\treturn reducedTransition\n}\n\nfunction getCompatibleTransition(transition: Transition, currentTransition: Transition): Transition {\n\t// inertia transitions should stay as inertia\n\tif (currentTransition.type === \"inertia\") {\n\t\treturn { ...transition, type: \"inertia\" }\n\t}\n\n\t// pasting an inertia transition onto a non-inertia transition should turn it into a spring\n\tif (transition.type === \"inertia\") {\n\t\treturn { ...transition, type: \"spring\" }\n\t}\n\n\treturn transition\n}\n\ninterface TransitionPopoutProps {\n\tvalue: ReducedEffectTransition\n\tfallbackTransition: Transition\n\tshowType: readonly Transition[\"type\"][]\n\tonChange: (transition: Transition) => void\n\tshowDelay?: boolean\n\tshowStagger?: boolean\n}\n\nfunction isSpringTransition(transition: Transition): transition is Transition & { type: \"spring\" | \"inertia\" } {\n\treturn transition.type === \"spring\" || transition.type === \"inertia\"\n}\n\nfunction isEasingTransition(transition: Transition): transition is Transition & Tween {\n\treturn transition.type === \"tween\"\n}\n\nconst transitionTypes: Transition[\"type\"][] = [false, \"tween\", \"spring\", \"inertia\"]\n\nconst TransitionPopout = React.memo(function TransitionPopout({\n\tvalue: reducedTransition,\n\tfallbackTransition,\n\tonChange,\n\tshowType,\n\tshowDelay = true,\n\tshowStagger = false,\n}: TransitionPopoutProps) {\n\tconst onPartialUpdate = (update: Partial<Transition>) => {\n\t\tonChange({ ...fallbackTransition, ...update })\n\t}\n\n\tconst onTypeChange = (type: Transition[\"type\"] | false) => {\n\t\tconst update: Partial<Transition> = { type }\n\t\t// Set it to duration-based spring the very first time user switches to a spring transition.\n\t\tif (type === \"spring\") {\n\t\t\tupdate.durationBasedSpring = isBoolean(reducedTransition.durationBasedSpring)\n\t\t\t\t? reducedTransition.durationBasedSpring\n\t\t\t\t: defaultDurationBasedSpringTransition.durationBasedSpring\n\t\t\tupdate.bounce = isNumber(reducedTransition.bounce)\n\t\t\t\t? reducedTransition.bounce\n\t\t\t\t: defaultDurationBasedSpringTransition.bounce\n\t\t}\n\t\tonPartialUpdate(update)\n\t}\n\n\tconst onDelayChange = (delay: number) => {\n\t\tonPartialUpdate({ delay })\n\t}\n\n\tconst onStaggerChange = (stagger: number) => {\n\t\tonPartialUpdate({ stagger })\n\t}\n\n\tconst types = transitionTypes.filter(type => showType.includes(type))\n\n\tconst staggerValue = reducedTransition.stagger ?? fallbackTransition.stagger ?? 0\n\n\treturn (\n\t\t<>\n\t\t\t{showType.length > 1 && (\n\t\t\t\t<Stack paddingLeft={dimensions.css.popoverPadding} paddingRight={dimensions.css.popoverPadding}>\n\t\t\t\t\t<SegmentedControl\n\t\t\t\t\t\tstyle={doubleColumn}\n\t\t\t\t\t\tonMouseDown={stopPropagation} // We block propagation to block action cards from becoming focused\n\t\t\t\t\t>\n\t\t\t\t\t\t{types.map(type => {\n\t\t\t\t\t\t\tconst title = getTitleForTransitionType(type)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\t\tkey={type === false ? \"instant\" : type}\n\t\t\t\t\t\t\t\t\tidentifier={type}\n\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\tselected={fallbackTransition.type === type}\n\t\t\t\t\t\t\t\t\tonSelect={onTypeChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tpaddingTop: `calc(${dimensions.css.inputSpacing} / 2)`,\n\t\t\t\t\tpaddingBottom: dimensions.css.inputSpacing,\n\t\t\t\t\tpaddingLeft: dimensions.css.popoverPadding,\n\t\t\t\t\tpaddingRight: dimensions.css.popoverPadding,\n\t\t\t\t\tbackground: colors.panelBackground,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{isEasingTransition(fallbackTransition) && (\n\t\t\t\t\t<TweenEditor\n\t\t\t\t\t\ttransition={reducedTransition}\n\t\t\t\t\t\tfallbackTransition={fallbackTransition}\n\t\t\t\t\t\tonChange={onPartialUpdate}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{isSpringTransition(fallbackTransition) && (\n\t\t\t\t\t<SpringEditor\n\t\t\t\t\t\ttransition={reducedTransition}\n\t\t\t\t\t\tfallbackTransition={fallbackTransition}\n\t\t\t\t\t\tonChange={onPartialUpdate}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{fallbackTransition.type !== false && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{showDelay && (\n\t\t\t\t\t\t\t<PanelRow title={Dictionary.Delay}>\n\t\t\t\t\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\t\t\t\t\tvalue={reducedTransition.delay}\n\t\t\t\t\t\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.delay}\n\t\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\t\tonChange={onDelayChange}\n\t\t\t\t\t\t\t\t\tstep={0.1}\n\t\t\t\t\t\t\t\t\tlabel=\"S\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Slider value={reducedTransition.delay} min={0} max={10} step={0.1} onChange={onDelayChange} />\n\t\t\t\t\t\t\t</PanelRow>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showStagger && (\n\t\t\t\t\t\t\t<PanelRow title={Dictionary.Stagger}>\n\t\t\t\t\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\t\t\t\t\tvalue={staggerValue}\n\t\t\t\t\t\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.stagger}\n\t\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\t\tonChange={onStaggerChange}\n\t\t\t\t\t\t\t\t\tstep={0.1}\n\t\t\t\t\t\t\t\t\tlabel=\"S\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Slider value={staggerValue} min={0} max={10} step={0.1} onChange={onStaggerChange} />\n\t\t\t\t\t\t\t</PanelRow>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<TransitionPreview transition={reducedTransition} />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t)\n})\n\nfunction getTitleForTransitionType(type: Transition[\"type\"]) {\n\tswitch (type) {\n\t\tcase false:\n\t\t\treturn \"Instant\"\n\t\tcase \"tween\":\n\t\t\treturn \"Ease\"\n\t\tcase \"spring\":\n\t\tcase \"inertia\":\n\t\t\treturn \"Spring\"\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n", "import { NumberInputWithTicker, Slider } from \"@framerjs/fresco\"\nimport { type Mixed, isMixed } from \"@framerjs/shared\"\nimport type { ReducedEffectTransition } from \"document/models/CanvasTree/traits/utils/reduceEffectTransition.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { defaultDurationBasedSpringTransition } from \"document/models/Transition.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"../../properties/rows/PanelRow.tsx\"\n\ninterface Props {\n\tduration: ReducedEffectTransition[\"duration\"]\n\tonChange: (update: Partial<Transition>) => void\n\tmax?: number\n}\n\nexport const DurationRow = ({ duration, onChange, max }: Props) => {\n\tconst onDurationChange = (newDuration: number) => {\n\t\tonChange({ duration: newDuration })\n\t}\n\n\tconst resolvedDuration = clampDuration(duration, max)\n\treturn (\n\t\t<PanelRow title=\"Time\">\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={resolvedDuration}\n\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.duration}\n\t\t\t\tonChange={onDurationChange}\n\t\t\t\tmin={0}\n\t\t\t\tmax={max}\n\t\t\t\tstep={0.1}\n\t\t\t\tlabel=\"S\"\n\t\t\t/>\n\t\t\t<Slider value={resolvedDuration} min={0} max={10} step={0.1} onChange={onDurationChange} />\n\t\t</PanelRow>\n\t)\n}\n\nfunction clampDuration(duration: number | Mixed, max: number | undefined): number | undefined {\n\tif (isMixed(duration)) return undefined\n\tif (isNumber(max)) return Math.min(duration, max)\n\n\treturn duration\n}\n", "import { assert, assertNever } from \"@framerjs/shared\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { secondsToMilliseconds } from \"document/models/Transition.ts\"\nimport { spring } from \"framer-motion\"\nimport React from \"react\"\n\ninterface Props {\n\ttransition: Transition & { type: \"spring\" | \"inertia\" }\n}\n\nconst height = 100\nconst width = 209\nconst margin = 10\n\nexport function SpringVisualiser({ transition }: Props) {\n\tconst { damping, stiffness, mass, duration, bounce } = getTransitionValues(transition)\n\tconst springResolver = React.useMemo(\n\t\t() =>\n\t\t\tspring({\n\t\t\t\tdamping,\n\t\t\t\tstiffness,\n\t\t\t\tmass,\n\t\t\t\tduration,\n\t\t\t\tbounce,\n\t\t\t\tkeyframes: [0, 1],\n\t\t\t\trestSpeed: 0.05,\n\t\t\t\trestDelta: 0.001,\n\t\t\t}),\n\t\t[damping, stiffness, mass, duration, bounce],\n\t)\n\n\tlet curveLine = `M${margin} ${margin + height}`\n\n\tconst step = getSamplingStep(transition)\n\tfor (let i = 0; i <= width; i++) {\n\t\tconst t = i * step\n\t\tcurveLine += `L${margin + i} ${margin + (height - springResolver.next(t).value * (height / 2))}`\n\t}\n\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width={width + margin * 2} height={height + margin * 2}>\n\t\t\t<path\n\t\t\t\td={curveLine}\n\t\t\t\tfill=\"transparent\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\tstroke=\"#AAAAAA\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t></path>\n\t\t</svg>\n\t)\n}\n\nfunction getSamplingStep(transition: Transition) {\n\t// For a duration-based spring animation, adjust the curve to span the entire width of the viewport,\n\t// so that it aligns with the total animation duration.\n\tif (transition.type === \"spring\" && transition.durationBasedSpring) {\n\t\tassert(transition.duration !== undefined, \"Duration must be defined when using a duration-based spring\")\n\t\treturn secondsToMilliseconds(transition.duration) / width\n\t}\n\n\treturn 1500 / width\n}\n\nfunction getTransitionValues(transition: Transition & { type: \"spring\" | \"inertia\" }) {\n\tconst { type } = transition\n\tswitch (type) {\n\t\tcase \"spring\": {\n\t\t\tif (transition.durationBasedSpring) {\n\t\t\t\treturn {\n\t\t\t\t\tduration: secondsToMilliseconds(transition.duration),\n\t\t\t\t\tbounce: transition.bounce,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstiffness: transition.stiffness,\n\t\t\t\tdamping: transition.damping,\n\t\t\t\tmass: transition.mass,\n\t\t\t}\n\t\t}\n\t\tcase \"inertia\": {\n\t\t\treturn {\n\t\t\t\tstiffness: transition.stiffness,\n\t\t\t\tdamping: transition.damping,\n\t\t\t\tmass: 1,\n\t\t\t}\n\t\t}\n\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n", "import { NumberInputWithTicker, SegmentedControl, SegmentedControlItem, Slider } from \"@framerjs/fresco\"\nimport { colors, dimensions } from \"@framerjs/fresco/tokens\"\nimport { assert, assertNever } from \"@framerjs/shared\"\nimport type { ReducedEffectTransition } from \"document/models/CanvasTree/traits/utils/reduceEffectTransition.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { defaultDurationBasedSpringTransition } from \"document/models/Transition.ts\"\nimport { isNumber, isUndefined } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"../../properties/rows/PanelRow.tsx\"\nimport { doubleColumnClass } from \"../../properties/utils/doubleColumn.styles.ts\"\nimport { DurationRow } from \"./DurationRow.tsx\"\nimport { SpringVisualiser } from \"./SpringVisualiser.tsx\"\n\ninterface Props {\n\ttransition: ReducedEffectTransition\n\tfallbackTransition: Transition & { type: \"spring\" | \"inertia\" }\n\tonChange: (update: Partial<Transition>) => void\n}\n\nexport function SpringEditor({ transition, fallbackTransition, onChange }: Props) {\n\treturn (\n\t\t<>\n\t\t\t<div style={springEditorContainerStyles}>\n\t\t\t\t<SpringVisualiser transition={fallbackTransition} />\n\t\t\t</div>\n\t\t\t{transition.type === \"spring\" && (\n\t\t\t\t<SpringTypeRow\n\t\t\t\t\tdurationBasedSpring={transition.durationBasedSpring}\n\t\t\t\t\tbounce={transition.bounce}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{renderSpringControlRows(transition, fallbackTransition, onChange)}\n\t\t</>\n\t)\n}\n\nfunction renderSpringControlRows(\n\ttransition: ReducedEffectTransition,\n\tfallbackTransition: Transition & { type: \"spring\" | \"inertia\" },\n\tonChange: (update: Partial<Transition>) => void,\n) {\n\t// we use the fallback values here to ensure the transitions are still easily updateable even when type or durationBasedSpring are Mixed\n\tconst type = fallbackTransition.type\n\tconst isDurationBasedSpring = type === \"spring\" && fallbackTransition.durationBasedSpring\n\tassert(type === \"spring\" || type === \"inertia\", \"Invalid spring type:\", type)\n\n\tif (isDurationBasedSpring) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<DurationRow duration={transition.duration} onChange={onChange} max={10} />\n\t\t\t\t<BounceRow bounce={transition.bounce} onChange={onChange} />\n\t\t\t</>\n\t\t)\n\t}\n\tswitch (type) {\n\t\tcase \"spring\":\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<StiffnessRow stiffness={transition.stiffness} onChange={onChange} />\n\t\t\t\t\t<DampingRow damping={transition.damping} onChange={onChange} />\n\t\t\t\t\t<MassRow mass={transition.mass} onChange={onChange} />\n\t\t\t\t</>\n\t\t\t)\n\t\tcase \"inertia\":\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<StiffnessRow stiffness={transition.stiffness} onChange={onChange} />\n\t\t\t\t\t<DampingRow damping={transition.damping} onChange={onChange} />\n\t\t\t\t</>\n\t\t\t)\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n\nconst springEditorContainerStyles = {\n\tbackground: colors.inputBackground,\n\tborderRadius: dimensions.css.inputRadius,\n\tmarginTop: 5,\n\tmarginBottom: 5,\n}\n\ntype RowProps<T extends keyof Transition> = Pick<Props, \"onChange\"> & Pick<ReducedEffectTransition, T>\n\nconst SpringTypeRow = ({ durationBasedSpring, bounce, onChange }: RowProps<\"durationBasedSpring\" | \"bounce\">) => {\n\tconst onChangeType = (newDurationBasedSpring: boolean) => {\n\t\tconst defaultBounce = newDurationBasedSpring ? defaultDurationBasedSpringTransition.bounce : undefined\n\t\tonChange({\n\t\t\tdurationBasedSpring: newDurationBasedSpring,\n\t\t\t// bounce is default to undefined. Set a default bounce value when switching to duration-based spring for\n\t\t\t// the first time.\n\t\t\tbounce: isNumber(bounce) ? bounce : defaultBounce,\n\t\t})\n\t}\n\n\treturn (\n\t\t<PanelRow title=\"Based On\">\n\t\t\t<SegmentedControl className={doubleColumnClass}>\n\t\t\t\t<SegmentedControlItem\n\t\t\t\t\tkey=\"duration-based-spring\"\n\t\t\t\t\tidentifier={true}\n\t\t\t\t\ttitle=\"Time\"\n\t\t\t\t\tselected={durationBasedSpring === true}\n\t\t\t\t\tonSelect={onChangeType}\n\t\t\t\t/>\n\t\t\t\t<SegmentedControlItem\n\t\t\t\t\tkey=\"spring\"\n\t\t\t\t\tidentifier={false}\n\t\t\t\t\ttitle=\"Physics\"\n\t\t\t\t\tselected={durationBasedSpring !== true}\n\t\t\t\t\tonSelect={onChangeType}\n\t\t\t\t/>\n\t\t\t</SegmentedControl>\n\t\t</PanelRow>\n\t)\n}\n\nconst StiffnessRow = ({ stiffness, onChange }: RowProps<\"stiffness\">) => {\n\tconst onStiffnessChange = (newStiffness: number) => onChange({ stiffness: newStiffness })\n\n\treturn (\n\t\t<PanelRow title=\"Stiffness\">\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={stiffness}\n\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.stiffness}\n\t\t\t\tonChange={onStiffnessChange}\n\t\t\t\tstep={1}\n\t\t\t\tmin={1}\n\t\t\t/>\n\t\t\t<Slider value={stiffness} min={1} max={1000} onChange={onStiffnessChange} />\n\t\t</PanelRow>\n\t)\n}\n\nconst DampingRow = ({ damping, onChange }: RowProps<\"damping\">) => {\n\tconst onDampingChange = (newDamping: number) => onChange({ damping: newDamping })\n\n\treturn (\n\t\t<PanelRow title=\"Damping\">\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={damping}\n\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.damping}\n\t\t\t\tonChange={onDampingChange}\n\t\t\t\tstep={1}\n\t\t\t\tmin={0}\n\t\t\t/>\n\t\t\t<Slider value={damping} min={0} max={100} onChange={onDampingChange} />\n\t\t</PanelRow>\n\t)\n}\n\nconst MassRow = ({ mass, onChange }: RowProps<\"mass\">) => {\n\tconst onMassChange = (newMass: number) => onChange({ mass: newMass })\n\n\treturn (\n\t\t<PanelRow title=\"Mass\">\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={mass}\n\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.mass}\n\t\t\t\tonChange={onMassChange}\n\t\t\t\tstep={0.1}\n\t\t\t\tmin={0.1}\n\t\t\t/>\n\t\t\t<Slider value={mass} min={0.1} max={10} step={0.1} onChange={onMassChange} />\n\t\t</PanelRow>\n\t)\n}\n\nconst BounceRow = ({ bounce, onChange }: RowProps<\"bounce\">) => {\n\tconst onBounceChange = (newBounce: number) => onChange({ bounce: newBounce })\n\t// bounce is optional, and ideally you should never see it in the UI as we try to assign a default value when you\n\t// switch to duration-based spring for the first time. But if it's not set, use 0 as the default.\n\treturn (\n\t\t<PanelRow title=\"Bounce\">\n\t\t\t<NumberInputWithTicker\n\t\t\t\tvalue={isUndefined(bounce) ? 0 : bounce}\n\t\t\t\tdefaultValue={defaultDurationBasedSpringTransition.bounce}\n\t\t\t\tonChange={onBounceChange}\n\t\t\t\tstep={0.1}\n\t\t\t\tmin={0}\n\t\t\t\tmax={1}\n\t\t\t/>\n\t\t\t<Slider value={bounce} step={0.1} min={0} max={1} onChange={onBounceChange} />\n\t\t</PanelRow>\n\t)\n}\n", "import { Stack } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport type { ReducedEffectTransition } from \"document/models/CanvasTree/traits/utils/reduceEffectTransition.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { toMotionTransition } from \"document/models/Transition.ts\"\nimport type { Transition as MotionTransition } from \"framer-motion\"\nimport { motion } from \"framer-motion\"\nimport { debounce } from \"library/render/utils/debounce.ts\"\nimport React, { useCallback, useMemo, useRef, useState } from \"react\"\nimport { PanelRow } from \"../../properties/rows/PanelRow.tsx\"\nimport * as styles from \"./TransitionPreview.styles.ts\"\n\ninterface Props {\n\ttransition: ReducedEffectTransition\n}\n\nfunction transitionForPreview(transition: Transition): MotionTransition {\n\tif (transition.type === \"inertia\") {\n\t\treturn { ...transition, type: \"spring\" }\n\t}\n\n\treturn toMotionTransition(transition)\n}\n\nexport function TransitionPreview({ transition }: Props) {\n\tconst [justify, setJustify] = useState<\"flex-start\" | \"flex-end\">(\"flex-start\")\n\tconst transitionInstantly = useRef(false)\n\n\tconst animateInstantly = useCallback(() => {\n\t\ttransitionInstantly.current = true\n\t\tsetJustify(\"flex-start\")\n\t}, [])\n\n\tconst positionRight = useCallback(() => {\n\t\tsetJustify(\"flex-end\")\n\t}, [])\n\n\tconst positionRightNextFrame = useMemo(() => {\n\t\t// We need to wait for the next frame to make sure Motion detects the change\n\t\treturn debounce(positionRight, 32)\n\t}, [positionRight])\n\n\tconst positionRightIn1Sec = useMemo(() => {\n\t\treturn debounce(positionRight, 1000)\n\t}, [positionRight])\n\n\tReact.useEffect(() => {\n\t\tsetJustify(\"flex-start\")\n\t}, [transition])\n\n\tReact.useEffect(() => {\n\t\tif (justify === \"flex-end\") return\n\n\t\tif (transitionInstantly.current) {\n\t\t\tpositionRightNextFrame()\n\t\t\ttransitionInstantly.current = false\n\t\t} else {\n\t\t\tpositionRightIn1Sec()\n\t\t}\n\t}, [positionRightIn1Sec, positionRightNextFrame, justify])\n\n\tif (!hasNoMixedValues(transition)) {\n\t\treturn null\n\t}\n\n\tconst previewTransition = justify === \"flex-start\" ? ({ type: false } as const) : transitionForPreview(transition)\n\n\treturn (\n\t\t<div onClick={animateInstantly} className={styles.row}>\n\t\t\t<PanelRow title=\"Preview\">\n\t\t\t\t<div className={styles.column}>\n\t\t\t\t\t<Stack direction=\"row\" justifyContent={justify} className={styles.container}>\n\t\t\t\t\t\t<motion.div layout layoutDependency={justify} className={styles.indicator} transition={previewTransition} />\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t</PanelRow>\n\t\t</div>\n\t)\n}\n\nfunction hasNoMixedValues(transition: ReducedEffectTransition): transition is Transition {\n\treturn (\n\t\t!isMixed(transition.type) &&\n\t\t!isMixed(transition.ease) &&\n\t\t!isMixed(transition.duration) &&\n\t\t!isMixed(transition.delay) &&\n\t\t!isMixed(transition.stiffness) &&\n\t\t!isMixed(transition.damping) &&\n\t\t!isMixed(transition.mass) &&\n\t\t!isMixed(transition.bounce) &&\n\t\t!isMixed(transition.durationBasedSpring)\n\t)\n}\n", "import \"TransitionPreview.styles_1g8r5t7.wyw.css\"; import { cx } from \"@linaria/core\";\nimport { doubleColumnClass } from \"../../properties/utils/doubleColumn.styles.ts\";\nexport const row = \"row_rmc96io\";\nexport const container = \"container_c16pf4k4\";\nexport const indicator = \"indicator_i1g978sq\";\nexport const column = cx(doubleColumnClass, \"column_c1tuur6z\");", "import { cubicBezier } from \"framer-motion\"\nimport React from \"react\"\n\ninterface Props extends React.SVGProps<SVGPathElement> {\n\tcurve: [number, number, number, number]\n\tsize: number\n\teasing?: (v: number) => number\n}\n\nexport function BezierCurve({ curve, size, easing, ...props }: Props) {\n\tconst d = React.useMemo(() => {\n\t\tconst ease = easing || cubicBezier(...curve)\n\t\tlet pathDefinition = `M0 ${size}`\n\n\t\tfor (let i = 0; i <= size; i++) {\n\t\t\tconst t = i / size\n\t\t\tpathDefinition += `L${t * size} ${size - ease(t) * size}`\n\t\t}\n\n\t\treturn pathDefinition\n\t}, [curve, easing, size])\n\n\treturn <path d={d} {...props} />\n}\n", "import \"TransitionPreviewIcon.styles_w6fjj5.wyw.css\"; export const container = \"container_c1d8xz78\";", "import type { Tween, ValueTransition } from \"framer-motion\"\nimport type React from \"react\"\ninterface None {\n\ttype: false\n}\nimport { IconThunderbolt } from \"@framerjs/fresco\"\nimport { BezierCurve } from \"./BezierCurve.tsx\"\nimport * as styles from \"./TransitionPreviewIcon.styles.ts\"\n\ninterface Props {\n\ttransition: ValueTransition\n\tisMultiple: boolean\n}\n\nconst size = 12\n\nconst pathStyles: Partial<React.SVGProps<SVGPathElement>> = {\n\tfill: \"transparent\",\n\tstrokeWidth: \"1.5\",\n\tstroke: \"#FFFFFF\",\n\tstrokeLinecap: \"round\",\n}\n\nfunction isTween(transition: ValueTransition): transition is Tween {\n\treturn transition.type === \"tween\"\n}\n\nfunction isInstant(transition: ValueTransition): transition is None {\n\treturn transition.type === false\n}\n\nexport function TransitionPreviewIcon({ transition, isMultiple }: Props) {\n\tlet icon: JSX.Element\n\n\tif (isMultiple) {\n\t\ticon = (\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n\t\t\t\t<path\n\t\t\t\t\tfill=\"#fff\"\n\t\t\t\t\td=\"M9 7.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm4.5 0a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm-9 0a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t)\n\t} else if (isTween(transition)) {\n\t\ticon = (\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n\t\t\t\t<BezierCurve\n\t\t\t\t\tcurve={transition.ease as [number, number, number, number]}\n\t\t\t\t\tsize={size}\n\t\t\t\t\t{...pathStyles}\n\t\t\t\t\ttransform=\"translate(3 3)\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t)\n\t} else if (isInstant(transition)) {\n\t\ticon = <IconThunderbolt />\n\t} else {\n\t\ticon = (\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M 3 15 C 3 15 4.375 6.5 7 6.5 C 9.25 6.5 8.75 10.5 10.5 10.5 C 11.937 10.5 12.437 8 14 8 C 15 8 16 9 16 9\"\n\t\t\t\t\t{...pathStyles}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t)\n\t}\n\n\treturn <div className={styles.container}>{icon}</div>\n}\n", "import { colors } from \"@framerjs/fresco/tokens\"\nimport engine from \"document/engine.ts\"\nimport type { MotionProps, PanInfo, Point } from \"framer-motion\"\nimport { motion, useDragControls } from \"framer-motion\"\nimport type React from \"react\"\nimport { useRef } from \"react\"\nimport { isFourNumberList } from \"utils/isFourNumberList.ts\"\nimport { BezierCurve } from \"./BezierCurve.tsx\"\n\ninterface Props {\n\tcurve: [number, number, number, number]\n\tonChange: (curve: [number, number, number, number]) => void\n}\n\nconst margin = 20\nexport const bezierEditorWidth = 134\nexport const bezierEditorInnerWidth = bezierEditorWidth - 2 * margin\nconst radius = 7\nconst handleTargetPadding = 20\n\nconst Tether = (props: React.SVGProps<SVGPathElement>) => (\n\t<path fill=\"transparent\" strokeWidth=\"2\" stroke={colors.tint} strokeLinecap=\"round\" {...props} />\n)\n\nconst RootHandle = ({ cx, cy, ...props }: React.SVGProps<SVGCircleElement> & { cx: number; cy: number }) => (\n\t<>\n\t\t<circle r={radius} cx={cx} cy={cy} fill=\"#aaa\" />\n\t\t<circle r={radius + handleTargetPadding} cx={cx} cy={cy} fill=\"rgba(0,0,0,0)\" {...props} />\n\t</>\n)\n\nconst EditHandle = ({ cx, cy, ...props }: MotionProps & { cx: number; cy: number }) => (\n\t<>\n\t\t<circle r={radius} cx={cx} cy={cy} fill={colors.tint} />\n\t\t<motion.circle\n\t\t\tdrag\n\t\t\tdragConstraints={manualMotionConstraints}\n\t\t\tdragElastic={0}\n\t\t\tr={radius + handleTargetPadding}\n\t\t\tfill=\"rgba(0,0,0,0)\"\n\t\t\tcx={cx}\n\t\t\tcy={cy}\n\t\t\t{...props}\n\t\t/>\n\t</>\n)\n\nexport function BezierCurveEditor({ curve, onChange }: Props) {\n\tconst initialHandlePoint = useRef({ x: 0, y: 0 })\n\tconst dragPoint1Controls = useDragControls()\n\tconst dragPoint2Controls = useDragControls()\n\tconst [x1, y1, x2, y2] = curve\n\n\tconst dragDirection = useRef<\"x\" | \"y\" | undefined>(undefined)\n\n\tfunction validatedOnChange(newCurve: number[]) {\n\t\tconst validCurve = newCurve.map(validCurveValues)\n\t\tconst [vx1, vy1, vx2, vy2] = validCurve\n\t\tif (x1 !== vx1 || y1 !== vy1 || x2 !== vx2 || y2 !== vy2) {\n\t\t\tif (isFourNumberList(validCurve)) {\n\t\t\t\t// Motion calls onDrag during react rendering which will crash\n\t\t\t\t// the engine. We need the engine to wait until rendering\n\t\t\t\t// finishes before committing the changes.\n\t\t\t\tengine.scheduler.processWhenReady(() => onChange(validCurve))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst createDragHandler =\n\t\t({ isDragStart, isFirstPoint }: { isDragStart: boolean; isFirstPoint: boolean }) =>\n\t\t(dragEvent: MouseEvent | TouchEvent | PointerEvent, { offset }: PanInfo) => {\n\t\t\tif (isDragStart) {\n\t\t\t\tinitialHandlePoint.current = { x: isFirstPoint ? x1 : x2, y: isFirstPoint ? y1 : y2 }\n\t\t\t}\n\t\t\tif (dragDirection.current === undefined) {\n\t\t\t\tdragDirection.current = Math.abs(offset.x) > Math.abs(offset.y) ? \"x\" : \"y\"\n\t\t\t}\n\t\t\tconst newPoint = calculateNewPoint(\n\t\t\t\tinitialHandlePoint.current,\n\t\t\t\toffset,\n\t\t\t\tdragEvent.shiftKey ? dragDirection.current : undefined,\n\t\t\t)\n\t\t\tconst newCurve = isFirstPoint ? [newPoint.x, newPoint.y, x2, y2] : [x1, y1, newPoint.x, newPoint.y]\n\t\t\tvalidatedOnChange(newCurve.map(twoDecimalPlaces))\n\t\t}\n\n\tconst displayX1 = margin + x1 * bezierEditorInnerWidth\n\tconst displayY1 = margin + bezierEditorInnerWidth - bezierEditorInnerWidth * y1\n\tconst displayX2 = margin + x2 * bezierEditorInnerWidth\n\tconst displayY2 = margin + bezierEditorInnerWidth - bezierEditorInnerWidth * y2\n\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth={bezierEditorInnerWidth + margin * 2}\n\t\t\theight={bezierEditorInnerWidth + margin * 2}\n\t\t>\n\t\t\t<BezierCurve\n\t\t\t\tsize={bezierEditorInnerWidth}\n\t\t\t\tcurve={curve}\n\t\t\t\tfill=\"transparent\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\tstroke=\"#AAAAAA\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\ttransform={`translate(${margin} ${margin})`}\n\t\t\t/>\n\t\t\t<Tether d={`M ${margin} ${margin + bezierEditorInnerWidth} L ${displayX1} ${displayY1}`} />\n\t\t\t<Tether d={`M ${margin + bezierEditorInnerWidth} ${margin} L ${displayX2} ${displayY2}`} />\n\t\t\t<RootHandle\n\t\t\t\tcx={margin}\n\t\t\t\tcy={margin + bezierEditorInnerWidth}\n\t\t\t\tonPointerDown={e => {\n\t\t\t\t\tvalidatedOnChange([0, 0, x2, y2])\n\t\t\t\t\tdragPoint1Controls.start(e, { snapToCursor: true })\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<RootHandle\n\t\t\t\tcx={margin + bezierEditorInnerWidth}\n\t\t\t\tcy={margin}\n\t\t\t\tonPointerDown={e => {\n\t\t\t\t\tvalidatedOnChange([x1, y1, 1, 1])\n\t\t\t\t\tdragPoint2Controls.start(e, { snapToCursor: true })\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<EditHandle\n\t\t\t\tdragControls={dragPoint1Controls}\n\t\t\t\tonDragStart={createDragHandler({ isDragStart: true, isFirstPoint: true })}\n\t\t\t\tonDrag={createDragHandler({ isDragStart: false, isFirstPoint: true })}\n\t\t\t\tonDragEnd={() => {\n\t\t\t\t\tdragDirection.current = undefined\n\t\t\t\t}}\n\t\t\t\tcx={displayX1}\n\t\t\t\tcy={displayY1}\n\t\t\t/>\n\t\t\t<EditHandle\n\t\t\t\tdragControls={dragPoint2Controls}\n\t\t\t\tonDragStart={createDragHandler({ isDragStart: true, isFirstPoint: false })}\n\t\t\t\tonDrag={createDragHandler({ isDragStart: false, isFirstPoint: false })}\n\t\t\t\tonDragEnd={() => {\n\t\t\t\t\tdragDirection.current = undefined\n\t\t\t\t}}\n\t\t\t\tcx={displayX2}\n\t\t\t\tcy={displayY2}\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nconst manualMotionConstraints = { top: 0, left: 0, right: 0, bottom: 0 }\n\nfunction twoDecimalPlaces(number: number) {\n\treturn parseFloat(number.toFixed(2))\n}\n\nfunction validCurveValues(number: number, i: number) {\n\treturn i % 2 ? number : Math.max(Math.min(number, 1), 0)\n}\n\nexport function calculateNewPoint(initialPoint: Point, offset: Point, direction?: \"x\" | \"y\"): Point {\n\tconst newX = direction !== \"y\" ? initialPoint.x + offset.x / bezierEditorInnerWidth : initialPoint.x\n\tconst newY = direction !== \"x\" ? initialPoint.y - offset.y / bezierEditorInnerWidth : initialPoint.y\n\treturn { x: newX, y: newY }\n}\n", "import \"TweenEditor.styles_3mdw1d.wyw.css\"; export const bezierContainer = \"bezierContainer_b1uhuspl\";\nexport const bezierContainerDisabled = \"bezierContainerDisabled_b1jj1ths\";\nexport const easeStringInput = \"easeStringInput_e11efgeq\";", "import { PopupButton, PopupButtonItem, TextInput, useReadOnly } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { ReducedEffectTransition } from \"document/models/CanvasTree/traits/utils/reduceEffectTransition.ts\"\nimport type { Transition } from \"document/models/Transition.ts\"\nimport { isFourNumberList } from \"utils/isFourNumberList.ts\"\nimport { isShallowArrayEqual } from \"utils/isShallowEqual.ts\"\nimport { normalizeEase } from \"utils/normalizeEase.ts\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"../../properties/rows/PanelRow.tsx\"\nimport { doubleColumnClass } from \"../../properties/utils/doubleColumn.styles.ts\"\nimport { doubleColumn } from \"../../properties/utils/doubleColumn.ts\"\nimport { BezierCurveEditor } from \"./BezierCurveEditor.tsx\"\nimport { DurationRow } from \"./DurationRow.tsx\"\nimport * as styles from \"./TweenEditor.styles.ts\"\n\ninterface Props {\n\ttransition: ReducedEffectTransition\n\tfallbackTransition: Transition\n\tonChange: (update: Partial<Transition>) => void\n}\n\ninterface EaseDefinition {\n\tname: string\n\tkey: string\n\tcurve: [number, number, number, number]\n}\n\nexport const easeDefinitions: EaseDefinition[] = [\n\t{ name: Dictionary.Linear, key: \"linear\", curve: [0, 0, 1, 1] },\n\t{ name: \"Ease In\", key: \"easeIn\", curve: [0.5, 0, 0.88, 0.77] },\n\t{ name: \"Ease In Out\", key: \"easeInOut\", curve: [0.44, 0, 0.56, 1] },\n\t{ name: \"Ease Out\", key: \"easeOut\", curve: [0.12, 0.23, 0.5, 1] },\n\t// In a future iteration we can look into using the actual easing\n\t// functions as they produce more nuanced motion than a bezier curve.\n\t{ name: \"Back In\", key: \"backIn\", curve: [0.79, -0.33, 0.79, 0.33] },\n\t{ name: \"Back In Out\", key: \"backInOut\", curve: [0.7, -0.35, 0.3, 1.35] },\n\t{ name: \"Back Out\", key: \"backOut\", curve: [0.15, 0.45, 0.15, 1.35] },\n]\n\nexport function TweenEditor({ transition, fallbackTransition, onChange }: Props) {\n\tlet isPresetEase = false\n\tconst isMixedEase = isMixed(transition.ease)\n\n\tconst isReadOnly = useReadOnly()\n\n\tfunction setEaseByLabel(easeLabel: string) {\n\t\tconst easing = easeDefinitions.find(({ key }) => key === easeLabel)\n\t\tif (easing) {\n\t\t\tonChange({ ease: easing.curve })\n\t\t}\n\t}\n\n\tfunction onEaseTextChange(easeDefinition: string, _final: boolean, reset: (str: string) => void) {\n\t\tconst curve = easeDefinition.split(\",\").map(parseFloat)\n\n\t\tif (isFourNumberList(curve)) {\n\t\t\tonChange({ ease: normalizeEase(curve) })\n\t\t} else {\n\t\t\treset(convertEaseToString(fallbackTransition.ease))\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div className={cx(doubleColumnClass, styles.bezierContainer, isReadOnly && styles.bezierContainerDisabled)}>\n\t\t\t\t{/* We use the fallback curve because it gracefully falls back to a valid curve for Mixed cases, otherwise it is the same as transition.ease */}\n\t\t\t\t<BezierCurveEditor curve={fallbackTransition.ease} onChange={curve => onChange({ ease: curve })} />\n\t\t\t</div>\n\t\t\t<PanelRow title=\"Ease\">\n\t\t\t\t<PopupButton wrapperStyle={doubleColumn} mixed={isMixedEase}>\n\t\t\t\t\t{easeDefinitions.map(({ name, key, curve }) => {\n\t\t\t\t\t\tconst matchesSelectedCurve =\n\t\t\t\t\t\t\t!isMixedEase && isArray(transition.ease) && isShallowArrayEqual(curve, transition.ease)\n\t\t\t\t\t\tif (matchesSelectedCurve) {\n\t\t\t\t\t\t\tisPresetEase = true\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\t\ttitle={name}\n\t\t\t\t\t\t\t\tidentifier={key}\n\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\tselected={matchesSelectedCurve}\n\t\t\t\t\t\t\t\tonSelect={setEaseByLabel}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t\t<PopupButtonItem type=\"divider\" visible={!isMixedEase && !isPresetEase} />\n\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\ttitle={Dictionary.Custom}\n\t\t\t\t\t\tselected={!isMixedEase && !isPresetEase}\n\t\t\t\t\t\tvisible={!isMixedEase && !isPresetEase}\n\t\t\t\t\t/>\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t\t<PanelRow title=\"Bezier\">\n\t\t\t\t<TextInput\n\t\t\t\t\tvalue={convertEaseToString(transition.ease)}\n\t\t\t\t\tonChange={onEaseTextChange}\n\t\t\t\t\tstyle={doubleColumn}\n\t\t\t\t\tclassName={styles.easeStringInput}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t\t<DurationRow duration={transition.duration} onChange={onChange} />\n\t\t</>\n\t)\n}\n\nfunction convertEaseToString(ease: ReducedEffectTransition[\"ease\"]) {\n\tif (isMixed(ease)) return \"\"\n\n\treturn ease.join(\", \")\n}\n", "import { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { getVariableValue } from \"document/models/CanvasTree/nodes/utils/getVariableValue.ts\"\nimport { type DynamicValue, isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport {\n\ttype WithTextStyle,\n\ttextBackgroundColorAddedDefault,\n\ttextStyleDefaults,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { type Reduced, isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { ControlType } from \"library/index.ts\"\nimport { memo, useCallback } from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport type { ColorPickerTab } from \"../../shared/ColorPicker/ColorPickerFillTypeTabs.tsx\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { DynamicValueButton } from \"../../shared/DynamicValueButton.tsx\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { createVariableInScope } from \"../utils/createVariableInScope.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nconst supportedColorTabs: ColorPickerTab[] = [\"solid\"]\nconst popoutId = \"textbackgroundcolor\"\ninterface TextBackgroundColorRowProps {\n\tnodeIds?: NodeID[]\n\tvalue: Reduced<WithTextStyle[\"textBackgroundColor\"]>\n\tonChange: (value: WithTextStyle[\"textBackgroundColor\"]) => void\n\temptyLabel?: string\n\tsupportsVariables?: boolean\n\tsupportsDelete?: boolean\n\tsupportsCopyPaste?: boolean\n\tonPresent?: () => void\n\tonDismiss?: () => void\n}\nexport const TextBackgroundColorRow = memo(function TextBackgroundColorRow({\n\tnodeIds,\n\tvalue,\n\tonChange,\n\temptyLabel,\n\tsupportsVariables = false,\n\tsupportsDelete = false,\n\tsupportsCopyPaste = false,\n\tonPresent,\n\tonDismiss,\n}: TextBackgroundColorRowProps) {\n\tconst canCopyTextBackgroundColor = isClipboardSupported() && !isMixed(value)\n\n\tconst [canPasteTextBackgroundColor, pasteTextBackgroundColor, copyTextBackgroundColor] =\n\t\tuseCopyAndPasteSingleProperty(TraitType.TextBackgroundColor, nodeIds, canCopyTextBackgroundColor)\n\n\tconst onCreateVariable = engine.scheduler.wrapHandler((scopeId: NodeID) => {\n\t\tconst variableRef = createVariableInScope({\n\t\t\tengine,\n\t\t\tscopeId,\n\t\t\ttype: ControlType.Color,\n\t\t\tname: \"textBackgroundColor\",\n\t\t\tinitialValue: isString(value) ? value : textBackgroundColorAddedDefault,\n\t\t})\n\t\tif (variableRef) onChange(variableRef)\n\t})\n\n\tconst onChangeDynamicValue = engine.scheduler.wrapHandler((dynamicValue: DynamicValue) => {\n\t\tif (!isVariableReference(dynamicValue)) return\n\t\tonChange(dynamicValue)\n\t})\n\n\tconst onRemoveDynamicValue = engine.scheduler.wrapHandler(() => {\n\t\tif (!isDynamicValue(value)) return\n\t\tif (isVariableReference(value)) {\n\t\t\tconst variableValue = getVariableValue(engine, value)\n\t\t\tonChange(isString(variableValue) ? variableValue : textBackgroundColorAddedDefault)\n\t\t}\n\t})\n\n\tconst onDelete = useCallback(() => {\n\t\tonChange(undefined)\n\t}, [onChange])\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle={Dictionary.Fill}\n\t\t\tonDelete={value ? onDelete : undefined}\n\t\t\tonCreateVariable={onCreateVariable}\n\t\t\tonSelectVariable={onChangeDynamicValue}\n\t\t\tdynamicValue={isDynamicValue(value) ? value : null}\n\t\t\tonRemoveDynamicValue={onRemoveDynamicValue}\n\t\t\tvariableType={ControlType.Color}\n\t\t\tsupportsVariables={supportsVariables}\n\t\t\tcopyEnabled={canCopyTextBackgroundColor}\n\t\t\tonCopy={supportsCopyPaste ? copyTextBackgroundColor : undefined}\n\t\t\tpasteEnabled={supportsCopyPaste ? canPasteTextBackgroundColor : undefined}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextBackgroundColor : undefined}\n\t\t>\n\t\t\t{isDynamicValue(value) ? (\n\t\t\t\t<DynamicValueButton\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChangeDynamicValue={onChangeDynamicValue}\n\t\t\t\t\tonRemove={onRemoveDynamicValue}\n\t\t\t\t\texpectedType={ControlType.Color}\n\t\t\t\t\ttitle={Dictionary.Fill}\n\t\t\t\t\toutputControl={undefined}\n\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<ColorPopoutButton\n\t\t\t\t\tnavigationTitle={Dictionary.Fill}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tcurrentType=\"color\"\n\t\t\t\t\ttabsToShow={supportedColorTabs}\n\t\t\t\t\temptyLabel={emptyLabel ?? Dictionary.AddEllipsis}\n\t\t\t\t\tonDelete={value && supportsDelete ? onDelete : undefined}\n\t\t\t\t\tonPresent={onPresent}\n\t\t\t\t\tonDismiss={onDismiss}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n})\n\nexport function hasTextBackgroundColor(value: Reduced<WithTextStyle[\"textBackgroundColor\"]>) {\n\tif (isString(value) && value === textStyleDefaults.textBackgroundColor) return false\n\treturn isMixed(value) || isFoundAndNotUndefined(value)\n}\n", "import { memo } from \"react\"\nimport {\n\tTextBackgroundCornerShapeRow,\n\ttype TextBackgroundCornerShapeRowProps,\n} from \"./TextBackgroundCornerShapeRow.tsx\"\nimport { TextBackgroundRadiusRow, type TextBackgroundRadiusRowProps } from \"./TextBackgroundRadiusRow.tsx\"\n\ntype Props = TextBackgroundRadiusRowProps & TextBackgroundCornerShapeRowProps\n\nexport const TextBackgroundCornerRows = memo(function TextBackgroundCornerRows(props: Props) {\n\treturn (\n\t\t<>\n\t\t\t<TextBackgroundRadiusRow {...props} />\n\t\t\t<TextBackgroundCornerShapeRow {...props} />\n\t\t</>\n\t)\n})\n", "import { NumberInputWithTickerAndStepper } from \"@framerjs/fresco\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport {\n\tcornerShapeBrowserDefault,\n\tcornerShapeBrowserDefaultPercentage,\n\tcornerShapeOptionalDefaultPercentage,\n\tcornerShapeTitle,\n\tcornerShapeToPercentage,\n\tpercentageToCornerShape,\n} from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport {\n\tisFoundAndNotMixedAndNotUndefined,\n\tisFoundAndNotUndefined,\n} from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { TextPropertiesBase } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport { memo, useCallback } from \"react\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\nexport interface TextBackgroundCornerShapeRowProps {\n\ttextBackgroundCornerShape: TextPropertiesBase[\"textBackgroundCornerShape\"]\n\tonChangeTextBackgroundCornerShape: (value: number | undefined) => void\n\tsupportsDelete?: boolean\n}\n\nexport const TextBackgroundCornerShapeRow = memo(function TextBackgroundCornerShapeRow({\n\ttextBackgroundCornerShape: value,\n\tonChangeTextBackgroundCornerShape: parentOnChange,\n\tsupportsDelete,\n}: TextBackgroundCornerShapeRowProps) {\n\tconst isSquircleExperimentOn = useExperimentIsOn(\"squircle\")\n\n\tconst onChange = useCallback(\n\t\t(newPercentage: number) => {\n\t\t\tparentOnChange(percentageToCornerShape(newPercentage))\n\t\t},\n\t\t[parentOnChange],\n\t)\n\n\tconst onDelete = useCallback(() => {\n\t\tparentOnChange(undefined)\n\t}, [parentOnChange])\n\n\tif (!isSquircleExperimentOn) return null\n\tif (!isFoundAndNotUndefined(value)) return null\n\n\tconst percentage = cornerShapeToPercentage(\n\t\tisFoundAndNotMixedAndNotUndefined(value) && !isUndefined(value.cornerShape)\n\t\t\t? value.cornerShape\n\t\t\t: cornerShapeBrowserDefault,\n\t)\n\n\treturn (\n\t\t<PanelRow title={cornerShapeTitle} onDelete={supportsDelete ? onDelete : undefined}>\n\t\t\t<NumberInputWithTickerAndStepper\n\t\t\t\tvalue={percentage}\n\t\t\t\tunit=\"%\"\n\t\t\t\tonChange={onChange}\n\t\t\t\tmin={0}\n\t\t\t\tmax={100}\n\t\t\t\tdefaultValue={supportsDelete ? cornerShapeOptionalDefaultPercentage : cornerShapeBrowserDefaultPercentage}\n\t\t\t/>\n\t\t</PanelRow>\n\t)\n})\n", "import { NumberInputWithTicker, SegmentedControl, SegmentedControlItem } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { TextBackgroundRadius } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { isFoundAndNotMixed, isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { TextPropertiesBase } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport { memo, useCallback, useState } from \"react\"\nimport { FusedNumberInputs } from \"../inputs/FusedNumberInputs.tsx\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport { SplitIntoFourInputsSegmentIcon } from \"./SplitInFourInputsRow.tsx\"\n\nconst segmentTitles = [Dictionary.Radius, Dictionary.RadiusPerCorner]\nconst radiusLabels = [\"tl\", \"tr\", \"br\", \"bl\"] as const\nconst radiusKeys = [\n\t\"radiusTopLeft\",\n\t\"radiusTopRight\",\n\t\"radiusBottomRight\",\n\t\"radiusBottomLeft\",\n] as const satisfies (keyof TextBackgroundRadius)[]\n\nconst defaultValues = [0, 0, 0, 0] as const\n\nexport interface TextBackgroundRadiusRowProps {\n\ttextBackgroundRadius: TextPropertiesBase[\"textBackgroundRadius\"]\n\tonChangeTextBackgroundRadius: (value: Partial<TextPropertiesBase[\"textBackgroundRadius\"]>) => void\n\tsupportsDelete?: boolean\n}\n\nexport const TextBackgroundRadiusRow = memo(function TextBackgroundRadiusRow({\n\ttextBackgroundRadius: value,\n\tonChangeTextBackgroundRadius: onChange,\n\tsupportsDelete,\n}: TextBackgroundRadiusRowProps) {\n\tconst [fusedActiveIndex, setFusedActiveIndex] = useState(-1)\n\n\tconst handlePerCornerFlagChange = useCallback(\n\t\t(selected: number) => {\n\t\t\tonChange(updateForRadiusPerCorner(selected !== 0, value))\n\t\t},\n\t\t[value, onChange],\n\t)\n\n\tconst handleCornerValueChange = useCallback(\n\t\t(index: number, newValue: number) => {\n\t\t\tconst key = radiusKeys[index]\n\t\t\tif (!key) return\n\t\t\tonChange({ [key]: newValue })\n\t\t},\n\t\t[onChange],\n\t)\n\n\tif (!isFoundAndNotUndefined(value)) return null\n\n\tconst radius = isMixed(value) ? value : value.radius\n\tconst radiusPerCorner = isMixed(value) ? value : value.radiusPerCorner\n\tconst radiusTopLeft = isMixed(value) ? value : value.radiusTopLeft\n\tconst radiusTopRight = isMixed(value) ? value : value.radiusTopRight\n\tconst radiusBottomRight = isMixed(value) ? value : value.radiusBottomRight\n\tconst radiusBottomLeft = isMixed(value) ? value : value.radiusBottomLeft\n\tconst showPerSide = radiusPerCorner === true\n\tconst segmentedControlIndex = showPerSide ? 1 : 0\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title={Dictionary.Radius} onDelete={value && supportsDelete ? () => onChange(undefined) : undefined}>\n\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\tvalue={!showPerSide ? radius : undefined}\n\t\t\t\t\tonChange={newValue => onChange({ radius: newValue, radiusPerCorner: false })}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tdefaultValue={0}\n\t\t\t\t\tstep=\"nudge\"\n\t\t\t\t/>\n\t\t\t\t<SegmentedControl>\n\t\t\t\t\t{segmentTitles.map((segmentTitle, idx) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\tkey={segmentTitle}\n\t\t\t\t\t\t\t\tidentifier={idx}\n\t\t\t\t\t\t\t\ttitle={segmentTitle}\n\t\t\t\t\t\t\t\tselected={segmentedControlIndex === idx}\n\t\t\t\t\t\t\t\tonSelect={handlePerCornerFlagChange}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<SplitIntoFourInputsSegmentIcon\n\t\t\t\t\t\t\t\t\ticonType=\"radius\"\n\t\t\t\t\t\t\t\t\tsegmentType={idx === 0 ? \"all\" : \"split\"}\n\t\t\t\t\t\t\t\t\tactiveBorderIdx={fusedActiveIndex}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</SegmentedControl>\n\t\t\t</PanelRow>\n\t\t\t{showPerSide && (\n\t\t\t\t<PanelRow title=\" \">\n\t\t\t\t\t<FusedNumberInputs\n\t\t\t\t\t\tvalues={[radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft]}\n\t\t\t\t\t\tlabels={radiusLabels}\n\t\t\t\t\t\tonValueChange={handleCornerValueChange}\n\t\t\t\t\t\tonFocusChange={setFusedActiveIndex}\n\t\t\t\t\t\tstep=\"nudge\"\n\t\t\t\t\t\tminValue={0}\n\t\t\t\t\t\tdefaultValues={defaultValues}\n\t\t\t\t\t/>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t</>\n\t)\n})\n\nfunction updateForRadiusPerCorner(\n\tradiusPerCorner: boolean,\n\tcurrentValue: TextPropertiesBase[\"textBackgroundRadius\"],\n): Partial<TextPropertiesBase[\"textBackgroundRadius\"]> {\n\tif (!radiusPerCorner || !isFoundAndNotMixed(currentValue) || !currentValue) return { radiusPerCorner }\n\treturn {\n\t\tradiusPerCorner,\n\t\tradiusTopLeft: currentValue.radiusTopLeft || currentValue.radius,\n\t\tradiusTopRight: currentValue.radiusTopRight || currentValue.radius,\n\t\tradiusBottomRight: currentValue.radiusBottomRight || currentValue.radius,\n\t\tradiusBottomLeft: currentValue.radiusBottomLeft || currentValue.radius,\n\t}\n}\n", "import { NumberInputWithTicker, SegmentedControl, SegmentedControlItem } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { TextBackgroundPadding } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { isFoundAndNotMixed, isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { TextPropertiesBase } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport { memo, useCallback, useState } from \"react\"\nimport { FusedNumberInputs } from \"../inputs/FusedNumberInputs.tsx\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport { SplitIntoFourInputsSegmentIcon } from \"./SplitInFourInputsRow.tsx\"\n\nconst segmentTitles = [Dictionary.Padding, Dictionary.PaddingPerSide]\nconst paddingLabels = [\"t\", \"r\", \"b\", \"l\"] as const\nconst paddingKeys = [\n\t\"paddingTop\",\n\t\"paddingRight\",\n\t\"paddingBottom\",\n\t\"paddingLeft\",\n] as const satisfies (keyof TextBackgroundPadding)[]\nconst paddingDefaultValues = [0, 0, 0, 0] as const\n\ninterface TextBackgroundPaddingRowProps {\n\tvalue: TextPropertiesBase[\"textBackgroundPadding\"]\n\tonChange: (value: Partial<TextPropertiesBase[\"textBackgroundPadding\"]>) => void\n\tsupportsDelete?: boolean\n}\nexport const TextBackgroundPaddingRow = memo(function TextBackgroundPaddingRow({\n\tvalue,\n\tonChange,\n\tsupportsDelete,\n}: TextBackgroundPaddingRowProps) {\n\tconst [fusedActiveIndex, setFusedActiveIndex] = useState(-1)\n\n\tconst handlePerSideFlagChange = useCallback(\n\t\t(selected: number) => {\n\t\t\tonChange(updateForPaddingPerSide(selected !== 0, value))\n\t\t},\n\t\t[value, onChange],\n\t)\n\n\tconst handleSideValueChange = useCallback(\n\t\t(index: number, newValue: number) => {\n\t\t\tconst key = paddingKeys[index]\n\t\t\tif (!key) return\n\t\t\tonChange({ [key]: newValue })\n\t\t},\n\t\t[onChange],\n\t)\n\n\tif (!isFoundAndNotUndefined(value)) return null\n\n\tconst padding = isMixed(value) ? value : value.padding\n\tconst paddingPerSide = isMixed(value) ? value : value.paddingPerSide\n\tconst paddingTop = isMixed(value) ? value : value.paddingTop\n\tconst paddingRight = isMixed(value) ? value : value.paddingRight\n\tconst paddingBottom = isMixed(value) ? value : value.paddingBottom\n\tconst paddingLeft = isMixed(value) ? value : value.paddingLeft\n\tconst showPerSide = paddingPerSide === true\n\tconst segmentedControlIndex = showPerSide ? 1 : 0\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title={Dictionary.Padding} onDelete={value && supportsDelete ? () => onChange(undefined) : undefined}>\n\t\t\t\t<NumberInputWithTicker\n\t\t\t\t\tvalue={!showPerSide ? padding : undefined}\n\t\t\t\t\tonChange={newValue => onChange({ padding: newValue, paddingPerSide: false })}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tdefaultValue={0}\n\t\t\t\t\tstep=\"nudge\"\n\t\t\t\t/>\n\t\t\t\t<SegmentedControl>\n\t\t\t\t\t{segmentTitles.map((segmentTitle, idx) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\tkey={segmentTitle}\n\t\t\t\t\t\t\t\tidentifier={idx}\n\t\t\t\t\t\t\t\ttitle={segmentTitle}\n\t\t\t\t\t\t\t\tselected={segmentedControlIndex === idx}\n\t\t\t\t\t\t\t\tonSelect={handlePerSideFlagChange}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<SplitIntoFourInputsSegmentIcon\n\t\t\t\t\t\t\t\t\ticonType=\"border\"\n\t\t\t\t\t\t\t\t\tsegmentType={idx === 0 ? \"all\" : \"split\"}\n\t\t\t\t\t\t\t\t\tactiveBorderIdx={fusedActiveIndex}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</SegmentedControl>\n\t\t\t</PanelRow>\n\t\t\t{showPerSide && (\n\t\t\t\t<PanelRow title=\" \">\n\t\t\t\t\t<FusedNumberInputs\n\t\t\t\t\t\tvalues={[paddingTop, paddingRight, paddingBottom, paddingLeft]}\n\t\t\t\t\t\tlabels={paddingLabels}\n\t\t\t\t\t\tonValueChange={handleSideValueChange}\n\t\t\t\t\t\tonFocusChange={setFusedActiveIndex}\n\t\t\t\t\t\tstep=\"nudge\"\n\t\t\t\t\t\tminValue={0}\n\t\t\t\t\t\tdefaultValues={paddingDefaultValues}\n\t\t\t\t\t/>\n\t\t\t\t</PanelRow>\n\t\t\t)}\n\t\t</>\n\t)\n})\n\nfunction updateForPaddingPerSide(\n\tpaddingPerSide: boolean,\n\tcurrentValue: TextPropertiesBase[\"textBackgroundPadding\"],\n): Partial<TextPropertiesBase[\"textBackgroundPadding\"]> {\n\tif (!paddingPerSide || !isFoundAndNotMixed(currentValue) || !currentValue) return { paddingPerSide }\n\treturn {\n\t\tpaddingPerSide,\n\t\tpaddingTop: currentValue.paddingTop || currentValue.padding,\n\t\tpaddingRight: currentValue.paddingRight || currentValue.padding,\n\t\tpaddingBottom: currentValue.paddingBottom || currentValue.padding,\n\t\tpaddingLeft: currentValue.paddingLeft || currentValue.padding,\n\t}\n}\n", "import { useClickHandlers } from \"@framerjs/app-shared/src/PreferMouseDown.tsx\"\nimport { useReadOnly } from \"@framerjs/fresco\"\nimport { cx } from \"@linaria/core\"\nimport React from \"react\"\nimport * as styles from \"./PanelSectionHeaderButton.styles.ts\"\n\nexport type PanelSectionHeaderButtonProps = React.HTMLAttributes<HTMLDivElement>\n\nexport const PanelSectionHeaderButton = React.memo(\n\tReact.forwardRef<HTMLDivElement, PanelSectionHeaderButtonProps>(function PanelSectionHeaderButton(\n\t\t{ className, onMouseDown, onClick, children, ...rest },\n\t\tforwardedRef,\n\t) {\n\t\tconst isReadOnly = useReadOnly()\n\t\tconst clickHandlers = useClickHandlers(onClick, onMouseDown)\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={forwardedRef}\n\t\t\t\tclassName={cx(className, styles.headerButton, isReadOnly && styles.headerButtonDisabled)}\n\t\t\t\t{...rest}\n\t\t\t\t{...clickHandlers}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t}),\n)\n", "import \"PanelSectionHeaderButton.styles_1fw18u5.wyw.css\"; export const headerButton = \"headerButton_hsz4dac\";\nexport const headerButtonDisabled = \"headerButtonDisabled_h1b5naxi\";", "import React from \"react\"\n\nexport const IconSectionHeaderPlus = React.memo(function IconSectionHeaderPlus() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\">\n\t\t\t<path fill=\"currentColor\" d=\"M4 .75a.75.75 0 0 1 1.5 0v8a.75.75 0 0 1-1.5 0Z\" />\n\t\t\t<path fill=\"currentColor\" d=\"M0 4.75A.75.75 0 0 1 .75 4h8a.75.75 0 0 1 0 1.5h-8A.75.75 0 0 1 0 4.75Z\" />\n\t\t</svg>\n\t)\n})\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport {\n\tduplicateEntityReferenceNode,\n\tremoveNodeWithReference,\n} from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isLinkStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { createLinkStylePreset } from \"utils/linkStylePresetUtils.ts\"\nimport { canDeleteStylePreset } from \"utils/stylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport type { AssetReferencePopoutContentProps } from \"../../assets/types.ts\"\nimport { EditLinkStylePresetPopout } from \"../panels/EditLinkStylePresetPopout.tsx\"\nimport type { ContextMenuOptions } from \"./presetRowProps.ts\"\n\nexport function createLinkItemContextMenuItems(id: NodeID, options: ContextMenuOptions) {\n\tconst node = engine.tree.get<LinkStylePresetNode>(id)\n\tif (isNull(node)) return []\n\tif (!isLinkStylePresetNode(node)) return []\n\n\treturn createContextMenuItems(node, options)\n}\n\nfunction createContextMenuItems(preset: LinkStylePresetNode, { startRenaming, hasSearch }: ContextMenuOptions) {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tfunction findNodes() {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.QuickActions,\n\t\t\tsource: \"styles_panel\",\n\t\t\tinitialCategory: {\n\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\toptions: {\n\t\t\t\t\ttype: FindNodesType.StylePreset,\n\t\t\t\t\ttitle: preset.getName(),\n\t\t\t\t\tpresetId: preset.id,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\tfunction duplicatePreset() {\n\t\tcreateLinkStylePreset(engine, {\n\t\t\tname: preset.getName(),\n\t\t\tpresetOverrides: { ...preset.getLinkStyle(), linkTransition: preset.linkTransition },\n\t\t\tonCreate(newPreset) {\n\t\t\t\tduplicateEntityReferenceNode(engine, preset.id, newPreset.id)\n\t\t\t},\n\t\t})\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Find\",\n\t\t\tclick: findNodes,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Rename\",\n\t\t\tclick: startRenaming,\n\t\t\tenabled: !isViewOnly,\n\t\t\tvisible: !hasSearch,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Duplicate\",\n\t\t\tclick: duplicatePreset,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\tclick: () => removeNodeWithReference(engine.tree, preset.id),\n\t\t\tenabled: !isViewOnly && canDeleteStylePreset(engine.stores.treeStore, preset),\n\t\t},\n\t]\n}\n\nexport function LinkStylePresetPopoutContent({ referenceItemId }: AssetReferencePopoutContentProps) {\n\tconst node = useEngineState(\n\t\t() => {\n\t\t\treturn engine.tree.get<LinkStylePresetNode>(referenceItemId)\n\t\t},\n\t\t[referenceItemId],\n\t\t[EngineChange.Tree],\n\t)\n\n\tif (isNull(node) || !isLinkStylePresetNode(node)) return null\n\n\treturn <EditLinkStylePresetPopout preset={node} />\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { LinkEntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport type { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { isLinkStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { migrateTextNodes } from \"document/utils/migrateTextToRichTextNode.ts\"\nimport { createLinkStylePreset } from \"utils/linkStylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { usePresetAssetRows } from \"../../assets/utils/usePresetAssetRows.ts\"\nimport { createLinkItemContextMenuItems } from \"../utils/getLinkStylePresetRowProps.tsx\"\nimport { EditLinkStylePresetPopout } from \"./EditLinkStylePresetPopout.tsx\"\nimport {\n\ttype EditStyleEntityAssetPopoutProps,\n\tSelectStyleEntityAssetPopoutContent,\n} from \"./SelectStyleEntityAssetPopoutContent.tsx\"\n\ninterface SelectLinkStyleEntityAssetPopoutProps {\n\tnodeIds: NodeID[]\n\tselectedIds: Set<string | undefined>\n\tonSelect?: (nodeIds: string[], preset: LinkStylePresetNode) => void\n}\n\nexport function SelectLinkStyleEntityAssetPopout({\n\tnodeIds,\n\tselectedIds,\n\tonSelect,\n}: SelectLinkStyleEntityAssetPopoutProps) {\n\tconst { rows, hasAnyItems, hasUnreferencedItems, typeRootId, searchValue, setSearchValue, hasSearch } =\n\t\tusePresetAssetRows(\n\t\t\t() => PresetsListNode.getNodes(engine.tree),\n\t\t\t() => LinkEntityTypeRootNode.get(engine.tree),\n\t\t\tundefined,\n\t\t\tisLinkStylePresetNode,\n\t\t)\n\n\tconst handleCreateLinkStyle = useEngineCallback(() => {\n\t\tcreateLinkStylePreset(engine, {\n\t\t\tonCreate(preset) {\n\t\t\t\tif (onSelect) {\n\t\t\t\t\tonSelect(nodeIds, preset)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tselectLinkStylePreset(nodeIds, preset)\n\t\t\t},\n\t\t})\n\t}, [nodeIds, onSelect])\n\n\tconst handleSelect = useEngineCallback(\n\t\t(id: NodeID) => {\n\t\t\tconst preset = engine.tree.get<LinkStylePresetNode>(id)\n\t\t\tif (isNull(preset)) return\n\n\t\t\tif (onSelect) {\n\t\t\t\tonSelect(nodeIds, preset)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tselectLinkStylePreset(nodeIds, preset)\n\t\t},\n\t\t[nodeIds, onSelect],\n\t)\n\n\treturn (\n\t\t<SelectStyleEntityAssetPopoutContent\n\t\t\trows={rows}\n\t\t\thasAnyItems={hasAnyItems}\n\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\ttypeRootId={typeRootId}\n\t\t\tsearchValue={searchValue}\n\t\t\tsetSearchValue={setSearchValue}\n\t\t\thasSearch={hasSearch}\n\t\t\tselectedIds={selectedIds}\n\t\t\tPopout={EditLinkStyleEntityAssetPopout}\n\t\t\tcreateItemContextMenuItems={createLinkItemContextMenuItems}\n\t\t\tonCreate={handleCreateLinkStyle}\n\t\t\tonSelect={handleSelect}\n\t\t/>\n\t)\n}\n\nfunction EditLinkStyleEntityAssetPopout({ id }: EditStyleEntityAssetPopoutProps) {\n\tconst preset = useEngineState(() => engine.tree.get<LinkStylePresetNode>(id), [], EngineChange.Tree)\n\n\tif (isNull(preset)) return null\n\n\treturn <EditLinkStylePresetPopout preset={preset} />\n}\n\nexport const selectLinkStylePreset = engine.scheduler.wrapHandler((nodeIds: string[], preset: LinkStylePresetNode) => {\n\tconst anyTextNodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\tconst richTextNodes = migrateTextNodes(engine, anyTextNodes)\n\n\tfor (const node of richTextNodes) {\n\t\tnode.removeLegacyLinkStyle()\n\t\tnode.applyDefaultTextLinkStylePreset(preset, true)\n\t\tnode.setLinkStylePreset(preset, true)\n\t\tnode.setNodeLinkStylePreset(preset)\n\t}\n\n\trecord(\"styles_preset_add\", {\n\t\ttag: \"a\",\n\t\tname: preset.getName(),\n\t\tid: preset.id,\n\t})\n\n\tengine.stores.selectionStore.set(richTextNodes)\n})\n\nexport const selectAnchorLinkStylePreset = engine.scheduler.wrapHandler(\n\t(nodeIds: string[], preset: LinkStylePresetNode) => {\n\t\tconst anyTextNodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\t\tconst richTextNodes = migrateTextNodes(engine, anyTextNodes)\n\n\t\tfor (const node of richTextNodes) {\n\t\t\tnode.setNodeAnchorLinkStylePreset(preset)\n\t\t}\n\n\t\trecord(\"styles_preset_add\", {\n\t\t\ttag: \"a\",\n\t\t\tname: preset.getName(),\n\t\t\tid: preset.id,\n\t\t})\n\n\t\tengine.stores.selectionStore.set(richTextNodes)\n\t},\n)\n", "import engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { TableStylePresetNode } from \"document/models/CanvasTree/nodes/TableStylePresetNode.ts\"\nimport {\n\tduplicateEntityReferenceNode,\n\tremoveNodeWithReference,\n} from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isTableStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { canDeleteStylePreset } from \"utils/stylePresetUtils.ts\"\nimport { createTableStylePreset } from \"utils/tableStylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport type { ContextMenuOptions } from \"./presetRowProps.ts\"\n\nexport function createTableItemContextMenuItems(id: NodeID, options: ContextMenuOptions) {\n\tconst node = engine.tree.get<TableStylePresetNode>(id)\n\tif (isNull(node)) return []\n\tif (!isTableStylePresetNode(node)) return []\n\n\treturn createTableContextMenuItems(node, options)\n}\n\nexport function createTableContextMenuItems(preset: TableStylePresetNode, { startRenaming }: ContextMenuOptions) {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tfunction findNodes() {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.QuickActions,\n\t\t\tsource: \"styles_panel\",\n\t\t\tinitialCategory: {\n\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\toptions: {\n\t\t\t\t\ttype: FindNodesType.StylePreset,\n\t\t\t\t\ttitle: preset.getName(),\n\t\t\t\t\tpresetId: preset.id,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\tfunction duplicatePreset() {\n\t\tcreateTableStylePreset(engine, {\n\t\t\tname: preset.getName(),\n\t\t\ttableStyle: preset.getTableStyle(),\n\t\t\tonCreate(newPreset) {\n\t\t\t\tduplicateEntityReferenceNode(engine, preset.id, newPreset.id)\n\t\t\t},\n\t\t})\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: \"Find\",\n\t\t\tclick: findNodes,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Rename\",\n\t\t\tclick: startRenaming,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Duplicate\",\n\t\t\tclick: duplicatePreset,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\tclick: () => removeNodeWithReference(engine.tree, preset.id),\n\t\t\tenabled: !isViewOnly && canDeleteStylePreset(engine.stores.treeStore, preset),\n\t\t},\n\t]\n}\n", "import { palette } from \"@framerjs/fresco/tokens\"\nimport engine from \"document/engine.ts\"\nimport type { TableStylePresetNode } from \"document/models/CanvasTree/nodes/TableStylePresetNode.ts\"\nimport { reduceCornerShape, reducedCornerShapeDefaults } from \"document/models/CanvasTree/traits/WithCornerShape.ts\"\nimport { paddingDefinedDefaults } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport { getReducedRadiusDefaults, reduceRadius } from \"document/models/CanvasTree/traits/WithRadius.ts\"\nimport {\n\tgetReducedRadiusPerCornerDefaults,\n\treduceRadiusPerCorner,\n} from \"document/models/CanvasTree/traits/WithRadiusPerCorner.ts\"\nimport { type WithTableStyle, tableStyleDefaults } from \"document/models/CanvasTree/traits/WithTableStyle.ts\"\nimport { useId, useMemo } from \"react\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { CornerPanel } from \"./CornerPanel.tsx\"\nimport { PaddingRow } from \"./PaddingRow.tsx\"\nimport { Panel } from \"./Panel.tsx\"\nimport { PresetPopoutContainer } from \"./PresetPopoutContainer.tsx\"\nimport { TableBorderPanel } from \"./TableBorderPanel.tsx\"\n\ninterface Props {\n\tpreset: TableStylePresetNode\n}\n\nexport function EditTableStylePresetPopout({ preset }: Props) {\n\treturn (\n\t\t<PresetPopoutContainer withPanelHeader={false}>\n\t\t\t<Panel>\n\t\t\t\t<TableBorderPanel nodeId={preset.id} border={preset} />\n\n\t\t\t\t<TableHeaderFillColorRow\n\t\t\t\t\ttitle=\"Headers\"\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tcolorKey=\"tableHeaderFillColor\"\n\t\t\t\t\tdefaultColor={tableStyleDefaults.tableHeaderFillColor}\n\t\t\t\t/>\n\n\t\t\t\t<TableHeaderFillColorRow\n\t\t\t\t\ttitle=\"Cells\"\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tcolorKey=\"tableFillColor\"\n\t\t\t\t\tdefaultColor={palette.light40}\n\t\t\t\t/>\n\n\t\t\t\t<PaddingRow\n\t\t\t\t\tpadding={preset.padding ?? paddingDefinedDefaults.padding}\n\t\t\t\t\tpaddingPerSide={preset.paddingPerSide ?? paddingDefinedDefaults.paddingPerSide}\n\t\t\t\t\tpaddingBottom={preset.paddingBottom ?? paddingDefinedDefaults.paddingBottom}\n\t\t\t\t\tpaddingLeft={preset.paddingLeft ?? paddingDefinedDefaults.paddingLeft}\n\t\t\t\t\tpaddingRight={preset.paddingRight ?? paddingDefinedDefaults.paddingRight}\n\t\t\t\t\tpaddingTop={preset.paddingTop ?? paddingDefinedDefaults.paddingTop}\n\t\t\t\t\tnodeIds={[preset.id]}\n\t\t\t\t\tsupportsVariables={false}\n\t\t\t\t/>\n\n\t\t\t\t<TableStylePresetCornerRows preset={preset} />\n\t\t\t</Panel>\n\t\t</PresetPopoutContainer>\n\t)\n}\n\nfunction TableStylePresetCornerRows({ preset }: Props) {\n\tconst reducedProps = useMemo(() => {\n\t\tconst result = {\n\t\t\t...getReducedRadiusDefaults(),\n\t\t\t...getReducedRadiusPerCornerDefaults(),\n\t\t\t...reducedCornerShapeDefaults,\n\t\t}\n\n\t\treduceRadius(preset, result)\n\t\treduceRadiusPerCorner(preset, result)\n\t\treduceCornerShape(preset, result)\n\n\t\treturn result\n\t}, [preset])\n\n\treturn (\n\t\t<CornerPanel\n\t\t\texpandedSelectionForShapeGeometryIds={[preset.id]}\n\t\t\tonlyBreakpointNodes={false}\n\t\t\tonlyRelativeRadiusNodes={false}\n\t\t\t{...reducedProps}\n\t\t\tshowUnconditionally\n\t\t/>\n\t)\n}\n\ntype TableStyleColorKey = Extract<keyof WithTableStyle, \"tableHeaderFillColor\" | \"tableFillColor\">\n\ninterface TableStyleColorRowProps extends Props {\n\tcolorKey: TableStyleColorKey\n\tdefaultColor: string\n\ttitle: string\n}\n\nfunction TableHeaderFillColorRow({ colorKey, defaultColor, preset, title }: TableStyleColorRowProps) {\n\tconst popoutId = useId()\n\n\tconst updateColor = engine.scheduler.wrapHandler((color?: string) => {\n\t\tengine.tree.current(preset)?.set({ [colorKey]: color })\n\t})\n\n\tfunction clearColor() {\n\t\tupdateColor(undefined)\n\t}\n\n\tfunction addColor() {\n\t\tupdateColor(defaultColor)\n\t\tpopoutWindow.navigation.presentPopoutOnRegistration(popoutId)\n\t}\n\n\treturn (\n\t\t<PanelRow title={title}>\n\t\t\t{preset[colorKey] ? (\n\t\t\t\t<ColorPopoutButton\n\t\t\t\t\tid={popoutId}\n\t\t\t\t\tonChange={updateColor}\n\t\t\t\t\tonDelete={clearColor}\n\t\t\t\t\tvalue={preset[colorKey]}\n\t\t\t\t\tnavigationTitle=\"Headers\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"fill\" onClick={addColor} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport {\n\ttype WithTableBorder,\n\thasTableBorder,\n\thasTableBorderEnabled,\n\tisTableBorderEnabled,\n\tnoTableBorder,\n\ttableBorderDefaults,\n} from \"document/models/CanvasTree/traits/WithTableBorder.ts\"\nimport React, { useId } from \"react\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { TableBorderPopoutButton } from \"./TableBorderPopoutButton.tsx\"\n\ninterface Props {\n\tborder: WithTableBorder\n\tnodeId: NodeID\n}\n\n/**\n * This component is used to display the border of a table. It's a simplified version of the BorderPanel.\n */\nexport const TableBorderPanel = React.memo(function BorderPanel({ border, nodeId }: Props) {\n\tconst popoutId = useId()\n\tconst isBorderEnabled = isTableBorderEnabled(border)\n\n\tconst onAdd = engine.scheduler.wrapHandler(() => {\n\t\tconst node = engine.tree.getNodeWithTrait(nodeId, hasTableBorder)\n\t\tif (node === null) return\n\n\t\tnode.set(tableBorderDefaults)\n\t\tpopoutWindow.navigation.presentPopoutOnRegistration(popoutId)\n\t})\n\n\tconst onChange = engine.scheduler.wrapHandler((updates: Partial<WithTableBorder>) => {\n\t\tconst node = engine.tree.getNodeWithTrait(nodeId, hasTableBorderEnabled)\n\t\tif (node === null) return\n\n\t\tnode.set(updates)\n\t})\n\n\tconst onDelete = engine.scheduler.wrapHandler(() => {\n\t\tconst node = engine.tree.getNodeWithTrait(nodeId, hasTableBorder)\n\t\tif (node === null) return\n\n\t\tnode.set(noTableBorder)\n\t})\n\n\treturn (\n\t\t<PanelRow title=\"Border\" onAdd={onAdd} onDelete={onDelete}>\n\t\t\t{isBorderEnabled ? (\n\t\t\t\t<TableBorderPopoutButton\n\t\t\t\t\tborder={border}\n\t\t\t\t\tnodeId={nodeId}\n\t\t\t\t\tpopoutId={popoutId}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"border\" onClick={onAdd} />\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n})\n", "import {\n\tNumberInputWithTickerAndStepper,\n\tPopupButton,\n\tPopupButtonItem,\n\tSegmentedControl,\n\tSegmentedControlItem,\n} from \"@framerjs/fresco\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type {\n\tTableBorderInner,\n\tTableBorderOuter,\n\tTableBorderStyle,\n\tWithTableBorder,\n\tWithTableBorderEnabled,\n} from \"document/models/CanvasTree/traits/WithTableBorder.ts\"\nimport React from \"react\"\nimport { capitalizeFirstLetter } from \"utils/capitalizeFirstLetter.ts\"\nimport { getKeys } from \"utils/getKeys.ts\"\nimport { Dictionary } from \"../../../../../app/dictionary.ts\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { trackingMetadata } from \"../../shared/ColorPicker/trackingMetadata.tsx\"\nimport { PanelRow } from \"../rows/PanelRow.tsx\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport { IconTableBordersInnerAll } from \"./icons/IconTableBordersInnerAll.tsx\"\nimport { IconTableBordersInnerHorizontal } from \"./icons/IconTableBordersInnerHorizontal.tsx\"\nimport { IconTableBordersInnerNone } from \"./icons/IconTableBordersInnerNone.tsx\"\nimport { IconTableBordersInnerVertical } from \"./icons/IconTableBordersInnerVertical.tsx\"\n\nexport interface TableBorderValuesRowsProps {\n\tborder: WithTableBorderEnabled\n\tonChange: (updates: Partial<WithTableBorder>) => unknown\n\tnodeId: NodeID\n\tdisplayColorPopoutInPopover?: boolean\n}\n\nconst tableBorderStyles = getKeys<TableBorderStyle>({\n\tsolid: true,\n\tdashed: true,\n\tdotted: true,\n})\n\nexport const TableBorderValuesRows = React.memo(function BorderValuesRows({\n\tborder: { tableBorderWidth, tableBorderColor, tableBorderStyle, tableBorderOuter, tableBorderInner },\n\tonChange,\n\tnodeId,\n\tdisplayColorPopoutInPopover,\n}: TableBorderValuesRowsProps) {\n\tconst updateOuter = engine.scheduler.wrapHandler((outer: TableBorderOuter | undefined) => {\n\t\tonChange({ tableBorderOuter: outer })\n\t})\n\n\tconst updateInner = engine.scheduler.wrapHandler((inner: TableBorderInner | undefined) => {\n\t\tonChange({ tableBorderInner: inner })\n\t})\n\n\tconst updateColor = engine.scheduler.wrapHandler((newBorderColor: string) => {\n\t\tonChange({ tableBorderColor: newBorderColor })\n\t})\n\n\tconst updateStyle = engine.scheduler.wrapHandler((newStyle: TableBorderStyle) => {\n\t\tonChange({ tableBorderStyle: newStyle })\n\t})\n\n\tconst updateWidth = engine.scheduler.wrapHandler((newWidth: number) => {\n\t\tonChange({ tableBorderWidth: newWidth })\n\t})\n\n\treturn (\n\t\t<>\n\t\t\t<PanelRow title=\"Outer\">\n\t\t\t\t<SegmentedControl style={doubleColumn}>\n\t\t\t\t\t<SegmentedControlItem<TableBorderOuter>\n\t\t\t\t\t\tidentifier=\"all\"\n\t\t\t\t\t\ttitle={Dictionary.Show}\n\t\t\t\t\t\tonSelect={updateOuter}\n\t\t\t\t\t\tselected={tableBorderOuter === \"all\"}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\tidentifier={undefined}\n\t\t\t\t\t\ttitle={Dictionary.Hide}\n\t\t\t\t\t\tonSelect={updateOuter}\n\t\t\t\t\t\tselected={tableBorderOuter === undefined}\n\t\t\t\t\t/>\n\t\t\t\t</SegmentedControl>\n\t\t\t</PanelRow>\n\n\t\t\t<PanelRow title=\"Inner\">\n\t\t\t\t<SegmentedControl style={doubleColumn}>\n\t\t\t\t\t<SegmentedControlItem<TableBorderInner>\n\t\t\t\t\t\ttitle=\"All\"\n\t\t\t\t\t\tidentifier=\"all\"\n\t\t\t\t\t\tonSelect={updateInner}\n\t\t\t\t\t\tselected={tableBorderInner === \"all\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconTableBordersInnerAll />\n\t\t\t\t\t</SegmentedControlItem>\n\n\t\t\t\t\t<SegmentedControlItem<TableBorderInner>\n\t\t\t\t\t\ttitle=\"Horizontal\"\n\t\t\t\t\t\tidentifier=\"horizontal\"\n\t\t\t\t\t\tonSelect={updateInner}\n\t\t\t\t\t\tselected={tableBorderInner === \"horizontal\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconTableBordersInnerHorizontal />\n\t\t\t\t\t</SegmentedControlItem>\n\n\t\t\t\t\t<SegmentedControlItem<TableBorderInner>\n\t\t\t\t\t\ttitle=\"Vertical\"\n\t\t\t\t\t\tidentifier=\"vertical\"\n\t\t\t\t\t\tonSelect={updateInner}\n\t\t\t\t\t\tselected={tableBorderInner === \"vertical\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconTableBordersInnerVertical />\n\t\t\t\t\t</SegmentedControlItem>\n\n\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\ttitle=\"None\"\n\t\t\t\t\t\tidentifier={undefined}\n\t\t\t\t\t\tonSelect={updateInner}\n\t\t\t\t\t\tselected={tableBorderInner === undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconTableBordersInnerNone />\n\t\t\t\t\t</SegmentedControlItem>\n\t\t\t\t</SegmentedControl>\n\t\t\t</PanelRow>\n\n\t\t\t<PanelRow title=\"Color\">\n\t\t\t\t<ColorPopoutButton\n\t\t\t\t\tnavigationTitle=\"Color\"\n\t\t\t\t\tvalue={tableBorderColor}\n\t\t\t\t\tonChange={updateColor}\n\t\t\t\t\tdisplayInPopover={displayColorPopoutInPopover}\n\t\t\t\t\ttrackingMetadata={trackingMetadata([nodeId], \"tableBorderColor\")}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\n\t\t\t<PanelRow title=\"Width\">\n\t\t\t\t<NumberInputWithTickerAndStepper min={0} defaultValue={1} value={tableBorderWidth} onChange={updateWidth} />\n\t\t\t</PanelRow>\n\n\t\t\t<PanelRow title=\"Style\">\n\t\t\t\t<PopupButton wrapperStyle={doubleColumn}>\n\t\t\t\t\t{tableBorderStyles.map(style => (\n\t\t\t\t\t\t<PopupButtonItem\n\t\t\t\t\t\t\tkey={style}\n\t\t\t\t\t\t\tidentifier={style}\n\t\t\t\t\t\t\tonSelect={updateStyle}\n\t\t\t\t\t\t\tselected={tableBorderStyle === style}\n\t\t\t\t\t\t\ttitle={capitalizeFirstLetter(style)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</PopupButton>\n\t\t\t</PanelRow>\n\t\t</>\n\t)\n})\n", "export function IconTableBordersInnerAll() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"none\">\n\t\t\t<path\n\t\t\t\td=\"M1 3.5A2.5 2.5 0 0 1 3.5 1H10a2.5 2.5 0 0 1 2.5 2.5V10a2.5 2.5 0 0 1-2.5 2.5H3.5A2.5 2.5 0 0 1 1 10Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\topacity=\".2\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M6.75 1v11.5M1 6.75h11.5\"\n\t\t\t\tfill=\"transparent\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "export function IconTableBordersInnerHorizontal() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"none\">\n\t\t\t<path\n\t\t\t\td=\"M1 3.5A2.5 2.5 0 0 1 3.5 1H10a2.5 2.5 0 0 1 2.5 2.5V10a2.5 2.5 0 0 1-2.5 2.5H3.5A2.5 2.5 0 0 1 1 10Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\topacity=\".2\"\n\t\t\t/>\n\t\t\t<path d=\"M1 6.75h11.5\" fill=\"transparent\" strokeWidth=\"1.5\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n\t\t</svg>\n\t)\n}\n", "export function IconTableBordersInnerNone() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"none\">\n\t\t\t<path\n\t\t\t\td=\"M1 3.5A2.5 2.5 0 0 1 3.5 1h2c.28 0 .5.22.5.5v4a.5.5 0 0 1-.5.5h-4a.5.5 0 0 1-.5-.5Zm6.5-2c0-.28.22-.5.5-.5h2a2.5 2.5 0 0 1 2.5 2.5v2a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5ZM1 8c0-.28.22-.5.5-.5h4c.28 0 .5.22.5.5v4a.5.5 0 0 1-.5.5h-2A2.5 2.5 0 0 1 1 10Zm6.5 0c0-.28.22-.5.5-.5h4c.28 0 .5.22.5.5v2a2.5 2.5 0 0 1-2.5 2.5H8a.5.5 0 0 1-.5-.5Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\topacity=\".4\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n", "export function IconTableBordersInnerVertical() {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" fill=\"none\">\n\t\t\t<path\n\t\t\t\td=\"M1 3.5A2.5 2.5 0 0 1 3.5 1H10a2.5 2.5 0 0 1 2.5 2.5V10a2.5 2.5 0 0 1-2.5 2.5H3.5A2.5 2.5 0 0 1 1 10Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\topacity=\".2\"\n\t\t\t/>\n\t\t\t<path d=\"M6.75 1v12\" fill=\"transparent\" strokeWidth=\"1.5\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n\t\t</svg>\n\t)\n}\n", "import { Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport type { TableBorderStyle, WithTableBorder } from \"document/models/CanvasTree/traits/WithTableBorder.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFoundAndNotMixed } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { upperCaseFirstChar } from \"utils/names.ts\"\nimport { isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { PopoutButtonBackgroundPreview } from \"../../shared/PopoutButtonBackgroundPreview.tsx\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport { TableBorderValuesRows, type TableBorderValuesRowsProps } from \"./TableBorderValuesRows.tsx\"\n\ninterface Props extends TableBorderValuesRowsProps {\n\tnodeId: NodeID\n\tonChange: (updates: Partial<WithTableBorder>) => void\n\tonDelete: () => void\n\tpopoutId: string\n}\n\nexport function TableBorderPopoutButton({ border, nodeId, onChange, onDelete, popoutId }: Props) {\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tdisplayDivider\n\t\t\tid={popoutId}\n\t\t\tonDelete={onDelete}\n\t\t\tnavigationTitle=\"Border\"\n\t\t\ttitle={title(border.tableBorderStyle)}\n\t\t\tpopout={\n\t\t\t\t<Stack\n\t\t\t\t\tgap={0}\n\t\t\t\t\tpadding={dimensions.css.panelPadding}\n\t\t\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t\t\t>\n\t\t\t\t\t<TableBorderValuesRows border={border} onChange={onChange} nodeId={nodeId} />\n\t\t\t\t</Stack>\n\t\t\t}\n\t\t\tpreview={\n\t\t\t\t<PopoutButtonBackgroundPreview\n\t\t\t\t\tbackground={isString(border.tableBorderColor) ? border.tableBorderColor : \"white\"}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction title(borderStyle: Reduced<TableBorderStyle | undefined>): string {\n\tif (isUndefined(borderStyle)) return \"\"\n\treturn isFoundAndNotMixed(borderStyle) ? upperCaseFirstChar(borderStyle) : Dictionary.Mixed\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { CMSEntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport type { TableStylePresetNode } from \"document/models/CanvasTree/nodes/TableStylePresetNode.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport { isTableStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { migrateTextNodes } from \"document/utils/migrateTextToRichTextNode.ts\"\nimport { createTableStylePreset } from \"utils/tableStylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { usePresetAssetRows } from \"../../assets/utils/usePresetAssetRows.ts\"\nimport { createTableItemContextMenuItems } from \"../utils/getTableStylePresetRowProps.tsx\"\nimport { EditTableStylePresetPopout } from \"./EditTableStylePresetPopout.tsx\"\nimport {\n\ttype EditStyleEntityAssetPopoutProps,\n\tSelectStyleEntityAssetPopoutContent,\n} from \"./SelectStyleEntityAssetPopoutContent.tsx\"\n\ninterface SelectTableStyleEntityAssetPopoutProps {\n\tnodeIds: string[]\n\tselectedIds: Set<string | undefined>\n}\n\nconst tableStyleRowMeta = { componentType: \"table\" } as const\nObject.freeze(tableStyleRowMeta)\n\nexport function SelectTableStyleEntityAssetPopout({ nodeIds, selectedIds }: SelectTableStyleEntityAssetPopoutProps) {\n\tconst { rows, hasAnyItems, hasUnreferencedItems, typeRootId, searchValue, setSearchValue, hasSearch } =\n\t\tusePresetAssetRows(\n\t\t\t() => PresetsListNode.getNodes(engine.tree),\n\t\t\t() => CMSEntityTypeRootNode.get(engine.tree),\n\t\t\tid => {\n\t\t\t\tconst reference = engine.tree.getNodeWithTrait(id, isTableStylePresetNode)\n\t\t\t\tif (!reference) return\n\t\t\t\treturn tableStyleRowMeta\n\t\t\t},\n\t\t\tisTableStylePresetNode,\n\t\t)\n\n\tconst handleCreateTablePresetStyle = useEngineCallback(() => {\n\t\tcreateTableStylePreset(engine, {\n\t\t\tonCreate(preset) {\n\t\t\t\tselectTableStylePreset(nodeIds, preset)\n\t\t\t},\n\t\t})\n\t}, [nodeIds])\n\n\tconst handleSelect = useEngineCallback(\n\t\t(id: NodeID) => {\n\t\t\tconst preset = engine.tree.get<TableStylePresetNode>(id)\n\t\t\tif (isNull(preset)) return\n\n\t\t\tselectTableStylePreset(nodeIds, preset)\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\treturn (\n\t\t<SelectStyleEntityAssetPopoutContent\n\t\t\trows={rows}\n\t\t\thasAnyItems={hasAnyItems}\n\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\ttypeRootId={typeRootId}\n\t\t\tsearchValue={searchValue}\n\t\t\tsetSearchValue={setSearchValue}\n\t\t\thasSearch={hasSearch}\n\t\t\tselectedIds={selectedIds}\n\t\t\tPopout={EditTableStyleEntityAssetPopout}\n\t\t\tcreateItemContextMenuItems={createTableItemContextMenuItems}\n\t\t\tonCreate={handleCreateTablePresetStyle}\n\t\t\tonSelect={handleSelect}\n\t\t/>\n\t)\n}\n\nfunction EditTableStyleEntityAssetPopout({ id }: EditStyleEntityAssetPopoutProps) {\n\tconst preset = useEngineState(() => engine.tree.get<TableStylePresetNode>(id), [], EngineChange.Tree)\n\n\tif (isNull(preset)) return null\n\n\treturn <EditTableStylePresetPopout preset={preset} />\n}\n\nexport const selectTableStylePreset = engine.scheduler.wrapHandler(\n\t(nodeIds: string[], preset: TableStylePresetNode) => {\n\t\tconst anyTextNodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\t\tconst richTextNodes = migrateTextNodes(engine, anyTextNodes)\n\n\t\tfor (const node of richTextNodes) {\n\t\t\tnode.setNodeTableStylePreset(preset)\n\t\t}\n\n\t\trecord(\"styles_preset_add\", {\n\t\t\ttag: \"table\",\n\t\t\tname: preset.getName(),\n\t\t\tid: preset.id,\n\t\t})\n\n\t\tengine.stores.selectionStore.set(richTextNodes)\n\t},\n)\n", "import type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\n\nexport function getTextStylePresetDescription(preset: TextStylePresetNode): string {\n\tconst fontSize = isNumber(preset.fontSize) ? `${preset.fontSize}px` : preset.fontSize\n\tconst lineHeight = preset.lineHeight[0].toFixed(1)\n\treturn `${fontSize} / ${lineHeight}`\n}\n", "import engine from \"document/engine.ts\"\nimport type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { removeEncodedAxesFromSelector } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { useStableCallback } from \"library/utils/useStableCallback.ts\"\nimport { useEffect, useState } from \"react\"\nimport { supportsOpenTypeFontFeature } from \"../rows/OpenTypeRow/utils/supportsOpenTypeFontFeature.ts\"\nimport { StylePresetBreakpointTypeRow } from \"../rows/StylePresetRows/StylePresetBreakpointTypeRow.tsx\"\nimport { StylePresetBreakpointWidthRow } from \"../rows/StylePresetRows/StylePresetBreakpointWidthRow.tsx\"\nimport { StylePresetFontRow } from \"../rows/StylePresetRows/StylePresetFontRow.tsx\"\nimport { StylePresetFontSizeRow } from \"../rows/StylePresetRows/StylePresetFontSizeRow.tsx\"\nimport { StylePresetFontVariantsRow } from \"../rows/StylePresetRows/StylePresetFontVariantsRow.tsx\"\nimport { StylePresetLetterSpacingRow } from \"../rows/StylePresetRows/StylePresetLetterSpacingRow.tsx\"\nimport { StylePresetLineHeightRow } from \"../rows/StylePresetRows/StylePresetLineHeightRow.tsx\"\nimport { StylePresetOpenTypeRow } from \"../rows/StylePresetRows/StylePresetOpenTypeRow.tsx\"\nimport { StylePresetParagraphSpacingRow } from \"../rows/StylePresetRows/StylePresetParagraphSpacingRow.tsx\"\nimport { StylePresetTextAlignmentRow } from \"../rows/StylePresetRows/StylePresetTextAlignmentRow.tsx\"\nimport { StylePresetTextBackgroundColorRow } from \"../rows/StylePresetRows/StylePresetTextBackgroundColorRow.tsx\"\nimport { StylePresetTextBackgroundCornerRows } from \"../rows/StylePresetRows/StylePresetTextBackgroundCornerRows.tsx\"\nimport { StylePresetTextBackgroundPaddingRow } from \"../rows/StylePresetRows/StylePresetTextBackgroundPaddingRow.tsx\"\nimport { StylePresetTextColorRow } from \"../rows/StylePresetRows/StylePresetTextColorRow.tsx\"\nimport { StylePresetTextDecorationRow } from \"../rows/StylePresetRows/StylePresetTextDecorationRow.tsx\"\nimport { StylePresetTextStrokeRow } from \"../rows/StylePresetRows/StylePresetTextStrokeRow.tsx\"\nimport { StylePresetTextTransformRow } from \"../rows/StylePresetRows/StylePresetTextTransformRow.tsx\"\nimport { StylePresetTextWrapBalanceRow } from \"../rows/StylePresetRows/StylePresetTextWrapBalanceRow.tsx\"\nimport { StylePresetVariableFontRow } from \"../rows/StylePresetRows/StylePresetVariableFontRow.tsx\"\nimport { Panel } from \"./Panel.tsx\"\nimport { PanelSectionHeader } from \"./PanelSectionHeader.tsx\"\nimport { PresetPopoutContainer } from \"./PresetPopoutContainer.tsx\"\nimport { getBreakpointFromActiveScreen } from \"./breakpointUtils.tsx\"\nimport { useTextStylePresetBreakpoints } from \"./utils/useTextStylePresetBreakpoints.ts\"\n\ninterface Props {\n\tpreset: TextStylePresetNode\n}\n\nexport function EditTextStylePresetPopout({ preset }: Props) {\n\tconst selection = engine.stores.selectionStore.useState()\n\tconst breakpoints = useTextStylePresetBreakpoints(preset)\n\n\t// Get the id of the breakpoint that matches the the first selected node.\n\tconst getBreakpointIdFromActiveScreen = useStableCallback(() => {\n\t\treturn getBreakpointFromActiveScreen(engine, breakpoints)?.id\n\t})\n\n\tconst [breakpointId, setBreakpointId] = useState(getBreakpointIdFromActiveScreen)\n\n\t// The breakpoint tabs should follow the selection on the canvas.\n\tuseEffect(() => {\n\t\tconst id = getBreakpointIdFromActiveScreen()\n\t\tsetBreakpointId(id)\n\t}, [selection.ids, getBreakpointIdFromActiveScreen])\n\n\tconst index = breakpoints.findIndex(breakpoint => breakpoint.id === breakpointId)\n\tconst breakpoint = breakpoints[index]\n\tconst presetFontSet = new Set([removeEncodedAxesFromSelector(preset.font)])\n\n\treturn (\n\t\t<PresetPopoutContainer withPanelHeader={false}>\n\t\t\t<Panel>\n\t\t\t\t<StylePresetFontRow preset={preset} />\n\t\t\t\t<StylePresetFontVariantsRow preset={preset} />\n\t\t\t\t<StylePresetTextColorRow preset={preset} />\n\t\t\t\t<StylePresetTextBackgroundColorRow preset={preset} supportsDelete />\n\t\t\t\t<StylePresetTextBackgroundCornerRows preset={preset} />\n\t\t\t\t<StylePresetTextBackgroundPaddingRow preset={preset} />\n\t\t\t\t<StylePresetTextTransformRow preset={preset} />\n\t\t\t\t<StylePresetTextDecorationRow preset={preset} />\n\t\t\t\t<StylePresetTextAlignmentRow preset={preset} />\n\t\t\t\t<StylePresetTextStrokeRow preset={preset} />\n\t\t\t\t<StylePresetTextWrapBalanceRow preset={preset} />\n\t\t\t\t<StylePresetVariableFontRow preset={preset} />\n\t\t\t\t{supportsOpenTypeFontFeature(presetFontSet) && <StylePresetOpenTypeRow preset={preset} />}\n\t\t\t</Panel>\n\n\t\t\t<Panel header={<PanelSectionHeader title=\"Breakpoints\" />}>\n\t\t\t\t<StylePresetBreakpointTypeRow\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tbreakpoints={breakpoints}\n\t\t\t\t\tselectedId={breakpoint?.id}\n\t\t\t\t\tonSelect={setBreakpointId}\n\t\t\t\t/>\n\n\t\t\t\t<StylePresetBreakpointWidthRow breakpoints={breakpoints} index={index} />\n\t\t\t\t<StylePresetFontSizeRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetLetterSpacingRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetLineHeightRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t\t<StylePresetParagraphSpacingRow preset={breakpoint ? breakpoint : preset} />\n\t\t\t</Panel>\n\t\t</PresetPopoutContainer>\n\t)\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport { fontStore } from \"library/index.ts\"\nimport type { ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport { filterSupportedOpenTypeFeatures } from \"./filterSupportedOpenTypeFeatures.ts\"\n\nexport function supportsOpenTypeFontFeature(fonts: Set<string>) {\n\tif (!fonts.size) return false\n\n\tfor (const fontSelector of fonts) {\n\t\tconst font = fontStore.getFontBySelector(fontSelector)\n\t\treturn hasSupportedOpenTypeFeatures(font)\n\t}\n\n\treturn false\n}\n\nfunction hasSupportedOpenTypeFeatures(font: ReadonlyFont | undefined): boolean {\n\tif (!font) return false\n\n\tconst fontSourceName = font.family.source\n\tswitch (fontSourceName) {\n\t\tcase \"fontshare\":\n\t\tcase \"framer\":\n\t\tcase \"google\":\n\t\t\treturn font.hasOpenTypeFeatures === true\n\t\tcase \"custom\":\n\t\t\treturn Boolean(filterSupportedOpenTypeFeatures(fontStore.custom.getOpenTypeFeatures(font))?.length)\n\t\tcase \"builtIn\":\n\t\t\treturn Boolean(filterSupportedOpenTypeFeatures(fontStore.builtIn.getOpenTypeFeatures(font))?.length)\n\t\tcase \"local\":\n\t\t\treturn false\n\t\tdefault:\n\t\t\tassertNever(fontSourceName)\n\t}\n\n\treturn false\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithStaticTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { ReducedOpenTypeFontFeatures } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { removeEncodedAxesFromSelector } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport React from \"react\"\nimport { OpenTypeRow } from \"../OpenTypeRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithStaticTextStyle\n}\n\nexport function StylePresetOpenTypeRow({ preset }: Props) {\n\tconst { font: encodedFont } = preset\n\tconst font = encodedFont ? removeEncodedAxesFromSelector(encodedFont) : undefined\n\n\tconst toggleOpenTypeFeature = useEngineCallback(\n\t\t(featureTag: OpenTypeFeatureTag, value: boolean) => {\n\t\t\tconst currentPreset = engine.tree.current(preset)\n\t\t\tconst currentFeatures = currentPreset?.openTypeFontFeatures\n\t\t\tconst newFeatures = new Set(currentFeatures)\n\n\t\t\tif (value) {\n\t\t\t\tnewFeatures.add(featureTag)\n\t\t\t} else {\n\t\t\t\tnewFeatures.delete(featureTag)\n\t\t\t}\n\n\t\t\tcurrentPreset?.set({ openTypeFontFeatures: Array.from(newFeatures) })\n\t\t},\n\t\t[preset],\n\t)\n\n\tconst deleteOpenTypeFeatures = useEngineCallback(() => {\n\t\tengine.tree.current(preset)?.set({ openTypeFontFeatures: undefined })\n\t}, [preset])\n\n\tconst openTypeFontFeatures = React.useMemo(() => {\n\t\tconst featuresObject: ReducedOpenTypeFontFeatures = {}\n\n\t\tpreset.openTypeFontFeatures?.forEach(feature => (featuresObject[feature] = true))\n\t\treturn featuresObject\n\t}, [preset.openTypeFontFeatures])\n\n\tif (!font) return null\n\n\treturn (\n\t\t<OpenTypeRow\n\t\t\tdisableCopyPaste\n\t\t\tfonts={new Set([font])}\n\t\t\topenTypeFontFeatures={openTypeFontFeatures}\n\t\t\tonChange={toggleOpenTypeFeature}\n\t\t\tonDelete={deleteOpenTypeFeatures}\n\t\t/>\n\t)\n}\n", "import { isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { RichTextVirtualizedPropertyOrHTML } from \"document/models/CanvasTree/traits/WithRichText.ts\"\nimport { isNotFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { ReducedOpenTypeFontFeatures } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { isOpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport React from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { OpenTypePopoutButton } from \"./OpenTypePopout.tsx\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\tfonts: Set<string>\n\topenTypeFontFeatures: ReducedOpenTypeFontFeatures\n\tdisableCopyPaste?: boolean\n\tonChange: (feature: OpenTypeFeatureTag, value: boolean) => void\n\tonDelete: () => void\n}\n\nconst openTypeTraitTypes = [TraitType.OpenTypeFontFeatures]\nconst openTypeTraitTypeKeys: RichTextVirtualizedPropertyOrHTML = [\"openTypeFontFeatures\", \"html\"]\n\nfunction canCopyOpenTypeFontFeatures(openTypeFontFeatures: ReducedOpenTypeFontFeatures) {\n\tif (isNotFound(openTypeFontFeatures)) {\n\t\treturn false\n\t}\n\n\tfor (const key in openTypeFontFeatures) {\n\t\tif (!isOpenTypeFeatureTag(key)) return false\n\t\tconst value = openTypeFontFeatures[key]\n\t\tif (isMixed(value)) return false\n\t}\n\n\treturn true\n}\n\nexport const OpenTypeRow = React.memo(\n\t({ nodeIds, fonts, openTypeFontFeatures, disableCopyPaste = false, onChange, onDelete }: Props) => {\n\t\tconst canCopy = !disableCopyPaste && isClipboardSupported() && canCopyOpenTypeFontFeatures(openTypeFontFeatures)\n\t\tconst [canPaste, paste, copy] = useCopyAndPasteSingleProperty(TraitType.OpenTypeFontFeatures, nodeIds, canCopy)\n\n\t\treturn (\n\t\t\t<PanelRow\n\t\t\t\ttitle=\"OpenType\"\n\t\t\t\tonCopy={disableCopyPaste ? undefined : copy}\n\t\t\t\tonPaste={disableCopyPaste ? undefined : paste}\n\t\t\t\tcopyEnabled={canCopy}\n\t\t\t\tpasteEnabled={canPaste}\n\t\t\t\ttraitTypes={openTypeTraitTypes}\n\t\t\t\ttraitTypeKeys={openTypeTraitTypeKeys}\n\t\t\t>\n\t\t\t\t<OpenTypePopoutButton\n\t\t\t\t\tfonts={fonts}\n\t\t\t\t\tappliedFeatures={openTypeFontFeatures}\n\t\t\t\t\tupdateValues={onChange}\n\t\t\t\t\tdeleteValues={onDelete}\n\t\t\t\t/>\n\t\t\t</PanelRow>\n\t\t)\n\t},\n)\n", "import {\n\tScroll,\n\tSearchBar,\n\tSegmentedControl,\n\tSegmentedControlItem,\n\tSpinner,\n\tStack,\n\tTranslatable as T,\n} from \"@framerjs/fresco\"\nimport { AutoSized } from \"@framerjs/fresco/layout-transitions\"\nimport { colors } from \"@framerjs/fresco/tokens\"\nimport { isEmptyObject, isMixed } from \"@framerjs/shared\"\nimport { cx } from \"@linaria/core\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { isFoundAndNotMixed } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport type { ReducedOpenTypeFontFeatures } from \"document/models/CanvasTree/traits/utils/reduceText.ts\"\nimport type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { isFeatureAppliedByDefault } from \"document/models/CanvasTree/utils/openType.ts\"\nimport type { ReadonlyFont } from \"library/index.ts\"\nimport { fontStore, motion } from \"library/index.ts\"\nimport type { OpenTypeFeature } from \"library/render/fonts/types.ts\"\nimport React from \"react\"\nimport { commonValue } from \"utils/commonValue.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport * as styles from \"./OpenTypePopout.styles.ts\"\nimport type { PreviewedFeature } from \"./OpenTypeRow/OpenTypeFeaturePreview.tsx\"\nimport { OpenTypeFeaturePreview } from \"./OpenTypeRow/OpenTypeFeaturePreview.tsx\"\nimport { categorizeOpenTypeFeatures } from \"./OpenTypeRow/utils/categorizeOpenTypeFeatures.ts\"\nimport { openTypePopoutId } from \"./OpenTypeRow/utils/common.ts\"\nimport { useOpenTypeFeatures } from \"./OpenTypeRow/utils/useOpenTypeFeatures.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport { BooleanPopoutButtonPreview } from \"./utils/BooleanPopoutButtonPreview.tsx\"\n\ninterface OpenTypePopoutButtonProps {\n\tfonts: Set<string>\n\tappliedFeatures: ReducedOpenTypeFontFeatures\n\tupdateValues: (feature: OpenTypeFeatureTag, value: boolean) => void\n\tdeleteValues: () => void\n}\n\nexport const OpenTypePopoutButton = React.memo(function OpenTypePopoutButton({\n\tfonts,\n\tappliedFeatures,\n\tupdateValues,\n\tdeleteValues,\n}: OpenTypePopoutButtonProps) {\n\tconst [isOpen, setIsOpen] = React.useState(false)\n\tconst multipleFonts = fonts.size > 1\n\n\tconst anyOpenTypeFeature = isOpen || !isEmptyObject(appliedFeatures)\n\n\tconst fontData = React.useMemo(() => {\n\t\tconst font = commonValue(fonts)\n\t\tif (!isFoundAndNotMixed(font)) return undefined\n\t\treturn fontStore.getFontBySelector(font)\n\t}, [fonts])\n\n\tconst onDelete = React.useCallback(() => {\n\t\tpopoutWindow.navigation.dismiss(openTypePopoutId)\n\t\tdeleteValues()\n\t}, [deleteValues])\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tid={openTypePopoutId}\n\t\t\tonPresent={() => {\n\t\t\t\tsetIsOpen(true)\n\t\t\t}}\n\t\t\tonDismiss={() => setIsOpen(false)}\n\t\t\tpopout={\n\t\t\t\t<OpenTypePopout\n\t\t\t\t\tkey={fontData?.selector} // We need to re-render the component when the font changes to ensure the new font has loaded and the features are available.\n\t\t\t\t\tfontData={fontData}\n\t\t\t\t\tappliedFeatures={appliedFeatures}\n\t\t\t\t\tupdateValues={updateValues}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tnavigationTitle=\"OpenType\"\n\t\t\ttitle={anyOpenTypeFeature ? Dictionary.Enabled : Dictionary.AddEllipsis}\n\t\t\ttitleColor={anyOpenTypeFeature ? undefined : colors.inputLabel}\n\t\t\tpreview={<BooleanPopoutButtonPreview enabled={anyOpenTypeFeature} />}\n\t\t\tonDelete={anyOpenTypeFeature ? onDelete : undefined}\n\t\t\tenabled={!multipleFonts}\n\t\t/>\n\t)\n})\n\ninterface OpenTypePopoutProps extends Omit<OpenTypePopoutButtonProps, \"fonts\" | \"deleteValues\" | \"onDelete\"> {\n\tfontData: ReadonlyFont | undefined\n}\n\nconst OpenTypePopout = React.memo(function OpenTypePopout({\n\tfontData,\n\tappliedFeatures,\n\tupdateValues,\n}: OpenTypePopoutProps) {\n\tconst features = useOpenTypeFeatures(fontData)\n\tconst isLoading = isUndefined(features)\n\tconst openTypeFeatures = features ?? []\n\tconst [previewedFeature, setPreviewedFeature] = React.useState<PreviewedFeature | undefined>()\n\n\tconst { searchValue, setSearchValue, groupedFeaturesCount, groupedFeatures } = useSearchOpenTypeFeatures(\n\t\topenTypeFeatures,\n\t\tappliedFeatures,\n\t)\n\n\tconst handleChangePreviewedFeature = React.useCallback((featureTag: OpenTypeFeatureTag, shouldApply: boolean) => {\n\t\tsetPreviewedFeature({\n\t\t\ttag: featureTag,\n\t\t\tshouldApply: isFeatureAppliedByDefault(featureTag) ? !shouldApply : shouldApply,\n\t\t})\n\t}, [])\n\n\tconst noSearchResults = groupedFeaturesCount === 0 && searchValue.length > 0\n\tconst hasNoSupportedFeatures = groupedFeaturesCount === 0 && searchValue.length === 0\n\tif (!fontData) return null\n\n\treturn (\n\t\t<Stack gap={0} shrink={1} className={cx(styles.container)}>\n\t\t\t<div className={styles.previewContainer}>\n\t\t\t\t<OpenTypeFeaturePreview\n\t\t\t\t\tfontData={fontData}\n\t\t\t\t\tpreviewedFeature={previewedFeature}\n\t\t\t\t\tavailableFeatures={openTypeFeatures}\n\t\t\t\t/>\n\t\t\t\t<SearchBar\n\t\t\t\t\tclassName={styles.searchInput}\n\t\t\t\t\tenabled={!isLoading}\n\t\t\t\t\tvalue={searchValue}\n\t\t\t\t\tonChange={setSearchValue}\n\t\t\t\t\tplaceholder={Dictionary.SearchEllipsis}\n\t\t\t\t\ticonPosition=\"left\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<Scroll direction=\"vertical\" className={styles.tagsList}>\n\t\t\t\t<AutoSized dependencies={[groupedFeaturesCount, noSearchResults, hasNoSupportedFeatures, isLoading]}>\n\t\t\t\t\t{!noSearchResults &&\n\t\t\t\t\t\t!hasNoSupportedFeatures &&\n\t\t\t\t\t\t!isLoading &&\n\t\t\t\t\t\tgroupedFeatures?.map(({ category, features: categoryFeatures }) => {\n\t\t\t\t\t\t\tif (categoryFeatures.length === 0) return null\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div key={category} className={styles.category}>\n\t\t\t\t\t\t\t\t\t<div className={styles.categoryTitleContainer}>\n\t\t\t\t\t\t\t\t\t\t<T className={styles.categoryTitle}>{category}</T>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{categoryFeatures.map(({ tag: featureTag, title, shortTitle }) => {\n\t\t\t\t\t\t\t\t\t\tconst isApplied = isFeatureApplied(featureTag, appliedFeatures)\n\t\t\t\t\t\t\t\t\t\t// When we disable a default on feature,\n\t\t\t\t\t\t\t\t\t\t// we want to *add* it to the list, not\n\t\t\t\t\t\t\t\t\t\t// remove it. So we invert the values\n\t\t\t\t\t\t\t\t\t\t// provided to updateValues.\n\t\t\t\t\t\t\t\t\t\tconst onValue = !isFeatureAppliedByDefault(featureTag)\n\t\t\t\t\t\t\t\t\t\tconst offValue = !onValue\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<PanelRow\n\t\t\t\t\t\t\t\t\t\t\t\tkey={featureTag}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={shortTitle ?? title}\n\t\t\t\t\t\t\t\t\t\t\t\ttitleClassName={styles.rowTitle}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => handleChangePreviewedFeature(featureTag, true)}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseLeave={() => setPreviewedFeature(undefined)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={styles.panelRow}\n\t\t\t\t\t\t\t\t\t\t\t\tdisableTitleTooltip\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<SegmentedControl className={styles.segmentedControl}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={Dictionary.Yes}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidentifier={true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={isApplied === true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => updateValues(featureTag, onValue)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => handleChangePreviewedFeature(featureTag, true)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={Dictionary.No}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tidentifier={false}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={isApplied === false}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={() => updateValues(featureTag, offValue)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => handleChangePreviewedFeature(featureTag, false)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</SegmentedControl>\n\t\t\t\t\t\t\t\t\t\t\t</PanelRow>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t{noSearchResults && !isLoading && (\n\t\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\t\t<T className={styles.emptyStateTitle}>No Search Results</T>\n\t\t\t\t\t\t\t<T className={styles.emptyStateDescription}>Try something else</T>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* This is only expected when metadata says the font has OpenType features,\n\t\t\t\t\tbut no parsed feature tags are supported by Vekter. */}\n\t\t\t\t\t{hasNoSupportedFeatures && !isLoading && (\n\t\t\t\t\t\t<div className={styles.emptyState}>\n\t\t\t\t\t\t\t<T className={styles.emptyStateTitle}>No OpenType Features</T>\n\t\t\t\t\t\t\t<T className={styles.emptyStateDescription}>This font has no supported features</T>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t// We're animating this to prevent flickering when the popout loads too quickly.\n\t\t\t\t\t\t\tclassName={styles.loadingContainer}\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Spinner size=\"medium\" inline className={styles.loadingSpinner} />\n\t\t\t\t\t\t\t<T>Loading\u2026</T>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AutoSized>\n\t\t\t</Scroll>\n\t\t</Stack>\n\t)\n})\n\nfunction useSearchOpenTypeFeatures(openTypeFeatures: OpenTypeFeature[], appliedFeatures: ReducedOpenTypeFontFeatures) {\n\tconst [searchValue, setSearchValue] = React.useState(\"\")\n\tconst groupedFeatures = React.useMemo(() => categorizeOpenTypeFeatures(openTypeFeatures), [openTypeFeatures])\n\n\tconst filteredGroupFeatures = React.useMemo(() => {\n\t\tif (!searchValue) return groupedFeatures\n\t\tconst searchTerm = searchValue.toLowerCase().trim()\n\t\treturn groupedFeatures?.map(({ category, features }) => {\n\t\t\tconst hasCategoryMatch = searchHasMatch(searchTerm, category)\n\t\t\t// include all category features if the category matches\n\t\t\tif (hasCategoryMatch) return { category, features }\n\n\t\t\tconst filteredFeatures = features.filter(({ title, tag, shortTitle }) => {\n\t\t\t\tconst isApplied = isFeatureApplied(tag, appliedFeatures)\n\t\t\t\tconst appliedText = isApplied ? Dictionary.Yes : Dictionary.No\n\n\t\t\t\treturn (\n\t\t\t\t\tsearchHasMatch(searchTerm, appliedText) ||\n\t\t\t\t\tsearchHasMatch(searchTerm, title) ||\n\t\t\t\t\tsearchHasMatch(searchTerm, shortTitle) ||\n\t\t\t\t\tsearchHasMatch(searchTerm, tag)\n\t\t\t\t)\n\t\t\t})\n\t\t\treturn { category, features: filteredFeatures }\n\t\t})\n\t}, [searchValue, groupedFeatures, appliedFeatures])\n\n\tconst groupedFeaturesCount = filteredGroupFeatures?.reduce((acc, { features }) => acc + features.length, 0)\n\n\treturn { searchValue, setSearchValue, groupedFeatures: filteredGroupFeatures, groupedFeaturesCount }\n}\n\nfunction searchHasMatch(term: string, featureProp: string | undefined): boolean {\n\tif (!featureProp) return false\n\treturn featureProp.toLowerCase().includes(term)\n}\n\n/**\n * Some features are applied by default on all fonts, so we want to show them as applied if they are not present.\n */\nfunction isFeatureApplied(featureTag: OpenTypeFeatureTag, appliedFeatures: ReducedOpenTypeFontFeatures) {\n\tconst override = appliedFeatures[featureTag]\n\tif (isMixed(override)) return override\n\tconst isFeaturePresent = override === true\n\treturn isFeatureAppliedByDefault(featureTag) ? !isFeaturePresent : isFeaturePresent\n}\n", "import \"OpenTypePopout.styles_1n5jhdn.wyw.css\"; export const container = \"container_c1aemqhp\";\nexport const previewContainer = \"previewContainer_p5lx08m\";\nexport const tagsList = \"tagsList_tt6u39g\";\nexport const category = \"category_ci4k5zx\";\nexport const categoryTitleContainer = \"categoryTitleContainer_curvh68\";\nexport const categoryTitle = \"categoryTitle_c9xfxr5\";\nexport const rowTitle = \"rowTitle_r1fs5wd3\";\nexport const panelRow = \"panelRow_p1tjtq6t\";\nexport const segmentedControl = \"segmentedControl_s8pir5u\";\nexport const searchInput = \"searchInput_s1ntpu4k\";\nexport const emptyState = \"emptyState_ezhb3c9\";\nexport const emptyStateTitle = \"emptyStateTitle_e19b84sz\";\nexport const emptyStateDescription = \"emptyStateDescription_e1m93w7\";\nexport const loadingContainer = \"loadingContainer_l1nad89b\";\nexport const loadingSpinner = \"loadingSpinner_laq8xsk\";", "import { Translatable as T } from \"@framerjs/fresco\"\nimport type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { openTypeFeatureTagsToCSS } from \"document/models/CanvasTree/utils/openType.ts\"\nimport type { OpenTypeFeature, ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport React from \"react\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport * as styles from \"./OpenTypeFeaturePreview.styles.ts\"\nimport { getOpenTypePreview } from \"./utils/getOpenTypePreview.tsx\"\n\nexport interface PreviewedFeature {\n\ttag: OpenTypeFeatureTag\n\tshouldApply: boolean\n}\n\ninterface OpenTypePreviewProps {\n\tfontData: ReadonlyFont\n\tpreviewedFeature: PreviewedFeature | undefined\n\tavailableFeatures: OpenTypeFeature[]\n}\n\nexport const OpenTypeFeaturePreview = React.memo(\n\t({ fontData, previewedFeature, availableFeatures }: OpenTypePreviewProps) => {\n\t\tconst featureTag = previewedFeature?.tag\n\t\tconst shouldApply = previewedFeature?.shouldApply\n\n\t\tconst preview = React.useMemo(() => {\n\t\t\tif (!featureTag) return undefined\n\t\t\treturn getOpenTypePreview(fontData.selector, featureTag, availableFeatures)\n\t\t}, [availableFeatures, featureTag, fontData.selector])\n\n\t\tconst previewStyle = getPreviewStyle(shouldApply, featureTag, fontData)\n\n\t\treturn (\n\t\t\t<div className={styles.preview}>\n\t\t\t\t{previewedFeature && preview ? (\n\t\t\t\t\t<span className={styles.previewText} style={{ ...previewStyle, ...preview.styleOverride }}>\n\t\t\t\t\t\t{isArray(preview.content)\n\t\t\t\t\t\t\t? preview.content.map((line, index) => (\n\t\t\t\t\t\t\t\t\t<React.Fragment key={line}>\n\t\t\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t\t\t\t{index !== preview.content.length - 1 && <br />}\n\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t: preview.content}\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\t<T className={styles.noPreviewText}>No Preview</T>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nfunction getPreviewStyle(\n\tshouldApply: boolean | undefined,\n\tfeatureTag: OpenTypeFeatureTag | undefined,\n\tfontData: ReadonlyFont,\n) {\n\treturn {\n\t\tfontStyle: fontData.style,\n\t\tfontFamily: fontData.cssFamilyName,\n\t\tfontFeatureSettings: shouldApply && featureTag ? openTypeFeatureTagsToCSS([featureTag]) : \"normal\",\n\t}\n}\n", "import \"OpenTypeFeaturePreview.styles_1jua9oq.wyw.css\"; export const preview = \"preview_p12eg7x8\";\nexport const previewText = \"previewText_p1pccuaf\";\nexport const noPreviewText = \"noPreviewText_n1br2ll\";", "import type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\n\ninterface PreviewOverrideProps {\n\tpreview?: string | string[]\n\tstyle?: React.CSSProperties\n}\n\ntype PreviewOverride = {\n\t[key in OpenTypeFeatureTag]?: PreviewOverrideProps\n}\n\nconst interOverrides: PreviewOverride = {\n\tss05: { preview: [\"A B C\", \"1 2 3\"], style: { lineHeight: \"1.6em\" } },\n\tss06: { preview: [\"A B C\", \"1 2 3\"], style: { lineHeight: \"1.6em\" } },\n\tcv12: { preview: \"f \u1E1F \u02A9\" },\n}\n\nconst fontSelectorToPreviewOverride: Record<string, PreviewOverride> = {\n\tInter: interOverrides,\n\t\"FR;InterDisplay\": interOverrides,\n}\n\nexport function getOpenTypePreviewOverride(\n\tfontSelector: string,\n\tfeatureTag: OpenTypeFeatureTag,\n): PreviewOverrideProps | undefined {\n\tconst fontName = fontSelector.split(\"-\")[0] // We remove font variant from the selector.\n\treturn fontSelectorToPreviewOverride?.[fontName]?.[featureTag] ?? undefined\n}\n", "import type { OpenTypeFeatureTag } from \"document/models/CanvasTree/utils/openType.ts\"\nimport type { OpenTypeFeature } from \"library/render/fonts/types.ts\"\nimport { OpenTypeCategoryName, extractMostFrequentBaseCharacters } from \"./common.ts\"\nimport { getOpenTypeFeatureMetadata } from \"./getOpenTypeFeatureMetadata.ts\"\nimport { getOpenTypePreviewOverride } from \"./getOpenTypePreviewOverride.ts\"\n\nconst MAX_LINES = 2\nconst MAX_CHARS_PER_LINE = 5\n\nexport interface OpenTypePreview {\n\tcontent: string | string[]\n\tstyleOverride?: React.CSSProperties\n}\n\nexport function getOpenTypePreview(\n\tfontSelector: string,\n\tfeatureTag: OpenTypeFeatureTag,\n\tavailableFeatures: OpenTypeFeature[],\n): OpenTypePreview | undefined {\n\t// 1. Check for a preview override specific to the current font and feature.\n\t// This override is used to customize previews for commonly used fonts like Inter.\n\tconst fontFeatureOverride = getOpenTypePreviewOverride(fontSelector, featureTag)\n\tif (fontFeatureOverride?.preview) {\n\t\treturn { content: fontFeatureOverride.preview, styleOverride: fontFeatureOverride.style }\n\t}\n\n\t// 2. Check for a general feature preview override.\n\t// This override is applied universally to control feature previews across all fonts.\n\tconst featureMetadata = getOpenTypeFeatureMetadata(featureTag)\n\tif (featureMetadata?.preview) return featureMetadata.preview\n\n\t// 3. Otherwise, dynamically generate a preview for the feature.\n\tconst currentFeature = availableFeatures.find(item => item.tag === featureTag)\n\n\t// 3.1. If the feature is not found, or we don't have a coverage, so we don't have any preview to show.\n\tif (!currentFeature || !currentFeature.coverage) return undefined\n\n\tconst coverage = currentFeature.coverage\n\n\t// 3.2. If the coverage is short enough, no need to categorize it.\n\tif (coverage.length <= MAX_CHARS_PER_LINE) return { content: coverage.join(\" \") }\n\n\t// 3.3. If the feature is a character variant, we only want to show 1 base character.\n\tif (featureMetadata?.category === OpenTypeCategoryName.CharacterVariant) {\n\t\treturn { content: extractMostFrequentBaseCharacters(coverage, 1) }\n\t}\n\t// 3.4. If the feature is a ligature, we only want to show the ligature characters.\n\tif (featureMetadata?.category === OpenTypeCategoryName.Ligature) {\n\t\treturn {\n\t\t\tcontent: coverage.join(\" \"),\n\t\t\tstyleOverride: { fontSize: coverage.length >= MAX_CHARS_PER_LINE ? \"24px\" : undefined },\n\t\t}\n\t}\n\n\t// 3.5. Categorize the coverage into categories, and then return the most relevant ones.\n\tconst baseCoverage = extractMostFrequentBaseCharacters(coverage)\n\tif (baseCoverage.length === 0) return undefined\n\tconst categories = sortCharactersByCategory(baseCoverage)\n\treturn { content: getMostRelevantCategories(categories, MAX_LINES, MAX_CHARS_PER_LINE) }\n}\n\nconst enum UnicodeCategory {\n\tLetter = \"L\",\n\tMark = \"M\",\n\tNumber = \"N\",\n\tPunctuation = \"P\",\n\tSymbol = \"S\",\n\tSeparator = \"Z\",\n\tOther = \"C\",\n}\n\nconst unicodeCategoriesByPriority: Record<UnicodeCategory, number> = {\n\t[UnicodeCategory.Letter]: 1,\n\t[UnicodeCategory.Number]: 2,\n\t[UnicodeCategory.Symbol]: 3,\n\t[UnicodeCategory.Punctuation]: 4,\n\t[UnicodeCategory.Separator]: 5,\n\t[UnicodeCategory.Mark]: 6,\n\t[UnicodeCategory.Other]: 7,\n}\n\nfunction isInRange(value: number, min: number, max: number): boolean {\n\treturn value >= min && value <= max\n}\n\nfunction getUnicodeCategory(character: string): UnicodeCategory {\n\tconst code = character.charCodeAt(0)\n\n\tswitch (true) {\n\t\tcase isInRange(code, 65, 90):\n\t\tcase isInRange(code, 97, 122):\n\t\t\treturn UnicodeCategory.Letter\n\t\tcase isInRange(code, 768, 879):\n\t\t\treturn UnicodeCategory.Mark\n\t\tcase isInRange(code, 48, 57):\n\t\t\treturn UnicodeCategory.Number\n\t\tcase isInRange(code, 33, 47):\n\t\tcase isInRange(code, 58, 64):\n\t\tcase isInRange(code, 91, 96):\n\t\tcase isInRange(code, 123, 126):\n\t\t\treturn UnicodeCategory.Punctuation\n\t\tcase isInRange(code, 36, 38):\n\t\tcase new Set([42, 43, 45, 47, 60, 61, 62]).has(code):\n\t\t\treturn UnicodeCategory.Symbol\n\t\tcase new Set([32, 160]).has(code):\n\t\t\treturn UnicodeCategory.Separator\n\t\tdefault:\n\t\t\treturn UnicodeCategory.Other\n\t}\n}\n\nfunction sortCharactersByCategory(chars: readonly string[]): Record<UnicodeCategory, string[]> {\n\tconst result = {} as Record<UnicodeCategory, string[]>\n\n\tfor (const char of chars) {\n\t\tconst category = getUnicodeCategory(char)\n\t\tif (!result[category]) result[category] = []\n\t\tresult[category].push(char)\n\t}\n\n\treturn result\n}\n\nfunction getMostRelevantCategories(\n\tcategories: Record<UnicodeCategory, string[]>,\n\tmaxLines: number,\n\tmaxCharsPerLine: number,\n): string | string[] {\n\tconst topCategories = Object.entries(categories)\n\t\t.sort(([catA], [catB]) => unicodeCategoriesByPriority[catA] - unicodeCategoriesByPriority[catB])\n\t\t.slice(0, maxLines)\n\n\tconst result: string[] = []\n\tlet totalChars = 0\n\tfor (const [_category, chars] of topCategories) {\n\t\tconst categoryChars = chars.sort().slice(0, maxCharsPerLine)\n\t\tresult.push(categoryChars.join(\" \"))\n\t\ttotalChars += categoryChars.length\n\t}\n\n\treturn totalChars <= maxCharsPerLine ? result.join(\" \") : result\n}\n", "import { assert, unhandledError } from \"@framerjs/shared\"\nimport { popoutWindow } from \"document/components/chrome/shared/PopoutWindow.tsx\"\nimport { isValidOpenTypeFeatures } from \"document/models/CanvasTree/utils/openType.ts\"\nimport { fontStore } from \"library/index.ts\"\nimport type { OpenTypeFeature, ReadonlyFont } from \"library/render/fonts/types.ts\"\nimport React from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { openTypePopoutId } from \"./common.ts\"\nimport { getSupportedOpenTypeFeatures } from \"./getOpenTypeFeaturesJSON.ts\"\n\nexport function useOpenTypeFeatures(fontData: ReadonlyFont | undefined): OpenTypeFeature[] | undefined {\n\tconst [openTypeFeatures, setOpenTypeFeatures] = React.useState<OpenTypeFeature[] | undefined>(undefined)\n\tconst lastSelectorRef = React.useRef<string | undefined>(undefined)\n\n\tReact.useEffect(() => {\n\t\tif (!fontData || lastSelectorRef.current === fontData?.selector) return\n\t\tsetOpenTypeFeatures(undefined)\n\t\tlastSelectorRef.current = fontData?.selector\n\t\tvoid loadFontData(fontData)\n\t\t\t.then(features => {\n\t\t\t\tif (!features) return\n\t\t\t\tsetOpenTypeFeatures(features)\n\t\t\t})\n\t\t\t.catch(unhandledError)\n\t}, [fontData])\n\n\treturn openTypeFeatures\n}\n\nasync function loadFontData(font: ReadonlyFont) {\n\ttry {\n\t\tconst [features, _] = await Promise.all([getSupportedOpenTypeFeatures(font), fontStore.loadFonts([font.selector])])\n\t\tassert(isValidOpenTypeFeatures(features), \"Font does not have valid OpenType features\")\n\t\treturn features\n\t} catch (error) {\n\t\tpopoutWindow.navigation.dismiss(openTypePopoutId)\n\t\ttoast({\n\t\t\tkey: `unsupported-open-type-font-${font.family.name}`,\n\t\t\ttype: \"add\",\n\t\t\tvariant: \"error\",\n\t\t\ttext: error instanceof Error ? error.message : \"Unsupported OpenType font\",\n\t\t\ticon: \"error\",\n\t\t\tduration: 5000,\n\t\t})\n\t}\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { TextBackgroundColorRow } from \"../TextBackgroundColorRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tsupportsDelete?: boolean\n\temptyLabel?: string\n}\n\nexport function StylePresetTextBackgroundColorRow({ preset, supportsDelete }: Props) {\n\tconst changeTextBackgroundColor = engine.scheduler.wrapHandler((textBackgroundColor?: VariableReference | string) => {\n\t\tif (isVariableReference(textBackgroundColor)) return\n\t\tengine.tree.current(preset)?.set({ textBackgroundColor })\n\t})\n\n\treturn (\n\t\t<TextBackgroundColorRow\n\t\t\tvalue={preset.textBackgroundColor}\n\t\t\tonChange={changeTextBackgroundColor}\n\t\t\tsupportsDelete={supportsDelete}\n\t\t\tsupportsVariables={false}\n\t\t/>\n\t)\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { recordCornerShapeUpdate } from \"document/components/utils/recordCornerShapeUpdate.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { BackgroundStyles } from \"prosemirror/styles.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { TextBackgroundCornerRows } from \"../TextBackgroundCornerRows.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n}\n\nexport function StylePresetTextBackgroundCornerRows({ preset }: Props) {\n\tconst changeTextBackgroundRadius = useEngineCallback(\n\t\t(textBackgroundRadius?: Partial<WithTextStyle[\"textBackgroundRadius\"]>) => {\n\t\t\tconst current = engine.tree.current(preset)\n\t\t\tif (!current) return\n\t\t\tassert(!isUndefined(textBackgroundRadius), \"Attempted to delete text background radius\")\n\t\t\tconst spreadableRadius = current.textBackgroundRadius ?? BackgroundStyles.defaults.textBackgroundRadius\n\t\t\tcurrent.set({ textBackgroundRadius: { ...spreadableRadius, ...textBackgroundRadius } })\n\t\t},\n\t\t[preset],\n\t)\n\n\tconst changeTextBackgroundCornerShape = useEngineCallback(\n\t\t(textBackgroundCornerShape: number | undefined) => {\n\t\t\tconst current = engine.tree.current(preset)\n\t\t\tif (!current) return\n\t\t\tassert(!isUndefined(textBackgroundCornerShape), \"Attempted to delete text background corner shape\")\n\t\t\tcurrent.set({ textBackgroundCornerShape: { cornerShape: textBackgroundCornerShape } })\n\t\t\trecordCornerShapeUpdate(current, { value: textBackgroundCornerShape })\n\t\t},\n\t\t[preset],\n\t)\n\n\treturn (\n\t\t<TextBackgroundCornerRows\n\t\t\ttextBackgroundRadius={preset.textBackgroundRadius ?? BackgroundStyles.defaults.textBackgroundRadius}\n\t\t\tonChangeTextBackgroundRadius={changeTextBackgroundRadius}\n\t\t\ttextBackgroundCornerShape={\n\t\t\t\tpreset.textBackgroundCornerShape ?? BackgroundStyles.defaults.textBackgroundCornerShape\n\t\t\t}\n\t\t\tonChangeTextBackgroundCornerShape={changeTextBackgroundCornerShape}\n\t\t/>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { BackgroundStyles } from \"prosemirror/styles.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { TextBackgroundPaddingRow } from \"../TextBackgroundPaddingRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n\tdeleteEnabled?: boolean\n}\n\nexport function StylePresetTextBackgroundPaddingRow({ preset, deleteEnabled }: Props) {\n\tconst changeTextBackgroundPadding = useEngineCallback(\n\t\t(textBackgroundPadding?: Partial<WithTextStyle[\"textBackgroundPadding\"]>) => {\n\t\t\tconst current = engine.tree.current(preset)\n\t\t\tif (!current) return\n\n\t\t\tconst spreadablePadding = current.textBackgroundPadding ?? BackgroundStyles.defaults.textBackgroundPadding\n\t\t\tconst newPadding = isUndefined(textBackgroundPadding)\n\t\t\t\t? undefined\n\t\t\t\t: { ...spreadablePadding, ...textBackgroundPadding }\n\t\t\tcurrent.set({ textBackgroundPadding: newPadding })\n\t\t},\n\t\t[preset],\n\t)\n\n\treturn (\n\t\t<TextBackgroundPaddingRow\n\t\t\tvalue={preset.textBackgroundPadding ?? BackgroundStyles.defaults.textBackgroundPadding}\n\t\t\tonChange={changeTextBackgroundPadding}\n\t\t\tsupportsDelete={deleteEnabled}\n\t\t/>\n\t)\n}\n", "import { isString } from \"@framerjs/fresco/src/components/utils/typeCheck\"\nimport { isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { TextStrokeColor, TextStrokeWidth } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { textStyleDefaults } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport React from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { PopoutButtonWithPreviewSuggestion } from \"../../shared/PopoutButtonWithPreviewSuggestion.tsx\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\nimport { TextStrokePopoutButton } from \"./TextStrokePopoutButton.tsx\"\n\ninterface Props {\n\tnodeIds?: NodeID[]\n\ttextStrokeWidth: Reduced<TextStrokeWidth | undefined>\n\ttextStrokeColor: Reduced<TextStrokeColor | undefined>\n\tsupportsCopyPaste?: boolean\n\tisPreset?: boolean\n\tonChange: ({\n\t\ttextStrokeWidth,\n\t\ttextStrokeColor,\n\t}: {\n\t\ttextStrokeWidth: TextStrokeWidth\n\t\ttextStrokeColor: TextStrokeColor\n\t}) => void\n\tonDelete?: () => void\n\tonAdd?: () => void\n}\n\nexport function hasTextStrokeRow(\n\ttextStrokeWidth: Reduced<TextStrokeWidth | undefined>,\n\ttextStrokeColor: Reduced<TextStrokeColor | undefined>,\n) {\n\tif (!isFoundAndNotUndefined(textStrokeWidth) || !isFoundAndNotUndefined(textStrokeColor)) return false\n\tif (isString(textStrokeWidth) && textStrokeWidth === textStyleDefaults.textStrokeWidth) return false\n\tif (isString(textStrokeColor) && textStrokeColor === textStyleDefaults.textStrokeColor) return false\n\treturn true\n}\n\nexport const TextStrokeRow = React.memo(function TextStrokeRow({\n\tnodeIds,\n\ttextStrokeWidth,\n\ttextStrokeColor,\n\tsupportsCopyPaste = false,\n\tisPreset = false,\n\tonChange,\n\tonDelete,\n\tonAdd,\n}: Props) {\n\tconst canCopyTextStroke =\n\t\tsupportsCopyPaste && isClipboardSupported() && !isMixed(textStrokeWidth) && !isMixed(textStrokeColor)\n\n\tconst [canPasteTextStroke, pasteTextStroke, copyTextStroke] = useCopyAndPasteSingleProperty(\n\t\tTraitType.TextStroke,\n\t\tnodeIds,\n\t\tcanCopyTextStroke,\n\t)\n\n\tconst previewSuggestionVisible =\n\t\tisPreset &&\n\t\ttextStrokeWidth === textStyleDefaults.textStrokeWidth &&\n\t\ttextStrokeColor === textStyleDefaults.textStrokeColor\n\n\treturn (\n\t\t<PanelRow\n\t\t\ttitle=\"Stroke\"\n\t\t\ttraitTypes={[TraitType.TextStroke]}\n\t\t\tcopyEnabled={canCopyTextStroke}\n\t\t\tonCopy={supportsCopyPaste ? copyTextStroke : undefined}\n\t\t\tpasteEnabled={canPasteTextStroke}\n\t\t\tonPaste={supportsCopyPaste ? pasteTextStroke : undefined}\n\t\t\tonDelete={isPreset ? undefined : onDelete}\n\t\t>\n\t\t\t{previewSuggestionVisible ? (\n\t\t\t\t<PopoutButtonWithPreviewSuggestion type=\"stroke\" onClick={onAdd} />\n\t\t\t) : (\n\t\t\t\t<TextStrokePopoutButton\n\t\t\t\t\tstrokeColor={textStrokeColor}\n\t\t\t\t\tstrokeWidth={textStrokeWidth}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonDelete={isPreset ? onDelete : undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PanelRow>\n\t)\n})\n", "import { NumberInputWithTickerAndStepper, Stack } from \"@framerjs/fresco\"\nimport { dimensions } from \"@framerjs/fresco/tokens\"\nimport { isMixed } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport engine from \"document/engine.ts\"\nimport type { TextStrokeColor, TextStrokeWidth } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFound } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\nimport { ColorPopoutButton } from \"../../shared/ColorPicker/ColorPopoutButton.tsx\"\nimport { useBackgroundCSSString } from \"../../shared/ColorPicker/FillPopoutButton.tsx\"\nimport { colorFillDisplayValue } from \"../../shared/ColorPicker/utils.ts\"\nimport { PopoutButtonBackgroundPreview } from \"../../shared/PopoutButtonBackgroundPreview.tsx\"\nimport { PopoutButtonWithPreview } from \"../../shared/PopoutButtonWithPreview.tsx\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ninterface TextStrokePopoutButtonProps {\n\tstrokeWidth: Reduced<TextStrokeWidth | undefined>\n\tstrokeColor: Reduced<TextStrokeColor | undefined>\n\tonChange: ({\n\t\ttextStrokeWidth,\n\t\ttextStrokeColor,\n\t}: Partial<{\n\t\ttextStrokeWidth: TextStrokeWidth\n\t\ttextStrokeColor: TextStrokeColor\n\t}>) => void\n\tonDelete?: () => void\n}\n\nexport const textStrokePopoutId = \"text-stroke\"\n\nexport function TextStrokePopoutButton({ strokeColor, strokeWidth, onChange, onDelete }: TextStrokePopoutButtonProps) {\n\tconst title =\n\t\tisMixed(strokeColor) || isMixed(strokeWidth) ? Dictionary.Mixed : colorFillDisplayValue(strokeColor, engine).title\n\tconst backgroundPreviewColor = useBackgroundCSSString(isString(strokeColor) ? strokeColor : \"\", {\n\t\tcurrentType: \"color\",\n\t})\n\n\treturn (\n\t\t<PopoutButtonWithPreview\n\t\t\tid={textStrokePopoutId}\n\t\t\tpopout={<TextStrokePopout strokeColor={strokeColor} strokeWidth={strokeWidth} onChange={onChange} />}\n\t\t\tnavigationTitle=\"Stroke\"\n\t\t\ttitle={title}\n\t\t\tdisplayDivider\n\t\t\tpreview={<PopoutButtonBackgroundPreview background={backgroundPreviewColor} />}\n\t\t\tonDelete={onDelete}\n\t\t/>\n\t)\n}\n\ntype TextStrokePopoutProps = Pick<TextStrokePopoutButtonProps, \"strokeColor\" | \"strokeWidth\" | \"onChange\">\n\nfunction TextStrokePopout({ strokeColor, strokeWidth, onChange }: TextStrokePopoutProps) {\n\tif (!isFound(strokeWidth) || !isFound(strokeColor)) return null\n\n\tconst onStrokeColorChange = engine.scheduler.wrapHandler((value: string) => {\n\t\tonChange({ textStrokeColor: value })\n\t})\n\n\tconst onStrokeWidthChange = engine.scheduler.wrapHandler((value: number) => {\n\t\tonChange({ textStrokeWidth: value })\n\t})\n\n\treturn (\n\t\t<Stack\n\t\t\tgap={0}\n\t\t\tpadding={dimensions.css.popoverPadding}\n\t\t\tpaddingTop={dimensions.css.inputSpacing}\n\t\t\tpaddingBottom={dimensions.css.inputSpacing}\n\t\t>\n\t\t\t<PanelRow title=\"Color\">\n\t\t\t\t<ColorPopoutButton navigationTitle=\"Color\" value={strokeColor} onChange={onStrokeColorChange} />\n\t\t\t</PanelRow>\n\t\t\t<PanelRow title=\"Width\">\n\t\t\t\t<NumberInputWithTickerAndStepper value={strokeWidth} onChange={onStrokeWidthChange} defaultValue={0} min={0} />\n\t\t\t</PanelRow>\n\t\t</Stack>\n\t)\n}\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type {\n\tTextStrokeColor,\n\tTextStrokeWidth,\n\tWithTextStyle,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport {\n\ttextStrokeColorAddedDefault,\n\ttextStrokeWidthAddedDefault,\n\ttextStyleDefaults,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { TextStrokeRow } from \"../TextStrokeRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextStyle\n}\n\nexport function StylePresetTextStrokeRow({ preset }: Props) {\n\tconst changeTextStroke = engine.scheduler.wrapHandler(\n\t\t({ textStrokeWidth, textStrokeColor }: { textStrokeWidth: TextStrokeWidth; textStrokeColor: TextStrokeColor }) => {\n\t\t\tif (!isUndefined(textStrokeWidth)) {\n\t\t\t\tengine.tree.current(preset)?.set({ textStrokeWidth })\n\t\t\t}\n\t\t\tif (!isUndefined(textStrokeColor)) {\n\t\t\t\tengine.tree.current(preset)?.set({ textStrokeColor })\n\t\t\t}\n\t\t},\n\t)\n\n\tconst addTextStroke = engine.scheduler.wrapHandler(() => {\n\t\tchangeTextStroke({\n\t\t\ttextStrokeWidth: textStrokeWidthAddedDefault,\n\t\t\ttextStrokeColor: textStrokeColorAddedDefault,\n\t\t})\n\t})\n\n\tconst removeTextStroke = engine.scheduler.wrapHandler(() => {\n\t\tchangeTextStroke({\n\t\t\ttextStrokeWidth: textStyleDefaults.textStrokeWidth,\n\t\t\ttextStrokeColor: textStyleDefaults.textStrokeColor,\n\t\t})\n\t})\n\n\treturn (\n\t\t<TextStrokeRow\n\t\t\tisPreset\n\t\t\ttextStrokeWidth={preset.textStrokeWidth}\n\t\t\ttextStrokeColor={preset.textStrokeColor}\n\t\t\tonChange={changeTextStroke}\n\t\t\tonAdd={addTextStroke}\n\t\t\tonDelete={removeTextStroke}\n\t\t/>\n\t)\n}\n", "import { SegmentedControl, SegmentedControlItem } from \"@framerjs/fresco\"\nimport { isMixed } from \"@framerjs/shared\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { Reduced } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport { isFoundAndNotMixed, isFoundAndNotUndefined } from \"document/models/CanvasTree/traits/utils/Reduced.ts\"\nimport React from \"react\"\nimport { isClipboardSupported } from \"utils/clipboard/clipboard.ts\"\nimport { useCopyAndPasteSingleProperty } from \"../panels/utils/useCopyAndPasteSingleProperty.ts\"\nimport { doubleColumn } from \"../utils/doubleColumn.ts\"\nimport { PanelRow } from \"./PanelRow.tsx\"\n\ninterface Props {\n\ttextWrapBalance: Reduced<boolean | undefined>\n\tnodeIds?: NodeID[]\n\tisPreset?: boolean\n\tonChange: (value: boolean) => void\n\tonDelete?: () => void\n}\n\nexport function hasTextWrapBalanceRow(textWrapBalance: Reduced<boolean | undefined>) {\n\treturn isMixed(textWrapBalance) || isFoundAndNotUndefined(textWrapBalance)\n}\n\nconst traitTypes = [TraitType.TextWrapBalance]\n\nexport const TextWrapBalanceRow = React.memo(\n\t({ nodeIds, textWrapBalance, isPreset = false, onChange, onDelete }: Props) => {\n\t\tconst canCopyTextWrapBalance = isClipboardSupported() && !isMixed(textWrapBalance)\n\n\t\tconst [canPasteTextWrapBalance, pasteTextWrapBalance, copyTextWrapBalance] = useCopyAndPasteSingleProperty(\n\t\t\tTraitType.TextWrapBalance,\n\t\t\tnodeIds,\n\t\t\tcanCopyTextWrapBalance,\n\t\t)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<PanelRow\n\t\t\t\t\ttitle=\"Balance\"\n\t\t\t\t\ttraitTypes={traitTypes}\n\t\t\t\t\tcopyEnabled={canCopyTextWrapBalance}\n\t\t\t\t\tpasteEnabled={canPasteTextWrapBalance}\n\t\t\t\t\tonCopy={isPreset ? undefined : copyTextWrapBalance}\n\t\t\t\t\tonPaste={isPreset ? undefined : pasteTextWrapBalance}\n\t\t\t\t\tonDelete={onDelete}\n\t\t\t\t>\n\t\t\t\t\t<SegmentedControl style={doubleColumn}>\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\ttitle=\"Yes\"\n\t\t\t\t\t\t\tidentifier={true}\n\t\t\t\t\t\t\tselected={Boolean(isFoundAndNotMixed(textWrapBalance) && textWrapBalance)}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SegmentedControlItem\n\t\t\t\t\t\t\ttitle=\"No\"\n\t\t\t\t\t\t\tidentifier={false}\n\t\t\t\t\t\t\tselected={isFoundAndNotMixed(textWrapBalance) && !textWrapBalance}\n\t\t\t\t\t\t\tonSelect={onChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SegmentedControl>\n\t\t\t\t</PanelRow>\n\t\t\t</>\n\t\t)\n\t},\n)\n", "import engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithTextWrapBalance } from \"document/models/CanvasTree/traits/WithTextWrapBalance.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { TextWrapBalanceRow } from \"../TextWrapBalanceRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithTextWrapBalance\n}\n\nexport function StylePresetTextWrapBalanceRow({ preset }: Props) {\n\tconst changeTextWrap = useEngineCallback(\n\t\t(textWrapBalance: boolean) => engine.tree.current(preset)?.set({ textWrapBalance }),\n\t\t[preset],\n\t)\n\n\treturn <TextWrapBalanceRow isPreset textWrapBalance={preset.textWrapBalance} onChange={changeTextWrap} />\n}\n", "import { assert } from \"@framerjs/shared\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/nodes/CanvasNode.ts\"\nimport type { WithFontVariants } from \"document/models/CanvasTree/traits/WithFontVariants.ts\"\nimport type { WithStaticTextStyle } from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport type { VariationAxisTag } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport {\n\taddEncodedAxesToSelector,\n\tcssToVariationAxes,\n\tgetFontVariableSelectorFromFont,\n\tisFontVariable,\n\tparseAxesFromFontSelector,\n\tremoveEncodedAxesFromSelector,\n\tupdateVariationAxes,\n} from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { fontStore } from \"library/index.ts\"\nimport React from \"react\"\nimport { getDefaultFontVariantsForTextStylePreset } from \"utils/textStylePresetUtils.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { VariableFontRow } from \"../VariableFontRow/VariableFontRow.tsx\"\n\ninterface Props {\n\tpreset: CanvasNode & WithStaticTextStyle & WithFontVariants\n}\n\nexport function StylePresetVariableFontRow({ preset }: Props) {\n\tconst { font } = preset\n\n\tconst [variationAxes, fontSelector] = React.useMemo(() => {\n\t\tif (isUndefined(font)) return [{}, undefined]\n\n\t\tconst { axesCSS } = parseAxesFromFontSelector(font)\n\t\tconst axes = isUndefined(axesCSS) ? {} : (cssToVariationAxes(axesCSS) ?? {})\n\n\t\tconst selector = removeEncodedAxesFromSelector(font)\n\n\t\treturn [axes, selector]\n\t}, [font])\n\n\tconst fontSelectorSet = React.useMemo(() => new Set(fontSelector ? [fontSelector] : []), [fontSelector])\n\n\tconst onChange = useEngineCallback(\n\t\t(axisTag: VariationAxisTag | VariationAxisTag[], value: number | number[] | undefined) => {\n\t\t\tconst currentPreset = engine.tree.current(preset)\n\t\t\tif (!currentPreset) return\n\n\t\t\tconst currentFont = fontStore.getFontBySelector(fontSelector)\n\t\t\tif (!currentFont) return\n\n\t\t\tlet selector: string | undefined = currentFont.selector\n\t\t\tif (!isFontVariable(currentFont)) {\n\t\t\t\tconst varFontSelector = getFontVariableSelectorFromFont(currentFont)\n\t\t\t\tassert(varFontSelector, \"Font does not have a variable selector.\")\n\t\t\t\tselector = varFontSelector\n\t\t\t}\n\n\t\t\tconst axes = updateVariationAxes(axisTag, value, variationAxes)\n\t\t\tif (isUndefined(axes)) return\n\n\t\t\tconst selectorWithAxes = addEncodedAxesToSelector(selector, axes)\n\n\t\t\tcurrentPreset.set({\n\t\t\t\tfont: selectorWithAxes,\n\t\t\t\tfontBold: selectorWithAxes,\n\t\t\t\tfontBoldItalic: selectorWithAxes,\n\t\t\t\tfontItalic: selectorWithAxes,\n\t\t\t})\n\t\t},\n\t\t[fontSelector, preset, variationAxes],\n\t)\n\n\tconst deleteVariationAxes = useEngineCallback(() => {\n\t\tif (isUndefined(preset.font)) return\n\t\tconst currentPreset = engine.tree.current(preset)\n\t\tcurrentPreset?.set(getDefaultFontVariantsForTextStylePreset(fontStore, preset.font, false))\n\t}, [preset])\n\n\tif (!fontSelector) return null\n\n\treturn (\n\t\t<VariableFontRow\n\t\t\tisPreset\n\t\t\tfonts={fontSelectorSet}\n\t\t\tvariationAxesValues={variationAxes}\n\t\t\tonChange={onChange}\n\t\t\tonDelete={deleteVariationAxes}\n\t\t/>\n\t)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { getTextStylePresetBreakpointsFromTree } from \"./getTextStylePresetBreakpoints.ts\"\n\nexport function useTextStylePresetBreakpoints(preset: TextStylePresetNode) {\n\treturn useDeprecatedEngineState(\n\t\tEngineChange.Tree,\n\t\t() => getTextStylePresetBreakpointsFromTree(engine.tree, preset),\n\t\tpreset.id,\n\t)\n}\n", "import type { MenuItemOptions } from \"app/menu.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { duplicateEntityReferenceNode } from \"document/models/CanvasTree/nodes/utils/entityReferenceNode.ts\"\nimport { isRichTextNode, isTextStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { canDeleteStylePreset } from \"utils/stylePresetUtils.ts\"\nimport { createTextStylePreset } from \"utils/textStylePresetUtils.ts\"\nimport { isNull } from \"utils/typeChecks.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { FindNodesType, QuickActionsCategoryType } from \"../../QuickActions/types.ts\"\nimport type { AssetReferencePopoutContentProps } from \"../../assets/types.ts\"\nimport { EditTextStylePresetPopout } from \"../panels/EditTextStylePresetPopout.tsx\"\nimport { getTextStylePresetBreakpointOverridesFromTree } from \"../panels/utils/getTextStylePresetBreakpoints.ts\"\nimport type { ContextMenuOptions } from \"./presetRowProps.ts\"\nimport { removePresetNode } from \"./removePresetNode.ts\"\n\nexport function createTextItemContextMenuItems(id: NodeID, options: ContextMenuOptions) {\n\tconst node = engine.tree.get<TextStylePresetNode>(id)\n\tif (isNull(node)) return []\n\tif (!isTextStylePresetNode(node)) return []\n\n\treturn createContextMenuItems(node, options)\n}\n\nfunction createContextMenuItems(\n\tpreset: TextStylePresetNode,\n\t{ startRenaming, hasSearch }: ContextMenuOptions,\n): MenuItemOptions[] {\n\tconst isViewOnly = getIsViewOnly(engine, \"canDesign\")\n\n\tconst listNode = PresetsListNode.ensure(engine.tree)\n\tconst presets = listNode.getTextStylePresets()\n\n\tconst changeTextWithTag = engine.scheduler.wrapHandler(() => {\n\t\tfor (const child of engine.stores.scopeStore.active.walk()) {\n\t\t\tif (!isRichTextNode(child)) continue\n\t\t\tchild.setTextStylePreset(preset, false, true)\n\t\t}\n\t})\n\n\tfunction duplicatePreset() {\n\t\tcreateTextStylePreset(engine, preset.tag, {\n\t\t\tname: preset.getName(),\n\t\t\ttextStyle: preset.getTextStyle(),\n\t\t\tbreakpointOverrides: getTextStylePresetBreakpointOverridesFromTree(engine.tree, preset),\n\t\t\tonCreate(newPreset) {\n\t\t\t\tduplicateEntityReferenceNode(engine, preset.id, newPreset.id)\n\t\t\t},\n\t\t})\n\t}\n\n\tfunction replacePreset() {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.ReplaceTextStylePreset,\n\t\t\tsource: \"properties\",\n\t\t\tpresetId: preset.id,\n\t\t})\n\t}\n\n\tfunction findNodes() {\n\t\tengine.stores.modalStore.set({\n\t\t\ttype: ModalType.QuickActions,\n\t\t\tsource: \"styles_panel\",\n\t\t\tinitialCategory: {\n\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\toptions: {\n\t\t\t\t\ttype: FindNodesType.StylePreset,\n\t\t\t\t\ttitle: preset.getName(),\n\t\t\t\t\tpresetId: preset.id,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\treturn [\n\t\t{\n\t\t\tlabel: `Apply to All ${preset.tag.toUpperCase()}s`,\n\t\t\tclick: changeTextWithTag,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Replace\",\n\t\t\tclick: replacePreset,\n\t\t\tvisible: presets.length > 1,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\ttype: \"separator\",\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Find\",\n\t\t\tclick: findNodes,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Rename\",\n\t\t\tclick: startRenaming,\n\t\t\tenabled: !isViewOnly,\n\t\t\tvisible: !hasSearch,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Duplicate\",\n\t\t\tclick: duplicatePreset,\n\t\t\tenabled: !isViewOnly,\n\t\t},\n\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\tclick: () => removePresetNode(engine, preset.id),\n\t\t\tenabled: !isViewOnly && canDeleteStylePreset(engine.stores.treeStore, preset),\n\t\t},\n\t]\n}\n\nexport function TextStylePresetPopoutContent({ referenceItemId }: AssetReferencePopoutContentProps) {\n\tconst node = useEngineState(\n\t\t() => {\n\t\t\treturn engine.tree.get<TextStylePresetNode>(referenceItemId)\n\t\t},\n\t\t[referenceItemId],\n\t\t[EngineChange.Tree],\n\t)\n\tif (isNull(node) || !isTextStylePresetNode(node)) return null\n\n\treturn <EditTextStylePresetPopout preset={node} />\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode, NodeID, RichTextNode } from \"document/models/CanvasTree/index.ts\"\nimport { TextEntityTypeRootNode } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport type { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { isAnyTextNode } from \"document/models/CanvasTree/nodes/utils/isAnyTextNode.ts\"\nimport {\n\tisRichTextNode,\n\tisTextStylePresetNode,\n\tisTextStylePresetPrimaryNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { RichTextTag } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport { getRichTextTagName, richTextTags } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport { useEngineCallback } from \"document/useEngineCallback.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { migrateTextNodes } from \"document/utils/migrateTextToRichTextNode.ts\"\nimport { createTextStylePreset } from \"utils/textStylePresetUtils.ts\"\nimport { isNull, isUndefined } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { getTextStylePresetDescription } from \"../../assets/utils/getTextStylePresetDescription.ts\"\nimport { usePresetAssetRows } from \"../../assets/utils/usePresetAssetRows.ts\"\nimport { createTextItemContextMenuItems } from \"../utils/getTextStylePresetRowProps.tsx\"\nimport { EditTextStylePresetPopout } from \"./EditTextStylePresetPopout.tsx\"\nimport type { EditStyleEntityAssetPopoutProps } from \"./SelectStyleEntityAssetPopoutContent.tsx\"\nimport { SelectStyleEntityAssetPopoutContent } from \"./SelectStyleEntityAssetPopoutContent.tsx\"\n\nfunction isTextStylePrimaryWithTag(tag: RichTextTag | undefined) {\n\treturn (node: CanvasNode) => isTextStylePresetPrimaryNode(node) && (isUndefined(tag) || node.tag === tag)\n}\n\ninterface SelectTextStyleEntityAssetPopoutProps {\n\tnodeIds: string[]\n\tselectedIds: Set<string | undefined>\n\ttag?: RichTextTag\n}\n\nexport function SelectTextStyleEntityAssetPopout({ nodeIds, selectedIds, tag }: SelectTextStyleEntityAssetPopoutProps) {\n\tconst { rows, hasAnyItems, hasUnreferencedItems, typeRootId, searchValue, setSearchValue, hasSearch } =\n\t\tusePresetAssetRows(\n\t\t\t() => PresetsListNode.getNodes(engine.tree),\n\t\t\t() => TextEntityTypeRootNode.get(engine.tree),\n\t\t\tid => {\n\t\t\t\tconst reference = engine.tree.getNodeWithTrait(id, isTextStylePresetNode)\n\t\t\t\tif (!reference) return\n\t\t\t\treturn {\n\t\t\t\t\tdescription: getTextStylePresetDescription(reference),\n\t\t\t\t} as const\n\t\t\t},\n\t\t\tisTextStylePrimaryWithTag(tag),\n\t\t)\n\n\tconst handleCreateTextStyle = useEngineCallback(\n\t\t(event: React.MouseEvent) => {\n\t\t\tif (tag) {\n\t\t\t\tcreateTextStylePreset(engine, tag, {\n\t\t\t\t\tonCreate(preset) {\n\t\t\t\t\t\tselectTextStylePreset(nodeIds, preset)\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst singleRichTextNode = getSingleRichTextNode(nodeIds)\n\t\t\tconst textStyle = singleRichTextNode && getTextStyleFromRichTextNode(singleRichTextNode)\n\n\t\t\tengine.stores.contextMenuStore.show(\n\t\t\t\trichTextTags.map(selectedTag => ({\n\t\t\t\t\tlabel: getRichTextTagName(selectedTag),\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tcreateTextStylePreset(engine, selectedTag, {\n\t\t\t\t\t\t\ttextStyle,\n\t\t\t\t\t\t\tonCreate(preset) {\n\t\t\t\t\t\t\t\tselectTextStylePreset(nodeIds, preset)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t})),\n\t\t\t\t{ location: { x: event.clientX, y: event.clientY } },\n\t\t\t)\n\t\t},\n\t\t[nodeIds, tag],\n\t)\n\n\tconst handleSelect = useEngineCallback(\n\t\t(id: NodeID) => {\n\t\t\tconst preset = engine.tree.get<TextStylePresetNode>(id)\n\t\t\tif (isNull(preset)) return\n\n\t\t\tselectTextStylePreset(nodeIds, preset)\n\t\t},\n\t\t[nodeIds],\n\t)\n\n\treturn (\n\t\t<SelectStyleEntityAssetPopoutContent\n\t\t\trows={rows}\n\t\t\thasAnyItems={hasAnyItems}\n\t\t\thasUnreferencedItems={hasUnreferencedItems}\n\t\t\ttypeRootId={typeRootId}\n\t\t\tsearchValue={searchValue}\n\t\t\tsetSearchValue={setSearchValue}\n\t\t\thasSearch={hasSearch}\n\t\t\tselectedIds={selectedIds}\n\t\t\tPopout={EditTextStyleEntityAssetPopout}\n\t\t\tcreateItemContextMenuItems={createTextItemContextMenuItems}\n\t\t\tonCreate={handleCreateTextStyle}\n\t\t\tonSelect={handleSelect}\n\t\t/>\n\t)\n}\n\nfunction EditTextStyleEntityAssetPopout({ id }: EditStyleEntityAssetPopoutProps) {\n\tconst preset = useEngineState(() => engine.tree.get<TextStylePresetNode>(id), [], EngineChange.Tree)\n\n\tif (isNull(preset)) return null\n\n\treturn <EditTextStylePresetPopout preset={preset} />\n}\n\nexport const selectTextStylePreset = engine.scheduler.wrapHandler((nodeIds: string[], preset: TextStylePresetNode) => {\n\tconst anyTextNodes = engine.tree.getNodesWithTrait(nodeIds, isAnyTextNode)\n\tconst richTextNodes = migrateTextNodes(engine, anyTextNodes)\n\n\tfor (const node of richTextNodes) {\n\t\tnode.setTextStylePreset(preset, true)\n\t\tnode.setNodeTextStylePreset(preset)\n\t}\n\n\trecord(\"styles_preset_add\", {\n\t\ttag: preset.tag,\n\t\tname: preset.getName(),\n\t\tid: preset.id,\n\t})\n\n\tengine.stores.selectionStore.set(richTextNodes)\n})\n\nfunction getSingleRichTextNode(nodeIds: string[]) {\n\tif (nodeIds.length > 1) return\n\n\tconst [nodeId] = nodeIds\n\tconst node = engine.tree.get(nodeId)\n\tif (!node || !isRichTextNode(node)) return\n\n\treturn node\n}\n\nfunction getTextStyleFromRichTextNode(node: RichTextNode) {\n\tconst [presetId] = node.getTextStylePresets(true)\n\n\tif (presetId) {\n\t\tconst presetNode = engine.tree.getNodeWithTrait(presetId, isTextStylePresetPrimaryNode)\n\n\t\tif (presetNode) {\n\t\t\treturn presetNode.getTextStyle()\n\t\t}\n\t}\n\n\treturn node.getTextStyle(true)\n}\n", "import { unhandledError } from \"@framerjs/shared\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useEffect, useState } from \"react\"\nimport type { ComponentWithPreset } from \"utils/getComponentsWithPresets.ts\"\nimport {\n\tgetHardCodedComponentsWithPresets,\n\tgetProjectComponentsWithPresets,\n\tmergeComponentsWithPresets,\n} from \"utils/getComponentsWithPresets.ts\"\n\n/** Returns all modules with the `framerComponentPresetProps` annotation. */\nexport function useComponentsWithPresets() {\n\tconst [hardCodedComponents, setHardCodedComponents] = useState<ComponentWithPreset[]>()\n\n\tuseEffect(() => {\n\t\tlet isCancelled = false\n\n\t\tgetHardCodedComponentsWithPresets(engine).then(\n\t\t\tvalue => {\n\t\t\t\tif (isCancelled) return\n\t\t\t\tsetHardCodedComponents(value)\n\t\t\t},\n\t\t\terror => {\n\t\t\t\tunhandledError(error)\n\t\t\t\tsetHardCodedComponents([])\n\t\t\t},\n\t\t)\n\n\t\treturn () => {\n\t\t\tisCancelled = true\n\t\t}\n\t}, [])\n\n\treturn useDeprecatedEngineState(\n\t\tEngineChange.Tree,\n\t\t() => {\n\t\t\tconst projectComponents = getProjectComponentsWithPresets(engine)\n\t\t\tif (!hardCodedComponents) return projectComponents\n\n\t\t\treturn mergeComponentsWithPresets(hardCodedComponents, projectComponents)\n\t\t},\n\t\t[hardCodedComponents],\n\t)\n}\n", "import type { DataDefinition } from \"@framerjs/framer-runtime\"\nimport { emptyArray } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport { getWebPagePath } from \"document/components/utils/getWebPagePath.ts\"\nimport { getWebPageDisplayTitle } from \"document/components/utils/webPageTitles.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isDesignPageNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\nimport { useNestedQuickActionsCache, useQuickActionsCache } from \"./useQuickActionCache.ts\"\n\nconst webPageGroupAliases: Lowercase<string>[] = [\"/\", \"web\"]\nconst cmsPageItemAliases: Lowercase<string>[] = [\"cms\"]\n\n/** Actions for navigating between web pages, canvas pages, and smart components. */\nexport function useCanvasScopeQuickActions(): readonly QuickActionsGroup[] {\n\tconst [getCachedAction, setCachedAction] = useQuickActionsCache<CanvasNode>()\n\tconst [getCachedCollectionPageAction, setCachedCollectionPageAction] = useNestedQuickActionsCache<\n\t\tCanvasNode,\n\t\tDataDefinition\n\t>()\n\n\treturn useDeprecatedEngineState<readonly QuickActionsGroup[]>(\n\t\t[\n\t\t\tengine.stores.scopeStore,\n\t\t\tengine.stores.contentManagementStore,\n\t\t\tengine.stores.chromeStore,\n\t\t\tengine.stores.loadingStore,\n\t\t\tEngineChange.Tree,\n\t\t\tEngineChange.ActiveBundle,\n\t\t],\n\t\t() => {\n\t\t\tconst isProjectReady = engine.stores.loadingStore.isReady\n\t\t\tif (!isProjectReady) return emptyArray()\n\n\t\t\tconst canvasScopeActionGroups: QuickActionsGroup[] = []\n\n\t\t\t// We don't allow navigating away from creating a new collection item.\n\t\t\tif (engine.stores.contentManagementStore.hasAnyPrivateDraftCollectionItem()) {\n\t\t\t\treturn canvasScopeActionGroups\n\t\t\t}\n\n\t\t\tconst isCanvasVisible = engine.stores.chromeStore.mainView === ActiveMainView.Canvas\n\t\t\tconst activeScopeId = isCanvasVisible ? engine.stores.scopeStore.active.id : null\n\n\t\t\tconst type = QuickActionsType.CanvasScope\n\t\t\tconst webPages: QuickActionsItem[] = []\n\t\t\tconst collectionPages: QuickActionsItem[] = []\n\t\t\tconst designPages: QuickActionsItem[] = []\n\t\t\tconst root = engine.tree.root\n\n\t\t\tfor (const node of root.children) {\n\t\t\t\tconst { id } = node\n\n\t\t\t\t// Exclude active scope from search results\n\t\t\t\tif (id === activeScopeId) continue\n\n\t\t\t\tif (isWebPageNode(node)) {\n\t\t\t\t\t// Exclude A/B testing variant pages\n\t\t\t\t\tif (node.abTestingParentId) continue\n\n\t\t\t\t\tif (node.dataIdentifier) {\n\t\t\t\t\t\tconst data = engine.componentLoader.dataForIdentifier(node.dataIdentifier)\n\t\t\t\t\t\tif (!data) continue\n\n\t\t\t\t\t\tconst cached = getCachedCollectionPageAction(node, data)\n\t\t\t\t\t\tif (cached) {\n\t\t\t\t\t\t\tcollectionPages.push(cached)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst name = getWebPageDisplayTitle(engine.tree, node, data)\n\t\t\t\t\t\tconst aliases = [...cmsPageItemAliases]\n\t\t\t\t\t\tconst path = getWebPagePath(engine.tree, node)\n\t\t\t\t\t\tif (path) aliases.push(path.toLowerCase() as Lowercase<string>)\n\n\t\t\t\t\t\tconst item: QuickActionsItem = { kind: \"item\", type, id, name, aliases }\n\t\t\t\t\t\tsetCachedCollectionPageAction(node, data, item)\n\t\t\t\t\t\tcollectionPages.push(item)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cached = getCachedAction(node)\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\twebPages.push(cached)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst name = getWebPageDisplayTitle(engine.tree, node, null)\n\t\t\t\t\tconst item: QuickActionsItem = { kind: \"item\", type, id, name }\n\t\t\t\t\tsetCachedAction(node, item)\n\t\t\t\t\twebPages.push(item)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst name = node.resolveValue(\"name\")\n\t\t\t\tif (isDesignPageNode(node) && name) {\n\t\t\t\t\tconst cached = getCachedAction(node)\n\t\t\t\t\tif (cached) {\n\t\t\t\t\t\tdesignPages.push(cached)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tconst item: QuickActionsItem = { kind: \"item\", type, id, name }\n\t\t\t\t\tsetCachedAction(node, item)\n\t\t\t\t\tdesignPages.push(item)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst allWebPageItems = [...webPages, ...collectionPages]\n\t\t\tif (allWebPageItems.length) {\n\t\t\t\tcanvasScopeActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype,\n\t\t\t\t\ttitle: \"Go to Page\",\n\t\t\t\t\titems: allWebPageItems,\n\t\t\t\t\taliases: webPageGroupAliases,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (designPages.length) {\n\t\t\t\tcanvasScopeActionGroups.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype,\n\t\t\t\t\ttitle: `Go to ${Dictionary.Design} Page`,\n\t\t\t\t\titems: designPages,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn canvasScopeActionGroups\n\t\t},\n\t\t[getCachedAction, setCachedAction, getCachedCollectionPageAction, setCachedCollectionPageAction],\n\t\ttrue,\n\t)\n}\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport { useMemo } from \"react\"\nimport { getAcceleratorTokens } from \"web/pages/project/lib/getAcceleratorLabel.ts\"\nimport type { QuickActionsGroup, QuickActionsGroupType } from \"../types.ts\"\nimport { QuickActionsCategoryType, QuickActionsGroupSpecificType, QuickActionsType } from \"../types.ts\"\nimport { getShortcutListForAppAction } from \"./getShortcutListForRole.ts\"\n\nconst teamLibraryCategory: QuickActionsGroup = {\n\tkind: \"group\",\n\ttype: QuickActionsCategoryType.TeamLibrary,\n\ttitle: Dictionary.Workspace,\n\titems: [\n\t\t{\n\t\t\tkind: \"item\",\n\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\tid: QuickActionsCategoryType.TeamLibrary,\n\t\t\tname: \"Browse Library\",\n\t\t\ticon: \"IconTeamLibraryCategory\",\n\t\t\tshortcut: getShortcutListForAppAction(\"toggleLibraryModal\"),\n\t\t\tcategory: { type: QuickActionsCategoryType.TeamLibrary },\n\t\t},\n\t],\n}\n\nconst codeImportCategory: QuickActionsGroup = {\n\tkind: \"group\",\n\ttype: QuickActionsCategoryType.CodeImport,\n\ttitle: \"Code Import\",\n\titems: [\n\t\t{\n\t\t\tkind: \"item\",\n\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\tid: QuickActionsCategoryType.CodeImport,\n\t\t\tname: \"Import Component\u2026\",\n\t\t\ticon: \"IconCode\",\n\t\t\tshortcut: getAcceleratorTokens(\"CommandOrControl+I\"),\n\t\t\tcategory: { type: QuickActionsCategoryType.CodeImport },\n\t\t},\n\t],\n}\n\nexport function useCategories(\n\tscopeType: ScopeType,\n\tmainView: ActiveMainView,\n\tisViewOnly: boolean,\n\tisPreviewingLocaleOnCanvas: boolean,\n) {\n\treturn useMemo(() => {\n\t\tif (isViewOnly || isPreviewingLocaleOnCanvas) return []\n\t\tif (mainView === ActiveMainView.CodeEditor) return [codeImportCategory]\n\t\tif (\n\t\t\tscopeType === ScopeType.WebPage ||\n\t\t\tscopeType === ScopeType.SmartComponent ||\n\t\t\tscopeType === ScopeType.CanvasPage ||\n\t\t\tscopeType === ScopeType.DesignPage\n\t\t) {\n\t\t\treturn [teamLibraryCategory]\n\t\t}\n\t\treturn []\n\t}, [scopeType, mainView, isViewOnly, isPreviewingLocaleOnCanvas])\n}\n\nexport function useFilterActionGroupsByCategory(\n\tcategory: QuickActionsCategoryType,\n\tgroups: readonly QuickActionsGroup[],\n): {\n\tgroups: readonly QuickActionsGroup[]\n} {\n\tconst filteredGroups = useMemo(() => {\n\t\tif (category === QuickActionsCategoryType.Default) return groups\n\t\tconst actionsTypeForCategory = categoryToActionTypes(category)\n\t\tif (!actionsTypeForCategory) return groups\n\t\treturn groups.filter(group => actionsTypeForCategory.includes(group.type))\n\t}, [category, groups])\n\n\treturn { groups: filteredGroups }\n}\n\nfunction categoryToActionTypes(\n\tcategory: Exclude<QuickActionsCategoryType, QuickActionsCategoryType.Default>,\n): QuickActionsGroupType[] {\n\tswitch (category) {\n\t\tcase QuickActionsCategoryType.AssetStyles:\n\t\t\treturn [QuickActionsType.AssetStyles]\n\t\tcase QuickActionsCategoryType.Components:\n\t\t\treturn [QuickActionsType.Component]\n\t\tcase QuickActionsCategoryType.CodeImport:\n\t\t\treturn [QuickActionsType.CodeImport]\n\t\tcase QuickActionsCategoryType.TeamLibrary:\n\t\t\treturn [QuickActionsType.TeamLibrary]\n\t\tcase QuickActionsCategoryType.FindNodes:\n\t\t\treturn [QuickActionsType.FindNodes]\n\t\tcase QuickActionsCategoryType.LocaleScopeFilter:\n\t\t\treturn [QuickActionsType.LocaleScopeFilter]\n\t\tcase QuickActionsCategoryType.LocaleStatusFilter:\n\t\t\treturn [QuickActionsType.LocaleStatusFilter]\n\t\tcase QuickActionsCategoryType.CollectionPageItem:\n\t\t\treturn [QuickActionsType.CollectionPageItem]\n\t\tcase QuickActionsCategoryType.Plugins:\n\t\tcase QuickActionsCategoryType.ManagedCollectionPlugins:\n\t\t\treturn [\n\t\t\t\tQuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\tQuickActionsType.Plugin,\n\t\t\t\tQuickActionsGroupSpecificType.MarketplacePlugins,\n\t\t\t\tQuickActionsType.WorkspacePlugin,\n\t\t\t]\n\t\tcase QuickActionsCategoryType.WorkspacePlugins:\n\t\t\treturn [QuickActionsType.WorkspacePlugin]\n\t\tdefault:\n\t\t\tassertNever(category, \"Quick Action category does not have a matching actions type\")\n\t}\n}\n", "import { getActionAccelerator } from \"app/AppAccelerators.ts\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { getAcceleratorTokens } from \"web/pages/project/lib/getAcceleratorLabel.ts\"\n\nexport function getShortcutListForAppAction(action: AppAction | undefined): string[] | undefined {\n\tif (!action) return\n\n\tconst accelerator = getActionAccelerator(action)\n\tif (!accelerator) return\n\n\treturn getAcceleratorTokens(accelerator)\n}\n", "import { getDefaultName } from \"document/components/utils/nodes.ts\"\nimport { showCanvasNode } from \"document/components/utils/showCanvasNode.ts\"\nimport engine from \"document/engine.ts\"\nimport { type CanvasNode, type NodeID, type ShallowScopeNode, isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { parseSourceNodeFromCodeCrashLocation } from \"library/modules/code-boundary/errorMessages.ts\"\nimport { useCallback, useMemo, useState } from \"react\"\nimport type { QuickActionsGroup } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\n\nexport function goToCodeCrashSourceNode(nodeId: NodeID) {\n\tconst node = engine.tree.get(nodeId)\n\tif (!node) return\n\n\tshowCanvasNode(engine, node)\n}\n\nfunction createNodeIDSet(): ReadonlySet<NodeID> {\n\treturn new Set<NodeID>()\n}\n\n/** An action for navigating directly to a node when a code crash location (a-la code-crash:scopeId:nodeId) is typed in the search bar. */\nexport function useCodeCrashQuickActions(searchTerm: string): QuickActionsGroup[] {\n\t// The data loading approach this hook uses might seem a bit non-canonical (\u201Cwhy do we load scopes\n\t// and then rerender instead of just awaiting?\u201D \u201Cwhy do we store scopes in state, and not the loaded node?\u201D),\n\t// but the goal here is to ensure that sync vs async loading is handled correctly.\n\t//\n\t// Specifically, if\n\t// - a user types code-crash:abc123:def456, and we dispatch an async request to load scope abc123, but then\n\t// - a user types code-crash:xyz789:ooo000, and we find the node and display \u201CGo to node ooo000\u201D,\n\t// when the request from pt. 1 completes, it must not replace \u201CGo to node ooo000\u201D with \u201CGo to node abc123\u201D.\n\t//\n\t// Handling that in an effect is messy [1], so the hook achieves that by structuring the algo as a function\n\t// that depends on the only things that actually affect the UI:\n\t//   quickActions := f(searchTerm, loadedScopes)\n\t//\n\t// [1] https://github.com/framer/FramerStudio/pull/19991#discussion_r1877970812\n\tconst [loadedScopes, setLoadedScopes] = useState(createNodeIDSet)\n\tconst loadScopeAndRerender = useCallback(async (scopeNode: ShallowScopeNode) => {\n\t\tawait scopeNode.load()\n\n\t\tsetLoadedScopes(currentLoadedScopes => {\n\t\t\tif (currentLoadedScopes.has(scopeNode.id)) return currentLoadedScopes\n\n\t\t\t// This is a setState call, so we cannot modify `currentLoadedScopes` directly\n\t\t\tconst newLoadedScopes = new Set(currentLoadedScopes)\n\t\t\tnewLoadedScopes.add(scopeNode.id)\n\t\t\treturn newLoadedScopes\n\t\t})\n\t}, [])\n\n\tconst parsedSourceFromCrashLocation = useMemo(() => {\n\t\treturn parseSourceNodeFromCodeCrashLocation(searchTerm.trim())\n\t}, [searchTerm])\n\n\tconst parsedNodeID = parsedSourceFromCrashLocation?.nodeId\n\tconst parsedScopeID = parsedSourceFromCrashLocation?.scopeId\n\n\treturn useMemo((): QuickActionsGroup[] => {\n\t\t// \u201CUsing\u201D the unused `loadedScopes` dependency as this is safer than doing `biome-ignore lint/correctness/useExhaustiveDependencies`\n\t\tconst _unused = loadedScopes\n\n\t\tif (!parsedNodeID || !parsedScopeID) return []\n\n\t\tconst node: CanvasNode | null =\n\t\t\t// First, try to find the node in the specified scope, loading the scope if necessary\n\t\t\tattemptToLocateNodeByScopeIdAndNodeId(parsedScopeID, parsedNodeID, loadScopeAndRerender) ??\n\t\t\t// But if the node wasn\u2019t found in the scope, it might\u2019ve been moved into another scope.\n\t\t\t// As a last-resort attempt, try to find it in the whole tree\n\t\t\tengine.stores.treeStore.tree.get(parsedNodeID)\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.GoToCodeCrashSourceNode,\n\t\t\t\ttitle: node ? \"Show Layer By ID\" : \"Layer could not be found. It might\u2019ve been moved or deleted.\",\n\t\t\t\titems: node\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"item\",\n\t\t\t\t\t\t\t\tid: parsedNodeID,\n\t\t\t\t\t\t\t\tname: `Show Layer \u201C${node.name || getDefaultName(engine.componentLoader, node)}\u201D`,\n\t\t\t\t\t\t\t\ttype: QuickActionsType.GoToCodeCrashSourceNode,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\t},\n\t\t]\n\t}, [\n\t\tparsedNodeID,\n\t\tparsedScopeID,\n\t\tloadScopeAndRerender,\n\t\t// Intentionally recompute the memo when some new scope is loaded, to support the following scenario:\n\t\t// - A user pastes `scopeId:nodeId`\n\t\t// - We don\u2019t find the node `nodeId`, but we realize `scopeId` is not loaded\n\t\t// - We load the scope. Now we can find `nodeId` in the scope `scopeId` and would like to show it\n\t\t//   in search results\n\t\tloadedScopes,\n\t])\n}\n\nfunction attemptToLocateNodeByScopeIdAndNodeId(\n\tscopeId: string,\n\tnodeId: NodeID,\n\tloadScope: (scopeNode: ShallowScopeNode) => void,\n): CanvasNode | null {\n\tconst scope = engine.stores.treeStore.tree.get(scopeId)\n\tif (!isScopeNode(scope)) return null\n\n\tif (!scope.isLoaded()) {\n\t\tloadScope(scope)\n\t\treturn null\n\t}\n\n\treturn engine.stores.treeStore.tree.get(nodeId)\n}\n", "import type { CodeFile } from \"./CodeFile.ts\"\nimport { filename, pathJoin } from \"./utils.ts\"\n\nconst sortOptions: Intl.CollatorOptions = { numeric: true, sensitivity: \"base\" }\n\nfunction folderSort(list: Folder[]): void {\n\tlist.sort((a, b) => {\n\t\treturn a.name.localeCompare(b.name, undefined, sortOptions)\n\t})\n}\n\nfunction fileSort(list: CodeFile[]): void {\n\tlist.sort((a, b) => {\n\t\tif (a.sortName !== b.sortName) return a.sortName.localeCompare(b.sortName, undefined, sortOptions)\n\t\treturn a.path.localeCompare(b.path, undefined, sortOptions)\n\t})\n}\n\nexport class Folder {\n\tid: string\n\tname: string\n\tfolders: Folder[] = []\n\tfiles: CodeFile[] = []\n\n\t// storing the expanded state so that it is preserved when re-creating the folder after remote sync.\n\tstatic expandedCache: { [path: string]: boolean } = {}\n\n\tconstructor(\n\t\treadonly path: string,\n\t\treadonly parent?: Folder,\n\t) {\n\t\tthis.id = filename(path)\n\t\tthis.name = filename(path)\n\t\tthis._expanded = Folder.expandedCache[path] || false\n\t}\n\n\twalk(cb: (item: Folder | CodeFile, depth: number, visible: boolean) => void, depth = 0, visible = true) {\n\t\t// first, in-place sort ...\n\t\tfolderSort(this.folders)\n\t\tfileSort(this.files)\n\n\t\tconst childrenVisible = visible && this.isExpanded()\n\n\t\tthis.folders.forEach(folder => {\n\t\t\tcb(folder, depth, childrenVisible)\n\t\t\tfolder.walk(cb, depth + 1, childrenVisible)\n\t\t})\n\t\tthis.files.forEach(file => cb(file, depth, childrenVisible))\n\t}\n\n\tisEmpty(): boolean {\n\t\treturn this.folders.length === 0 && this.files.length === 0\n\t}\n\n\tprivate _expanded: boolean\n\tisExpanded(): boolean {\n\t\treturn !this.parent || this._expanded\n\t}\n\ttoggleExpanded() {\n\t\tthis._expanded = !this._expanded\n\t\tFolder.expandedCache[this.path] = this._expanded\n\t}\n\n\tgetSubFolder(name: string): Folder | undefined {\n\t\treturn this.folders.find(f => f.name === name)\n\t}\n\n\tcreateFolders(names: string[]): Folder {\n\t\tlet folder: Folder = this\n\t\tnames.forEach(name => {\n\t\t\tfolder = folder.createOrGetFolder(name)\n\t\t})\n\t\treturn folder\n\t}\n\n\tcreateOrGetFolder(name: string): Folder {\n\t\tlet sub = this.getSubFolder(name)\n\t\tif (sub) return sub\n\n\t\tconst path = pathJoin(this.path, name)\n\t\tsub = new Folder(path, this)\n\t\tthis.folders.push(sub)\n\t\treturn sub\n\t}\n\n\taddFile(file: CodeFile) {\n\t\tif (this.files.includes(file)) return\n\t\tthis.files.push(file)\n\t}\n\n\tremove() {\n\t\tif (!this.parent) return\n\t\tconst folders = this.parent.folders\n\t\tfolders.splice(folders.indexOf(this), 1)\n\t}\n\n\tremoveFile(file: CodeFile) {\n\t\tconst folders = this.getFolders(file.folders).reverse()\n\t\tconst top = folders[0]\n\t\tif (top) {\n\t\t\ttop.files.splice(top.files.indexOf(file), 1)\n\t\t}\n\t}\n\n\tgetFolder(names: string[], at = 0): Folder | undefined {\n\t\tconst name = names[at]\n\t\tif (!name) return this\n\t\tconst sub = this.folders.find(f => f.name === name)\n\t\tif (!sub) return undefined\n\t\treturn sub.getFolder(names, at + 1)\n\t}\n\n\tgetFolders(names: string[]): (Folder | undefined)[] {\n\t\tlet folder: Folder | undefined = this\n\t\tconst folders = names.map(name => {\n\t\t\tif (!folder) return undefined\n\t\t\tconst sub = folder.getSubFolder(name)\n\t\t\tif (!sub) return undefined\n\t\t\tfolder = sub\n\t\t\treturn folder\n\t\t})\n\t\tfolders.unshift(this)\n\t\treturn folders\n\t}\n\n\treset() {\n\t\tthis.folders.length = 0\n\t\tthis.files.length = 0\n\t}\n}\n", "import type { Immutable } from \"@framerjs/app-shared/src/lib/immer.ts\"\nimport { DEPENDENCIES_FILE_ID, IMPORT_MAP_FILE_ID, type LocalModuleId, ModuleType, asLocalId } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useEmployeesOnlySettingIsOn } from \"app/employeesOnlySettings.ts\"\nimport { CodeFile } from \"code-editor/CodeFile.ts\"\nimport { Folder } from \"code-editor/Folder.ts\"\nimport engine from \"document/engine.ts\"\nimport type { ModuleEntries } from \"document/stores/ModulesStore.ts\"\nimport { ActiveAssetsPanelTab, ActiveContentPanelTab } from \"document/utils/ActiveEditorType.ts\"\nimport type { DependenciesModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { useMemo } from \"react\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\n\n// Dummy Set, this state is specific to the component section and we don't really need it\nconst expandedComponentSections: ReadonlySet<string> = new Set()\n\nexport function performCodeFileAction(id: string) {\n\tconst { codeEditorStore, chromeStore } = engine.stores\n\tcodeEditorStore.currentCodeFileId = id as LocalModuleId\n\n\tchromeStore.assetsPanelTab = ActiveAssetsPanelTab.Code\n\tchromeStore.contentPanelTab = ActiveContentPanelTab.Assets\n}\n\n/** Actions for opening code files. */\nexport function useCodeFileQuickActions(): QuickActionsGroup[] {\n\tconst { localModules, dependenciesModule } = engine.stores.modulesStore.useState()\n\n\tconst { fileList } = useCodeFiles(localModules, dependenciesModule)\n\n\tconst currentCodeFileId = engine.stores.codeEditorStore.useState(state => state.currentCodeFileId)\n\n\treturn useMemo((): QuickActionsGroup[] => {\n\t\tconst items: QuickActionsItem[] = []\n\n\t\tconst addFile = (file: CodeFile) => {\n\t\t\tif (currentCodeFileId === file.id) return\n\n\t\t\titems.push({\n\t\t\t\tkind: \"item\",\n\t\t\t\ttype: QuickActionsType.CodeFile,\n\t\t\t\tid: file.id,\n\t\t\t\tname: [...file.folders, file.name],\n\t\t\t})\n\t\t}\n\n\t\tfileList.forEach(({ item }) => {\n\t\t\tif (item instanceof CodeFile) {\n\t\t\t\taddFile(item)\n\t\t\t} else {\n\t\t\t\titem.walk(subItem => {\n\t\t\t\t\tif (subItem instanceof CodeFile) {\n\t\t\t\t\t\taddFile(subItem)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tif (items.length === 0) {\n\t\t\treturn []\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.CodeFile,\n\t\t\t\ttitle: \"Open Code File\",\n\t\t\t\titems,\n\t\t\t},\n\t\t]\n\t}, [fileList, currentCodeFileId])\n}\n\ninterface FileListItem {\n\titem: Folder | CodeFile\n\tdepth: number\n\tvisible: boolean\n}\n\n// TODO: Update this to use the entity data from the tree.\nfunction useCodeFiles(\n\tlocalModules: Immutable<ModuleEntries>,\n\tdependenciesModule: DependenciesModuleEntry | undefined,\n): { fileList: FileListItem[] } {\n\tconst showImportMap = useEmployeesOnlySettingIsOn(\"showImportMap\")\n\n\t// TODO: This fileTree should perhaps be persisted in a store instead of\n\t// recreating it every time localModules changes.\n\tconst FileTree = useMemo(() => {\n\t\tconst codeModules = Array.from(localModules.values()).filter(module => module?.type === ModuleType.Code)\n\n\t\tconst root = new Folder(\"\")\n\t\tif (codeModules.length || (showImportMap && dependenciesModule)) {\n\t\t\tconst files: CodeFile[] = []\n\t\t\tfor (const module of codeModules) {\n\t\t\t\tif (!module) continue\n\t\t\t\tconst file = new CodeFile(module.localId, `${ModuleType.Code}/${module.name}`)\n\t\t\t\troot.createFolders(file.folders).addFile(file)\n\n\t\t\t\tfiles.push(file)\n\t\t\t}\n\n\t\t\tif (dependenciesModule && showImportMap) {\n\t\t\t\tconst dependenciesFolder = root.createFolders([Dictionary.Dependencies])\n\n\t\t\t\tconst dependenciesFile = new CodeFile(\n\t\t\t\t\tasLocalId(DEPENDENCIES_FILE_ID),\n\t\t\t\t\t`${ModuleType.Config}/${DEPENDENCIES_FILE_ID}`,\n\t\t\t\t)\n\t\t\t\tconst importMapFile = new CodeFile(asLocalId(IMPORT_MAP_FILE_ID), `${ModuleType.Config}/${IMPORT_MAP_FILE_ID}`)\n\n\t\t\t\tdependenciesFolder.addFile(dependenciesFile)\n\t\t\t\tdependenciesFolder.addFile(importMapFile)\n\n\t\t\t\tfiles.push(dependenciesFile)\n\t\t\t\tfiles.push(importMapFile)\n\t\t\t}\n\t\t}\n\n\t\treturn { codeModules, root }\n\t}, [localModules, dependenciesModule, showImportMap])\n\n\tconst fileList = useMemo(() => {\n\t\tconst list: FileListItem[] = []\n\t\tFileTree.root.walk((item, depth, visible) => {\n\t\t\tif (item instanceof Folder) {\n\t\t\t\tconst isExpanded = expandedComponentSections.has(item.path)\n\t\t\t\tif (item.isExpanded() !== isExpanded) item.toggleExpanded()\n\t\t\t}\n\t\t\tif (visible) {\n\t\t\t\tlist.push({ item, depth, visible: visible })\n\t\t\t}\n\t\t})\n\t\treturn list\n\t}, [FileTree])\n\n\treturn { fileList }\n}\n", "import type { Immutable } from \"@framerjs/app-shared/src/lib/immer.ts\"\nimport { ModuleType, localModuleIdentifier } from \"@framerjs/shared\"\nimport { CodeImportQuickActionsType } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { ModuleEntries } from \"document/stores/ModulesStore.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useMemo } from \"react\"\nimport type { QuickActionsCategory, QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsCategoryType, QuickActionsTintType, QuickActionsType } from \"../types.ts\"\n\n// Empty array to be used whenever there are no component actions. This\n// ensures that memoization works as expected.\nconst EMPTY_GROUPS: QuickActionsGroup[] = []\nObject.freeze(EMPTY_GROUPS)\n\nexport function useCodeImportActions(\n\tactiveCategory: QuickActionsCategory | undefined,\n\tteamLibraryGroups: readonly QuickActionsGroup[],\n): QuickActionsGroup[] {\n\tconst { localModules } = useDeprecatedEngineState([EngineChange.Tree, engine.stores.modulesStore], () => ({\n\t\tlocalModules: engine.stores.modulesStore.localModules,\n\t}))\n\n\tconst localComponentsGroups = useMemo(() => {\n\t\tif (activeCategory?.type !== QuickActionsCategoryType.CodeImport) return EMPTY_GROUPS\n\n\t\tconst localItems = localModulesToQuickActionItems(localModules)\n\t\tconst externalItems: QuickActionsItem[] = teamLibraryGroups\n\t\t\t?.flatMap(group => group.items)\n\t\t\t.map(item => {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\ttype: QuickActionsType.CodeImport,\n\t\t\t\t\tappAction: CodeImportQuickActionsType.ExternalComponent,\n\t\t\t\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\t\t\t}\n\t\t\t})\n\n\t\tconst groups: QuickActionsGroup[] = []\n\t\tif (localItems.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.CodeImport,\n\t\t\t\ttitle: \"Import Component\",\n\t\t\t\titems: localItems,\n\t\t\t})\n\t\t}\n\t\tif (externalItems.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.CodeImport,\n\t\t\t\ttitle: \"Import Workspace Components\",\n\t\t\t\titems: externalItems,\n\t\t\t})\n\t\t}\n\n\t\treturn groups.length > 0 ? groups : EMPTY_GROUPS\n\t}, [localModules, teamLibraryGroups, activeCategory])\n\n\treturn localComponentsGroups\n}\n\nfunction localModulesToQuickActionItems(localModules: Immutable<ModuleEntries>): QuickActionsItem[] {\n\tconst codeComponentActions: QuickActionsItem[] = []\n\tfor (const [_key, module] of localModules) {\n\t\tif (!module || module.type !== ModuleType.Code) continue\n\t\tconst identifier = localModuleIdentifier(module.localId, \"default\")\n\t\tconst instanceIdentifier = identifier.value\n\t\tconst componentName = module.name ?? Dictionary.Unknown\n\n\t\tconst item: QuickActionsItem = {\n\t\t\tkind: \"item\",\n\t\t\tid: instanceIdentifier,\n\t\t\ttype: QuickActionsType.CodeImport,\n\t\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\t\tname: componentName,\n\t\t\tappAction: CodeImportQuickActionsType.LocalComponent,\n\t\t}\n\t\tcodeComponentActions.push(item)\n\t}\n\n\treturn codeComponentActions\n}\n", "import type { EngineStores } from \"document/EngineStores.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\n\nexport function switchCollectionItemOnCanvas(\n\t{ scopeStore, contentManagementStore, chromeStore }: EngineStores,\n\tselectedCollectionItemId: NodeID,\n) {\n\tconst activeScope = scopeStore.active\n\tif (!isWebPageNode(activeScope)) return\n\n\tscopeStore.setSelectedCollectionItemForWebPage(activeScope.id, selectedCollectionItemId)\n\n\tif (chromeStore.overlay?.type === \"collectionItem\") {\n\t\tcontentManagementStore.clearOverlayStack()\n\t\tcontentManagementStore.pushExistingItemToOverlayStack(selectedCollectionItemId)\n\t}\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport { switchCollectionItemOnCanvas } from \"document/components/utils/switchCollectionItemOnCanvas.ts\"\nimport engine from \"document/engine.ts\"\nimport { isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { useMemo } from \"react\"\nimport { useItemToSlug } from \"utils/useItemToSlug.ts\"\nimport { useItemToTitle } from \"utils/useItemToTitle.ts\"\nimport { useSelectedCollectionItemForWebPage } from \"utils/useSelectedCollectionItemForWebPage.ts\"\nimport { useActiveLocalizationLocale } from \"../../localization/useActiveLocalizationLocale.ts\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\n\nexport const performCollectionPageQuickAction = engine.scheduler.wrapHandler((selectedCollectionItemId: string) => {\n\tconst activeScope = engine.stores.scopeStore.active\n\tif (!isWebPageNode(activeScope) || !activeScope.dataIdentifier) return\n\tswitchCollectionItemOnCanvas(engine.stores, selectedCollectionItemId)\n})\n\nexport function useCollectionPageItemQuickActions(): QuickActionsGroup[] {\n\tconst dataIdentifier = useDeprecatedEngineState([engine.stores.scopeStore, EngineChange.Tree], () => {\n\t\tconst activeScope = engine.stores.scopeStore.active\n\t\treturn isWebPageNode(activeScope) ? activeScope.dataIdentifier : undefined\n\t})\n\n\tconst activeScopeId = engine.stores.scopeStore.useState(state => state.active.id)\n\tconst activeLocale = useActiveLocalizationLocale()\n\n\tconst itemToSlug = useItemToSlug(dataIdentifier, activeLocale?.id)\n\tconst itemToTitle = useItemToTitle(dataIdentifier, activeLocale?.id)\n\tconst { selectedItemId } = useSelectedCollectionItemForWebPage(activeScopeId, activeLocale?.id)\n\n\treturn useMemo((): QuickActionsGroup[] => {\n\t\tif (!itemToSlug) return []\n\n\t\tconst items: QuickActionsItem[] = []\n\n\t\tfor (const [id, slug] of Object.entries(itemToSlug)) {\n\t\t\tif (id === selectedItemId) continue\n\t\t\tconst title = itemToTitle?.[id]\n\t\t\tconst aliases = [slug.toLowerCase() as Lowercase<string>]\n\t\t\titems.push({\n\t\t\t\tkind: \"item\",\n\t\t\t\tid,\n\t\t\t\tname: title ?? slug,\n\t\t\t\taliases,\n\t\t\t\ttype: QuickActionsType.CollectionPageItem,\n\t\t\t})\n\t\t}\n\n\t\tif (items.length === 0) return []\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.CollectionPageItem,\n\t\t\t\ttitle: \"Select Collection Item\",\n\t\t\t\titems,\n\t\t\t\taliases: [\"/\"],\n\t\t\t},\n\t\t]\n\t}, [selectedItemId, itemToSlug, itemToTitle])\n}\n", "import type { ItemToSlug } from \"@framerjs/framer-runtime/crossorigin\"\nimport type { ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport { useBaseEngine } from \"document/base-engine/BaseEngine.ts\"\nimport { defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { getItemToTitle } from \"./collectionSlugUtils.ts\"\n\nexport function useItemToTitle(\n\tdataIdentifier: ModuleExportIdentifierString | undefined,\n\tlocaleId = defaultLocaleId,\n): ItemToSlug | undefined {\n\tconst engine = useBaseEngine()\n\n\treturn useDeprecatedEngineState([EngineChange.Tree], () => getItemToTitle(engine.tree, dataIdentifier, localeId), [\n\t\tdataIdentifier,\n\t\tlocaleId,\n\t])\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { MaybeNodeID, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { type LocaleId, defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { getSelectedCollectionItemForWebPage } from \"./getSelectedCollectionItemForWebPage.ts\"\n\nexport function useSelectedCollectionItemForWebPage(\n\twebPageNodeId: MaybeNodeID,\n\tlocaleId: LocaleId = defaultLocaleId,\n): {\n\tselectedItemId: NodeID | undefined\n\tselectedItemSlug: string | undefined\n} {\n\treturn useEngineState(\n\t\t() => getSelectedCollectionItemForWebPage(engine, webPageNodeId, localeId),\n\t\t[webPageNodeId, localeId],\n\t\t[EngineChange.Tree, EngineChange.ActiveBundle, engine.stores.scopeStore],\n\t)\n}\n", "import { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport type { Locale } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\n\nexport function useActiveLocalizationLocale(): Locale | null {\n\treturn useDeprecatedEngineState(\n\t\t[EngineChange.Tree, engine.stores.localizationStore, engine.stores.chromeStore],\n\t\t() => {\n\t\t\tif (!engine.stores.loadingStore.hasMinimalEditableData) return null\n\t\t\tconst { mainView, canvasLocaleId } = engine.stores.chromeStore\n\t\t\tconst { selectedLocaleId } = engine.stores.localizationStore\n\n\t\t\tconst activeLocaleId = mainView === ActiveMainView.Canvas ? canvasLocaleId : selectedLocaleId\n\n\t\t\tconst tree = engine.stores.treeStore.getDataTreeOrPartialTree()\n\t\t\treturn tree.root.getNonDefaultLocale(activeLocaleId) ?? null\n\t\t},\n\t)\n}\n", "import { assert } from \"@framerjs/shared\"\n\n/** Check if nested labels contain duplicate values like: Code > Create Code File. */\nfunction containsDuplicateString(labels: string[]): boolean {\n\tlet completeString = \"\"\n\tfor (let i = labels.length - 1; i >= 0; i--) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: loop\n\t\tconst label = labels[i]!\n\t\tif (completeString.includes(label)) {\n\t\t\treturn true\n\t\t}\n\t\tcompleteString = label + completeString\n\t}\n\treturn false\n}\n\n/**\n * Filter out labels which values are within downstream labels.\n * [\"Code\", \"Create Code File\"] -> [\"Create Code File\"]\n */\nfunction filterDuplicateLabels(labels: string[]): string[] {\n\tconst result: string[] = []\n\tlet completeString = \"\"\n\tfor (let i = labels.length - 1; i >= 0; i--) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: loop\n\t\tconst label = labels[i]!\n\t\tif (completeString.includes(label)) {\n\t\t\tcontinue\n\t\t}\n\t\tresult.unshift(label)\n\t\tcompleteString = label + completeString\n\t}\n\treturn result\n}\n\nfunction removeDuplicateLabels(labels: string[]): string[] {\n\tif (labels.length === 1) return labels\n\tif (!containsDuplicateString(labels)) return labels\n\treturn filterDuplicateLabels(labels)\n}\n\n/** Add Disable prefix to last label when item is checked. */\nfunction addDisablePrefixWhenChecked(labels: string[], checked: boolean | undefined): string[] {\n\tif (checked !== true) return labels\n\tconst lastItemIndex = labels.length - 1\n\tconst lastLabel = labels[lastItemIndex]\n\tconst result = Array.from(labels)\n\tresult[lastItemIndex] = `Disable ${lastLabel}`\n\treturn result\n}\n\nexport function createTitleFromLabelHierarchy(labels: string[], checked: boolean | undefined): string | string[] {\n\tconst withoutDuplication = removeDuplicateLabels(labels)\n\tconst withDisablePrefix = addDisablePrefixWhenChecked(withoutDuplication, checked)\n\tif (withDisablePrefix.length === 1) {\n\t\tconst label = withDisablePrefix[0]\n\t\tassert(label, \"Label is required\")\n\t\treturn label\n\t}\n\n\t// Limit the title to the last two labels\n\tconst lastTwoLabels = withDisablePrefix.slice(-2)\n\treturn lastTwoLabels\n}\n", "import type { AppAction } from \"app/AppActions.ts\"\n\nexport const excludedAppActions: ReadonlySet<AppAction> = new Set([\n\t// Prevent inception\n\t\"quickActions\",\n\t// Copy and paste don't work as expected\n\t\"copy\",\n\t\"paste\",\n\t// Open development plugin is displayed in separate quick action category\n\t\"openDevelopmentPlugin\",\n\t// App tour is getting removed from the app\n\t\"startAppTour\",\n\t// We are trying to move away from the community\n\t\"openCommunity\",\n\t//\n])\n", "import type { AppAction } from \"app/AppActions.ts\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport type { CustomQuickActionItemType, QuickActionsGroup, QuickActionsItem, QuickActionsType } from \"../types.ts\"\nimport { QuickActionsGroupSpecificType } from \"../types.ts\"\nimport { createTitleFromLabelHierarchy } from \"./createTitleFromLabelHierarchy.ts\"\nimport { excludedAppActions } from \"./excludedAppActions.ts\"\nimport { getShortcutListForAppAction } from \"./getShortcutListForRole.ts\"\n\ninterface HasLabel {\n\tlabel: string\n}\n\nfunction hasLabel(item: MenuItemOptions): item is MenuItemOptions & HasLabel {\n\treturn Boolean(item.label)\n}\n\nfunction getMenuItemOptionsId(\n\titem: MenuItemOptions & HasLabel,\n\tparentLabels: string[] | undefined,\n): AppAction | string {\n\tconst itemIdSegment = item.key ?? item.role ?? item.label\n\tconst parentLabelSegments = parentLabels ? parentLabels.join(\".\") : \"\"\n\treturn `${parentLabelSegments}.${itemIdSegment}`\n}\n\nexport function findMenuItemOptionsItemWithId(\n\tid: string,\n\tmenuItem: MenuItemOptions | MenuItemOptions[],\n\tparentLabels?: string[],\n): MenuItemOptions | null {\n\tif (Array.isArray(menuItem)) {\n\t\tfor (const subMenuItem of menuItem) {\n\t\t\tconst matchingMenuItem = findMenuItemOptionsItemWithId(id, subMenuItem)\n\t\t\tif (matchingMenuItem) return matchingMenuItem\n\t\t}\n\t\treturn null\n\t}\n\n\tif (isMenuItemOptionsDisabled(menuItem)) return null\n\tif (menuItem.visible === false) return null\n\tif (!hasLabel(menuItem)) return null\n\n\tif (Array.isArray(menuItem.submenu)) {\n\t\tconst labels = parentLabels ? [...parentLabels, menuItem.label] : [menuItem.label]\n\t\treturn findMenuItemOptionsItemWithId(id, menuItem.submenu, labels)\n\t}\n\n\treturn id === getMenuItemOptionsId(menuItem, parentLabels) ? menuItem : null\n}\n\nfunction isMenuItemOptionsDisabled(menuItem: MenuItemOptions): boolean {\n\tif (menuItem.enabled === false) return true\n\tif (typeof menuItem.enabled === \"function\") {\n\t\treturn !menuItem.enabled()\n\t}\n\treturn false\n}\n\nexport function collectQuickActionsFromMenuItemOptions(\n\ttype: Exclude<QuickActionsType, CustomQuickActionItemType>,\n\tmenuItem: MenuItemOptions,\n\tcollector: QuickActionsItem[],\n\t/** Allow top level submenus to be collected into separate groups */\n\tsubmenuGroupCollector?: QuickActionsGroup[],\n\trolesCollector?: Set<AppAction>,\n\trolesToExclude?: ReadonlySet<AppAction>,\n\teditReasonsToExclude?: ReadonlySet<string>,\n\tparentLabels?: string[],\n\tmenuLevel = 0,\n) {\n\tswitch (menuItem.type) {\n\t\tcase \"checkbox\":\n\t\tcase \"separator\":\n\t\t\treturn\n\t}\n\n\tif (menuItem.enabled === false) return\n\tif (menuItem.visible === false) return\n\tif (menuItem.editReason && editReasonsToExclude?.has(menuItem.editReason)) return\n\tif (!hasLabel(menuItem)) return\n\n\tconst labels = parentLabels ? [...parentLabels, menuItem.label] : [menuItem.label]\n\n\tif (menuItem.submenu && isArray(menuItem.submenu)) {\n\t\tif (menuLevel > 0 || !submenuGroupCollector) {\n\t\t\tmenuItem.submenu.forEach(subMenuItem =>\n\t\t\t\tcollectQuickActionsFromMenuItemOptions(\n\t\t\t\t\ttype,\n\t\t\t\t\tsubMenuItem,\n\t\t\t\t\tcollector,\n\t\t\t\t\tsubmenuGroupCollector,\n\t\t\t\t\trolesCollector,\n\t\t\t\t\trolesToExclude,\n\t\t\t\t\teditReasonsToExclude,\n\t\t\t\t\tlabels,\n\t\t\t\t\tmenuLevel + 1,\n\t\t\t\t),\n\t\t\t)\n\t\t} else {\n\t\t\tconst subMenuItemCollector: QuickActionsItem[] = []\n\n\t\t\tmenuItem.submenu.forEach(subMenuItem =>\n\t\t\t\tcollectQuickActionsFromMenuItemOptions(\n\t\t\t\t\ttype,\n\t\t\t\t\tsubMenuItem,\n\t\t\t\t\tsubMenuItemCollector,\n\t\t\t\t\tsubmenuGroupCollector,\n\t\t\t\t\trolesCollector,\n\t\t\t\t\trolesToExclude,\n\t\t\t\t\teditReasonsToExclude,\n\t\t\t\t\t[],\n\t\t\t\t\tmenuLevel + 1,\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tif (subMenuItemCollector.length > 0) {\n\t\t\t\tsubmenuGroupCollector.push({\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsGroupSpecificType.ContextSubMenu,\n\t\t\t\t\ttitle: menuItem.label,\n\t\t\t\t\titems: subMenuItemCollector,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n\n\tif (!menuItem.click) return\n\n\tconst id = getMenuItemOptionsId(menuItem, parentLabels)\n\tif (!id) return\n\n\tif (menuItem.role) {\n\t\tif (excludedAppActions.has(menuItem.role) || rolesToExclude?.has(menuItem.role)) {\n\t\t\treturn\n\t\t}\n\t\tif (rolesCollector) {\n\t\t\trolesCollector.add(menuItem.role)\n\t\t}\n\t}\n\n\tcollector.push({\n\t\tkind: \"item\",\n\t\tid,\n\t\ttype,\n\t\tkey: menuItem.key,\n\t\ticon: menuItem.icon,\n\t\tname: createTitleFromLabelHierarchy(labels, menuItem.checked),\n\t\tshortcut: getShortcutListForAppAction(menuItem.role),\n\t\tappAction: menuItem.role,\n\t})\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { MetricsInteractionViews } from \"app/metrics.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport engine from \"document/engine.ts\"\nimport { CONTENT_MANAGEMENT_ID } from \"document/models/CanvasTree/nodes/ContentManagementNode.ts\"\nimport { getContentManagementNode } from \"document/models/CanvasTree/nodes/ContentManagementNode.utils.ts\"\nimport { isCollectionNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { getSelectedCollectionId } from \"utils/collectionUtils.ts\"\nimport { getCollectionCreationOptions } from \"../../contentManagement/utils/getCollectionCreationOptions.ts\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\nimport {\n\tcollectQuickActionsFromMenuItemOptions,\n\tfindMenuItemOptionsItemWithId,\n} from \"./collectQuickActionsFromMenuItemOptions.ts\"\nimport { createTitleFromLabelHierarchy } from \"./createTitleFromLabelHierarchy.ts\"\nimport { useQuickActionsCache } from \"./useQuickActionCache.ts\"\n\nexport function performCollectionAction(action: string) {\n\t// FIXME If CMS Node will ever become shallow this code needs to be checked/updated\n\tconst contentManagementNode = getContentManagementNode(engine.tree)?.loaded\n\tif (!contentManagementNode) return\n\n\tengine.stores.scopeStore.select(CONTENT_MANAGEMENT_ID, { keepHistory: false })\n\n\tconst collection = contentManagementNode.children.find(collectionNode => collectionNode.id === action)\n\tassert(collection, \"Collection should exist for quick action\")\n\tengine.stores.selectionStore.set(collection.id)\n\tengine.stores.codeEditorStore.closeEditor()\n\tengine.stores.siteSettingsStore.close()\n}\n\nexport function performCreateCollectionAction(id: string) {\n\tconst creationOptions = getCollectionCreationOptions(engine, MetricsInteractionViews.QUICK_ACTIONS)\n\tconst menuItem = findMenuItemOptionsItemWithId(id, creationOptions)\n\tmenuItem?.click?.()\n}\n\n/** Actions for opening collections within the CMS. */\nexport function useCollectionQuickActions(): QuickActionsGroup[] {\n\tconst { contentManagementNode } = useDeprecatedEngineState([EngineChange.Tree], () => ({\n\t\tcontentManagementNode: getContentManagementNode(engine.tree),\n\t}))\n\n\tconst [getCachedAction, setCachedAction] = useQuickActionsCache()\n\n\treturn useDeprecatedEngineState(\n\t\t[engine.stores.selectionStore, engine.stores.chromeStore, engine.stores.contentManagementStore],\n\t\t(): QuickActionsGroup[] => {\n\t\t\t// We don't allow navigating away from creating a new collection item.\n\t\t\tif (engine.stores.contentManagementStore.hasAnyPrivateDraftCollectionItem()) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\tconst { mainView } = engine.stores.chromeStore\n\n\t\t\tconst type = QuickActionsType.Collection\n\n\t\t\t// FIXME If CMS Node will ever become shallow this code needs to be checked/updated\n\t\t\tconst loadedContentManagementNode = contentManagementNode?.loaded\n\t\t\tif (!loadedContentManagementNode) return []\n\n\t\t\tconst noCollections = loadedContentManagementNode.children.length === 0\n\n\t\t\tconst quickActionItems: QuickActionsItem[] = []\n\n\t\t\tconst contentManagementActive = mainView === ActiveMainView.ContentManagement\n\n\t\t\t// Only display creation options when the CMS is *not* active and doesn't have any collections to navigate to\n\t\t\tif (!contentManagementActive && noCollections) {\n\t\t\t\tconst creationOptions = getCollectionCreationOptions(engine, MetricsInteractionViews.QUICK_ACTIONS)\n\t\t\t\tcreationOptions.forEach(menuitem => {\n\t\t\t\t\tconst type =\n\t\t\t\t\t\tmenuitem.role === \"newCollectionFolder\"\n\t\t\t\t\t\t\t? QuickActionsType.CreateCollectionFolder\n\t\t\t\t\t\t\t: QuickActionsType.CreateCollection\n\t\t\t\t\tcollectQuickActionsFromMenuItemOptions(type, menuitem, quickActionItems)\n\t\t\t\t})\n\t\t\t\tif (quickActionItems.length === 0) return []\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"group\",\n\t\t\t\t\t\ttype: QuickActionsType.Collection,\n\t\t\t\t\t\ttitle: Dictionary.Cms,\n\t\t\t\t\t\titems: quickActionItems,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t}\n\n\t\t\tconst selectedCollectionId = getSelectedCollectionId(engine)\n\n\t\t\tconst groupTitle = contentManagementActive ? Dictionary.Collection : Dictionary.Cms\n\n\t\t\tfor (const collectionNode of loadedContentManagementNode.children) {\n\t\t\t\tif (collectionNode.id === selectedCollectionId) continue\n\t\t\t\tif (!isCollectionNode(collectionNode)) continue\n\t\t\t\tconst name = collectionNode.resolveValue(\"name\")\n\t\t\t\tif (!name) continue\n\n\t\t\t\tconst cached = getCachedAction(collectionNode)\n\t\t\t\tif (cached) {\n\t\t\t\t\tquickActionItems.push(cached)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst item: QuickActionsItem = {\n\t\t\t\t\tkind: \"item\",\n\t\t\t\t\ttype,\n\t\t\t\t\tname:\n\t\t\t\t\t\tgroupTitle === \"Collection\" ? name : createTitleFromLabelHierarchy([Dictionary.Collection, name], false),\n\t\t\t\t\tid: collectionNode.id,\n\t\t\t\t\ticon: \"IconCMS\",\n\t\t\t\t}\n\n\t\t\t\tsetCachedAction(collectionNode, item)\n\t\t\t\tquickActionItems.push(item)\n\t\t\t}\n\n\t\t\tif (quickActionItems.length === 0) return []\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.Collection,\n\t\t\t\t\ttitle: groupTitle,\n\t\t\t\t\titems: quickActionItems,\n\t\t\t\t\taliases: [\"cms\"],\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t[contentManagementNode, getCachedAction, setCachedAction],\n\t\ttrue,\n\t)\n}\n", "import { useMemo } from \"react\"\n\nfunction combineLists<T>(lists: (readonly T[])[]): T[] {\n\tconst result: T[] = []\n\treturn result.concat(...lists)\n}\n\n/**\n * Concat a list of arrays into a single list. Only works if each array\n * is memoized and if the list length isn't dynamic.\n */\nexport function useCombineLists<T>(...lists: (readonly T[])[]): readonly T[] {\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: arg is the dep\n\treturn useMemo(() => combineLists(lists), lists)\n}\n", "import type { Immutable } from \"@framerjs/app-shared/src/lib/immer.ts\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport {\n\tModuleType,\n\tasLocalId,\n\tisExternalModuleIdentifier,\n\tlocalModuleIdentifier,\n\tlocalModuleIdentifierForStableName,\n\tparseModuleIdentifier,\n\tunhandledError,\n} from \"@framerjs/shared\"\nimport { CodeImportQuickActionsType, ComponentQuickActionsType } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { employeesOnlySettings } from \"app/employeesOnlySettings.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { codeComponentFromDefinition } from \"document/components/utils/componentHelpers.ts\"\nimport { goToLocalSourceNode } from \"document/components/utils/editActionForCodeComponent.ts\"\nimport { useExternalModuleComponentsGrouped } from \"document/components/utils/externalModuleGroups.tsx\"\nimport { getParentForInsertNode } from \"document/components/utils/getParentForInsertNode.ts\"\nimport { insertComponent } from \"document/components/utils/insertComponent.ts\"\nimport {\n\tcanReplaceNode,\n\tgetComponentToUseAsReplacement,\n\treplacingSubmitButtonWithTemplateWillModifyTemplate,\n\treplaceNodeWithTemplate,\n} from \"document/components/utils/replaceNodes.ts\"\nimport engine from \"document/engine.ts\"\nimport type { AnySmartComponentNode, CodeComponentNode, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { COMPONENTS_ENTITY_TYPE_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport {\n\ttype ExternalModuleNode,\n\tExternalModulesListNode,\n} from \"document/models/CanvasTree/nodes/ExternalModuleNode.ts\"\nimport type { AnyVectorSetNode } from \"document/models/CanvasTree/nodes/VectorSetNode.ts\"\nimport { getPathPartsForReferencedNodeId } from \"document/models/CanvasTree/nodes/utils/entityFolderNode.ts\"\nimport { moduleIdentifierToLocalComponentId } from \"document/models/CanvasTree/nodes/utils/moduleIdentifierToLocalComponentId.ts\"\nimport {\n\tisCodeComponentNode,\n\tisSmartComponentNode,\n\tisVectorSetNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isFormSubmitButtonInstance } from \"document/models/CanvasTree/traits/WithFormVariants.ts\"\nimport { isVectorSetItem } from \"document/models/CanvasTree/traits/WithVectorSetItem.ts\"\nimport { convertFrameToCanvas } from \"document/models/CanvasTree/utils/geometry.ts\"\nimport type { ModuleEntries } from \"document/stores/ModulesStore.ts\"\nimport { useDeprecatedEngineState } from \"document/useDeprecatedEngineState.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { Rect } from \"library/index.ts\"\nimport { assert, assertNever } from \"library/utils/assert.ts\"\nimport type { ModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { useMemo } from \"react\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { setViewParamsInURL } from \"utils/urlParams.ts\"\nimport { getVectorSetIdentifiers } from \"utils/vectorSets.ts\"\nimport { isFramerModule } from \"../../../utils/defaultComponents.ts\"\nimport type { ExternalModuleComponent, ListItem, ListItemGroup } from \"../../assets/types.ts\"\nimport type { QuickActionsCategory, QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { FindNodesType, QuickActionsCategoryType, QuickActionsTintType, QuickActionsType } from \"../types.ts\"\nimport type { FindNodesOptions } from \"./useFindNodesQuickActions.tsx\"\nimport {\n\ttype GetQuickActionsCacheValue,\n\ttype SetQuickActionsCacheValue,\n\tuseQuickActionsCache,\n} from \"./useQuickActionCache.ts\"\n\nconst componentGroupAliases: readonly Lowercase<string>[] = [\"smart\"]\nconst vectorSetGroupAliases: readonly Lowercase<string>[] = [\"vectors\"]\n\nexport enum QuickActionsComponentType {\n\tLocalSmartComponent = \"localSmartComponent\",\n\tLocalCodeComponent = \"localCodeComponent\",\n\tExternalModuleComponent = \"externalModuleComponent\",\n\tLocalVectorSet = \"localVectorSet\",\n}\n\nexport interface ProjectComponent {\n\tid: string\n\tname: string\n\tidentifier: string\n\ttype: QuickActionsComponentType\n}\n\n// Empty array to be used whenever there are no component actions. This\n// ensures that memoization works as expected.\nconst NO_COMPONENT_ACTIONS: QuickActionsGroup[] = []\nObject.freeze(NO_COMPONENT_ACTIONS)\n\n/** Components and their actions as nested items  */\nexport function useComponentsActions(\n\tmainView: ActiveMainView,\n\tscopeType: ScopeType,\n\tisViewOnly: boolean,\n\tactiveCategory: QuickActionsCategory | undefined,\n): QuickActionsGroup[] {\n\tconst isPreviewingLocaleOnCanvas = engine.stores.chromeStore.useState(state => state.isPreviewingLocaleOnCanvas)\n\n\tconst [getCachedAction, setCachedAction] = useQuickActionsCache()\n\n\tconst { localModules, externalModulesDynamicInfo, externalModulesListNode } = useDeprecatedEngineState(\n\t\t[EngineChange.Tree, engine.stores.modulesStore],\n\t\t() => ({\n\t\t\tlocalModules: engine.stores.modulesStore.localModules,\n\t\t\texternalModulesDynamicInfo: engine.stores.modulesStore.externalModulesDynamicInfo,\n\t\t\texternalModulesListNode: ExternalModulesListNode.get(engine.stores.treeStore.tree),\n\t\t}),\n\t)\n\n\tconst externalComponents = useExternalModuleComponentsGrouped({\n\t\texternalModulesListNode,\n\t\texternalModules: externalModulesDynamicInfo,\n\t})\n\n\tconst groups: QuickActionsGroup[] = useDeprecatedEngineState(\n\t\t[EngineChange.LocalSmartComponents, EngineChange.ActiveBundle],\n\t\t() => {\n\t\t\tconst componentsExternal = getExternalQuickActionComponents(externalComponents, getCachedAction, setCachedAction)\n\t\t\tconst hasExternalComponents = componentsExternal.length > 0\n\n\t\t\tconst smartComponentsLocal = getLocalQuickActionSmartComponents(\n\t\t\t\tengine,\n\t\t\t\thasExternalComponents,\n\t\t\t\tgetCachedAction,\n\t\t\t\tsetCachedAction,\n\t\t\t)\n\t\t\tconst codeComponentsLocal = getLocalQuickActionCodeComponents(\n\t\t\t\tengine,\n\t\t\t\tlocalModules,\n\t\t\t\thasExternalComponents,\n\t\t\t\tgetCachedAction,\n\t\t\t\tsetCachedAction,\n\t\t\t)\n\t\t\tconst vectorSetComponentsLocal = getLocalQuickActionVectorSets(\n\t\t\t\tengine,\n\t\t\t\thasExternalComponents,\n\t\t\t\tgetCachedAction,\n\t\t\t\tsetCachedAction,\n\t\t\t)\n\n\t\t\tconst allComponents = [...smartComponentsLocal, ...codeComponentsLocal, ...componentsExternal]\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\t\ttitle: \"Components\",\n\t\t\t\t\titems: allComponents,\n\t\t\t\t\taliases: componentGroupAliases,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\t\ttitle: \"Vectors\",\n\t\t\t\t\titems: vectorSetComponentsLocal,\n\t\t\t\t\taliases: vectorSetGroupAliases,\n\t\t\t\t},\n\t\t\t]\n\t\t},\n\t\t[externalComponents, getCachedAction, setCachedAction],\n\t\ttrue,\n\t)\n\n\tconst selectedComponentActions: QuickActionsGroup[] | undefined = useMemo(() => {\n\t\tif (isPreviewingLocaleOnCanvas) return NO_COMPONENT_ACTIONS\n\t\tif (scopeType === ScopeType.ContentManagement) return NO_COMPONENT_ACTIONS\n\n\t\tif (activeCategory?.type === QuickActionsCategoryType.Components) {\n\t\t\tif (activeCategory?.type !== QuickActionsCategoryType.Components) return NO_COMPONENT_ACTIONS\n\t\t\tconst availableActions = getAvailableActions(activeCategory.activeComponent, engine, isViewOnly, mainView)\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"group\",\n\t\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\t\ttitle: \"Actions\",\n\t\t\t\t\titems: availableActions.map(action =>\n\t\t\t\t\t\tgetComponentQuickActionItem(activeCategory.activeComponent, action, mainView),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}, [activeCategory, isPreviewingLocaleOnCanvas, scopeType, isViewOnly, mainView])\n\n\treturn selectedComponentActions ?? groups\n}\n\nfunction actionFromExternalModuleComponent(\n\texternalModule: ExternalModuleComponent,\n\tgroupTitle: string,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem {\n\tconst cached = getCachedAction(externalModule)\n\tif (cached) return cached\n\n\tconst categoryComponent: ProjectComponent = {\n\t\tid: externalModule.id,\n\t\tname: externalModule.name,\n\t\ttype: QuickActionsComponentType.ExternalModuleComponent,\n\t\tidentifier: externalModule.codeComponentIdentifier,\n\t}\n\n\tconst item: QuickActionsItem = {\n\t\tkind: \"item\",\n\t\ttype: QuickActionsType.SelectCategory,\n\t\tid: externalModule.id,\n\t\tname: [groupTitle, externalModule.name],\n\t\ticon: \"IconComponent\",\n\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\tcategory: {\n\t\t\ttype: QuickActionsCategoryType.Components,\n\t\t\tactiveComponent: categoryComponent,\n\t\t},\n\t}\n\tsetCachedAction(externalModule, item)\n\treturn item\n}\n\nfunction getExternalQuickActionComponents(\n\texternalComponents: ListItemGroup[],\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem[] {\n\tconst componentsExternal: QuickActionsItem[] = []\n\n\tfor (const group of externalComponents) {\n\t\tconst items: QuickActionsItem[] = []\n\n\t\tfor (const listItem of group.items) {\n\t\t\tif (!isExternalModuleComponent(listItem)) continue\n\n\t\t\tconst item = actionFromExternalModuleComponent(listItem, group.title, getCachedAction, setCachedAction)\n\t\t\titems.push(item)\n\t\t}\n\n\t\tif (items.length === 0) continue\n\t\tcomponentsExternal.push(...items)\n\t}\n\n\treturn componentsExternal\n}\n\nfunction actionFromSmartComponentNode(\n\tnode: AnySmartComponentNode,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem {\n\tconst cached = getCachedAction(node)\n\tif (cached) return cached\n\n\tconst componentName = node.resolveValue(\"name\") ?? Dictionary.Unknown\n\n\tconst activeComponent: ProjectComponent = {\n\t\tid: node.id,\n\t\tname: componentName,\n\t\ttype: QuickActionsComponentType.LocalSmartComponent,\n\t\tidentifier: node.instanceIdentifier,\n\t}\n\n\t// Get the full path for referenced components\n\tconst nodePathParts = getPathPartsForReferencedNodeId(engine.tree, node.id, COMPONENTS_ENTITY_TYPE_ROOT_ID)\n\n\tlet quickActionName = nodePathParts?.length > 0 ? nodePathParts : [componentName]\n\tif (hasExternalComponents) {\n\t\tquickActionName = [Dictionary.Project, ...quickActionName]\n\t}\n\n\tconst item: QuickActionsItem = {\n\t\tkind: \"item\",\n\t\ttype: QuickActionsType.SelectCategory,\n\t\tid: node.id,\n\t\tname: quickActionName,\n\t\ticon: \"IconComponent\",\n\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\tcategory: {\n\t\t\ttype: QuickActionsCategoryType.Components,\n\t\t\tactiveComponent,\n\t\t},\n\t}\n\treturn setCachedAction(node, item)\n}\n\nfunction actionFromVectorSetNode(\n\tnode: AnyVectorSetNode,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem {\n\tconst cached = getCachedAction(node)\n\tif (cached) return cached\n\n\tconst componentName = node.resolveValue(\"name\") ?? Dictionary.Unknown\n\n\tconst activeComponent: ProjectComponent = {\n\t\tid: node.id,\n\t\tname: componentName,\n\t\ttype: QuickActionsComponentType.LocalVectorSet,\n\t\tidentifier: node.instanceIdentifier,\n\t}\n\n\tconst item: QuickActionsItem = {\n\t\tkind: \"item\",\n\t\ttype: QuickActionsType.SelectCategory,\n\t\tid: node.id,\n\t\tname: hasExternalComponents ? [Dictionary.Project, componentName] : componentName,\n\t\ticon: \"IconVectorSet\",\n\t\tcategory: {\n\t\t\ttype: QuickActionsCategoryType.Components,\n\t\t\tactiveComponent,\n\t\t},\n\t}\n\treturn setCachedAction(node, item)\n}\n\nfunction getLocalQuickActionSmartComponents(\n\tvekterEngine: VekterEngine,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n) {\n\tconst smartComponentActions: QuickActionsItem[] = []\n\n\tfor (const node of vekterEngine.tree.root.children) {\n\t\tif (!isSmartComponentNode(node)) continue\n\n\t\tconst item = actionFromSmartComponentNode(node, hasExternalComponents, getCachedAction, setCachedAction)\n\t\tsmartComponentActions.push(item)\n\t}\n\n\treturn smartComponentActions\n}\n\nfunction getLocalQuickActionVectorSets(\n\tvekterEngine: VekterEngine,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n) {\n\tconst smartComponentActions: QuickActionsItem[] = []\n\n\tfor (const node of vekterEngine.tree.root.children) {\n\t\tif (!isVectorSetNode(node)) continue\n\n\t\tconst item = actionFromVectorSetNode(node, hasExternalComponents, getCachedAction, setCachedAction)\n\t\tsmartComponentActions.push(item)\n\t}\n\n\treturn smartComponentActions\n}\n\nfunction actionFromModuleEntry(\n\tmodule: Immutable<ModuleEntry>,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem {\n\tconst cached = getCachedAction(module)\n\tif (cached) return cached\n\n\tconst identifier = localModuleIdentifier(module.localId, \"default\")\n\tconst instanceIdentifier = identifier.value\n\tconst componentName = module.name ?? Dictionary.Unknown\n\n\tconst activeComponent: ProjectComponent = {\n\t\tid: instanceIdentifier,\n\t\tname: componentName,\n\t\ttype: QuickActionsComponentType.LocalCodeComponent,\n\t\tidentifier: instanceIdentifier,\n\t}\n\n\tconst item: QuickActionsItem = {\n\t\tkind: \"item\",\n\t\ttype: QuickActionsType.SelectCategory,\n\t\tid: instanceIdentifier,\n\t\tname: hasExternalComponents ? [Dictionary.Project, componentName] : componentName,\n\t\ticon: \"IconComponent\",\n\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\tcategory: {\n\t\t\ttype: QuickActionsCategoryType.Components,\n\t\t\tactiveComponent,\n\t\t},\n\t}\n\treturn setCachedAction(module, item)\n}\n\nfunction getLocalQuickActionCodeComponents(\n\tvekterEngine: VekterEngine,\n\tlocalModules: Immutable<ModuleEntries>,\n\thasExternalComponents: boolean,\n\tgetCachedAction: GetQuickActionsCacheValue,\n\tsetCachedAction: SetQuickActionsCacheValue,\n): QuickActionsItem[] {\n\tconst codeComponentActions: QuickActionsItem[] = []\n\tfor (const module of localModules.values()) {\n\t\tif (!module || module.type !== ModuleType.Code) continue\n\n\t\t// Exclude code files\n\t\tconst identifier = localModuleIdentifier(module.localId, \"default\")\n\t\tconst definition = vekterEngine.componentLoader.reactComponentForIdentifier(identifier.value)\n\t\tif (!definition) continue\n\n\t\tconst item = actionFromModuleEntry(module, hasExternalComponents, getCachedAction, setCachedAction)\n\t\tcodeComponentActions.push(item)\n\t}\n\n\treturn codeComponentActions\n}\n\nfunction getComponentTypeBasedActions(\n\tcomponent: ProjectComponent,\n\tvekterEngine: VekterEngine,\n\tisViewOnly: boolean,\n\tmainView: ActiveMainView,\n): ComponentQuickActionsType[] {\n\tswitch (component.type) {\n\t\tcase QuickActionsComponentType.LocalSmartComponent:\n\t\tcase QuickActionsComponentType.LocalCodeComponent:\n\t\tcase QuickActionsComponentType.LocalVectorSet:\n\t\t\tif (mainView === ActiveMainView.CodeEditor && !isImportableComponentType(component.type)) {\n\t\t\t\treturn [ComponentQuickActionsType.Edit, ComponentQuickActionsType.Find]\n\t\t\t}\n\n\t\t\treturn [ComponentQuickActionsType.Insert, ComponentQuickActionsType.Edit, ComponentQuickActionsType.Find]\n\t\tcase QuickActionsComponentType.ExternalModuleComponent: {\n\t\t\tconst parsedIdentifier = parseModuleIdentifier(component.identifier)\n\n\t\t\tconst externalModuleNode = isExternalModuleIdentifier(parsedIdentifier)\n\t\t\t\t? vekterEngine.stores.treeStore.tree.getNode<ExternalModuleNode>(parsedIdentifier.moduleId)\n\t\t\t\t: null\n\n\t\t\tconst canAccessPrimary =\n\t\t\t\t!isFramerModule(vekterEngine.stores.treeStore.tree, component.identifier) ||\n\t\t\t\temployeesOnlySettings.isOn(\"openPrimaryForBuiltInModules\")\n\n\t\t\tconst canOpenPrimary = Boolean(\n\t\t\t\texternalModuleNode &&\n\t\t\t\t!isViewOnly &&\n\t\t\t\texternalModuleNode.ownerType === \"project\" &&\n\t\t\t\texternalModuleNode.ownerId &&\n\t\t\t\tcanAccessPrimary,\n\t\t\t)\n\n\t\t\tif (!canOpenPrimary) return [ComponentQuickActionsType.Insert, ComponentQuickActionsType.Find]\n\n\t\t\treturn [ComponentQuickActionsType.Insert, ComponentQuickActionsType.OpenPrimary, ComponentQuickActionsType.Find]\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(component.type)\n\t}\n}\n\n/** Get possible actions for a component category in quick actions. */\nexport function getAvailableActions(\n\tcomponent: ProjectComponent,\n\tvekterEngine: VekterEngine,\n\tisViewOnly: boolean,\n\tmainView: ActiveMainView,\n): ComponentQuickActionsType[] {\n\tconst actions = getComponentTypeBasedActions(component, vekterEngine, isViewOnly, mainView)\n\n\tif (isReplaceActionPossible(vekterEngine, mainView)) {\n\t\tactions.push(ComponentQuickActionsType.Replace)\n\t}\n\n\treturn actions\n}\n\nexport async function executeComponentQuickAction(\n\tcomponentLoader: ComponentLoader,\n\tmainView: ActiveMainView,\n\tactionType: ComponentQuickActionsType,\n\tactiveCategory: QuickActionsCategory | undefined,\n) {\n\tif (activeCategory?.type !== QuickActionsCategoryType.Components) return\n\n\tswitch (actionType) {\n\t\tcase ComponentQuickActionsType.Edit: {\n\t\t\tperformEditComponentAction(activeCategory.activeComponent, mainView)\n\t\t\tbreak\n\t\t}\n\t\tcase ComponentQuickActionsType.Insert: {\n\t\t\tawait performInsertComponentAction(componentLoader, activeCategory.activeComponent)\n\t\t\tbreak\n\t\t}\n\t\tcase ComponentQuickActionsType.OpenPrimary: {\n\t\t\tawait performOpenPrimaryComponentAction(activeCategory.activeComponent)\n\t\t\tbreak\n\t\t}\n\t\tcase ComponentQuickActionsType.Replace: {\n\t\t\tawait performReplaceComponentAction(activeCategory.activeComponent)\n\t\t\tbreak\n\t\t}\n\t\tcase ComponentQuickActionsType.Find: {\n\t\t\t// find is handled by the active category so we don't need to do anything here\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(actionType)\n\t}\n}\n\n/** Opens code file or smart component based on component type. */\nfunction performEditComponentAction(component: ProjectComponent, mainView: ActiveMainView) {\n\tconst { codeEditorStore, scopeStore } = engine.stores\n\tswitch (component.type) {\n\t\tcase QuickActionsComponentType.LocalSmartComponent: {\n\t\t\tconst smartComponentId = moduleIdentifierToLocalComponentId(component.identifier)\n\t\t\tif (!smartComponentId) return\n\t\t\tif (mainView === ActiveMainView.CodeEditor) {\n\t\t\t\tcodeEditorStore.closeEditor()\n\t\t\t}\n\t\t\tscopeStore.select(smartComponentId, { keepHistory: false })\n\t\t\tbreak\n\t\t}\n\t\tcase QuickActionsComponentType.LocalCodeComponent: {\n\t\t\tconst definition = engine.componentLoader.reactComponentForIdentifier(component.identifier)\n\t\t\tif (!definition) return\n\t\t\tcodeEditorStore.editFile(definition.file)\n\t\t\tbreak\n\t\t}\n\t\tcase QuickActionsComponentType.ExternalModuleComponent: {\n\t\t\tassert(component.type, \"External modules should not be editable\")\n\t\t\tbreak\n\t\t}\n\t\tcase QuickActionsComponentType.LocalVectorSet: {\n\t\t\tgoToLocalSourceNode(component.id, engine, null, { keepHistory: false })\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(component.type)\n\t}\n}\n\n/** Opens primary component action for quick actions component */\nasync function performOpenPrimaryComponentAction(component: ProjectComponent) {\n\tconst parsedId = parseModuleIdentifier(component.identifier)\n\tconst externalModuleNode = isExternalModuleIdentifier(parsedId)\n\t\t? engine.tree.getNode<ExternalModuleNode>(parsedId.moduleId)\n\t\t: null\n\n\tif (!externalModuleNode) return\n\n\tconst sourceProjectURL = new URL(`/projects/${externalModuleNode.ownerId}`, window.location.href)\n\n\t// Link straight to the component isolation for smart components\n\tif (externalModuleNode.scopeNodeId) {\n\t\tif (isUndefined(externalModuleNode.scopeNodeId)) return\n\t\tsetViewParamsInURL(sourceProjectURL, { nodeId: externalModuleNode.scopeNodeId })\n\t\twindow.open(sourceProjectURL.href, \"_blank\", \"noopener\")\n\t\treturn\n\t}\n\n\tif (externalModuleNode.type !== ModuleType.Code) return\n\tif (!isExternalModuleIdentifier(parsedId)) return\n\n\t// Link straight to the code file for code modules\n\tconst { module: externalModule } = await engine.stores.modulesStore.lookUpModule({\n\t\tmoduleId: parsedId.moduleId,\n\t\tsaveId: parsedId.saveId,\n\t})\n\tsetViewParamsInURL(sourceProjectURL, {\n\t\tcodeModuleLocalId: asLocalId(externalModule?.localId),\n\t})\n\treturn window.open(sourceProjectURL.href, \"_blank\", \"noopener\")\n}\n\n/** Action for replacing the currently selected nodes with component */\nasync function performReplaceComponentAction(component: ProjectComponent) {\n\tconst selectedNodesIds = engine.stores.selectionStore.ids\n\tconst identifier =\n\t\tcomponent.type === QuickActionsComponentType.LocalVectorSet\n\t\t\t? await getDefaultVectorIdentifierForVectorSetId(component.id)\n\t\t\t: component.identifier\n\tif (!identifier) return\n\tconst componentNode = engine.componentLoader.componentForIdentifier(identifier)\n\tif (!componentNode) return\n\tconst replacementComponent = getComponentToUseAsReplacement(componentNode)\n\tif (!replacementComponent) return\n\n\tconst replaceSelectedNodes = () => {\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tselectedNodesIds.forEach(nodeId => {\n\t\t\t\tconst target = engine.tree.get(nodeId)\n\t\t\t\tif (!target || !canReplaceNode(target, { allowLockedNodes: true })) return\n\t\t\t\tconst newNode = engine.cloneNode(replacementComponent, false, false)\n\t\t\t\treplaceNodeWithTemplate(engine, target, newNode).catch(unhandledError)\n\t\t\t})\n\t\t})\n\t}\n\n\tconst replacingSubmitButton = selectedNodesIds.some(nodeId => {\n\t\tconst node = engine.tree.get(nodeId)\n\t\treturn node && isCodeComponentNode(node) && isFormSubmitButtonInstance(engine.tree, node)\n\t})\n\n\tif (replacingSubmitButton) {\n\t\tconst willModifyTemplate = await replacingSubmitButtonWithTemplateWillModifyTemplate(\n\t\t\tengine.tree,\n\t\t\treplacementComponent,\n\t\t)\n\t\tif (willModifyTemplate) {\n\t\t\tengine.stores.modalStore.set({\n\t\t\t\ttype: ModalType.Confirmation,\n\t\t\t\ttitle: \"Replace Submit Button\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"To use this component as the Submit Button of the Form, we need to remove links from all instances and change it to a Button element.\",\n\t\t\t\tonConfirm: replaceSelectedNodes,\n\t\t\t\tconfirmLabel: Dictionary.Confirm,\n\t\t\t\tsource: \"replace_submit\",\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n\n\treplaceSelectedNodes()\n}\n\nfunction getComponentQuickActionItem(\n\tcomponent: ProjectComponent,\n\taction: ComponentQuickActionsType,\n\tmainView: ActiveMainView,\n): QuickActionsItem {\n\tswitch (action) {\n\t\tcase ComponentQuickActionsType.Edit:\n\t\t\treturn {\n\t\t\t\tkind: \"item\",\n\t\t\t\tid: `${component.id}-edit`,\n\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\tname: `Edit ${component.name}`,\n\t\t\t\ticon: \"IconEditPencil\",\n\t\t\t\tappAction: ComponentQuickActionsType.Edit,\n\t\t\t}\n\t\tcase ComponentQuickActionsType.Insert: {\n\t\t\tif (mainView === ActiveMainView.CodeEditor) {\n\t\t\t\tconst appAction = getCodeImportActionForComponentType(component.type)\n\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"item\",\n\t\t\t\t\tid: component.identifier,\n\t\t\t\t\ttype: QuickActionsType.CodeImport,\n\t\t\t\t\tname: `Import ${component.name}`,\n\t\t\t\t\ticon: \"IconPlus\",\n\t\t\t\t\tappAction,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: \"item\",\n\t\t\t\tid: `${component.id}-insert`,\n\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\tname: `Insert ${component.name}`,\n\t\t\t\ticon: \"IconPlus\",\n\t\t\t\tappAction: ComponentQuickActionsType.Insert,\n\t\t\t}\n\t\t}\n\t\tcase ComponentQuickActionsType.OpenPrimary:\n\t\t\treturn {\n\t\t\t\tkind: \"item\",\n\t\t\t\tid: `${component.id}-open-primary`,\n\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\tname: Dictionary.OpenPrimary,\n\t\t\t\ticon: \"IconArrowRightUp\",\n\t\t\t\tappAction: ComponentQuickActionsType.OpenPrimary,\n\t\t\t}\n\t\tcase ComponentQuickActionsType.Replace:\n\t\t\treturn {\n\t\t\t\tkind: \"item\",\n\t\t\t\tid: `${component.id}-replace`,\n\t\t\t\ttype: QuickActionsType.Component,\n\t\t\t\tname: `Replace with ${component.name}`,\n\t\t\t\ticon: \"IconCopy\",\n\t\t\t\tappAction: ComponentQuickActionsType.Replace,\n\t\t\t}\n\t\tcase ComponentQuickActionsType.Find:\n\t\t\treturn {\n\t\t\t\tkind: \"item\",\n\t\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\t\tid: `${component.id}-${QuickActionsCategoryType.FindNodes}`,\n\t\t\t\tname: Dictionary.Find,\n\t\t\t\ticon: \"IconSearch\",\n\t\t\t\tcategory: {\n\t\t\t\t\ttype: QuickActionsCategoryType.FindNodes,\n\t\t\t\t\toptions: getFindNodesOptions(component),\n\t\t\t\t},\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(action)\n\t}\n}\n\nfunction getFindNodesOptions(component: ProjectComponent): FindNodesOptions {\n\tif (component.type === QuickActionsComponentType.LocalVectorSet) {\n\t\treturn {\n\t\t\ttype: FindNodesType.VectorSet,\n\t\t\ttitle: component.name,\n\t\t\tcomponentIdentifier: getVectorSetIdentifiers(engine, component.id),\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: FindNodesType.CodeComponent,\n\t\ttitle: component.name,\n\t\tcomponentIdentifier: component.identifier,\n\t}\n}\n\nfunction isImportableComponentType(\n\tcomponentType: QuickActionsComponentType,\n): componentType is Exclude<QuickActionsComponentType, QuickActionsComponentType.LocalVectorSet> {\n\treturn componentType !== QuickActionsComponentType.LocalVectorSet\n}\n\nfunction getCodeImportActionForComponentType(componentType: QuickActionsComponentType): CodeImportQuickActionsType {\n\tassert(\n\t\tisImportableComponentType(componentType),\n\t\t`No code import action type for unimportable component type ${componentType}`,\n\t)\n\n\tswitch (componentType) {\n\t\tcase QuickActionsComponentType.LocalSmartComponent:\n\t\tcase QuickActionsComponentType.LocalCodeComponent:\n\t\t\treturn CodeImportQuickActionsType.LocalComponent\n\t\tcase QuickActionsComponentType.ExternalModuleComponent:\n\t\t\treturn CodeImportQuickActionsType.ExternalComponent\n\t\tdefault:\n\t\t\tassertNever(componentType)\n\t}\n}\n\nexport const insertCodeComponentToPossibleParent = engine.scheduler.wrapHandler((node: CodeComponentNode) => {\n\tconst parent = getParentForInsertNode(node, engine)\n\tlet center = engine.stores.canvasStore.getCanvasCenter()\n\n\tconst parentRectCenter = parent ? Rect.center(convertFrameToCanvas(engine.tree, parent)) : null\n\tconst visibleCanvasRect = engine.stores.canvasStore.getCanvasVisibleRect()\n\tif (parentRectCenter && Rect.containsPoint(visibleCanvasRect, parentRectCenter)) {\n\t\tcenter = parentRectCenter\n\t}\n\n\tinsertComponent({\n\t\tengine: engine,\n\t\tcomponent: node,\n\t\tsource: \"quick_menu\",\n\t\tcanvasPoint: center,\n\t\tnotDraggedOntoCanvas: true,\n\t})\n})\n\nasync function performInsertComponentAction(componentLoader: ComponentLoader, component: ProjectComponent) {\n\tconst identifier =\n\t\tcomponent.type === QuickActionsComponentType.LocalVectorSet\n\t\t\t? await getDefaultVectorIdentifierForVectorSetId(component.id)\n\t\t\t: component.identifier\n\n\tif (!identifier) return\n\n\tconst definition = componentLoader.reactComponentForIdentifier(identifier)\n\tif (!definition) return\n\tconst node = codeComponentFromDefinition(definition)\n\tinsertCodeComponentToPossibleParent(node)\n}\n\nasync function getDefaultVectorIdentifierForVectorSetId(id: NodeID) {\n\tconst node = engine.tree.getNode(id)\n\tif (!isVectorSetNode(node)) return undefined\n\n\tconst loadedSet = node.isLoaded() ? node : await node.load()\n\tassert(isVectorSetNode(loadedSet), \"Vector set must be loaded.\")\n\tconst defaultVectorSetItem = loadedSet.children?.find(child => isVectorSetItem(child))\n\tif (!defaultVectorSetItem) return undefined\n\n\treturn localModuleIdentifierForStableName(ModuleType.Vector, defaultVectorSetItem.id, \"default\").value\n}\n\n/** Check if the current selection can be replaced with a component.  */\nfunction isReplaceActionPossible(vekterEngine: VekterEngine, mainView: ActiveMainView): boolean {\n\tif (mainView !== ActiveMainView.Canvas) return false\n\n\tconst nodes = vekterEngine.stores.selectionStore.nodes\n\tconst withoutDescendants = vekterEngine.tree.withoutDescendants(nodes)\n\tif (withoutDescendants.length === 0) return false\n\n\treturn withoutDescendants.every(node => canReplaceNode(node, { allowLockedNodes: true }))\n}\n\nfunction isExternalModuleComponent(item: ListItem): item is ExternalModuleComponent {\n\treturn item.type === \"externalModuleComponent\"\n}\n", "import type { AppAction } from \"app/AppActions.ts\"\nimport { createContextMenuItems } from \"document/components/utils/contextMenu.ts\"\nimport engine from \"document/engine.ts\"\nimport type { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { useMemo } from \"react\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\nimport {\n\tcollectQuickActionsFromMenuItemOptions,\n\tfindMenuItemOptionsItemWithId,\n} from \"./collectQuickActionsFromMenuItemOptions.ts\"\nimport { extractedMainMenuAppActions } from \"./extractedMainMenuAppActions.ts\"\n\n/**\n * Some of the most important main menu actions are extracted and grouped. These\n * have precedence over context actions. So context actions which role matches\n * an extracted main menu action should be excluded. */\nconst lazyGetAllExtractedMainMenuAppActions = (() => {\n\tlet result: ReadonlySet<AppAction> | undefined\n\n\treturn () => {\n\t\tif (result) return result\n\n\t\tconst allExtractedMainMenuActions: Set<AppAction> = new Set()\n\n\t\tObject.values(extractedMainMenuAppActions).forEach(appActionGroup => {\n\t\t\tObject.entries(appActionGroup).forEach(([appAction, isDefault]: [AppAction, boolean]) => {\n\t\t\t\tif (isDefault) allExtractedMainMenuActions.add(appAction)\n\t\t\t})\n\t\t})\n\n\t\treturn (result = allExtractedMainMenuActions)\n\t}\n})()\n\nexport function performContextMenuAction(id: string) {\n\tconst menuItems = createContextMenuItems(engine, engine.stores.chromeStore.mainView, engine.stores.selectionStore.ids)\n\tif (!menuItems) return\n\n\tconst menuItem = findMenuItemOptionsItemWithId(id, menuItems)\n\tmenuItem?.click?.()\n}\n\ninterface ContextMenuActionsResult {\n\tcontextMenuActionGroups: QuickActionsGroup[]\n\tcontextAppActions: Set<AppAction>\n}\n\n/**\n * @FIXME -- Temporarily hide the `Replace All Instances With` action as it\n * results in the duplicate items being highlighted in the UI. We need to\n * improve the quick menu selection logic so that items in different categories\n * with the same label or key are not confused.\n */\nconst editReasonsToExclude = new Set([\"replaceAllWith\", \"replaceWith\"])\n\n/** Turns all context menu items into quick actions. */\nexport function useContextMenuActions(mainView: ActiveMainView): ContextMenuActionsResult {\n\tconst ids = engine.stores.selectionStore.useState(state => state.ids)\n\n\treturn useMemo((): ContextMenuActionsResult => {\n\t\tconst menuItems = createContextMenuItems(engine, mainView, ids)\n\t\tconst contextAppActions: Set<AppAction> = new Set()\n\t\tif (!menuItems) return { contextMenuActionGroups: [], contextAppActions }\n\n\t\tconst quickActionItems: QuickActionsItem[] = []\n\t\tconst quickActionSubMenuGroups: QuickActionsGroup[] = []\n\n\t\tmenuItems.forEach(menuItem =>\n\t\t\tcollectQuickActionsFromMenuItemOptions(\n\t\t\t\tQuickActionsType.ContextMenuItem,\n\t\t\t\tmenuItem,\n\t\t\t\tquickActionItems,\n\t\t\t\tquickActionSubMenuGroups,\n\t\t\t\tcontextAppActions,\n\t\t\t\tlazyGetAllExtractedMainMenuAppActions(),\n\t\t\t\teditReasonsToExclude,\n\t\t\t),\n\t\t)\n\n\t\tconst contextMenuActionGroups: QuickActionsGroup[] = []\n\n\t\tif (quickActionItems.length > 0) {\n\t\t\tcontextMenuActionGroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.ContextMenuItem,\n\t\t\t\ttitle: \"\",\n\t\t\t\titems: quickActionItems,\n\t\t\t})\n\t\t}\n\n\t\tcontextMenuActionGroups.push(...quickActionSubMenuGroups)\n\n\t\treturn { contextMenuActionGroups, contextAppActions }\n\t}, [ids, mainView])\n}\n", "import type {\n\tAppAction,\n\tCodeAction,\n\tFileAction,\n\tHelpAction,\n\tPreferenceAction,\n\tSiteSettingsAction,\n\tSitesAction,\n\tViewAction,\n} from \"app/AppActions.ts\"\n\ntype ShouldBeExtracted = boolean\n\nconst pluginActions: Partial<Record<AppAction, ShouldBeExtracted>> = {\n\topenPlugins: true,\n}\n\nconst createActions: Partial<Record<AppAction, ShouldBeExtracted>> = {\n\tnewWebPage: true,\n\tmakeComponent: true,\n\tcreateAIKit: true,\n}\n\nconst createActionsForSmartComponent: Partial<Record<AppAction, ShouldBeExtracted>> = {\n\tmakeComponent: true,\n}\n\nconst createActionsForCanvasPage: Partial<Record<AppAction, ShouldBeExtracted>> = {}\n\nconst previewActions: Partial<Record<AppAction, ShouldBeExtracted>> = {\n\tshowPreview: true,\n}\n\nconst projectActions: Partial<Record<AppAction | SitesAction, ShouldBeExtracted>> = {\n\tpublishSite: true,\n\topenPublishedSite: true,\n\ttoggleVersionHistory: true,\n\tinviteCollaborators: true,\n}\n\nconst navigateActions: Partial<Record<ViewAction, ShouldBeExtracted>> = {\n\tshowPages: true,\n\tshowLayers: true,\n\tshowAssets: true,\n}\n\nconst siteSettingActions: Record<SitesAction, ShouldBeExtracted> &\n\tPartial<Record<FileAction, ShouldBeExtracted>> &\n\tPartial<Record<SiteSettingsAction, ShouldBeExtracted>> = {\n\topenAnalytics: false,\n\tpublishSite: false,\n\ttoggleLocalization: false,\n\topenPublishedSite: false,\n\tshowPreview: false,\n\ttogglePreviewInterface: false,\n\tpreviewNextBreakpoint: false,\n\tpreviewPreviousBreakpoint: false,\n\tinviteCollaborators: false,\n\topenUsage: false,\n\topenSettings: true,\n\topenGeneralSettings: true,\n\topenDomainSettings: true,\n\topenRedirects: true,\n\topenForms: true,\n\topenStagingAndVersions: true,\n\topenCustomCode: true,\n\topenPlans: true,\n\topenTemplates: false,\n\tsaveSiteSettings: true,\n}\n\nconst preferenceActions: Record<PreferenceAction, ShouldBeExtracted> = {\n\tnewContentAsDraft: true,\n\tuseDirectSelect: true,\n\tautoSwitchToLayers: true,\n\tuseSmartLayoutPins: true,\n\treverseZoomDirection: true,\n\tfastZoom: true,\n\tanimateOnZoom: true,\n\tkeyboardZoomsToSelection: true,\n\tshowScrollToContentToast: true,\n\tresetDefaultFrameBackground: true,\n\tnudgePreferences: true,\n\ttogglePerformanceMode: true,\n\ttoggleCanvasPages: true,\n\texitCanvasOnDoubleClick: true,\n\ttemplatesModalOnNewProject: true,\n}\n\nconst helpActions: Record<HelpAction, ShouldBeExtracted> = {\n\tsitesGetStarted: true,\n\tkeyboardShortcuts: true,\n\topenCommunity: true,\n\trequestFeature: true,\n\tcopyVersion: true,\n\tstartAppTour: true,\n\tcontactSupport: true,\n\tbrowseMarketplace: true,\n}\n\nconst codeActions: Record<CodeAction, ShouldBeExtracted> = {\n\tcreateCodeComponent: true,\n\tcreateOverride: true,\n\tsaveCodeFile: true,\n\tshowAPIDocumentation: true,\n}\n\nexport const extractedMainMenuAppActions = {\n\tpluginActions,\n\tcreateActions,\n\tcreateActionsForSmartComponent,\n\tcreateActionsForCanvasPage,\n\tpreviewActions,\n\tprojectActions,\n\tnavigateActions,\n\tsiteSettingActions,\n\tpreferenceActions,\n\thelpActions,\n\tcodeActions,\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport type { LocalModuleId, ModuleExportIdentifierString } from \"@framerjs/shared\"\nimport { assert, ModuleType, assertNever, isExternalModuleIdentifier, parseModuleIdentifier } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { getDefaultName } from \"document/components/utils/nodes.ts\"\nimport { showCanvasNode } from \"document/components/utils/showCanvasNode.ts\"\nimport { getWebPageDisplayTitle } from \"document/components/utils/webPageTitles.ts\"\nimport engine from \"document/engine.ts\"\nimport { DocumentLoader } from \"document/loader/DocumentLoader.ts\"\nimport {\n\ttype AnyScopeNode,\n\ttype CanvasNode,\n\ttype CanvasTree,\n\ttype CollectionNode,\n\ttype NodeID,\n\tRichTextNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { isScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport type { ComponentPresetNode } from \"document/models/CanvasTree/nodes/ComponentPresetNode.ts\"\nimport { CMS_ENTITY_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport type { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport {\n\tisCodeComponentNode,\n\tisCollectionItemNode,\n\tisCollectionNode,\n\tisComponentPresetNode,\n\tisExternalModuleNode,\n\tisPresetsListNode,\n\tisSmartComponentNode,\n\tisWebPageNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { hasCodeOverride } from \"document/models/CanvasTree/traits/WithCodeOverride.ts\"\nimport { hasLayoutTemplate } from \"document/models/CanvasTree/traits/WithLayoutTemplate.ts\"\nimport { hasTokenInNode } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport { ActiveContentPanelTab } from \"document/utils/ActiveEditorType.ts\"\nimport { useEffect, useState } from \"react\"\nimport { getCollectionItemName, getCollectionName } from \"utils/collectionUtils.ts\"\nimport { throttle } from \"utils/throttle.ts\"\nimport { expandAssetEntityItemsFromNode } from \"../../assets/utils/expandAssetEntityItems.ts\"\nimport { getAssetStylePopoutId } from \"../../properties/rows/StyleAssetRow.tsx\"\nimport { findComponentInstances } from \"../../properties/utils/findComponentInstances.ts\"\nimport { popoutWindow } from \"../../shared/PopoutWindow.tsx\"\nimport type { QuickActionsCategory, QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { FindNodesType, QuickActionsCategoryType, QuickActionsType } from \"../types.ts\"\n\ninterface FindNodesUsingStylePreset {\n\ttype: FindNodesType.StylePreset\n\ttitle: string\n\tpresetId: NodeID\n}\n\ninterface FindNodesUsingComponentPreset {\n\ttype: FindNodesType.ComponentPreset\n\ttitle: string\n\tpresetId: NodeID\n\tcomponentIdentifier: ModuleExportIdentifierString\n}\n\ninterface FindNodesUsingColorStyleToken {\n\ttype: FindNodesType.ColorStyleToken\n\ttitle: string\n\ttokenId: NodeID\n}\n\ninterface FindNodesUsingCodeComponent {\n\ttype: FindNodesType.CodeComponent\n\ttitle: string\n\tcomponentIdentifier: string | Set<string>\n}\n\ninterface FindNodesUsingVectorSet {\n\ttype: FindNodesType.VectorSet\n\ttitle: string\n\tcomponentIdentifier: Set<string>\n}\n\ninterface FindNodesUsingCodeFile {\n\ttype: FindNodesType.CodeFile\n\ttitle: string\n\tmoduleId: LocalModuleId\n}\n\nexport type FindNodesOptions =\n\t| FindNodesUsingStylePreset\n\t| FindNodesUsingComponentPreset\n\t| FindNodesUsingColorStyleToken\n\t| FindNodesUsingCodeComponent\n\t| FindNodesUsingCodeFile\n\t| FindNodesUsingVectorSet\ntype GroupNode = AnyScopeNode | CollectionNode | PresetsListNode\n\nconst noActionGroups: QuickActionsGroup[] = []\nObject.freeze(noActionGroups)\n\n/** Returns the active loader, but only if we need it for the quick menu. */\nfunction activeLoader(): DocumentLoader | undefined {\n\tif (engine.stores.treeStore.getDataTree()) return\n\tconst loader = engine.tree.getService(\"loader\")\n\tif (loader instanceof DocumentLoader) return loader\n}\n\n/**\n * Actions for finding nodes that use style or component preset, color style\n * token, code component or code override.\n */\nexport function useFindNodesQuickActions(activeCategory: QuickActionsCategory | undefined): {\n\tfindNodesActionGroups: QuickActionsGroup[]\n\tfindNodesLoading: boolean\n} {\n\tconst [nodesActionGroups, setNodesActionGroups] = useState<QuickActionsGroup[] | null>(null)\n\n\tconst findNodesActive = activeCategory?.type === QuickActionsCategoryType.FindNodes\n\n\tuseEffect(() => {\n\t\tif (!findNodesActive) {\n\t\t\tsetNodesActionGroups(null)\n\t\t\treturn\n\t\t}\n\n\t\tsetNodesActionGroups(null)\n\n\t\tlet unsubscribe: (() => void) | undefined\n\n\t\t// We need the setTimeout delay so the loading spinner will be rendered\n\t\t// before we start the computation of `findNodesActionGroups`. Once the\n\t\t// spinner is visible, the animation will run on the GPU and it won't be\n\t\t// blocked.\n\t\tconst timeoutId = setTimeout(() => {\n\t\t\tconst update = () => {\n\t\t\t\tswitch (activeCategory.options.type) {\n\t\t\t\t\t// These options require tree walk(),\n\t\t\t\t\t// meaning it will block a lot if we stream updates on scope load events.\n\t\t\t\t\tcase FindNodesType.ColorStyleToken:\n\t\t\t\t\tcase FindNodesType.CodeFile:\n\t\t\t\t\tcase FindNodesType.CodeComponent:\n\t\t\t\t\tcase FindNodesType.VectorSet:\n\t\t\t\t\t\tif (activeLoader()) return\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tcase FindNodesType.StylePreset:\n\t\t\t\t\tcase FindNodesType.ComponentPreset:\n\t\t\t\t\t\t/* noop */\n\t\t\t\t\t\tbreak\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassertNever(activeCategory.options)\n\t\t\t\t}\n\t\t\t\tconst groups = findNodesActionGroups(activeCategory.options)\n\t\t\t\tsetNodesActionGroups(groups)\n\t\t\t}\n\n\t\t\t// render already available data\n\t\t\tupdate()\n\n\t\t\t// if there is no loader, we have nothing to load\n\t\t\tconst loader = activeLoader()\n\t\t\tif (!loader) return\n\n\t\t\tconst stopLoading = loader.prioritizeLoadingAllData({\n\t\t\t\toperationInBackground: false,\n\t\t\t\toperationName: \"quick_actions_find_nodes\",\n\t\t\t})\n\n\t\t\tconst throttleUpdate = throttle(update, 250)\n\t\t\tlet updateTimeout: number | undefined\n\t\t\tconst loadedScopeHandler = () => {\n\t\t\t\tupdateTimeout = window.setTimeout(throttleUpdate)\n\t\t\t}\n\t\t\tloader.on(\"loadedScope\", loadedScopeHandler)\n\n\t\t\tconst allDataLoadedHandler = () => {\n\t\t\t\t// If all data has loaded, cancel any throttling updates, any update timeout, and\n\t\t\t\t// run the update in its own task.\n\t\t\t\t//\n\t\t\t\t// This avoids an issue that, if the last loadedScope is called, and throttle hasn't\n\t\t\t\t// been called for a while, then the update might run before the loader disappeared.\n\t\t\t\tthrottleUpdate.cancel()\n\t\t\t\tclearTimeout(updateTimeout)\n\t\t\t\tsetTimeout(update)\n\t\t\t}\n\t\t\tloader.on(\"loadedAllData\", allDataLoadedHandler)\n\n\t\t\tunsubscribe = () => {\n\t\t\t\tstopLoading()\n\t\t\t\tloader.off(\"loadedScope\", loadedScopeHandler)\n\t\t\t\tloader.off(\"loadedAllData\", allDataLoadedHandler)\n\t\t\t\tthrottleUpdate.cancel()\n\t\t\t\tclearTimeout(updateTimeout)\n\t\t\t}\n\t\t}, 300)\n\n\t\treturn () => {\n\t\t\tclearTimeout(timeoutId)\n\t\t\tunsubscribe?.()\n\t\t}\n\t}, [activeCategory, findNodesActive])\n\n\treturn {\n\t\tfindNodesActionGroups: nodesActionGroups ?? noActionGroups,\n\t\tfindNodesLoading: activeLoader() ? findNodesActive : !nodesActionGroups && findNodesActive,\n\t}\n}\n\nfunction findNodesActionGroups(findNodesOptions: FindNodesOptions) {\n\tconst dataTree = engine.stores.treeStore.getDataTree()\n\tconst tree = dataTree?.getCanvasTreeProxy() ?? engine.tree\n\tconst nodes = findNodes(findNodesOptions)\n\n\tconst itemsByGroupNode = new Map<GroupNode, QuickActionsItem[]>()\n\tfor (const node of nodes.values()) {\n\t\tconst groupNode = getGroupNode(tree, node)\n\t\tif (!groupNode) continue\n\n\t\t// Don't show replica nodes if we already show the master node.\n\t\tconst originalId = node.originalid\n\t\tif (originalId && nodes.has(originalId)) continue\n\n\t\tconst items = itemsByGroupNode.get(groupNode) ?? []\n\t\titemsByGroupNode.set(groupNode, items)\n\n\t\titems.push({\n\t\t\tkind: \"item\",\n\t\t\ttype: QuickActionsType.FindNodes,\n\t\t\tid: node.id,\n\t\t\tname: getTitleForCanvasNode(engine.componentLoader, tree, node),\n\t\t})\n\t}\n\n\tconst result: QuickActionsGroup[] = []\n\tfor (const [scopeNode, items] of itemsByGroupNode) {\n\t\titems.sort((a, b) => a.name.toString().localeCompare(b.name.toString()))\n\t\tresult.push({\n\t\t\tkind: \"group\",\n\t\t\tkey: scopeNode.id,\n\t\t\ttype: QuickActionsType.FindNodes,\n\t\t\ttitle: getTitleForGroupNode(engine.componentLoader, tree, scopeNode),\n\t\t\titems,\n\t\t})\n\t}\n\n\tresult.sort((a, b) => a.title.toString().localeCompare(b.title.toString()))\n\treturn result\n}\n\nfunction findNodesUsingStylePreset({ presetId }: FindNodesUsingStylePreset) {\n\tconst nodes = new Map<NodeID, CanvasNode>()\n\tengine.stores.treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.whereClass(RichTextNode)\n\t\t.forEach(node => {\n\t\t\tconst nodePresetIds = node.getStylePresetIdsForCodeGeneration()\n\t\t\tif (nodePresetIds.has(presetId)) {\n\t\t\t\tnodes.set(node.id, node)\n\t\t\t}\n\t\t})\n\treturn nodes\n}\n\nfunction findNodesUsingComponentPreset({ presetId, componentIdentifier }: FindNodesUsingComponentPreset) {\n\tconst nodes = new Map<NodeID, CanvasNode>()\n\tengine.stores.treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.whereClass(RichTextNode)\n\t\t.forEach(node => {\n\t\t\tif (isVariableReference(node.htmlContent) && node.getComponentPreset(componentIdentifier) === presetId) {\n\t\t\t\tnodes.set(node.id, node)\n\t\t\t}\n\t\t})\n\treturn nodes\n}\n\nfunction findNodesUsingColorStyleToken({ tokenId }: FindNodesUsingColorStyleToken) {\n\tconst nodes = new Map<NodeID, CanvasNode>()\n\t// TODO: notice this is essentially a full tree traversal. And then traverses each value in the\n\t// nodes. This is expensive.\n\tengine.stores.treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.forEach(node => {\n\t\t\tif (hasTokenInNode(node, tokenId)) {\n\t\t\t\tnodes.set(node.id, node)\n\t\t\t}\n\t\t})\n\treturn nodes\n}\n\nfunction findNodesUsingCodeFile({ moduleId }: FindNodesUsingCodeFile) {\n\tconst nodes = new Map<NodeID, CanvasNode>()\n\t// TODO: If the implementation will not require full tree traversal please also consider\n\t// updating the loading part of scopes inside useFindNodesQuickActions\n\tengine.stores.treeStore\n\t\t.query()\n\t\t.partial(true)\n\t\t.forEach(node => {\n\t\t\tif (hasCodeOverride(node) && node.codeOverrideIdentifier.includes(moduleId)) {\n\t\t\t\tnodes.set(node.id, node)\n\t\t\t} else if (isCodeComponentNode(node) && node.codeComponentIdentifier.includes(moduleId)) {\n\t\t\t\tnodes.set(node.id, node)\n\t\t\t}\n\t\t})\n\treturn nodes\n}\n\nfunction findNodes(options: FindNodesOptions): Map<NodeID, CanvasNode> {\n\tswitch (options.type) {\n\t\tcase FindNodesType.StylePreset:\n\t\t\treturn findNodesUsingStylePreset(options)\n\n\t\tcase FindNodesType.ComponentPreset:\n\t\t\treturn findNodesUsingComponentPreset(options)\n\n\t\tcase FindNodesType.ColorStyleToken:\n\t\t\treturn findNodesUsingColorStyleToken(options)\n\n\t\tcase FindNodesType.VectorSet:\n\t\t\treturn findComponentInstances(ModuleType.Vector, engine, options.componentIdentifier)\n\t\tcase FindNodesType.CodeComponent:\n\t\t\treturn findComponentInstances(ModuleType.Canvas, engine, options.componentIdentifier)\n\n\t\tcase FindNodesType.CodeFile:\n\t\t\treturn findNodesUsingCodeFile(options)\n\n\t\tdefault:\n\t\t\tassertNever(options)\n\t}\n}\n\nfunction getGroupNode(tree: CanvasTree, node: CanvasNode): GroupNode | null {\n\tif (isCollectionItemNode(node)) {\n\t\treturn tree.getNodeWithTrait(node.parentid, isCollectionNode)\n\t}\n\n\tif (isComponentPresetNode(node)) {\n\t\treturn tree.getNodeWithTrait(node.parentid, isPresetsListNode)\n\t}\n\n\treturn tree.getScopeNodeFor(node)\n}\n\nfunction getTitleForCanvasNode(componentLoader: ComponentLoader, tree: CanvasTree, node: CanvasNode) {\n\tif (isCollectionItemNode(node)) {\n\t\tconst collectionNode = tree.getNodeWithTrait(node.parentid, isCollectionNode)\n\t\tassert(collectionNode, \"Can't find parent for collection item\")\n\n\t\treturn getCollectionItemName(collectionNode, node)\n\t}\n\n\tif (isCodeComponentNode(node)) {\n\t\tconst componentDefinition = componentLoader.componentForIdentifier(node.codeComponentIdentifier)\n\t\tif (componentDefinition) return componentDefinition.name\n\n\t\t// External components might not be in the component loader if they aren't rendered in any scope that's\n\t\t// been visited in the session. We can instead get the name from the external module node that must be present.\n\t\tconst parsedIdentifier = parseModuleIdentifier(node.codeComponentIdentifier)\n\t\tif (isExternalModuleIdentifier(parsedIdentifier)) {\n\t\t\tconst externalModuleNode = tree.getNodeWithTrait(parsedIdentifier.moduleId, isExternalModuleNode)\n\t\t\tif (externalModuleNode) return externalModuleNode.getName()\n\t\t}\n\t}\n\n\tif (isWebPageNode(node) && hasLayoutTemplate(node)) {\n\t\tconst layoutTemplate = componentLoader.componentForIdentifier(node.layoutTemplateIdentifier)\n\t\tif (layoutTemplate) return layoutTemplate.name\n\t}\n\n\treturn node.resolveValue(\"name\") || getDefaultName(componentLoader, node)\n}\n\nfunction getTitleForGroupNode(componentLoader: ComponentLoader, tree: CanvasTree, node: GroupNode) {\n\tif (isWebPageNode(node, true)) {\n\t\tif (node.dataIdentifier) {\n\t\t\tconst data = componentLoader.dataForIdentifier(node.dataIdentifier)\n\t\t\tif (!data) return Dictionary.Unknown\n\t\t\treturn getWebPageDisplayTitle(tree, node, data)\n\t\t}\n\n\t\treturn getWebPageDisplayTitle(tree, node, null)\n\t}\n\n\tconst name = node.resolveValue(\"name\")\n\tif (isSmartComponentNode(node, true) && name) {\n\t\treturn name.split(\"/\")\n\t}\n\n\tif (isScopeNode(node, true)) {\n\t\treturn name ?? Dictionary.Unknown\n\t}\n\n\tif (isCollectionNode(node)) {\n\t\treturn getCollectionName(node)\n\t}\n\n\tif (isPresetsListNode(node)) {\n\t\treturn \"Styles\"\n\t}\n\n\treturn name ?? Dictionary.Unknown\n}\n\nfunction showComponentPresetNode(node: ComponentPresetNode) {\n\tengine.stores.chromeStore.contentPanelTab = ActiveContentPanelTab.Assets\n\n\tengine.scheduler.runBeforeNextFrame(() => {\n\t\texpandAssetEntityItemsFromNode(engine, node.id, CMS_ENTITY_ROOT_ID, false)\n\t\tpopoutWindow.navigation.presentPopout(getAssetStylePopoutId(node.id))\n\t})\n}\n\nexport function performFindNodesAction(nodeId: NodeID) {\n\tconst node = engine.tree.get(nodeId)\n\tif (!node) {\n\t\tconst dataTree = engine.stores.treeStore.getDataTree()\n\t\tconst node = dataTree?.get(nodeId)\n\t\tif (!node) return\n\t\tconst scope = dataTree?.getScopeNodeFor(node)\n\t\tif (!scope) return\n\t\tshowCanvasNode(engine, scope)\n\t\treturn\n\t}\n\n\tengine.stores.codeEditorStore.closeEditor()\n\n\tif (isComponentPresetNode(node)) {\n\t\tshowComponentPresetNode(node)\n\t} else if (isWebPageNode(node) && node.isLoaded()) {\n\t\t// If the target node is a web page then we should show the primary variant, this allows the user to see the template panel.\n\t\tshowCanvasNode(engine, node.getPrimaryVariant())\n\t} else {\n\t\tshowCanvasNode(engine, node)\n\t}\n}\n", "import { Dictionary } from \"app/dictionary.ts\"\nimport { EngineChange } from \"document/EngineChanges.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { AnyLayoutTemplateNode } from \"document/models/CanvasTree/index.ts\"\nimport { useEngineState } from \"document/useEngineState.ts\"\nimport { useMemo } from \"react\"\nimport { getId } from \"utils/getId.ts\"\nimport { type QuickActionsGroup, type QuickActionsItem, QuickActionsType } from \"../types.ts\"\n\nconst aliases: readonly Lowercase<string>[] = [\"layout\"]\n\nexport function useLayoutTemplateActions(engine: VekterEngine) {\n\tconst localLayoutTemplates = useEngineState(\n\t\t() => engine.stores.scopeStore.getLayoutTemplateNodes(),\n\t\t[],\n\t\t[EngineChange.LocalLayoutTemplates],\n\t)\n\n\tconst hash = useMemo(() => localLayoutTemplates.map(getId).join(\",\"), [localLayoutTemplates])\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: the hash is computed from the layout template ids.\n\tconst groups: QuickActionsGroup[] = useMemo(\n\t\t() => [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.LayoutTemplate,\n\t\t\t\ttitle: Dictionary.Templates,\n\t\t\t\titems: getLocalLayoutTemplateQuickActionItems(localLayoutTemplates),\n\t\t\t\taliases,\n\t\t\t},\n\t\t],\n\t\t[hash],\n\t)\n\n\treturn groups\n}\n\nfunction getLocalLayoutTemplateQuickActionItems(layoutTemplates: AnyLayoutTemplateNode[]) {\n\tconst layoutTemplateItems: QuickActionsItem[] = []\n\tfor (const node of layoutTemplates) {\n\t\tconst name = node.resolveValue(\"name\") ?? Dictionary.Template\n\t\tconst item: QuickActionsItem = {\n\t\t\tkind: \"item\",\n\t\t\ttype: QuickActionsType.LayoutTemplate,\n\t\t\tid: node.id,\n\t\t\tname,\n\t\t}\n\t\tlayoutTemplateItems.push(item)\n\t}\n\n\treturn layoutTemplateItems\n}\n", "import { stableExperiments } from \"@framerjs/app-config\"\nimport { assert, emptyArray, unhandledError } from \"@framerjs/shared\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { isArray, isFunction } from \"utils/typeChecks.ts\"\nimport {\n\talphaDefaultsRole,\n\tbetaDefaultsRole,\n\tchannelDefaultsRole,\n\tstableDefaultsRole,\n} from \"web/pages/project/employeesOnlyMenu/experimentsMenu.ts\"\nimport { featureSetNameToRole } from \"web/pages/project/employeesOnlyMenu/menuFromFeatureSet.ts\"\nimport { vekterGlobal } from \"web/pages/project/lib/TODO.ts\"\nimport type { MenuItemOptionsWithLabelOrSeparator } from \"web/pages/project/lib/convertServiceMenuItems.ts\"\nimport type { QuickActionsGroup, QuickActionsGroupType, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsCategoryType, QuickActionsGroupSpecificType, QuickActionsType } from \"../types.ts\"\nimport { createTitleFromLabelHierarchy } from \"./createTitleFromLabelHierarchy.ts\"\nimport { excludedAppActions } from \"./excludedAppActions.ts\"\nimport { extractedMainMenuAppActions } from \"./extractedMainMenuAppActions.ts\"\nimport { isPreferenceAction } from \"./getIconForQuickActionItem.tsx\"\nimport { getShortcutListForAppAction } from \"./getShortcutListForRole.ts\"\n\ntype EnabledMainMenuItems = Map<AppAction, QuickActionsItem>\n\nconst appActionTitleOverrides: Partial<Record<AppAction, string>> = {\n\t// Canvas Default Items\n\tcreateAIKit: \"Create AI Kit\u2026\",\n\tnewWebPage: \"Create Web Page\",\n\tnewWebPageFolder: \"Create Web Page Folder\",\n\tsortWebPagesAlphabetically: Dictionary.SortPagesAlphabetically,\n\tsortLayersAlphabetically: Dictionary.SortLayersAlphabetically,\n\tpublishSite: \"Publish Website\",\n\topenAnalytics: \"View Analytics\",\n\topenPublishedSite: \"Open Website\",\n\topenTemplates: \"View Templates\",\n\ttoggleContentManagement: `Open ${Dictionary.Cms}`,\n\ttoggleLocalization: `Open ${Dictionary.Localization}`,\n\ttoggleVersionHistory: \"See Version History\",\n}\n\nconst appActionAliases = new Map<AppAction, Lowercase<string>[]>([\n\t[\"inviteCollaborators\", [\"collaborators\", \"share\"]],\n\t[\"toggleAppearance\", [\"day\", \"night\", \"dark\", \"light\"]],\n\t[\"keyboardShortcuts\", [\"?\"]],\n\t[\"sitesGetStarted\", [\"get started\"]],\n])\n\nconst appActionGroupTitleOverrides: Partial<Record<QuickActionsGroupType, string>> = {\n\t[QuickActionsGroupSpecificType.Help]: Dictionary.Learn,\n}\n\nfunction collectQuickActionsFromMenu(\n\tmenuItem: MenuItemOptionsWithLabelOrSeparator,\n\tcollector: EnabledMainMenuItems,\n\tappActionsToExclude: Set<AppAction>,\n\tparentLabels: string[] | undefined = undefined,\n) {\n\tif (menuItem.type !== \"normal\") return\n\tif (menuItem.enabled === false) return\n\tif (menuItem.visible === false) return\n\n\tconst labels = parentLabels ? [...parentLabels, menuItem.label] : [menuItem.label]\n\n\tif (menuItem.submenu) {\n\t\tmenuItem.submenu.forEach(subMenuItem =>\n\t\t\tcollectQuickActionsFromMenu(subMenuItem, collector, appActionsToExclude, labels),\n\t\t)\n\t\treturn\n\t}\n\n\tif (!menuItem.role) return\n\tif (excludedAppActions.has(menuItem.role)) return\n\n\t// Prevent the same action being displayed both in the context and main menu sections\n\tif (appActionsToExclude.has(menuItem.role)) return\n\n\tconst titleOverride = appActionTitleOverrides[menuItem.role]\n\tconst isExperimentAction = labels.some(l => l === \"Experiments\")\n\tconst supportsChecked = isExperimentAction || isPreferenceAction(menuItem.role)\n\n\tconst action: QuickActionsItem = {\n\t\tkind: \"item\",\n\t\tid: menuItem.role,\n\t\ttype: QuickActionsType.MainMenuItem,\n\t\tname: titleOverride ?? createTitleFromLabelHierarchy(labels, isExperimentAction ? undefined : menuItem.checked),\n\t\taliases: appActionAliases.get(menuItem.role),\n\t\tshortcut: getShortcutListForAppAction(menuItem.role),\n\t\tappAction: menuItem.role,\n\t\t...(supportsChecked && { checked: menuItem.checked }),\n\t}\n\n\tcollector.set(menuItem.role, action)\n}\n\nexport function performMainMenuAction(action: AppAction) {\n\tconst actionManager = vekterGlobal?.actionManager\n\tif (!actionManager) return\n\tactionManager\n\t\t.getActionHandler(action)\n\t\t.then(handler => handler.action({ metaKey: false, ctrlKey: false, altKey: false, shiftKey: false }))\n\t\t.catch(unhandledError)\n}\n\nconst experimentNames = Object.keys(stableExperiments)\nconst experimentActions = {\n\t[channelDefaultsRole]: true,\n\t[stableDefaultsRole]: true,\n\t[betaDefaultsRole]: true,\n\t[alphaDefaultsRole]: true,\n\t...Object.fromEntries(experimentNames.map(name => [featureSetNameToRole(name, \"experiments\"), true])),\n} as Partial<Record<AppAction, true>>\n\ninterface QuickActionsItemOverride {\n\ticon?: QuickActionsItem[\"icon\"]\n\ttint?: QuickActionsItem[\"tint\"]\n\temptyStateForCategories?: QuickActionsItem[\"emptyStateForCategories\"]\n\twithInnerShadow?: QuickActionsItem[\"withInnerShadow\"]\n}\n\ntype QuickActionsItemOverrideConfig =\n\t| QuickActionsItemOverride\n\t| ((item: QuickActionsItem) => QuickActionsItemOverride | undefined)\n\nfunction extractActions(\n\tallActions: EnabledMainMenuItems,\n\tsubset: Partial<Record<AppAction, boolean>>,\n\tisExperiment: boolean,\n\titemOverride: QuickActionsItemOverrideConfig = {},\n): QuickActionsItem[] {\n\tconst quickActionItems: QuickActionsItem[] = []\n\n\tObject.entries(subset).forEach(([action, include]: [AppAction, boolean]) => {\n\t\tif (!include) return\n\t\tconst item = allActions.get(action)\n\t\tif (!item) return\n\n\t\tquickActionItems.push({\n\t\t\t...item,\n\t\t\t...(isExperiment && {\n\t\t\t\ticon: item.checked ? \"IconToggleOn\" : \"IconToggleOff\",\n\t\t\t}),\n\t\t\t...(isFunction(itemOverride) ? itemOverride(item) : itemOverride),\n\t\t})\n\t\tallActions.delete(action)\n\t})\n\n\treturn quickActionItems\n}\n\nfunction extractActionGroup(\n\tenabledMainMenuItems: EnabledMainMenuItems,\n\tsubset: Partial<Record<AppAction, boolean>>,\n\t{ type, title, aliases }: Pick<QuickActionsGroup, \"type\" | \"title\" | \"aliases\">,\n\titemOverride: QuickActionsItemOverrideConfig | undefined = undefined,\n): QuickActionsGroup[] {\n\tconst result: QuickActionsGroup[] = []\n\tconst quickActions = extractActions(\n\t\tenabledMainMenuItems,\n\t\tsubset,\n\t\ttype === QuickActionsGroupSpecificType.Experiments,\n\t\titemOverride,\n\t)\n\tif (quickActions.length > 0) {\n\t\tconst groupTitle = appActionGroupTitleOverrides[type] ?? title\n\t\tresult.push({ kind: \"group\", type, title: groupTitle, items: quickActions, aliases })\n\n\t\tquickActions.forEach(action => {\n\t\t\tif (!isArray(action.name)) return\n\n\t\t\t// Remove all but the last label\n\t\t\tconst lastNameSegment = action.name[action.name.length - 1]\n\t\t\tassert(lastNameSegment)\n\n\t\t\taction.name = lastNameSegment\n\t\t})\n\t}\n\treturn result\n}\n\nconst helpActionsInDefaultEmptyState: Set<AppAction> = new Set([\n\t\"keyboardShortcuts\",\n\t\"sitesGetStarted\",\n\t\"browseMarketplace\",\n])\n\n/**\n * Returns override configuration for help action items that should appear in the default empty state.\n */\nfunction getHelpActionOverrides(item: QuickActionsItem): QuickActionsItemOverride | undefined {\n\tif (!item.appAction) return undefined\n\tif (!helpActionsInDefaultEmptyState.has(item.appAction)) return undefined\n\n\treturn {\n\t\temptyStateForCategories: new Set([QuickActionsCategoryType.Default]),\n\t}\n}\n\nfunction getCanvasActionSubset(scopeType: ScopeType): Partial<Record<AppAction, boolean>> {\n\tswitch (scopeType) {\n\t\tcase ScopeType.SmartComponent:\n\t\t\treturn extractedMainMenuAppActions.createActionsForSmartComponent\n\t\tcase ScopeType.CanvasPage:\n\t\t\treturn extractedMainMenuAppActions.createActionsForCanvasPage\n\t\tdefault:\n\t\t\treturn extractedMainMenuAppActions.createActions\n\t}\n}\n\nconst noMenuItems = emptyArray<MenuItemOptionsWithLabelOrSeparator>()\n\n/** Turns all main menu items into quick actions. */\nexport function useMainMenuActions(\n\tcontextAppActions: Set<AppAction>,\n\tisHistoryModeActive: boolean,\n\tscopeType: ScopeType,\n\tviewOnly: boolean,\n): {\n\topenPluginsActionGroups: readonly QuickActionsGroup[]\n\tpreviewActionGroups: readonly QuickActionsGroup[]\n\tprojectActionGroups: readonly QuickActionsGroup[]\n\tnavigateActionGroups: readonly QuickActionsGroup[]\n\tsiteSettingsActionGroups: readonly QuickActionsGroup[]\n\tpreferenceActionGroups: readonly QuickActionsGroup[]\n\thelpActionGroups: readonly QuickActionsGroup[]\n\tcodeActionGroups: readonly QuickActionsGroup[]\n\texperimentActionGroups: readonly QuickActionsGroup[]\n\tmainMenuActionGroups: readonly QuickActionsGroup[]\n\tmenuDidLoad: boolean\n} {\n\tconst [menuItems, setMenuItems] = useState(noMenuItems)\n\n\t// We have to await main menu validation. This async process makes sure\n\t// all menu items have the correct state.\n\tuseEffect(() => {\n\t\tlet active = true\n\n\t\tconst actionManager = vekterGlobal?.actionManager\n\t\tif (!actionManager) return\n\n\t\tactionManager\n\t\t\t.validateMenu(actionManager.menu)\n\t\t\t.then(() => {\n\t\t\t\tif (!active) return\n\n\t\t\t\t// We create a new array to force a re-render because the menu items are equal by reference\n\t\t\t\tsetMenuItems([...actionManager.menu])\n\t\t\t})\n\t\t\t.catch(unhandledError)\n\n\t\treturn () => {\n\t\t\tactive = false\n\t\t}\n\t}, [contextAppActions, viewOnly])\n\n\treturn useMemo(() => {\n\t\tconst enabledMainMenuItems: EnabledMainMenuItems = new Map()\n\t\tmenuItems.forEach(menuItem => collectQuickActionsFromMenu(menuItem, enabledMainMenuItems, contextAppActions))\n\n\t\tconst openPluginsActionGroups = extractActionGroup(\n\t\t\tenabledMainMenuItems,\n\t\t\textractedMainMenuAppActions.pluginActions,\n\t\t\t{\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginMarketplace,\n\t\t\t\ttitle: Dictionary.Plugins,\n\t\t\t},\n\t\t\t{ icon: \"IconPlugins\", withInnerShadow: true },\n\t\t)\n\n\t\tconst canvasActionSubset = getCanvasActionSubset(scopeType)\n\n\t\tconst previewActionGroups = extractActionGroup(enabledMainMenuItems, extractedMainMenuAppActions.previewActions, {\n\t\t\ttype: QuickActionsGroupSpecificType.Preview,\n\t\t\ttitle: \"Preview\",\n\t\t})\n\n\t\tconst projectActionSubset = { ...canvasActionSubset, ...extractedMainMenuAppActions.projectActions }\n\n\t\t// The project actions are hidden when history mode is active, but we extract the project actions in that case\n\t\t// so that they will be removed from enabledMainMenuItems, thus won't be visible in the Main Menu group when you\n\t\t// search for it.\n\t\tlet projectActionGroups = extractActionGroup(enabledMainMenuItems, projectActionSubset, {\n\t\t\ttype: QuickActionsGroupSpecificType.Project,\n\t\t\ttitle: Dictionary.Project,\n\t\t})\n\n\t\tif (isHistoryModeActive) {\n\t\t\tprojectActionGroups = []\n\t\t}\n\n\t\tconst navigateActionGroups = extractActionGroup(enabledMainMenuItems, extractedMainMenuAppActions.navigateActions, {\n\t\t\ttype: QuickActionsGroupSpecificType.Navigate,\n\t\t\ttitle: \"Navigate\",\n\t\t})\n\n\t\tconst siteSettingsActionGroups = extractActionGroup(\n\t\t\tenabledMainMenuItems,\n\t\t\textractedMainMenuAppActions.siteSettingActions,\n\t\t\t{ type: QuickActionsGroupSpecificType.SiteSettings, title: Dictionary.SiteSettings },\n\t\t)\n\n\t\tconst preferenceActionGroups = extractActionGroup(\n\t\t\tenabledMainMenuItems,\n\t\t\textractedMainMenuAppActions.preferenceActions,\n\t\t\t{ type: QuickActionsGroupSpecificType.Preferences, title: \"Preferences\" },\n\t\t)\n\n\t\tconst helpActionGroups = extractActionGroup(\n\t\t\tenabledMainMenuItems,\n\t\t\textractedMainMenuAppActions.helpActions,\n\t\t\t{\n\t\t\t\ttype: QuickActionsGroupSpecificType.Help,\n\t\t\t\ttitle: \"Help\",\n\t\t\t},\n\t\t\t(item: QuickActionsItem) => getHelpActionOverrides(item),\n\t\t)\n\n\t\tconst codeActionGroups = extractActionGroup(enabledMainMenuItems, extractedMainMenuAppActions.codeActions, {\n\t\t\ttype: QuickActionsGroupSpecificType.Code,\n\t\t\ttitle: Dictionary.Code,\n\t\t})\n\n\t\tconst experimentActionGroups = extractActionGroup(enabledMainMenuItems, experimentActions, {\n\t\t\ttype: QuickActionsGroupSpecificType.Experiments,\n\t\t\ttitle: \"Experiments\",\n\t\t})\n\t\tconst mainMenuActionGroups: QuickActionsGroup[] = []\n\n\t\tconst automaticallyGroupedItems = new Map<string, QuickActionsItem[]>()\n\n\t\tfor (const [appAction, item] of enabledMainMenuItems.entries()) {\n\t\t\tif (!isArray(item.name)) continue\n\n\t\t\tconst groupTitle = item.name.at(-2)\n\t\t\tif (!groupTitle) continue\n\n\t\t\tconst lastLabel = item.name.at(-1)\n\t\t\tif (!lastLabel) continue\n\t\t\titem.name = lastLabel\n\n\t\t\tconst items = automaticallyGroupedItems.get(groupTitle) ?? []\n\t\t\tautomaticallyGroupedItems.set(groupTitle, items)\n\t\t\titems.push(item)\n\n\t\t\tenabledMainMenuItems.delete(appAction)\n\t\t}\n\n\t\tfor (const [groupTitle, items] of automaticallyGroupedItems.entries()) {\n\t\t\tmainMenuActionGroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.MainMenuItem,\n\t\t\t\ttitle: groupTitle,\n\t\t\t\titems,\n\t\t\t})\n\t\t}\n\n\t\tconst remainingMainMenuItems = Array.from(enabledMainMenuItems.values())\n\t\tif (remainingMainMenuItems.length) {\n\t\t\tmainMenuActionGroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.MainMenuItem,\n\t\t\t\ttitle: \"Main Menu\",\n\t\t\t\titems: remainingMainMenuItems,\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\topenPluginsActionGroups,\n\t\t\tpreviewActionGroups,\n\t\t\tprojectActionGroups,\n\t\t\tnavigateActionGroups,\n\t\t\tsiteSettingsActionGroups,\n\t\t\tpreferenceActionGroups,\n\t\t\thelpActionGroups,\n\t\t\tcodeActionGroups,\n\t\t\texperimentActionGroups,\n\t\t\tmainMenuActionGroups,\n\t\t\tmenuDidLoad: menuItems.length > 0,\n\t\t}\n\t}, [menuItems, contextAppActions, isHistoryModeActive, scopeType])\n}\n", "import type { MenuItemOptions } from \"@framerjs/framer-services\"\nimport type { ActionHandler, ActionHandlers } from \"../lib/ActionManager.ts\"\n\ntype MenuAndActionHandler =\n\t| { type: \"separator\" }\n\t| (Omit<ActionHandler, \"label\"> & {\n\t\t\ttype?: \"normal\"\n\t\t\tlabel: string\n\t\t\trole: string\n\t\t\taccelerator?: string\n\t\t\t// Renamed to not conflict with constant label.\n\t\t\tdynamicLabel?(): string | undefined\n\t  })\n\t| {\n\t\t\ttype?: \"normal\"\n\t\t\tlabel: string\n\t\t\trole?: undefined\n\t\t\tsubmenu: MenuAndActionHandler[]\n\t  }\n\n// This is a convenience function for avoiding unergonomic code when creating menus.\n// This will go away with a refactor of how we do menus in general.\nexport function createMenuAndActionHandlers(...handlers: MenuAndActionHandler[]): [MenuItemOptions[], ActionHandlers] {\n\tconst options: MenuItemOptions[] = []\n\tconst actionHandlers: ActionHandlers = {}\n\n\tfor (const handler of handlers) {\n\t\tif (handler.type === \"separator\") {\n\t\t\toptions.push({ type: \"separator\" })\n\t\t\tcontinue\n\t\t}\n\t\tconst { label, role } = handler\n\n\t\tif (handler.role) {\n\t\t\tconst { action, checked, dynamicLabel, enabled, visible } = handler\n\t\t\tactionHandlers[handler.role] = { action, checked, label: dynamicLabel, enabled, visible }\n\t\t}\n\t\tlet submenu: MenuItemOptions[\"submenu\"] | undefined\n\t\tif (\"submenu\" in handler && handler.submenu) {\n\t\t\tconst [submenuOptions, submenuActionHandlers] = createMenuAndActionHandlers(...handler.submenu)\n\t\t\tsubmenu = submenuOptions\n\t\t\tObject.assign(actionHandlers, submenuActionHandlers)\n\t\t}\n\t\tconst accelerator = \"accelerator\" in handler ? handler.accelerator : undefined\n\t\toptions.push({ label, role, submenu, accelerator })\n\t}\n\n\treturn [options, actionHandlers]\n}\n", "import type { ExperimentName } from \"@framerjs/app-config\"\nimport {\n\talphaExperiments,\n\tbetaExperiments,\n\texperimentNeedsFullReload,\n\tgetExperimentVariants,\n\tstableExperiments,\n} from \"@framerjs/app-config\"\nimport type { MenuItemOptions } from \"@framerjs/framer-services\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport {\n\tdefaultExperimentsForChannel,\n\texperiments,\n\tresetExperiments,\n\tupdateExperimentsStorage,\n} from \"app/experiments.ts\"\nimport { objectKeys } from \"library/utils/objectKeys.ts\"\nimport type { ActionHandlers } from \"../lib/ActionManager.ts\"\nimport { createMenuAndActionHandlers } from \"./createMenuAndActionHandlers.ts\"\nimport { featureSetNameToLabel, featureSetNameToRole } from \"./menuFromFeatureSet.ts\"\n\nfunction isExperimentConfigAs(config: Partial<Record<ExperimentName, string>>) {\n\tfor (const _key in config) {\n\t\tconst key = _key as ExperimentName\n\t\tif (!experiments.is(key, config[key] as string)) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunction isExperimentsConfigAsDefault() {\n\treturn isExperimentConfigAs(defaultExperimentsForChannel())\n}\n\nfunction isExperimentsConfigAsStable() {\n\treturn isExperimentConfigAs(stableExperiments)\n}\n\nfunction isExperimentsConfigAsBeta() {\n\treturn isExperimentConfigAs({ ...stableExperiments, ...betaExperiments })\n}\n\nfunction isExperimentsConfigAsAlpha() {\n\treturn isExperimentConfigAs({ ...stableExperiments, ...betaExperiments, ...alphaExperiments })\n}\n\nexport const channelDefaultsRole = \"defaultExperiments\"\nexport const stableDefaultsRole = \"stableDefaults\"\nexport const betaDefaultsRole = \"betaDefaults\"\nexport const alphaDefaultsRole = \"alphaDefaults\"\n\nfunction createExtraExperimentsMenu(): [MenuItemOptions[], ActionHandlers] {\n\treturn createMenuAndActionHandlers(\n\t\t// Resetting experiments.\n\t\t{\n\t\t\tlabel: \"Channel Defaults\",\n\t\t\trole: channelDefaultsRole,\n\t\t\tenabled: () => !isExperimentsConfigAsDefault(),\n\t\t\tchecked: () => isExperimentsConfigAsDefault(),\n\t\t\taction: () => {\n\t\t\t\tresetExperiments({ resetStorage: true, resetSession: true })\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: \"Stable defaults\",\n\t\t\trole: stableDefaultsRole,\n\t\t\tenabled: () => !isExperimentsConfigAsStable(),\n\t\t\tchecked: () => isExperimentsConfigAsStable(),\n\t\t\taction: () => {\n\t\t\t\texperiments.update(stableExperiments)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: \"Beta defaults\",\n\t\t\trole: betaDefaultsRole,\n\t\t\tenabled: () => !isExperimentsConfigAsBeta(),\n\t\t\tchecked: () => isExperimentsConfigAsBeta(),\n\t\t\taction: () => {\n\t\t\t\texperiments.update(betaExperiments)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tlabel: \"Alpha defaults\",\n\t\t\trole: alphaDefaultsRole,\n\t\t\tenabled: () => !isExperimentsConfigAsAlpha(),\n\t\t\tchecked: () => isExperimentsConfigAsAlpha(),\n\t\t\taction: () => {\n\t\t\t\texperiments.update(alphaExperiments)\n\t\t\t},\n\t\t},\n\t\t{ type: \"separator\" },\n\t)\n}\n\nconst experimentsMenuLabel = \"Experiments\"\n\nexport function experimentsMenu(): [MenuItemOptions, ActionHandlers] {\n\tconst menu = menuFromExperimentsFeatureSet()\n\tconst [extraMenuOptions, extraMenuActionHandlers] = createExtraExperimentsMenu()\n\n\tconst menuItem: MenuItemOptions = {\n\t\tlabel: experimentsMenuLabel,\n\t\tsubmenu: [...extraMenuOptions, ...menu.options],\n\t}\n\treturn [menuItem, { ...extraMenuActionHandlers, ...menu.actionHandlers }]\n}\n\n// NOTE: Very similar to `menuFromFeatureSet`\nfunction menuFromExperimentsFeatureSet() {\n\tconst options: MenuItemOptions[] = []\n\tconst actionHandlers: ActionHandlers = {}\n\tfor (const name of objectKeys(stableExperiments).sort()) {\n\t\t// This cast is needed to set it to the role of options, it works\n\t\t// because we immediately define the role in actionHandlers\n\n\t\tconst variants = getExperimentVariants(name)\n\t\tif (variants) {\n\t\t\tconst submenu: MenuItemOptions[] = []\n\n\t\t\tfor (const variant of variants) {\n\t\t\t\tconst role = featureSetNameToRole(`${name}_${variant}`, \"experiments\") as AppAction\n\t\t\t\tsubmenu.push({\n\t\t\t\t\tlabel: featureSetNameToLabel(variant),\n\t\t\t\t\tbadge: experimentBadgeForVariant(name, variant),\n\t\t\t\t\trole,\n\t\t\t\t})\n\n\t\t\t\tactionHandlers[role] = {\n\t\t\t\t\tchecked: () => experiments.is(name, variant),\n\t\t\t\t\taction: () => {\n\t\t\t\t\t\tconst change = { [name]: variant }\n\t\t\t\t\t\texperiments.update(change)\n\t\t\t\t\t\tupdateExperimentsStorage(change)\n\t\t\t\t\t\tif (experimentNeedsFullReload(name)) {\n\t\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.push({\n\t\t\t\tlabel: featureSetNameToLabel(name),\n\t\t\t\tbadge: experimentBadge(name),\n\t\t\t\tsubmenu,\n\t\t\t})\n\t\t} else {\n\t\t\tconst role = featureSetNameToRole(name, \"experiments\") as AppAction\n\t\t\toptions.push({\n\t\t\t\tlabel: featureSetNameToLabel(name),\n\t\t\t\tbadge: experimentBadge(name),\n\t\t\t\trole,\n\t\t\t})\n\t\t\tactionHandlers[role] = {\n\t\t\t\tchecked: () => experiments.isOn(name),\n\t\t\t\taction: () => {\n\t\t\t\t\tconst change = { [name]: experiments.isOn(name) ? \"off\" : \"on\" }\n\t\t\t\t\texperiments.update(change)\n\t\t\t\t\tupdateExperimentsStorage(change)\n\t\t\t\t\tif (experimentNeedsFullReload(name)) {\n\t\t\t\t\t\twindow.location.reload()\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\treturn { options, actionHandlers }\n}\n\nfunction experimentBadgeForVariant(name: ExperimentName, variant: string) {\n\tif (betaExperiments[name as keyof typeof betaExperiments] === variant) return \"beta\"\n\tif (alphaExperiments[name as keyof typeof alphaExperiments] === variant) return \"alpha\"\n}\n\nfunction experimentBadge(name: ExperimentName) {\n\tif (betaExperiments[name as keyof typeof betaExperiments] === \"on\") return \"beta\"\n\tif (alphaExperiments[name as keyof typeof alphaExperiments] === \"on\") return \"alpha\"\n}\n", "import type { VekterGlobals } from \"app/globals.ts\"\nimport engine from \"document/engine.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { useEffect } from \"react\"\nimport type { ActionManager } from \"./ActionManager.ts\"\n\n// TODO: Replace all code here with better solutions.\n\n// biome-ignore lint/suspicious/noExplicitAny: @TODO add explanation\ntype Handler = (...args: any[]) => void\nlet handlers: { [method: string]: Handler[] } = {}\n\nexport let vekterGlobal: VekterWindow | null = window as any\n\nexport const TODO_Bridge = new (class {\n\tupdateActionManager(actionManager: ActionManager) {\n\t\tif (!vekterGlobal) return\n\t\tvekterGlobal.actionManager = actionManager\n\t}\n\n\thotKeysDisabled() {\n\t\tif (engine.stores.chromeStore.isProjectMenuOpen) {\n\t\t\treturn true\n\t\t}\n\n\t\tswitch (engine.stores.chromeStore.mainView) {\n\t\t\tcase ActiveMainView.Preview:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\treturn false\n\t\t}\n\t}\n})()\n\nexport function TODO_setUpVekter(vekterWindow: Window) {\n\tif (\"_bridge\" in vekterWindow) return\n\tvekterGlobal = vekterWindow as VekterWindow\n\tvekterGlobal._bridge = (method: string, ...args: unknown[]) => {\n\t\tif (process.env.BUILD_TYPE !== \"production\") {\n\t\t\t// biome-ignore lint/suspicious/noConsole: <explanation>\n\t\t\tconsole.info(\"\uD83D\uDCD6\", method, args)\n\t\t}\n\t\thandlers[method] && handlers[method]?.forEach(handler => handler(...args))\n\t}\n}\n\nexport function useTODO(fn: (on: (method: string, handler: Handler) => void) => void) {\n\t// Update handlers.\n\tuseEffect(() => {\n\t\tfn((method: string, handler: Handler) => {\n\t\t\tif (!handlers[method]) handlers[method] = []\n\t\t\thandlers[method]?.push(handler)\n\t\t})\n\t\treturn () => {\n\t\t\thandlers = {}\n\t\t}\n\t}, [fn])\n}\n\ninterface VekterWindow extends Window, VekterGlobals {\n\tactionManager: ActionManager | undefined\n\t_bridge: (name: string, ...args: unknown[]) => void\n}\n", "import { Avatar, emoji } from \"@framerjs/fresco\"\nimport { actionLabels } from \"app/ActionLabels.ts\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { useFeatureIsOn } from \"app/features.ts\"\nimport engine from \"document/engine.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport type { ModeHandlers } from \"plugins/ActivePlugin.ts\"\nimport { ManifestConfigurationError } from \"plugins/pluginErrors.ts\"\nimport {\n\tisExternalPluginIdOfPublishedPlugin,\n\tisLocalDevelopmentPluginManifestId,\n} from \"plugins/pluginManifestValidation.ts\"\nimport type { HostedPluginManifest, VekterPluginManifest } from \"plugins/plugins.ts\"\nimport {\n\tfeaturedPluginManifestIds,\n\tgetPluginIcon,\n\tisComingSoonPlugin,\n\tisHostedPluginManifest,\n\tisWorkshopPluginManifest,\n} from \"plugins/plugins.ts\"\nimport { useMemo } from \"react\"\nimport type { InitialState } from \"#framer-plugin/initialState.ts\"\nimport type { Mode } from \"#framer-plugin/messages.ts\"\nimport { itemIconSize } from \"../QuickActionsModal.styles.ts\"\nimport type { QuickActionsCategory, QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsCategoryType, QuickActionsGroupSpecificType, QuickActionsType } from \"../types.ts\"\nimport { getShortcutListForAppAction } from \"./getShortcutListForRole.ts\"\nimport * as styles from \"./usePluginQuickActions.styles.ts\"\n\nfunction getSupportedModes(\n\tcategory: QuickActionsCategory | undefined,\n\tinitialCategory: QuickActionsCategory | undefined,\n) {\n\tconst { mainView } = engine.stores.chromeStore\n\n\tif (\n\t\tcategory?.type === QuickActionsCategoryType.ManagedCollectionPlugins ||\n\t\t(initialCategory?.type === QuickActionsCategoryType.ManagedCollectionPlugins &&\n\t\t\tcategory?.type === QuickActionsCategoryType.WorkspacePlugins)\n\t) {\n\t\tswitch (mainView) {\n\t\t\tcase ActiveMainView.Canvas:\n\t\t\tcase ActiveMainView.ContentManagement:\n\t\t\t\treturn [\"configureManagedCollection\", \"syncManagedCollection\"] as const satisfies readonly Mode[]\n\t\t\tdefault:\n\t\t\t\treturn [] as const satisfies readonly Mode[]\n\t\t}\n\t}\n\n\tswitch (mainView) {\n\t\tcase ActiveMainView.Canvas:\n\t\t\treturn [\n\t\t\t\t\"canvas\",\n\t\t\t\t\"configureManagedCollection\",\n\t\t\t\t\"syncManagedCollection\",\n\t\t\t\t\"collection\",\n\t\t\t] as const satisfies readonly Mode[]\n\t\tcase ActiveMainView.ContentManagement:\n\t\t\treturn [\"configureManagedCollection\", \"syncManagedCollection\", \"collection\"] as const satisfies readonly Mode[]\n\n\t\tcase ActiveMainView.Localizations:\n\t\t\treturn [\"localization\"] as const satisfies readonly Mode[]\n\n\t\tcase ActiveMainView.CodeEditor:\n\t\t\treturn [\"code\"] as const satisfies readonly Mode[]\n\n\t\tdefault:\n\t\t\treturn [] as const satisfies readonly Mode[]\n\t}\n}\n\nfunction pluginShouldBeShown(\n\tpluginManifest: VekterPluginManifest,\n\tsupportedModes: ReturnType<typeof getSupportedModes>,\n): boolean {\n\treturn supportedModes.some(mode => pluginManifest.modes.includes(mode))\n}\n\nexport function openPluginAndCreateManagedCollectionIfNeeded(\n\tmanifest: VekterPluginManifest,\n\tcategory: QuickActionsCategory | undefined,\n\tinitialCategory: QuickActionsCategory | undefined,\n\tinitialState?: InitialState,\n) {\n\tconst modeHandlers = getModeHandlersForPlugin(manifest, category, initialCategory, initialState)\n\n\tif (modeHandlers.mode === \"configureManagedCollection\" || modeHandlers.mode === \"syncManagedCollection\") {\n\t\tengine.scheduler.processWhenReady(() => {\n\t\t\tengine.stores.modalStore.set({ type: ModalType.CreateManagedCollection, manifest, source: \"quick_actions\" })\n\t\t})\n\t\treturn\n\t}\n\n\tvoid engine.stores.pluginStore.openPlugin(manifest, engine, modeHandlers)\n}\n\nfunction getModeHandlersForPlugin(\n\tpluginManifest: VekterPluginManifest,\n\tcategory: QuickActionsCategory | undefined,\n\tinitialCategory: QuickActionsCategory | undefined,\n\tinitialState?: InitialState,\n): ModeHandlers {\n\tswitch (engine.stores.chromeStore.mainView) {\n\t\tcase ActiveMainView.Canvas:\n\t\tcase ActiveMainView.ContentManagement:\n\t\tcase ActiveMainView.Localizations:\n\t\tcase ActiveMainView.CodeEditor:\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow Error(\"Invalid main view to start plugin\")\n\t}\n\tconst supportedModes = getSupportedModes(category, initialCategory)\n\tconst supportedMode = supportedModes.find(mode => pluginManifest.modes.includes(mode))\n\n\tif (!supportedMode) {\n\t\tthrow new ManifestConfigurationError(\n\t\t\t`Plugin does not support ${supportedModes.join(\", \")} ${supportedModes.length === 1 ? \"mode\" : \"modes\"}`,\n\t\t)\n\t}\n\n\treturn { mode: supportedMode, initialState }\n}\n\nfunction getPluginQuickAction(\n\tpluginManifest: HostedPluginManifest,\n\tsearchBehavior: \"searchable\" | \"notSearchable\",\n): QuickActionsItem {\n\treturn {\n\t\tkind: \"item\",\n\t\ttype: QuickActionsType.Plugin,\n\t\tid: pluginManifest.id,\n\t\tpluginManifest: pluginManifest,\n\t\tname: pluginManifest.name,\n\t\ticon: { iconURL: getPluginIcon(pluginManifest) },\n\t\taliases: pluginManifest.aliases?.map(alias => alias.toLowerCase() as Lowercase<string>),\n\t\tsearchable: searchBehavior === \"searchable\",\n\t}\n}\n\nconst emptyStateCategories: ReadonlySet<QuickActionsCategoryType> = new Set([\n\tQuickActionsCategoryType.Plugins,\n\tQuickActionsCategoryType.ManagedCollectionPlugins,\n])\n\nconst noItems = { groups: [], defaultCategoryFeaturedItems: [] } as const\nconst numberOfFeaturedItemsInDefaultView = 3\n\nexport function usePluginQuickActions(\n\tmainView: ActiveMainView,\n\tcategory: QuickActionsCategory | undefined,\n\tinitialCategory: QuickActionsCategory | undefined,\n): { groups: readonly QuickActionsGroup[]; defaultCategoryFeaturedItems: readonly QuickActionsItem[] } {\n\tconst { pluginStore, projectStore } = engine.stores\n\tconst { sortedPluginManifests, recentlyUsedPluginManifestIds } = pluginStore.useState(state => ({\n\t\tsortedPluginManifests: state.sortedManifests,\n\t\trecentlyUsedPluginManifestIds: state.recentlyUsedPluginManifestIds,\n\t}))\n\n\tconst space = projectStore.useState(state => state.project?.space)\n\tconst canUseWorkspacePlugins = useFeatureIsOn(\"canUseWorkspacePlugins\")\n\tconst canUseTeamPlugins = useFeatureIsOn(\"canUseTeamPlugins\")\n\tconst workspacePluginsEnabled = canUseWorkspacePlugins && space\n\n\treturn useMemo(() => {\n\t\tconst supportedModes = getSupportedModes(category, initialCategory)\n\n\t\tif (supportedModes.length === 0) return noItems\n\n\t\tconst items: QuickActionsItem[] = [\n\t\t\t{\n\t\t\t\tkind: \"item\",\n\t\t\t\ttype: QuickActionsType.OpenExternalUrl,\n\t\t\t\tid: \"see-all-plugins\",\n\t\t\t\ticon: \"IconPlugins\",\n\t\t\t\tname: workspacePluginsEnabled ? \"Marketplace Plugins\" : \"Browse Plugins\",\n\t\t\t\turl: \"https://www.framer.com/marketplace/plugins/\",\n\t\t\t\temptyStateForCategories: emptyStateCategories,\n\t\t\t\tshowOpenActionText: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkind: \"item\",\n\t\t\t\ttype: QuickActionsType.OpenExternalUrl,\n\t\t\t\tid: \"create-plugin\",\n\t\t\t\ticon: \"IconPlus\",\n\t\t\t\tname: \"Create Plugins\",\n\t\t\t\turl: \"https://www.framer.com/developers/plugins\",\n\t\t\t\temptyStateForCategories: emptyStateCategories,\n\t\t\t\temptyStateOnly: true,\n\t\t\t},\n\t\t]\n\n\t\tif (workspacePluginsEnabled) {\n\t\t\tconst icon = space.displayName ? (\n\t\t\t\t<Avatar\n\t\t\t\t\tavatarCustomStyles={space.avatar ? undefined : styles.avatarBackground}\n\t\t\t\t\tsrc={space.avatar ?? undefined}\n\t\t\t\t\ttext={emoji.extractInitials(space.displayName)}\n\t\t\t\t\tsize={itemIconSize}\n\t\t\t\t\tradiusCustomStyles={styles.workspacePluginIconRadius}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t\"IconPlugins\"\n\t\t\t)\n\n\t\t\titems.unshift({\n\t\t\t\tkind: \"item\",\n\t\t\t\ttype: QuickActionsType.SelectCategory,\n\t\t\t\tid: QuickActionsCategoryType.WorkspacePlugins,\n\t\t\t\tname: `${space.displayName} Plugins`,\n\t\t\t\ticon,\n\t\t\t\tcategory: { type: QuickActionsCategoryType.WorkspacePlugins },\n\t\t\t\temptyStateForCategories: emptyStateCategories,\n\t\t\t})\n\t\t}\n\n\t\tconst groups: QuickActionsGroup[] = [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\ttitle: workspacePluginsEnabled ? Dictionary.Browse : \"Marketplace\",\n\t\t\t\titems,\n\t\t\t},\n\t\t]\n\n\t\tif (engine.stores.persistedUserDefaults.displayPluginDeveloperTools) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\ttitle: \"Development\",\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"item\",\n\t\t\t\t\t\ttype: QuickActionsType.OpenDevelopmentPlugin,\n\t\t\t\t\t\tid: \"open-development-plugin\",\n\t\t\t\t\t\tname: actionLabels.openDevelopmentPlugin ?? \"\",\n\t\t\t\t\t\ticon: \"IconCode\",\n\t\t\t\t\t\tappAction: \"openDevelopmentPlugin\",\n\t\t\t\t\t\tshortcut: getShortcutListForAppAction(\"openDevelopmentPlugin\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"item\",\n\t\t\t\t\t\ttype: QuickActionsType.OpenExternalUrl,\n\t\t\t\t\t\tid: \"api-documentation\",\n\t\t\t\t\t\ticon: \"IconFile\",\n\t\t\t\t\t\tname: \"API Documentation\",\n\t\t\t\t\t\turl: \"https://framer.com/developers/plugins/\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\tif (canUseTeamPlugins && !workspacePluginsEnabled) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\ttitle: \"Team\",\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"item\",\n\t\t\t\t\t\ttype: QuickActionsType.OpenModal,\n\t\t\t\t\t\tmodal: {\n\t\t\t\t\t\t\ttype: ModalType.PluginFromURL,\n\t\t\t\t\t\t\tsource: \"quick_actions\",\n\t\t\t\t\t\t\tenvironment: \"default\",\n\t\t\t\t\t\t\tonSelectPlugin: manifest =>\n\t\t\t\t\t\t\t\topenPluginAndCreateManagedCollectionIfNeeded(manifest, category, initialCategory),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tid: \"plugin-from-url\",\n\t\t\t\t\t\tname: \"Open Plugin URL\u2026\",\n\t\t\t\t\t\ticon: \"IconGlobe\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\t\t}\n\n\t\tconst defaultCategoryFeaturedItems: QuickActionsItem[] = []\n\n\t\tfunction addItemToDefaultCategoryFeaturedItems(manifest: VekterPluginManifest, item: QuickActionsItem) {\n\t\t\t// The workshop plugin should always be the first item in the featured items\n\t\t\tif (isWorkshopPluginManifest(manifest)) {\n\t\t\t\tdefaultCategoryFeaturedItems.unshift(item)\n\n\t\t\t\t// If we have more than the maximum number of featured items, remove the last item\n\t\t\t\tif (defaultCategoryFeaturedItems.length > numberOfFeaturedItemsInDefaultView) {\n\t\t\t\t\tdefaultCategoryFeaturedItems.pop()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (defaultCategoryFeaturedItems.length < numberOfFeaturedItemsInDefaultView) {\n\t\t\t\tdefaultCategoryFeaturedItems.push(item)\n\t\t\t}\n\t\t}\n\n\t\tconst recentItems: QuickActionsItem[] = []\n\t\tfor (const manifestId of recentlyUsedPluginManifestIds) {\n\t\t\tconst recentManifest = pluginStore.manifestById.get(manifestId)\n\t\t\tif (!recentManifest) continue\n\t\t\tif (isLocalDevelopmentPluginManifestId(recentManifest.id)) continue\n\t\t\tif (isExternalPluginIdOfPublishedPlugin(recentManifest.id, pluginStore.publishedPluginManifests)) continue\n\t\t\tif (!pluginShouldBeShown(recentManifest, supportedModes)) continue\n\t\t\tif (!isHostedPluginManifest(recentManifest)) continue\n\n\t\t\tconst item = getPluginQuickAction(recentManifest, \"notSearchable\")\n\n\t\t\trecentItems.push(item)\n\t\t\taddItemToDefaultCategoryFeaturedItems(recentManifest, item)\n\t\t}\n\n\t\tif (recentItems.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\ttitle: Dictionary.Recents,\n\t\t\t\titems: recentItems,\n\t\t\t})\n\t\t}\n\n\t\tconst featuredItems: QuickActionsItem[] = []\n\t\tfor (const defaultPluginManifestId of featuredPluginManifestIds) {\n\t\t\tif (recentlyUsedPluginManifestIds.has(defaultPluginManifestId)) continue\n\n\t\t\tconst pluginManifest = pluginStore.manifestById.get(defaultPluginManifestId)\n\t\t\tif (!pluginManifest) continue\n\t\t\tif (!pluginShouldBeShown(pluginManifest, supportedModes)) continue\n\t\t\tif (!isHostedPluginManifest(pluginManifest)) continue\n\t\t\tif (isComingSoonPlugin(pluginManifest)) continue\n\n\t\t\tconst item = getPluginQuickAction(pluginManifest, \"notSearchable\")\n\t\t\tfeaturedItems.push(item)\n\t\t\taddItemToDefaultCategoryFeaturedItems(pluginManifest, item)\n\t\t}\n\n\t\tif (featuredItems.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.PluginVisibleAtStart,\n\t\t\t\ttitle: Dictionary.Featured,\n\t\t\t\titems: featuredItems,\n\t\t\t})\n\t\t}\n\n\t\tconst pluginItems: QuickActionsItem[] = []\n\t\tconst workspacePluginItems: QuickActionsItem[] = []\n\n\t\tfor (const manifest of sortedPluginManifests) {\n\t\t\tif (!pluginShouldBeShown(manifest, supportedModes)) continue\n\t\t\tif (!isHostedPluginManifest(manifest)) continue\n\n\t\t\tif (manifest.external) {\n\t\t\t\tworkspacePluginItems.push(getPluginQuickAction(manifest, \"searchable\"))\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (isLocalDevelopmentPluginManifestId(manifest.id)) continue\n\t\t\tif (isExternalPluginIdOfPublishedPlugin(manifest.id, pluginStore.publishedPluginManifests)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tpluginItems.push(getPluginQuickAction(manifest, \"searchable\"))\n\t\t}\n\n\t\tif (workspacePluginsEnabled && workspacePluginItems.length > 0) {\n\t\t\tconst workspaceName = space.displayName ?? Dictionary.Workspace\n\n\t\t\tlet workspacePluginsTitle: string | undefined\n\t\t\tswitch (category?.type) {\n\t\t\t\tcase QuickActionsCategoryType.Plugins:\n\t\t\t\t\tworkspacePluginsTitle = workspaceName\n\t\t\t\t\tbreak\n\t\t\t\tcase QuickActionsCategoryType.WorkspacePlugins:\n\t\t\t\t\tworkspacePluginsTitle = \"All Plugins\"\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tworkspacePluginsTitle = `${workspaceName} Plugins`\n\t\t\t}\n\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.WorkspacePlugin,\n\t\t\t\ttitle: workspacePluginsTitle,\n\t\t\t\titems: workspacePluginItems,\n\t\t\t})\n\t\t}\n\n\t\tif (pluginItems.length > 0) {\n\t\t\tgroups.push({\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsGroupSpecificType.MarketplacePlugins,\n\t\t\t\ttitle: category?.type === QuickActionsCategoryType.Plugins ? \"Marketplace\" : \"Marketplace Plugins\",\n\t\t\t\titems: pluginItems,\n\t\t\t})\n\t\t}\n\n\t\treturn { groups, defaultCategoryFeaturedItems }\n\t}, [\n\t\tmainView,\n\t\tcategory,\n\t\trecentlyUsedPluginManifestIds,\n\t\tsortedPluginManifests,\n\t\tworkspacePluginsEnabled,\n\t\tcanUseTeamPlugins,\n\t\tspace,\n\t\tinitialCategory,\n\t\tpluginStore,\n\t])\n}\n", "import \"usePluginQuickActions.styles_hy0v5y.wyw.css\"; export const avatarBackground = \"avatarBackground_a1dr9td7\";\nexport const workspacePluginIconRadius = \"workspacePluginIconRadius_w1bs24ml\";", "import { emptyArray } from \"@framerjs/shared\"\nimport type { AppAction } from \"app/AppActions.ts\"\nimport { useMemo } from \"react\"\nimport { isArray } from \"utils/typeChecks.ts\"\nimport type {\n\tQuickActionsCategoryType,\n\tQuickActionsGroup,\n\tQuickActionsGroupType,\n\tQuickActionsItem,\n\tQuickActionsItemId,\n\tQuickActionsItemSelectable,\n\tQuickActionsVirtualListItem,\n} from \"../types.ts\"\nimport {\n\tQuickActionsGroupSpecificType,\n\tQuickActionsType,\n\tisEmptyStateCategory,\n\tisSelectableQuickActionItem,\n} from \"../types.ts\"\nimport { getQuickActionItemIdentifier } from \"./getQuickActionItemIdentifier.ts\"\n\nconst helpActionsVisibleAtStart: ReadonlySet<AppAction> = new Set([\"startAppTour\", \"sitesGetStarted\"])\n\n// Before the user has entered a search term, there are groups that are visible at the start. However, for\n// specific groups that are visible initially, we don't want to show all the items and instead show a subset of items.\nconst itemsVisibleAtStartByGroup: ReadonlyMap<QuickActionsGroupType, ReadonlySet<QuickActionsItemId>> = new Map([\n\t[QuickActionsGroupSpecificType.Help, helpActionsVisibleAtStart],\n])\n\nfunction isGroupExcludedFromSearch(\n\tgroup: QuickActionsGroup,\n\tnormalizedSearchTerm: string,\n\tgroupsVisibleAtStart: ReadonlySet<QuickActionsGroupType>,\n): boolean {\n\t// Don't exclude any groups when the search term is a star\n\tif (normalizedSearchTerm === \"*\") return false\n\t// Don't exclude items that should be visible from the start\n\tif (groupsVisibleAtStart.has(group.type)) return false\n\n\t// Hide groups by default when the user hasn't entered a search term\n\treturn normalizedSearchTerm.length === 0\n}\n\nfunction isGroupAlwaysIncludedInSearch(group: QuickActionsGroup): boolean {\n\t// The Go To Code Crash group is always included because it manages its content visibility itself,\n\t// dynamically, based on the entered text\n\tif (group.type === QuickActionsType.GoToCodeCrashSourceNode) return true\n\treturn false\n}\n\ntype SearchableFields = ReadonlySet<string>\nconst searchableFieldsCache = new WeakMap<QuickActionsItem | QuickActionsGroup, SearchableFields>()\n\n/**\n * Calculate match quality score based on how much of the item name is matched by the search term.\n * Higher score means better match.\n */\nfunction calculateMatchScore(itemName: string, searchTerm: string): number {\n\tconst lowerItemName = itemName.toLowerCase()\n\tconst lowerSearchTerm = searchTerm.toLowerCase()\n\n\tif (lowerItemName === lowerSearchTerm) return 1\n\n\tconst matchIndex = lowerItemName.indexOf(lowerSearchTerm)\n\tif (matchIndex === -1) return 0\n\n\t// Score is based on:\n\t// 1. How much of the item name is covered by the search term\n\t// 2. Whether the match is at the beginning (prefix match)\n\tconst coverageRatio = lowerSearchTerm.length / lowerItemName.length\n\tconst prefixBonus = matchIndex === 0 ? 0.1 : 0\n\n\treturn Math.min(0.99, coverageRatio + prefixBonus) // Using 0.99 so its lower than any exact match\n}\n\n/**\n * Sort items by match quality, with better matches appearing first.\n * Returns a new sorted array.\n */\nfunction sortItemsByMatchRelevance(\n\titems: readonly QuickActionsItem[],\n\tnormalizedSearchTerm: string,\n): readonly QuickActionsItem[] {\n\tif (normalizedSearchTerm.length === 0) return items\n\n\treturn items.toSorted((a, b) => {\n\t\tconst aName = isArray(a.name) ? a.name.join(\" \").toLowerCase() : a.name.toLowerCase()\n\t\tconst bName = isArray(b.name) ? b.name.join(\" \").toLowerCase() : b.name.toLowerCase()\n\n\t\tconst aScore = calculateMatchScore(aName, normalizedSearchTerm)\n\t\tconst bScore = calculateMatchScore(bName, normalizedSearchTerm)\n\n\t\treturn bScore - aScore\n\t})\n}\n\nfunction searchableFieldsMatchSearchTerms(\n\tsearchableFields: SearchableFields,\n\tnormalizedSearchTerms: readonly string[],\n): boolean {\n\tfor (const normalizedSearchTerm of normalizedSearchTerms) {\n\t\tlet found = false\n\t\tfor (const searchableField of searchableFields) {\n\t\t\tfound = searchableField.includes(normalizedSearchTerm)\n\t\t\tif (found) break\n\t\t}\n\t\tif (!found) return false\n\t}\n\n\treturn true\n}\n\nfunction getNormalizedSearchableFieldsForGroup(group: QuickActionsGroup): SearchableFields {\n\tconst cached = searchableFieldsCache.get(group)\n\tif (cached) return cached\n\n\tconst searchableFields = new Set<string>()\n\n\tif (isArray(group.title)) {\n\t\tfor (const name of group.title) {\n\t\t\tsearchableFields.add(name.toLowerCase())\n\t\t}\n\t} else {\n\t\tsearchableFields.add(group.title.toLowerCase())\n\t}\n\n\tif (group.aliases) {\n\t\tlet alias: Lowercase<string>\n\t\tfor (alias of group.aliases) {\n\t\t\tsearchableFields.add(alias)\n\t\t}\n\t}\n\n\tsearchableFieldsCache.set(group, searchableFields)\n\treturn searchableFields\n}\n\nfunction getNormalizedSearchableFieldsForItem(item: QuickActionsItem): SearchableFields {\n\tconst cached = searchableFieldsCache.get(item)\n\tif (cached) return cached\n\n\tconst searchableFields = new Set<string>()\n\n\tif (isArray(item.name)) {\n\t\tfor (const name of item.name) {\n\t\t\tsearchableFields.add(name.toLowerCase())\n\t\t}\n\t} else {\n\t\tsearchableFields.add(item.name.toLowerCase())\n\t}\n\n\tif (item.aliases) {\n\t\tlet alias: Lowercase<string>\n\t\tfor (alias of item.aliases) {\n\t\t\tsearchableFields.add(alias)\n\t\t}\n\t}\n\n\tsearchableFieldsCache.set(item, searchableFields)\n\treturn searchableFields\n}\n\nfunction groupContainsSearchTerms(\n\tgroup: QuickActionsGroup,\n\tnormalizedSearchTerm: string,\n\tnormalizedSearchTerms: readonly string[],\n): boolean {\n\tif (normalizedSearchTerm === \"*\") return true\n\n\tconst normalizedSearchableFields = getNormalizedSearchableFieldsForGroup(group)\n\treturn searchableFieldsMatchSearchTerms(normalizedSearchableFields, normalizedSearchTerms)\n}\n\nfunction itemContainsSearch(\n\titem: QuickActionsItem,\n\tisSearching: boolean,\n\tnormalizedSearchTerms: readonly string[],\n): boolean {\n\tif (item.emptyStateOnly) return false\n\tif (item.searchable === false && isSearching) return false\n\n\tconst normalizedSearchableFields = getNormalizedSearchableFieldsForItem(item)\n\treturn searchableFieldsMatchSearchTerms(normalizedSearchableFields, normalizedSearchTerms)\n}\n\nfunction addIdentifierInPlace(groupTitle: string | string[], item: QuickActionsItem): QuickActionsItemSelectable {\n\tconst identifier = getQuickActionItemIdentifier(item, groupTitle)\n\titem.identifier = identifier\n\treturn item as QuickActionsItemSelectable\n}\n\nfunction collectVirtualListItems(\n\tgroup: QuickActionsGroup,\n\titems: readonly QuickActionsItem[],\n\tresult: QuickActionsVirtualListItem[],\n\tnormalizedSearchTerm?: string,\n) {\n\tif (items.length === 0) return\n\n\tresult.push(group)\n\n\tconst sortedItems = sortItemsByMatchRelevance(items, normalizedSearchTerm ?? \"\")\n\n\tfor (const item of sortedItems) {\n\t\tresult.push(addIdentifierInPlace(group.title, item))\n\t}\n}\n\nfunction getVirtualListItemsByFiltering(\n\tgroups: readonly QuickActionsGroup[],\n\tnormalizedSearchTerm: string,\n\tnormalizedSearchTerms: readonly string[],\n\tgroupsVisibleAtStart: ReadonlySet<QuickActionsGroupType>,\n): QuickActionsVirtualListItem[] {\n\tconst result: QuickActionsVirtualListItem[] = []\n\n\tconst isSearching = normalizedSearchTerm !== \"\"\n\n\tfor (const group of groups) {\n\t\tif (isGroupExcludedFromSearch(group, normalizedSearchTerm, groupsVisibleAtStart)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (isGroupAlwaysIncludedInSearch(group)) {\n\t\t\tcollectVirtualListItems(group, group.items, result, normalizedSearchTerm)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (groupContainsSearchTerms(group, normalizedSearchTerm, normalizedSearchTerms)) {\n\t\t\tconst itemsVisibleAtStart = itemsVisibleAtStartByGroup.get(group.type)\n\n\t\t\tif (!isSearching && itemsVisibleAtStart) {\n\t\t\t\tconst filteredItemsVisibleAtStart = group.items.filter(item => {\n\t\t\t\t\treturn !item.emptyStateOnly && itemsVisibleAtStart.has(item.id)\n\t\t\t\t})\n\t\t\t\tcollectVirtualListItems(group, filteredItemsVisibleAtStart, result, normalizedSearchTerm)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst filteredItems = group.items.filter(item => {\n\t\t\t\tif (item.searchable === false && isSearching) return false\n\t\t\t\treturn !item.emptyStateOnly\n\t\t\t})\n\t\t\tcollectVirtualListItems(group, filteredItems, result, normalizedSearchTerm)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst filteredItems = group.items.filter(item => itemContainsSearch(item, isSearching, normalizedSearchTerms))\n\t\tcollectVirtualListItems(group, filteredItems, result, normalizedSearchTerm)\n\t}\n\n\treturn result\n}\n\nfunction getGroupsForEmptyState(\n\tgroups: readonly QuickActionsGroup[],\n\tactiveCategory: QuickActionsCategoryType,\n): readonly QuickActionsVirtualListItem[] {\n\tconst result: QuickActionsVirtualListItem[] = []\n\n\tif (!activeCategory) return emptyArray()\n\n\tfor (const group of groups) {\n\t\tconst filteredItems = group.items.filter(item => item.emptyStateForCategories?.has(activeCategory))\n\t\tcollectVirtualListItems(group, filteredItems, result)\n\t}\n\n\treturn result\n}\n\n/** Filter all groups and items using the search term. */\nexport function useSearchActionGroups(\n\tgroups: readonly QuickActionsGroup[],\n\tnormalizedSearchTerm: string,\n\tgroupsVisibleAtStart: ReadonlySet<QuickActionsGroupType>,\n\tactiveCategory: QuickActionsCategoryType,\n): {\n\tfilteredVirtualListItems: readonly QuickActionsVirtualListItem[]\n\tfilteredItemsByIdentifier: ReadonlyMap<string, QuickActionsItemSelectable>\n\tfirstItemIdentifier: string | undefined\n\tisEmptyState: boolean\n} {\n\tconst searchTermIsEmpty = normalizedSearchTerm === \"\"\n\n\t// We split the search term up into individual words so the word order isn't important\n\tconst filterSearchTerms = useMemo((): readonly string[] => {\n\t\tif (searchTermIsEmpty) return emptyArray()\n\t\treturn normalizedSearchTerm.split(\" \")\n\t}, [normalizedSearchTerm, searchTermIsEmpty])\n\n\treturn useMemo(() => {\n\t\tlet filteredVirtualListItems: readonly QuickActionsVirtualListItem[]\n\t\tconst filteredItemsByIdentifier = new Map<string, QuickActionsItemSelectable>()\n\t\tlet firstItemIdentifier: string | undefined\n\t\tlet isEmptyState = false\n\n\t\tconst filteredItems = getVirtualListItemsByFiltering(\n\t\t\tgroups,\n\t\t\tnormalizedSearchTerm,\n\t\t\tfilterSearchTerms,\n\t\t\tgroupsVisibleAtStart,\n\t\t)\n\t\tif (filteredItems.length > 0) {\n\t\t\tfilteredVirtualListItems = filteredItems\n\t\t} else {\n\t\t\tisEmptyState = true\n\n\t\t\tconst emptyStateGroups = getGroupsForEmptyState(groups, activeCategory)\n\n\t\t\tif (!searchTermIsEmpty && activeCategory && isEmptyStateCategory(activeCategory)) {\n\t\t\t\tfilteredVirtualListItems = [{ kind: \"emptyState\", categoryType: activeCategory }, ...emptyStateGroups]\n\t\t\t} else if (emptyStateGroups.length > 0) {\n\t\t\t\tfilteredVirtualListItems = emptyStateGroups\n\t\t\t} else {\n\t\t\t\tfilteredVirtualListItems = emptyArray()\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of filteredVirtualListItems) {\n\t\t\tif (!isSelectableQuickActionItem(item)) continue\n\n\t\t\tfilteredItemsByIdentifier.set(item.identifier, item)\n\t\t\tif (!firstItemIdentifier) {\n\t\t\t\tfirstItemIdentifier = item.identifier\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tfilteredVirtualListItems,\n\t\t\tfilteredItemsByIdentifier,\n\t\t\tfirstItemIdentifier,\n\t\t\tisEmptyState,\n\t\t}\n\t}, [groups, normalizedSearchTerm, filterSearchTerms, groupsVisibleAtStart, activeCategory, searchTermIsEmpty])\n}\n\nexport const testing = {\n\tsortItemsByMatchRelevance,\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { AnnotationKey } from \"@framerjs/framer-runtime/crossorigin\"\nimport { type LocalModuleId, ModuleType, emptyArray } from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { isFramerVectorSetsInfo } from \"code-generation/utils/annotations.ts\"\nimport engine from \"document/engine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isSmartComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { ModalType } from \"document/utils/ModalType.ts\"\nimport { ScopeType } from \"document/utils/scopeType.ts\"\nimport { componentExportIdentifierForModule } from \"modules/utils.ts\"\nimport { useMemo } from \"react\"\nimport { copyImportStatement, copyImportURL } from \"utils/clipboard/helpers/copyModuleImports.ts\"\nimport { useConstant } from \"utils/useConstant.ts\"\nimport { Pages, UIInteraction, record } from \"web/lib/tracker.ts\"\nimport type { QuickActionsGroup } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\n\nenum SmartComponentAction {\n\tCopyImport = \"CopyImport\",\n\tCopyURL = \"CopyURL\",\n\tEditVariables = \"EditVariables\",\n}\n\nfunction getHandshakeInfo(\n\tcomponentLoader: ComponentLoader,\n\tnode: CanvasNode,\n): { localId: LocalModuleId; exportSpecifier: string } | null {\n\tif (!isSmartComponentNode(node)) return null\n\n\tconst persistedModule = engine.stores.modulesStore.getPersistedModuleByLocalIdentifier(node.instanceIdentifier)\n\n\tconst component = componentExportIdentifierForModule(componentLoader, persistedModule)\n\tif (!component) return null\n\n\tconst { localId, exportSpecifier } = component\n\treturn { localId, exportSpecifier }\n}\n\nexport function performSmartComponentAction(id: string) {\n\tswitch (id as SmartComponentAction) {\n\t\tcase SmartComponentAction.CopyImport: {\n\t\t\tconst activeScope = engine.stores.scopeStore.active\n\t\t\tif (!isSmartComponentNode(activeScope)) return\n\t\t\tcopyImportStatement(engine, activeScope.instanceIdentifier)\n\t\t\trecord(\"ui_interaction\", { id: UIInteraction.copyImportStatement, page: Pages.quickActionsModal })\n\t\t\tbreak\n\t\t}\n\t\tcase SmartComponentAction.CopyURL: {\n\t\t\tconst activeScope = engine.stores.scopeStore.active\n\t\t\tif (!isSmartComponentNode(activeScope)) return\n\t\t\tcopyImportURL(engine, activeScope.instanceIdentifier)\n\t\t\trecord(\"ui_interaction\", { id: UIInteraction.copyImportURL, page: Pages.quickActionsModal })\n\t\t\tbreak\n\t\t}\n\t\tcase SmartComponentAction.EditVariables:\n\t\t\tengine.stores.modalStore.set({ type: ModalType.Variables, source: \"quick_actions\" })\n\t\t\tbreak\n\t}\n}\n\n/** Smart component specific actions that can't be found within the main and context menus. */\nexport function useSmartComponentQuickActions(\n\tmainView: ActiveMainView,\n\tscopeType: ScopeType,\n\tviewOnly: boolean,\n): QuickActionsGroup[] {\n\treturn useMemo((): QuickActionsGroup[] => {\n\t\tif (mainView !== ActiveMainView.Canvas || scopeType !== ScopeType.SmartComponent) return []\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.SmartComponent,\n\t\t\t\ttitle: Dictionary.Component,\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"item\",\n\t\t\t\t\t\ttype: QuickActionsType.SmartComponent,\n\t\t\t\t\t\tid: SmartComponentAction.EditVariables,\n\t\t\t\t\t\tname: `${viewOnly ? Dictionary.View : Dictionary.Edit} Variables`,\n\t\t\t\t\t\ticon: \"IconEditPencil\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t]\n\t}, [mainView, scopeType, viewOnly])\n}\n\nexport function useHandshakeQuickActions() {\n\tconst activeScope = engine.stores.scopeStore.useState(state => state.active)\n\tconst activeScopeIsSmartComponent = isSmartComponentNode(activeScope)\n\tconst handshakeActive = Boolean(getHandshakeInfo(engine.componentLoader, activeScope))\n\tconst menu = useConstant<QuickActionsGroup[]>(() => [\n\t\t{\n\t\t\tkind: \"group\",\n\t\t\ttype: QuickActionsType.Handshake,\n\t\t\ttitle: Dictionary.Handshake,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\tkind: \"item\",\n\t\t\t\t\ttype: QuickActionsType.Handshake,\n\t\t\t\t\tid: SmartComponentAction.CopyImport,\n\t\t\t\t\tname: Dictionary.CopyImport,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkind: \"item\",\n\t\t\t\t\ttype: QuickActionsType.Handshake,\n\t\t\t\t\tid: SmartComponentAction.CopyURL,\n\t\t\t\t\tname: Dictionary.CopyUrl,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t])\n\n\tconst annotation = engine.stores.modulesStore\n\t\t.forType(ModuleType.Canvas)\n\t\t.getByStableName(activeScope.id)\n\t\t?.annotations(null, \"default\")?.[AnnotationKey.FramerVectorSets]\n\n\t// We can't copy url/imports for smart components with vector sets controls.\n\tif (!activeScopeIsSmartComponent || !handshakeActive || isFramerVectorSetsInfo(annotation)) {\n\t\treturn emptyArray<QuickActionsGroup>()\n\t}\n\n\treturn menu\n}\n", "import type { ExternalModuleExportIdentifierString } from \"@framerjs/shared\"\nimport {\n\tassert,\n\tasGlobalId,\n\temptyArray,\n\texternalModuleIdentifier,\n\tgetLogger,\n\tparseModuleIdentifier,\n\ttoLocalIdentifier,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { experiments } from \"app/experiments.ts\"\nimport engine from \"document/engine.ts\"\nimport type { LibraryModule } from \"document/library/libraryApi.ts\"\nimport { CodeComponentNode } from \"document/models/CanvasTree/index.ts\"\nimport { ModuleMetadata } from \"modules/types.ts\"\nimport { useEffect, useMemo } from \"react\"\nimport { tryParseNumber } from \"utils/tryParseNumber.ts\"\nimport { useWebProjectService } from \"../../shared/utils/useWebProjectService.ts\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsTintType, QuickActionsType } from \"../types.ts\"\nimport { insertCodeComponentToPossibleParent } from \"./useComponentsActions.tsx\"\n\nconst log = getLogger(\"use-team-library-actions\")\n\nconst emptyGroups: QuickActionsGroup[] = []\nObject.freeze(emptyGroups)\n\nexport function useTeamLibraryActions(enabled: boolean): {\n\tteamLibraryGroups: readonly QuickActionsGroup[]\n\tteamLibraryModulesLoading: boolean\n\tteamName: string\n} {\n\tconst { currentSpace } = useWebProjectService()\n\tconst { chromeStore, libraryStore } = engine.stores\n\tconst isPreviewingLocaleOnCanvas = chromeStore.useState(state => state.isPreviewingLocaleOnCanvas)\n\n\tconst { teamLibrary, teamLibraryModulesLoading, libraryModules } = libraryStore.useState(state => ({\n\t\tteamLibrary: state.teamLibrary,\n\t\tteamLibraryModulesLoading: state.loadingModules,\n\t\tlibraryModules: state.libraryModules,\n\t}))\n\n\tuseEffect(() => {\n\t\tif (!teamLibrary) {\n\t\t\treturn\n\t\t}\n\n\t\t// trigger a fetch on enable. The library store will skip the fetch if there's no update since last fetch.\n\t\tif (enabled) {\n\t\t\tengine.scheduler.processWhenReady(() => {\n\t\t\t\tlibraryStore.fetchLibraryModules(teamLibrary)\n\t\t\t})\n\t\t}\n\t}, [teamLibrary, enabled])\n\n\tconst items: QuickActionsItem[] = useMemo(\n\t\t() => libraryModules.map(module => libraryModuleToQuickActionItem(module)),\n\t\t[libraryModules],\n\t)\n\tconst teamLibraryGroups: readonly QuickActionsGroup[] = useMemo(() => {\n\t\tif (!enabled || items.length === 0 || isPreviewingLocaleOnCanvas) return emptyArray()\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.TeamLibrary,\n\t\t\t\ttitle: \"Insert Workspace Components\",\n\t\t\t\titems,\n\t\t\t},\n\t\t]\n\t}, [enabled, items, isPreviewingLocaleOnCanvas])\n\n\treturn {\n\t\tteamLibraryGroups,\n\t\tteamLibraryModulesLoading: teamLibraryModulesLoading && enabled,\n\t\tteamName: currentSpace?.displayName ?? Dictionary.Workspace,\n\t}\n}\n\nfunction libraryModuleToQuickActionItem(libraryModule: LibraryModule): QuickActionsItem {\n\tconst { title, module: savedModule } = libraryModule\n\treturn {\n\t\tkind: \"item\",\n\t\tid: savedModule.id,\n\t\ttype: QuickActionsType.TeamLibrary,\n\t\ttint: QuickActionsTintType.ComponentPurple,\n\t\tname: title,\n\t}\n}\n\nexport async function performTeamLibraryInsertAction(moduleId: string) {\n\tconst libraryModule = engine.stores.libraryStore.lookupLibraryModule(moduleId)\n\tif (!libraryModule) return\n\tconst { module: savedModule, exportSpecifier } = libraryModule\n\tconst { saveId, files, metadata } = savedModule\n\tassert(moduleId === savedModule.id, \"Lookup module id is different\", moduleId, savedModule.id)\n\n\tconst globalModuleId = asGlobalId(savedModule.id)\n\tassert(files.module, \"module file must exist for a saved module\")\n\tconst moduleIdentifier = externalModuleIdentifier(globalModuleId, saveId, files.module, exportSpecifier)\n\tconst moduleIdentifierString = moduleIdentifier.value\n\n\tconst performInsert = (codeComponentIdentifier: string) => {\n\t\tconst codeComponentNode = new CodeComponentNode({\n\t\t\tcodeComponentIdentifier,\n\t\t\twidth: tryParseNumber(metadata[ModuleMetadata.IntrinsicWidth], true) ?? 200,\n\t\t\theight: tryParseNumber(metadata[ModuleMetadata.IntrinsicHeight], true) ?? 200,\n\t\t\tslotsAreChildNodes: experiments.isOn(\"componentSlotsAreChildNodes\"),\n\t\t})\n\t\tinsertCodeComponentToPossibleParent(codeComponentNode)\n\t}\n\n\tconst localCodeComponentIdentifier = getExistingLocalComponentIdentifier(moduleIdentifierString)\n\tif (localCodeComponentIdentifier) {\n\t\tperformInsert(localCodeComponentIdentifier)\n\t\treturn\n\t}\n\n\tawait engine.stores.modulesStore\n\t\t.addExternalModulesToProject([moduleIdentifier], {\n\t\t\tonTreeUpdate: () => performInsert(moduleIdentifierString),\n\t\t})\n\t\t.catch(err => log.reportError(err))\n}\n\nfunction getExistingLocalComponentIdentifier(moduleIdentifier: ExternalModuleExportIdentifierString) {\n\tconst parsedIdentifier = parseModuleIdentifier(moduleIdentifier)\n\tconst persistedModule = engine.stores.modulesStore.getPersistedModuleByGlobalId(parsedIdentifier.moduleId)\n\tif (!persistedModule) return\n\tconst localIdentifier = toLocalIdentifier(parsedIdentifier, persistedModule.localId)\n\tconst componentDefinition = engine.componentLoader.componentForIdentifier(localIdentifier.value)\n\tif (!componentDefinition) return\n\n\treturn componentDefinition.identifier\n}\n", "import engine from \"document/engine.ts\"\nimport { useMemo } from \"react\"\nimport type { QuickActionsGroup, QuickActionsItem } from \"../types.ts\"\nimport { QuickActionsType } from \"../types.ts\"\nimport { getShortcutListForAppAction } from \"./getShortcutListForRole.ts\"\n\nconst latestVersionItemId = \"latest\"\nconst newerVersionItemId = \"newer\"\nconst olderVersionItemId = \"older\"\nconst exitVersionHistoryItemId = \"exit\"\n\nexport function useVersionHistoryActions() {\n\tconst { chromeStore, historyStore } = engine.stores\n\tconst isHistoryModeActive = chromeStore.useState(state => state.isHistoryModeActive)\n\tconst activeVersion = historyStore.useState(state => state.activeTreeVersion)\n\treturn useMemo((): QuickActionsGroup[] => {\n\t\tif (!isHistoryModeActive) return []\n\n\t\tconst items: QuickActionsItem[] = []\n\n\t\tconst newerVersion = historyStore.newerVersion()\n\t\tconst olderVersion = historyStore.olderVersion()\n\n\t\tif (olderVersion) {\n\t\t\titems.push({\n\t\t\t\tkind: \"item\",\n\t\t\t\tkey: \"version-history-older-version\",\n\t\t\t\tid: olderVersionItemId,\n\t\t\t\ttype: QuickActionsType.VersionHistory,\n\t\t\t\tname: \"See Older Version\",\n\t\t\t\ticon: \"IconArrowDown\",\n\t\t\t})\n\t\t}\n\n\t\tif (newerVersion) {\n\t\t\titems.push({\n\t\t\t\tkind: \"item\",\n\t\t\t\tkey: \"version-history-newer-version\",\n\t\t\t\tid: newerVersionItemId,\n\t\t\t\ttype: QuickActionsType.VersionHistory,\n\t\t\t\tname: \"See Newer Version\",\n\t\t\t\ticon: \"IconArrowUp\",\n\t\t\t})\n\t\t}\n\n\t\tif (activeVersion !== \"latest\") {\n\t\t\titems.push({\n\t\t\t\tkind: \"item\",\n\t\t\t\tkey: \"version-history-restore-latest\",\n\t\t\t\tid: latestVersionItemId,\n\t\t\t\ttype: QuickActionsType.VersionHistory,\n\t\t\t\tname: \"See Latest Version\",\n\t\t\t\ticon: \"IconArrowTop\",\n\t\t\t})\n\t\t}\n\n\t\t// We already have a \"toggleVersionHistory\" main menu item, but it's displayed as a \"Project\" action at start.\n\t\t// When the history mode is active, and insert a separate exit action and hide the project actions.\n\t\titems.push({\n\t\t\tkind: \"item\",\n\t\t\tkey: \"exitVersionHistory\",\n\t\t\tid: exitVersionHistoryItemId,\n\t\t\ttype: QuickActionsType.VersionHistory,\n\t\t\tname: \"Exit Version History\",\n\t\t\tshortcut: getShortcutListForAppAction(\"toggleVersionHistory\"),\n\t\t})\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"group\",\n\t\t\t\ttype: QuickActionsType.VersionHistory,\n\t\t\t\ttitle: \"Version History\",\n\t\t\t\titems,\n\t\t\t},\n\t\t]\n\t}, [isHistoryModeActive, activeVersion])\n}\n\nexport function performVersionHistoryAction(action: string) {\n\tconst { chromeStore, historyStore } = engine.stores\n\tswitch (action) {\n\t\tcase latestVersionItemId:\n\t\t\thistoryStore.restoreLatest()\n\t\t\treturn\n\t\tcase newerVersionItemId: {\n\t\t\tconst prevVersion = historyStore.newerVersion()\n\t\t\tif (prevVersion === undefined) return\n\t\t\tclickDocumentTimelineItem(prevVersion)\n\t\t\treturn\n\t\t}\n\t\tcase olderVersionItemId: {\n\t\t\tconst nextVersion = historyStore.olderVersion()\n\t\t\tif (nextVersion === undefined) return\n\t\t\tclickDocumentTimelineItem(nextVersion)\n\t\t\treturn\n\t\t}\n\t\tcase exitVersionHistoryItemId: {\n\t\t\thistoryStore.restoreLatest()\n\t\t\tchromeStore.isHistoryModeActive = false\n\t\t\treturn\n\t\t}\n\t\tdefault:\n\t\t\treturn\n\t}\n}\n\n// `engine.historyStore.loadVersion(version, name)` takes the name of the version and updates the project bar, and the\n// name of each version is calculated in the UI, ussing the time when the panel is rendered as a reference.\n// Therefore, instead of calling the historyStore to load the version, we trigger a click in the history panel, so that\n// the version name in the panel and the project bar will be in sync.\nfunction clickDocumentTimelineItem(version: number) {\n\tconst timelineEntryButton = document.querySelector(`#version-history-${version}`)\n\tif (!(timelineEntryButton instanceof HTMLElement)) return\n\ttimelineEntryButton?.click()\n}\n", "import { getLogger } from \"@framerjs/shared\"\n\nexport const log = getLogger(\"app:code-editor\")\n", "import { toast } from \"web/lib/toaster.ts\"\n\nexport const errorKey = \"code-editor-loading-error\"\n\nexport function showLoadingErrorToast() {\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tprimaryText: \"Failed to load\",\n\t\tsecondaryText: \"code editor.\",\n\t\tkey: errorKey,\n\t\ticon: \"error\",\n\t\tshowCloseButton: \"never\",\n\t})\n}\n\nexport function hideLoadingErrorToast() {\n\ttoast({ type: \"remove\", key: errorKey })\n}\n"],
  "mappings": "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AAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAMO,IAAM,4BAA4B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
  "names": ["WebProjectHelper", "WebProject", "meta", "import_react", "import_react", "import_react", "import_react", "import_react", "import_react", "active", "IconImage", "import_jsx_runtime", "IconImage", "React", "title", "import_react", "container", "import_jsx_runtime", "React", "gradient", "width", "container", "import_react", "import_react", "import_react", "button", "icon", "import_jsx_runtime", "React", "icon", "button", "item", "import_react", "import_jsx_runtime", "React", "title", "item", "enabled", "items", "width", "height", "import_jsx_runtime", "title", "import_jsx_runtime", "pluralize", "title", "canDeleteFolder", "tag", "import_jsx_runtime", "EntityAssetFolderRow", "title", "icon", "getModuleContextMenuItems", "EntityAssetReferenceRow", "createContextMenuItems", "EntityAssetReferenceItemRow", "editButton", "import_jsx_runtime", "icon", "title", "import_react", "import_react", "items", "title", "row", "defaultState", "title", "import_jsx_runtime", "import_react", "import_react", "React", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "React", "dismiss", "theme", "import_jsx_runtime", "React", "import_jsx_runtime", "createContextMenuItems", "import_react", "scroll", "container", "import_react", "import_jsx_runtime", "enabled", "category", "React", "import_jsx_runtime", "React", "ColorPickerEntityAssetTokens", "container", "row", "import_jsx_runtime", "tokenPackages", "trackingMetadata", "token", "enabled", "import_jsx_runtime", "ColorPickerPopout", "import_jsx_runtime", "sortable", "import_jsx_runtime", "React", "title", "formatValue", "link", "import_jsx_runtime", "React", "ValueTransformChain", "title", "items", "import_jsx_runtime", "title", "React", "import_react", "import_react", "import_jsx_runtime", "popoutId", "isComputedValue", "preview", "React", "dismiss", "import_jsx_runtime", "popoutId", "button", "import_react", "scrollContainer", "import_jsx_runtime", "item", "items", "title", "variableNames", "scrollContainer", "import_jsx_runtime", "title", "popoutId", "button", "import_jsx_runtime", "title", "popoutId", "import_react", "import_react", "import_react", "container", "import_jsx_runtime", "React", "ToolbarItem", "title", "enabled", "tool", "button", "container", "import_react", "import_jsx_runtime", "enabled", "CanvasLocaleToolbarItem", "divider", "button", "import_react", "React", "container", "import_jsx_runtime", "container", "container", "import_jsx_runtime", "container", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "IconMoon", "import_jsx_runtime", "IconPlugins", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "IconSun", "import_jsx_runtime", "import_jsx_runtime", "React", "FloatingToolbar", "tool", "hasUnreadFeedback", "IconSun", "IconMoon", "IconPlugins", "divider", "import_jsx_runtime", "background", "import_react", "containerPadding", "modal", "import_jsx_runtime", "import_jsx_runtime", "React", "icon", "title", "import_jsx_runtime", "import_jsx_runtime", "icon", "item", "IconPlus", "IconLayoutTemplate", "category", "item", "groupTitle", "import_react", "import_react", "import_react", "import_react", "import_jsx_runtime", "React", "enabled", "defaultValues", "doubleColumn", "label", "container", "import_jsx_runtime", "NumberShorthandInput", "container", "import_jsx_runtime", "title", "import_jsx_runtime", "title", "import_react", "import_react", "import_react", "import_jsx_runtime", "CornerShapePanel", "import_react", "import_react", "import_jsx_runtime", "React", "title", "traitTypes", "traitTypeKeys", "sortable", "variableCreationType", "import_jsx_runtime", "popoutId", "React", "RadiusPanel", "radius", "import_jsx_runtime", "CornerPanel", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "title", "image", "import_react", "popoutId", "import_jsx_runtime", "log", "image", "import_jsx_runtime", "popoutId", "React", "FillPanel", "item", "size", "import_jsx_runtime", "import_react", "size", "import_react", "import_jsx_runtime", "FontSource", "category", "import_react", "import_react", "log", "React", "scroll", "import_react", "import_jsx_runtime", "log", "image", "React", "disabled", "import_react", "import_jsx_runtime", "React", "disabled", "button", "import_jsx_runtime", "button", "link", "selectAllFonts", "import_react", "import_jsx_runtime", "React", "scroll", "item", "import_jsx_runtime", "assert", "import_jsx_runtime", "items", "item", "title", "import_jsx_runtime", "React", "import_react", "import_react", "import_jsx_runtime", "dimensions", "import_jsx_runtime", "React", "size", "icon", "import_jsx_runtime", "PresetIcon", "background", "icon", "withBorder", "import_react", "import_react", "import_react", "item", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "enabled", "import_react", "scroll", "import_jsx_runtime", "React", "VariableFontPopout", "scroll", "category", "VariationSettingRow", "dimension", "category", "import_jsx_runtime", "React", "preview", "popoutId", "import_jsx_runtime", "React", "VariableFontRowInner", "title", "import_react", "popoutContent", "scroll", "titleWrapper", "disabled", "import_jsx_runtime", "React", "selectedItem", "popoutContent", "keyForItem", "scroll", "disabled", "titleWrapper", "import_jsx_runtime", "React", "title", "import_jsx_runtime", "PresetIcon", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "React", "value", "unit", "import_react", "import_jsx_runtime", "traitTypeKeys", "import_jsx_runtime", "unit", "import_react", "import_jsx_runtime", "traitTypeKeys", "title", "import_jsx_runtime", "import_react", "import_jsx_runtime", "traitTypeKeys", "import_jsx_runtime", "Color", "import_react", "import_jsx_runtime", "React", "selectedStop", "type", "Color", "import_jsx_runtime", "import_react", "import_jsx_runtime", "traitTypeKeys", "React", "TextDecorationRow", "title", "getDefaultValueForUnit", "import_jsx_runtime", "import_react", "import_jsx_runtime", "traitTypeKeys", "import_jsx_runtime", "import_react", "import_react", "import_react", "import_jsx_runtime", "React", "BorderValuesRows", "import_jsx_runtime", "React", "BorderPopout", "import_jsx_runtime", "popoutId", "import_jsx_runtime", "popoutId", "React", "BorderPanel", "import_react", "popoutId", "import_jsx_runtime", "variableCreationType", "supportedVariableTypes", "paddingBottom", "import_jsx_runtime", "header", "import_react", "title", "import_jsx_runtime", "React", "ForwardRefPanelSectionHeader", "title", "icon", "clickable", "panelDivider", "enabled", "import_jsx_runtime", "import_jsx_runtime", "breakpoint", "import_jsx_runtime", "createContextMenuItems", "findNodes", "import_react", "import_jsx_runtime", "title", "scroll", "container", "row", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "import_react", "row", "container", "import_jsx_runtime", "debounce", "React", "row", "container", "import_react", "import_jsx_runtime", "size", "React", "container", "import_jsx_runtime", "icon", "container", "import_react", "import_jsx_runtime", "margin", "import_jsx_runtime", "import_jsx_runtime", "stopPropagation", "title", "popoutId", "React", "label", "items", "TransitionPopout", "delay", "import_react", "import_jsx_runtime", "supportedColorTabs", "popoutId", "TextBackgroundColorRow", "import_react", "import_react", "import_jsx_runtime", "TextBackgroundCornerShapeRow", "import_react", "import_jsx_runtime", "TextBackgroundRadiusRow", "radius", "import_jsx_runtime", "TextBackgroundCornerRows", "import_react", "import_jsx_runtime", "segmentTitles", "TextBackgroundPaddingRow", "paddingBottom", "import_react", "import_jsx_runtime", "React", "PanelSectionHeaderButton", "import_react", "import_jsx_runtime", "React", "IconSectionHeaderPlus", "import_jsx_runtime", "hasTextDecoration", "hasTextBackgroundColor", "import_jsx_runtime", "createContextMenuItems", "findNodes", "import_jsx_runtime", "findNodes", "import_react", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "React", "BorderValuesRows", "import_jsx_runtime", "popoutId", "title", "import_jsx_runtime", "React", "BorderPanel", "popoutId", "import_jsx_runtime", "title", "popoutId", "import_jsx_runtime", "import_react", "import_react", "import_react", "import_react", "container", "categoryTitleContainer", "categoryTitle", "rowTitle", "panelRow", "import_react", "item", "category", "import_jsx_runtime", "React", "preview", "import_react", "React", "import_jsx_runtime", "React", "OpenTypePopoutButton", "OpenTypePopout", "container", "category", "categoryTitleContainer", "categoryTitle", "title", "shortTitle", "rowTitle", "panelRow", "tag", "import_jsx_runtime", "React", "import_jsx_runtime", "React", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "title", "import_jsx_runtime", "isString", "React", "TextStrokeRow", "import_jsx_runtime", "import_react", "import_jsx_runtime", "traitTypes", "React", "import_jsx_runtime", "import_react", "import_jsx_runtime", "React", "import_jsx_runtime", "breakpoint", "import_jsx_runtime", "createContextMenuItems", "findNodes", "import_jsx_runtime", "tag", "import_react", "import_jsx_runtime", "popoutId", "cached", "name", "aliases", "item", "import_react", "category", "assertNever", "import_react", "import_react", "items", "item", "import_react", "item", "import_react", "items", "title", "aliases", "label", "item", "editReasonsToExclude", "type", "groupTitle", "item", "import_react", "import_react", "groupTitle", "item", "items", "assertNever", "assert", "import_react", "previewActions", "import_react", "items", "node", "import_react", "item", "import_react", "handlers", "label", "enabled", "import_react", "item", "title", "aliases", "groupTitle", "active", "items", "import_react", "import_jsx_runtime", "category", "items", "icon", "item", "import_react", "items", "item", "groupTitle", "filteredItems", "import_react", "import_react", "log", "enabled", "items", "title", "import_react", "items", "import_jsx_runtime", "title", "React", "item", "QuickActionsRow", "findNodesActionGroups", "scroll", "keyForItem", "item", "containerPadding", "React", "category", "modal", "log"]
}
