├── .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 |
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