├── .gitignore ├── LICENSE ├── README.md ├── compilerconfig.json ├── compilerconfig.json.defaults ├── concept └── preloaders │ ├── index.html │ ├── style.css │ ├── style.css.map │ └── style.scss ├── custom-typings └── waypoint.d.ts ├── dist ├── css │ ├── date-handler.css │ ├── date-handler.css.map │ ├── element-groups.css │ ├── element-groups.css.map │ ├── encoded-email.css │ ├── encoded-email.css.map │ ├── form-select.css │ ├── form-select.css.map │ ├── github-gist.css │ ├── github-gist.css.map │ ├── input-range-slider.css │ ├── input-range-slider.css.map │ ├── layouts.css │ ├── layouts.css.map │ ├── limit-items v2.css │ ├── limit-items v2.css.map │ ├── limit-items v3.css │ ├── limit-items v3.css.map │ ├── limit-items-v1.css │ ├── limit-items-v1.css.map │ ├── limit-items.css │ ├── limit-items.css.map │ ├── markdown.css │ ├── markdown.css.map │ ├── modal.css │ ├── modal.css.map │ ├── nested-list.css │ ├── nested-list.css.map │ ├── preload.css │ ├── preload.css.map │ ├── style.css │ ├── style.css.map │ ├── svg embeds.css │ ├── svg embeds.css.map │ ├── svg-embeds.css │ ├── svg-embeds.css.map │ ├── util.css │ ├── util.css.map │ ├── webflow-accordion.css │ ├── webflow-accordion.css.map │ ├── webflow-data.css │ ├── webflow-data.css.map │ ├── webflow-demo.css │ ├── webflow-demo.css.map │ ├── webflow-detect.css │ ├── webflow-detect.css.map │ ├── webflow-elements.css │ ├── webflow-elements.css.map │ ├── webflow-embed.css │ ├── webflow-embed.css.map │ ├── webflow-fixup.css │ ├── webflow-fixup.css.map │ ├── webflow-form.css │ ├── webflow-form.css.map │ ├── webflow-format.css │ ├── webflow-format.css.map │ ├── webflow-gallery.css │ ├── webflow-gallery.css.map │ ├── webflow-html.css │ ├── webflow-html.css.map │ ├── webflow-kiosk.css │ ├── webflow-kiosk.css.map │ ├── webflow-membership.css │ ├── webflow-membership.css.map │ ├── webflow-modal.css │ ├── webflow-modal.css.map │ ├── webflow-richtext.css │ ├── webflow-richtext.css.map │ ├── webflow-track.css │ ├── webflow-track.css.map │ ├── webflow-ui.css │ ├── webflow-ui.css.map │ ├── webflow-util.css │ ├── webflow-util.css.map │ ├── webflow-video.css │ └── webflow-video.css.map ├── data │ ├── google-docs.js │ └── google-docs.js.map ├── experimental │ ├── webflow-countup.js │ ├── webflow-countup.js.map │ ├── webflow-seo.js │ └── webflow-seo.js.map ├── globals.js ├── globals.js.map ├── nocode │ ├── webflow-404.js │ ├── webflow-404.js.map │ ├── webflow-calc.js │ ├── webflow-calc.js.map │ ├── webflow-cro.js │ ├── webflow-cro.js.map │ ├── webflow-data.js │ ├── webflow-data.js.map │ ├── webflow-demo.js │ ├── webflow-demo.js.map │ ├── webflow-detect.js │ ├── webflow-detect.js.map │ ├── webflow-effects.js │ ├── webflow-effects.js.map │ ├── webflow-elements.js │ ├── webflow-elements.js.map │ ├── webflow-embed.js │ ├── webflow-embed.js.map │ ├── webflow-events.js │ ├── webflow-events.js.map │ ├── webflow-fixup.js │ ├── webflow-fixup.js.map │ ├── webflow-form.js │ ├── webflow-form.js.map │ ├── webflow-format.js │ ├── webflow-format.js.map │ ├── webflow-gallery.js │ ├── webflow-gallery.js.map │ ├── webflow-hotkeys.js │ ├── webflow-hotkeys.js.map │ ├── webflow-html.js │ ├── webflow-html.js.map │ ├── webflow-ix.js │ ├── webflow-ix.js.map │ ├── webflow-kiosk.js │ ├── webflow-kiosk.js.map │ ├── webflow-layout.js │ ├── webflow-layout.js.map │ ├── webflow-membership.js │ ├── webflow-membership.js.map │ ├── webflow-modal.js │ ├── webflow-modal.js.map │ ├── webflow-richtext.js │ ├── webflow-richtext.js.map │ ├── webflow-seo.js │ ├── webflow-seo.js.map │ ├── webflow-socialshare.js │ ├── webflow-socialshare.js.map │ ├── webflow-ui.js │ ├── webflow-ui.js.map │ ├── webflow-url.js │ ├── webflow-url.js.map │ ├── webflow-video.js │ └── webflow-video.js.map ├── storage-utils.js ├── storage-utils.js.map ├── utils.js ├── utils.js.map ├── utils │ ├── utm-link.js │ └── utm-link.js.map ├── version.js ├── version.js.map ├── webflow-booking │ ├── timely.js │ └── timely.js.map ├── webflow-cache.js ├── webflow-cache.js.map ├── webflow-cache │ ├── cache-item-typed.js │ ├── cache-item-typed.js.map │ ├── cache-item.js │ └── cache-item.js.map ├── webflow-calc.js ├── webflow-calc.js.map ├── webflow-commerce.js ├── webflow-commerce.js.map ├── webflow-commerce │ ├── webflow.js │ └── webflow.js.map ├── webflow-core.js ├── webflow-core.js.map ├── webflow-core │ ├── IDeckNavigation.js │ ├── IDeckNavigation.js.map │ ├── debug.js │ ├── debug.js.map │ ├── designer.js │ ├── designer.js.map │ ├── events.js │ ├── events.js.map │ ├── scripts.js │ ├── scripts.js.map │ ├── webflow-editor.js │ └── webflow-editor.js.map ├── webflow-cro.js ├── webflow-cro.js.map ├── webflow-cro │ ├── source.js │ └── source.js.map ├── webflow-crypto.js ├── webflow-crypto.js.map ├── webflow-data-collectionlist.js ├── webflow-data-collectionlist.js.map ├── webflow-data.js ├── webflow-data.js.map ├── webflow-data │ ├── database.js │ ├── database.js.map │ ├── github-data.js │ ├── github-data.js.map │ ├── google-sheet-data.js │ ├── google-sheet-data.js.map │ ├── sa5-data.js │ ├── sa5-data.js.map │ ├── webflow-collectionlist-data.js │ └── webflow-collectionlist-data.js.map ├── webflow-databind.js ├── webflow-databind.js.map ├── webflow-databind │ └── template │ │ ├── default-template-handler.js │ │ ├── default-template-handler.js.map │ │ ├── handlebars-template-handler.js │ │ └── handlebars-template-handler.js.map ├── webflow-demo.js ├── webflow-demo.js.map ├── webflow-detect.js ├── webflow-detect.js.map ├── webflow-detect │ ├── geo-handlers │ │ ├── geo-handler-base.js │ │ ├── geo-handler-base.js.map │ │ ├── ip-info.js │ │ ├── ip-info.js.map │ │ ├── ipify.js │ │ └── ipify.js.map │ ├── routing-rules.js │ └── routing-rules.js.map ├── webflow-editor.js ├── webflow-editor.js.map ├── webflow-effects │ ├── effect-controller.js │ ├── effect-controller.js.map │ └── effects │ │ ├── depth-map.js │ │ ├── depth-map.js.map │ │ ├── effect-handler-factory.js │ │ ├── effect-handler-factory.js.map │ │ ├── effect-handler.js │ │ └── effect-handler.js.map ├── webflow-elements │ ├── accordion.js │ ├── accordion.js.map │ ├── action.js │ ├── action.js.map │ ├── autocomplete.js │ ├── autocomplete.js.map │ ├── button.js │ ├── button.js.map │ ├── deck-controller.js │ ├── deck-controller.js.map │ ├── dropdown.js │ ├── dropdown.js.map │ ├── lightbox.js │ ├── lightbox.js.map │ ├── slider.js │ ├── slider.js.map │ ├── tabs.js │ └── tabs.js.map ├── webflow-embed.js ├── webflow-embed.js.map ├── webflow-finsweet.js ├── webflow-finsweet.js.map ├── webflow-finsweet │ ├── fs-load.js │ └── fs-load.js.map ├── webflow-form.js ├── webflow-form.js.map ├── webflow-form │ ├── checkbox.js │ ├── checkbox.js.map │ ├── form-data-binder.js │ ├── form-data-binder.js.map │ ├── form-select.js │ ├── form-select.js.map │ ├── handler │ │ ├── basin-handler.js │ │ ├── basin-handler.js.map │ │ ├── form-handler-factory.js │ │ ├── form-handler-factory.js.map │ │ ├── form-handler.js │ │ ├── form-handler.js.map │ │ ├── make-handler.js │ │ ├── make-handler.js.map │ │ ├── n8n-handler.js │ │ ├── n8n-handler.js.map │ │ ├── success-handler.js │ │ ├── success-handler.js.map │ │ ├── zapier-handler.js │ │ └── zapier-handler.js.map │ ├── ip-info.js │ ├── ip-info.js.map │ ├── textarea.js │ └── textarea.js.map ├── webflow-format.js ├── webflow-format.js.map ├── webflow-format │ └── date-handler │ │ ├── date-handler-dayjs.js │ │ ├── date-handler-dayjs.js.map │ │ ├── date-handler-factory.js │ │ ├── date-handler-factory.js.map │ │ ├── date-handler.js │ │ ├── date-handler.js.map │ │ ├── moment-handler.js │ │ └── moment-handler.js.map ├── webflow-gallery.js ├── webflow-gallery.js.map ├── webflow-hotkeys.js ├── webflow-hotkeys.js.map ├── webflow-html-builder.js ├── webflow-html-builder.js.map ├── webflow-html.js ├── webflow-html.js.map ├── webflow-html │ ├── breakpoints.js │ ├── breakpoints.js.map │ ├── collection-list.js │ ├── collection-list.js.map │ ├── download-file.js │ ├── download-file.js.map │ ├── dynamic-attributes.js │ ├── dynamic-attributes.js.map │ ├── dynamic-urls.js │ ├── dynamic-urls.js.map │ ├── encoded-email.js │ ├── encoded-email.js.map │ ├── lazyload.js │ ├── lazyload.js.map │ ├── markdown.js │ ├── markdown.js.map │ ├── sort.js │ ├── sort.js.map │ ├── switch.js │ └── switch.js.map ├── webflow-ix.js ├── webflow-ix.js.map ├── webflow-kiosk.js ├── webflow-kiosk.js.map ├── webflow-kiosk │ ├── activity.js │ ├── activity.js.map │ ├── kiosk.js │ └── kiosk.js.map ├── webflow-layout │ ├── element-groups.js │ ├── element-groups.js.map │ ├── layout.js │ ├── layout.js.map │ └── layout │ │ └── handler │ │ ├── layout-handler-factory.js │ │ ├── layout-handler-factory.js.map │ │ ├── layout-handler.js │ │ ├── layout-handler.js.map │ │ ├── tabs-handler.js │ │ └── tabs-handler.js.map ├── webflow-lightbox │ ├── caption-handler.js │ └── caption-handler.js.map ├── webflow-localization │ ├── webflow.js │ └── webflow.js.map ├── webflow-membership.js ├── webflow-membership.js.map ├── webflow-membership │ ├── access-groups.js │ ├── access-groups.js.map │ ├── hyperflow.js │ ├── hyperflow.js.map │ ├── internal │ │ ├── account.js │ │ ├── account.js.map │ │ ├── login.js │ │ ├── login.js.map │ │ ├── logout.js │ │ ├── logout.js.map │ │ ├── prelogin.js │ │ ├── prelogin.js.map │ │ ├── usys.js │ │ └── usys.js.map │ ├── login-routing.js │ ├── login-routing.js.map │ ├── user.js │ └── user.js.map ├── webflow-modal │ ├── dismiss.js │ ├── dismiss.js.map │ ├── modal-controller.js │ ├── modal-controller.js.map │ ├── modal-gate-controller.js │ ├── modal-gate-controller.js.map │ ├── modal.js │ └── modal.js.map ├── webflow-richtext.js ├── webflow-richtext.js.map ├── webflow-richtext │ ├── github-gist.js │ ├── github-gist.js.map │ ├── nested-list.js │ └── nested-list.js.map ├── webflow-seo.js ├── webflow-seo.js.map ├── webflow-seo │ └── json-ld │ │ ├── article.js │ │ ├── article.js.map │ │ ├── blog-posting.js │ │ ├── blog-posting.js.map │ │ ├── course.js │ │ ├── course.js.map │ │ ├── entry-point.js │ │ ├── entry-point.js.map │ │ ├── image-object.js │ │ ├── image-object.js.map │ │ ├── json-ld-base.js │ │ ├── json-ld-base.js.map │ │ ├── news-article.js │ │ ├── news-article.js.map │ │ ├── organization.js │ │ ├── organization.js.map │ │ ├── person.js │ │ ├── person.js.map │ │ ├── profile-page.js │ │ ├── profile-page.js.map │ │ ├── search-action.js │ │ ├── search-action.js.map │ │ ├── tech-article.js │ │ ├── tech-article.js.map │ │ ├── webpage.js │ │ ├── webpage.js.map │ │ ├── website.js │ │ └── website.js.map ├── webflow-storage.js ├── webflow-storage.js.map ├── webflow-track.js ├── webflow-track.js.map ├── webflow-ui.js ├── webflow-ui.js.map ├── webflow-url.js ├── webflow-url.js.map ├── webflow-url │ ├── query.js │ ├── query.js.map │ ├── queryPassthrough.js │ ├── queryPassthrough.js.map │ ├── relativeLinkFixup.js │ ├── relativeLinkFixup.js.map │ ├── targetLinks.js │ └── targetLinks.js.map ├── webflow-video.js ├── webflow-video.js.map └── webflow-video │ ├── player-factory.js │ ├── player-factory.js.map │ ├── player.js │ ├── player.js.map │ ├── players │ ├── vimeo.js │ └── vimeo.js.map │ ├── video-controller.js │ └── video-controller.js.map ├── favicon.png ├── package-lock.json ├── package.json ├── src ├── css │ ├── input-range-slider.scss │ ├── util.scss │ ├── webflow-accordion.scss │ ├── webflow-data.scss │ ├── webflow-demo.scss │ ├── webflow-detect.scss │ ├── webflow-elements.scss │ ├── webflow-embed.scss │ ├── webflow-fixup.scss │ ├── webflow-form.scss │ ├── webflow-format.scss │ ├── webflow-gallery.scss │ ├── webflow-html.scss │ ├── webflow-kiosk.scss │ ├── webflow-membership.scss │ ├── webflow-modal.scss │ ├── webflow-richtext.scss │ ├── webflow-track.scss │ ├── webflow-ui.scss │ ├── webflow-util.scss │ └── webflow-video.scss ├── data │ ├── countries.js │ ├── countriesStates.js │ └── google-docs.ts ├── experimental │ ├── webflow-countup.ts │ └── webflow-seo.ts ├── globals.ts ├── lib │ └── patterns │ │ └── email.js ├── locode │ ├── webflow-forms-helper.js │ └── webflow-table-helper.js ├── nocode │ ├── webflow-404.ts │ ├── webflow-calc.ts │ ├── webflow-cro.ts │ ├── webflow-data.ts │ ├── webflow-demo.ts │ ├── webflow-detect.ts │ ├── webflow-effects.ts │ ├── webflow-elements.ts │ ├── webflow-embed.ts │ ├── webflow-events.ts │ ├── webflow-fixup.ts │ ├── webflow-form.ts │ ├── webflow-format.ts │ ├── webflow-gallery.ts │ ├── webflow-hotkeys.ts │ ├── webflow-html.ts │ ├── webflow-ix.ts │ ├── webflow-kiosk.ts │ ├── webflow-layout.ts │ ├── webflow-membership.ts │ ├── webflow-modal.ts │ ├── webflow-richtext.ts │ ├── webflow-seo.ts │ ├── webflow-socialshare.ts │ ├── webflow-ui.ts │ ├── webflow-url.ts │ └── webflow-video.ts ├── storage-utils.ts ├── utils.ts ├── utils │ └── utm-link.ts ├── version.ts ├── webflow-booking │ └── timely.ts ├── webflow-cache.ts ├── webflow-cache │ ├── cache-item-typed.ts │ └── cache-item.ts ├── webflow-calc.ts ├── webflow-commerce.ts ├── webflow-commerce │ └── webflow.ts ├── webflow-core.ts ├── webflow-core │ ├── IDeckNavigation.ts │ ├── debug.ts │ ├── designer.ts │ ├── events.ts │ ├── events │ │ ├── actions │ │ │ ├── actionBase.ts │ │ │ ├── actionScriptBase.ts │ │ │ ├── alert.ts │ │ │ ├── class.ts │ │ │ ├── click.ts │ │ │ ├── scroll-into-view.ts │ │ │ └── visibility.ts │ │ └── triggers │ │ │ ├── click.ts │ │ │ ├── exit-intent.ts │ │ │ ├── hash.ts │ │ │ ├── hover.ts │ │ │ ├── scroll-into-view.ts │ │ │ ├── timer.ts │ │ │ ├── triggerBase.ts │ │ │ └── triggerScriptBase.ts │ ├── preload.scss │ ├── scripts.ts │ └── webflow-editor.ts ├── webflow-cro.ts ├── webflow-cro │ └── source.ts ├── webflow-crypto.ts ├── webflow-data-collectionlist.ts ├── webflow-data.ts ├── webflow-data │ ├── database.ts │ ├── github-data.ts │ ├── google-sheet-data.ts │ ├── sa5-data.ts │ └── webflow-collectionlist-data.ts ├── webflow-databind.ts ├── webflow-databind │ └── template │ │ ├── default-template-handler.ts │ │ └── handlebars-template-handler.ts ├── webflow-demo.ts ├── webflow-detect.ts ├── webflow-detect │ ├── geo-handlers │ │ ├── geo-handler-base.ts │ │ ├── ip-info.ts │ │ └── ipify.ts │ └── routing-rules.ts ├── webflow-editor.ts ├── webflow-effects │ ├── effect-controller.ts │ └── effects │ │ ├── depth-map.ts │ │ ├── effect-handler-factory.ts │ │ └── effect-handler.ts ├── webflow-elements │ ├── accordion.ts │ ├── action.ts │ ├── autocomplete.ts │ ├── button.ts │ ├── deck-controller.ts │ ├── dropdown.ts │ ├── lightbox.ts │ ├── slider.ts │ └── tabs.ts ├── webflow-embed.ts ├── webflow-finsweet.ts ├── webflow-finsweet │ └── fs-load.ts ├── webflow-form.ts ├── webflow-form │ ├── checkbox.ts │ ├── form-data-binder.ts │ ├── form-select.scss │ ├── form-select.ts │ ├── handler │ │ ├── basin-handler.ts │ │ ├── form-handler-factory.ts │ │ ├── form-handler.ts │ │ ├── make-handler.ts │ │ ├── n8n-handler.ts │ │ ├── success-handler.ts │ │ └── zapier-handler.ts │ ├── ip-info.ts │ └── textarea.ts ├── webflow-format.ts ├── webflow-format │ ├── date-handler.scss │ └── date-handler │ │ ├── date-handler-dayjs.ts │ │ ├── date-handler-factory.ts │ │ ├── date-handler.ts │ │ └── moment-handler.ts ├── webflow-gallery.ts ├── webflow-gallery │ └── engine │ │ └── simple-collage.ts ├── webflow-hotkeys.ts ├── webflow-html-builder.ts ├── webflow-html.ts ├── webflow-html │ ├── breakpoints.ts │ ├── collection-list.ts │ ├── download-file.ts │ ├── dynamic-attributes.ts │ ├── dynamic-urls.ts │ ├── encoded-email.scss │ ├── encoded-email.ts │ ├── lazyload.ts │ ├── limit-items v2.scss │ ├── limit-items-v1.scss │ ├── limit-items.scss │ ├── markdown.scss │ ├── markdown.ts │ ├── sort.ts │ └── switch.ts ├── webflow-ix.ts ├── webflow-kiosk.ts ├── webflow-kiosk │ ├── activity.ts │ └── kiosk.ts ├── webflow-layout │ ├── element-groups.scss │ ├── element-groups.ts │ ├── layout.ts │ └── layout │ │ └── handler │ │ ├── layout-handler-factory.ts │ │ ├── layout-handler.ts │ │ └── tabs-handler.ts ├── webflow-lightbox │ └── caption-handler.ts ├── webflow-localization │ └── webflow.ts ├── webflow-membership.ts ├── webflow-membership │ ├── access-groups.ts │ ├── hyperflow.ts │ ├── internal │ │ ├── account.ts │ │ ├── login.ts │ │ ├── logout.ts │ │ ├── prelogin.ts │ │ └── usys.ts │ ├── login-routing.ts │ └── user.ts ├── webflow-modal │ ├── actions │ │ └── modal-open.ts │ ├── dismiss.ts │ ├── modal-controller.ts │ ├── modal-gate-controller.ts │ ├── modal.scss │ └── modal.ts ├── webflow-richtext.ts ├── webflow-richtext │ ├── github-gist.scss │ ├── github-gist.ts │ ├── nested-list.scss │ ├── nested-list.ts │ └── svg-embeds.scss ├── webflow-seo.ts ├── webflow-seo │ └── json-ld │ │ ├── article.ts │ │ ├── blog-posting.ts │ │ ├── course.ts │ │ ├── entry-point.ts │ │ ├── image-object.ts │ │ ├── json-ld-base.ts │ │ ├── news-article.ts │ │ ├── organization.ts │ │ ├── person.ts │ │ ├── profile-page.ts │ │ ├── search-action.ts │ │ ├── tech-article.ts │ │ ├── webpage.ts │ │ └── website.ts ├── webflow-storage.ts ├── webflow-track.ts ├── webflow-ui.ts ├── webflow-url.ts ├── webflow-url │ ├── query.ts │ ├── queryPassthrough.ts │ ├── relativeLinkFixup.ts │ └── targetLinks.ts ├── webflow-video.ts └── webflow-video │ ├── events │ └── actions │ │ └── video-play.ts │ ├── player-factory.ts │ ├── player.ts │ ├── players │ ├── html.ts │ └── vimeo.ts │ └── video-controller.ts ├── tsconfig.json └── web.config /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sygnal Attributes 5 2 | 3 | The **WFU** library is a collection of utilities that add capability to 4 | [Webflow](https://webflow.com/) 5 | sites. It focuses on overcoming certain limitations of Webflow, and adding certain functionality. 6 | 7 | > NOTE: in v5, the library is undergoing significant migration 8 | from JS/CSS to TS/SCSS, which means significant code restructuring. Basic library functionality and APIs should remain unchanged. 9 | 10 | Some of the most popular features include; 11 | 12 | - Webflow membership & current user info access 13 | - Enhanced Webflow elements such as lightbox and tabs 14 | - Data-binding form INPUT and SELECT elements to your collection lists 15 | - Adding custom attributes dynamically to elements within a collection list. 16 | - Adding tables support, with data sourced from Google Sheets 17 | - Multilingual support through language-detection and a dynamic content-switcher 18 | - 5-star Ratings widget (SVG, with fractional support) 19 | - URL querystring param extraction and passthrough 20 | 21 | All of these features are focused on creating as much capability within Webflow as possible, without relying on 3rd party plug-ins and monthly service fees. 22 | 23 | This project is also a practical exploration into the use of Javascript ES6 modules, NPM, and other state-of-the art web dev technologies, and how they can be used to enhance Webflow sites. 24 | 25 | *This library will be expanded as needed, and broken into modules for convenient selection of the parts you need.* 26 | 27 | ## Documentation 28 | 29 | Master documentation is here- 30 | https://attr.sygnal.com 31 | 32 | Legacy documentation and demos are here- 33 | https://wfu.sygnal.com 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /compilerconfig.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "outputFile": "dist/css/webflow-html.css", 4 | "inputFile": "dist/css/webflow-html.scss" 5 | } 6 | ] -------------------------------------------------------------------------------- /compilerconfig.json.defaults: -------------------------------------------------------------------------------- 1 | { 2 | "compilers": { 3 | "less": { 4 | "autoPrefix": "", 5 | "cssComb": "none", 6 | "ieCompat": true, 7 | "strictMath": false, 8 | "strictUnits": false, 9 | "relativeUrls": true, 10 | "rootPath": "", 11 | "sourceMapRoot": "", 12 | "sourceMapBasePath": "", 13 | "sourceMap": false 14 | }, 15 | "sass": { 16 | "autoPrefix": "", 17 | "includePath": "", 18 | "indentType": "space", 19 | "indentWidth": 2, 20 | "outputStyle": "nested", 21 | "Precision": 5, 22 | "relativeUrls": true, 23 | "sourceMapRoot": "", 24 | "lineFeed": "", 25 | "sourceMap": false 26 | }, 27 | "stylus": { 28 | "sourceMap": false 29 | }, 30 | "babel": { 31 | "sourceMap": false 32 | }, 33 | "coffeescript": { 34 | "bare": false, 35 | "runtimeMode": "node", 36 | "sourceMap": false 37 | }, 38 | "handlebars": { 39 | "root": "", 40 | "noBOM": false, 41 | "name": "", 42 | "namespace": "", 43 | "knownHelpersOnly": false, 44 | "forcePartial": false, 45 | "knownHelpers": [], 46 | "commonjs": "", 47 | "amd": false, 48 | "sourceMap": false 49 | } 50 | }, 51 | "minifiers": { 52 | "css": { 53 | "enabled": true, 54 | "termSemicolons": true, 55 | "gzip": false 56 | }, 57 | "javascript": { 58 | "enabled": true, 59 | "termSemicolons": true, 60 | "gzip": false 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /concept/preloaders/style.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Comfortaa:400,700,300); 2 | *, html { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | body { 8 | background: #e74c3c; 9 | text-align: center; 10 | font-family: "Comfortaa", cursive; 11 | } 12 | 13 | svg { 14 | width: 100px; 15 | height: 100px; 16 | margin: 20px; 17 | display: inline-block; 18 | } 19 | 20 | h1 { 21 | text-align: center; 22 | color: #fff; 23 | margin: 0 0 100px; 24 | font-size: 34px; 25 | font-weight: 100; 26 | text-transform: uppercase; 27 | background-color: #e43725; 28 | padding: 20px 0; 29 | } 30 | h1 b { 31 | font-weight: 700; 32 | } 33 | 34 | .made-with-love { 35 | margin-top: 20px; 36 | padding: 10px; 37 | font-size: 10px; 38 | font-family: arial; 39 | color: #fff; 40 | } 41 | .made-with-love i { 42 | font-style: normal; 43 | color: #F50057; 44 | font-size: 14px; 45 | position: relative; 46 | top: 2px; 47 | } 48 | .made-with-love a { 49 | color: #fff; 50 | text-decoration: none; 51 | } 52 | .made-with-love a:hover { 53 | text-decoration: underline; 54 | }/*# sourceMappingURL=style.css.map */ -------------------------------------------------------------------------------- /concept/preloaders/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["style.scss","style.css"],"names":[],"mappings":"AAAQ,0EAAA;AAER;EACI,SAAA;EACA,UAAA;ACAJ;;ADOA;EACI,mBAJQ;EAKR,kBAAA;EACA,iCAAA;ACJJ;;ADOA;EACI,YAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;ACJJ;;ADOA;EACI,kBAAA;EACA,WAjBQ;EAkBR,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,yBAAA;EACA,yBAAA;EACA,eAAA;ACJJ;ADMI;EACI,gBAAA;ACJR;;ADSA;EACI,gBAAA;EACA,aAAA;EACA,eAAA;EACA,kBAAA;EACA,WAAA;ACNJ;ADQI;EACI,kBAAA;EACA,cAAA;EACA,eAAA;EACA,kBAAA;EACA,QAAA;ACNR;ADSI;EACI,WAAA;EACA,qBAAA;ACPR;ADSQ;EACI,0BAAA;ACPZ","file":"style.css"} -------------------------------------------------------------------------------- /concept/preloaders/style.scss: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Comfortaa:400,700,300); 2 | 3 | *, html { 4 | margin: 0; 5 | padding: 0 6 | } 7 | 8 | //variables 9 | $baseColor: #e74c3c; 10 | $fontColor: #fff; 11 | 12 | body { 13 | background: $baseColor; 14 | text-align: center; 15 | font-family: 'Comfortaa', cursive; 16 | } 17 | 18 | svg { 19 | width: 100px; 20 | height: 100px; 21 | margin: 20px; 22 | display: inline-block; 23 | } 24 | 25 | h1 { 26 | text-align: center; 27 | color: $fontColor; 28 | margin: 0 0 100px; 29 | font-size: 34px; 30 | font-weight: 100; 31 | text-transform: uppercase; 32 | background-color: darken($baseColor, 5); 33 | padding: 20px 0; 34 | 35 | b { 36 | font-weight: 700; 37 | } 38 | } 39 | 40 | //follow me template 41 | .made-with-love { 42 | margin-top: 20px; 43 | padding: 10px; 44 | font-size: 10px; 45 | font-family: arial; 46 | color: #fff; 47 | 48 | i { 49 | font-style: normal; 50 | color: #F50057; 51 | font-size: 14px; 52 | position: relative; 53 | top: 2px; 54 | } 55 | 56 | a { 57 | color: #fff; 58 | text-decoration: none; 59 | 60 | &:hover { 61 | text-decoration: underline; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /custom-typings/waypoint.d.ts: -------------------------------------------------------------------------------- 1 | 2 | // npm install --save @types/waypoints 3 | 4 | /* 5 | declare module 'waypoint' { 6 | export class Waypoint { 7 | // Define the class properties and methods 8 | } 9 | } 10 | */ 11 | 12 | /* 13 | //declare global { 14 | declare module 'waypoint' { 15 | export class Waypoint { 16 | constructor(options: object); 17 | context: Element; 18 | element: Element; 19 | enabled: boolean; 20 | horizontal: boolean; 21 | offset: string | number; 22 | options: object; 23 | triggerPoint: number; 24 | group: object; 25 | contextHeight(): number; 26 | contextScrollTop(): number; 27 | destroy(): void; 28 | disable(): this; 29 | enable(): this; 30 | next(): this | string; 31 | previous(): this | string; 32 | queueTrigger(direction: string): void; 33 | trigger(args: any[]): void; 34 | static adapters: any[]; 35 | static defaults: object; 36 | static destroyAll(): void; 37 | static disableAll(): void; 38 | static enableAll(): void; 39 | static refreshAll(): void; 40 | static viewportHeight(): number; 41 | static viewportWidth(): number; 42 | } 43 | } 44 | 45 | 46 | 47 | */ -------------------------------------------------------------------------------- /dist/css/date-handler.css: -------------------------------------------------------------------------------- 1 | /*# sourceMappingURL=date-handler.css.map */ -------------------------------------------------------------------------------- /dist/css/date-handler.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":[],"names":[],"mappings":"","file":"date-handler.css"} -------------------------------------------------------------------------------- /dist/css/element-groups.css: -------------------------------------------------------------------------------- 1 | [wfu-element-name] { 2 | display: none; 3 | } 4 | 5 | [wfu-element-default] { 6 | display: block; 7 | }/*# sourceMappingURL=element-groups.css.map */ -------------------------------------------------------------------------------- /dist/css/element-groups.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-layout/element-groups.scss"],"names":[],"mappings":"AACA;EACI;;;AAGJ;EACI","file":"element-groups.css"} -------------------------------------------------------------------------------- /dist/css/encoded-email.css: -------------------------------------------------------------------------------- 1 | [wfu-email-encoded] { 2 | display: none; 3 | }/*# sourceMappingURL=encoded-email.css.map */ -------------------------------------------------------------------------------- /dist/css/encoded-email.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-html/encoded-email.scss"],"names":[],"mappings":"AAAA;EACI","file":"encoded-email.css"} -------------------------------------------------------------------------------- /dist/css/form-select.css: -------------------------------------------------------------------------------- 1 | /* Style the select element */ 2 | /* Style the options */ 3 | select[multiple][wfu-form-select-theme=blue] option:checked { 4 | background-color: #1967D2; 5 | color: white; 6 | } 7 | select[multiple][wfu-form-select-theme=blue-padded] option { 8 | padding: 5px 10px; 9 | color: black; 10 | } 11 | select[multiple][wfu-form-select-theme=blue-padded] option:checked { 12 | background-color: #1967D2; 13 | color: white; 14 | }/*# sourceMappingURL=form-select.css.map */ -------------------------------------------------------------------------------- /dist/css/form-select.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-form/form-select.scss"],"names":[],"mappings":"AACA;AAUA;AAOY;EACI;EACA;;AAQR;EACI;EACA;;AAEA;EACI;EACA","file":"form-select.css"} -------------------------------------------------------------------------------- /dist/css/github-gist.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-richtext/github-gist.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CI;EAEA;EACA;EACA;EAEA;EAEA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEE;EAEF;EACA;EACA;EACA;;;AAKD;AAAA;AAAA;AAWD;EAGE;EACA;EACA;EAGA;EAEA;EACA;EACA;AAEA;AAAA;AAAA;EAGA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EAEA;EACA;EACA;EACA;;;AAQA;EACI;EACA;;AAEJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAIJ;EACI;EAEA;EACA;EACA;EAEA;;AAMA;EACA;EACA;;AAGA;EACA;EACA;;AAIJ;EAEI;EAGA;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBI;;AAQJ;AAAA;AAAA;EAGI;;AAIJ;EACI;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOI;;AAGJ;AAAA;EAEI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;;AAGJ;AAAA;AAAA;AAAA;EAII;;AAGJ;AAAA;EAEI;;AAIJ;AAAA;EAEI;;AASJ;AAAA;EAEI;EACA;;AAGJ;AAAA;EAEI;EACA;;AAGJ;EACI;;AAIJ;EACI;;AAGJ;EACI;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAcI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAUI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASI","file":"github-gist.css"} -------------------------------------------------------------------------------- /dist/css/input-range-slider.css: -------------------------------------------------------------------------------- 1 | .slider { 2 | -webkit-appearance: none; 3 | width: 100%; 4 | height: 15px; 5 | border-radius: 5px; 6 | background: #d3d3d3; 7 | outline: none; 8 | opacity: 0.7; 9 | -webkit-transition: 0.2s; 10 | transition: opacity 0.2s; 11 | } 12 | 13 | .slider::-webkit-slider-thumb { 14 | -webkit-appearance: none; 15 | appearance: none; 16 | width: 25px; 17 | height: 25px; 18 | border-radius: 50%; 19 | background: darkblue; 20 | cursor: pointer; 21 | } 22 | 23 | .slider::-moz-range-thumb { 24 | width: 25px; 25 | height: 25px; 26 | border-radius: 50%; 27 | background: darkblue; 28 | cursor: pointer; 29 | }/*# sourceMappingURL=input-range-slider.css.map */ -------------------------------------------------------------------------------- /dist/css/input-range-slider.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/input-range-slider.scss"],"names":[],"mappings":"AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA","file":"input-range-slider.css"} -------------------------------------------------------------------------------- /dist/css/layouts.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Layout containers 3 | */ 4 | /* 5 | [wfu-layout-preload="hidden"] { 6 | 7 | display: none; 8 | 9 | } 10 | 11 | [wfu-layout-preload="invisible"] { 12 | 13 | visibility: hidden; 14 | 15 | } 16 | *//*# sourceMappingURL=layouts.css.map */ -------------------------------------------------------------------------------- /dist/css/layouts.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-html/layouts.scss"],"names":[],"mappings":"AAEA;AAAA;AAAA;AASA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA","file":"layouts.css"} -------------------------------------------------------------------------------- /dist/css/limit-items-v1.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-html/limit-items-v1.scss"],"names":[],"mappings":"AAEA;AAAA;AAAA;AAIA;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAMJ;EAEE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE","file":"limit-items-v1.css"} -------------------------------------------------------------------------------- /dist/css/markdown.css: -------------------------------------------------------------------------------- 1 | markdown { 2 | display: none; 3 | } 4 | 5 | [theme=default] { 6 | /* Table formatting */ 7 | /* Marker highlighting */ 8 | } 9 | [theme=default] table { 10 | border-spacing: 10px 10px; 11 | margin-bottom: 1rem; 12 | } 13 | [theme=default] th { 14 | padding: 2px 30px 2px 10px; 15 | margin-bottom: 5px; 16 | margin-right: 10px; 17 | } 18 | [theme=default] td { 19 | padding: 2px 30px 2px 10px; 20 | } 21 | [theme=default] mark { 22 | background-color: #ffffbb; 23 | padding: 0 0.15rem; 24 | margin: 0 -0.15rem; 25 | }/*# sourceMappingURL=markdown.css.map */ -------------------------------------------------------------------------------- /dist/css/markdown.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-html/markdown.scss"],"names":[],"mappings":"AAIA;EACE;;;AAKF;AAEI;AAoBA;;AAnBA;EAEI;EACA;;AAGJ;EACI;EACA;EAGA;;AAGJ;EACI;;AAKJ;EACI;EACA;EACA","file":"markdown.css"} -------------------------------------------------------------------------------- /dist/css/modal.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SCSS Limit collection list items, at breakpoint levels 3 | */ 4 | [wfu-modal-state=hidden] { 5 | display: none; 6 | } 7 | 8 | /* Do not apply the above rule if the element is directly within a parent with the attribute [wfu-modal-frame] *//*# sourceMappingURL=modal.css.map */ -------------------------------------------------------------------------------- /dist/css/modal.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-modal/modal.scss"],"names":[],"mappings":"AAEA;AAAA;AAAA;AAIA;EACE;;;AAGF","file":"modal.css"} -------------------------------------------------------------------------------- /dist/css/nested-list.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-richtext/nested-list.scss"],"names":[],"mappings":";AACA;AAAA;AAAA;AASI;EACI;;AAGJ;EACI;;;AAWJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAeJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;AAMJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;;AAaJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAUJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;AAMJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;;AAaJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAQJ;EACI;;AAEJ;EACI;;AAUJ;EACI;;AAEJ;EACI;;AAaR;AAAA;AAAA;AAIA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA","file":"nested-list.css"} -------------------------------------------------------------------------------- /dist/css/preload.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Preload 3 | * 4 | * Preload is an attribute that is used to hide elements until they are data-bound. 5 | * This is useful for hiding elements that are being loaded from a CMS or other 6 | * data source. 7 | * 8 | * The attribute can be set to "hidden" or "invisible". 9 | * It is removed after data-binding to make the element visible. 10 | 11 | * Usage: 12 | * 13 | *
No pre-loader, visible
14 | *
This will be hidden until data-bound
15 | *
This will be invisible until data-bound
16 | */ 17 | [wfu-preload=hidden] { 18 | display: none; 19 | } 20 | 21 | [wfu-preload=invisible] { 22 | visibility: hidden; 23 | }/*# sourceMappingURL=preload.css.map */ -------------------------------------------------------------------------------- /dist/css/preload.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-core/preload.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;EAEI;;;AAMJ;EAEI","file":"preload.css"} -------------------------------------------------------------------------------- /dist/css/style.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Comfortaa:400,700,300); 2 | *, html { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | body { 8 | background: #e74c3c; 9 | text-align: center; 10 | font-family: "Comfortaa", cursive; 11 | } 12 | 13 | svg { 14 | width: 100px; 15 | height: 100px; 16 | margin: 20px; 17 | display: inline-block; 18 | } 19 | 20 | h1 { 21 | text-align: center; 22 | color: #fff; 23 | margin: 0 0 100px; 24 | font-size: 34px; 25 | font-weight: 100; 26 | text-transform: uppercase; 27 | background-color: #e43725; 28 | padding: 20px 0; 29 | } 30 | h1 b { 31 | font-weight: 700; 32 | } 33 | 34 | .made-with-love { 35 | margin-top: 20px; 36 | padding: 10px; 37 | font-size: 10px; 38 | font-family: arial; 39 | color: #fff; 40 | } 41 | .made-with-love i { 42 | font-style: normal; 43 | color: #F50057; 44 | font-size: 14px; 45 | position: relative; 46 | top: 2px; 47 | } 48 | .made-with-love a { 49 | color: #fff; 50 | text-decoration: none; 51 | } 52 | .made-with-love a:hover { 53 | text-decoration: underline; 54 | }/*# sourceMappingURL=style.css.map */ -------------------------------------------------------------------------------- /dist/css/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../concept/preloaders/style.scss"],"names":[],"mappings":"AAAQ;AAER;EACI;EACA;;;AAOJ;EACI,YAJQ;EAKR;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA,OAjBQ;EAkBR;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAKR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI","file":"style.css"} -------------------------------------------------------------------------------- /dist/css/svg embeds.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SA5 SVG Embeds 3 | */ 4 | [wfu-richtext-embed-svg] .w-embed:has(> svg) { 5 | padding: 20px; 6 | background-color: white; 7 | } 8 | [wfu-richtext-embed-svg] .w-embed > svg { 9 | width: 100%; 10 | height: auto; 11 | }/*# sourceMappingURL=svg embeds.css.map */ -------------------------------------------------------------------------------- /dist/css/svg embeds.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-richtext/svg%20embeds.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAOI;EACI;EACA;;AAEJ;EACI;EACA","file":"svg%20embeds.css"} -------------------------------------------------------------------------------- /dist/css/svg-embeds.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SA5 SVG Embeds 3 | */ 4 | [wfu-richtext-embed-svg] .w-embed:has(> svg) { 5 | padding: 20px; 6 | background-color: white; 7 | } 8 | [wfu-richtext-embed-svg] .w-embed > svg { 9 | width: 100%; 10 | height: auto; 11 | }/*# sourceMappingURL=svg-embeds.css.map */ -------------------------------------------------------------------------------- /dist/css/svg-embeds.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-richtext/svg-embeds.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAOI;EACI;EACA;;AAEJ;EACI;EACA","file":"svg-embeds.css"} -------------------------------------------------------------------------------- /dist/css/util.css: -------------------------------------------------------------------------------- 1 | /* 2 | * General SCSS for Sygnal Webflow Util library 3 | */ 4 | .hide { 5 | display: none; 6 | }/*# sourceMappingURL=util.css.map */ -------------------------------------------------------------------------------- /dist/css/util.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/util.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;EACI","file":"util.css"} -------------------------------------------------------------------------------- /dist/css/webflow-accordion.css: -------------------------------------------------------------------------------- 1 | [filter-data] { 2 | /* display: none;*/ 3 | } 4 | 5 | [wfu-ui-accordion=header] { 6 | cursor: pointer; 7 | transition: background-color 0.2s linear; 8 | } 9 | 10 | [wfu-ui-accordion=content] { 11 | /* .accordion-content { */ 12 | max-height: 0; 13 | overflow: hidden; 14 | transition: max-height 0.2s ease-in-out; 15 | } 16 | 17 | @media screen and (min-width: 568px) { 18 | [wfu-ui-accordion=content] { 19 | /* .accordion-content { */ 20 | max-height: none; 21 | overflow: auto; 22 | } 23 | }/*# sourceMappingURL=webflow-accordion.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-accordion.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-accordion.scss"],"names":[],"mappings":"AACA;AACA;;;AAGA;EACI;EACA;;;AAGJ;AACI;EACA;EACA;EACA;;;AAGJ;EACI;AACA;IACA;IACA","file":"webflow-accordion.css"} -------------------------------------------------------------------------------- /dist/css/webflow-data.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SCSS for Sygnal Webflow Util HTML library 3 | */ 4 | /** 5 | * @use: This is the modern replacement for @import. 6 | * Instead of dumping all the imported styles into the global scope, @use treats each imported file as a 7 | * separate module with its own private scope. This means that variables, mixins, and functions from 8 | * the imported file have to be accessed with a namespace based on the filename. 9 | * This helps to prevent naming conflicts and makes the code easier to understand. 10 | */ 11 | /* 12 | 13 | // Temporarily hide until decoded 14 | [wfu-bind] { 15 | // display: none; 16 | visibility: hidden; 17 | } 18 | 19 | // Temporarily hide until decoded 20 | [wfu-bind-content] { 21 | // display: none; 22 | visibility: hidden; 23 | } 24 | 25 | */ 26 | /** 27 | * Preload 28 | * 29 | * Preload is an attribute that is used to hide elements until they are data-bound. 30 | * This is useful for hiding elements that are being loaded from a CMS or other 31 | * data source. 32 | * 33 | * The attribute can be set to "hidden" or "invisible". 34 | * It is removed after data-binding to make the element visible. 35 | 36 | * Usage: 37 | * 38 | *
No pre-loader, visible
39 | *
This will be hidden until data-bound
40 | *
This will be invisible until data-bound
41 | */ 42 | [wfu-preload=hidden] { 43 | display: none; 44 | } 45 | 46 | [wfu-preload=invisible] { 47 | visibility: hidden; 48 | } 49 | 50 | /* 51 | // Temporarily hide until data-bound 52 | [wfu-preload=hidden] { 53 | display: none; 54 | } 55 | 56 | // Temporarily make invisible until data-bound 57 | // Will take the appropriate space 58 | [wfu-preload=invisible] { 59 | visibility: hidden; 60 | } 61 | *//*# sourceMappingURL=webflow-data.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-data.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-data.scss","../../src/webflow-core/preload.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AClBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;EAEI;;;AAMJ;EAEI;;;ADSJ;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"webflow-data.css"} -------------------------------------------------------------------------------- /dist/css/webflow-demo.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SCSS for Sygnal Webflow Util Demo library 3 | *//*# sourceMappingURL=webflow-demo.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-demo.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-demo.scss"],"names":[],"mappings":"AACA;AAAA;AAAA","file":"webflow-demo.css"} -------------------------------------------------------------------------------- /dist/css/webflow-detect.css: -------------------------------------------------------------------------------- 1 | /*# sourceMappingURL=webflow-detect.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-detect.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":[],"names":[],"mappings":"","file":"webflow-detect.css"} -------------------------------------------------------------------------------- /dist/css/webflow-elements.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Preload 3 | * 4 | * Preload is an attribute that is used to hide elements until they are data-bound. 5 | * This is useful for hiding elements that are being loaded from a CMS or other 6 | * data source. 7 | * 8 | * The attribute can be set to "hidden" or "invisible". 9 | * It is removed after data-binding to make the element visible. 10 | 11 | * Usage: 12 | * 13 | *
No pre-loader, visible
14 | *
This will be hidden until data-bound
15 | *
This will be invisible until data-bound
16 | */ 17 | [wfu-preload=hidden] { 18 | display: none; 19 | } 20 | 21 | [wfu-preload=invisible] { 22 | visibility: hidden; 23 | } 24 | 25 | iframe + .w-lightbox-caption { 26 | margin-bottom: -50px; 27 | }/*# sourceMappingURL=webflow-elements.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-elements.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-core/preload.scss","../../src/css/webflow-elements.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;EAEI;;;AAMJ;EAEI;;;ACtBJ;EAEI","file":"webflow-elements.css"} -------------------------------------------------------------------------------- /dist/css/webflow-embed.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | /** 3 | * SCSS for SA5 Embeds 4 | */ 5 | /** 6 | * @use: This is the modern replacement for @import. 7 | * Instead of dumping all the imported styles into the global scope, @use treats each imported file as a 8 | * separate module with its own private scope. This means that variables, mixins, and functions from 9 | * the imported file have to be accessed with a namespace based on the filename. 10 | * This helps to prevent naming conflicts and makes the code easier to understand. 11 | */ 12 | /* 13 | * HTML Table Themes 14 | */ 15 | [wfu-theme=default] table { 16 | border-collapse: collapse; 17 | margin-top: 10px; 18 | } 19 | [wfu-theme=default] table tr td { 20 | padding: 0.2rem 1rem; 21 | border: 1px solid white; 22 | vertical-align: top; 23 | margin-bottom: 5px; 24 | } 25 | [wfu-theme=default] table tr td p { 26 | line-height: 22px; 27 | font-size: 14px; 28 | } 29 | [wfu-theme=default] table tr td ul { 30 | padding-left: 5px; 31 | padding-top: 10px; 32 | padding-bottom: 0.2rem; 33 | } 34 | [wfu-theme=default] table tr td ul li::marker { 35 | content: "⁃"; 36 | color: #2e9dff; 37 | } 38 | [wfu-theme=default] table tr td ul li { 39 | line-height: 22px; 40 | font-size: 14px; 41 | padding-left: 1ch; 42 | } 43 | [wfu-theme=default] table tr:nth-child(1) { 44 | font-weight: 800; 45 | background-color: rgba(255, 255, 255, 0.2); 46 | }/*# sourceMappingURL=webflow-embed.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-embed.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-embed.scss"],"names":[],"mappings":";AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA;AAAA;AAAA;AAMI;EACE;EACA;;AAGE;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAUF;EAEE;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EAEI;EACA;EACA;;AAUV;EACE;EACA","file":"webflow-embed.css"} -------------------------------------------------------------------------------- /dist/css/webflow-fixup.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Webflow fixups 3 | */ 4 | /* Editor bugs */ 5 | .w-editor-bem-EditorFallback { 6 | display: none !important; 7 | } 8 | 9 | .w-editor-bem-EditorFallback-mobile { 10 | display: none !important; 11 | } 12 | 13 | /* 14 | .w-editor-publish-controls .w-editor-publish { 15 | display: none !important; 16 | } 17 | *//*# sourceMappingURL=webflow-fixup.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-fixup.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-fixup.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;AAKA;EAEI;;;AAEJ;EACI;;;AAOJ;AAAA;AAAA;AAAA;AAAA","file":"webflow-fixup.css"} -------------------------------------------------------------------------------- /dist/css/webflow-form.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SCSS for Sygnal Webflow Util Demo library 3 | */ 4 | /* Style the select element */ 5 | /* Style the options */ 6 | select[multiple][wfu-form-select-theme=blue] option:checked { 7 | background-color: #1967D2; 8 | color: white; 9 | } 10 | select[multiple][wfu-form-select-theme=blue-padded] option { 11 | padding: 5px 10px; 12 | color: black; 13 | } 14 | select[multiple][wfu-form-select-theme=blue-padded] option:checked { 15 | background-color: #1967D2; 16 | color: white; 17 | }/*# sourceMappingURL=webflow-form.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-form.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-form.scss","../../src/webflow-form/form-select.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;ACAA;AAUA;AAOY;EACI;EACA;;AAQR;EACI;EACA;;AAEA;EACI;EACA","file":"webflow-form.css"} -------------------------------------------------------------------------------- /dist/css/webflow-format.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Formatting CSS for Sygnal Webflow Util library 3 | */ 4 | /* Formatting CSVs 5 | Apply the wfu-csv attr to a collection list for format its contents as CSV 6 | NOTE: This CSS chunk can be implemented copied to an HTML embed, if you want to see the layout directly in the designer. 7 | */ 8 | [wfu-csv] .w-dyn-item { 9 | display: inline; 10 | } 11 | 12 | [wfu-csv] .w-dyn-item div, 13 | [wfu-csv] .w-dyn-item p { 14 | display: inline; 15 | } 16 | 17 | [wfu-csv] .w-dyn-item:not(:last-child) div::after, 18 | [wfu-csv] .w-dyn-item:not(:last-child) p::after { 19 | content: ", "; 20 | }/*# sourceMappingURL=webflow-format.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-format.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-format.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAIA;EACI;;;AAEJ;AAAA;EAEI;;;AAEJ;AAAA;EAEI","file":"webflow-format.css"} -------------------------------------------------------------------------------- /dist/css/webflow-gallery.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SCSS for SA5 Gallery library 3 | */ 4 | /** 5 | * Preload 6 | * 7 | * Preload is an attribute that is used to hide elements until they are data-bound. 8 | * This is useful for hiding elements that are being loaded from a CMS or other 9 | * data source. 10 | * 11 | * The attribute can be set to "hidden" or "invisible". 12 | * It is removed after data-binding to make the element visible. 13 | 14 | * Usage: 15 | * 16 | *
No pre-loader, visible
17 | *
This will be hidden until data-bound
18 | *
This will be invisible until data-bound
19 | */ 20 | [wfu-preload=hidden] { 21 | display: none; 22 | } 23 | 24 | [wfu-preload=invisible] { 25 | visibility: hidden; 26 | }/*# sourceMappingURL=webflow-gallery.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-gallery.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-gallery.scss","../../src/webflow-core/preload.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;EAEI;;;AAMJ;EAEI","file":"webflow-gallery.css"} -------------------------------------------------------------------------------- /dist/css/webflow-kiosk.css: -------------------------------------------------------------------------------- 1 | /** 2 | * SCSS for SA5 Kiosk library 3 | *//*# sourceMappingURL=webflow-kiosk.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-kiosk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-kiosk.scss"],"names":[],"mappings":"AACA;AAAA;AAAA","file":"webflow-kiosk.css"} -------------------------------------------------------------------------------- /dist/css/webflow-membership.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SCSS for Sygnal Webflow Util Track library 3 | */ 4 | [wfu-show-logged-in] { 5 | display: none; 6 | } 7 | 8 | [wfu-hide-logged-in] { 9 | display: none; 10 | } 11 | 12 | [wfu-login-button] { 13 | cursor: pointer; 14 | }/*# sourceMappingURL=webflow-membership.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-membership.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-membership.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAMA;EACI;;;AAEJ;EACI;;;AAIJ;EACI","file":"webflow-membership.css"} -------------------------------------------------------------------------------- /dist/css/webflow-modal.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Webflow modal 3 | */ 4 | /** 5 | * SCSS Limit collection list items, at breakpoint levels 6 | */ 7 | [wfu-modal-state=hidden] { 8 | display: none; 9 | } 10 | 11 | /* Do not apply the above rule if the element is directly within a parent with the attribute [wfu-modal-frame] */ 12 | [wfu-modal-trigger] { 13 | display: none !important; 14 | }/*# sourceMappingURL=webflow-modal.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-modal.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-modal.scss","../../src/webflow-modal/modal.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;ACCA;AAAA;AAAA;AAIA;EACE;;;AAGF;ADAA;EAEI","file":"webflow-modal.css"} -------------------------------------------------------------------------------- /dist/css/webflow-richtext.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/webflow-richtext/nested-list.scss","../../src/webflow-richtext/svg-embeds.scss","../../src/webflow-richtext/github-gist.scss"],"names":[],"mappings":";AACA;AAAA;AAAA;AASI;EACI;;AAGJ;EACI;;;AAWJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAeJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;AAMJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;;AAaJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAUJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;AAMJ;EACI;;AAEJ;EACI;EACA;;AAGJ;EACI;;;AAaJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAQJ;EACI;;AAEJ;EACI;;AAUJ;EACI;;AAEJ;EACI;;AAaR;AAAA;AAAA;AAIA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AC1NA;AAAA;AAAA;AAOI;EACI;EACA;;AAEJ;EACI;EACA;;;ACbR;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CI;EAEA;EACA;EACA;EAEA;EAEA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEE;EAEF;EACA;EACA;EACA;;;AAKD;AAAA;AAAA;AAWD;EAGE;EACA;EACA;EAGA;EAEA;EACA;EACA;AAEA;AAAA;AAAA;EAGA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EAEA;EACA;EACA;EACA;;;AAQA;EACI;EACA;;AAEJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAIJ;EACI;EAEA;EACA;EACA;EAEA;;AAMA;EACA;EACA;;AAGA;EACA;EACA;;AAIJ;EAEI;EAGA;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBI;;AAQJ;AAAA;AAAA;EAGI;;AAIJ;EACI;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOI;;AAGJ;AAAA;EAEI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;;AAGJ;AAAA;AAAA;AAAA;EAII;;AAGJ;AAAA;EAEI;;AAIJ;AAAA;EAEI;;AASJ;AAAA;EAEI;EACA;;AAGJ;AAAA;EAEI;EACA;;AAGJ;EACI;;AAIJ;EACI;;AAGJ;EACI;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAcI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAUI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASI","file":"webflow-richtext.css"} -------------------------------------------------------------------------------- /dist/css/webflow-track.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SCSS for Sygnal Webflow Util Track library 3 | */ 4 | [wfu-show-tracked] { 5 | display: none; 6 | } 7 | 8 | [wfu-hide-tracked] { 9 | display: none; 10 | }/*# sourceMappingURL=webflow-track.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-track.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-track.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAMA;EACI;;;AAEJ;EACI","file":"webflow-track.css"} -------------------------------------------------------------------------------- /dist/css/webflow-ui.css: -------------------------------------------------------------------------------- 1 | /* 2 | * CSS for Sygnal Webflow Util UI component library 3 | */ 4 | /* Ratings Component */ 5 | .wfu-rating-stars { 6 | position: relative; 7 | display: inline-block; 8 | white-space: nowrap; 9 | } 10 | 11 | .wfu-rating-stars svg { 12 | width: 20%; 13 | fill: gold; 14 | } 15 | 16 | .wfu-rating-stars-cover { 17 | background: white; 18 | height: 100%; 19 | overflow: hidden; 20 | mix-blend-mode: color; 21 | position: absolute; 22 | top: 0; 23 | right: 0; 24 | width: 100%; 25 | }/*# sourceMappingURL=webflow-ui.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-ui.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-ui.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;AAEA;EACI;EACA;EACA;;;AAGA;EACI;EACA;;;AAGR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"webflow-ui.css"} -------------------------------------------------------------------------------- /dist/css/webflow-util.css: -------------------------------------------------------------------------------- 1 | /* 2 | * General CSS for Sygnal Webflow Util library 3 | */ 4 | /* Initially hide images that are tagged for SVG-inlining. 5 | This prevents them from appearing (blck) before the CSS color-rules can be applied. */ 6 | .wfu-svg { 7 | visibility: hidden; 8 | } 9 | 10 | .wfu-json-string { 11 | color: #008000; 12 | } 13 | 14 | .wfu-json-number { 15 | color: #FF0000; 16 | } 17 | 18 | .wfu-json-boolean { 19 | color: #FF8C00; 20 | } 21 | 22 | .wfu-json-null { 23 | color: #908080; 24 | } 25 | 26 | .wfu-json-key { 27 | color: #1A1A1A; 28 | }/*# sourceMappingURL=webflow-util.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-util.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-util.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAIA;AAAA;AAEA;EACI;;;AAMJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI","file":"webflow-util.css"} -------------------------------------------------------------------------------- /dist/css/webflow-video.css: -------------------------------------------------------------------------------- 1 | /* 2 | * webflow-video 3 | */ 4 | [wfu-youtube-norel] { 5 | display: inline-block; 6 | position: relative; 7 | } 8 | 9 | [wfu-youtube-norel].sa5-video-paused::after { 10 | content: ""; 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | bottom: 0; 15 | right: 0; 16 | cursor: pointer; 17 | background-color: black; 18 | background-repeat: no-repeat; 19 | background-position: center; 20 | background-size: 40px 40px; 21 | background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEiIHdpZHRoPSIxNzA2LjY2NyIgaGVpZ2h0PSIxNzA2LjY2NyIgdmlld0JveD0iMCAwIDEyODAgMTI4MCI+PHBhdGggZD0iTTE1Ny42MzUgMi45ODRMMTI2MC45NzkgNjQwIDE1Ny42MzUgMTI3Ny4wMTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+); 22 | } 23 | 24 | [wfu-youtube-norel].sa5-video-ended::after { 25 | content: ""; 26 | position: absolute; 27 | top: 0; 28 | left: 0; 29 | bottom: 0; 30 | right: 0; 31 | cursor: pointer; 32 | background-color: black; 33 | background-repeat: no-repeat; 34 | background-position: center; 35 | background-size: 64px 64px; 36 | background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgNTEwIDUxMCI+PHBhdGggZD0iTTI1NSAxMDJWMEwxMjcuNSAxMjcuNSAyNTUgMjU1VjE1M2M4NC4xNSAwIDE1MyA2OC44NSAxNTMgMTUzcy02OC44NSAxNTMtMTUzIDE1My0xNTMtNjguODUtMTUzLTE1M0g1MWMwIDExMi4yIDkxLjggMjA0IDIwNCAyMDRzMjA0LTkxLjggMjA0LTIwNC05MS44LTIwNC0yMDQtMjA0eiIgZmlsbD0iI0ZGRiIvPjwvc3ZnPg==); 37 | }/*# sourceMappingURL=webflow-video.css.map */ -------------------------------------------------------------------------------- /dist/css/webflow-video.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/css/webflow-video.scss"],"names":[],"mappings":"AACA;AAAA;AAAA;AAKA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"webflow-video.css"} -------------------------------------------------------------------------------- /dist/storage-utils.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/storage-utils.ts 3 | var StorageUtils = class { 4 | static get localStorageAvailable() { 5 | try { 6 | const test = "__test__"; 7 | localStorage.setItem(test, test); 8 | localStorage.removeItem(test); 9 | return true; 10 | } catch { 11 | return false; 12 | } 13 | } 14 | static get sessionStorageAvailable() { 15 | try { 16 | const test = "__test__"; 17 | sessionStorage.setItem(test, test); 18 | sessionStorage.removeItem(test); 19 | return true; 20 | } catch { 21 | return false; 22 | } 23 | } 24 | static get cookiesAvailable() { 25 | try { 26 | const test = "__test__=1"; 27 | document.cookie = test + "; path=/"; 28 | const cookies = document.cookie; 29 | const available = cookies.includes("__test__=1"); 30 | document.cookie = "__test__=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 31 | return available; 32 | } catch { 33 | return false; 34 | } 35 | } 36 | }; 37 | })(); 38 | //# sourceMappingURL=storage-utils.js.map 39 | -------------------------------------------------------------------------------- /dist/storage-utils.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../src/storage-utils.ts"], 4 | "sourcesContent": ["\n/*\n * SA5\n * \n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * Storage Utilities\n */\n\n\n\nexport class StorageUtils { \n\n static get localStorageAvailable(): boolean {\n try {\n const test = \"__test__\";\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n static get sessionStorageAvailable(): boolean {\n try {\n const test = \"__test__\";\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n return true;\n } catch {\n return false;\n }\n }\n\n static get cookiesAvailable(): boolean {\n try {\n const test = \"__test__=1\";\n document.cookie = test + \"; path=/\";\n const cookies = document.cookie;\n const available = cookies.includes(\"__test__=1\");\n document.cookie = \"__test__=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;\";\n return available;\n } catch {\n return false;\n }\n }\n\n}\n\n\n"], 5 | "mappings": ";;AAYO,MAAM,eAAN,MAAmB;AAAA,IAEtB,WAAW,wBAAiC;AACxC,UAAI;AACA,cAAM,OAAO;AACb,qBAAa,QAAQ,MAAM,IAAI;AAC/B,qBAAa,WAAW,IAAI;AAC5B,eAAO;AAAA,MACX,QAAE;AACE,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IAEA,WAAW,0BAAmC;AAC1C,UAAI;AACA,cAAM,OAAO;AACb,uBAAe,QAAQ,MAAM,IAAI;AACjC,uBAAe,WAAW,IAAI;AAC9B,eAAO;AAAA,MACX,QAAE;AACE,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IAEA,WAAW,mBAA4B;AACnC,UAAI;AACA,cAAM,OAAO;AACb,iBAAS,SAAS,OAAO;AACzB,cAAM,UAAU,SAAS;AACzB,cAAM,YAAY,QAAQ,SAAS,YAAY;AAC/C,iBAAS,SAAS;AAClB,eAAO;AAAA,MACX,QAAE;AACE,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EAEJ;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/utils/utm-link.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/utils/utm-link.ts 3 | var Sa5UtmLink = class { 4 | constructor(link) { 5 | this.elem = link; 6 | } 7 | init() { 8 | this.elem.href = Sa5UtmLink.applyUTMParametersFromAttrs(this.elem.href, this.elem); 9 | } 10 | static applyUTMParametersFromAttrs(urlString, utmElem) { 11 | const url = new URL(urlString); 12 | const params = url.searchParams; 13 | const utmAttributes = { 14 | "wfu-link-utm-source": "utm_source", 15 | "wfu-link-utm-medium": "utm_medium", 16 | "wfu-link-utm-campaign": "utm_campaign", 17 | "wfu-link-utm-content": "utm_content" 18 | }; 19 | for (const [customAttr, utmParam] of Object.entries(utmAttributes)) { 20 | const attrValue = utmElem.getAttribute(customAttr); 21 | if (attrValue) { 22 | params.set(utmParam, encodeURIComponent(attrValue)); 23 | } 24 | } 25 | return url.toString(); 26 | } 27 | }; 28 | })(); 29 | //# sourceMappingURL=utm-link.js.map 30 | -------------------------------------------------------------------------------- /dist/utils/utm-link.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../src/utils/utm-link.ts"], 4 | "sourcesContent": ["/*\n * SA5 \n * UTM Link \n */ \n\nexport class Sa5UtmLink {\n\n elem: HTMLAnchorElement;\n\n constructor(link: HTMLAnchorElement) {\n this.elem = link;\n }\n \n init() {\n\n this.elem.href = Sa5UtmLink.applyUTMParametersFromAttrs(this.elem.href, this.elem);\n \n }\n\n static applyUTMParametersFromAttrs(urlString: string, utmElem: HTMLElement): string {\n const url = new URL(urlString);\n const params = url.searchParams;\n \n // Custom attribute names\n const utmAttributes = {\n 'wfu-link-utm-source': 'utm_source',\n 'wfu-link-utm-medium': 'utm_medium',\n 'wfu-link-utm-campaign': 'utm_campaign',\n 'wfu-link-utm-content': 'utm_content'\n };\n \n // Update UTM parameters if custom attributes exist\n for (const [customAttr, utmParam] of Object.entries(utmAttributes)) {\n const attrValue = utmElem.getAttribute(customAttr);\n if (attrValue) {\n params.set(utmParam, encodeURIComponent(attrValue));\n }\n }\n \n // Update the anchor element's href with the new query string\n return url.toString();\n }\n}\n"], 5 | "mappings": ";;AAKO,MAAM,aAAN,MAAiB;AAAA,IAIpB,YAAY,MAAyB;AACjC,WAAK,OAAO;AAAA,IAChB;AAAA,IAEA,OAAO;AAEH,WAAK,KAAK,OAAO,WAAW,4BAA4B,KAAK,KAAK,MAAM,KAAK,IAAI;AAAA,IAErF;AAAA,IAEA,OAAO,4BAA4B,WAAmB,SAA8B;AAChF,YAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,YAAM,SAAS,IAAI;AAGnB,YAAM,gBAAgB;AAAA,QACpB,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,QACvB,yBAAyB;AAAA,QACzB,wBAAwB;AAAA,MAC1B;AAGA,iBAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAClE,cAAM,YAAY,QAAQ,aAAa,UAAU;AACjD,YAAI,WAAW;AACb,iBAAO,IAAI,UAAU,mBAAmB,SAAS,CAAC;AAAA,QACpD;AAAA,MACF;AAGA,aAAO,IAAI,SAAS;AAAA,IACtB;AAAA,EACN;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/version.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/version.ts 3 | var VERSION = "5.8.1"; 4 | })(); 5 | //# sourceMappingURL=version.js.map 6 | -------------------------------------------------------------------------------- /dist/version.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../src/version.ts"], 4 | "sourcesContent": ["\nexport const VERSION = '5.8.1'; // Update this manually on each release\n\n\n"], 5 | "mappings": ";;AACO,MAAM,UAAU;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-commerce/webflow.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | })(); 3 | //# sourceMappingURL=webflow.js.map 4 | -------------------------------------------------------------------------------- /dist/webflow-commerce/webflow.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-core/IDeckNavigation.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | })(); 3 | //# sourceMappingURL=IDeckNavigation.js.map 4 | -------------------------------------------------------------------------------- /dist/webflow-core/IDeckNavigation.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-core/scripts.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-core/scripts.ts 3 | var Sa5Scripts = class { 4 | constructor() { 5 | } 6 | install(src, type = null, async = false, defer = false, installPos = "head" /* head */) { 7 | var script = document.createElement("script"); 8 | script.src = src; 9 | script.type = type; 10 | script.async = async; 11 | script.defer = defer; 12 | console.log("installing script", script); 13 | switch (installPos) { 14 | case "headStart" /* headStart */: 15 | document.head.insertBefore(script, document.head.firstChild); 16 | break; 17 | case "head" /* head */: 18 | case "headEnd" /* headEnd */: 19 | document.head.appendChild(script); 20 | break; 21 | case "bodyStart" /* bodyStart */: 22 | document.body.insertBefore(script, document.body.firstChild); 23 | break; 24 | case "body" /* body */: 25 | case "bodyEnd" /* bodyEnd */: 26 | document.body.appendChild(script); 27 | break; 28 | } 29 | } 30 | }; 31 | })(); 32 | //# sourceMappingURL=scripts.js.map 33 | -------------------------------------------------------------------------------- /dist/webflow-core/webflow-editor.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-core/webflow-editor.ts 3 | var Sa5Editor = class { 4 | get isEditorMode() { 5 | return document.documentElement.getAttribute("data-wf-mode") === "editor"; 6 | } 7 | detectEditorMode() { 8 | if (document.title.startsWith("Editor:")) { 9 | console.debug("Editor mode"); 10 | document.documentElement.setAttribute("data-wf-mode", "editor"); 11 | } else { 12 | console.debug("NOT Editor mode"); 13 | document.documentElement.removeAttribute("data-wf-mode"); 14 | } 15 | } 16 | constructor(config = null) { 17 | config = config || {}; 18 | this.config = config; 19 | this.init(); 20 | } 21 | init() { 22 | let titleElement = document.getElementsByTagName("title")[0]; 23 | let observer = new MutationObserver((mutations) => { 24 | this.detectEditorMode(); 25 | }); 26 | observer.observe(titleElement, { childList: true }); 27 | } 28 | }; 29 | })(); 30 | //# sourceMappingURL=webflow-editor.js.map 31 | -------------------------------------------------------------------------------- /dist/webflow-cro/source.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-cro/source.ts 3 | var Sa5Source = class { 4 | constructor(storageType = "session") { 5 | this.storageKey = "sa5-cro_data"; 6 | this.storage = storageType === "local" ? localStorage : sessionStorage; 7 | this.data = this.load() || {}; 8 | } 9 | init() { 10 | } 11 | setSourceParam(key, value) { 12 | this.data[key] = value; 13 | this.save(); 14 | } 15 | getSourceParam(key) { 16 | return this.data[key]; 17 | } 18 | save() { 19 | console.log("save"); 20 | this.storage.setItem(this.storageKey, JSON.stringify(this.data)); 21 | } 22 | load() { 23 | const storedData = this.storage.getItem(this.storageKey); 24 | return storedData ? JSON.parse(storedData) : {}; 25 | } 26 | exists() { 27 | return this.storage.getItem(this.storageKey) !== null; 28 | } 29 | clear() { 30 | this.storage.removeItem(this.storageKey); 31 | this.data = {}; 32 | } 33 | }; 34 | })(); 35 | //# sourceMappingURL=source.js.map 36 | -------------------------------------------------------------------------------- /dist/webflow-data-collectionlist.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-data-collectionlist.ts 3 | var getDataSource = function(name) { 4 | let data = document.querySelectorAll('*[data="' + name + '"]'); 5 | let items = []; 6 | data.forEach((elem) => { 7 | items.push(elem.textContent || ""); 8 | }); 9 | let json = "[" + items.join() + "]"; 10 | return JSON.parse(json); 11 | }; 12 | })(); 13 | //# sourceMappingURL=webflow-data-collectionlist.js.map 14 | -------------------------------------------------------------------------------- /dist/webflow-data-collectionlist.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../src/webflow-data-collectionlist.ts"], 4 | "sourcesContent": ["\n/*\n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * Designed to aggregate JSON excerpts produced by a Webflow Collection List\n * into a single JSON datasource, for use in other places, such as Form Select data-binding.\n */\n\n// Amalgamates from internally tagged DIVs\nexport var getDataSource = function (name) {\n\n // Aggregate JSON Data\n let data = document.querySelectorAll('*[data=\"' + name + '\"]');\n\n let items: string[] = []; // place to store the pairs\n data.forEach((elem) => { //loop over the keys\n items.push(elem.textContent || \"\");\n })\n\n let json = '[' + items.join() + ']';\n\n return JSON.parse(json);\n}\n\n"], 5 | "mappings": ";;AAUO,MAAI,gBAAgB,SAAU,MAAM;AAGvC,QAAI,OAAO,SAAS,iBAAiB,aAAa,OAAO,IAAI;AAE7D,QAAI,QAAkB,CAAC;AACvB,SAAK,QAAQ,CAAC,SAAS;AACnB,YAAM,KAAK,KAAK,eAAe,EAAE;AAAA,IACrC,CAAC;AAED,QAAI,OAAO,MAAM,MAAM,KAAK,IAAI;AAEhC,WAAO,KAAK,MAAM,IAAI;AAAA,EAC1B;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-data/database.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-data/database.ts 3 | var Database = class { 4 | constructor() { 5 | this.data = /* @__PURE__ */ new Map(); 6 | this.normalizeKey = function(key) { 7 | return key.toLowerCase(); 8 | }; 9 | this.add = function(key, json) { 10 | key = this.normalizeKey(key); 11 | if (typeof json == "string") { 12 | json = JSON.parse(json); 13 | } 14 | this.data.set(key, json); 15 | }; 16 | this.getData = function(key) { 17 | key = this.normalizeKey(key); 18 | return this.data.get(key); 19 | }; 20 | this.getDataSource = this.getData; 21 | this.getCountOfRecords = function(dataSourceName) { 22 | return this.getDataSource(dataSourceName).length; 23 | }; 24 | this.getDictionary = function(dataSourceName, keyField, valueField) { 25 | var dict = /* @__PURE__ */ new Map(); 26 | var ds = this.getDataSource(dataSourceName); 27 | for (var i = 0; i < ds.length; i++) { 28 | dict.set( 29 | ds[i][keyField], 30 | ds[i][valueField] 31 | ); 32 | } 33 | console.log(dict); 34 | return dict; 35 | }; 36 | this.getDictionaryFromRow = function(dataSourceName, row) { 37 | var dict = /* @__PURE__ */ new Map(); 38 | var ds = this.getDataSource(dataSourceName); 39 | for (const v in ds[row]) { 40 | dict.set( 41 | v, 42 | ds[row][v] 43 | ); 44 | } 45 | return dict; 46 | }; 47 | } 48 | }; 49 | })(); 50 | //# sourceMappingURL=database.js.map 51 | -------------------------------------------------------------------------------- /dist/webflow-data/github-data.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-data/github-data.ts 3 | var getGithubRepoTagsUrl = function(userOrg, repo) { 4 | return `https://api.github.com/repos/${userOrg}/${repo}/tags`; 5 | }; 6 | var getGithubRepoTags = function(userOrg, repo) { 7 | const url = getGithubRepoTagsUrl(userOrg, repo); 8 | return new Promise((resolve, reject) => { 9 | const url2 = getGithubRepoTagsUrl(userOrg, repo); 10 | fetch(url2).then((response) => response.json()).then((data) => resolve(data)).catch((error) => console.error("Error:", error)); 11 | }); 12 | }; 13 | var getGithubRepoTagLatest = function(userOrg, repo) { 14 | return new Promise((resolve, reject) => { 15 | getGithubRepoTags(userOrg, repo).then((res) => { 16 | resolve(res[0].name); 17 | }, (err) => { 18 | }); 19 | }); 20 | }; 21 | })(); 22 | //# sourceMappingURL=github-data.js.map 23 | -------------------------------------------------------------------------------- /dist/webflow-data/github-data.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../src/webflow-data/github-data.ts"], 4 | "sourcesContent": ["\n/*\n * datasources-github\n * \n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * Helps extract information from Github\n */\n\nexport var getGithubRepoTagsUrl = function (userOrg, repo) {\n\n return `https://api.github.com/repos/${userOrg}/${repo}/tags`;\n}\n\nexport var getGithubRepoTags = function (userOrg, repo) {\n\n const url = getGithubRepoTagsUrl(userOrg, repo);\n\n return new Promise((resolve, reject) => {\n\n const url = getGithubRepoTagsUrl(userOrg, repo);\n\n fetch(url)\n .then(response => response.json())\n .then(data => resolve(data))\n .catch(error => console.error('Error:', error));\n \n\n });\n\n}\n\nexport var getGithubRepoTagLatest = function (userOrg, repo) {\n\n return new Promise((resolve, reject) => {\n\n getGithubRepoTags(userOrg, repo)\n .then((res) => {\n resolve(res[0].name);\n }, (err) => {\n\n });\n\n });\n\n}\n\n//$.get(url).done(data => {\n// const versions = data.sort((v1, v2) => semver.compare(v2.name, v1.name));\n// $('#result').html(versions[0].name);\n//});"], 5 | "mappings": ";;AAUO,MAAI,uBAAuB,SAAU,SAAS,MAAM;AAEvD,WAAO,gCAAgC,WAAW;AAAA,EACtD;AAEO,MAAI,oBAAoB,SAAU,SAAS,MAAM;AAEpD,UAAM,MAAM,qBAAqB,SAAS,IAAI;AAE9C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEpC,YAAMA,OAAM,qBAAqB,SAAS,IAAI;AAE9C,YAAMA,IAAG,EACN,KAAK,cAAY,SAAS,KAAK,CAAC,EAChC,KAAK,UAAQ,QAAQ,IAAI,CAAC,EAC1B,MAAM,WAAS,QAAQ,MAAM,UAAU,KAAK,CAAC;AAAA,IAGpD,CAAC;AAAA,EAEL;AAEO,MAAI,yBAAyB,SAAU,SAAS,MAAM;AAEzD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEpC,wBAAkB,SAAS,IAAI,EAC1B,KAAK,CAAC,QAAQ;AACX,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACvB,GAAG,CAAC,QAAQ;AAAA,MAEZ,CAAC;AAAA,IAET,CAAC;AAAA,EAEL;", 6 | "names": ["url"] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-data/google-sheet-data.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-data/google-sheet-data.ts 3 | var getGoogleSheetCsvUrl = function(id) { 4 | return `https://docs.google.com/spreadsheets/d/${id}/export?format=csv`; 5 | }; 6 | var getGoogleSheetData = function(id) { 7 | return new Promise((resolve, reject) => { 8 | var url = getGoogleSheetCsvUrl(id); 9 | console.log(url); 10 | var json = getCsvAsData( 11 | getGoogleSheetCsvUrl(id) 12 | ); 13 | resolve(json); 14 | }); 15 | }; 16 | var getGoogleSheetDataUrl = function(url) { 17 | return new Promise((resolve, reject) => { 18 | console.log(url); 19 | var json = getCsvAsData( 20 | url 21 | ); 22 | resolve(json); 23 | }); 24 | }; 25 | })(); 26 | //# sourceMappingURL=google-sheet-data.js.map 27 | -------------------------------------------------------------------------------- /dist/webflow-data/webflow-collectionlist-data.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-data/webflow-collectionlist-data.ts 3 | var prepareCollectionListDataSource = (dataSource) => { 4 | let data = dataSource.querySelectorAll("script"); 5 | console.log(`items = ${data.length}`); 6 | let items = []; 7 | data.forEach((elem) => { 8 | items.push(elem.textContent || ""); 9 | }); 10 | let json = "[" + items.join() + "]"; 11 | return JSON.parse(json); 12 | }; 13 | })(); 14 | //# sourceMappingURL=webflow-collectionlist-data.js.map 15 | -------------------------------------------------------------------------------- /dist/webflow-data/webflow-collectionlist-data.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../src/webflow-data/webflow-collectionlist-data.ts"], 4 | "sourcesContent": ["\n/*\n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * Creates a data source from a Webflow Collection list.\n */\n\n// import { Database } from '../modules/webflow-data.js';\n\n\nexport const prepareCollectionListDataSource = (dataSource: Element) => {\n // Aggregate JSON Data\n let data = dataSource.querySelectorAll('script');\n console.log(`items = ${data.length}`);\n\n let items: string[] = []; // place to store the pairs\n data.forEach((elem) => { //loop over the keys\n items.push(elem.textContent || \"\");\n })\n\n let json = '[' + items.join() + ']';\n\n return JSON.parse(json);\n}\n\n\n"], 5 | "mappings": ";;AAWO,MAAM,kCAAkC,CAAC,eAAwB;AAEpE,QAAI,OAAO,WAAW,iBAAiB,QAAQ;AAC/C,YAAQ,IAAI,WAAW,KAAK,QAAQ;AAEpC,QAAI,QAAkB,CAAC;AACvB,SAAK,QAAQ,CAAC,SAAS;AACnB,YAAM,KAAK,KAAK,eAAe,EAAE;AAAA,IACrC,CAAC;AAED,QAAI,OAAO,MAAM,MAAM,KAAK,IAAI;AAEhC,WAAO,KAAK,MAAM,IAAI;AAAA,EAC1B;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-detect/geo-handlers/geo-handler-base.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-detect/geo-handlers/geo-handler-base.ts 3 | var GeoHandlerBase = class { 4 | constructor(token = null) { 5 | this.token = token; 6 | } 7 | get info() { 8 | return { 9 | ip: this.userInfoRaw.ip, 10 | country: this.userInfoRaw.countryCode, 11 | city: null, 12 | region: null, 13 | postal: null, 14 | timezone: null 15 | }; 16 | } 17 | async getInfoAsync() { 18 | } 19 | }; 20 | })(); 21 | //# sourceMappingURL=geo-handler-base.js.map 22 | -------------------------------------------------------------------------------- /dist/webflow-detect/geo-handlers/geo-handler-base.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-detect/geo-handlers/geo-handler-base.ts"], 4 | "sourcesContent": ["\n\nexport type GeoHandlerInfo = {\n ip: string;\n country: string;\n city: string;\n\n //latitude\n //longitude\n\n region: string;\n postal: string;\n timezone: string;\n\n}\n\nexport abstract class GeoHandlerBase {\n\n userInfoRaw: any;\n\n token: string;\n\n constructor(token: string = null) {\n this.token = token;\n }\n\n get info(): GeoHandlerInfo {\n return {\n ip: this.userInfoRaw.ip,\n country: this.userInfoRaw.countryCode,\n city: null,\n region: null,\n postal: null,\n timezone: null,\n }\n }\n\n // Retrieve user info from a service\n // then normalize it\n async getInfoAsync(): Promise {\n \n };\n\n}"], 5 | "mappings": ";;AAgBO,MAAe,iBAAf,MAA8B;AAAA,IAMjC,YAAY,QAAgB,MAAM;AAC9B,WAAK,QAAQ;AAAA,IACjB;AAAA,IAEA,IAAI,OAAuB;AACvB,aAAO;AAAA,QACH,IAAI,KAAK,YAAY;AAAA,QACrB,SAAS,KAAK,YAAY;AAAA,QAC1B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,IAIA,MAAM,eAA6B;AAAA,IAEnC;AAAA,EAEJ;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-detect/geo-handlers/ip-info.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-detect/geo-handlers/geo-handler-base.ts 3 | var GeoHandlerBase = class { 4 | constructor(token = null) { 5 | this.token = token; 6 | } 7 | get info() { 8 | return { 9 | ip: this.userInfoRaw.ip, 10 | country: this.userInfoRaw.countryCode, 11 | city: null, 12 | region: null, 13 | postal: null, 14 | timezone: null 15 | }; 16 | } 17 | async getInfoAsync() { 18 | } 19 | }; 20 | 21 | // src/webflow-detect/geo-handlers/ip-info.ts 22 | var IPInfo = class extends GeoHandlerBase { 23 | get info() { 24 | return { 25 | ip: this.userInfoRaw.ip, 26 | country: this.userInfoRaw.countryCode, 27 | city: null, 28 | region: null, 29 | postal: null, 30 | timezone: null 31 | }; 32 | } 33 | constructor(token = null) { 34 | super(token); 35 | } 36 | async getInfoAsync() { 37 | const request = await fetch(`https://ipinfo.io/json?token=${this.token}`); 38 | this.userInfoRaw = await request.json(); 39 | console.log( 40 | this.userInfoRaw 41 | ); 42 | return this.userInfoRaw; 43 | } 44 | }; 45 | })(); 46 | //# sourceMappingURL=ip-info.js.map 47 | -------------------------------------------------------------------------------- /dist/webflow-detect/geo-handlers/ipify.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | })(); 3 | //# sourceMappingURL=ipify.js.map 4 | -------------------------------------------------------------------------------- /dist/webflow-detect/geo-handlers/ipify.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-detect/routing-rules.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-detect/routing-rules.ts 3 | var Sa5RoutingRules = class { 4 | constructor(detectController) { 5 | this.detectController = detectController; 6 | } 7 | load(rules) { 8 | this.rules = rules; 9 | for (const rule of rules) { 10 | switch (rule.type) { 11 | case "geo-country": { 12 | this.detectController.countries = new Map( 13 | rule.route 14 | ); 15 | break; 16 | } 17 | } 18 | } 19 | } 20 | }; 21 | })(); 22 | //# sourceMappingURL=routing-rules.js.map 23 | -------------------------------------------------------------------------------- /dist/webflow-finsweet.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-finsweet/fs-load.ts 3 | window.fsAttributes = window.fsAttributes || []; 4 | var Sa5FinsweetLoad = class { 5 | constructor(config = {}) { 6 | this.config = config; 7 | } 8 | sortRandom() { 9 | if (!window.listInstance) { 10 | console.log("listInstance is not defined."); 11 | return; 12 | } 13 | const { items } = window.listInstance; 14 | console.log("items", items); 15 | function shuffleArray(array) { 16 | for (let i = array.length - 1; i > 0; i--) { 17 | const j = Math.floor(Math.random() * (i + 1)); 18 | [array[i], array[j]] = [array[j], array[i]]; 19 | } 20 | } 21 | shuffleArray(items); 22 | window.listInstance.renderItems(); 23 | } 24 | init() { 25 | window.fsAttributes.push([ 26 | "cmsload", 27 | (listInstances) => { 28 | console.log("cmsload Successfully loaded!"); 29 | const [listInstance] = listInstances; 30 | window.listInstance = listInstance; 31 | this.sortRandom(); 32 | listInstance.on("renderitems", (renderedItems) => { 33 | console.log("renderedItems", renderedItems); 34 | }); 35 | } 36 | ]); 37 | document.addEventListener("DOMContentLoaded", () => { 38 | const sortButton = document.getElementById("sort"); 39 | sortButton?.addEventListener("click", this.sortRandom); 40 | }); 41 | } 42 | }; 43 | 44 | // src/webflow-finsweet.ts 45 | var Sa5Finsweet = class { 46 | constructor() { 47 | this.fsLoad = new Sa5FinsweetLoad(); 48 | } 49 | init() { 50 | this.fsLoad.init(); 51 | } 52 | }; 53 | })(); 54 | //# sourceMappingURL=webflow-finsweet.js.map 55 | -------------------------------------------------------------------------------- /dist/webflow-finsweet/fs-load.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-finsweet/fs-load.ts 3 | window.fsAttributes = window.fsAttributes || []; 4 | var Sa5FinsweetLoad = class { 5 | constructor(config = {}) { 6 | this.config = config; 7 | } 8 | sortRandom() { 9 | if (!window.listInstance) { 10 | console.log("listInstance is not defined."); 11 | return; 12 | } 13 | const { items } = window.listInstance; 14 | console.log("items", items); 15 | function shuffleArray(array) { 16 | for (let i = array.length - 1; i > 0; i--) { 17 | const j = Math.floor(Math.random() * (i + 1)); 18 | [array[i], array[j]] = [array[j], array[i]]; 19 | } 20 | } 21 | shuffleArray(items); 22 | window.listInstance.renderItems(); 23 | } 24 | init() { 25 | window.fsAttributes.push([ 26 | "cmsload", 27 | (listInstances) => { 28 | console.log("cmsload Successfully loaded!"); 29 | const [listInstance] = listInstances; 30 | window.listInstance = listInstance; 31 | this.sortRandom(); 32 | listInstance.on("renderitems", (renderedItems) => { 33 | console.log("renderedItems", renderedItems); 34 | }); 35 | } 36 | ]); 37 | document.addEventListener("DOMContentLoaded", () => { 38 | const sortButton = document.getElementById("sort"); 39 | sortButton?.addEventListener("click", this.sortRandom); 40 | }); 41 | } 42 | }; 43 | })(); 44 | //# sourceMappingURL=fs-load.js.map 45 | -------------------------------------------------------------------------------- /dist/webflow-form/checkbox.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-form/checkbox.ts 3 | var Sa5FormCheckbox = class { 4 | constructor(elem, config = {}) { 5 | this.checkbox = elem; 6 | this.config = config; 7 | } 8 | init() { 9 | } 10 | process() { 11 | if (!this.checkbox.checked && this.isCandidateForRemoval()) { 12 | this.checkbox.parentNode?.removeChild( 13 | this.checkbox 14 | ); 15 | } 16 | } 17 | isCandidateForRemoval() { 18 | let element = this.checkbox; 19 | while (element) { 20 | if (element.hasAttribute("wfu-form-checkbox") && element.getAttribute("wfu-form-checkbox") === "remove-unchecked") { 21 | return true; 22 | } 23 | element = element.parentElement; 24 | } 25 | return false; 26 | } 27 | }; 28 | })(); 29 | //# sourceMappingURL=checkbox.js.map 30 | -------------------------------------------------------------------------------- /dist/webflow-form/checkbox.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../src/webflow-form/checkbox.ts"], 4 | "sourcesContent": ["\n/*\n * webflow-form-ipinfo\n * \n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * For capturing sender IP info,\n * and appending to a form.\n */\n\nimport { Sa5Form } from \"../webflow-form\";\n\nexport class Sa5FormCheckbox {\n\n checkbox: HTMLInputElement;\n\n config; // Optional config\n\n constructor(elem: HTMLInputElement, config = {}) {\n\n// this.handler = this;\n\n this.checkbox = elem;\n\n this.config = config;\n\n }\n\n init(): void {\n \n }\n\n process(): void {\n\n // Process removals if unchecked \n if (!this.checkbox.checked && this.isCandidateForRemoval()) {\n this.checkbox.parentNode?.removeChild(\n this.checkbox\n ); // Remove unchecked checkbox from the form\n }\n\n }\n\n isCandidateForRemoval(): boolean {\n\n let element: HTMLElement = this.checkbox;\n\n // Walk the tree \n while (element) {\n if (element.hasAttribute('wfu-form-checkbox') && \n element.getAttribute('wfu-form-checkbox') === 'remove-unchecked') {\n return true;\n }\n element = element.parentElement; // Move up to the parent element\n }\n\n return false;\n }\n\n}\n"], 5 | "mappings": ";;AAaO,MAAM,kBAAN,MAAsB;AAAA,IAMzB,YAAY,MAAwB,SAAS,CAAC,GAAG;AAI7C,WAAK,WAAW;AAEhB,WAAK,SAAS;AAAA,IAElB;AAAA,IAEA,OAAa;AAAA,IAEb;AAAA,IAEA,UAAgB;AAGZ,UAAI,CAAC,KAAK,SAAS,WAAW,KAAK,sBAAsB,GAAG;AACxD,aAAK,SAAS,YAAY;AAAA,UACtB,KAAK;AAAA,QACT;AAAA,MACJ;AAAA,IAEJ;AAAA,IAEA,wBAAiC;AAE7B,UAAI,UAAuB,KAAK;AAGhC,aAAO,SAAS;AACZ,YAAI,QAAQ,aAAa,mBAAmB,KACxC,QAAQ,aAAa,mBAAmB,MAAM,oBAAoB;AAC9D,iBAAO;AAAA,QACX;AACJ,kBAAU,QAAQ;AAAA,MACtB;AAEA,aAAO;AAAA,IACX;AAAA,EAEJ;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-form/form-data-binder.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-form/form-data-binder.ts 3 | var Sa5FormDataBinder = class { 4 | constructor(form, config) { 5 | this.form = form; 6 | this.handler = this; 7 | this.config = config; 8 | } 9 | }; 10 | })(); 11 | //# sourceMappingURL=form-data-binder.js.map 12 | -------------------------------------------------------------------------------- /dist/webflow-form/textarea.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-form/textarea.ts 3 | var Sa5FormTextarea = class { 4 | constructor(elem, config = {}) { 5 | this.textarea = elem; 6 | this.config = config; 7 | } 8 | init() { 9 | } 10 | process() { 11 | return; 12 | if (this.checkPreserveLineBreaks()) { 13 | var modifiedText = this.textarea.value.replace(/(\r\n|\r|\n)/g, "\\n\\n"); 14 | this.textarea.value = modifiedText; 15 | } 16 | } 17 | checkPreserveLineBreaks() { 18 | return false; 19 | let element = this.textarea; 20 | while (element) { 21 | if (element.hasAttribute("wfu-form-textarea") && element.getAttribute("wfu-form-textarea") === "preserve-linebreaks") { 22 | return true; 23 | } 24 | element = element.parentElement; 25 | } 26 | return false; 27 | } 28 | }; 29 | })(); 30 | //# sourceMappingURL=textarea.js.map 31 | -------------------------------------------------------------------------------- /dist/webflow-ix.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-ix.ts 3 | var Sa5IX = class { 4 | constructor(element) { 5 | } 6 | init() { 7 | } 8 | restart() { 9 | } 10 | stateRestore() { 11 | } 12 | eventPageStart() { 13 | document.dispatchEvent(new Event("readystatechange")); 14 | } 15 | }; 16 | })(); 17 | //# sourceMappingURL=webflow-ix.js.map 18 | -------------------------------------------------------------------------------- /dist/webflow-ix.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../src/webflow-ix.ts"], 4 | "sourcesContent": ["\n/*\n * Sa5\n * webflow-ix\n * EXPERIMENTAL\n * \n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * IX2 Utilities\n * This lib aggregates functionality relating to Webflow's IX2 interactions. \n * It's intented to develop as an interface to key functionality, ideally-\n * - Resetting interactions after a DOM change\n * - Possibly solving problems like the per-page onpageload restriction \n * - Triggering interactions directly from script \n * - Unpacking the Redux store\n * \n */\n\n// import { renderRatingComponent } from \"./modules/webflow-ui\";\n\nexport class Sa5IX {\n\n // private _element: HTMLElement;\n // private _rating: Number;\n\n\n\n // Sets the value of a Rating element and refreshes it\n // setRating (el, rating) {\n\n // el.attr(\"wfu-rating\", rating);\n // this.renderRatingComponent(el);\n\n // }\n\n constructor(element: HTMLElement) {\n\n // this._element = element;\n // this._rating = Number(element.getAttribute(\"wfu-rating\")); \n\n }\n\n init() {\n\n }\n\n restart() {\n\n// Webflow is loaded?\n// Re-initialize ix2 \n// Webflow.require('ix2').init()\n\n// https://discourse.webflow.com/t/reinitialize-webflow-ix2/51094/10?u=memetican \n\n }\n\n // https://redux.js.org/ \n stateRestore() {\n\n// https://discourse.webflow.com/t/reinitialize-webflow-ix2/51094/11?u=memetican\n// https://discourse.webflow.com/t/reinitialize-webflow-ix2/51094/14?u=memetican\n// window.Webflow && window.Webflow.require( 'ix2' ).init();\n// document.dispatchEvent( new CustomEvent( 'IX2_PREVIEW_LOAD' ) );\n\n }\n\n // https://discourse.webflow.com/t/reinitialize-webflow-ix2/51094/15?u=memetican\n eventPageStart() {\n document.dispatchEvent(new Event('readystatechange'));\n }\n\n}\n"], 5 | "mappings": ";;AAqBO,MAAM,QAAN,MAAY;AAAA,IAejB,YAAY,SAAsB;AAAA,IAKlC;AAAA,IAEA,OAAO;AAAA,IAEP;AAAA,IAEA,UAAU;AAAA,IAQV;AAAA,IAGA,eAAe;AAAA,IAOf;AAAA,IAGA,iBAAiB;AACf,eAAS,cAAc,IAAI,MAAM,kBAAkB,CAAC;AAAA,IACtD;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-localization/webflow.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | })(); 3 | //# sourceMappingURL=webflow.js.map 4 | -------------------------------------------------------------------------------- /dist/webflow-localization/webflow.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-membership/access-groups.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-membership/access-groups.ts 3 | var Sa5UserAccessGroups = class { 4 | constructor(membership) { 5 | this.accessGroups = []; 6 | this.membership = membership; 7 | } 8 | async initAsync() { 9 | console.log("initAsync"); 10 | console.log(await this.getAccessGroupsAsync()); 11 | } 12 | async getAccessGroupsAsync() { 13 | this.accessGroups = []; 14 | for (let group of this.membership.config.accessGroups) { 15 | let hasAccess = await this.checkAccessGroupAsync(group); 16 | if (hasAccess) 17 | this.accessGroups.push(group); 18 | } 19 | return this.accessGroups; 20 | } 21 | async checkAccessGroupAsync(accessGroupCode) { 22 | const response = await fetch( 23 | `${this.membership.config.accessGroupsFolder}/${accessGroupCode}` 24 | ); 25 | console.log(`redirected: ${response.redirected}`); 26 | console.log("STATUS:", response.status); 27 | if (!response.redirected) { 28 | console.log(`Has access group ${accessGroupCode}`); 29 | return true; 30 | } 31 | if (response.status != 200) { 32 | console.warn("SA5", `Memberships configuration error- access group ${accessGroupCode} is not queryable.`); 33 | } 34 | console.log(`Not logged in, or no access to ${accessGroupCode}`); 35 | return false; 36 | } 37 | }; 38 | })(); 39 | //# sourceMappingURL=access-groups.js.map 40 | -------------------------------------------------------------------------------- /dist/webflow-membership/hyperflow.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-membership/hyperflow.ts 3 | var Sa5UserHyperflow = class { 4 | constructor(membership) { 5 | this.accessGroups = []; 6 | this.membership = membership; 7 | } 8 | async initAsync() { 9 | console.log("initAsync"); 10 | console.log(await this.getCurrentUserAsync()); 11 | } 12 | async getCurrentUserAsync() { 13 | const response = await fetch( 14 | `${this.membership.config.hf.currentUserUrl}` 15 | ); 16 | console.log("STATUS:", response.status); 17 | const raw = await response.json(); 18 | console.log(raw); 19 | } 20 | }; 21 | })(); 22 | //# sourceMappingURL=hyperflow.js.map 23 | -------------------------------------------------------------------------------- /dist/webflow-membership/internal/login.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-membership/internal/login.ts 3 | var WebflowUsysLogin = class extends WebflowUsysRequest { 4 | constructor() { 5 | super(); 6 | } 7 | get requestGql() { 8 | return ` 9 | mutation UserLoginRequest($email: String!, $authPassword: String!) { 10 | usysCreateSession(email: $email, authPassword: $authPassword) { 11 | user { 12 | id 13 | email 14 | createdOn 15 | emailVerified 16 | __typename 17 | } 18 | __typename 19 | } 20 | } 21 | `; 22 | } 23 | get requestObj() { 24 | return [ 25 | { 26 | operationName: "UserLoginRequest", 27 | variables: { 28 | email: this.username, 29 | authPassword: this.password 30 | }, 31 | query: this.requestGql 32 | } 33 | ]; 34 | } 35 | }; 36 | })(); 37 | //# sourceMappingURL=login.js.map 38 | -------------------------------------------------------------------------------- /dist/webflow-membership/internal/logout.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-membership/internal/logout.ts 3 | var WebflowUsysLogout = class extends WebflowUsysRequest { 4 | constructor() { 5 | super(); 6 | } 7 | get requestGql() { 8 | return ` 9 | mutation UserLogoutRequest { 10 | usysDestroySession { 11 | ok 12 | __typename 13 | } 14 | } 15 | `; 16 | } 17 | get requestObj() { 18 | return [ 19 | { 20 | operationName: "GetFieldValidations", 21 | variables: {}, 22 | query: this.requestGql 23 | } 24 | ]; 25 | } 26 | }; 27 | })(); 28 | //# sourceMappingURL=logout.js.map 29 | -------------------------------------------------------------------------------- /dist/webflow-membership/internal/prelogin.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-membership/internal/prelogin.ts 3 | var WebflowUsysPreLogin = class extends WebflowUsysRequest { 4 | constructor() { 5 | super(); 6 | } 7 | get requestGql() { 8 | return ` 9 | query GetFieldValidations { 10 | site { 11 | usysFieldSchema { 12 | id 13 | required 14 | validations { 15 | minLength 16 | maxLength 17 | min 18 | max 19 | step 20 | extensions 21 | options { 22 | slug 23 | name 24 | __typename 25 | } 26 | __typename 27 | } 28 | __typename 29 | } 30 | __typename 31 | } 32 | } 33 | `; 34 | } 35 | get requestObj() { 36 | return [ 37 | { 38 | operationName: "GetFieldValidations", 39 | variables: {}, 40 | query: this.requestGql 41 | } 42 | ]; 43 | } 44 | }; 45 | })(); 46 | //# sourceMappingURL=prelogin.js.map 47 | -------------------------------------------------------------------------------- /dist/webflow-membership/internal/usys.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | })(); 3 | //# sourceMappingURL=usys.js.map 4 | -------------------------------------------------------------------------------- /dist/webflow-membership/internal/usys.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/entry-point.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/entry-point.ts 3 | var LdJsonEntryPoint = class { 4 | constructor(urlTemplate = void 0) { 5 | this["@type"] = "EntryPoint"; 6 | this.urlTemplate = urlTemplate; 7 | } 8 | }; 9 | })(); 10 | //# sourceMappingURL=entry-point.js.map 11 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/entry-point.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/entry-point.ts"], 4 | "sourcesContent": ["\n\nexport class LdJsonEntryPoint {\n\n urlTemplate;\n \n constructor(urlTemplate = undefined) { \n this[\"@type\"] = \"EntryPoint\"; \n this.urlTemplate = urlTemplate; \n }\n \n}\n\n"], 5 | "mappings": ";;AAEO,MAAM,mBAAN,MAAuB;AAAA,IAI1B,YAAY,cAAc,QAAW;AACjC,WAAK,WAAW;AAChB,WAAK,cAAc;AAAA,IACvB;AAAA,EAEJ;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/image-object.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/image-object.ts 3 | var LdJsonImageObject = class { 4 | constructor(url = void 0) { 5 | this["@type"] = "ImageObject"; 6 | this.url = url; 7 | } 8 | }; 9 | })(); 10 | //# sourceMappingURL=image-object.js.map 11 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/image-object.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/image-object.ts"], 4 | "sourcesContent": ["\nexport class LdJsonImageObject {\n\n url;\n \n constructor(url = undefined) { \n \n this[\"@type\"] = \"ImageObject\";\n this.url = url; \n }\n \n }\n \n "], 5 | "mappings": ";;AACO,MAAM,oBAAN,MAAwB;AAAA,IAI3B,YAAY,MAAM,QAAW;AAEzB,WAAK,WAAW;AAChB,WAAK,MAAM;AAAA,IACf;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/organization.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/organization.ts 3 | var LdJsonOrganization = class { 4 | constructor(name = void 0) { 5 | this["@type"] = "Organization"; 6 | this.name = name; 7 | } 8 | }; 9 | })(); 10 | //# sourceMappingURL=organization.js.map 11 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/organization.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/organization.ts"], 4 | "sourcesContent": ["import { LdJsonImageObject } from \"./image-object\";\n\nexport class LdJsonOrganization {\n\n name: string;\n logo: LdJsonImageObject;\n \n constructor(name = undefined) { \n \n this[\"@type\"] = \"Organization\"; \n this.name = name; \n }\n \n }\n "], 5 | "mappings": ";;AAEO,MAAM,qBAAN,MAAyB;AAAA,IAK5B,YAAY,OAAO,QAAW;AAE1B,WAAK,WAAW;AAChB,WAAK,OAAO;AAAA,IAChB;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/person.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/person.ts 3 | var LdJsonPerson = class { 4 | constructor(name = void 0, url = void 0) { 5 | this["@type"] = "Person"; 6 | this.name = name; 7 | this.url = url; 8 | } 9 | }; 10 | })(); 11 | //# sourceMappingURL=person.js.map 12 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/person.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/person.ts"], 4 | "sourcesContent": ["\nexport class LdJsonPerson {\n\n name;\n url;\n \n constructor(name = undefined, url = undefined) { \n \n this[\"@type\"] = \"Person\";\n this.name = name; \n this.url = url; \n }\n \n }\n "], 5 | "mappings": ";;AACO,MAAM,eAAN,MAAmB;AAAA,IAKtB,YAAY,OAAO,QAAW,MAAM,QAAW;AAE3C,WAAK,WAAW;AAChB,WAAK,OAAO;AACZ,WAAK,MAAM;AAAA,IACf;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/profile-page.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/profile-page.ts 3 | var LdJsonProfilePage = class { 4 | constructor(name = void 0) { 5 | this["@type"] = "ProfilePage"; 6 | this.name = name; 7 | } 8 | toJSON() { 9 | return { 10 | "@content": "https://schema.org", 11 | "@type": this["@type"], 12 | name: this.name 13 | }; 14 | } 15 | }; 16 | })(); 17 | //# sourceMappingURL=profile-page.js.map 18 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/profile-page.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/profile-page.ts"], 4 | "sourcesContent": ["\nexport class LdJsonProfilePage {\n\n name: string;\n \n constructor(name = undefined) { \n \n this[\"@type\"] = \"ProfilePage\"; \n this.name = name; \n }\n \n toJSON() {\n return {\n \n \"@content\": \"https://schema.org\",\n \"@type\": this[\"@type\"],\n \n name: this.name,\n \n } \n }\n\n }\n "], 5 | "mappings": ";;AACO,MAAM,oBAAN,MAAwB;AAAA,IAI3B,YAAY,OAAO,QAAW;AAE1B,WAAK,WAAW;AAChB,WAAK,OAAO;AAAA,IAChB;AAAA,IAEA,SAAS;AACL,aAAO;AAAA,QAEH,YAAY;AAAA,QACZ,SAAS,KAAK;AAAA,QAEd,MAAM,KAAK;AAAA,MAEf;AAAA,IACJ;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/search-action.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-seo/json-ld/entry-point.ts 3 | var LdJsonEntryPoint = class { 4 | constructor(urlTemplate = void 0) { 5 | this["@type"] = "EntryPoint"; 6 | this.urlTemplate = urlTemplate; 7 | } 8 | }; 9 | 10 | // src/webflow-seo/json-ld/search-action.ts 11 | var LdJsonSearchAction = class { 12 | constructor(queryInput = void 0) { 13 | this["@context"] = "https://schema.org"; 14 | this["@type"] = "SearchAction"; 15 | this.queryInput = queryInput; 16 | this.target = new LdJsonEntryPoint(); 17 | } 18 | }; 19 | })(); 20 | //# sourceMappingURL=search-action.js.map 21 | -------------------------------------------------------------------------------- /dist/webflow-seo/json-ld/search-action.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../src/webflow-seo/json-ld/entry-point.ts", "../../../src/webflow-seo/json-ld/search-action.ts"], 4 | "sourcesContent": ["\n\nexport class LdJsonEntryPoint {\n\n urlTemplate;\n \n constructor(urlTemplate = undefined) { \n this[\"@type\"] = \"EntryPoint\"; \n this.urlTemplate = urlTemplate; \n }\n \n}\n\n", "\n\nimport { LdJsonEntryPoint } from \"./entry-point\";\n\nexport class LdJsonSearchAction {\n\n queryInput;\n target;\n \n constructor(queryInput = undefined) { \n \n this[\"@context\"] = \"https://schema.org\"; \n this[\"@type\"] = \"SearchAction\"; \n this.queryInput = queryInput; \n this.target = new LdJsonEntryPoint(); \n }\n \n }\n\n"], 5 | "mappings": ";;AAEO,MAAM,mBAAN,MAAuB;AAAA,IAI1B,YAAY,cAAc,QAAW;AACjC,WAAK,WAAW;AAChB,WAAK,cAAc;AAAA,IACvB;AAAA,EAEJ;;;ACPO,MAAM,qBAAN,MAAyB;AAAA,IAK5B,YAAY,aAAa,QAAW;AAEhC,WAAK,cAAc;AACnB,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,WAAK,SAAS,IAAI,iBAAiB;AAAA,IACvC;AAAA,EAEF;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /dist/webflow-url/relativeLinkFixup.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-url/relativeLinkFixup.ts 3 | var WfuRelativeLinkFixup = class { 4 | constructor(element) { 5 | this._element = element; 6 | } 7 | init() { 8 | let elems = Array.from( 9 | this._element.querySelectorAll( 10 | "a[href^='http://.' i], a[href^='https://.' i], a[href^='http://?' i], a[href^='https://?' i]" 11 | ) 12 | ); 13 | elems.forEach((elem) => { 14 | let href = elem.getAttribute("href"); 15 | if (href) { 16 | if (href.startsWith("http://.")) 17 | href = href.substring(8); 18 | if (href.startsWith("https://.")) 19 | href = href.substring(9); 20 | if (href.startsWith("http://?")) 21 | href = href.substring(7); 22 | if (href.startsWith("https://?")) 23 | href = href.substring(8); 24 | elem.setAttribute("href", href); 25 | } 26 | }); 27 | let elements = Array.from( 28 | this._element.querySelectorAll("a[href*='//self/' i], a[href$='//self' i]") 29 | ); 30 | elements.forEach((element) => { 31 | let originalHref = element.getAttribute("href"); 32 | if (originalHref) { 33 | const originalUrl = new URL(originalHref); 34 | let relativeHref = originalUrl.pathname + originalUrl.search + originalUrl.hash; 35 | element.setAttribute("href", relativeHref); 36 | } 37 | }); 38 | } 39 | }; 40 | })(); 41 | //# sourceMappingURL=relativeLinkFixup.js.map 42 | -------------------------------------------------------------------------------- /dist/webflow-url/targetLinks.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | // src/webflow-url/targetLinks.ts 3 | var WfuTargetLinks = class { 4 | constructor(element) { 5 | this._element = element; 6 | } 7 | init() { 8 | let elements = Array.from( 9 | document.querySelectorAll("a[href^='http://']:not([target]), a[href^='https://']:not([target])") 10 | ); 11 | elements.forEach((element) => { 12 | let href = element.getAttribute("href"); 13 | if (href) { 14 | console.debug(`retargeting ${href}.`); 15 | element.setAttribute("target", "_blank"); 16 | } 17 | }); 18 | } 19 | }; 20 | })(); 21 | //# sourceMappingURL=targetLinks.js.map 22 | -------------------------------------------------------------------------------- /dist/webflow-url/targetLinks.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../src/webflow-url/targetLinks.ts"], 4 | "sourcesContent": ["\n/*\n * target links\n * Fixues up //self/ relative links for CMS.\n * \n * Sygnal Technology Group\n * https://www.sygnal.com\n * \n * Url Utilities\n */\n\nimport { Sa5Core } from '../webflow-core'\n\n\nexport interface TargetExternalConfig {\n\n allLinks: boolean; // Indicates all links should be targeted, or attribute region only\n\n}\n\n/*\n * Link-processing functions.\n * Fixues up //self/ relative links for CMS.\n */\n\nexport class WfuTargetLinks {\n\n // config; // Optional config\n private _element: HTMLElement;\n \n // TODO: Allow forcing target override \n \n constructor(element: HTMLElement) { \n \n // this.config = config;\n this._element = element;\n\n }\n \n // Process elements with the custom attr wfu-query-param\n init() {\n \n // Get all 'a' elements with 'href' attribute starting with 'http://' or 'https://' and without 'target' attribute\n let elements = Array.from(\n document.querySelectorAll(\"a[href^='http://']:not([target]), a[href^='https://']:not([target])\"));\n \n elements.forEach((element) => {\n // Get the href attribute\n let href = element.getAttribute('href');\n \n if (href) {\n console.debug(`retargeting ${href}.`);\n \n // Set the target attribute to '_blank'\n element.setAttribute('target', '_blank');\n }\n });\n \n }\n \n }\n "], 5 | "mappings": ";;AAyBO,MAAM,iBAAN,MAAqB;AAAA,IAOpB,YAAY,SAAsB;AAG9B,WAAK,WAAW;AAAA,IAEpB;AAAA,IAGA,OAAO;AAGH,UAAI,WAAW,MAAM;AAAA,QACjB,SAAS,iBAAiB,qEAAqE;AAAA,MAAC;AAEpG,eAAS,QAAQ,CAAC,YAAY;AAE1B,YAAI,OAAO,QAAQ,aAAa,MAAM;AAEtC,YAAI,MAAM;AACN,kBAAQ,MAAM,eAAe,OAAO;AAGpC,kBAAQ,aAAa,UAAU,QAAQ;AAAA,QAC3C;AAAA,MACJ,CAAC;AAAA,IAEL;AAAA,EAEJ;", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sygnaltech/webflow-util/76013e3b18dccee00312ae7e6f6f9e183b1077ee/favicon.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webflow-util", 3 | "version": "5.0.0", 4 | "description": "A utility library for websites designed & hosted on Webflow", 5 | "homepage": "https://attr.sygnal.com", 6 | "license": "MIT", 7 | "repository": "http://github.com/sygnaltech/webflow-util", 8 | "keywords": [ 9 | "webflow" 10 | ], 11 | "author": { 12 | "name": "Michael Wells", 13 | "email": "mike@sygnal.com", 14 | "url": "https://www.sygnal.com" 15 | }, 16 | "scripts": { 17 | "clean": "rimraf dist", 18 | "test": "echo \"Error: no test specified\" && exit 1", 19 | "serve": "serve -p 4000", 20 | "tsbuild": "tsc --watch", 21 | "build": "esbuild ./src/**/*.ts ./src/*.ts --bundle --sourcemap --outdir=dist --external:custom-typings/* --target=es2020", 22 | "watch": "esbuild ./src/**/*.ts ./src/*.ts --bundle --sourcemap --outdir=dist --watch --external:custom-typings/* --target=es2020", 23 | "format": "prettier src/*.ts -w" 24 | }, 25 | "devDependencies": { 26 | "@types/youtube": "^0.0.47", 27 | "esbuild": "^0.15.14", 28 | "prettier": "^2.7.1", 29 | "rimraf": "^5.0.5", 30 | "serve": "^14.1.1", 31 | "typescript": "^4.9.3" 32 | }, 33 | "dependencies": { 34 | "@types/showdown": "^2.0.6", 35 | "@types/waypoints": "^4.0.4", 36 | "@vimeo/player": "^2.20.1", 37 | "countup.js": "github:inorganik/countUp.js", 38 | "dayjs": "^1.11.10", 39 | "gsap": "^3.12.5", 40 | "handlebars": "^4.7.8", 41 | "hotkeys-js": "^3.11.2", 42 | "luxon": "^3.4.4", 43 | "moment": "^2.29.4", 44 | "showdown": "^2.1.0", 45 | "three": "^0.165.0", 46 | "typescript-cookie": "^1.0.6" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/css/input-range-slider.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | .slider { 4 | -webkit-appearance: none; 5 | width: 100%; 6 | height: 15px; 7 | border-radius: 5px; 8 | background: #d3d3d3; 9 | outline: none; 10 | opacity: 0.7; 11 | -webkit-transition: .2s; 12 | transition: opacity .2s; 13 | } 14 | 15 | .slider::-webkit-slider-thumb { 16 | -webkit-appearance: none; 17 | appearance: none; 18 | width: 25px; 19 | height: 25px; 20 | border-radius: 50%; 21 | background: darkblue; 22 | cursor: pointer; 23 | } 24 | 25 | .slider::-moz-range-thumb { 26 | width: 25px; 27 | height: 25px; 28 | border-radius: 50%; 29 | background: darkblue; 30 | cursor: pointer; 31 | } -------------------------------------------------------------------------------- /src/css/util.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * General SCSS for Sygnal Webflow Util library 4 | */ 5 | 6 | .hide { 7 | display: none; 8 | } 9 | 10 | -------------------------------------------------------------------------------- /src/css/webflow-accordion.scss: -------------------------------------------------------------------------------- 1 | 2 | [filter-data] { 3 | /* display: none;*/ 4 | } 5 | 6 | [wfu-ui-accordion=header] { 7 | cursor: pointer; 8 | transition: background-color 0.2s linear; 9 | } 10 | 11 | [wfu-ui-accordion=content] { 12 | /* .accordion-content { */ 13 | max-height: 0; 14 | overflow: hidden; 15 | transition: max-height 0.2s ease-in-out; 16 | } 17 | 18 | @media screen and (min-width: 568px) { 19 | [wfu-ui-accordion=content] { 20 | /* .accordion-content { */ 21 | max-height: none; 22 | overflow: auto; 23 | } 24 | } -------------------------------------------------------------------------------- /src/css/webflow-data.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * SCSS for Sygnal Webflow Util HTML library 4 | */ 5 | 6 | /** 7 | * @use: This is the modern replacement for @import. 8 | * Instead of dumping all the imported styles into the global scope, @use treats each imported file as a 9 | * separate module with its own private scope. This means that variables, mixins, and functions from 10 | * the imported file have to be accessed with a namespace based on the filename. 11 | * This helps to prevent naming conflicts and makes the code easier to understand. 12 | */ 13 | 14 | 15 | // @use '../webflow-html/nested-list.scss'; 16 | 17 | // @use '../webflow-html/limit-items'; 18 | 19 | 20 | /* 21 | 22 | // Temporarily hide until decoded 23 | [wfu-bind] { 24 | // display: none; 25 | visibility: hidden; 26 | } 27 | 28 | // Temporarily hide until decoded 29 | [wfu-bind-content] { 30 | // display: none; 31 | visibility: hidden; 32 | } 33 | 34 | */ 35 | 36 | @use '../webflow-core/preload'; 37 | 38 | 39 | /* 40 | // Temporarily hide until data-bound 41 | [wfu-preload=hidden] { 42 | display: none; 43 | } 44 | 45 | // Temporarily make invisible until data-bound 46 | // Will take the appropriate space 47 | [wfu-preload=invisible] { 48 | visibility: hidden; 49 | } 50 | */ -------------------------------------------------------------------------------- /src/css/webflow-demo.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * SCSS for Sygnal Webflow Util Demo library 4 | */ 5 | 6 | 7 | // Temporarily hide until explicitly shown 8 | // [wfu-show-tracked] { 9 | // display: none; 10 | // } 11 | // [wfu-hide-tracked] { 12 | // display: none; 13 | // } 14 | 15 | -------------------------------------------------------------------------------- /src/css/webflow-detect.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | // Detect-specific elements 4 | // Geo 5 | // zone 6 | // country 7 | // city 8 | 9 | // 10 | 11 | 12 | // filter $geo. 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/css/webflow-elements.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @use '../webflow-core/preload'; 5 | 6 | 7 | // Adjust caption position for videos 8 | iframe+.w-lightbox-caption { 9 | 10 | margin-bottom: -50px; 11 | 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/css/webflow-fixup.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Webflow fixups 4 | */ 5 | 6 | /* Editor bugs */ 7 | 8 | // override editor warning on small screen 9 | // also Search engine results warning 10 | // "Unsupported Page" 11 | .w-editor-bem-EditorFallback { 12 | // visibility: hidden; 13 | display: none !important; 14 | } 15 | .w-editor-bem-EditorFallback-mobile { 16 | display: none !important; 17 | } 18 | 19 | // hide Publish button from Editors 20 | // https://discourse.webflow.com/t/published-by-editor-also-publish-my-staging-design/63483/10?u=memetican 21 | // https://webflow.com/feature/publish-individual-cms-items 22 | 23 | /* 24 | .w-editor-publish-controls .w-editor-publish { 25 | display: none !important; 26 | } 27 | */ 28 | 29 | -------------------------------------------------------------------------------- /src/css/webflow-form.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * SCSS for Sygnal Webflow Util Demo library 4 | */ 5 | 6 | 7 | @use '../webflow-form/form-select'; 8 | 9 | 10 | 11 | // Temporarily hide until explicitly shown 12 | // [wfu-show-tracked] { 13 | // display: none; 14 | // } 15 | // [wfu-hide-tracked] { 16 | // display: none; 17 | // } 18 | 19 | -------------------------------------------------------------------------------- /src/css/webflow-format.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Formatting CSS for Sygnal Webflow Util library 4 | */ 5 | 6 | /* Formatting CSVs 7 | Apply the wfu-csv attr to a collection list for format its contents as CSV 8 | NOTE: This CSS chunk can be implemented copied to an HTML embed, if you want to see the layout directly in the designer. 9 | */ 10 | [wfu-csv] .w-dyn-item { 11 | display: inline; 12 | } 13 | [wfu-csv] .w-dyn-item div, 14 | [wfu-csv] .w-dyn-item p { 15 | display: inline; 16 | } 17 | [wfu-csv] .w-dyn-item:not(:last-child) div::after, 18 | [wfu-csv] .w-dyn-item:not(:last-child) p::after { 19 | content: ", "; 20 | } 21 | 22 | // Initially hide dates 23 | // [wfu-format-date] { 24 | // visibility: hidden; 25 | // } -------------------------------------------------------------------------------- /src/css/webflow-gallery.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * SCSS for SA5 Gallery library 4 | */ 5 | 6 | @use '../webflow-core/preload'; -------------------------------------------------------------------------------- /src/css/webflow-kiosk.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * SCSS for SA5 Kiosk library 4 | */ 5 | 6 | -------------------------------------------------------------------------------- /src/css/webflow-membership.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * SCSS for Sygnal Webflow Util Track library 4 | */ 5 | 6 | 7 | // Temporarily hide until explicitly shown 8 | [wfu-show-logged-in] { 9 | display: none; 10 | } 11 | [wfu-hide-logged-in] { 12 | display: none; 13 | } 14 | 15 | // Login Button (expanded) 16 | [wfu-login-button] { 17 | cursor: pointer; 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/css/webflow-modal.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Webflow modal 4 | */ 5 | 6 | @use '../webflow-modal/modal'; 7 | 8 | // override editor warning on small screen 9 | // also Search engine results warning 10 | // "Unsupported Page" 11 | [wfu-modal-trigger] { 12 | // visibility: hidden; 13 | display: none !important; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/css/webflow-richtext.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @use '../webflow-richtext/nested-list.scss'; 5 | @use '../webflow-richtext/svg-embeds.scss'; 6 | @use '../webflow-richtext/github-gist.scss'; 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/css/webflow-track.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * SCSS for Sygnal Webflow Util Track library 4 | */ 5 | 6 | 7 | // Temporarily hide until explicitly shown 8 | [wfu-show-tracked] { 9 | display: none; 10 | } 11 | [wfu-hide-tracked] { 12 | display: none; 13 | } 14 | -------------------------------------------------------------------------------- /src/css/webflow-ui.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * CSS for Sygnal Webflow Util UI component library 4 | */ 5 | 6 | /* Ratings Component */ 7 | 8 | .wfu-rating-stars { 9 | position: relative; 10 | display: inline-block; 11 | white-space: nowrap; 12 | } 13 | 14 | .wfu-rating-stars svg { 15 | width: 20%; 16 | fill: gold; 17 | } 18 | 19 | .wfu-rating-stars-cover { 20 | background: white; 21 | height: 100%; 22 | overflow: hidden; 23 | mix-blend-mode: color; 24 | position: absolute; 25 | top: 0; 26 | right: 0; 27 | width: 100%; 28 | } 29 | -------------------------------------------------------------------------------- /src/css/webflow-util.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * General CSS for Sygnal Webflow Util library 4 | */ 5 | 6 | /* Initially hide images that are tagged for SVG-inlining. 7 | This prevents them from appearing (blck) before the CSS color-rules can be applied. */ 8 | .wfu-svg { 9 | visibility: hidden; 10 | } 11 | 12 | pre.wfu-code { 13 | } 14 | 15 | .wfu-json-string { 16 | color: #008000; 17 | } 18 | 19 | .wfu-json-number { 20 | color: #FF0000; 21 | } 22 | 23 | .wfu-json-boolean { 24 | color: #FF8C00; 25 | } 26 | 27 | .wfu-json-null { 28 | color: #908080; 29 | } 30 | 31 | .wfu-json-key { 32 | color: #1A1A1A; 33 | } 34 | -------------------------------------------------------------------------------- /src/css/webflow-video.scss: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-video 4 | */ 5 | 6 | 7 | [wfu-youtube-norel] { 8 | display: inline-block; 9 | position: relative; 10 | } 11 | 12 | [wfu-youtube-norel].sa5-video-paused::after { 13 | content: ""; 14 | position: absolute; 15 | top: 0; // 70px; 16 | left: 0; 17 | bottom: 0; // 50px; 18 | right: 0; 19 | cursor: pointer; 20 | background-color: black; 21 | background-repeat: no-repeat; 22 | background-position: center; 23 | background-size: 40px 40px; 24 | background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEiIHdpZHRoPSIxNzA2LjY2NyIgaGVpZ2h0PSIxNzA2LjY2NyIgdmlld0JveD0iMCAwIDEyODAgMTI4MCI+PHBhdGggZD0iTTE1Ny42MzUgMi45ODRMMTI2MC45NzkgNjQwIDE1Ny42MzUgMTI3Ny4wMTZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+); 25 | } 26 | 27 | [wfu-youtube-norel].sa5-video-ended::after { 28 | content: ""; 29 | position: absolute; 30 | top: 0; 31 | left: 0; 32 | bottom: 0; 33 | right: 0; 34 | cursor: pointer; 35 | background-color: black; 36 | background-repeat: no-repeat; 37 | background-position: center; 38 | background-size: 64px 64px; 39 | background-image: url(data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgNTEwIDUxMCI+PHBhdGggZD0iTTI1NSAxMDJWMEwxMjcuNSAxMjcuNSAyNTUgMjU1VjE1M2M4NC4xNSAwIDE1MyA2OC44NSAxNTMgMTUzcy02OC44NSAxNTMtMTUzIDE1My0xNTMtNjguODUtMTUzLTE1M0g1MWMwIDExMi4yIDkxLjggMjA0IDIwNCAyMDRzMjA0LTkxLjggMjA0LTIwNC05MS44LTIwNC0yMDQtMjA0eiIgZmlsbD0iI0ZGRiIvPjwvc3ZnPg==); 40 | } 41 | 42 | -------------------------------------------------------------------------------- /src/lib/patterns/email.js: -------------------------------------------------------------------------------- 1 | 2 | // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script 3 | 4 | // 5 | 6 | /* 7 | * email formats 8 | * 9 | * Sygnal Technology Group 10 | * http://sygnal.com 11 | * 12 | * Used for FORM INPUT validation. 13 | */ 14 | 15 | // Encoder 16 | // http://coderstoolbox.net/string/#!encoding=js&action=encode&charset=utf_8 17 | 18 | export const emailFormat = { 19 | 20 | // From https://emailregex.com/ 21 | "all": "(?:[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/locode/webflow-forms-helper.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-forms-helper 4 | * 5 | * Sygnal Technology Group 6 | * http://sygnal.com 7 | * 8 | * LO-CODE Helper class to simplify form functions. 9 | */ 10 | 11 | 12 | import { loadAllData } from '../modules/webflow-data.js'; 13 | import { dataBindAllForms } from '../modules/webflow-form.js'; 14 | 15 | export var dataBindAll = function () { 16 | 17 | // Create database 18 | var db = loadAllData(); 19 | 20 | // Bind all form elements 21 | dataBindAllForms(db); 22 | 23 | } 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/locode/webflow-table-helper.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-table-helper 4 | * 5 | * Sygnal Technology Group 6 | * http://sygnal.com 7 | * 8 | * LO-CODE Helper class to simplify table functions. 9 | */ 10 | 11 | import { getCsvAsData } from '../modules/webflow-data.js'; 12 | import { renderTableFromData } from '../modules/webflow-table.js'; 13 | import { getGoogleSheetCsvUrl } from '../datasources/google-sheet-data.js'; 14 | 15 | export var renderTableFromGoogleSheet = function (elem, googleSheetId) { 16 | 17 | // Construct Google Sheet CSV URL 18 | const url = getGoogleSheetCsvUrl(googleSheetId); 19 | 20 | // Instantiate Webflow Table util 21 | // var webflowTableUtil = new WebflowTableUtil({ 22 | // logging: true, // enable logging to console 23 | //// csvFile: 'https://docs.google.com/spreadsheets/d/16lPOiFz5Ow-FTro5SWS-m00fNhRjgsiyeSBdme3gKX0/export?format=csv', 24 | // }); 25 | 26 | // Retrieve CSV and convert to JSON 27 | var data = getCsvAsData( 28 | url 29 | ); 30 | 31 | // Create HTML table 32 | renderTableFromData( 33 | elem, 34 | data 35 | ); 36 | 37 | } 38 | 39 | -------------------------------------------------------------------------------- /src/nocode/webflow-404.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-404 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Attribute } from '../globals'; 12 | import { VERSION } from '../version'; 13 | import { Sa5Core } from '../webflow-core'; 14 | import { Sa5Debug } from '../webflow-core/debug'; 15 | 16 | const init = () => { 17 | 18 | // new Sa5Core().init(); 19 | let core: Sa5Core = Sa5Core.startup(); 20 | 21 | // Initialize debugging 22 | let debug = new Sa5Debug("sa5-404"); 23 | debug.debug (`Initializing v${VERSION}`); 24 | 25 | // parse url, put into search field 26 | // [wfu-404-search] 27 | set404SearchInputValue(); 28 | 29 | // special url detection and redirects 30 | 31 | 32 | } 33 | 34 | function set404SearchInputValue() { 35 | // 1. Parse the URL to extract the path 36 | const url = new URL(window.location.href); 37 | const path = url.pathname; 38 | 39 | // 2. Convert the path into words with space delimiters 40 | // Remove the leading slash, split by slashes, replace hyphens with spaces, reverse the segments, and then join with spaces 41 | const searchQuery = path.slice(1).split('/') 42 | .map(segment => segment.replace(/-/g, ' ')) 43 | .reverse() 44 | .join(' '); 45 | 46 | // 3. Set the value of the input field with the custom attribute [wfu-404-search] to the parsed content 47 | const inputElement = document.querySelector(`[${Sa5Attribute.ATTR_404_SEARCH}]`); 48 | if (inputElement) { 49 | inputElement.value = searchQuery; 50 | } 51 | } 52 | 53 | 54 | 55 | 56 | 57 | // Auto-execute on DOM load 58 | if (document.readyState !== 'loading') { 59 | init(); 60 | } else { 61 | document.addEventListener("DOMContentLoaded", init); 62 | } -------------------------------------------------------------------------------- /src/nocode/webflow-calc.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-calc 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Core } from '../webflow-core'; 12 | import { Sa5Debug } from '../webflow-core/debug'; 13 | import { VERSION } from '../version'; 14 | import { Sa5CalcController } from '../webflow-calc'; 15 | 16 | const init = () => { 17 | 18 | // new Sa5Core().init(); 19 | 20 | let core: Sa5Core = Sa5Core.startup(); 21 | 22 | // Initialize debugging 23 | let debug = new Sa5Debug("sa5-calc"); 24 | debug.enabled = true; 25 | debug.debug (`Initializing v${VERSION}`); 26 | 27 | /** 28 | * 29 | */ 30 | 31 | /** 32 | * Initialize core Sa5Html handler 33 | */ 34 | 35 | // Create Sa5Cro 36 | let obj = new Sa5CalcController({ 37 | }).init(); 38 | 39 | 40 | 41 | 42 | 43 | } 44 | 45 | // Auto-execute on DOM load 46 | if (document.readyState !== 'loading') { 47 | init(); 48 | } else { 49 | document.addEventListener("DOMContentLoaded", init); 50 | } -------------------------------------------------------------------------------- /src/nocode/webflow-data.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-utils 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | //import { WfuQuery, WfuRelativeLinkFixup, WfuTargetLinks } from '../webflow-url'; 12 | import { VERSION } from '../version'; 13 | import { Sa5Core } from '../webflow-core'; 14 | import { Sa5Debug } from '../webflow-core/debug'; 15 | 16 | //import { loadAllData } from '../modules/webflow-data.js'; 17 | 18 | import { Sa5Datastore } from '../webflow-data'; 19 | import { WfuDataBinder} from '../webflow-databind'; 20 | 21 | //import { dataBindAllForms } from '../modules/webflow-form.js'; 22 | 23 | // export var dataBindAll = function () { 24 | 25 | const init = () => { 26 | 27 | // new Sa5Core().init(); 28 | let core: Sa5Core = Sa5Core.startup(); 29 | 30 | // console.log("webflow-data", "init"); 31 | 32 | // Initialize debugging 33 | let debug = new Sa5Debug("sa5-data"); 34 | debug.debug (`Initializing v${VERSION}`); 35 | 36 | // Create datastore 37 | var ds: Sa5Datastore = new Sa5Datastore(); 38 | ds.init(); 39 | 40 | // BUG: DEPRECATED 41 | // Bind all form elements 42 | // dataBindAllForms(db); 43 | 44 | let binder = new WfuDataBinder(ds).bindAll(); 45 | 46 | } 47 | 48 | 49 | // Auto-execute on DOM load 50 | if (document.readyState !== 'loading') { 51 | init(); 52 | } else { 53 | document.addEventListener("DOMContentLoaded", init); 54 | } -------------------------------------------------------------------------------- /src/nocode/webflow-demo.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-demo 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { WebflowInfo } from '../webflow-demo'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | import { Sa5Attribute } from '../globals'; 15 | import { VERSION } from '../version'; 16 | 17 | const init = () => { 18 | 19 | // new Sa5Core().init(); 20 | let core: Sa5Core = Sa5Core.startup(); 21 | 22 | // Initialize debugging 23 | let debug = new Sa5Debug("wfu-demo"); 24 | debug.debug (`Initializing v${VERSION}`); 25 | 26 | const webflowInfo = new WebflowInfo(); 27 | 28 | const elements = document.querySelectorAll( 29 | `a[${Sa5Attribute.ATTR_DEMO_LINK}]` // wfu-demo-link 30 | ) as NodeListOf; 31 | 32 | // Iterate over the matched elements 33 | elements.forEach((element) => { 34 | 35 | // Do something with each element 36 | webflowInfo.updateHrefToWebflowPreviewLink(element); 37 | 38 | }); 39 | 40 | } 41 | 42 | 43 | // Auto-execute on DOM load 44 | if (document.readyState !== 'loading') { 45 | init(); 46 | } else { 47 | document.addEventListener("DOMContentLoaded", init); 48 | } -------------------------------------------------------------------------------- /src/nocode/webflow-detect.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-detect 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | * Place in HEAD, do not defer 10 | */ 11 | 12 | import { WebflowVideo } from '../webflow-video'; 13 | import { Sa5Core } from '../webflow-core'; 14 | import { Sa5Debug } from '../webflow-core/debug'; 15 | import { Sa5VideoPlayerFactory } from '../webflow-video/player-factory'; 16 | import { Sa5Attribute, Sa5GlobalVar } from '../globals'; 17 | import { Sa5Detect } from '../webflow-detect'; 18 | import { VERSION } from '../version'; 19 | 20 | // type VideoTimeUpdateCallback = (name: string, time: number, totalTime: number, percent: number) => void; 21 | 22 | 23 | 24 | 25 | 26 | // Region (Abbreviation: Reg.) 27 | // Zone (Abbreviation: Zn.) 28 | // Bloc (Often used in terms like "trade bloc" or "economic bloc") 29 | // Cluster (Abbreviation: Cl.) 30 | // Grouping (Abbreviation: Grp.) 31 | // Assembly (Abbreviation: Asm.) 32 | // Alliance (Often used in political or military contexts) 33 | // Federation (Abbreviation: Fed.) 34 | // Union (Abbreviation: Un.) 35 | // Sector (Abbreviation: Sec.) 36 | 37 | 38 | // Run IIFE immediately 39 | (async() => { 40 | 41 | console.log("DETECT"); 42 | 43 | let core: Sa5Core = Sa5Core.startup(); 44 | 45 | // Initialize debugging 46 | let debug = new Sa5Debug("sa5-detect"); 47 | debug.debug (`Initializing v${VERSION}`); 48 | 49 | /** 50 | * Get IP Info, GeoLocation 51 | */ 52 | 53 | // Usage 54 | let detect = new Sa5Detect(); 55 | 56 | // Process Rules 57 | let routingRules = window[Sa5GlobalVar.GLOBAL_ROUTE]; 58 | 59 | if (routingRules) 60 | detect.routingRules.load(routingRules); 61 | 62 | 63 | await detect.applyDetectContextAsync(); 64 | 65 | })(); 66 | 67 | const init = async() => { 68 | } 69 | 70 | 71 | // Auto-execute on DOM load 72 | if (document.readyState !== 'loading') { 73 | init(); 74 | } else { 75 | document.addEventListener("DOMContentLoaded", init); 76 | } -------------------------------------------------------------------------------- /src/nocode/webflow-effects.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-effects 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | //import { WfuQuery, WfuRelativeLinkFixup, WfuTargetLinks } from '../webflow-url'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | 15 | import { Sa5Attribute } from '../globals'; 16 | 17 | import { Sa5EffectsController } from '../webflow-effects/effect-controller'; 18 | import { VERSION } from '../version'; 19 | 20 | const init = () => { 21 | 22 | let core: Sa5Core = Sa5Core.startup(); 23 | 24 | // Initialize debugging 25 | let debug = new Sa5Debug("sa5-effects"); 26 | debug.debug (`Initializing v${VERSION}`); 27 | 28 | (new Sa5EffectsController()).init(); 29 | 30 | } 31 | 32 | 33 | // Auto-execute on DOM load 34 | if (document.readyState !== 'loading') { 35 | init(); 36 | } else { 37 | document.addEventListener("DOMContentLoaded", init); 38 | } -------------------------------------------------------------------------------- /src/nocode/webflow-embed.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * webflow-embed 3 | * 4 | * Sygnal Technology Group 5 | * https://www.sygnal.com 6 | * 7 | * Embed content such as tables, and more. 8 | */ 9 | 10 | import { Sa5Attribute } from '../globals'; 11 | import { VERSION } from '../version'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | import { Sa5Embed } from '../webflow-embed'; 15 | // import { Sa5HtmlDynamicAttributes } from './webflow-html/dynamic-attributes' 16 | // import { Sa5Breakpoints } from './webflow-html/breakpoints' 17 | 18 | // interface Sa5EmbedConfig { 19 | 20 | // // dynamicAttributes?: boolean | true; 21 | // // handleBreakpointChange?: ((breakpointName: string, e: MediaQueryListEvent) => void) | null; 22 | // // handleOrientationChange?: ((orientationName: string, e: MediaQueryListEvent) => void) | null; 23 | 24 | // debug?: boolean | true; 25 | 26 | // } 27 | 28 | 29 | const initAsync = async() => { 30 | 31 | // new Sa5Core().init(); 32 | let core: Sa5Core = Sa5Core.startup(); 33 | 34 | // Initialize debugging 35 | let debug = new Sa5Debug("sa5-embed"); 36 | debug.debug (`Initializing v${VERSION}`); 37 | 38 | // Init embeds 39 | 40 | const embedSelectors = [ 41 | // 'script[type="wfu-embed"]', // deprecated 42 | 'script[type^="sygnal/embed"]' // e.g. sygnal/embed and sygnal/embed+hson 43 | ]; 44 | 45 | document.querySelectorAll(embedSelectors.join(', ')) 46 | .forEach(async (scriptElement: HTMLScriptElement) => { 47 | 48 | const webflowEmbed = await Sa5Embed.createFromScriptElementAsync(scriptElement); // ?.init(); 49 | 50 | }); 51 | 52 | } 53 | 54 | 55 | // Auto-execute on DOM load 56 | if (document.readyState !== 'loading') { 57 | initAsync(); 58 | } else { 59 | document.addEventListener("DOMContentLoaded", initAsync); 60 | } 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /src/nocode/webflow-fixup.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-fixup 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { VERSION } from '../version'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | 15 | const init = () => { 16 | 17 | 18 | // new Sa5Core().init(); 19 | let core: Sa5Core = Sa5Core.startup(); 20 | 21 | // Initialize debugging 22 | let debug = new Sa5Debug("sa5-fixup"); 23 | debug.debug (`Initializing v${VERSION}`); 24 | 25 | 26 | // Editor fixups 27 | 28 | // Editor - Unsupported Browser 29 | // CSS override? 30 | 31 | /* 32 |
Unsupported Browser
33 |
34 |
35 |
36 |
37 | It looks like you‘re trying to open the Editor on a mobile device. 38 |
39 |
40 | For now, the Editor is only available on desktop. 41 |
42 |
45 | */ 46 | 47 | 48 | } 49 | 50 | // Auto-execute on DOM load 51 | if (document.readyState !== 'loading') { 52 | init(); 53 | } else { 54 | document.addEventListener("DOMContentLoaded", init); 55 | } -------------------------------------------------------------------------------- /src/nocode/webflow-format.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-format 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { WebflowFormat } from '../webflow-format'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | import { Sa5Attribute } from '../globals'; 15 | import { VERSION } from '../version'; 16 | 17 | const init = () => { 18 | 19 | // new Sa5Core().init(); 20 | let core: Sa5Core = Sa5Core.startup(); 21 | 22 | // Initialize debugging 23 | let debug = new Sa5Debug("sa5-format"); 24 | debug.debug (`Initializing v${VERSION}`); 25 | 26 | 27 | const webflowFormat = new WebflowFormat(); 28 | 29 | /** 30 | * Format numbers & currency 31 | */ 32 | 33 | const elements = document.querySelectorAll( 34 | Sa5Attribute.getBracketed(Sa5Attribute.ATTR_FORMAT) // '[wfu-format]' 35 | ) as NodeListOf; 36 | 37 | // Iterate over the matched elements 38 | elements.forEach((element) => { 39 | 40 | webflowFormat.formatField(element); 41 | 42 | }); 43 | 44 | /** 45 | * Format date 46 | * specify moment formatting string 47 | */ 48 | 49 | document.querySelectorAll( 50 | Sa5Attribute.getBracketed(Sa5Attribute.ATTR_FORMAT_DATE) // `[wfu-format-date]` 51 | ) 52 | .forEach((element: HTMLElement) => { 53 | 54 | webflowFormat.formatDate(element); 55 | 56 | }); 57 | 58 | } 59 | 60 | // Auto-execute on DOM load 61 | if (document.readyState !== 'loading') { 62 | init(); 63 | } else { 64 | document.addEventListener("DOMContentLoaded", init); 65 | } -------------------------------------------------------------------------------- /src/nocode/webflow-gallery.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-gallery 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Core } from '../webflow-core'; 12 | import { Sa5Debug } from '../webflow-core/debug'; 13 | import { VERSION } from '../version'; 14 | import { Sa5Gallery, Sa5GalleryManager } from '../webflow-gallery'; 15 | 16 | const init = () => { 17 | 18 | // new Sa5Core().init(); 19 | let core: Sa5Core = Sa5Core.startup(); 20 | 21 | // Initialize debugging 22 | let debug = new Sa5Debug("sa5-gallery"); 23 | debug.debug (`Initializing v${VERSION}`); 24 | 25 | // Initialize gallery manager 26 | const sa5GalleryManager = new Sa5GalleryManager(); 27 | sa5GalleryManager.init(); 28 | 29 | } 30 | 31 | // Auto-execute on DOM load 32 | if (document.readyState !== 'loading') { 33 | init(); 34 | } else { 35 | document.addEventListener("DOMContentLoaded", init); 36 | } 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/nocode/webflow-hotkeys.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-hotkeys 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Hotkeys } from '../webflow-hotkeys'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | import { VERSION } from '../version'; 15 | 16 | const init = () => { 17 | 18 | // new Sa5Core().init(); 19 | let core: Sa5Core = Sa5Core.startup(); 20 | 21 | // Initialize debugging 22 | let debug = new Sa5Debug("sa5-hotkeys"); 23 | debug.debug (`Initializing v${VERSION}`); 24 | 25 | 26 | const sa5Hotkeys = new Sa5Hotkeys(); 27 | sa5Hotkeys.init(); 28 | 29 | } 30 | 31 | // Auto-execute on DOM load 32 | if (document.readyState !== 'loading') { 33 | init(); 34 | } else { 35 | document.addEventListener("DOMContentLoaded", init); 36 | } -------------------------------------------------------------------------------- /src/nocode/webflow-html.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-html 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Html } from '../webflow-html' 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | // import { Sa5Editor } from '../webflow-core/webflow-editor'; 15 | // import { sequence, decodeHTML } from '../utils'; 16 | // import { Sa5CollectionList } from '../webflow-html/collection-list'; 17 | // import { Sa5Attribute } from '../globals'; 18 | import { VERSION } from '../version'; 19 | // import { Sa5EncodedEmail } from '../webflow-html/encoded-email'; 20 | 21 | const init = () => { 22 | 23 | // new Sa5Core().init(); 24 | 25 | let core: Sa5Core = Sa5Core.startup(); 26 | 27 | // Initialize debugging 28 | let debug = new Sa5Debug("sa5-html"); 29 | debug.debug (`Initializing v${VERSION}`); 30 | 31 | /** 32 | * Initialize core Sa5Html handler 33 | */ 34 | 35 | let lib = new Sa5Html({ 36 | dynamicAttributes: true 37 | }).init(); 38 | 39 | } 40 | 41 | // Auto-execute on DOM load 42 | if (document.readyState !== 'loading') { 43 | init(); 44 | } else { 45 | document.addEventListener("DOMContentLoaded", init); 46 | } -------------------------------------------------------------------------------- /src/nocode/webflow-kiosk.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-kiosk 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Core } from '../webflow-core'; 12 | import { Sa5Debug } from '../webflow-core/debug'; 13 | import { VERSION } from '../version'; 14 | import { Sa5Kiosk } from '../webflow-kiosk'; 15 | 16 | const init = () => { 17 | 18 | // new Sa5Core().init(); 19 | let core: Sa5Core = Sa5Core.startup(); 20 | 21 | // Initialize debugging 22 | let debug = new Sa5Debug("sa5-kiosk"); 23 | debug.debug (`Initializing v${VERSION}`); 24 | 25 | 26 | const sa5Kiosk = new Sa5Kiosk(); 27 | sa5Kiosk.init(); 28 | 29 | } 30 | 31 | // Auto-execute on DOM load 32 | if (document.readyState !== 'loading') { 33 | init(); 34 | } else { 35 | document.addEventListener("DOMContentLoaded", init); 36 | } 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/nocode/webflow-layout.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-layout 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { Sa5Core } from '../webflow-core'; 12 | import { Sa5Debug } from '../webflow-core/debug'; 13 | import { Sa5Layouts } from '../webflow-layout/layout'; 14 | import { Sa5ElementGroups } from '../webflow-layout/element-groups'; 15 | import { VERSION } from '../version'; 16 | 17 | const init = () => { 18 | 19 | // new Sa5Core().init(); 20 | 21 | let core: Sa5Core = Sa5Core.startup(); 22 | 23 | // Initialize debugging 24 | let debug = new Sa5Debug("sa5-layout"); 25 | debug.debug (`Initializing v${VERSION}`); 26 | 27 | 28 | /** 29 | * Layout items 30 | */ 31 | 32 | (new Sa5Layouts).init(); 33 | 34 | } 35 | 36 | // Auto-execute on DOM load 37 | if (document.readyState !== 'loading') { 38 | init(); 39 | } else { 40 | document.addEventListener("DOMContentLoaded", init); 41 | } -------------------------------------------------------------------------------- /src/nocode/webflow-modal.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-modal 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | //import { WfuQuery, WfuRelativeLinkFixup, WfuTargetLinks } from '../webflow-url'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | 15 | import { Sa5Attribute } from '../globals'; 16 | 17 | import { Sa5Dismiss } from '../webflow-modal/dismiss'; 18 | import { VERSION } from '../version'; 19 | import { Sa5ModalController } from '../webflow-modal/modal-controller'; 20 | 21 | const init = () => { 22 | 23 | let core: Sa5Core = Sa5Core.startup(); 24 | 25 | // Initialize debugging 26 | let debug = new Sa5Debug("sa5-modal"); 27 | debug.debug (`Initializing v${VERSION}`); 28 | 29 | // Handle modals 30 | const controller: Sa5ModalController = new Sa5ModalController(); 31 | controller.init(); 32 | 33 | // Dismiss any elements that are cookie-suppressed 34 | document.querySelectorAll( 35 | Sa5Attribute.getBracketed(Sa5Attribute.ATTR_DISMISS) 36 | ).forEach((element) => { 37 | 38 | const dismissElem = element as HTMLElement; 39 | 40 | let modal: Sa5Dismiss = new Sa5Dismiss(dismissElem); 41 | modal.init(); 42 | 43 | }); 44 | 45 | } 46 | 47 | // Auto-execute on DOM load 48 | if (document.readyState !== 'loading') { 49 | init(); 50 | } else { 51 | document.addEventListener("DOMContentLoaded", init); 52 | } -------------------------------------------------------------------------------- /src/nocode/webflow-seo.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Sa5 4 | * webflow-seo 5 | * 6 | * Sygnal Technology Group 7 | * https://www.sygnal.com 8 | * 9 | * SEO Utilities 10 | * 11 | */ 12 | 13 | import { Sa5Core } from "../webflow-core"; 14 | import { LdJsonArticle } from "../webflow-seo/json-ld/article"; 15 | import { LdJsonCourse } from "../webflow-seo/json-ld/course"; 16 | import { Sa5Debug } from '../webflow-core/debug'; 17 | import { Sa5SEO } from "../webflow-seo"; 18 | import { LdJsonWebPage } from "../webflow-seo/json-ld/webpage"; 19 | import { VERSION } from "../version"; 20 | 21 | 22 | Sa5Core.startup(LdJsonArticle); 23 | Sa5Core.startup(LdJsonCourse); 24 | 25 | 26 | 27 | const init = () => { 28 | 29 | // new Sa5Core().init(); 30 | let core: Sa5Core = Sa5Core.startup(); 31 | 32 | // Initialize debugging 33 | let debug = new Sa5Debug("sa5-seo"); 34 | debug.debug (`Initializing v${VERSION}`); 35 | 36 | 37 | // const seo = new Sa5SEO(); 38 | 39 | const webPage = new LdJsonWebPage(); 40 | 41 | 42 | 43 | webPage.name = document.title; 44 | webPage.description = document.querySelector('meta[name="description"]')?.getAttribute('content'); 45 | 46 | // do callback for modifications 47 | 48 | // e.g. add publisher name 49 | 50 | // publish it 51 | 52 | webPage.generate(); 53 | 54 | } 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/nocode/webflow-ui.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-ui 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { VERSION } from '../version'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | import { Sa5Rating } from '../webflow-ui'; 15 | 16 | const init = () => { 17 | 18 | let core: Sa5Core = Sa5Core.startup(); 19 | 20 | // Initialize debugging 21 | let debug = new Sa5Debug("sa5-ui"); 22 | debug.debug (`Initializing v${VERSION}`); 23 | 24 | // Find all rating components 25 | document.querySelectorAll('div[wfu-ui="rating"]') 26 | .forEach((element: HTMLElement) => { 27 | 28 | new Sa5Rating(element).init(); 29 | 30 | }); 31 | 32 | } 33 | 34 | // Auto-execute on DOM load 35 | if (document.readyState !== 'loading') { 36 | init(); 37 | } else { 38 | document.addEventListener("DOMContentLoaded", init); 39 | } 40 | 41 | -------------------------------------------------------------------------------- /src/nocode/webflow-video.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-video 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * NO-CODE version, keys off of [wfu] attributes. 9 | */ 10 | 11 | import { WebflowVideo } from '../webflow-video'; 12 | import { Sa5Core } from '../webflow-core'; 13 | import { Sa5Debug } from '../webflow-core/debug'; 14 | // import { Sa5VideoPlayerFactory } from '../webflow-video/player-factory'; 15 | // import { Sa5Attribute } from '../globals'; 16 | import { VERSION } from '../version'; 17 | import { Sa5VideoController } from '../webflow-video/video-controller'; 18 | 19 | // type VideoTimeUpdateCallback = (name: string, time: number, totalTime: number, percent: number) => void; 20 | 21 | 22 | const init = () => { 23 | 24 | 25 | let core: Sa5Core = Sa5Core.startup(); 26 | 27 | // Initialize debugging 28 | let debug = new Sa5Debug("sa5-video"); 29 | debug.debug (`Initializing v${VERSION}`); 30 | 31 | 32 | 33 | // /** 34 | // * Initialize all [wfu-video] elements 35 | // */ 36 | 37 | // let videos = document.querySelectorAll(`[${Sa5Attribute.ATTR_VIDEO}]`); 38 | // videos.forEach((element: HTMLElement) => { 39 | 40 | // Sa5VideoPlayerFactory.create(element).init(); 41 | 42 | // }); 43 | 44 | /** 45 | * Init Video Controller and Events 46 | */ 47 | 48 | const videoController = new Sa5VideoController(); 49 | videoController.init(); 50 | 51 | 52 | 53 | /** 54 | * General video enhancements 55 | */ 56 | 57 | const webflowVideo = new WebflowVideo(); 58 | 59 | // Initialize all [wfu-youtube-norel] elements 60 | webflowVideo.processAllYouTubeNorel(); 61 | 62 | // Handle background videos. 63 | webflowVideo.processAllDataPosterUrls(); 64 | 65 | } 66 | 67 | // Auto-execute on DOM load 68 | if (document.readyState !== 'loading') { 69 | init(); 70 | } else { 71 | document.addEventListener("DOMContentLoaded", init); 72 | } -------------------------------------------------------------------------------- /src/storage-utils.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * SA5 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * Storage Utilities 9 | */ 10 | 11 | 12 | 13 | export class StorageUtils { 14 | 15 | static get localStorageAvailable(): boolean { 16 | try { 17 | const test = "__test__"; 18 | localStorage.setItem(test, test); 19 | localStorage.removeItem(test); 20 | return true; 21 | } catch { 22 | return false; 23 | } 24 | } 25 | 26 | static get sessionStorageAvailable(): boolean { 27 | try { 28 | const test = "__test__"; 29 | sessionStorage.setItem(test, test); 30 | sessionStorage.removeItem(test); 31 | return true; 32 | } catch { 33 | return false; 34 | } 35 | } 36 | 37 | static get cookiesAvailable(): boolean { 38 | try { 39 | const test = "__test__=1"; 40 | document.cookie = test + "; path=/"; 41 | const cookies = document.cookie; 42 | const available = cookies.includes("__test__=1"); 43 | document.cookie = "__test__=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; 44 | return available; 45 | } catch { 46 | return false; 47 | } 48 | } 49 | 50 | } 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/utils/utm-link.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * SA5 3 | * UTM Link 4 | */ 5 | 6 | export class Sa5UtmLink { 7 | 8 | elem: HTMLAnchorElement; 9 | 10 | constructor(link: HTMLAnchorElement) { 11 | this.elem = link; 12 | } 13 | 14 | init() { 15 | 16 | this.elem.href = Sa5UtmLink.applyUTMParametersFromAttrs(this.elem.href, this.elem); 17 | 18 | } 19 | 20 | static applyUTMParametersFromAttrs(urlString: string, utmElem: HTMLElement): string { 21 | const url = new URL(urlString); 22 | const params = url.searchParams; 23 | 24 | // Custom attribute names 25 | const utmAttributes = { 26 | 'wfu-link-utm-source': 'utm_source', 27 | 'wfu-link-utm-medium': 'utm_medium', 28 | 'wfu-link-utm-campaign': 'utm_campaign', 29 | 'wfu-link-utm-content': 'utm_content' 30 | }; 31 | 32 | // Update UTM parameters if custom attributes exist 33 | for (const [customAttr, utmParam] of Object.entries(utmAttributes)) { 34 | const attrValue = utmElem.getAttribute(customAttr); 35 | if (attrValue) { 36 | params.set(utmParam, encodeURIComponent(attrValue)); 37 | } 38 | } 39 | 40 | // Update the anchor element's href with the new query string 41 | return url.toString(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/version.ts: -------------------------------------------------------------------------------- 1 | 2 | export const VERSION = '5.8.1'; // Update this manually on each release 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/webflow-cache/cache-item.ts: -------------------------------------------------------------------------------- 1 | import { Sa5CacheItemTyped } from "./cache-item-typed"; 2 | 3 | 4 | 5 | 6 | 7 | export class Sa5CacheItem extends Sa5CacheItemTyped { 8 | 9 | constructor(customConfig = {}) { 10 | super(customConfig) 11 | } 12 | 13 | async getAsync(): Promise { 14 | 15 | return await super.getAsync() as string; 16 | } 17 | 18 | async setAsync(value: string) { 19 | await super.setAsync(value); 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/webflow-core/IDeckNavigation.ts: -------------------------------------------------------------------------------- 1 | 2 | interface IDeckNavigation { 3 | 4 | // Methods 5 | goToFirst(): void; 6 | goToLast(): void; 7 | goToNext(): void; 8 | goToNextLoop(): void; 9 | goToPrev(): void; 10 | goToPrevLoop(): void; 11 | goTo(index: number): void; 12 | goToName(name: string): void; 13 | 14 | // Properties with getter and setter 15 | currentNum: number; // This acts as a shorthand for both getter and setter 16 | currentIndex: number; 17 | count: number; 18 | 19 | // If you want to define explicit get and set methods: 20 | // getCurrentNum(): number; 21 | // setCurrentNum(value: number): void; 22 | // getCurrentIndex(): number; 23 | // setCurrentIndex(value: number): void; 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /src/webflow-core/designer.ts: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * webflow-core 4 | * 5 | * Sygnal Technology Group 6 | * https://www.sygnal.com 7 | * 8 | * Designer Utilities 9 | */ 10 | 11 | import { Sa5Attribute } from "../globals"; 12 | 13 | 14 | 15 | export class Sa5Designer { 16 | 17 | constructor() { 18 | 19 | } 20 | 21 | init() { 22 | this.removeDesignTimeElements(); 23 | } 24 | 25 | // Remove any element tagged for design-time-only 26 | // used typically for in-designer