@toototech/webbuilder-plugins 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +3 -0
- package/dist/basic/cssScope.d.ts +3 -0
- package/dist/basic/index.d.ts +81 -0
- package/dist/basic/injectStyle.d.ts +20 -0
- package/dist/basic/plugin.d.ts +19 -0
- package/dist/basic/publisher.d.ts +4 -0
- package/dist/basic/registries/interactive/accordion/index.d.ts +3 -0
- package/dist/basic/registries/interactive/backButton/index.d.ts +3 -0
- package/dist/basic/registries/interactive/button/index.d.ts +10 -0
- package/dist/basic/registries/interactive/countUp/index.d.ts +9 -0
- package/dist/basic/registries/interactive/customCode/index.d.ts +3 -0
- package/dist/basic/registries/interactive/index.d.ts +2 -0
- package/dist/basic/registries/interactive/inquiryForm/index.d.ts +3 -0
- package/dist/basic/registries/interactive/klaviyoSubscribe/index.d.ts +3 -0
- package/dist/basic/registries/interactive/popup/index.d.ts +5 -0
- package/dist/basic/registries/interactive/salesmartlyChatButton/index.d.ts +10 -0
- package/dist/basic/registries/interactive/search/index.d.ts +10 -0
- package/dist/basic/registries/interactive/socialShare/index.d.ts +33 -0
- package/dist/basic/registries/interactive/tabs/index.d.ts +3 -0
- package/dist/basic/registries/layout/container/index.d.ts +19 -0
- package/dist/basic/registries/layout/divider/index.d.ts +7 -0
- package/dist/basic/registries/layout/grid/index.d.ts +11 -0
- package/dist/basic/registries/layout/index.d.ts +2 -0
- package/dist/basic/registries/layout/layoutBase/index.d.ts +10 -0
- package/dist/basic/registries/layout/section/index.d.ts +3 -0
- package/dist/basic/registries/layout/sectionGridBlock/index.d.ts +3 -0
- package/dist/basic/registries/layout/spacer/index.d.ts +7 -0
- package/dist/basic/registries/media/banner/index.d.ts +11 -0
- package/dist/basic/registries/media/carousel/index.d.ts +6 -0
- package/dist/basic/registries/media/flipbook/index.d.ts +5 -0
- package/dist/basic/registries/media/icon/index.d.ts +3 -0
- package/dist/basic/registries/media/image/index.d.ts +3 -0
- package/dist/basic/registries/media/index.d.ts +2 -0
- package/dist/basic/registries/media/industryTabs/index.d.ts +3 -0
- package/dist/basic/registries/media/marquee/index.d.ts +4 -0
- package/dist/basic/registries/media/ourSolutions/helpers.d.ts +289 -0
- package/dist/basic/registries/media/ourSolutions/index.d.ts +4 -0
- package/dist/basic/registries/media/ourSolutions/script.d.ts +1 -0
- package/dist/basic/registries/media/ourSolutions/style.d.ts +1 -0
- package/dist/basic/registries/media/pdfViewer/index.d.ts +3 -0
- package/dist/basic/registries/media/productCategories/index.d.ts +4 -0
- package/dist/basic/registries/media/tabMediaGallery/index.d.ts +3 -0
- package/dist/basic/registries/media/video/index.d.ts +12 -0
- package/dist/basic/registries/navigation/footer/index.d.ts +10 -0
- package/dist/basic/registries/navigation/index.d.ts +2 -0
- package/dist/basic/registries/navigation/languageSwitcher/index.d.ts +6 -0
- package/dist/basic/registries/navigation/logo/index.d.ts +9 -0
- package/dist/basic/registries/navigation/navbar/constants.d.ts +38 -0
- package/dist/basic/registries/navigation/navbar/factories.d.ts +848 -0
- package/dist/basic/registries/navigation/navbar/helpers.d.ts +12 -0
- package/dist/basic/registries/navigation/navbar/index.d.ts +4 -0
- package/dist/basic/registries/navigation/navbar/registerMegaTypes.d.ts +2 -0
- package/dist/basic/registries/navigation/navbar/registerMenuTypes.d.ts +2 -0
- package/dist/basic/registries/navigation/navbar/registerRootTypes.d.ts +2 -0
- package/dist/basic/registries/navigation/navbar/script.d.ts +1 -0
- package/dist/basic/registries/navigation/navbar/style.d.ts +1 -0
- package/dist/basic/registries/navigation/socialLinks/index.d.ts +3 -0
- package/dist/basic/registries/section/allApplications/index.d.ts +3 -0
- package/dist/basic/registries/section/cardCarouselSection/index.d.ts +3 -0
- package/dist/basic/registries/section/caseSpotlight/index.d.ts +3 -0
- package/dist/basic/registries/section/companyScale/index.d.ts +3 -0
- package/dist/basic/registries/section/customizationGrid/index.d.ts +3 -0
- package/dist/basic/registries/section/factoryMap/index.d.ts +3 -0
- package/dist/basic/registries/section/focaHistoryTimeline/index.d.ts +3 -0
- package/dist/basic/registries/section/historyTimeline/index.d.ts +3 -0
- package/dist/basic/registries/section/homeBannerCarousel/index.d.ts +4 -0
- package/dist/basic/registries/section/hotspotShowcase/index.d.ts +30 -0
- package/dist/basic/registries/section/index.d.ts +2 -0
- package/dist/basic/registries/section/map/index.d.ts +4 -0
- package/dist/basic/registries/section/milestoneCardStrip/index.d.ts +3 -0
- package/dist/basic/registries/section/moreCardCarousel/index.d.ts +3 -0
- package/dist/basic/registries/section/ourAdvantages/index.d.ts +4 -0
- package/dist/basic/registries/section/overviewSplit/index.d.ts +3 -0
- package/dist/basic/registries/section/processTimeline/index.d.ts +3 -0
- package/dist/basic/registries/section/productCardStrip/index.d.ts +3 -0
- package/dist/basic/registries/section/resourceSection/index.d.ts +6 -0
- package/dist/basic/registries/section/responsiveHeroCarousel/index.d.ts +4 -0
- package/dist/basic/registries/section/serviceIconGrid/index.d.ts +4 -0
- package/dist/basic/registries/section/servicesCarousel/index.d.ts +4 -0
- package/dist/basic/registries/section/servicesShowcase/index.d.ts +4 -0
- package/dist/basic/registries/section/servicesThb/index.d.ts +4 -0
- package/dist/basic/registries/section/solutionList/index.d.ts +4 -0
- package/dist/basic/registries/section/staticPinMap/index.d.ts +4 -0
- package/dist/basic/registries/section/statsCards/index.d.ts +3 -0
- package/dist/basic/registries/section/swiperRuntime.d.ts +3 -0
- package/dist/basic/registries/shared/sharedTraits.d.ts +37 -0
- package/dist/basic/registries/types.d.ts +5 -0
- package/dist/basic/registries/typography/heading/index.d.ts +8 -0
- package/dist/basic/registries/typography/index.d.ts +2 -0
- package/dist/basic/registries/typography/textEditor/index.d.ts +6 -0
- package/dist/basic/registryManifest.d.ts +9 -0
- package/dist/basic/styleHelpers.d.ts +29 -0
- package/dist/basic/svgIcon.d.ts +11 -0
- package/dist/basic/traitBridge.d.ts +20 -0
- package/dist/basic/traitFactory.d.ts +106 -0
- package/dist/basic.js +1146 -0
- package/dist/cms/cmsFactory.d.ts +164 -0
- package/dist/cms/dynamicRenderPipeline.d.ts +12 -0
- package/dist/cms/index.d.ts +31 -0
- package/dist/cms/plugin.d.ts +12 -0
- package/dist/cms/publisher.d.ts +7 -0
- package/dist/cms/registries/dynamic/cms/constants.d.ts +16 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/bindings.d.ts +78 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/breadcrumbBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/conditionalBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/datetimeBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/htmlBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/imageBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/linkBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/seoBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/textBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/blocks/tocBlock.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/constants.d.ts +19 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/helpers.d.ts +52 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/registerBlock.d.ts +57 -0
- package/dist/cms/registries/dynamic/cms/dynamicField/styles.d.ts +7 -0
- package/dist/cms/registries/dynamic/cms/media/previewMediaTrait.d.ts +7 -0
- package/dist/cms/registries/dynamic/cms/menu/siteMenuAttrs.d.ts +11 -0
- package/dist/cms/registries/dynamic/cms/menuTree/menuTreeAttrs.d.ts +8 -0
- package/dist/cms/registries/dynamic/cms/post/styles.d.ts +6 -0
- package/dist/cms/registries/dynamic/cms/product/detail.styles.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/product/detailV2.styles.d.ts +1 -0
- package/dist/cms/registries/dynamic/cms/product/previewProductTrait.d.ts +6 -0
- package/dist/cms/registries/dynamic/cms/product/styles.d.ts +6 -0
- package/dist/cms/registries/dynamic/dataProvider.d.ts +45 -0
- package/dist/cms/registries/dynamic/loopGrid/paginationStyles.d.ts +5 -0
- package/dist/cms/registries/dynamic/loopGrid/preview.d.ts +16 -0
- package/dist/cms/registries/dynamic/loopGrid/publisher.d.ts +3 -0
- package/dist/cms/registries/dynamic/loopGrid/types.d.ts +97 -0
- package/dist/cms/registries/navigation/navbarThb/index.d.ts +3 -0
- package/dist/cms/registries/navigation/navbarThb/script.d.ts +1 -0
- package/dist/cms/registries/navigation/navbarThb/style.d.ts +1 -0
- package/dist/cms.js +4535 -0
- package/dist/global-settings/components/FontFamilySelect.vue.d.ts +29 -0
- package/dist/global-settings/components/FontManagerPanel.vue.d.ts +37 -0
- package/dist/global-settings/index.d.ts +8 -0
- package/dist/global-settings/plugin.d.ts +3 -0
- package/dist/global-settings/publisher.d.ts +15 -0
- package/dist/global-settings/runtime/canvasInjection.d.ts +13 -0
- package/dist/global-settings/runtime/panelDraftSave.d.ts +17 -0
- package/dist/global-settings/runtime/settingsSource.d.ts +4 -0
- package/dist/global-settings/useFontManager.d.ts +38 -0
- package/dist/global-settings/useGoogleFonts.d.ts +20 -0
- package/dist/global-settings/vue.d.ts +1 -0
- package/dist/global-settings.js +66 -0
- package/dist/i18n/I18nPanel.vue.d.ts +23 -0
- package/dist/i18n/i18n.d.ts +25 -0
- package/dist/i18n/index.d.ts +7 -0
- package/dist/i18n/languageOrder.d.ts +9 -0
- package/dist/i18n/plugin.d.ts +21 -0
- package/dist/i18n/types.d.ts +101 -0
- package/dist/i18n/useWebBuilderI18n.d.ts +164 -0
- package/dist/i18n/vue.d.ts +1 -0
- package/dist/i18n-BYR3l48y.js +959 -0
- package/dist/i18n.js +929 -0
- package/dist/index-CxJlLwvG.js +35378 -0
- package/dist/index-DWfJ4PBm.js +5724 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +12 -0
- package/dist/layout-template/components/LayoutPanel.vue.d.ts +37 -0
- package/dist/layout-template/components/TemplateRulesPanel.vue.d.ts +41 -0
- package/dist/layout-template/config/layoutSharedResources.d.ts +9 -0
- package/dist/layout-template/config/templateSharedResources.d.ts +28 -0
- package/dist/layout-template/index.d.ts +9 -0
- package/dist/layout-template/plugin.d.ts +13 -0
- package/dist/layout-template/runtime/storageAdapter.d.ts +49 -0
- package/dist/layout-template/utils/layoutProjectData.d.ts +15 -0
- package/dist/layout-template/utils/layoutRulePages.d.ts +19 -0
- package/dist/layout-template/utils/layoutSettings.d.ts +45 -0
- package/dist/layout-template/utils/templateRules.d.ts +52 -0
- package/dist/layout-template/vue.d.ts +2 -0
- package/dist/layout-template.js +435 -0
- package/dist/layoutSettings-D4SYUMri.js +252 -0
- package/dist/plugin-BPA8qlaC.js +40 -0
- package/dist/plugin-C0PrxrIe.js +228 -0
- package/dist/plugin-DQshk1sY.js +361 -0
- package/dist/plugin-DebyCjXx.js +191 -0
- package/dist/plugin-Dr6TOtyH.js +73 -0
- package/dist/publisher/index.d.ts +5 -0
- package/dist/publisher/publisherAssets.d.ts +9 -0
- package/dist/publisher/publisherComponents.d.ts +7 -0
- package/dist/publisher/publisherPlugins.d.ts +12 -0
- package/dist/publisher-C6VWXq8u.js +25 -0
- package/dist/publisher.js +1711 -0
- package/dist/solar-BsElUqfQ.js +29843 -0
- package/dist/style.css +1181 -0
- package/dist/templateSharedResources-D1u7eFIs.js +89 -0
- package/dist/types-DNbok59z.js +2359 -0
- package/dist/useFontManager-CdrLq1eG.js +336 -0
- package/dist/vue.d.ts +3 -0
- package/dist/vue.js +2171 -0
- package/package.json +77 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare function hasClass(component: any, className: string): boolean;
|
|
3
|
+
export declare function findImmediateChildByClass(model: any, className: string): any | null;
|
|
4
|
+
export declare function findImmediateChildByType(model: any, expectedType: string): any | null;
|
|
5
|
+
export declare function readTextnodeContentByClass(model: any, className: string): string;
|
|
6
|
+
export declare function readFirstTextnodeContent(model: any): string;
|
|
7
|
+
export declare function writeTextnodeContentByClass(model: any, className: string, value: string): void;
|
|
8
|
+
export declare function writeFirstTextnodeContent(model: any, value: string): void;
|
|
9
|
+
export declare function applyStyleVars(model: any, vars: Record<string, string | undefined | null>): void;
|
|
10
|
+
export declare function toPx(value: string | number | undefined, fallback: number): string;
|
|
11
|
+
export declare function toCssSize(value: string | number | undefined, fallback: string): string;
|
|
12
|
+
export declare function resolveTraitTarget(editor: Editor, expectedType: string, traitCtx?: any): any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const navbarScript: (this: HTMLElement) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const NAVBAR_STYLES = "\n a {\n text-decoration: none;\n }\n /* \u2500\u2500 Navbar base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar {\n top: 0;\n left: 0;\n right: 0;\n z-index: 100;\n --wb-navbar-current-link-color: var(--wb-navbar-link-color, #ffffff);\n height: var(--wb-navbar-height, 72px);\n padding: 0 var(--wb-navbar-padding-x, 24px);\n max-width: 100%;\n box-sizing: border-box;\n color: var(--wb-navbar-current-link-color);\n transition: background 0.3s, box-shadow 0.3s, color 0.3s;\n background-color: var(--wb-navbar-bg, #003152);\n }\n .gjs-navbar--sticky {\n position: sticky;\n }\n .gjs-navbar--fixed-transparent {\n position: fixed;\n --wb-navbar-current-link-color: var(--wb-navbar-transparent-link-color, #ffffff);\n background-color: var(--wb-navbar-transparent-bg, transparent);\n }\n .gjs-navbar.is-scrolled {\n --wb-navbar-current-link-color: var(--wb-navbar-scroll-link-color, var(--wb-navbar-link-color, currentColor));\n background: var(--wb-navbar-scroll-bg, var(--wb-navbar-bg, #003152));\n background-color: var(--wb-navbar-scroll-bg, var(--wb-navbar-bg, #003152));\n box-shadow: 0 10px 30px rgba(4, 16, 56, 0.12);\n }\n .gjs-navbar--fixed-transparent:hover,\n .gjs-navbar--fixed-transparent.is-scrolled {\n background: var(--wb-navbar-scroll-bg, var(--wb-navbar-bg, #003152));\n background-color: var(--wb-navbar-scroll-bg, var(--wb-navbar-bg, #003152));\n }\n\n /* \u2500\u2500 Inner: three-column flex layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__inner {\n display: flex;\n height: 100%;\n align-items: center;\n margin: 0 auto;\n gap: 16px;\n max-width: 1352px;\n padding-inline: 20px;\n }\n\n /* \u2500\u2500 Left slot (brand / logo) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__left {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n }\n .gjs-logo{\n height: var(--wb-navbar-logo-height, 40px);\n }\n .gjs-logo__img {\n height: 100%\n }\n /* \u2500\u2500 Center slot (nav menu) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__center {\n display: flex;\n height: 100%;\n align-items: center;\n flex: 1;\n justify-content: center;\n min-width: 0;\n }\n\n /* \u2500\u2500 Menu alignment variants (toggled via addClass in init) \u2500\u2500\u2500\u2500 */\n .gjs-navbar--menu-left .gjs-navbar__center { justify-content: flex-start; }\n .gjs-navbar--menu-right .gjs-navbar__center { justify-content: flex-end; }\n\n /* \u2500\u2500 Right slot (actions \u2014 droppable) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__right {\n display: flex;\n align-items: center;\n flex: 0 0 auto;\n row-gap: 0;\n column-gap: 16px;\n color: var(--wb-navbar-current-link-color, currentColor);\n }\n\n /* \u2500\u2500 Desktop menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__menu {\n display: flex;\n align-items: center;\n gap: var(--wb-navbar-menu-gap, 28px);\n height: 100%;\n }\n .gjs-navbar__link {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n height: 100%;\n padding: 8px 14px;\n font-size: 0.875rem;\n text-decoration: none;\n transition: color 0.15s, background 0.15s;\n white-space: nowrap;\n color: var(--wb-navbar-current-link-color, currentColor);\n text-transform: uppercase;\n }\n .gjs-navbar__link.is-active{\n background: #0A3D60;\n }\n .gjs-navbar__link::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 3px;\n background: #FFE200;\n opacity: 0;\n transform: scaleX(0.4);\n transform-origin: left;\n transition: opacity 0.18s ease, transform 0.18s ease;\n }\n .gjs-navbar__link:hover {\n color: var(--wb-navbar-current-link-color, currentColor);\n background-color: #0A3D60;\n }\n .gjs-navbar__link.is-active::after,\n .gjs-navbar__link[aria-current=\"page\"]::after {\n opacity: 1;\n transform: scaleX(1);\n }\n .gjs-navbar.is-scrolled .gjs-navbar__link {\n color: var(--wb-navbar-current-link-color, currentColor);\n }\n .gjs-navbar.is-scrolled .gjs-navbar__link:hover {\n color: var(--wb-navbar-current-link-color, currentColor);\n }\n .gjs-navbar__link--cta {\n padding: 10px 32px;\n background-color: #FFE200;\n color: #00101A;\n font-size: 16px;\n line-height: 1.4;\n text-transform: none;\n transition: transform .2s ease-in-out;\n }\n .gjs-navbar__link--cta:hover {\n color: #00101a;\n transform: translateY(-2px);\n }\n\n /* \u2500\u2500 Burger (hidden on desktop) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__burger {\n display: none;\n flex-direction: column;\n justify-content: center;\n gap: 4px;\n cursor: pointer;\n border: none;\n background: transparent;\n padding: 6px;\n }\n .gjs-navbar__burger span {\n display: block;\n width: 18px;\n height: 2px;\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n background-color: #ffffff;\n transition: transform 0.2s, opacity 0.2s;\n }\n .gjs-navbar__burger:hover span {\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n }\n .gjs-navbar.is-scrolled .gjs-navbar__burger span {\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n background-color: #ffffff;\n }\n\n /* \u2500\u2500 Overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.55);\n z-index: 1;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.28s, visibility 0.28s;\n backdrop-filter: blur(2px);\n }\n @media (min-width: 1023px){\n .gjs-navbar__overlay{\n top: 72px;\n }\n }\n .gjs-navbar__overlay.is-open {\n opacity: 1;\n visibility: visible;\n }\n\n /* \u2500\u2500 Drawer close button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar__close {\n display: none;\n position: absolute;\n top: 16px;\n right: 16px;\n width: 36px;\n height: 36px;\n align-items: center;\n justify-content: center;\n border: none;\n background: rgba(0, 0, 0, 0.08);\n color: #000;\n cursor: pointer;\n font-size: 18px;\n line-height: 1;\n transition: background 0.15s, color 0.15s;\n }\n\n /* \u2500\u2500 Mobile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n @media (max-width: 1023px) {\n .gjs-navbar__inner {\n justify-content: space-between;\n min-height: var(--wb-navbar-height, 72px);\n }\n .gjs-logo__img {\n height: var(--wb-navbar-logo-mobile-height, 28px);\n }\n\n /* Center slot: collapse to zero-width so fixed drawer still works */\n .gjs-navbar__center {\n flex: 0 0 0;\n width: 0;\n min-width: 0;\n overflow: visible;\n }\n\n /* Right slot: hide CTA; keep search and burger visible */\n .gjs-navbar__right > .gjs-navbar__link--cta {\n display: none;\n }\n\n .gjs-navbar__burger {\n display: flex;\n }\n\n /* Drawer */\n .gjs-navbar__menu {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(var(--wb-navbar-drawer-width, 360px), 48vw);\n flex-direction: column;\n align-items: stretch;\n gap: 2px;\n background-color: var(--wb-navbar-drawer-bg, #ffffff);\n z-index: 999;\n padding-top: var(--wb-navbar-drawer-padding-top, 72px);\n padding-bottom: var(--wb-navbar-drawer-padding-bottom, 24px);\n padding-inline: var(--wb-navbar-drawer-padding-x, 12px);\n transform: translateX(105%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n box-shadow: -8px 0 40px rgba(0, 0, 0, 0.4);\n }\n .gjs-navbar__menu.is-open {\n transform: translateX(0);\n }\n\n /* \u2500\u2500 Left drawer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-navbar--drawer-left .gjs-navbar__menu {\n right: auto;\n left: 0;\n transform: translateX(-105%);\n box-shadow: 8px 0 40px rgba(0, 0, 0, 0.4);\n }\n .gjs-navbar--drawer-left .gjs-navbar__menu.is-open {\n transform: translateX(0);\n }\n\n .gjs-navbar__close {\n display: flex;\n }\n\n .gjs-navbar__link {\n padding: 12px;\n font-size: 1rem;\n width: 100%;\n height: auto;\n justify-content: flex-start;\n color: #000A11;\n text-transform: none;\n }\n .gjs-navbar__link::after {\n left: 12px;\n right: auto;\n bottom: 0;\n width: 28px;\n transform-origin: left center;\n }\n .gjs-navbar__link--cta {\n margin-top: 8px;\n text-align: center;\n padding: 12px 16px;\n }\n }\n\n @media (max-width: 767px) {\n .gjs-navbar {\n z-index: 100;\n max-width: 100%;\n box-sizing: border-box;\n background: var(--wb-navbar-bg, #003152);\n color: var(--wb-navbar-current-link-color, #ffffff);\n border: none;\n border-radius: 0;\n transition: background 0.3s ease, color 0.3s ease;\n height: var(--wb-navbar-mobile-height, 72px)\n }\n .gjs-navbar.is-scrolled{\n \n }\n .gjs-navbar--fixed-transparent {\n background: var(--wb-navbar-transparent-bg, transparent);\n }\n .gjs-navbar--fixed-transparent.is-scrolled {\n background: var(--wb-navbar-scroll-bg, var(--wb-navbar-bg, #003152));\n }\n .gjs-navbar__inner {\n min-height: 48px;\n gap: 12px;\n justify-content: space-between;\n align-items: center;\n }\n .gjs-navbar__left {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n }\n .gjs-logo__img {\n height: 100%;\n }\n .gjs-navbar__right {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex: 0 0 auto;\n }\n .gjs-navbar__right > .gjs-search {\n display: flex;\n color: var(--wb-navbar-current-link-color, #ffffff);\n }\n .gjs-search__btn {\n width: 42px;\n height: 42px;\n color: var(--wb-navbar-current-link-color, #ffffff);\n }\n .gjs-navbar__burger {\n flex: 0 0 auto;\n margin-right: 2px;\n padding: 0;\n border-radius: 0;\n }\n .gjs-navbar__burger span {\n width: 17px;\n height: 1.5px;\n border-radius: 0;\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n background-color: #ffffff;\n \n }\n .gjs-navbar__burger:hover span{\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n }\n .gjs-navbar.is-scrolled .gjs-navbar__burger span {\n background-color: var(--wb-navbar-current-link-color, #ffffff);\n }\n .gjs-navbar__menu {\n width: min(var(--wb-navbar-drawer-width, 360px), 82vw);\n }\n }\n\n /* \u2500\u2500 Nav Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group {\n height: 100%;\n position: relative;\n --wb-nav-group-dropdown-left: 0;\n --wb-nav-group-dropdown-right: auto;\n --wb-nav-group-dropdown-translate-x: 0;\n --wb-nav-group-dropdown-min-width: 180px;\n --wb-nav-group-dropdown-offset: 16px;\n --wb-nav-group-dropdown-bg: #ffffff;\n --wb-nav-group-mega-bg: #ffffff;\n --wb-nav-group-mega-radius: 0;\n }\n .gjs-nav-group--mega {\n position: static;\n height: 100%;\n }\n .gjs-nav-group__btn {\n height: 100%;\n display: inline-flex;\n align-items: center;\n position: relative;\n gap: 5px;\n padding: 8px 14px;\n font-size: 0.875rem;\n color: var(--wb-navbar-current-link-color, currentColor);\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.15s, background 0.15s;\n white-space: nowrap;\n text-transform: uppercase;\n }\n .gjs-nav-group__btn::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 3px;\n background: #FFE200;\n opacity: 0;\n transform: scaleX(0.4);\n transition: opacity 0.18s ease, transform 0.18s ease;\n }\n .gjs-nav-group__btn:hover {\n color: var(--wb-navbar-current-link-color, currentColor);\n background-color: #0A3D60;\n }\n .gjs-nav-group.is-active > .gjs-nav-group__btn::after,\n .gjs-nav-group.is-active > .gjs-nav-group__btn[aria-current=\"page\"]::after {\n opacity: 1;\n transform: scaleX(1);\n }\n .gjs-navbar.is-scrolled .gjs-nav-group__btn {\n color: var(--wb-navbar-current-link-color, currentColor);\n }\n .gjs-navbar.is-scrolled .gjs-nav-group__btn:hover {\n color: var(--wb-navbar-current-link-color, currentColor);\n }\n .gjs-nav-group__btn-chevron {\n display: flex;\n align-items: center;\n transition: transform 0.2s;\n }\n .gjs-nav-group:hover .gjs-nav-group__btn-chevron {\n transform: rotate(180deg);\n }\n\n /* \u2500\u2500 Regular dropdown \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__dropdown {\n position: absolute;\n top: 100%;\n left: var(--wb-nav-group-dropdown-left, 50%);\n right: var(--wb-nav-group-dropdown-right, auto);\n padding-top: var(--wb-nav-group-dropdown-offset, 16px);\n background: transparent;\n transform: translateX(var(--wb-nav-group-dropdown-translate-x, -50%));\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.18s, visibility 0.18s, transform 0.18s;\n z-index: 200;\n }\n .gjs-nav-group:hover .gjs-nav-group__dropdown {\n opacity: 1;\n visibility: visible;\n }\n .gjs-nav-group__dropdown-inner {\n min-width: var(--wb-nav-group-dropdown-min-width, 180px);\n background-color: var(--wb-nav-group-dropdown-bg, #ffffff);\n border-radius: 0;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(15, 23, 42, 0.08);\n transform: translateY(-6px);\n transition: transform 0.18s;\n }\n .gjs-nav-group:hover .gjs-nav-group__dropdown-inner {\n transform: translateY(0);\n }\n .gjs-nav-group__dropdown-item {\n display: block;\n padding: 8px 12px;\n font-size: 0.875rem;\n color: #334155;\n text-decoration: none;\n white-space: nowrap;\n transition: color 0.15s, background 0.15s;\n }\n .gjs-nav-group__dropdown-item:hover {\n color: #003152;\n background-color: #F7F8FA;\n }\n .gjs-nav-group__dropdown-item.is-active,\n .gjs-nav-group__dropdown-item[aria-current=\"page\"] {\n color: #003152;\n background-color: #F7F8FA;\n font-weight: 600;\n }\n\n /* \u2500\u2500 Mega menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /* \u2500\u2500 Mega Menu: transparent bridge wrapper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n /* This outer wrapper is positioned flush to the bottom of the trigger\n button (top: 100%) and uses padding-top as a transparent \"bridge\"\n that keeps .gjs-nav-group--mega:hover active while the cursor travels\n across the gap. padding-top is overridden per-component via the\n ngOffset trait (inline style). */\n \n @media (min-width: 1024px) {\n .gjs-nav-group__mega {\n min-height: 480px;\n }\n .gjs-nav-group__mega-inner {\n min-height: 480px;\n }\n .gjs-nav-group__mega-left,\n .gjs-nav-group__mega-right {\n min-height: 480px;\n height: 100%;\n }\n }\n .gjs-nav-group__mega {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n padding-top: 8px;\n background: transparent;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.18s, visibility 0.18s;\n z-index: 200;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.10);\n }\n .gjs-nav-group--mega:hover .gjs-nav-group__mega,\n .gjs-nav-group--mega.tooto-hovered .gjs-nav-group__mega,\n .gjs-nav-group--mega.tooto-selected .gjs-nav-group__mega,\n .gjs-nav-group__btn:hover + .gjs-nav-group__mega,\n .gjs-nav-group.is-open .gjs-nav-group__mega {\n opacity: 1;\n visibility: visible;\n }\n .gjs-nav-group__mega.is-scrolled{\n padding-top: 0 !important;\n }\n /* \u2500\u2500 Mega Menu: inner visual panel (two fixed columns) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__mega-inner {\n display: block;\n position: relative;\n width: min(100%, 1352px);\n margin: 0 auto;\n padding-inline: 20px;\n box-sizing: border-box;\n overflow: visible;\n background: var(--wb-nav-group-mega-bg, #ffffff);\n border-radius: var(--wb-nav-group-mega-radius, 0);\n transform: translateY(-6px);\n transition: transform 0.18s;\n }\n .gjs-nav-group__mega-inner.is-scrolled{\n }\n .gjs-nav-group--mega:hover .gjs-nav-group__mega-inner,\n .gjs-nav-group--mega.tooto-hovered .gjs-nav-group__mega-inner,\n .gjs-nav-group--mega.tooto-selected .gjs-nav-group__mega-inner,\n .gjs-nav-group__btn:hover + .gjs-nav-group__mega .gjs-nav-group__mega-inner,\n .gjs-nav-group.is-open .gjs-nav-group__mega-inner {\n transform: translateY(0);\n }\n\n /* \u2500\u2500 Left panel: stacks menu-group columns side-by-side \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__mega-left {\n width: var(--wb-mega-left-width, 50%);\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 80px 20px;\n min-width: 0;\n box-sizing: border-box;\n background: var(--wb-nav-group-mega-bg, #ffffff);\n min-height: 100%;\n }\n .gjs-nav-group__mega-left-stack {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n }\n\n /* \u2500\u2500 Right panel: feature image \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__mega-right {\n display: var(--wb-mega-right-display, flex);\n position: absolute;\n top: 0;\n right: min(0px, calc((100vw - 1352px) / -2));\n bottom: 0;\n width: var(--wb-mega-right-width, 50vw);\n align-items: stretch;\n overflow: hidden;\n box-sizing: border-box;\n padding: var(--wb-mega-image-padding, 0);\n }\n .gjs-nav-group__mega-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* \u2500\u2500 Mega column \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__mega-col {\n flex: 1;\n min-width: 160px;\n padding: 0 32px 0 0;\n margin-right: 32px;\n }\n .gjs-nav-group__mega-col:last-child {\n padding-right: 0;\n margin-right: 0;\n border-right: none;\n }\n\n .gjs-nav-group__mega-col-title {\n font-size: 36px;\n font-weight: 600;\n color: #0f172a;\n padding-bottom: 16px;\n margin-bottom: 0;\n }\n\n /* \u2500\u2500 Mega item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n .gjs-nav-group__mega-item {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n position: relative;\n padding: 0;\n font-size: 24px;\n line-height: 2em;\n color: #768389;\n font-weight: 400;\n text-decoration: none;\n border: none;\n transition: color 0.18s ease;\n gap: 0;\n width: max-content;\n max-width: 100%;\n opacity: 0;\n transform: translateY(10px);\n transition:\n color 0.18s ease,\n opacity 0.28s ease,\n transform 0.28s ease;\n }\n .gjs-nav-group--mega:hover .gjs-nav-group__mega-item,\n .gjs-nav-group--mega.tooto-hovered .gjs-nav-group__mega-item,\n .gjs-nav-group--mega.tooto-selected .gjs-nav-group__mega-item,\n .gjs-nav-group__btn:hover + .gjs-nav-group__mega .gjs-nav-group__mega-item,\n .gjs-nav-group.is-open .gjs-nav-group__mega-item {\n opacity: 1;\n transform: translateY(0);\n }\n .gjs-nav-group__mega-item:nth-of-type(1) { transition-delay: 0ms; }\n .gjs-nav-group__mega-item:nth-of-type(2) { transition-delay: 50ms; }\n .gjs-nav-group__mega-item:nth-of-type(3) { transition-delay: 100ms; }\n .gjs-nav-group__mega-item:nth-of-type(4) { transition-delay: 150ms; }\n .gjs-nav-group__mega-item:nth-of-type(5) { transition-delay: 200ms; }\n .gjs-nav-group__mega-item:nth-of-type(6) { transition-delay: 250ms; }\n .gjs-nav-group__mega-item:nth-of-type(7) { transition-delay: 300ms; }\n .gjs-nav-group__mega-item:nth-of-type(8) { transition-delay: 350ms; }\n .gjs-nav-group__mega-item:first-of-type {\n }\n .gjs-nav-group__mega-item:hover {\n color: #003152;\n font-weight: 500;\n }\n .gjs-nav-group__mega-item.is-active {\n color: #003152;\n font-weight: 500;\n }\n .gjs-nav-group__mega-item-label {\n flex: 1;\n position: relative;\n }\n .gjs-nav-group__mega-item-label::after {\n content: '';\n position: absolute;\n left: 0;\n bottom: 0.2em;\n width: 0;\n height: 1px;\n background: #003152;\n transition: width 0.22s ease;\n }\n .gjs-nav-group__mega-item:hover .gjs-nav-group__mega-item-label::after,\n .gjs-nav-group__mega-item.is-active .gjs-nav-group__mega-item-label::after {\n width: 100%;\n }\n .gjs-nav-group__mega-item-icon {\n display: none;\n }\n .gjs-nav-group__mega-item:hover .gjs-nav-group__mega-item-icon {\n }\n .gjs-nav-group__mega-item.is-active .gjs-nav-group__mega-item-icon {\n }\n .gjs-nav-group__mega-footer-link {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n margin-top: 36px;\n font-size: 0.9375rem;\n color: #0b3b63;\n text-decoration: none;\n width: fit-content;\n opacity: 0;\n transform: translateY(10px);\n transition: opacity 0.28s ease 350ms, transform 0.28s ease 350ms;\n }\n .gjs-nav-group--mega:hover .gjs-nav-group__mega-footer-link,\n .gjs-nav-group--mega.tooto-hovered .gjs-nav-group__mega-footer-link,\n .gjs-nav-group--mega.tooto-selected .gjs-nav-group__mega-footer-link,\n .gjs-nav-group__btn:hover + .gjs-nav-group__mega .gjs-nav-group__mega-footer-link,\n .gjs-nav-group.is-open .gjs-nav-group__mega-footer-link {\n opacity: 1;\n transform: translateY(0);\n }\n .gjs-nav-group__mega-footer-icon {\n font-size: 1.125rem;\n line-height: 1;\n }\n\n /* \u2500\u2500 Nav Group mobile (accordion) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n @media (max-width: 1023px) {\n .gjs-nav-group {\n position: static;\n width: 100%;\n height: auto;\n }\n .gjs-nav-group__btn {\n width: 100%;\n height: auto;\n padding: 12px;\n font-size: 1rem;\n justify-content: space-between;\n color: #000A11;\n text-transform: none;\n }\n .gjs-nav-group__btn::after {\n left: 12px;\n right: auto;\n bottom: 6px;\n width: 28px;\n transform-origin: left center;\n }\n .gjs-nav-group__btn:hover,\n .gjs-navbar.is-scrolled .gjs-nav-group__btn,\n .gjs-navbar.is-scrolled .gjs-nav-group__btn:hover {\n color: #000A11;\n background-color: #f6f7f8;\n }\n .gjs-nav-group:hover .gjs-nav-group__btn-chevron {\n transform: none;\n }\n .gjs-nav-group.is-open .gjs-nav-group__btn-chevron {\n transform: rotate(180deg);\n }\n .gjs-nav-group:hover .gjs-nav-group__dropdown {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n .gjs-nav-group__dropdown {\n position: static;\n opacity: 1;\n visibility: visible;\n transform: none;\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.28s ease, padding 0.28s ease;\n padding: 0;\n background: transparent;\n z-index: auto;\n margin: 2px 0;\n }\n .gjs-nav-group.is-open .gjs-nav-group__dropdown {\n max-height: 500px;\n padding-top: 0;\n }\n .gjs-nav-group__dropdown-inner {\n transform: none !important;\n transition: none;\n background: rgba(255, 255, 255, 0.04);\n padding: 0;\n box-shadow: none;\n border: none;\n min-width: 0;\n }\n .gjs-nav-group.is-open .gjs-nav-group__dropdown-inner {\n }\n .gjs-nav-group__mega {\n position: static;\n padding-top: 0 !important;\n background: transparent;\n opacity: 1;\n visibility: visible;\n transition: none;\n max-height: 0;\n overflow: hidden;\n z-index: auto;\n margin: 2px 0;\n }\n .gjs-nav-group.is-open .gjs-nav-group__mega {\n max-height: 800px;\n }\n .gjs-nav-group__mega-inner {\n border:0;\n padding: 0;\n box-shadow: none;\n flex-direction: column;\n gap: 0;\n overflow: visible;\n transform: none !important;\n transition: none;\n }\n .gjs-nav-group__mega-col-title{\n display: none;\n }\n .gjs-nav-group__mega-left {\n flex: none;\n width: 100%;\n flex-direction: column;\n padding: 10px 12px;\n gap: 0;\n }\n .gjs-nav-group__mega-footer-link {\n margin-top: 18px;\n }\n .gjs-nav-group__mega-right {\n display: none !important;\n }\n .gjs-nav-group__mega-col {\n flex: none;\n width: 100%;\n padding: 8px 0;\n margin-right: 0;\n border-right: none;\n border-bottom: 1px solid #e2e8f0;\n }\n .gjs-nav-group__mega-col:last-child {\n border-bottom: none;\n padding-block: 0;\n }\n .gjs-nav-group__mega-item {\n padding: 10px 0;\n font-size: 0.9rem;\n opacity: 1;\n transform: none;\n transition: color 0.18s ease;\n }\n .gjs-nav-group__mega-footer-link {\n opacity: 1;\n transform: none;\n transition: none;\n }\n }\n";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_HOME_BANNER_CAROUSEL_TYPE = "wb-home-banner-carousel";
|
|
3
|
+
export declare const WB_HOME_BANNER_SLIDE_TYPE = "wb-home-banner-slide";
|
|
4
|
+
export declare function registerHomeBannerCarouselComponent(editor: Editor): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_HOTSPOT_SHOWCASE_TYPE = "wb-hotspot-showcase";
|
|
3
|
+
export declare const WB_HOTSPOT_SHOWCASE_ITEM_TYPE = "wb-hotspot-showcase-item";
|
|
4
|
+
export interface HotspotShowcaseHotspot {
|
|
5
|
+
image: string;
|
|
6
|
+
title: string;
|
|
7
|
+
desc: string;
|
|
8
|
+
buttonText: string;
|
|
9
|
+
link: string;
|
|
10
|
+
left: string;
|
|
11
|
+
top: string;
|
|
12
|
+
mobileLeft: string;
|
|
13
|
+
mobileTop: string;
|
|
14
|
+
}
|
|
15
|
+
export interface HotspotShowcaseItem {
|
|
16
|
+
desktopImage: string;
|
|
17
|
+
mobileImage: string;
|
|
18
|
+
title: string;
|
|
19
|
+
desc: string;
|
|
20
|
+
primaryButtonText: string;
|
|
21
|
+
primaryLink: string;
|
|
22
|
+
secondaryButtonText: string;
|
|
23
|
+
secondaryLink: string;
|
|
24
|
+
hotspots: HotspotShowcaseHotspot[];
|
|
25
|
+
}
|
|
26
|
+
export declare function createDefaultHotspotShowcaseHotspot(index?: number): HotspotShowcaseHotspot;
|
|
27
|
+
export declare function createDefaultHotspotShowcaseItem(index?: number): HotspotShowcaseItem;
|
|
28
|
+
export declare function normalizeHotspotShowcaseHotspots(raw: unknown): HotspotShowcaseHotspot[];
|
|
29
|
+
export declare function serializeHotspotShowcaseHotspots(hotspots: HotspotShowcaseHotspot[]): string;
|
|
30
|
+
export declare function registerHotspotShowcaseComponent(editor: Editor): void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_RESPONSIVE_HERO_CAROUSEL_TYPE = "wb-responsive-hero-carousel";
|
|
3
|
+
export declare const WB_RESPONSIVE_HERO_CAROUSEL_ITEM_TYPE = "wb-responsive-hero-carousel-item";
|
|
4
|
+
export declare function registerResponsiveHeroCarouselComponent(editor: Editor): void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_SERVICE_ICON_GRID_TYPE = "wb-service-icon-grid";
|
|
3
|
+
export declare const WB_SERVICE_ICON_GRID_ITEM_TYPE = "wb-service-icon-grid-item";
|
|
4
|
+
export declare function registerServiceIconGridComponent(editor: Editor): void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_SERVICES_CAROUSEL_TYPE = "wb-services-carousel";
|
|
3
|
+
export declare const WB_SERVICES_CAROUSEL_ITEM_TYPE = "wb-services-carousel-item";
|
|
4
|
+
export declare function registerServicesCarouselComponent(editor: Editor): void;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_SERVICES_SHOWCASE_TYPE = "wb-services-showcase";
|
|
3
|
+
export declare const WB_SERVICES_SHOWCASE_ITEM_TYPE = "wb-services-showcase-item";
|
|
4
|
+
export declare function registerServicesShowcaseComponent(editor: Editor): void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* container.ts / grid.ts 共享的 Trait 定义。
|
|
3
|
+
* 宽度属性在两个文件中完全重复,统一在此维护。
|
|
4
|
+
*
|
|
5
|
+
* 背景属性和最小高度属性已迁移到 StyleManager(wb-layout / wb-background sector),
|
|
6
|
+
* 不再作为 Traits 管理。
|
|
7
|
+
*
|
|
8
|
+
* ui 字段说明(供 StylesPropertiesPanel.vue 读取,决定渲染方式):
|
|
9
|
+
* widget - 控件类型标识(优先级高于 type)
|
|
10
|
+
* inlineUnit - 与该 trait 配对的单位选择 trait 名称(显示在 label-end 插槽)
|
|
11
|
+
*/
|
|
12
|
+
export declare const widthTraits: ({
|
|
13
|
+
type: string;
|
|
14
|
+
label: string;
|
|
15
|
+
name: string;
|
|
16
|
+
changeProp: boolean;
|
|
17
|
+
ui: {
|
|
18
|
+
widget: string;
|
|
19
|
+
};
|
|
20
|
+
options: {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
}[];
|
|
24
|
+
min?: undefined;
|
|
25
|
+
step?: undefined;
|
|
26
|
+
} | {
|
|
27
|
+
type: string;
|
|
28
|
+
label: string;
|
|
29
|
+
name: string;
|
|
30
|
+
min: number;
|
|
31
|
+
step: number;
|
|
32
|
+
changeProp: boolean;
|
|
33
|
+
ui: {
|
|
34
|
+
widget: string;
|
|
35
|
+
};
|
|
36
|
+
options?: undefined;
|
|
37
|
+
})[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Editor } from 'grapesjs';
|
|
2
|
+
export declare const WB_HEADING_TYPE = "wb-heading";
|
|
3
|
+
/**
|
|
4
|
+
* 注册标题组件
|
|
5
|
+
* - 继承 GrapesJS 内置 text 类型,支持双击直接在画布内联编辑文本
|
|
6
|
+
* - 属性面板只保留 HTML 标签(H1-H6)选择,不再有文本内容 trait
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerHeadingComponent(editor: Editor): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type BasicRegistryFailurePolicy = 'core' | 'optional';
|
|
2
|
+
export interface BasicRegistryManifestEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
registeredTypes: string[];
|
|
5
|
+
failurePolicy: BasicRegistryFailurePolicy;
|
|
6
|
+
}
|
|
7
|
+
export declare const BASIC_REGISTRY_MANIFEST: BasicRegistryManifestEntry[];
|
|
8
|
+
export declare function getBasicRegistryTypes(entries?: readonly BasicRegistryManifestEntry[]): string[];
|
|
9
|
+
export declare function assertUniqueBasicRegistryTypes(entries?: readonly BasicRegistryManifestEntry[]): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebBuilder 样式辅助函数
|
|
3
|
+
*
|
|
4
|
+
* 提取自 container.ts / grid.ts / carousel.ts 中重复定义的工具函数,
|
|
5
|
+
* 供所有 registry 文件统一导入使用。
|
|
6
|
+
*
|
|
7
|
+
* buildBackgroundStyles / buildMinHeightStyles 已移除——
|
|
8
|
+
* 背景和最小高度属性已迁移到 StyleManager(wb-layout / wb-background sector)。
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 将任意值转为有限数字,无法转换时返回 fallback
|
|
12
|
+
*/
|
|
13
|
+
export declare const toNumber: (val: unknown, fallback: number) => number;
|
|
14
|
+
/**
|
|
15
|
+
* 将任意值转为字符串单位,若不在白名单内则返回 fallback
|
|
16
|
+
*/
|
|
17
|
+
export declare const toUnit: (val: unknown, fallback: string, allowed: string[]) => string;
|
|
18
|
+
/**
|
|
19
|
+
* 将任意值转为布尔值,支持 'true'/'false'/'1'/'0' 字符串形式
|
|
20
|
+
*/
|
|
21
|
+
export declare const toBool: (val: unknown, fallback?: boolean) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 从 model 读取宽度 / 盒式布局属性,返回对应的 CSS 样式对象。
|
|
24
|
+
*
|
|
25
|
+
* 读取的 model props:
|
|
26
|
+
* - contentWidth('full' | 'boxed')
|
|
27
|
+
* - boxedWidth
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildWidthStyles(model: any): Record<string, string>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function normalizeIconName(rawIcon: string): string;
|
|
2
|
+
export declare function iconifySvgUrl(icon: string, size?: number): string;
|
|
3
|
+
export declare function fetchIconifySvg(icon: string): Promise<string>;
|
|
4
|
+
export declare function fetchSvgMarkupFromUrl(url: string): Promise<string>;
|
|
5
|
+
export declare function getSolarIconSvg(icon: string): Promise<string>;
|
|
6
|
+
export declare function searchSolarIcons(query?: string, offset?: number, limit?: number): Promise<{
|
|
7
|
+
icons: string[];
|
|
8
|
+
total: number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function normalizeSvgMarkup(rawSvg: string): string;
|
|
11
|
+
export declare function svgMarkupToComponentDefs(rawSvg: string): any[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module-level bridge for cross-framework communication between
|
|
3
|
+
* GrapesJS custom trait types (pure DOM) and the Vue panel.
|
|
4
|
+
*
|
|
5
|
+
* GrapesJS custom trait types run in plain DOM context, but some UI
|
|
6
|
+
* (like WbColorPicker or imageManager) lives in the Vue layer.
|
|
7
|
+
* This module provides a simple callback bridge.
|
|
8
|
+
*/
|
|
9
|
+
export interface ColorPickerOpenParams {
|
|
10
|
+
anchor: HTMLElement;
|
|
11
|
+
value: string;
|
|
12
|
+
onChange: (v: string) => void;
|
|
13
|
+
onClear: () => void;
|
|
14
|
+
}
|
|
15
|
+
type ColorPickerHandler = (params: ColorPickerOpenParams) => void;
|
|
16
|
+
export declare function setColorPickerHandler(fn: ColorPickerHandler): void;
|
|
17
|
+
export declare function openColorPicker(params: ColorPickerOpenParams): void;
|
|
18
|
+
export declare function setImageManager(im: any): void;
|
|
19
|
+
export declare function getImageManager(): any;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { TraitProperties } from 'grapesjs';
|
|
2
|
+
/**
|
|
3
|
+
* WebBuilder Trait 工厂函数
|
|
4
|
+
*
|
|
5
|
+
* 为 GrapesJS 组件 registry 提供统一的 trait 定义构建器,
|
|
6
|
+
* 消除各 registry 文件中大量重复的 trait 字面量。
|
|
7
|
+
*
|
|
8
|
+
* 使用方式:
|
|
9
|
+
* import { makeNumberTrait, makeLinkTargetTrait } from '../../utils/traitFactory'
|
|
10
|
+
* traits: [makeNumberTrait('高度', 'spacerHeight', { min: 0, max: 1000 })]
|
|
11
|
+
*/
|
|
12
|
+
export interface WebBuilderTraitOption {
|
|
13
|
+
id?: string | number;
|
|
14
|
+
value?: string | number;
|
|
15
|
+
label?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface SelectOption extends WebBuilderTraitOption {
|
|
20
|
+
value: string | number;
|
|
21
|
+
label: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TraitDef extends Partial<TraitProperties> {
|
|
24
|
+
type: string;
|
|
25
|
+
label: string;
|
|
26
|
+
name: string;
|
|
27
|
+
changeProp: true;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
export type WebBuilderTraitInput = string | (Omit<Partial<TraitProperties>, 'options'> & {
|
|
31
|
+
options?: readonly WebBuilderTraitOption[];
|
|
32
|
+
ui?: Record<string, unknown>;
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
});
|
|
35
|
+
export declare const defineWebBuilderTraits: <T extends readonly WebBuilderTraitInput[]>(traits: T) => T;
|
|
36
|
+
export declare const defineGrapesTraits: (traits: readonly WebBuilderTraitInput[]) => (string | Partial<TraitProperties>)[];
|
|
37
|
+
/**
|
|
38
|
+
* 创建文本输入 trait
|
|
39
|
+
* @example makeTextTrait('按钮文字', 'buttonText', { placeholder: '请输入' })
|
|
40
|
+
*/
|
|
41
|
+
export declare function makeTextTrait(label: string, name: string, options?: {
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
}): TraitDef;
|
|
44
|
+
export declare function makeTextareaTrait(label: string, name: string, options?: {
|
|
45
|
+
placeholder?: string;
|
|
46
|
+
rows?: number;
|
|
47
|
+
}): TraitDef;
|
|
48
|
+
/**
|
|
49
|
+
* 创建 URL 链接输入 trait(text 类型,placeholder 为 https://)
|
|
50
|
+
* @example makeLinkTrait({ name: 'imageLink', label: '链接地址' })
|
|
51
|
+
*/
|
|
52
|
+
export declare function makeLinkTrait(options?: {
|
|
53
|
+
label?: string;
|
|
54
|
+
name?: string;
|
|
55
|
+
placeholder?: string;
|
|
56
|
+
}): TraitDef;
|
|
57
|
+
/**
|
|
58
|
+
* 创建数字输入 trait(支持 min / max / step)
|
|
59
|
+
* @example makeNumberTrait('高度', 'spacerHeight', { min: 0, max: 1000 })
|
|
60
|
+
*/
|
|
61
|
+
export declare function makeNumberTrait(label: string, name: string, options?: {
|
|
62
|
+
min?: number;
|
|
63
|
+
max?: number;
|
|
64
|
+
step?: number;
|
|
65
|
+
}): TraitDef;
|
|
66
|
+
/**
|
|
67
|
+
* 创建下拉选择 trait
|
|
68
|
+
* @example makeSelectTrait('单位', 'spacerHeightUnit', [{ value: 'px', label: 'px' }])
|
|
69
|
+
*/
|
|
70
|
+
export declare function makeSelectTrait(label: string, name: string, selectOptions: readonly SelectOption[]): TraitDef;
|
|
71
|
+
/**
|
|
72
|
+
* 创建链接打开方式 trait(_self / _blank)
|
|
73
|
+
* @example makeLinkTargetTrait({ name: 'imageLinkTarget', label: '链接打开方式' })
|
|
74
|
+
*/
|
|
75
|
+
export declare function makeLinkTargetTrait(options?: {
|
|
76
|
+
label?: string;
|
|
77
|
+
name?: string;
|
|
78
|
+
}): TraitDef;
|
|
79
|
+
/** 常用单位选项(px / vh / rem) */
|
|
80
|
+
export declare const UNIT_OPTIONS_PX_VH_REM: SelectOption[];
|
|
81
|
+
/** 常用单位选项(px / % / vh) */
|
|
82
|
+
export declare const UNIT_OPTIONS_PX_PCT_VH: SelectOption[];
|
|
83
|
+
/**
|
|
84
|
+
* 创建复选框 trait
|
|
85
|
+
* @example makeCheckboxTrait('自动播放', 'autoplay')
|
|
86
|
+
*/
|
|
87
|
+
export declare function makeCheckboxTrait(label: string, name: string): TraitDef;
|
|
88
|
+
/**
|
|
89
|
+
* 创建颜色选择器 trait(需配合 registerColorPickerTrait 使用)
|
|
90
|
+
* @example makeColorPickerTrait('线条颜色', 'dividerColor')
|
|
91
|
+
*/
|
|
92
|
+
export declare function makeColorPickerTrait(label: string, name: string): TraitDef;
|
|
93
|
+
/**
|
|
94
|
+
* 创建图片选择器 trait(需配合 registerImagePickerTrait 使用)
|
|
95
|
+
* @example makeImagePickerTrait('图片', 'imageSrc', { showPreview: true })
|
|
96
|
+
*/
|
|
97
|
+
export declare function makeImagePickerTrait(label: string, name: string, options?: {
|
|
98
|
+
showPreview?: boolean;
|
|
99
|
+
}): TraitDef;
|
|
100
|
+
/**
|
|
101
|
+
* 创建 SVG 图标选择器 trait(需配合 registerSvgIconPickerTrait 使用)
|
|
102
|
+
* @example makeSvgIconPickerTrait('图标', 'iconSvg', { sourceName: 'iconSource' })
|
|
103
|
+
*/
|
|
104
|
+
export declare function makeSvgIconPickerTrait(label: string, name: string, options?: {
|
|
105
|
+
sourceName?: string;
|
|
106
|
+
}): TraitDef;
|