@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.
Files changed (193) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +3 -0
  3. package/dist/basic/cssScope.d.ts +3 -0
  4. package/dist/basic/index.d.ts +81 -0
  5. package/dist/basic/injectStyle.d.ts +20 -0
  6. package/dist/basic/plugin.d.ts +19 -0
  7. package/dist/basic/publisher.d.ts +4 -0
  8. package/dist/basic/registries/interactive/accordion/index.d.ts +3 -0
  9. package/dist/basic/registries/interactive/backButton/index.d.ts +3 -0
  10. package/dist/basic/registries/interactive/button/index.d.ts +10 -0
  11. package/dist/basic/registries/interactive/countUp/index.d.ts +9 -0
  12. package/dist/basic/registries/interactive/customCode/index.d.ts +3 -0
  13. package/dist/basic/registries/interactive/index.d.ts +2 -0
  14. package/dist/basic/registries/interactive/inquiryForm/index.d.ts +3 -0
  15. package/dist/basic/registries/interactive/klaviyoSubscribe/index.d.ts +3 -0
  16. package/dist/basic/registries/interactive/popup/index.d.ts +5 -0
  17. package/dist/basic/registries/interactive/salesmartlyChatButton/index.d.ts +10 -0
  18. package/dist/basic/registries/interactive/search/index.d.ts +10 -0
  19. package/dist/basic/registries/interactive/socialShare/index.d.ts +33 -0
  20. package/dist/basic/registries/interactive/tabs/index.d.ts +3 -0
  21. package/dist/basic/registries/layout/container/index.d.ts +19 -0
  22. package/dist/basic/registries/layout/divider/index.d.ts +7 -0
  23. package/dist/basic/registries/layout/grid/index.d.ts +11 -0
  24. package/dist/basic/registries/layout/index.d.ts +2 -0
  25. package/dist/basic/registries/layout/layoutBase/index.d.ts +10 -0
  26. package/dist/basic/registries/layout/section/index.d.ts +3 -0
  27. package/dist/basic/registries/layout/sectionGridBlock/index.d.ts +3 -0
  28. package/dist/basic/registries/layout/spacer/index.d.ts +7 -0
  29. package/dist/basic/registries/media/banner/index.d.ts +11 -0
  30. package/dist/basic/registries/media/carousel/index.d.ts +6 -0
  31. package/dist/basic/registries/media/flipbook/index.d.ts +5 -0
  32. package/dist/basic/registries/media/icon/index.d.ts +3 -0
  33. package/dist/basic/registries/media/image/index.d.ts +3 -0
  34. package/dist/basic/registries/media/index.d.ts +2 -0
  35. package/dist/basic/registries/media/industryTabs/index.d.ts +3 -0
  36. package/dist/basic/registries/media/marquee/index.d.ts +4 -0
  37. package/dist/basic/registries/media/ourSolutions/helpers.d.ts +289 -0
  38. package/dist/basic/registries/media/ourSolutions/index.d.ts +4 -0
  39. package/dist/basic/registries/media/ourSolutions/script.d.ts +1 -0
  40. package/dist/basic/registries/media/ourSolutions/style.d.ts +1 -0
  41. package/dist/basic/registries/media/pdfViewer/index.d.ts +3 -0
  42. package/dist/basic/registries/media/productCategories/index.d.ts +4 -0
  43. package/dist/basic/registries/media/tabMediaGallery/index.d.ts +3 -0
  44. package/dist/basic/registries/media/video/index.d.ts +12 -0
  45. package/dist/basic/registries/navigation/footer/index.d.ts +10 -0
  46. package/dist/basic/registries/navigation/index.d.ts +2 -0
  47. package/dist/basic/registries/navigation/languageSwitcher/index.d.ts +6 -0
  48. package/dist/basic/registries/navigation/logo/index.d.ts +9 -0
  49. package/dist/basic/registries/navigation/navbar/constants.d.ts +38 -0
  50. package/dist/basic/registries/navigation/navbar/factories.d.ts +848 -0
  51. package/dist/basic/registries/navigation/navbar/helpers.d.ts +12 -0
  52. package/dist/basic/registries/navigation/navbar/index.d.ts +4 -0
  53. package/dist/basic/registries/navigation/navbar/registerMegaTypes.d.ts +2 -0
  54. package/dist/basic/registries/navigation/navbar/registerMenuTypes.d.ts +2 -0
  55. package/dist/basic/registries/navigation/navbar/registerRootTypes.d.ts +2 -0
  56. package/dist/basic/registries/navigation/navbar/script.d.ts +1 -0
  57. package/dist/basic/registries/navigation/navbar/style.d.ts +1 -0
  58. package/dist/basic/registries/navigation/socialLinks/index.d.ts +3 -0
  59. package/dist/basic/registries/section/allApplications/index.d.ts +3 -0
  60. package/dist/basic/registries/section/cardCarouselSection/index.d.ts +3 -0
  61. package/dist/basic/registries/section/caseSpotlight/index.d.ts +3 -0
  62. package/dist/basic/registries/section/companyScale/index.d.ts +3 -0
  63. package/dist/basic/registries/section/customizationGrid/index.d.ts +3 -0
  64. package/dist/basic/registries/section/factoryMap/index.d.ts +3 -0
  65. package/dist/basic/registries/section/focaHistoryTimeline/index.d.ts +3 -0
  66. package/dist/basic/registries/section/historyTimeline/index.d.ts +3 -0
  67. package/dist/basic/registries/section/homeBannerCarousel/index.d.ts +4 -0
  68. package/dist/basic/registries/section/hotspotShowcase/index.d.ts +30 -0
  69. package/dist/basic/registries/section/index.d.ts +2 -0
  70. package/dist/basic/registries/section/map/index.d.ts +4 -0
  71. package/dist/basic/registries/section/milestoneCardStrip/index.d.ts +3 -0
  72. package/dist/basic/registries/section/moreCardCarousel/index.d.ts +3 -0
  73. package/dist/basic/registries/section/ourAdvantages/index.d.ts +4 -0
  74. package/dist/basic/registries/section/overviewSplit/index.d.ts +3 -0
  75. package/dist/basic/registries/section/processTimeline/index.d.ts +3 -0
  76. package/dist/basic/registries/section/productCardStrip/index.d.ts +3 -0
  77. package/dist/basic/registries/section/resourceSection/index.d.ts +6 -0
  78. package/dist/basic/registries/section/responsiveHeroCarousel/index.d.ts +4 -0
  79. package/dist/basic/registries/section/serviceIconGrid/index.d.ts +4 -0
  80. package/dist/basic/registries/section/servicesCarousel/index.d.ts +4 -0
  81. package/dist/basic/registries/section/servicesShowcase/index.d.ts +4 -0
  82. package/dist/basic/registries/section/servicesThb/index.d.ts +4 -0
  83. package/dist/basic/registries/section/solutionList/index.d.ts +4 -0
  84. package/dist/basic/registries/section/staticPinMap/index.d.ts +4 -0
  85. package/dist/basic/registries/section/statsCards/index.d.ts +3 -0
  86. package/dist/basic/registries/section/swiperRuntime.d.ts +3 -0
  87. package/dist/basic/registries/shared/sharedTraits.d.ts +37 -0
  88. package/dist/basic/registries/types.d.ts +5 -0
  89. package/dist/basic/registries/typography/heading/index.d.ts +8 -0
  90. package/dist/basic/registries/typography/index.d.ts +2 -0
  91. package/dist/basic/registries/typography/textEditor/index.d.ts +6 -0
  92. package/dist/basic/registryManifest.d.ts +9 -0
  93. package/dist/basic/styleHelpers.d.ts +29 -0
  94. package/dist/basic/svgIcon.d.ts +11 -0
  95. package/dist/basic/traitBridge.d.ts +20 -0
  96. package/dist/basic/traitFactory.d.ts +106 -0
  97. package/dist/basic.js +1146 -0
  98. package/dist/cms/cmsFactory.d.ts +164 -0
  99. package/dist/cms/dynamicRenderPipeline.d.ts +12 -0
  100. package/dist/cms/index.d.ts +31 -0
  101. package/dist/cms/plugin.d.ts +12 -0
  102. package/dist/cms/publisher.d.ts +7 -0
  103. package/dist/cms/registries/dynamic/cms/constants.d.ts +16 -0
  104. package/dist/cms/registries/dynamic/cms/dynamicField/bindings.d.ts +78 -0
  105. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/breadcrumbBlock.d.ts +1 -0
  106. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/conditionalBlock.d.ts +1 -0
  107. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/datetimeBlock.d.ts +1 -0
  108. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/htmlBlock.d.ts +1 -0
  109. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/imageBlock.d.ts +1 -0
  110. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/linkBlock.d.ts +1 -0
  111. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/seoBlock.d.ts +1 -0
  112. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/textBlock.d.ts +1 -0
  113. package/dist/cms/registries/dynamic/cms/dynamicField/blocks/tocBlock.d.ts +1 -0
  114. package/dist/cms/registries/dynamic/cms/dynamicField/constants.d.ts +19 -0
  115. package/dist/cms/registries/dynamic/cms/dynamicField/helpers.d.ts +52 -0
  116. package/dist/cms/registries/dynamic/cms/dynamicField/registerBlock.d.ts +57 -0
  117. package/dist/cms/registries/dynamic/cms/dynamicField/styles.d.ts +7 -0
  118. package/dist/cms/registries/dynamic/cms/media/previewMediaTrait.d.ts +7 -0
  119. package/dist/cms/registries/dynamic/cms/menu/siteMenuAttrs.d.ts +11 -0
  120. package/dist/cms/registries/dynamic/cms/menuTree/menuTreeAttrs.d.ts +8 -0
  121. package/dist/cms/registries/dynamic/cms/post/styles.d.ts +6 -0
  122. package/dist/cms/registries/dynamic/cms/product/detail.styles.d.ts +1 -0
  123. package/dist/cms/registries/dynamic/cms/product/detailV2.styles.d.ts +1 -0
  124. package/dist/cms/registries/dynamic/cms/product/previewProductTrait.d.ts +6 -0
  125. package/dist/cms/registries/dynamic/cms/product/styles.d.ts +6 -0
  126. package/dist/cms/registries/dynamic/dataProvider.d.ts +45 -0
  127. package/dist/cms/registries/dynamic/loopGrid/paginationStyles.d.ts +5 -0
  128. package/dist/cms/registries/dynamic/loopGrid/preview.d.ts +16 -0
  129. package/dist/cms/registries/dynamic/loopGrid/publisher.d.ts +3 -0
  130. package/dist/cms/registries/dynamic/loopGrid/types.d.ts +97 -0
  131. package/dist/cms/registries/navigation/navbarThb/index.d.ts +3 -0
  132. package/dist/cms/registries/navigation/navbarThb/script.d.ts +1 -0
  133. package/dist/cms/registries/navigation/navbarThb/style.d.ts +1 -0
  134. package/dist/cms.js +4535 -0
  135. package/dist/global-settings/components/FontFamilySelect.vue.d.ts +29 -0
  136. package/dist/global-settings/components/FontManagerPanel.vue.d.ts +37 -0
  137. package/dist/global-settings/index.d.ts +8 -0
  138. package/dist/global-settings/plugin.d.ts +3 -0
  139. package/dist/global-settings/publisher.d.ts +15 -0
  140. package/dist/global-settings/runtime/canvasInjection.d.ts +13 -0
  141. package/dist/global-settings/runtime/panelDraftSave.d.ts +17 -0
  142. package/dist/global-settings/runtime/settingsSource.d.ts +4 -0
  143. package/dist/global-settings/useFontManager.d.ts +38 -0
  144. package/dist/global-settings/useGoogleFonts.d.ts +20 -0
  145. package/dist/global-settings/vue.d.ts +1 -0
  146. package/dist/global-settings.js +66 -0
  147. package/dist/i18n/I18nPanel.vue.d.ts +23 -0
  148. package/dist/i18n/i18n.d.ts +25 -0
  149. package/dist/i18n/index.d.ts +7 -0
  150. package/dist/i18n/languageOrder.d.ts +9 -0
  151. package/dist/i18n/plugin.d.ts +21 -0
  152. package/dist/i18n/types.d.ts +101 -0
  153. package/dist/i18n/useWebBuilderI18n.d.ts +164 -0
  154. package/dist/i18n/vue.d.ts +1 -0
  155. package/dist/i18n-BYR3l48y.js +959 -0
  156. package/dist/i18n.js +929 -0
  157. package/dist/index-CxJlLwvG.js +35378 -0
  158. package/dist/index-DWfJ4PBm.js +5724 -0
  159. package/dist/index.d.ts +9 -0
  160. package/dist/index.js +12 -0
  161. package/dist/layout-template/components/LayoutPanel.vue.d.ts +37 -0
  162. package/dist/layout-template/components/TemplateRulesPanel.vue.d.ts +41 -0
  163. package/dist/layout-template/config/layoutSharedResources.d.ts +9 -0
  164. package/dist/layout-template/config/templateSharedResources.d.ts +28 -0
  165. package/dist/layout-template/index.d.ts +9 -0
  166. package/dist/layout-template/plugin.d.ts +13 -0
  167. package/dist/layout-template/runtime/storageAdapter.d.ts +49 -0
  168. package/dist/layout-template/utils/layoutProjectData.d.ts +15 -0
  169. package/dist/layout-template/utils/layoutRulePages.d.ts +19 -0
  170. package/dist/layout-template/utils/layoutSettings.d.ts +45 -0
  171. package/dist/layout-template/utils/templateRules.d.ts +52 -0
  172. package/dist/layout-template/vue.d.ts +2 -0
  173. package/dist/layout-template.js +435 -0
  174. package/dist/layoutSettings-D4SYUMri.js +252 -0
  175. package/dist/plugin-BPA8qlaC.js +40 -0
  176. package/dist/plugin-C0PrxrIe.js +228 -0
  177. package/dist/plugin-DQshk1sY.js +361 -0
  178. package/dist/plugin-DebyCjXx.js +191 -0
  179. package/dist/plugin-Dr6TOtyH.js +73 -0
  180. package/dist/publisher/index.d.ts +5 -0
  181. package/dist/publisher/publisherAssets.d.ts +9 -0
  182. package/dist/publisher/publisherComponents.d.ts +7 -0
  183. package/dist/publisher/publisherPlugins.d.ts +12 -0
  184. package/dist/publisher-C6VWXq8u.js +25 -0
  185. package/dist/publisher.js +1711 -0
  186. package/dist/solar-BsElUqfQ.js +29843 -0
  187. package/dist/style.css +1181 -0
  188. package/dist/templateSharedResources-D1u7eFIs.js +89 -0
  189. package/dist/types-DNbok59z.js +2359 -0
  190. package/dist/useFontManager-CdrLq1eG.js +336 -0
  191. package/dist/vue.d.ts +3 -0
  192. package/dist/vue.js +2171 -0
  193. 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,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare function registerNavbar(editor: Editor): void;
