├── .github └── FUNDING.yml ├── .gitignore ├── .travis.yml ├── Gruntfile.js ├── LICENSE ├── README.md ├── core-test ├── helpers │ ├── functions │ │ ├── _addSuccessClass.js │ │ ├── _fail.js │ │ ├── _getCookie.js │ │ ├── _getFileName.js │ │ ├── _getObj.js │ │ ├── _hasClassObj.js │ │ ├── _initTest.js │ │ ├── _isPartiallyVisible.js │ │ └── _shouldBe.js │ └── start │ │ └── helpers-start.js ├── pend-for-now │ ├── ajax-form-preview │ │ ├── checkAjaxFormPreview.acss │ │ └── checkAjaxFormPreview.js │ ├── ajax-form-submit │ │ ├── checkAjaxFormSubmit.acss │ │ └── checkAjaxFormSubmit.js │ ├── console-log │ │ ├── checkConsoleLog.acss │ │ └── checkConsoleLog.js │ ├── copy-to-clipboard │ │ ├── checkCopyToClipboard.acss │ │ └── checkCopyToClipboard.js │ ├── fullscreen-exit │ │ ├── checkFullscreenExit.acss │ │ └── checkFullscreenExit.js │ ├── fullscreen-on │ │ ├── checkFullscreenOn.acss │ │ └── checkFullscreenOn.js │ ├── location │ │ ├── checkLocation.acss │ │ └── checkLocation.js │ ├── media-control │ │ ├── checkMediaControl.acss │ │ └── checkMediaControl.js │ ├── mimic-into │ │ ├── checkMimicInto.acss │ │ └── checkMimicInto.js │ ├── select-all │ │ ├── checkSelectAll.acss │ │ └── checkSelectAll.js │ └── select-none │ │ ├── checkSelectNone.acss │ │ └── checkSelectNone.js ├── startup │ ├── compiled │ │ ├── core-test-config.acss │ │ └── core-test-js.js │ ├── core-test-settings.js │ └── core-test-start.js └── tests │ ├── commands │ └── built-in │ │ ├── add-class │ │ ├── checkAddClass.acss │ │ └── checkAddClass.js │ │ ├── ajax-pre-get │ │ ├── checkAjaxPreGet.acss │ │ └── checkAjaxPreGet.js │ │ ├── ajax │ │ ├── checkAjax.acss │ │ ├── checkAjax.js │ │ ├── checkAjaxError.acss │ │ └── checkAjaxError.js │ │ ├── alert │ │ ├── checkAlert.acss │ │ └── checkAlert.js │ │ ├── blur │ │ ├── checkBlur.acss │ │ └── checkBlur.js │ │ ├── cancel-timer │ │ ├── checkCancelTimer.acss │ │ └── checkCancelTimer.js │ │ ├── click-on-first │ │ ├── checkClickOnFirst.acss │ │ └── checkClickOnFirst.js │ │ ├── click-on-last │ │ ├── checkClickOnLast.acss │ │ └── checkClickOnLast.js │ │ ├── click-on-next-cycle │ │ ├── checkClickOnNextCycle.acss │ │ └── checkClickOnNextCycle.js │ │ ├── click-on-next │ │ ├── checkClickOnNext.acss │ │ └── checkClickOnNext.js │ │ ├── click-on-previous-cycle │ │ ├── checkClickOnPreviousCycle.acss │ │ └── checkClickOnPreviousCycle.js │ │ ├── click-on-previous │ │ ├── checkClickOnPrevious.acss │ │ └── checkClickOnPrevious.js │ │ ├── clickoutside-event │ │ ├── checkClickoutsideEvent.acss │ │ └── checkClickoutsideEvent.js │ │ ├── clone │ │ ├── checkClone.acss │ │ └── checkClone.js │ │ ├── create-command │ │ ├── checkCreateCommand.acss │ │ └── checkCreateCommand.js │ │ ├── create-conditional │ │ ├── checkCreateConditional.acss │ │ └── checkCreateConditional.js │ │ ├── create-element │ │ ├── checkCreateElement.acss │ │ └── checkCreateElement.js │ │ ├── eval │ │ ├── checkEval.acss │ │ └── checkEval.js │ │ ├── focus-off │ │ ├── checkFocusOff.acss │ │ └── checkFocusOff.js │ │ ├── focus-on-first │ │ ├── checkFocusOnFirst.acss │ │ └── checkFocusOnFirst.js │ │ ├── focus-on-last │ │ ├── checkFocusOnLast.acss │ │ └── checkFocusOnLast.js │ │ ├── focus-on-next-cycle │ │ ├── checkFocusOnNextCycle.acss │ │ └── checkFocusOnNextCycle.js │ │ ├── focus-on-next │ │ ├── checkFocusOnNext.acss │ │ └── checkFocusOnNext.js │ │ ├── focus-on-previous-cycle │ │ ├── checkFocusOnPreviousCycle.acss │ │ └── checkFocusOnPreviousCycle.js │ │ ├── focus-on-previous │ │ ├── checkFocusOnPrevious.acss │ │ └── checkFocusOnPrevious.js │ │ ├── focus-on │ │ ├── checkFocusOn.acss │ │ └── checkFocusOn.js │ │ ├── form-reset │ │ ├── checkFormReset.acss │ │ └── checkFormReset.js │ │ ├── func │ │ ├── checkFunc.acss │ │ └── checkFunc.js │ │ ├── iframe-reload │ │ ├── checkIframeReload.acss │ │ └── checkIframeReload.js │ │ ├── load-config │ │ ├── checkLoadConfig.acss │ │ └── checkLoadConfig.js │ │ ├── load-images │ │ ├── checkLoadImages.acss │ │ └── checkLoadImages.js │ │ ├── load-script │ │ ├── checkLoadScript.acss │ │ └── checkLoadScript.js │ │ ├── load-style │ │ ├── checkLoadStyle.acss │ │ └── checkLoadStyle.js │ │ ├── prevent-default │ │ ├── checkPreventDefault.acss │ │ ├── checkPreventDefault.js │ │ ├── checkPreventDefaultShadow.acss │ │ └── checkPreventDefaultShadow.js │ │ ├── remove-attribute │ │ ├── checkRemoveAttribute.acss │ │ └── checkRemoveAttribute.js │ │ ├── remove-class │ │ ├── checkRemoveClass.acss │ │ └── checkRemoveClass.js │ │ ├── remove-clone │ │ ├── checkRemoveClone.acss │ │ └── checkRemoveClone.js │ │ ├── remove-cookie │ │ ├── checkRemoveCookie.acss │ │ └── checkRemoveCookie.js │ │ ├── remove-property │ │ ├── checkRemoveProperty.acss │ │ └── checkRemoveProperty.js │ │ ├── remove │ │ ├── checkRemove.acss │ │ └── checkRemove.js │ │ ├── render-after-begin │ │ ├── checkRenderAfterBegin.acss │ │ └── checkRenderAfterBegin.js │ │ ├── render-after-end │ │ ├── checkRenderAfterEnd.acss │ │ └── checkRenderAfterEnd.js │ │ ├── render-before-begin │ │ ├── checkRenderBeforeBegin.acss │ │ └── checkRenderBeforeBegin.js │ │ ├── render-before-end │ │ ├── checkRenderBeforeEnd.acss │ │ └── checkRenderBeforeEnd.js │ │ ├── render-replace │ │ ├── checkRenderReplace.acss │ │ └── checkRenderReplace.js │ │ ├── render │ │ ├── checkRender.acss │ │ └── checkRender.js │ │ ├── restore-clone │ │ ├── checkRestoreClone.acss │ │ └── checkRestoreClone.js │ │ ├── run │ │ ├── checkRun.acss │ │ └── checkRun.js │ │ ├── scroll-into-view │ │ ├── checkScrollIntoView.acss │ │ └── checkScrollIntoView.js │ │ ├── scroll-x │ │ ├── checkScrollX.acss │ │ └── checkScrollX.js │ │ ├── scroll-y │ │ ├── checkScrollY.acss │ │ └── checkScrollY.js │ │ ├── set-attribute │ │ ├── checkSetAttribute.acss │ │ ├── checkSetAttribute.js │ │ ├── checkSetAttributeHtmlEntityDecode.acss │ │ └── checkSetAttributeHtmlEntityDecode.js │ │ ├── set-class │ │ ├── checkSetClass.acss │ │ └── checkSetClass.js │ │ ├── set-cookie │ │ ├── checkSetCookie.acss │ │ └── checkSetCookie.js │ │ ├── set-property │ │ ├── checkSetProperty.acss │ │ └── checkSetProperty.js │ │ ├── stop-event-propagation │ │ ├── checkStopEventPropagation.acss │ │ └── checkStopEventPropagation.js │ │ ├── stop-immediate-event-propagation │ │ ├── checkStopImmediateEventPropagation.acss │ │ └── checkStopImmediateEventPropagation.js │ │ ├── stop-immediate-propagation │ │ ├── checkStopImmediatePropagation.acss │ │ └── checkStopImmediatePropagation.js │ │ ├── stop-propagation │ │ ├── checkStopPropagation.acss │ │ └── checkStopPropagation.js │ │ ├── style │ │ ├── checkStyle.acss │ │ └── checkStyle.js │ │ ├── take-class │ │ ├── checkTakeClass.acss │ │ └── checkTakeClass.js │ │ ├── toggle-class │ │ ├── checkToggleClass.acss │ │ └── checkToggleClass.js │ │ ├── trigger-real │ │ ├── checkTriggerReal.acss │ │ └── checkTriggerReal.js │ │ ├── trigger │ │ ├── checkTrigger.acss │ │ └── checkTrigger.js │ │ ├── url-change │ │ ├── checkUrlChange.acss │ │ └── checkUrlChange.js │ │ └── var │ │ ├── checkVar.acss │ │ └── checkVar.js │ ├── conditionals │ └── if-var │ │ ├── checkIfVar.acss │ │ └── checkIfVar.js │ ├── core │ ├── await │ │ ├── await-ajax.acss │ │ ├── await-ajax.js │ │ ├── await.acss │ │ └── await.js │ ├── comments │ │ ├── comments.acss │ │ └── comments.js │ ├── continue-after-element-removal │ │ ├── continueAfterElementRemoval.acss │ │ └── continueAfterElementRemoval.js │ └── quote-check-on-set-attribute-and-set-property │ │ ├── quoteCheckOnSetAttributeAndSetProperty.acss │ │ └── quoteCheckOnSetAttributeAndSetProperty.js │ ├── initialize │ └── core-test-config-base.acss │ ├── resource-files │ ├── ajax-pre-get-test-1.txt │ ├── ajax-test-1.txt │ ├── building-cliff-clouds-67235-tn.jpg │ ├── cat2.gif │ ├── cat3.gif │ ├── load-config-test.acss │ ├── load-script-test.js │ ├── load-style-test-shadow.css │ ├── load-style-test.css │ └── tiny.png │ └── to-run-first │ └── cancel-timer-all │ ├── checkCancelTimerAll.acss │ └── checkCancelTimerAll.js ├── dist ├── v-1-0-0 │ ├── causejs-1-0-0.min.js │ └── causejs-dev-1-0-0.min.js ├── v-2-0-0 │ ├── activecss-2-0-0.min.js │ ├── activecss-babel-2-0-0.min.js │ ├── activecss-babel-dev-2-0-0.min.js │ ├── activecss-core-dev-2-0-0.js │ ├── activecss-dev-2-0-0.min.js │ └── full-source │ │ ├── activecss-babel-2-0-0.js │ │ ├── activecss-babel-dev-2-0-0.js │ │ └── prod.js ├── v-2-0-1 │ ├── activecss-2-0-1.min.js │ ├── activecss-babel-2-0-1.min.js │ ├── activecss-babel-dev-2-0-1.min.js │ ├── activecss-core-dev-2-0-1.js │ ├── activecss-dev-2-0-1.min.js │ └── full-source │ │ ├── activecss-babel-2-0-1.js │ │ ├── activecss-babel-dev-2-0-1.js │ │ └── prod.js ├── v-2-1-0 │ ├── activecss-2-1-0.min.js │ ├── activecss-babel-2-1-0.min.js │ ├── activecss-babel-dev-2-1-0.min.js │ ├── activecss-core-dev-2-1-0.js │ ├── activecss-dev-2-1-0.min.js │ └── full-source │ │ ├── activecss-babel-2-1-0.js │ │ ├── activecss-babel-dev-2-1-0.js │ │ └── prod.js ├── v-2-1-1 │ ├── activecss-2-1-1.min.js │ ├── activecss-babel-2-1-1.min.js │ ├── activecss-babel-dev-2-1-1.min.js │ ├── activecss-core-dev-2-1-1.js │ ├── activecss-dev-2-1-1.min.js │ └── full-source │ │ ├── activecss-babel-2-1-1.js │ │ ├── activecss-babel-dev-2-1-1.js │ │ └── prod.js ├── v-2-1-2 │ ├── activecss-2-1-2.min.js │ ├── activecss-core-dev-2-1-2.js │ ├── activecss-dev-2-1-2.min.js │ └── full-source │ │ └── prod.js ├── v-2-10-0 │ ├── activecss-2-10-0.min.js │ ├── activecss-core-dev-2-10-0.js │ ├── activecss-dev-2-10-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-11-0 │ ├── activecss-2-11-0.min.js │ ├── activecss-core-dev-2-11-0.js │ ├── activecss-dev-2-11-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-11-1 │ ├── activecss-2-11-1.min.js │ ├── activecss-core-dev-2-11-1.js │ ├── activecss-dev-2-11-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-11-2 │ ├── activecss-2-11-2.min.js │ ├── activecss-core-dev-2-11-2.js │ ├── activecss-dev-2-11-2.min.js │ └── full-source │ │ └── prod.js ├── v-2-12-0 │ ├── activecss-2-12-0.min.js │ ├── activecss-core-dev-2-12-0.js │ ├── activecss-dev-2-12-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-12-1 │ ├── activecss-2-12-1.min.js │ ├── activecss-core-dev-2-12-1.js │ ├── activecss-dev-2-12-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-13-0 │ ├── activecss-2-13-0.min.js │ ├── activecss-core-dev-2-13-0.js │ ├── activecss-dev-2-13-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-14-0 │ ├── activecss-2-14-0.min.js │ ├── activecss-core-dev-2-14-0.js │ ├── activecss-dev-2-14-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-15-0 │ ├── activecss-2-15-0.min.js │ ├── activecss-core-dev-2-15-0.js │ ├── activecss-dev-2-15-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-2-0 │ ├── activecss-2-2-0.min.js │ ├── activecss-core-dev-2-2-0.js │ ├── activecss-dev-2-2-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-2-1 │ ├── activecss-2-2-1.min.js │ ├── activecss-core-dev-2-2-1.js │ ├── activecss-dev-2-2-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-2-2 │ ├── activecss-2-2-2.min.js │ ├── activecss-core-dev-2-2-2.js │ ├── activecss-dev-2-2-2.min.js │ └── full-source │ │ └── prod.js ├── v-2-2-3 │ ├── activecss-2-2-3.min.js │ ├── activecss-core-dev-2-2-3.js │ ├── activecss-dev-2-2-3.min.js │ └── full-source │ │ └── prod.js ├── v-2-2-4 │ ├── activecss-2-2-4.min.js │ ├── activecss-core-dev-2-2-4.js │ ├── activecss-dev-2-2-4.min.js │ └── full-source │ │ └── prod.js ├── v-2-3-0 │ ├── activecss-2-3-0.min.js │ ├── activecss-core-dev-2-3-0.js │ ├── activecss-dev-2-3-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-4-0 │ ├── activecss-2-4-0.min.js │ ├── activecss-core-dev-2-4-0.js │ ├── activecss-dev-2-4-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-4-1 │ ├── activecss-2-4-1.min.js │ ├── activecss-core-dev-2-4-1.js │ ├── activecss-dev-2-4-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-4-2 │ ├── activecss-2-4-2.min.js │ ├── activecss-core-dev-2-4-2.js │ ├── activecss-dev-2-4-2.min.js │ └── full-source │ │ └── prod.js ├── v-2-4-3 │ ├── activecss-2-4-3.min.js │ ├── activecss-core-dev-2-4-3.js │ ├── activecss-dev-2-4-3.min.js │ └── full-source │ │ └── prod.js ├── v-2-5-0 │ ├── activecss-2-5-0.min.js │ ├── activecss-core-dev-2-5-0.js │ ├── activecss-dev-2-5-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-5-1 │ ├── activecss-2-5-1.min.js │ ├── activecss-core-dev-2-5-1.js │ ├── activecss-dev-2-5-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-5-2 │ ├── activecss-2-5-2.min.js │ ├── activecss-core-dev-2-5-2.js │ ├── activecss-dev-2-5-2.min.js │ └── full-source │ │ └── prod.js ├── v-2-6-0 │ ├── activecss-2-6-0.min.js │ ├── activecss-core-dev-2-6-0.js │ ├── activecss-dev-2-6-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-6-1 │ ├── activecss-2-6-1.min.js │ ├── activecss-core-dev-2-6-1.js │ ├── activecss-dev-2-6-1.min.js │ └── full-source │ │ └── prod.js ├── v-2-7-0 │ ├── activecss-2-7-0.min.js │ ├── activecss-core-dev-2-7-0.js │ ├── activecss-dev-2-7-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-8-0 │ ├── activecss-2-8-0.min.js │ ├── activecss-core-dev-2-8-0.js │ ├── activecss-dev-2-8-0.min.js │ └── full-source │ │ └── prod.js ├── v-2-9-0 │ ├── activecss-2-9-0.min.js │ ├── activecss-core-dev-2-9-0.js │ ├── activecss-dev-2-9-0.min.js │ └── full-source │ │ └── prod.js └── v-2-9-1 │ ├── activecss-2-9-1.min.js │ ├── activecss-core-dev-2-9-1.js │ ├── activecss-dev-2-9-1.min.js │ └── full-source │ └── prod.js ├── karma.conf.js ├── logo ├── activecss-150.jpg ├── activecss-250.jpg └── activecss-50.jpg ├── package-lock.json ├── package.json └── src ├── commands ├── built-in │ ├── AddClass.js │ ├── AddHash.js │ ├── Ajax.js │ ├── AjaxFormPreview.js │ ├── AjaxFormSubmit.js │ ├── AjaxPreGet.js │ ├── Alert.js │ ├── Blur.js │ ├── Break.js │ ├── CancelPause.js │ ├── CancelTimer.js │ ├── CancelTimerAll.js │ ├── ClickOnFirst.js │ ├── ClickOnLast.js │ ├── ClickOnNext.js │ ├── ClickOnNextCycle.js │ ├── ClickOnPrevious.js │ ├── ClickOnPreviousCycle.js │ ├── ClickoutsideEvent.js │ ├── Clone.js │ ├── ConsoleLog.js │ ├── Continue.js │ ├── CopyToClipboard.js │ ├── CreateCommand.js │ ├── CreateConditional.js │ ├── CreateElement.js │ ├── DialogClose.js │ ├── DialogShow.js │ ├── DocumentTitle.js │ ├── Empty.js │ ├── Eval.js │ ├── Exit.js │ ├── ExitTarget.js │ ├── FadeIn.js │ ├── FadeOut.js │ ├── FadeTo.js │ ├── FocusOff.js │ ├── FocusOn.js │ ├── FocusOnFirst.js │ ├── FocusOnLast.js │ ├── FocusOnNext.js │ ├── FocusOnNextCycle.js │ ├── FocusOnPrevious.js │ ├── FocusOnPreviousCycle.js │ ├── FormReset.js │ ├── Fullscreen.js │ ├── FullscreenExit.js │ ├── FullscreenOn.js │ ├── Func.js │ ├── IframeReload.js │ ├── LoadAsAjax.js │ ├── LoadConfig.js │ ├── LoadImages.js │ ├── LoadScript.js │ ├── LoadStyle.js │ ├── Location.js │ ├── MediaControl.js │ ├── MimicInto.js │ ├── Pause.js │ ├── PreventDefault.js │ ├── Print.js │ ├── Remove.js │ ├── RemoveAttribute.js │ ├── RemoveClass.js │ ├── RemoveClone.js │ ├── RemoveCookie.js │ ├── RemoveHash.js │ ├── RemoveProperty.js │ ├── Render.js │ ├── RenderAfterBegin.js │ ├── RenderAfterEnd.js │ ├── RenderBeforeBegin.js │ ├── RenderBeforeEnd.js │ ├── RenderReplace.js │ ├── RestoreClone.js │ ├── Run.js │ ├── ScrollIntoView.js │ ├── ScrollX.js │ ├── ScrollY.js │ ├── SelectAll.js │ ├── SelectNone.js │ ├── SetAttribute.js │ ├── SetClass.js │ ├── SetCookie.js │ ├── SetProperty.js │ ├── SlideDown.js │ ├── SlideUp.js │ ├── StopEventPropagation.js │ ├── StopImmediateEventPropagation.js │ ├── StopImmediatePropagation.js │ ├── StopPropagation.js │ ├── Style.js │ ├── TakeClass.js │ ├── ToggleAttribute.js │ ├── ToggleClass.js │ ├── ToggleTakeClass.js │ ├── Trigger.js │ ├── TriggerFresh.js │ ├── TriggerReal.js │ ├── UrlChange.js │ ├── UrlReplace.js │ ├── Var.js │ └── VarDelete.js └── external-commands │ ├── first.js │ ├── last.js │ ├── next.js │ ├── nextCycle.js │ ├── previous.js │ ├── previousCycle.js │ ├── trigger.js │ ├── triggerFresh.js │ └── triggerReal.js ├── conditionals ├── IfChecked.js ├── IfCompletelyVisible.js ├── IfCompletelyVisibleX.js ├── IfCompletelyVisibleY.js ├── IfCookieEquals.js ├── IfCookieExists.js ├── IfDefined.js ├── IfDisplay.js ├── IfEmpty.js ├── IfEmptyTrimmed.js ├── IfExists.js ├── IfFocusFirst.js ├── IfFocusLast.js ├── IfFormChanged.js ├── IfFullscreen.js ├── IfFunc.js ├── IfHas.js ├── IfHasClass.js ├── IfInnerHtml.js ├── IfInnerText.js ├── IfMaxHeight.js ├── IfMaxLength.js ├── IfMaxWidth.js ├── IfMediaMaxWidth.js ├── IfMediaMinWidth.js ├── IfMinHeight.js ├── IfMinLength.js ├── IfMinWidth.js ├── IfScrolltopGreater.js ├── IfScrolltopLess.js ├── IfSelection.js ├── IfValue.js ├── IfVar.js ├── IfVarTrue.js ├── IfVisible.js └── MqlTrue.js ├── core ├── _core-end.js ├── _core-start.js ├── await-handling │ ├── _immediateStop.js │ ├── _isSyncQueueSet.js │ ├── _pause.js │ ├── _pauseHandler.js │ ├── _setResumeObj.js │ ├── _syncCheckAndSet.js │ ├── _syncEmpty.js │ ├── _syncRestart.js │ └── _syncStore.js ├── delay-handling │ ├── _addCancelAttr.js │ ├── _clearTimeouts.js │ ├── _delaySplit.js │ ├── _getDelayRef.js │ ├── _removeCancel.js │ ├── _setupLabelData.js │ ├── _unloadAllCancelTimer.js │ └── _unloadAllCancelTimerLoop.js ├── runtime │ ├── _actionValLoop.js │ ├── _addInlinePriorToRender.js │ ├── _checkCond.js │ ├── _checkScopeForEv.js │ ├── _cleanUpAfterPause.js │ ├── _cloneAttrs.js │ ├── _deleteIDVars.js │ ├── _deleteScopeVars.js │ ├── _escapeInline.js │ ├── _handleClickOutside.js │ ├── _handleCompIO.js │ ├── _handleCompInnerHTMLEvents.js │ ├── _handleDrawScope.js │ ├── _handleEvents.js │ ├── _handleFunc.js │ ├── _handleObserveEvents.js │ ├── _handleShadowSpecialEvents.js │ ├── _handleSpaPop.js │ ├── _handleVarsInJS.js │ ├── _mainEventLoop.js │ ├── _nextFunc.js │ ├── _nodeMutations.js │ ├── _passesConditional.js │ ├── _performAction.js │ ├── _performActionDo.js │ ├── _performEvent.js │ ├── _performSecSel.js │ ├── _performSecSelDo.js │ ├── _performTarget.js │ ├── _performTargetOuter.js │ ├── _recursiveScopeCleanUp.js │ ├── _renderCompDoms.js │ ├── _renderCompDomsClean.js │ ├── _renderCompDomsDo.js │ ├── _renderIt.js │ ├── _renderRefElements.js │ ├── _replaceEventVars.js │ ├── _replaceHTMLVars.js │ ├── _replaceIframeEsc.js │ ├── _resolveDocObj.js │ ├── _resolveDynamicIframes.js │ ├── _resolveDynamicIframesDo.js │ ├── _run.js │ ├── _runInnerEvent.js │ ├── _setHashEvent.js │ ├── _setUpForObserve.js │ ├── _setUpNavAttrs.js │ ├── _setupIntersectionObserver.js │ ├── _shadowNodeMutations.js │ ├── _sortOutDynamicIframes.js │ ├── _trigHashState.js │ └── flow-statements │ │ ├── _checkBreakLoop.js │ │ ├── _checkExitTarget.js │ │ ├── _checkRunLoop.js │ │ ├── _decrBreakContinue.js │ │ ├── _getLoopCommand.js │ │ ├── _handleLoop.js │ │ ├── _resetContinue.js │ │ ├── _resetExitTarget.js │ │ ├── _runSecSelOrAction.js │ │ ├── css-at-statement │ │ └── _handleCSSAtStatement.js │ │ ├── each │ │ ├── _handleEach.js │ │ ├── _handleEachArrayInner.js │ │ ├── _handleEachArrayOuter.js │ │ └── _handleEachObj.js │ │ ├── for │ │ ├── _handleFor.js │ │ ├── _handleForItem.js │ │ └── _loopVarToNumber.js │ │ ├── if │ │ ├── _handleIf.js │ │ ├── _replaceConditionalsExpr.js │ │ ├── _runAtIfConds.js │ │ └── _runIf.js │ │ └── while │ │ ├── _handleWhile.js │ │ └── _handleWhileItem.js ├── startup │ ├── _addACSSStyleTag.js │ ├── _addConfig.js │ ├── _addConfigError.js │ ├── _addToSystemInit.js │ ├── _assignLoopToConfig.js │ ├── _assignRule.js │ ├── _attachCompInnerHTMLEvs.js │ ├── _attachListener.js │ ├── _checkPassiveState.js │ ├── _convConfig.js │ ├── _extractCompInnerHTMLEvs.js │ ├── _getInline.js │ ├── _getPosOfRule.js │ ├── _initScriptTrack.js │ ├── _isFromFile.js │ ├── _iterateConditionals.js │ ├── _iteratePageList.js │ ├── _iterateRules.js │ ├── _makeVirtualConfig.js │ ├── _mapRegexReturn.js │ ├── _parseConfig.js │ ├── _readSiteMap.js │ ├── _regenConfig.js │ ├── _runInlineLoaded.js │ ├── _setupEvent.js │ ├── _setupMediaQueryHandler.js │ ├── _setupPassive.js │ ├── _sortOutEscapeChars.js │ ├── _startMainListen.js │ ├── _wrapUpStart.js │ ├── css-extraction │ │ ├── addCSSToBody.js │ │ ├── cssExtractAddTags.js │ │ ├── cssExtractConcat.js │ │ ├── cssExtractGetRef.js │ │ ├── cssExtractInit.js │ │ └── cssExtractRemoveTag.js │ └── init.js └── var-handling │ ├── _addScopedAttr.js │ ├── _addScopedCID.js │ ├── _allowResolve.js │ ├── _basicOVarEval.js │ ├── _escapeItem.js │ ├── _evalVarString.js │ ├── _extractVarsFromPars.js │ ├── _getBaseVar.js │ ├── _getScopedVar.js │ ├── _handleVars.js │ ├── _observableSlim.js │ ├── _preReplaceVar.js │ ├── _prefixScopedVars.js │ ├── _removeVarPlaceholders.js │ ├── _replaceAttrs.js │ ├── _replaceComponents.js │ ├── _replaceJSExpression.js │ ├── _replaceRand.js │ ├── _replaceScopedVars.js │ ├── _replaceScopedVarsDo.js │ ├── _replaceScopedVarsExpr.js │ ├── _replaceStringVars.js │ ├── _resolvable.js │ ├── _resolveAjaxVars.js │ ├── _resolveInheritance.js │ ├── _resolveInheritanceBubble.js │ ├── _resolveInnerBracketVars.js │ ├── _resolveInnerBracketVarsDo.js │ ├── _resolveVars.js │ ├── _restoreStorage.js │ ├── _setACSSVariable.js │ ├── _setCSSProperty.js │ ├── _setCSSVariable.js │ ├── _setHTMLVars.js │ ├── _sortOutFlowEscapeChars.js │ ├── _varChangeToDots.js │ ├── _varFixArr.js │ ├── _varUpdateDom.js │ └── getVar.js ├── dev-version ├── common │ ├── _deHighlightDOM.js │ ├── _drawHighlight.js │ ├── _hasSetupEnded.js │ ├── _highlightDOM.js │ ├── _sendMessage.js │ ├── _sendOverMediaQueries.js │ ├── _stripOffConditionals.js │ ├── _tellElementsToUpdate.js │ └── _tellPanelToUpdate.js ├── elements │ ├── _addToConfig.js │ ├── _checkEvEditor.js │ ├── _checkEventDupe.js │ ├── _checkPrimSel.js │ ├── _cleanUpRuleValue.js │ ├── _editConfig.js │ ├── _formatConditional.js │ ├── _inspectEl.js │ ├── _miniHandleEventForEditor.js │ ├── _removeArrItem.js │ ├── _removeFromConfig.js │ ├── _removeRule.js │ ├── _returnTree.js │ └── _startEvEditor.js └── panel │ ├── _checkDebugger.js │ ├── _debugOutput.js │ ├── _debugOutputFeedback.js │ ├── _sendInitMessages.js │ ├── _sendOverComponents.js │ ├── _sendOverConditionals.js │ ├── _sendOverConfig.js │ ├── _sendOverEvents.js │ ├── _startDebugger.js │ ├── _stopDebugger.js │ └── _stopEvEditor.js └── utils ├── cookies ├── _cookieExists.js └── _getCookie.js ├── file-handling ├── _addActValRaw.js ├── _ajax.js ├── _ajaxCallback.js ├── _ajaxCallbackDisplay.js ├── _ajaxCallbackErr.js ├── _ajaxDisplay.js ├── _ajaxDo.js ├── _appendURIPar.js ├── _attachGetVals.js ├── _attachPostVals.js ├── _getAbsURLFromRel.js ├── _getFile.js ├── _getParVal.js ├── _insertResForComponents.js └── _isPendingAjaxForComponents.js ├── general ├── _absLeft.js ├── _absTop.js ├── _actValSelItem.js ├── _addClassObj.js ├── _checkBoundaries.js ├── _checkForm.js ├── _checkMedia.js ├── _checkSupport.js ├── _clone.js ├── _componentDetails.js ├── _composedPath.js ├── _condDefSelf.js ├── _convertToMS.js ├── _countPlaces.js ├── _decodeHTML.js ├── _dialog.js ├── _doDebug.js ├── _eachRemoveClass.js ├── _endsWithAny.js ├── _err.js ├── _errDisplayLine.js ├── _escCommaBrack.js ├── _escForRegex.js ├── _escInQuo.js ├── _escNoVars.js ├── _escapeInnerQuotes.js ├── _escapeQuo.js ├── _evalDetachedExpr.js ├── _extractBracketPars.js ├── _fade.js ├── _fullscreenDetails.js ├── _getActiveID.js ├── _getAttrOrProp.js ├── _getBaseURL.js ├── _getComponentDetails.js ├── _getComponentRoot.js ├── _getFieldValType.js ├── _getFocusedOfNodes.js ├── _getMinExistingPos.js ├── _getNumber.js ├── _getPageFromList.js ├── _getPastFutureDate.js ├── _getRealEvent.js ├── _getRootNode.js ├── _getScopedRoot.js ├── _getSel.js ├── _getSelector.js ├── _getSels.js ├── _getTempActiveID.js ├── _getValFromList.js ├── _getWindow.js ├── _handleQuoAjax.js ├── _hasClassObj.js ├── _htmlToElement.js ├── _ifFocus.js ├── _ifVisible.js ├── _isACSSStyleTag.js ├── _isComponentable.js ├── _isCond.js ├── _isConnected.js ├── _isDOMObj.js ├── _isInlineLoaded.js ├── _isPositive.js ├── _isPositiveFloat.js ├── _isTextField.js ├── _mimicReset.js ├── _optDef.js ├── _outDebug.js ├── _placeCaretAtEnd.js ├── _prepareDetachedExpr.js ├── _random.js ├── _recursiveDiff.js ├── _removeClassObj.js ├── _removeObj.js ├── _replaceTempActiveID.js ├── _resolveURL.js ├── _safeTags.js ├── _selCompare.js ├── _setClassObj.js ├── _setDocTitle.js ├── _setUnderPage.js ├── _setsrcObj.js ├── _slide.js ├── _takeClass.js ├── _toggleClassObj.js ├── _ucFirst.js ├── _unEscNoVars.js ├── _unHtmlEntities.js ├── _unSafeTags.js ├── _urlTitle.js ├── _warn.js ├── escQuotes.js ├── escapeHTML.js ├── unEscQuotes.js └── unEscapeHTML.js ├── lodash ├── _arrayMap.js ├── _assignValue.js ├── _baseAssignValue.js ├── _baseSet.js ├── _baseToString.js ├── _baseUnset.js ├── _castPath.js ├── _eq.js ├── _get.js ├── _getNative.js ├── _getValue.js ├── _isIndex.js ├── _isKey.js ├── _isObject.js ├── _last.js ├── _parent.js ├── _set.js ├── _slice.js ├── _stringToPath.js ├── _toKey.js ├── _toString.js └── _unset.js └── prototypes ├── _ACSSCapitalize.js ├── _ACSSCapitalizeAttr.js ├── _ACSSConvFunc.js ├── _ACSSRepAllQuo.js ├── _ACSSRepQuo.js ├── _ACSSSpaceQuoIn.js ├── _ACSSSpaceQuoOut.js ├── _edgeHack.js └── _nodelist.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [Active-CSS] 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "13.1.0" 4 | before_install: npm install -g grunt-cli 5 | install: npm install 6 | before_script: grunt 7 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_addSuccessClass.js: -------------------------------------------------------------------------------- 1 | function _addSuccessClass(objOrStr) { 2 | let el = (typeof objOrStr == 'object') ? objOrStr : _getObj(str); 3 | if (_hasClassObj(el, 'failed')) return; 4 | el.classList.add('success'); 5 | } 6 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_getCookie.js: -------------------------------------------------------------------------------- 1 | // From https://www.w3schools.com/js/js_cookies.asp 2 | function _getCookie(cname) { 3 | var name = cname + "="; 4 | var ca = document.cookie.split(';'); 5 | for(var i = 0; i < ca.length; i++) { 6 | var c = ca[i]; 7 | while (c.charAt(0) == ' ') { 8 | c = c.substring(1); 9 | } 10 | if (c.indexOf(name) == 0) { 11 | return c.substring(name.length, c.length); 12 | } 13 | } 14 | return ""; 15 | } 16 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_getFileName.js: -------------------------------------------------------------------------------- 1 | function _getFileName(url) { 2 | // Returns just the filename from a URL. 3 | return url.split('/').pop().split('#')[0].split('?')[0]; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_getObj.js: -------------------------------------------------------------------------------- 1 | function _getObj(str, doc=document) { 2 | let obj = (str == 'body') ? doc.body : doc.querySelector(str); 3 | return (obj) ? obj : false; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_hasClassObj.js: -------------------------------------------------------------------------------- 1 | function _hasClassObj(obj, str) { 2 | if (!obj) return false; 3 | return obj.classList.contains(str) || false; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_initTest.js: -------------------------------------------------------------------------------- 1 | function _initTest(testID) { 2 | // Check test element is there. 3 | let testEl = _getObj('#' + testID); 4 | if (!testEl) { 5 | console.log('Unable to test ' + testID + ' as render/component drawing/something isn\'t working.'); 6 | return null; 7 | } 8 | 9 | // Check if the test element has failed from a previous test. 10 | if (_hasClassObj(testEl, 'failed')) return null; 11 | 12 | // Ok to continue with test. Return the containing test element. 13 | return testEl; 14 | } 15 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_isPartiallyVisible.js: -------------------------------------------------------------------------------- 1 | // This checks if an element is at least partially visible. Used for testing the scroll-into-view command. 2 | function _isPartiallyVisible(el) { 3 | let rect = el.getBoundingClientRect(); 4 | let elTop = rect.top; 5 | let elBot = rect.bottom; 6 | return (elTop < window.innerHeight && elBot >= 0); 7 | } 8 | -------------------------------------------------------------------------------- /core-test/helpers/functions/_shouldBe.js: -------------------------------------------------------------------------------- 1 | // This compares a variable against a value and gives an error to the test element if it fails. 2 | // Successes are skipped. A test will fail if receiving a failing test flag regardless of whether or not a success flag is added for a test. 3 | function _shouldBe(testEl, varName, varVal, comparisonVal) { 4 | let checkVarEl = _initTest('checkVar'); 5 | if (!checkVarEl) return; 6 | 7 | if (varVal !== comparisonVal) { 8 | _fail(checkVarEl, 'The variable "' + varName + '" does not exactly equal ' + comparisonVal + ' it equals:', typeof varVal, varVal); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /core-test/helpers/start/helpers-start.js: -------------------------------------------------------------------------------- 1 | /*jshint strict:false */ 2 | -------------------------------------------------------------------------------- /core-test/pend-for-now/ajax-form-preview/checkAjaxFormPreview.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{{checkAjaxAddress}}
11 | } 12 | } 13 | 14 | #checkAjax:test { 15 | /* Nothing to see here - the test function gets run from afterAjax in the component. */ 16 | } 17 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/ajax/checkAjax.js: -------------------------------------------------------------------------------- 1 | function checkAjax(o) { 2 | let checkAjaxEl = _initTest('checkAjax'); 3 | if (!checkAjaxEl) return; 4 | 5 | let testTitle = _getObj('#checkAjaxTestTitle'); 6 | let testAddress = _getObj('#checkAjaxTestAddress'); 7 | 8 | if (testTitle.innerHTML != 'Rod' || testAddress.innerHTML != '27 Madeup Road, Blithering, Ploushershire.') { 9 | _fail(checkAjaxEl, 'Ajax command failed to update variables automatically.'); 10 | } 11 | 12 | _addSuccessClass(checkAjaxEl); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/ajax/checkAjaxError.acss: -------------------------------------------------------------------------------- 1 | @component checkAjaxErrorHTML { 2 | &:beforeComponentOpen { 3 | ajax: "/base/core-test/tests/resource-files/file-not-there.txt"; 4 | } 5 | &:afterAjaxError { 6 | /* This should run second */ 7 | func: checkAjaxError; 8 | } 9 | &:afterAjax404 { 10 | /* This should run first */ 11 | func: checkAjaxError404; 12 | } 13 | html { 14 | 15 | } 16 | } 17 | 18 | #checkAjaxError:test { 19 | /* Nothing to see here - the test function gets run from afterAjax in the component. */ 20 | } 21 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/ajax/checkAjaxError.js: -------------------------------------------------------------------------------- 1 | function checkAjaxError404(o) { 2 | let checkAjaxErrorEl = _initTest('checkAjaxError'); 3 | if (!checkAjaxErrorEl) return; 4 | 5 | if (window.checkAjaxErrorVar) { 6 | _fail(checkAjaxErrorEl, 'Ajax command failed to call 404 error event first for a missing file.'); 7 | } 8 | 9 | window.checkAjaxErrorVar = true; 10 | } 11 | 12 | function checkAjaxError(o) { 13 | let checkAjaxErrorEl = _initTest('checkAjaxError'); 14 | if (!checkAjaxErrorEl) return; 15 | 16 | if (!window.checkAjaxErrorVar) { 17 | _fail(checkAjaxErrorEl, 'Ajax command failed to call general error event second for a missing file.'); 18 | } 19 | 20 | _addSuccessClass(checkAjaxErrorEl); 21 | } 22 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/alert/checkAlert.acss: -------------------------------------------------------------------------------- 1 | #checkAlert:test { 2 | alert: "checkAlert"; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/alert/checkAlert.js: -------------------------------------------------------------------------------- 1 | // Just need to make this test successful, so we can just replace the native alert call with a success updater. 2 | // Alert should only need to be tested once in the tests. Active CSS shouldn't *ever* produce any alert notifications. 3 | window.alert = function(idToMarkSuccessFul) { 4 | // Out of scope of everything so need to do a manual update on the test element. 5 | let el = document.getElementById(idToMarkSuccessFul); 6 | el.classList.add('success'); 7 | }; 8 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/blur/checkBlur.acss: -------------------------------------------------------------------------------- 1 | @component checkBlurHTML { 2 | html { 3 | 4 | } 5 | } 6 | 7 | #checkBlur:test { 8 | #blurField { 9 | focus-on: self; 10 | func: checkBlurA; 11 | blur: true; 12 | } 13 | func: checkBlurFinal; 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/blur/checkBlur.js: -------------------------------------------------------------------------------- 1 | function checkBlurA(o) { 2 | let checkBlurEl = _initTest('checkBlur'); 3 | if (!checkBlurEl) return; 4 | 5 | let el = _getObj('#blurField'); 6 | 7 | if (!el.isSameNode(document.activeElement)) { 8 | _fail(checkBlurEl, '#blurField is not in focus for the first test and it should be.'); 9 | } 10 | } 11 | 12 | function checkBlurFinal(o) { 13 | let checkBlurEl = _initTest('checkBlur'); 14 | if (!checkBlurEl) return; 15 | 16 | let el = _getObj('#blurField'); 17 | 18 | if (!el.isSameNode(document.activeElement)) { 19 | // That looked good. 20 | _addSuccessClass(checkBlurEl); 21 | } else { 22 | _fail(checkBlurEl, '#blurField in not out of focus at the end.'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/cancel-timer/checkCancelTimer.acss: -------------------------------------------------------------------------------- 1 | @component checkCancelTimerHTML { 2 | html { 3 | 4 | } 5 | } 6 | 7 | #checkCancelTimer:test { 8 | 9 | /* Cancel by action test. */ 10 | func: checkCancelTimerA; 11 | #cancelTimerDiv { 12 | background-color: green after 1s; 13 | func: checkCancelTimerB; 14 | cancel-timer: background-color; 15 | } 16 | 17 | /* Cancel by label test. */ 18 | #cancelTimerDiv { 19 | background-color: green after 1s label greenColor; 20 | func: checkCancelTimerC; 21 | cancel-timer: greenColor; 22 | } 23 | func: checkCancelTimerFinal; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/click-on-first/checkClickOnFirst.acss: -------------------------------------------------------------------------------- 1 | @component checkClickOnFirstHTML { 2 | html { 3 | 10 | 11 | } 12 | } 13 | 14 | #clickOnFirstDiv a:click { 15 | #clickOnFirstP { 16 | render: "{@data-color}"; 17 | } 18 | } 19 | 20 | #checkClickOnFirst:test { 21 | func: checkClickOnFirstA; 22 | click-on-first: #clickOnFirstDiv a after {window.delayTimes.clickOnFirst[0]}ms; 23 | func: checkClickOnFirstFinal after {window.delayTimes.clickOnFirst[1]}ms; 24 | } 25 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/click-on-last/checkClickOnLast.acss: -------------------------------------------------------------------------------- 1 | @component checkClickOnLastHTML { 2 | html { 3 | 10 | 11 | } 12 | } 13 | 14 | #clickOnLastDiv a:click { 15 | #clickOnLastP { 16 | render: "{@data-color}"; 17 | } 18 | } 19 | 20 | #checkClickOnLast:test { 21 | func: checkClickOnLastA; 22 | click-on-last: #clickOnLastDiv a after {window.delayTimes.clickOnLast[0]}ms; 23 | func: checkClickOnLastFinal after {window.delayTimes.clickOnLast[1]}ms; 24 | } 25 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/clickoutside-event/checkClickoutsideEvent.js: -------------------------------------------------------------------------------- 1 | function checkClickoutsideEvent(o) { 2 | let checkClickoutsideEventEl = _initTest('checkClickoutsideEvent'); 3 | if (!checkClickoutsideEventEl) return; 4 | 5 | let bod = document.body; 6 | 7 | if (!_hasClassObj(bod, 'clickoutside1')) { 8 | _fail(checkClickoutsideEventEl, 'The clickoutside1 class has not been set and should have been.'); 9 | } 10 | 11 | if (!_hasClassObj(bod, 'clickoutside2')) { 12 | _fail(checkClickoutsideEventEl, 'The clickoutside2 class has not been set and should have been.'); 13 | } 14 | 15 | _addSuccessClass(checkClickoutsideEventEl); 16 | } 17 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/clone/checkClone.acss: -------------------------------------------------------------------------------- 1 | /* Pended until clone/restore-clone issue 36 has been resolved. 2 | 3 | #content:draw { 4 | render-before-end: "This text is going to be cloned
10 |Text will be inserted in relation to this element.
10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-after-begin/checkRenderAfterBegin.js: -------------------------------------------------------------------------------- 1 | function checkRenderAfterBegin(o) { 2 | let checkRenderAfterBeginEl = _initTest('checkRenderAfterBegin'); 3 | if (!checkRenderAfterBeginEl) return; 4 | 5 | // Check basic render-after-begin command results. 6 | let el = _getObj('#renderAfterBeginHTMLDiv'); 7 | 8 | if (el.innerHTML !== 'render-after-beginText will be inserted in relation to this element.') { 9 | _fail(checkRenderAfterBeginEl, 'Render did not render correctly in the render-after-begin command test area. #renderAfterBeginHTMLDiv.innerHTML:', el.innerHTML); 10 | } 11 | 12 | _addSuccessClass(checkRenderAfterBeginEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-after-end/checkRenderAfterEnd.acss: -------------------------------------------------------------------------------- 1 | @component checkRenderAfterEndHTML { 2 | &:componentOpen { 3 | #renderAfterEndHTMLDiv { 4 | render-after-end: "render-after-end"; 5 | func: checkRenderAfterEnd; 6 | } 7 | } 8 | html { 9 |Text will be inserted in relation to this element.
10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-after-end/checkRenderAfterEnd.js: -------------------------------------------------------------------------------- 1 | function checkRenderAfterEnd(o) { 2 | let checkRenderAfterEndEl = _initTest('checkRenderAfterEnd'); 3 | if (!checkRenderAfterEndEl) return; 4 | 5 | // Check basic render-after-end command results. 6 | let el = _getObj('#renderAfterEndHTMLDiv').nextSibling; 7 | 8 | if (el.outerHTML !== 'render-after-end') { 9 | _fail(checkRenderAfterEndEl, 'Render did not render correctly in the render-after-end command test area. #renderAfterEndHTMLDiv.nextSibling.outerHTML:', el.outerHTML); 10 | } 11 | 12 | _addSuccessClass(checkRenderAfterEndEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-before-begin/checkRenderBeforeBegin.acss: -------------------------------------------------------------------------------- 1 | @component checkRenderBeforeBeginHTML { 2 | &:componentOpen { 3 | #renderBeforeBeginHTMLDiv { 4 | render-before-begin: "render-before-begin"; 5 | func: checkRenderBeforeBegin; 6 | } 7 | } 8 | html { 9 |Text will be inserted in relation to this element.
10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-before-begin/checkRenderBeforeBegin.js: -------------------------------------------------------------------------------- 1 | function checkRenderBeforeBegin(o) { 2 | let checkRenderBeforeBeginEl = _initTest('checkRenderBeforeBegin'); 3 | if (!checkRenderBeforeBeginEl) return; 4 | 5 | // Check basic render-before-begin command results. 6 | let el = _getObj('#renderBeforeBeginHTMLDiv').previousSibling; 7 | 8 | if (el.outerHTML !== 'render-before-begin') { 9 | _fail(checkRenderBeforeBeginEl, 'Render did not render correctly in the render-before-begin command test area. #renderBeforeBeginHTMLDiv.previousSibling.outerHTML:', el.outerHTML); 10 | } 11 | 12 | _addSuccessClass(checkRenderBeforeBeginEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-before-end/checkRenderBeforeEnd.acss: -------------------------------------------------------------------------------- 1 | @component checkRenderBeforeEndHTML { 2 | &:componentOpen { 3 | #renderBeforeEndHTMLDiv { 4 | render-before-end: "render-before-end"; 5 | func: checkRenderBeforeEnd; 6 | } 7 | } 8 | html { 9 |Text will be inserted in relation to this element.
10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-before-end/checkRenderBeforeEnd.js: -------------------------------------------------------------------------------- 1 | function checkRenderBeforeEnd(o) { 2 | let checkRenderBeforeEndEl = _initTest('checkRenderBeforeEnd'); 3 | if (!checkRenderBeforeEndEl) return; 4 | 5 | // Check basic render-before-end command results. 6 | let el = _getObj('#renderBeforeEndHTMLDiv'); 7 | 8 | if (el.innerHTML !== 'Text will be inserted in relation to this element.render-before-end') { 9 | _fail(checkRenderBeforeEndEl, 'Render did not render correctly in the render-before-end command test area. #renderBeforeEndHTMLDiv.innerHTML:', el.innerHTML); 10 | } 11 | 12 | _addSuccessClass(checkRenderBeforeEndEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-replace/checkRenderReplace.acss: -------------------------------------------------------------------------------- 1 | @component checkRenderReplaceHTML { 2 | &:componentOpen { 3 | #renderReplaceHTMLDiv { 4 | render-replace: "Text will be inserted in relation to this element.
Click on a fruit to select it.
4 | 5 |{checkAjaxAddress}
8 | "; 9 | } 10 | func: checkAwaitAjax; 11 | } 12 | html { 13 | 14 | } 15 | } 16 | 17 | #checkAwaitAjax:test { 18 | } 19 | -------------------------------------------------------------------------------- /core-test/tests/core/await/await-ajax.js: -------------------------------------------------------------------------------- 1 | function checkAwaitAjax(o) { 2 | let checkAwaitAjaxEl = _initTest('checkAwaitAjax'); 3 | if (!checkAwaitAjaxEl) return; 4 | 5 | let testTitle = _getObj('#checkAwaitAjaxTestTitle'); 6 | let testAddress = _getObj('#checkAwaitAjaxTestAddress'); 7 | 8 | if (testTitle.innerHTML != 'Rod' || testAddress.innerHTML != '27 Madeup Road, Blithering, Ploushershire.') { 9 | _fail(checkAwaitAjaxEl, 'Ajax command failed to update variables automatically.'); 10 | } 11 | 12 | _addSuccessClass(checkAwaitAjaxEl); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/core/await/await.acss: -------------------------------------------------------------------------------- 1 | @component checkAwaitHTML privateEvents { 2 | &:componentOpen { 3 | div { 4 | add-class: .addClassAwait after 1s await; 5 | } 6 | func: checkAwait; 7 | } 8 | html { 9 | 10 | } 11 | } 12 | 13 | #checkAwait:test { 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/core/await/await.js: -------------------------------------------------------------------------------- 1 | function checkAwait(o) { 2 | let checkAwaitEl = _initTest('checkAwait'); 3 | if (!checkAwaitEl) return; 4 | 5 | let el = _getObj('#checkAwaitDiv'); 6 | 7 | if (!el) { 8 | _fail(checkAwaitEl, 'checkAwaitDiv element not found prior to testing await results.'); 9 | } else { 10 | if (!_hasClassObj(el, 'addClassAwait')) { 11 | _fail(checkAwaitEl, 'checkAwaitDiv element does not contain class "addClassAwait" as expected. el.outerHTML:', el.outerHTML); 12 | } 13 | } 14 | 15 | _addSuccessClass(checkAwaitEl); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /core-test/tests/core/comments/comments.acss: -------------------------------------------------------------------------------- 1 | /* Comment {= hi there =} 2 | */ 3 | @component /* comment */ commentsHTML { 4 | html { 5 | /* comment */ 6 |Active CSS Error: could not find template (' + o.actVal + ').
'; 6 | } else { 7 | if (typeof o.secSelObj == 'object') { 8 | // This is an object that was passed. 9 | o.res = el.innerHTML; 10 | if (o.res != '') { 11 | o.res = _escapeInline(o.res, 'script'); 12 | o.res = _escapeInline(o.res, 'style type="text/acss"'); 13 | } 14 | _setHTMLVars({res: o.res}); 15 | _handleEvents({ obj: o.obj, evType: 'afterLoadAsAjax', eve: o.e, otherObj: o, varScope: o.varScope, evScope: o.evScope, compDoc: o.compDoc, component: o.component, _maEvCo: o._maEvCo }); 16 | } 17 | } 18 | 19 | }; 20 | -------------------------------------------------------------------------------- /src/commands/built-in/LoadConfig.js: -------------------------------------------------------------------------------- 1 | _a.LoadConfig = o => { 2 | // Dynamically load additional config if it has not already been loaded and append to existing unprocessed concatenated config. 3 | o.actVal = o.actVal._ACSSRepQuo(); 4 | _addActValRaw(o); 5 | if (!configArr.includes(o.avRaw)) { 6 | o.file = o.actVal; // We want the original to show in the extensions. 7 | _getFile(o.actVal, 'txt', o); 8 | } else { 9 | // Run the success script - we should still do this, we just didn't need to load the config. 10 | _handleEvents({ obj: o.obj, evType: 'afterLoadConfig', eve: o.e, varScope: o.varScope, evScope: o.evScope, compDoc: o.compDoc, component: o.component, _maEvCo: o._maEvCo }); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/commands/built-in/LoadImages.js: -------------------------------------------------------------------------------- 1 | _a.LoadImages = o => { 2 | // eg. load-images: data-cjs-images 3 | // Looks for all attributes in o.actVal and puts that contents into the src, then removes the attribute. 4 | let attr = o.actVal; 5 | o.doc.querySelectorAll('img[' + attr + '], picture source[' + attr + ']').forEach(function (obj, index) { 6 | let attrName = (obj.tagName == 'IMG') ? 'src' : 'srcset'; 7 | obj.setAttribute(attrName, obj.getAttribute(attr)); 8 | obj.removeAttribute(attr); // So it doesn't try to load it twice. 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /src/commands/built-in/LoadStyle.js: -------------------------------------------------------------------------------- 1 | _a.LoadStyle = o => { _a.LoadScript(o, 'style'); }; 2 | -------------------------------------------------------------------------------- /src/commands/built-in/Location.js: -------------------------------------------------------------------------------- 1 | _a.Location = o => { 2 | let page = o.actVal._ACSSRepQuo(); 3 | if (page == 'reload') { 4 | location.reload(); 5 | } else if (o.doc.contentWindow) { 6 | o.doc.contentWindow.document.location.href = page; 7 | } else { 8 | document.location.href = page; 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/commands/built-in/Pause.js: -------------------------------------------------------------------------------- 1 | // _a.Pause = o => {}; // timings are handled in the core itself. This is here for documentation purposes only. 2 | -------------------------------------------------------------------------------- /src/commands/built-in/PreventDefault.js: -------------------------------------------------------------------------------- 1 | _a.PreventDefault = o => { 2 | if (o.e && o.e.preventDefault) o.e.preventDefault(); // Sometimes will get activated on a browser back-arrow, etc., so check first. 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/Print.js: -------------------------------------------------------------------------------- 1 | _a.Print = o => { 2 | if (o.actVal == 'window') { 3 | window.print(); 4 | } else if (o.actVal == 'parent') { 5 | parent.print(); 6 | } else { 7 | let iframeSel = _getSel(o, o.actVal); 8 | // Check that it's an iframe. 9 | if (iframeSel) { 10 | if (iframeSel.tagName == 'IFRAME') { 11 | iframeSel.contentWindow.print(); 12 | } else { 13 | _err('Printing cannot occur because element is not an iframe: ' + o.actVal, o); 14 | } 15 | } else { 16 | _err('Printing cannot occur if iframe does not exist: ' + o.actVal, o); 17 | } 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /src/commands/built-in/Remove.js: -------------------------------------------------------------------------------- 1 | _a.Remove = o => { 2 | let objs = _getSels(o, o.actVal); 3 | if (!objs) return false; // invalid target. 4 | objs.forEach(function (obj) { 5 | ActiveCSS._removeObj(obj); 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /src/commands/built-in/RemoveAttribute.js: -------------------------------------------------------------------------------- 1 | _a.RemoveAttribute = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.secSelObj.removeAttribute(o.actVal); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RemoveClass.js: -------------------------------------------------------------------------------- 1 | _a.RemoveClass = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | ActiveCSS._removeClassObj(o.secSelObj, o.actVal); 4 | return true; // true used with take-class. 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/RemoveClone.js: -------------------------------------------------------------------------------- 1 | _a.RemoveClone = o => { 2 | let el = _getSel(o, o.actVal); 3 | let ref = _getActiveID(el); 4 | if (ref) mimicClones[ref] = null; 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/RemoveHash.js: -------------------------------------------------------------------------------- 1 | _a.RemoveHash = o => { 2 | o._removeHash = true; 3 | _a.UrlChange(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RemoveProperty.js: -------------------------------------------------------------------------------- 1 | _a.RemoveProperty = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.secSelObj.style.removeProperty(o.actVal); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RenderAfterBegin.js: -------------------------------------------------------------------------------- 1 | _a.RenderAfterBegin = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.renderPos = 'afterbegin'; _a.Render(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RenderAfterEnd.js: -------------------------------------------------------------------------------- 1 | _a.RenderAfterEnd = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.renderPos = 'afterend'; _a.Render(o); 4 | }; -------------------------------------------------------------------------------- /src/commands/built-in/RenderBeforeBegin.js: -------------------------------------------------------------------------------- 1 | _a.RenderBeforeBegin = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.renderPos = 'beforebegin'; _a.Render(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RenderBeforeEnd.js: -------------------------------------------------------------------------------- 1 | _a.RenderBeforeEnd = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.renderPos = 'beforeend'; _a.Render(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/RenderReplace.js: -------------------------------------------------------------------------------- 1 | _a.RenderReplace = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | o.renderPos = 'replace'; _a.Render(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/Run.js: -------------------------------------------------------------------------------- 1 | _a.Run = o => { 2 | _run(o.actVal, o.varScope, o); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/ScrollY.js: -------------------------------------------------------------------------------- 1 | _a.ScrollY = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | if (o.origSecSel == 'body') { 4 | // All of these have been tested. 5 | if (o.actVal == 'top') { 6 | window.scrollTo({ top: 0 }); 7 | } else if (o.actVal == 'bottom') { 8 | window.scrollTo({ top: 10000000 }); // As long as it's greater than the scroll bar it will go to the bottom, as standard. 9 | } else { 10 | window.scrollTo({ top: o.actVal }); 11 | } 12 | } else { 13 | let el = o.secSelObj; 14 | if (el) { 15 | if (o.actVal == 'top') { 16 | el.scrollTop = 0; 17 | } else if (o.actVal == 'bottom') { 18 | el.scrollTop = el.scrollHeight; 19 | } else { 20 | el.scrollTop = o.actVal; 21 | } 22 | } 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /src/commands/built-in/SelectAll.js: -------------------------------------------------------------------------------- 1 | _a.SelectAll = o => { 2 | requestAnimationFrame(() => document.execCommand('selectAll')); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/SelectNone.js: -------------------------------------------------------------------------------- 1 | _a.SelectNone = o => { 2 | getSelection().removeAllRanges(); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/SetAttribute.js: -------------------------------------------------------------------------------- 1 | _a.SetAttribute = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let htmlEntityDecode = false; 4 | let str = o.actVal; 5 | if (str.endsWith(' html-entity-decode')) { 6 | htmlEntityDecode = true; 7 | str = str.substr(0, str.length - 19).trim(); 8 | } 9 | let attrArr = str.split(' '); 10 | let attrName = attrArr.shift(); 11 | let attrVal = attrArr.join(' ')._ACSSRepQuo(); 12 | let strToInsert = (htmlEntityDecode) ? _unHtmlEntities(attrVal) : attrVal; 13 | if (o.func == 'SetProperty') { 14 | o.secSelObj[attrName] = (strToInsert == 'true') ? true : (strToInsert == 'false') ? false : strToInsert; 15 | } else { 16 | o.secSelObj.setAttribute(attrName, strToInsert); 17 | } 18 | }; 19 | -------------------------------------------------------------------------------- /src/commands/built-in/SetClass.js: -------------------------------------------------------------------------------- 1 | _a.SetClass = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let str = o.actVal.replace(/\./g, '')._ACSSRepQuo(); 4 | _setClassObj(o.secSelObj, str); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/SetProperty.js: -------------------------------------------------------------------------------- 1 | _a.SetProperty = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | _a.SetAttribute(o); 4 | _handleObserveEvents(o.doc); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/SlideDown.js: -------------------------------------------------------------------------------- 1 | _a.SlideDown = o => _slide(o, 'down'); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/SlideUp.js: -------------------------------------------------------------------------------- 1 | _a.SlideUp = o => _slide(o, 'up'); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/StopEventPropagation.js: -------------------------------------------------------------------------------- 1 | _a.StopEventPropagation = o => _stopEventPropagation(o); 2 | 3 | const _stopEventPropagation = o => { 4 | // Don't bubble up the Active CSS component element hierarchy. 5 | // Short variable names are used here as there are a lot of passing around of variables and it help keeps the core small. 6 | // maEv = main event object, o._maEvCo = main event object counter 7 | // taEv = target event object, o._taEvCo = target event object counter 8 | if (typeof maEv[o._maEvCo] !== 'undefined') maEv[o._maEvCo]._acssStopEventProp = true; 9 | }; 10 | -------------------------------------------------------------------------------- /src/commands/built-in/StopImmediateEventPropagation.js: -------------------------------------------------------------------------------- 1 | _a.StopImmediateEventPropagation = o => _stopImmediateEventPropagation(o); 2 | 3 | const _stopImmediateEventPropagation = o => { 4 | // Don't bubble up the Active CSS element hierarchy and do any more target selectors. 5 | // Short variable names are used here as there are a lot of passing around of variables and it help keeps the core small. 6 | // maEv = main event object, o._maEvCo = main event object counter 7 | // taEv = target event object, o._taEvCo = target event object counter 8 | if (typeof taEv[o._taEvCo] !== 'undefined') taEv[o._taEvCo]._acssStopImmedEvProp = true; 9 | _stopEventPropagation(o); 10 | }; 11 | -------------------------------------------------------------------------------- /src/commands/built-in/StopImmediatePropagation.js: -------------------------------------------------------------------------------- 1 | _a.StopImmediatePropagation = o => { 2 | // Don't bubble up the Active CSS element hierarchy and do any more target selectors and stop propagation in the browser too. 3 | if (o.e && o.e.stopImmediatePropagation) o.e.stopImmediatePropagation(); 4 | _a.StopImmediateEventPropagation(o); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/StopPropagation.js: -------------------------------------------------------------------------------- 1 | _a.StopPropagation = o => { 2 | // Don't bubble up the Active CSS element hierarchy and stop propagation in the browser too. 3 | if (o.e && o.e.stopPropagation) o.e.stopPropagation(); 4 | _a.StopEventPropagation(o); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/Style.js: -------------------------------------------------------------------------------- 1 | _a.Style = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let str = _handleQuoAjax(o, o.actVal); 4 | let wot = str.split(' '), prop = wot.shift(); 5 | o.secSelObj.style[prop] = wot.join(' '); 6 | }; 7 | -------------------------------------------------------------------------------- /src/commands/built-in/TakeClass.js: -------------------------------------------------------------------------------- 1 | _a.TakeClass = o => _takeClass(o); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ToggleAttribute.js: -------------------------------------------------------------------------------- 1 | _a.ToggleAttribute = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let arr = o.actVal.split(' '); 4 | let attr = arr[0]; 5 | let force = arr[1] ? arr[1].trim() : null; 6 | if (force) force = (force === 'true') ? true : (force === 'false') ? false : null; 7 | if (force !== null) { 8 | o.secSelObj.toggleAttribute(attr, force); 9 | } else { 10 | o.secSelObj.toggleAttribute(attr); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/commands/built-in/ToggleClass.js: -------------------------------------------------------------------------------- 1 | _a.ToggleClass = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let str = o.actVal.replace(/\./g, ''); 4 | _toggleClassObj(o.secSelObj, str); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/ToggleTakeClass.js: -------------------------------------------------------------------------------- 1 | _a.ToggleTakeClass = o => _takeClass(o, true); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/TriggerFresh.js: -------------------------------------------------------------------------------- 1 | _a.TriggerFresh = o => { 2 | ActiveCSS.triggerFresh(o.secSelObj, o.actVal); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/TriggerReal.js: -------------------------------------------------------------------------------- 1 | _a.TriggerReal = o => { 2 | // Simulate a real event, not just a programmatical one. 3 | if (!_isConnected(o.secSelObj)) { 4 | // Skip it if it's no longer there and cancel all Active CSS bubbling. 5 | _a.StopPropagation(o); 6 | return false; 7 | } 8 | try { 9 | o.secSelObj.addEventListener(o.actVal, function(e) {}, {capture: true, once: true}); // once = automatically removed after running. 10 | o.secSelObj[o.actVal](); 11 | } catch(err) { 12 | _err('Only DOM events support trigger-real', o); 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /src/commands/built-in/UrlChange.js: -------------------------------------------------------------------------------- 1 | _a.UrlChange = o => { 2 | // Check that url-change hasn't been just run, as if so we don't want to run it twice. 3 | // Check if there is a page-title in the rules. If so, this needs to be set at the same time, so we know what 4 | // url to go back to. 5 | let val = o.actVal, alsoRemove; 6 | if (val.indexOf('remove-last-hash') !== -1) { 7 | val = val.replace(/remove\-last\-hash/g, '').trim(); 8 | o._removeLastHash = true; 9 | } 10 | let wot = val.split(' '); 11 | let url = wot[0]; 12 | let titl = val.replace(url, '').trim(); 13 | if (titl == '') { 14 | // default to current title if no parameter set. 15 | titl = document.title; 16 | } 17 | _urlTitle(url, titl, o, alsoRemove); 18 | }; 19 | -------------------------------------------------------------------------------- /src/commands/built-in/UrlReplace.js: -------------------------------------------------------------------------------- 1 | _a.UrlReplace = o => { 2 | o._urlReplace = true; 3 | _a.UrlChange(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/VarDelete.js: -------------------------------------------------------------------------------- 1 | _a.VarDelete = o => { 2 | let strObj = _handleVars([ 'rand', 'expr', 'attrs', 'strings' ], 3 | { 4 | str: o.actValSing, 5 | func: o.func, 6 | o, 7 | obj: o.obj, 8 | secSelObj: o.secSelObj, 9 | varScope: o.varScope 10 | } 11 | ); 12 | let newActVal = _resolveVars(strObj.str, strObj.ref); 13 | 14 | let scoped = _getScopedVar(newActVal, o.varScope); 15 | let mainScope = (scoped.winVar) ? window : scopedProxy; 16 | _unset(mainScope, scoped.name); 17 | }; 18 | -------------------------------------------------------------------------------- /src/commands/external-commands/first.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.first = sel => { return _focusOn({ actVal: sel }, null, true); }; // First selector in list 2 | -------------------------------------------------------------------------------- /src/commands/external-commands/last.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.last = sel => { return _focusOn({ actVal: sel }, 'l', true); }; // Last selector in list 2 | -------------------------------------------------------------------------------- /src/commands/external-commands/next.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.next = sel => { return _focusOn({ actVal: sel }, 'n', true); }; // Next selector in list, or nothing 2 | -------------------------------------------------------------------------------- /src/commands/external-commands/nextCycle.js: -------------------------------------------------------------------------------- 1 | // Next selector in list, then cycles 2 | ActiveCSS.nextCycle = sel => { 3 | return _focusOn({ actVal: sel }, 'ncc', true); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/external-commands/previous.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.previous = sel => { return _focusOn({ actVal: sel }, 'p', true); }; // Previous selector in list 2 | -------------------------------------------------------------------------------- /src/commands/external-commands/previousCycle.js: -------------------------------------------------------------------------------- 1 | // Previous selector in list, then cycles 2 | ActiveCSS.previousCycle = sel => { 3 | return _focusOn({ actVal: sel }, 'pcc', true); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/external-commands/triggerFresh.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.triggerFresh = (sel, ev) => { 2 | /* API command */ 3 | setTimeout(() => { 4 | let compDetails = (sel.hasAttribute('data-active-scoped')) ? _getComponentDetails(sel) : _componentDetails(sel); 5 | _handleEvents({ obj: sel, evType: ev, varScope: compDetails.varScope, evScope: compDetails.evScope, compDoc: compDetails.compDoc, component: compDetails.component }); 6 | }, 0); 7 | }; 8 | -------------------------------------------------------------------------------- /src/commands/external-commands/triggerReal.js: -------------------------------------------------------------------------------- 1 | ActiveCSS.triggerReal = (obj, ev, varScope, compDoc, component) => { 2 | if (typeof obj === 'string') { 3 | obj = document.querySelector(obj); 4 | } 5 | if (obj) { 6 | _a.TriggerReal({ secSelObj: obj, actVal: ev, varScope: varScope, compDoc: compDoc, component: component }); 7 | } else { 8 | _err('No object found in document to triggerReal', o); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/conditionals/IfChecked.js: -------------------------------------------------------------------------------- 1 | _c.IfChecked = o => _selCompare(o, 'iC'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfCompletelyVisible.js: -------------------------------------------------------------------------------- 1 | _c.IfCompletelyVisible = o => { return ActiveCSS._ifVisible(o, true); }; // Used by extensions. 2 | -------------------------------------------------------------------------------- /src/conditionals/IfCompletelyVisibleX.js: -------------------------------------------------------------------------------- 1 | _c.IfCompletelyVisibleX = o => { return ActiveCSS._ifVisible(o, true, 'x'); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfCompletelyVisibleY.js: -------------------------------------------------------------------------------- 1 | _c.IfCompletelyVisibleY = o => { return ActiveCSS._ifVisible(o, true, 'y'); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfCookieEquals.js: -------------------------------------------------------------------------------- 1 | _c.IfCookieEquals = o => { 2 | let spl = o.actVal.split(' '); 3 | if (!_cookieExists(spl[0])) return false; 4 | let nam = spl[0]; 5 | spl.shift(); 6 | spl = spl.join(' '); 7 | return (_getCookie(nam) == spl._ACSSRepQuo()); 8 | }; 9 | -------------------------------------------------------------------------------- /src/conditionals/IfCookieExists.js: -------------------------------------------------------------------------------- 1 | _c.IfCookieExists = o => { 2 | return _cookieExists(o.actVal); 3 | }; 4 | -------------------------------------------------------------------------------- /src/conditionals/IfDefined.js: -------------------------------------------------------------------------------- 1 | _c.IfDefined = o => { 2 | let scoped = _getScopedVar(o.actVal, o.varScope); 3 | return (typeof scoped.val !== 'undefined'); 4 | }; 5 | -------------------------------------------------------------------------------- /src/conditionals/IfDisplay.js: -------------------------------------------------------------------------------- 1 | _c.IfDisplay = o => { 2 | let el = _getSel(o, o.actVal); 3 | return (el && getComputedStyle(el, null).display !== 'none'); 4 | }; 5 | -------------------------------------------------------------------------------- /src/conditionals/IfEmpty.js: -------------------------------------------------------------------------------- 1 | _c.IfEmpty = o => { return (_selCompare(o, 'eM')); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfEmptyTrimmed.js: -------------------------------------------------------------------------------- 1 | _c.IfEmptyTrimmed = o => { return (_selCompare(o, 'eMT')); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfExists.js: -------------------------------------------------------------------------------- 1 | _c.IfExists = o => { 2 | return (_getSel(o, o.actVal)) ? true : false; 3 | }; 4 | -------------------------------------------------------------------------------- /src/conditionals/IfFocusFirst.js: -------------------------------------------------------------------------------- 1 | _c.IfFocusFirst = o => { return _ifFocus(o); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfFocusLast.js: -------------------------------------------------------------------------------- 1 | _c.IfFocusLast = o => { return _ifFocus(o, false); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfFormChanged.js: -------------------------------------------------------------------------------- 1 | _c.IfFormChanged = o => { return _checkForm(_getSel(o, o.actVal), 'check'); }; 2 | -------------------------------------------------------------------------------- /src/conditionals/IfFullscreen.js: -------------------------------------------------------------------------------- 1 | _c.IfFullscreen = o => { 2 | return (document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen); 3 | }; 4 | -------------------------------------------------------------------------------- /src/conditionals/IfFunc.js: -------------------------------------------------------------------------------- 1 | _c.IfFunc = o => { 2 | // Not a one-liner as we need the try/catch and error message. 3 | if (o.actVal == 'true') { 4 | return true; 5 | } else if (o.actVal == 'false') { 6 | return false; 7 | } else { 8 | try { 9 | return window[o.actVal](o); 10 | } catch(r) { 11 | _err('Function ' + o.actVal + ' does not exist', o); 12 | } 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /src/conditionals/IfHas.js: -------------------------------------------------------------------------------- 1 | _c.IfHas = o => { 2 | let aVRes = _extractBracketPars(o.actVal, [ 'scope' ], o); 3 | // Get scope element if it is there. 4 | let scope = (aVRes.scope) ? _getSel(o, aVRes.scope.trim()) : o.secSelObj; 5 | if (!scope || !_isConnected(scope)) return false; 6 | 7 | return scope.querySelector(aVRes.action) ? true : false; 8 | }; 9 | -------------------------------------------------------------------------------- /src/conditionals/IfHasClass.js: -------------------------------------------------------------------------------- 1 | _c.IfHasClass = o => { 2 | let arr = _actValSelItem(o); 3 | return (arr[0] && ActiveCSS._hasClassObj(arr[0], arr[1].substr(1))); // "ActiveCSS." indicates that it is used by extensions. 4 | }; 5 | -------------------------------------------------------------------------------- /src/conditionals/IfInnerHtml.js: -------------------------------------------------------------------------------- 1 | _c.IfInnerHtml = o => _selCompare(o, 'iH'); // Used in core unit testing. 2 | -------------------------------------------------------------------------------- /src/conditionals/IfInnerText.js: -------------------------------------------------------------------------------- 1 | _c.IfInnerText = o => _selCompare(o, 'iT'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMaxHeight.js: -------------------------------------------------------------------------------- 1 | _c.IfMaxHeight = o => _selCompare(o, 'maH'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMaxLength.js: -------------------------------------------------------------------------------- 1 | _c.IfMaxLength = o => _selCompare(o, 'maL'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMaxWidth.js: -------------------------------------------------------------------------------- 1 | _c.IfMaxWidth = o => _selCompare(o, 'maW'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMediaMaxWidth.js: -------------------------------------------------------------------------------- 1 | _c.IfMediaMaxWidth = o => { 2 | return _checkMedia('all and (max-width: ' + o.actVal + ')'); 3 | }; 4 | -------------------------------------------------------------------------------- /src/conditionals/IfMediaMinWidth.js: -------------------------------------------------------------------------------- 1 | _c.IfMediaMinWidth = o => { 2 | return _checkMedia('all and (min-width: ' + o.actVal + ')'); 3 | }; 4 | -------------------------------------------------------------------------------- /src/conditionals/IfMinHeight.js: -------------------------------------------------------------------------------- 1 | _c.IfMinHeight = o => _selCompare(o, 'miH'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMinLength.js: -------------------------------------------------------------------------------- 1 | _c.IfMinLength = o => _selCompare(o, 'miL'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfMinWidth.js: -------------------------------------------------------------------------------- 1 | _c.IfMinWidth = o => _selCompare(o, 'miW'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfScrolltopGreater.js: -------------------------------------------------------------------------------- 1 | _c.IfScrolltopGreater = o => { 2 | if (o.obj == 'body') { 3 | return (window.pageYOffset || document.documentElement.scrollTop) > o.actVal; 4 | } else { 5 | return o.obj.scrollTop > o.actVal; 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /src/conditionals/IfScrolltopLess.js: -------------------------------------------------------------------------------- 1 | _c.IfScrolltopLess = o => { 2 | if (o.obj == 'body') { 3 | return (window.pageYOffset || document.documentElement.scrollTop) < o.actVal; 4 | } else { 5 | return o.obj.scrollTop < o.actVal; 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /src/conditionals/IfSelection.js: -------------------------------------------------------------------------------- 1 | _c.IfSelection = o => { 2 | let selObj = window.getSelection(); 3 | o.actVal = o.actVal._ACSSRepQuo().trim(); 4 | return (selObj.toString() == o.actVal); 5 | }; 6 | -------------------------------------------------------------------------------- /src/conditionals/IfValue.js: -------------------------------------------------------------------------------- 1 | _c.IfValue = o => _selCompare(o, 'iV'); 2 | -------------------------------------------------------------------------------- /src/conditionals/IfVarTrue.js: -------------------------------------------------------------------------------- 1 | _c.IfVarTrue = o => { 2 | o.actVal += ' true'; 3 | return _c.IfVar(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/conditionals/IfVisible.js: -------------------------------------------------------------------------------- 1 | _c.IfVisible = o => { return ActiveCSS._ifVisible(o); }; // Used by extensions. 2 | -------------------------------------------------------------------------------- /src/conditionals/MqlTrue.js: -------------------------------------------------------------------------------- 1 | /* Internal conditional command only */ 2 | _c.MqlTrue = o => { 3 | return mediaQueries[o.actVal].val; 4 | }; 5 | -------------------------------------------------------------------------------- /src/core/await-handling/_immediateStop.js: -------------------------------------------------------------------------------- 1 | const _immediateStop = o => { 2 | // Stop event flow here. Used in pause/await functionality for breaking out of commands at the start of the timeout. 3 | // It also performs everything that is needed for the command "exit;" to work, as it effectively stops further all event flow actions. 4 | if (typeof imSt[o._imStCo] !== 'undefined') imSt[o._imStCo]._acssImmediateStop = true; 5 | _stopImmediateEventPropagation(o); // Also calls _stopEventPropagation(). 6 | }; 7 | -------------------------------------------------------------------------------- /src/core/await-handling/_isSyncQueueSet.js: -------------------------------------------------------------------------------- 1 | const _isSyncQueueSet = (val) => { 2 | return !!syncQueue[val]; 3 | }; 4 | -------------------------------------------------------------------------------- /src/core/await-handling/_pause.js: -------------------------------------------------------------------------------- 1 | const _pause = (o, tim) => { 2 | _setResumeObj(o); 3 | let restartObj = _clone(o); 4 | let activeID = _getActiveID(restartObj.secSelObj); 5 | let subEvCo = restartObj._subEvCo; 6 | if (!pauseTrack[activeID]) pauseTrack[activeID] = {}; 7 | pauseTrack[activeID][subEvCo] = true; 8 | setTimeout(() => { 9 | o = null; 10 | // If pause has not been cancelled, restart the event queue. 11 | if (pauseTrack[activeID] && pauseTrack[activeID][subEvCo]) { 12 | delete pauseTrack[activeID][subEvCo]; 13 | _syncRestart(restartObj, subEvCo); 14 | } 15 | restartObj = null; 16 | return; 17 | }, tim); 18 | }; 19 | -------------------------------------------------------------------------------- /src/core/await-handling/_setResumeObj.js: -------------------------------------------------------------------------------- 1 | const _setResumeObj = o => { 2 | syncQueue[o._subEvCo] = { 3 | ref_subEvCo: o._subEvCo, 4 | intID: o.intID, 5 | secSelObj: o.secSelObj, 6 | loopRef: o.loopRef 7 | }; 8 | }; 9 | -------------------------------------------------------------------------------- /src/core/await-handling/_syncCheckAndSet.js: -------------------------------------------------------------------------------- 1 | const _syncCheckAndSet = (o, syncQueueSet) => { 2 | // If there isn't a sync option on the command, skip it. 3 | if (!o.actVal.endsWith(' await')) return; 4 | 5 | // Remove the " await" from action command. 6 | o.actVal = o.actVal.slice(0, -6).trim(); 7 | o.isAwait = true; 8 | 9 | // Only sync this command if it's a valid delayed event, otherwise ignore the sync. 10 | if (!o.isAsync && !o.isTimed) return; 11 | // Set the sync queue up for remaining action commands to be added. 12 | 13 | // We are awaiting here. Set the resumption object so we can remember where to resume from later. 14 | _setResumeObj(o); 15 | _immediateStop(o); 16 | 17 | // No return value is needed as objects are passed into functions by reference. 18 | }; 19 | -------------------------------------------------------------------------------- /src/core/await-handling/_syncEmpty.js: -------------------------------------------------------------------------------- 1 | const _syncEmpty = val => { 2 | // Wipe this sync queue. The "i" is needed at the beginning of each key in order to get the delete working correctly. Otherwise you'll get a memory leak. 3 | // But it's super fast this way. 4 | delete syncQueue[val]; 5 | }; 6 | -------------------------------------------------------------------------------- /src/core/await-handling/_syncRestart.js: -------------------------------------------------------------------------------- 1 | const _syncRestart = (o, resumeID) => { 2 | if (_isSyncQueueSet(resumeID)) { 3 | let loopObjCopy = _clone(o.origLoopObj); 4 | let thisQueue = _clone(syncQueue[o._subEvCo]); 5 | loopObjCopy.origLoopObj = loopObjCopy; 6 | loopObjCopy.origLoopObj.resume = true; 7 | loopObjCopy.origLoopObj.resumeProps = thisQueue; 8 | 9 | // Re-run the events. It needs a setTimeout in order to clear the memory stack on the way back up the event flow. 10 | // It also serves a purpose in keeping simultaneous actions happening at roughly the same time. 11 | 12 | clearTimeout(pauseCleanTimers[o._subEvCo]); 13 | 14 | setTimeout(_performEvent(loopObjCopy), 0); 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /src/core/delay-handling/_addCancelAttr.js: -------------------------------------------------------------------------------- 1 | const _addCancelAttr = (obj, func) => { 2 | let activeID = _getActiveID(obj); 3 | if (!cancelIDArr[activeID]) cancelIDArr[activeID] = []; 4 | cancelIDArr[activeID][func] = true; 5 | }; 6 | -------------------------------------------------------------------------------- /src/core/delay-handling/_getDelayRef.js: -------------------------------------------------------------------------------- 1 | const _getDelayRef = o => { 2 | let delayRef; 3 | if (typeof o.secSel === 'string' && ['~', '|'].includes(o.secSel.substr(0, 1))) { 4 | delayRef = (o.evScope ? o.evScope : 'doc') + o.secSel; 5 | } else { 6 | delayRef = _getActiveID(o.secSelObj); 7 | } 8 | return delayRef; 9 | }; 10 | -------------------------------------------------------------------------------- /src/core/delay-handling/_setupLabelData.js: -------------------------------------------------------------------------------- 1 | const _setupLabelData = (lab, del, func, pos, intID, loopRef, _subEvCo, tid) => { 2 | delayArr[del][func][pos][intID][loopRef] = tid; 3 | delaySync[tid] = _subEvCo; 4 | if (lab) { 5 | labelData[lab] = { del, func, pos, intID, loopRef, tid }; 6 | // We don't want to be loop or sorting for performance reasons, so we'll just create a new array to keep track of the data we need for later. 7 | labelByIDs[tid] = { del, func, pos, intID, loopRef, lab }; 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /src/core/delay-handling/_unloadAllCancelTimer.js: -------------------------------------------------------------------------------- 1 | const _unloadAllCancelTimer = () => { 2 | let i; 3 | // Each timeout needs individually deleting, hence the nested loopage. There should never be lots delayed events at any one time, and they do get cleaned up. 4 | for (i in delayArr) { 5 | _unloadAllCancelTimerLoop(i); 6 | } 7 | delayArr = []; 8 | cancelIDArr = []; 9 | labelData = []; 10 | labelByIDs = []; 11 | }; 12 | -------------------------------------------------------------------------------- /src/core/delay-handling/_unloadAllCancelTimerLoop.js: -------------------------------------------------------------------------------- 1 | const _unloadAllCancelTimerLoop = i => { 2 | let j, k, l, m; 3 | for (j in delayArr[i]) { 4 | for (k in delayArr[i][j]) { 5 | for (l in delayArr[i][j][k]) { 6 | for (m in delayArr[i][j][k][l]) { 7 | _clearTimeouts(delayArr[i][j][k][l][m]); 8 | } 9 | } 10 | } 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/core/runtime/_actionValLoop.js: -------------------------------------------------------------------------------- 1 | const _actionValLoop = (oCopy, pars, obj, runButElNotThere) => { 2 | _actionValLoopDo(oCopy, pars, obj, runButElNotThere, 0); 3 | }; 4 | 5 | const _actionValLoopDo = (oCopy, pars, obj, runButElNotThere, counter) => { 6 | let oCopy2 = _clone(oCopy); 7 | 8 | oCopy2.actVal = pars.actVals[counter].trim(); // Put the original back. 9 | oCopy2.actPos = counter; // i or label (not yet built). 10 | oCopy2.secSelObj = obj; 11 | oCopy2._tgEvCo = 'i' + targetCounter++; 12 | oCopy2._tgResPos = oCopy2._subEvCo + oCopy2._tgEvCo; 13 | oCopy2._funcObj = { oCopy, pars, obj, counter, runButElNotThere }; 14 | _handleFunc(oCopy2, null, runButElNotThere); 15 | }; 16 | -------------------------------------------------------------------------------- /src/core/runtime/_addInlinePriorToRender.js: -------------------------------------------------------------------------------- 1 | const _addInlinePriorToRender = (str) => { 2 | // Unescape all single opening curlies for inline Active CSS and JavaScript prior to insertion into the DOM. 3 | str = str.replace(/_ACSS_later_brace_start/g, '{'); 4 | 5 | // Now add config to the DOM. 6 | if (str.indexOf('