3
+ export declare const WB_NAVBAR_TYPE = "navbar";
4
+ export declare function registerNavbarComponent(editor: Editor): void;
@@ -0,0 +1,2 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare function registerNavbarMegaTypes(editor: Editor): void;
@@ -0,0 +1,2 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare function registerNavbarMenuTypes(editor: Editor): void;
@@ -0,0 +1,2 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare function registerNavbarRootTypes(editor: Editor): void;
@@ -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,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_SOCIAL_LINKS_TYPE = "wb-social-links";
3
+ export declare function registerSocialLinksComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_ALL_APPLICATIONS_TYPE = "wb-all-applications";
3
+ export declare function registerAllApplicationsComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_CARD_CAROUSEL_SECTION_TYPE = "wb-card-carousel-section";
3
+ export declare function registerCardCarouselSectionComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_CASE_SPOTLIGHT_TYPE = "wb-case-spotlight";
3
+ export declare function registerCaseSpotlightComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_COMPANY_SCALE_TYPE = "wb-company-scale";
3
+ export declare function registerCompanyScaleComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_CUSTOMIZATION_GRID_TYPE = "wb-customization-grid";
3
+ export declare function registerCustomizationGridComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_FACTORY_MAP_TYPE = "wb-factory-map";
3
+ export declare function registerFactoryMapComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_FOCA_HISTORY_TIMELINE_TYPE = "wb-foca-history-timeline";
3
+ export declare function registerFocaHistoryTimelineComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_HISTORY_TIMELINE_TYPE = "wb-history-timeline";
3
+ export declare function registerHistoryTimelineComponent(editor: Editor): void;
@@ -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,2 @@
1
+ import type { ComponentRegistryExecutor } from '../types.js';
2
+ export declare const BASIC_SECTION_REGISTRIES: ComponentRegistryExecutor[];
@@ -0,0 +1,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_MAP_TYPE = "wb-map";
3
+ export declare const WB_MAP_PIN_TYPE = "wb-map-pin";
4
+ export declare function registerMapComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_MILESTONE_CARD_STRIP_TYPE = "wb-milestone-card-strip";
3
+ export declare function registerMilestoneCardStripComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_MORE_CARD_CAROUSEL_TYPE = "wb-more-card-carousel";
3
+ export declare function registerMoreCardCarouselComponent(editor: Editor): void;
@@ -0,0 +1,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_OUR_ADVANTAGES_TYPE = "wb-our-advantages";
3
+ export declare const WB_OUR_ADVANTAGES_ITEM_TYPE = "wb-our-advantages-item";
4
+ export declare function registerOurAdvantagesComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_OVERVIEW_SPLIT_TYPE = "wb-overview-split";
3
+ export declare function registerOverviewSplitComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_PROCESS_TIMELINE_TYPE = "wb-process-timeline";
3
+ export declare function registerProcessTimelineComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_PRODUCT_CARD_STRIP_TYPE = "wb-product-card-strip";
3
+ export declare function registerProductCardStripComponent(editor: Editor): void;
@@ -0,0 +1,6 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_RESOURCE_SECTION_TYPE = "wb-resource-section";
3
+ /**
4
+ * 注册 Resource Section 组件
5
+ */
6
+ export declare function registerResourceSectionComponent(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,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_SERVICE_THB_TYPE = "wb-service-thb";
3
+ export declare const WB_SERVICE_THB_ITEM_TYPE = "wb-service-thb-item";
4
+ export declare function registerServiceThbComponent(editor: Editor): void;
@@ -0,0 +1,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_SOLUTION_LIST_TYPE = "wb-solution-list";
3
+ export declare const WB_SOLUTION_LIST_CARD_TYPE = "wb-solution-list-card";
4
+ export declare function registerSolutionListComponent(editor: Editor): void;
@@ -0,0 +1,4 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_STATIC_PIN_MAP_TYPE = "wb-static-pin-map";
3
+ export declare const WB_STATIC_PIN_TYPE = "wb-static-pin";
4
+ export declare function registerStaticPinMapComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_STATS_CARDS_TYPE = "wb-stats-cards";
3
+ export declare function registerStatsCardsComponent(editor: Editor): void;
@@ -0,0 +1,3 @@
1
+ type SwiperModuleName = 'Autoplay' | 'Navigation';
2
+ export declare function exposeSwiperRuntimeToCanvas(canvasWindow: Record<string, any> | null | undefined, moduleNames: SwiperModuleName[]): void;
3
+ export {};
@@ -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,5 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export interface ComponentRegistryExecutor {
3
+ id: string;
4
+ register: (editor: Editor) => void;
5
+ }
@@ -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,2 @@
1
+ import type { ComponentRegistryExecutor } from '../types.js';
2
+ export declare const TYPOGRAPHY_REGISTRIES: ComponentRegistryExecutor[];
@@ -0,0 +1,6 @@
1
+ import type { Editor } from 'grapesjs';
2
+ export declare const WB_TEXT_EDITOR_TYPE = "wb-text-editor";
3
+ /**
4
+ * 注册文本编辑器组件(参考 Elementor Text Editor)
5
+ */
6
+ export declare function registerTextEditorComponent(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;