├── .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: "
{|checkAjaxFormPreviewHTML}
"; 3 | } 4 | 5 | @component checkAjaxFormPreviewHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkAjaxFormPreview:test { 11 | func: checkAjaxFormPreview; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/ajax-form-preview/checkAjaxFormPreview.js: -------------------------------------------------------------------------------- 1 | function checkAjaxFormPreview(o) { 2 | let testEl = _initTest('checkAjaxFormPreview'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/ajax-form-submit/checkAjaxFormSubmit.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkAjaxFormSubmitHTML}
"; 3 | } 4 | 5 | @component checkAjaxFormSubmitHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkAjaxFormSubmit:test { 11 | func: checkAjaxFormSubmit; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/ajax-form-submit/checkAjaxFormSubmit.js: -------------------------------------------------------------------------------- 1 | function checkAjaxFormSubmit(o) { 2 | let testEl = _initTest('checkAjaxFormSubmit'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/console-log/checkConsoleLog.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkConsoleLogHTML}
"; 3 | } 4 | 5 | @component checkConsoleLogHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkConsoleLog:test { 11 | func: checkConsoleLog; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/console-log/checkConsoleLog.js: -------------------------------------------------------------------------------- 1 | function checkConsoleLog(o) { 2 | let testEl = _initTest('checkConsoleLog'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/copy-to-clipboard/checkCopyToClipboard.js: -------------------------------------------------------------------------------- 1 | /* This is a valid test, but Chrome headless does not support the copy event. If it ever does then this can be re-implemented.*/ 2 | 3 | function checkCopyToClipboard(o) { 4 | let testEl = _initTest('checkCopyToClipboard'); 5 | if (!testEl) return; 6 | 7 | // It gets into this function from the copy event, the test has passed. There appears to be no way to read the contents of the clipboard reliably. 8 | _addSuccessClass(testEl); 9 | } 10 | -------------------------------------------------------------------------------- /core-test/pend-for-now/fullscreen-exit/checkFullscreenExit.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkFullscreenExitHTML}
"; 3 | } 4 | 5 | @component checkFullscreenExitHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkFullscreenExit:test { 11 | func: checkFullscreenExit; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/fullscreen-exit/checkFullscreenExit.js: -------------------------------------------------------------------------------- 1 | function checkFullscreenExit(o) { 2 | let testEl = _initTest('checkFullscreenExit'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/fullscreen-on/checkFullscreenOn.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkFullscreenOnHTML}
"; 3 | } 4 | 5 | @component checkFullscreenOnHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkFullscreenOn:test { 11 | func: checkFullscreenOn; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/fullscreen-on/checkFullscreenOn.js: -------------------------------------------------------------------------------- 1 | function checkFullscreenOn(o) { 2 | let testEl = _initTest('checkFullscreenOn'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/location/checkLocation.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkLocationHTML}
"; 3 | } 4 | 5 | @component checkLocationHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkLocation:test { 11 | func: checkLocation; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/location/checkLocation.js: -------------------------------------------------------------------------------- 1 | function checkLocation(o) { 2 | let testEl = _initTest('checkLocation'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/media-control/checkMediaControl.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkMediaControlHTML}
"; 3 | } 4 | 5 | @component checkMediaControlHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkMediaControl:test { 11 | func: checkMediaControl; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/media-control/checkMediaControl.js: -------------------------------------------------------------------------------- 1 | function checkMediaControl(o) { 2 | let testEl = _initTest('checkMediaControl'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/mimic-into/checkMimicInto.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkMimicIntoHTML}
"; 3 | } 4 | 5 | @component checkMimicIntoHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkMimicInto:test { 11 | func: checkMimicInto; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/mimic-into/checkMimicInto.js: -------------------------------------------------------------------------------- 1 | function checkMimicInto(o) { 2 | let testEl = _initTest('checkMimicInto'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/pend-for-now/select-all/checkSelectAll.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkSelectAllHTML}
"; 3 | } 4 | 5 | @component checkSelectAllHTML { 6 | div:draw { 7 | trigger-real: click; 8 | } 9 | div:click { 10 | select-all: self; 11 | func: checkSelectAll; 12 | } 13 | html { 14 |
Some text
15 | } 16 | } 17 | 18 | #checkSelectAll:test { 19 | } 20 | -------------------------------------------------------------------------------- /core-test/pend-for-now/select-all/checkSelectAll.js: -------------------------------------------------------------------------------- 1 | function checkSelectAll(o) { 2 | let testEl = _initTest('checkSelectAll'); 3 | if (!testEl) return; 4 | 5 | console.log(window.getSelection()); 6 | if (window.getSelection() !== 'Some text') { 7 | _fail(testEl, 'Selected text does not equal "Some text" and it should.'); 8 | } else { 9 | _addSuccessClass(testEl); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/pend-for-now/select-none/checkSelectNone.acss: -------------------------------------------------------------------------------- 1 | #content:draw { 2 | render-before-end: "
{|checkSelectNoneHTML}
"; 3 | } 4 | 5 | @component checkSelectNoneHTML { 6 | html { 7 | } 8 | } 9 | 10 | #checkSelectNone:test { 11 | func: checkSelectNone; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/pend-for-now/select-none/checkSelectNone.js: -------------------------------------------------------------------------------- 1 | function checkSelectNone(o) { 2 | let testEl = _initTest('checkSelectNone'); 3 | if (!testEl) return; 4 | 5 | // _fail(testEl, 'message'); 6 | 7 | _addSuccessClass(testEl); 8 | } 9 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/add-class/checkAddClass.acss: -------------------------------------------------------------------------------- 1 | #checkAddClass:test { 2 | add-class: .success; 3 | } 4 | 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/add-class/checkAddClass.js: -------------------------------------------------------------------------------- 1 | // No js needed for this checkAddClass test. -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/ajax/checkAjax.acss: -------------------------------------------------------------------------------- 1 | @component checkAjaxHTML { 2 | &:beforeComponentOpen { 3 | ajax: "/base/core-test/tests/resource-files/ajax-test-1.txt"; 4 | } 5 | &:afterAjax { 6 | func: checkAjax after 1s; /* give component time to draw before checking */ 7 | } 8 | html { 9 |

{{checkAjaxTitle}}

10 |

{{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 |
4 | Apples 5 | Oranges 6 | Lychee 7 | Bananas 8 | Grapes 9 |
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 |
4 | Apples 5 | Oranges 6 | Lychee 7 | Bananas 8 | Grapes 9 |
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: "
{|checkCloneHTML}
"; 5 | } 6 | 7 | @component checkCloneHTML { 8 | html { 9 |

This text is going to be cloned

10 |
11 | } 12 | } 13 | 14 | #checkClone:test { 15 | func: checkCloneBefore; 16 | clone: .cloneText; 17 | #restoreHere { 18 | restore-clone: .cloneText; 19 | } 20 | func: checkClone; 21 | } 22 | */ -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/create-command/checkCreateCommand.acss: -------------------------------------------------------------------------------- 1 | @component checkCreateCommandHTML { 2 | @command create-command-blue {= 3 | targetSelector.style.backgroundColor = 'blue'; 4 | =} 5 | html { 6 |
7 | } 8 | } 9 | 10 | #checkCreateCommand:test { 11 | create-command: create-command-yellow {= 12 | targetSelector.style.color = 'yellow'; 13 | =}; 14 | #checkCreateCommandDiv { 15 | create-command-blue: true; 16 | create-command-yellow: true; 17 | create-command-height100: true; 18 | } 19 | func: checkCreateCommand; 20 | } 21 | 22 | @command create-command-height100 {= 23 | targetSelector.style.height = '100px'; 24 | =} 25 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/create-conditional/checkCreateConditional.js: -------------------------------------------------------------------------------- 1 | function checkCreateConditionalFail(o) { 2 | let checkCreateConditionalEl = _initTest('checkCreateConditional'); 3 | if (!checkCreateConditionalEl) return; 4 | 5 | _fail(checkCreateConditionalEl, 'Test failed because it did not evaluate the conditional correctly.'); 6 | } 7 | 8 | function checkCreateConditionalFinal(o) { 9 | let checkCreateConditionalEl = _initTest('checkCreateConditional'); 10 | if (!checkCreateConditionalEl) return; 11 | 12 | _addSuccessClass(checkCreateConditionalEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/eval/checkEval.acss: -------------------------------------------------------------------------------- 1 | #checkEval:test { 2 | eval: {= window.evalResult = 1 + 1; =}; 3 | func: checkEval; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/eval/checkEval.js: -------------------------------------------------------------------------------- 1 | function checkEval(o) { 2 | let checkEvalEl = _initTest('checkEval'); 3 | if (!checkEvalEl) return; 4 | 5 | if (typeof window.evalResult !== undefined) { 6 | if (window.evalResult === 2) { 7 | _addSuccessClass(checkEvalEl); 8 | } else { 9 | _fail(checkEvalEl, 'window.evalResult is being defined in eval check but result doesn\'t equal 2.'); 10 | } 11 | } else { 12 | _fail(checkEvalEl, 'window.evalResult not being defined in eval check.'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-off/checkFocusOff.acss: -------------------------------------------------------------------------------- 1 | @component checkFocusOffHTML { 2 | html { 3 | 4 | } 5 | } 6 | 7 | #checkFocusOff:test { 8 | #focusOffField { 9 | focus-on: self; 10 | func: checkFocusOffA; 11 | focus-off: true; 12 | } 13 | func: checkFocusOffFinal; 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on-first/checkFocusOnFirst.acss: -------------------------------------------------------------------------------- 1 | @component checkFocusOnFirstHTML { 2 | html { 3 |
4 | 5 | 6 | 7 | 8 | 9 |
10 | } 11 | } 12 | 13 | #checkFocusOnFirst:test { 14 | func: checkFocusOnFirstA; 15 | focus-on-first: #focusOnFirstForm input; 16 | func: checkFocusOnFirstFinal; 17 | } 18 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on-last/checkFocusOnLast.acss: -------------------------------------------------------------------------------- 1 | @component checkFocusOnLastHTML { 2 | html { 3 |
4 | 5 | 6 | 7 | 8 | 9 |
10 | } 11 | } 12 | 13 | #checkFocusOnLast:test { 14 | func: checkFocusOnLastA; 15 | focus-on-last: #focusOnLastForm input; 16 | func: checkFocusOnLastFinal; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on-next-cycle/checkFocusOnNextCycle.acss: -------------------------------------------------------------------------------- 1 | @component checkFocusOnNextCycleHTML { 2 | html { 3 |
4 | Apples 5 | Oranges 6 | Pears 7 | Bananas 8 | Grapes 9 |
10 | } 11 | } 12 | 13 | #checkFocusOnNextCycle:test { 14 | func: checkFocusOnNextCycleA; 15 | focus-on: #focusOnNextCycleStart; 16 | func: checkFocusOnNextCycleB; 17 | focus-on-next-cycle: .focusOnNextCycleBlock a; 18 | func: checkFocusOnNextCycleC; 19 | focus-on-next-cycle: .focusOnNextCycleBlock a; 20 | func: checkFocusOnNextCycleFinal; 21 | } 22 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on-next/checkFocusOnNext.acss: -------------------------------------------------------------------------------- 1 | @component checkFocusOnNextHTML { 2 | html { 3 |
4 | Apples 5 | Oranges 6 | Pears 7 | Bananas 8 | Grapes 9 |
10 | } 11 | } 12 | 13 | #checkFocusOnNext:test { 14 | func: checkFocusOnNextA; 15 | focus-on: #focusOnNextStart; 16 | func: checkFocusOnNextB; 17 | focus-on-next: .focusOnNextBlock a; 18 | func: checkFocusOnNextC; 19 | focus-on-next: .focusOnNextBlock a; 20 | func: checkFocusOnNextD; 21 | focus-on-next: .focusOnNextBlock a; 22 | func: checkFocusOnNextFinal; 23 | } 24 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on/checkFocusOn.acss: -------------------------------------------------------------------------------- 1 | /* This is tested in the blur command test and will specifically error if it doesn't work. */ 2 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/focus-on/checkFocusOn.js: -------------------------------------------------------------------------------- 1 | /* This is tested in the blur command test and will specifically error if it doesn't work. */ 2 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/func/checkFunc.acss: -------------------------------------------------------------------------------- 1 | #checkFunc:test { 2 | var: window.acSSGlobIt "some data"; 3 | var: myACSSVariable {myObj: true, myArray: [1, 2, 3, 4]}; 4 | func: checkFuncNum 8; 5 | func: checkFuncStr "test string"; 6 | func: checkFuncTrue true; 7 | func: checkFuncFalse false; 8 | /* 9 | Still to set up: 10 | func: checkFuncArr pars([1, 2, "cheesey wotsit"]); 11 | func: checkFuncObj pars({dave: "hi"}); 12 | func: checkFuncWinVar pars(window.globIt); 13 | func: checkFuncACSSVar pars({myACSSVariable}); 14 | func: checkFuncExpr pars({= 7 + 10 =}); 15 | func: checkFuncCombined pars([1, 2, "cheesey wotsit"], {dave: "hi"}, window.globIt, {myACSSVariable}, {= new Date =});*/ 16 | 17 | func: checkFuncFinal; 18 | } 19 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/iframe-reload/checkIframeReload.acss: -------------------------------------------------------------------------------- 1 | @component checkIframeReloadHTML { 2 | html { 3 | 4 | } 5 | } 6 | 7 | #checkIframeReload:runTests { 8 | func: checkIframeReloadA; 9 | #checkIframeIframe -> p { 10 | render: "some new text"; 11 | } 12 | func: checkIframeReloadB; 13 | #checkIframeIframe { 14 | iframe-reload: true; 15 | } 16 | func: checkIframeReloadFinal after 1s; 17 | } 18 | 19 | #checkIframeReload:test { 20 | trigger: runTests after 1s; 21 | } 22 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/load-config/checkLoadConfig.acss: -------------------------------------------------------------------------------- 1 | @component checkLoadConfigHTML { 2 | &:componentOpen { 3 | load-config: "/base/core-test/tests/resource-files/load-config-test.acss" after 1s; 4 | } 5 | html { 6 |
7 | } 8 | } 9 | 10 | #checkLoadConfig:test { 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/load-config/checkLoadConfig.js: -------------------------------------------------------------------------------- 1 | function checkLoadConfig(o) { 2 | let checkLoadConfigEl = _initTest('checkLoadConfig'); 3 | if (!checkLoadConfigEl) return; 4 | 5 | let el = _getObj('#loadConfigResults'); 6 | if (!el) { 7 | _fail(checkLoadConfigEl, 'The test div was not drawn prior to the load-config command before run.'); 8 | } else if (el.innerHTML !== 'Here is some text.') { 9 | _fail(checkLoadConfigEl, 'The div did not contain the text "Here is some text." after the test was run.'); 10 | } else { 11 | _addSuccessClass(checkLoadConfigEl); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/load-script/checkLoadScript.acss: -------------------------------------------------------------------------------- 1 | @component checkLoadScriptHTML { 2 | &:beforeComponentOpen { 3 | load-script: "/base/core-test/tests/resource-files/load-script-test.js"; 4 | } 5 | &:afterLoadScript { 6 | func: checkLoadScript; 7 | } 8 | html { 9 |
10 | } 11 | } 12 | 13 | #checkLoadScript:test { 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/load-script/checkLoadScript.js: -------------------------------------------------------------------------------- 1 | function checkLoadScript(o) { 2 | let checkLoadScriptEl = _initTest('checkLoadScript'); 3 | if (!checkLoadScriptEl) return; 4 | 5 | if (window._acssTestLoadScriptVar !== true) { 6 | _fail(checkLoadScriptEl, 'window._acssTestLoadScriptVar is not set === true after the test script has loaded.'); 7 | } else { 8 | _addSuccessClass(checkLoadScriptEl); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/prevent-default/checkPreventDefault.acss: -------------------------------------------------------------------------------- 1 | @component checkPreventDefaultHTML { 2 | a:click { 3 | prevent-default: true; 4 | } 5 | a:draw { 6 | trigger-real: click; 7 | func: checkPreventDefault; /* If prevent-default works at all then passing the test in the function will be enough. */ 8 | } 9 | html { 10 | Test prevent default - this shouldn't do anything when clicked. 11 | } 12 | } 13 | 14 | #checkPreventDefault:test { 15 | } 16 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/prevent-default/checkPreventDefault.js: -------------------------------------------------------------------------------- 1 | function checkPreventDefault(o) { 2 | let checkPreventDefaultEl = _initTest('checkPreventDefault'); 3 | if (!checkPreventDefaultEl) return; 4 | 5 | _addSuccessClass(checkPreventDefaultEl); 6 | } 7 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/prevent-default/checkPreventDefaultShadow.acss: -------------------------------------------------------------------------------- 1 | @component checkPreventDefaultHTMLShadow shadow { 2 | a:click { 3 | prevent-default: true; 4 | } 5 | a:draw { 6 | trigger-real: click; 7 | func: checkPreventDefaultShadow; /* If prevent-default works at all then passing the test in the function will be enough. */ 8 | } 9 | html { 10 | Test prevent default - this shouldn't do anything when clicked. 11 | } 12 | } 13 | 14 | #checkPreventDefaultShadow:test { 15 | } 16 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/prevent-default/checkPreventDefaultShadow.js: -------------------------------------------------------------------------------- 1 | function checkPreventDefaultShadow(o) { 2 | let checkPreventDefaultShadowEl = _initTest('checkPreventDefaultShadow'); 3 | if (!checkPreventDefaultShadowEl) return; 4 | 5 | _addSuccessClass(checkPreventDefaultShadowEl); 6 | } 7 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-attribute/checkRemoveAttribute.acss: -------------------------------------------------------------------------------- 1 | @component checkRemoveAttributeHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkRemoveAttribute:test { 8 | #removeAttributeDiv { 9 | remove-attribute: data-test; 10 | } 11 | func: checkRemoveAttribute; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-attribute/checkRemoveAttribute.js: -------------------------------------------------------------------------------- 1 | function checkRemoveAttribute(o) { 2 | let checkRemoveAttributeEl = _initTest('checkRemoveAttribute'); 3 | if (!checkRemoveAttributeEl) return; 4 | 5 | let el = _getObj('#removeAttributeDiv'); 6 | if (!el) { 7 | _fail(checkRemoveAttributeEl, '#removeAttributeDiv not present to perform remove-attribute command.'); 8 | } 9 | 10 | if (!el.hasAttribute('data-test')) { 11 | _addSuccessClass(checkRemoveAttributeEl); 12 | } else { 13 | _fail(checkRemoveAttributeEl, 'Failed to remove the attribute "data-test" from #removeAttributeDiv. Element:', el); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-class/checkRemoveClass.acss: -------------------------------------------------------------------------------- 1 | #checkRemoveClass:test { 2 | remove-class: .removeClassToRemove; 3 | func: checkRemoveClass; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-class/checkRemoveClass.js: -------------------------------------------------------------------------------- 1 | function checkRemoveClass(o) { 2 | // Check that the element to remove the class from is definitely there. 3 | let checkRemoveClassEl = _initTest('checkRemoveClass'); 4 | if (!checkRemoveClassEl) return; 5 | 6 | // Check if the class is no longer there. 7 | if (_hasClassObj(checkRemoveClassEl, 'removeClassToRemove')) { 8 | return; 9 | } 10 | _addSuccessClass(checkRemoveClassEl); 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-clone/checkRemoveClone.acss: -------------------------------------------------------------------------------- 1 | /* Pended until clone/restore-clone issue 36 has been resolved. 2 | #content:draw { 3 | render-before-end: "
{|checkRemoveCloneHTML}
"; 4 | } 5 | 6 | @component checkRemoveCloneHTML { 7 | html { 8 | } 9 | } 10 | 11 | #checkRemoveClone:test { 12 | func: checkRemoveClone; 13 | } 14 | */ -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-clone/checkRemoveClone.js: -------------------------------------------------------------------------------- 1 | /* Pended until clone/restore-clone issue 36 has been resolved. 2 | function checkRemoveClone(o) { 3 | let testEl = _initTest('checkRemoveClone'); 4 | if (!testEl) return; 5 | 6 | // _fail(testEl, 'message'); 7 | 8 | _addSuccessClass(testEl); 9 | } 10 | */ -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-cookie/checkRemoveCookie.acss: -------------------------------------------------------------------------------- 1 | #checkRemoveCookie:test { 2 | set-cookie: name("removeCookieTest1") value("Y") expires("1 Year") path("/") sameSite("Strict") secureIfHttps; 3 | func: checkRemoveCookieA; 4 | remove-cookie: name("removeCookieTest1") path("/"); 5 | func: checkRemoveCookieFinal; 6 | } 7 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove-property/checkRemoveProperty.acss: -------------------------------------------------------------------------------- 1 | @component checkRemovePropertyHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkRemoveProperty:test { 8 | #removePropertyDiv { 9 | func: checkRemovePropertyBefore; 10 | remove-property: background-color; 11 | } 12 | func: checkRemoveProperty; 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove/checkRemove.acss: -------------------------------------------------------------------------------- 1 | @component checkRemoveHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkRemove:test { 8 | func: checkRemoveBefore; 9 | remove: #removeToRemove; 10 | func: checkRemove; 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/remove/checkRemove.js: -------------------------------------------------------------------------------- 1 | function checkRemove(o) { 2 | let checkRemoveEl = _initTest('checkRemove'); 3 | if (!checkRemoveEl) return; 4 | 5 | let el = _getObj('#removeToRemove'); 6 | if (!el) { 7 | _addSuccessClass(checkRemoveEl); 8 | } else { 9 | _fail(checkRemoveEl, '#removeToRemove did not get removed by the remove command.'); 10 | } 11 | } 12 | 13 | function checkRemoveBefore(o) { 14 | let checkRemoveEl = _initTest('checkRemove'); 15 | if (!checkRemoveEl) return; 16 | 17 | let el = _getObj('#removeToRemove'); 18 | if (!el) { 19 | _fail(checkRemoveEl, '#removeToRemove is not present in order to perform the remove test.'); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-after-begin/checkRenderAfterBegin.acss: -------------------------------------------------------------------------------- 1 | @component checkRenderAfterBeginHTML { 2 | &:componentOpen { 3 | #renderAfterBeginHTMLDiv { 4 | render-after-begin: "render-after-begin"; 5 | func: checkRenderAfterBegin; 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-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: "
render-replace
"; 5 | } 6 | func: checkRenderReplace; 7 | } 8 | html { 9 |

Text will be inserted in relation to this element.

10 | } 11 | } 12 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/render-replace/checkRenderReplace.js: -------------------------------------------------------------------------------- 1 | function checkRenderReplace(o) { 2 | let checkRenderReplaceEl = _initTest('checkRenderReplace'); 3 | if (!checkRenderReplaceEl) return; 4 | 5 | // Check basic render-replace command results. 6 | let el = _getObj('#renderReplaceOuterDiv'); 7 | 8 | if (el.innerHTML !== '
render-replace
') { 9 | _fail(checkRenderReplaceEl, 'Render did not render correctly in the render-replace command test area. #renderReplaceOuterDiv.innerHTML:', el.innerHTML); 10 | } 11 | 12 | _addSuccessClass(checkRenderReplaceEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/restore-clone/checkRestoreClone.acss: -------------------------------------------------------------------------------- 1 | /* This test is covered by the clone command test, as they work together. */ -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/restore-clone/checkRestoreClone.js: -------------------------------------------------------------------------------- 1 | /* This test is covered by the clone command test, as they work together. */ 2 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/run/checkRun.acss: -------------------------------------------------------------------------------- 1 | #checkRun:test { 2 | run: {= window.runResult = 1 + 1; =}; 3 | func: checkRun; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/run/checkRun.js: -------------------------------------------------------------------------------- 1 | function checkRun(o) { 2 | let checkRunEl = _initTest('checkRun'); 3 | if (!checkRunEl) return; 4 | 5 | if (typeof window.runResult !== undefined) { 6 | if (window.runResult === 2) { 7 | _addSuccessClass(checkRunEl); 8 | } else { 9 | _fail(checkRunEl, 'window.runResult is being defined in run check but result doesn\'t equal 2.'); 10 | } 11 | } else { 12 | _fail(checkRunEl, 'window.runResult not being defined in run check.'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/scroll-into-view/checkScrollIntoView.acss: -------------------------------------------------------------------------------- 1 | @component checkScrollIntoViewHTML { 2 | &:componentOpen { 3 | func: checkScrollIntoViewA after stack; 4 | #checkScrollIntoViewDiv { 5 | scroll-into-view: true after stack; 6 | } 7 | func: checkScrollIntoViewFinal after stack; 8 | } 9 | html { 10 |
11 |
12 |
13 | } 14 | } 15 | 16 | #checkScrollIntoView:test { 17 | } 18 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/set-attribute/checkSetAttribute.acss: -------------------------------------------------------------------------------- 1 | @component checkSetAttributeHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkSetAttribute:test { 8 | #setAttributeDiv { 9 | set-attribute: data-test "some data"; 10 | } 11 | func: checkSetAttribute; 12 | } 13 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/set-attribute/checkSetAttribute.js: -------------------------------------------------------------------------------- 1 | function checkSetAttribute(o) { 2 | let checkSetAttributeEl = _initTest('checkSetAttribute'); 3 | if (!checkSetAttributeEl) return; 4 | 5 | let el = _getObj('#setAttributeDiv'); 6 | if (!el) { 7 | _fail(checkSetAttributeEl, '#setAttributeDiv not present to perform set-attribute command.'); 8 | } 9 | 10 | if (el.hasAttribute('data-test')) { 11 | if (el.getAttribute('data-test') == 'some data') { 12 | _addSuccessClass(checkSetAttributeEl); 13 | } else { 14 | _fail(checkSetAttributeEl, 'Added attribute "data-test" to #setAttributeDiv but it does not contain the text "some data". Element:', el); 15 | } 16 | } else { 17 | _fail(checkSetAttributeEl, 'Failed to add the attribute "data-test" to #setAttributeDiv. Element:', el); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/set-class/checkSetClass.acss: -------------------------------------------------------------------------------- 1 | @component checkSetClassHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkSetClass:test { 8 | #setClassBox { 9 | set-class: "classes with .quotes"; 10 | func: checkSetClassA; 11 | set-class: .someclasses .without .thequotes; 12 | func: checkSetClassB; 13 | set-class: moreclasses with no dots; 14 | func: checkSetClassFinal; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/set-property/checkSetProperty.acss: -------------------------------------------------------------------------------- 1 | @component checkSetPropertyHTML { 2 | html { 3 | 4 | } 5 | } 6 | 7 | #checkSetProperty:test { 8 | #setPropertyInput { 9 | func: checkSetPropertyBefore; 10 | set-property: disabled false; 11 | } 12 | func: checkSetProperty; 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/stop-event-propagation/checkStopEventPropagation.js: -------------------------------------------------------------------------------- 1 | function checkStopEventPropagation(o, pars) { 2 | let checkStopEventPropagationEl = _initTest('checkStopEventPropagation'); 3 | if (!checkStopEventPropagationEl) return; 4 | 5 | if (pars[0] !== 1 || pars[1] !== 1) { 6 | _fail(checkStopEventPropagationEl, 'It failed to handle stop-event-propagation correctly. pars[0]:', pars[0], 'pars[1]:', pars[1]); 7 | } else { 8 | _addSuccessClass(checkStopEventPropagationEl); 9 | } 10 | 11 | _addSuccessClass(checkStopEventPropagationEl); 12 | } 13 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/stop-immediate-event-propagation/checkStopImmediateEventPropagation.js: -------------------------------------------------------------------------------- 1 | function checkStopImmediateEventPropagation(o, pars) { 2 | let checkStopImmediateEventPropagationEl = _initTest('checkStopImmediateEventPropagation'); 3 | if (!checkStopImmediateEventPropagationEl) return; 4 | 5 | if (pars[0] === true) { 6 | _fail(checkStopImmediateEventPropagationEl, 'It failed to stop-immediate-event-propagation and ran the class event on the same element.'); 7 | } else { 8 | _addSuccessClass(checkStopImmediateEventPropagationEl); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/style/checkStyle.acss: -------------------------------------------------------------------------------- 1 | #checkStyle:test { 2 | style: background-color green; 3 | func: checkStyle; 4 | } 5 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/style/checkStyle.js: -------------------------------------------------------------------------------- 1 | function checkStyle(o) { 2 | // Check that the element to remove the class from is definitely there. 3 | let checkStyleEl = _initTest('checkStyle'); 4 | if (!checkStyleEl) return; 5 | 6 | // Check if the class is no longer there. 7 | if (checkStyleEl.style.backgroundColor != 'green') { 8 | _fail(checkStyleEl, 'Green was not set as the background color of the test element.'); 9 | return; 10 | } 11 | 12 | _addSuccessClass(checkStyleEl); 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/take-class/checkTakeClass.acss: -------------------------------------------------------------------------------- 1 | @component checkTakeClassHTML { 2 | html { 3 |

Click on a fruit to select it.

4 | 5 |
Apple
6 |
Orange
7 |
Lemon
8 |
Lime
9 | } 10 | } 11 | 12 | #checkTakeClass:test { 13 | #takeClassOrange { 14 | take-class: .taken; 15 | func: checkTakeClassA; 16 | } 17 | #takeClassLime { 18 | take-class: .taken; 19 | func: checkTakeClassFinal; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/toggle-class/checkToggleClass.acss: -------------------------------------------------------------------------------- 1 | @component checkToggleClassHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #checkToggleClass:test { 8 | #toggleClassBox { 9 | toggle-class: .butNotReally; 10 | func: checkToggleClassA; 11 | toggle-class: .butNotReally; 12 | func: checkToggleClassFinal; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/toggle-class/checkToggleClass.js: -------------------------------------------------------------------------------- 1 | function checkToggleClassA(o) { 2 | let checkToggleClassEl = _initTest('checkToggleClass'); 3 | if (!checkToggleClassEl) return; 4 | 5 | if (!_hasClassObj(_getObj('#toggleClassBox'), 'butNotReally')) { 6 | _fail(checkToggleClassEl, 'The first toggle did not add the class.'); 7 | } 8 | } 9 | 10 | 11 | 12 | function checkToggleClassFinal(o) { 13 | let checkToggleClassEl = _initTest('checkToggleClass'); 14 | if (!checkToggleClassEl) return; 15 | 16 | if (_hasClassObj(_getObj('#toggleClassBox'), 'butNotReally')) { 17 | _fail(checkToggleClassEl, 'The second toggle did not remove the class.'); 18 | return; 19 | } 20 | 21 | _addSuccessClass(checkToggleClassEl); 22 | } 23 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/trigger-real/checkTriggerReal.acss: -------------------------------------------------------------------------------- 1 | @component checkTriggerRealHTML { 2 | p:draw { 3 | func: checkTriggerRealSetUpDocumentEvent; 4 | trigger-real: click; 5 | } 6 | p:click { 7 | render: "Hello. Is it me you're looking for too?"; 8 | } 9 | html { 10 |

11 | } 12 | } 13 | 14 | #checkTriggerReal:test { 15 | /* The test get runs from a document click event to test that it is true click event and not just a call to a Active CSS config event. */ 16 | } 17 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/trigger-real/checkTriggerReal.js: -------------------------------------------------------------------------------- 1 | function checkTriggerReal(o) { 2 | let checkTriggerRealEl = _initTest('checkTriggerReal'); 3 | if (!checkTriggerRealEl) return; 4 | 5 | let el = _getObj('#checkTriggerReal p'); 6 | if (!el) { 7 | _fail(checkTriggerRealEl, '#checkTriggerReal p not there for the test.'); 8 | } else if (el.innerHTML !== 'Hello. Is it me you\'re looking for too?') { 9 | _fail(checkTriggerRealEl, 'target div does not contain "Hello. Is it me you\'re looking for too?" after test.'); 10 | } else { 11 | _addSuccessClass(checkTriggerRealEl); 12 | } 13 | } 14 | 15 | function checkTriggerRealSetUpDocumentEvent(o) { 16 | let el = document.querySelector('#checkTriggerReal p'); 17 | el.addEventListener('click', function() { 18 | checkTriggerReal(o); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/trigger/checkTrigger.acss: -------------------------------------------------------------------------------- 1 | @component checkTriggerHTML { 2 | p:draw { 3 | trigger: renderSomething; 4 | } 5 | p:renderSomething { 6 | render: "Hello. Is it me you're looking for?"; 7 | func: checkTrigger; 8 | } 9 | html { 10 |

11 | } 12 | } 13 | 14 | #checkTrigger:test { 15 | } 16 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/trigger/checkTrigger.js: -------------------------------------------------------------------------------- 1 | function checkTrigger(o) { 2 | let checkTriggerEl = _initTest('checkTrigger'); 3 | if (!checkTriggerEl) return; 4 | 5 | let el = _getObj('#checkTrigger p'); 6 | if (!el) { 7 | _fail(checkTriggerEl, '#checkTrigger p not there for the test.'); 8 | } else if (el.innerHTML !== 'Hello. Is it me you\'re looking for?') { 9 | _fail(checkTriggerEl, 'target div does not contain "Hello. Is it me you\'re looking for?" after test.'); 10 | } else { 11 | _addSuccessClass(checkTriggerEl); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/url-change/checkUrlChange.acss: -------------------------------------------------------------------------------- 1 | /* Karma changed as of 25.12.20 and the URL remains /context... works fine in a real browser though. 2 | #content:draw { 3 | render-before-end: "
"; 4 | } 5 | 6 | #checkUrlChange:test { 7 | url-change: "/test/funky/url" "Funky test URL"; 8 | func: checkUrlChange; 9 | } 10 | */ -------------------------------------------------------------------------------- /core-test/tests/commands/built-in/url-change/checkUrlChange.js: -------------------------------------------------------------------------------- 1 | function checkUrlChange(o) { 2 | let checkUrlChangeEl = _initTest('checkUrlChange'); 3 | if (!checkUrlChangeEl) return; 4 | 5 | let urlTestOk = false, titleTestOk = false; 6 | 7 | if (window.location.pathname === '/test/funky/url') { 8 | urlTestOk = true; 9 | } else { 10 | _fail(checkUrlChangeEl, 'url-change failed to change the URL to "/test/funky/url", window.location.pathname:', window.location.pathname); 11 | } 12 | 13 | if (document.title === 'Funky test URL') { 14 | titleTestOk = true; 15 | } else { 16 | _fail(checkUrlChangeEl, 'url-change failed to change the document.title to "Funky test URL", document.title:', document.title); 17 | } 18 | 19 | if (urlTestOk && titleTestOk) { 20 | _addSuccessClass(checkUrlChangeEl); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core-test/tests/core/await/await-ajax.acss: -------------------------------------------------------------------------------- 1 | @component checkAwaitAjaxHTML private { 2 | &:componentOpen { 3 | div { 4 | ajax: "/base/core-test/tests/resource-files/ajax-test-1.txt" JSON await; 5 | render: " 6 |

{checkAjaxTitle}

7 |

{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 |
\/* comment *\//*comment $&*;'@~*/
/* comment */ 7 | /* comment */ 8 | } 9 | } 10 | 11 | /*** 12 | * Another comment style. 13 | * 14 | // sdlkfjsdlkj 15 | * This is a test. 16 | * Syntax: {==}"1\"!"$&*;'@~ 17 | */ 18 | 19 | #comments:test { 20 | /* Do something.! // sdlkfjsdlkj */ 21 | func: comments /* lkjsdflkjsdf*/;/*sdjfh*/ 22 | /*kjhwer*/} 23 | -------------------------------------------------------------------------------- /core-test/tests/core/comments/comments.js: -------------------------------------------------------------------------------- 1 | function comments(o) { 2 | let commentsEl = _initTest('comments'); 3 | if (!commentsEl) return; 4 | 5 | let divEl = _getObj('#commentsDiv'); 6 | if (!divEl) { 7 | _fail(commentsEl, 'Comment component test element #commentsDiv not found.'); 8 | } 9 | if (divEl.innerHTML != '/* comment */') { 10 | _fail(commentsEl, 'Escaped comment did not render in the test div, should be /* comment */, but was:', divEl.innerHTML); 11 | } 12 | 13 | _addSuccessClass(commentsEl); 14 | } 15 | -------------------------------------------------------------------------------- /core-test/tests/core/continue-after-element-removal/continueAfterElementRemoval.acss: -------------------------------------------------------------------------------- 1 | @component continueAfterElementRemovalHTML { 2 | html { 3 |
4 | } 5 | } 6 | 7 | #continueAfterElementRemoval:test { 8 | func: continueAfterElementRemoval_1; 9 | #continueAfterElementRemovalDiv { 10 | remove: self; 11 | var: continueAfterElementVar "this ran"; 12 | } 13 | #continueAfterElementRemovalDivElDoesNotExist { 14 | var: continueAfterElementVar "This shouldn't run at all"; 15 | } 16 | func: continueAfterElementRemovalFinal {continueAfterElementVar}; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/ajax-pre-get-test-1.txt: -------------------------------------------------------------------------------- 1 | {"checkAjaxPreGetTitle":"Rod","checkAjaxPreGetAddress":"27 Madeup Road, Blithering, Ploushershire."} 2 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/ajax-test-1.txt: -------------------------------------------------------------------------------- 1 | {"checkAjaxTitle":"Rod","checkAjaxAddress":"27 Madeup Road, Blithering, Ploushershire."} 2 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/building-cliff-clouds-67235-tn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/core-test/tests/resource-files/building-cliff-clouds-67235-tn.jpg -------------------------------------------------------------------------------- /core-test/tests/resource-files/cat2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/core-test/tests/resource-files/cat2.gif -------------------------------------------------------------------------------- /core-test/tests/resource-files/cat3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/core-test/tests/resource-files/cat3.gif -------------------------------------------------------------------------------- /core-test/tests/resource-files/load-config-test.acss: -------------------------------------------------------------------------------- 1 | @component checkLoadConfigHTML { 2 | &:afterLoadConfig { 3 | #loadConfigResults { 4 | render: "Here is some text."; 5 | func: checkLoadConfig; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/load-script-test.js: -------------------------------------------------------------------------------- 1 | window._acssTestLoadScriptVar = true; 2 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/load-style-test-shadow.css: -------------------------------------------------------------------------------- 1 | div { 2 | color: rgb(255, 0, 0); 3 | } 4 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/load-style-test.css: -------------------------------------------------------------------------------- 1 | #checkLoadStyle div { 2 | color: rgb(0, 0, 255); 3 | } 4 | -------------------------------------------------------------------------------- /core-test/tests/resource-files/tiny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/core-test/tests/resource-files/tiny.png -------------------------------------------------------------------------------- /logo/activecss-150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/logo/activecss-150.jpg -------------------------------------------------------------------------------- /logo/activecss-250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/logo/activecss-250.jpg -------------------------------------------------------------------------------- /logo/activecss-50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Active-CSS/active-css/15b7da188f704c4b5388c64d2c64b2760624301b/logo/activecss-50.jpg -------------------------------------------------------------------------------- /src/commands/built-in/AddClass.js: -------------------------------------------------------------------------------- 1 | _a.AddClass = o => { // Note thisID is needed in case the "parent" selector is used. 2 | if (!_isConnected(o.secSelObj)) return false; 3 | ActiveCSS._addClassObj(o.secSelObj, o.actVal); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/AddHash.js: -------------------------------------------------------------------------------- 1 | _a.AddHash = o => { 2 | o._addHash = true; 3 | _a.UrlChange(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/Ajax.js: -------------------------------------------------------------------------------- 1 | _a.Ajax = o => { 2 | o.url = o.actVal.split(' ')[0]._ACSSRepQuo(); 3 | _ajaxDo(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/AjaxFormPreview.js: -------------------------------------------------------------------------------- 1 | _a.AjaxFormPreview = o => { 2 | // as attrAjaxForm but with preview 3 | o.formPreview = true; 4 | _a.AjaxFormSubmit(o); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/AjaxFormSubmit.js: -------------------------------------------------------------------------------- 1 | _a.AjaxFormSubmit = o => { 2 | o.formSubmit = true; 3 | const el = o.secSelObj; 4 | if (el) { 5 | o.url = el.action; 6 | _ajaxDo(o); 7 | } else { 8 | _err('Form not found', o); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/commands/built-in/AjaxPreGet.js: -------------------------------------------------------------------------------- 1 | _a.AjaxPreGet = o => { 2 | // Pre-load the url, and stores the results in an array so we don't have to run the ajax command later. 3 | o.preGet = true; 4 | _a.Ajax(o); 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/Alert.js: -------------------------------------------------------------------------------- 1 | _a.Alert = o => { 2 | alert(o.actVal._ACSSRepQuo()); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/Blur.js: -------------------------------------------------------------------------------- 1 | _a.Blur = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | document.activeElement.blur(); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/Break.js: -------------------------------------------------------------------------------- 1 | _a.Break = o => { 2 | let breakPar = o.actVal.trim(); 3 | if (DIGITREGEX.test(breakPar)) { 4 | _break['i' + o._imStCo] = breakPar.trim(); 5 | } else { 6 | _err('Invalid break parameter', o); 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /src/commands/built-in/CancelPause.js: -------------------------------------------------------------------------------- 1 | _a.CancelPause = o => { 2 | if (o.actVal == 'all') { 3 | // Perform clean-up actions with timeouts. 4 | let activeID, val, subEvCo, val2; 5 | for ([activeID, val] of Object.entries(pauseTrack)) { 6 | for ([subEvCo, val2] of Object.entries(val)) { 7 | _cleanUpAfterPause(subEvCo); 8 | } 9 | } 10 | 11 | // Reset pause tracker. Setting this to empty will stop all pauses from resuming. 12 | pauseTrack = {}; 13 | 14 | } else { 15 | _warn('cancel-pause currently only supports "all" as a parameter', o); 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/commands/built-in/CancelTimerAll.js: -------------------------------------------------------------------------------- 1 | _a.CancelTimerAll = o => { 2 | _unloadAllCancelTimer(); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnFirst.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnFirst = o => { _focusOn(o); }; // First selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnLast.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnLast = o => { _focusOn(o, 'l'); }; // Last selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnNext.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnNext = o => { _focusOn(o, 'n'); }; // Next selector in list, or nothing 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnNextCycle.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnNextCycle = o => { _focusOn(o, 'nc'); }; // Next selector in list, then cycles 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnPrevious.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnPrevious = o => { _focusOn(o, 'p'); }; // Previous selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickOnPreviousCycle.js: -------------------------------------------------------------------------------- 1 | _a.ClickOnPreviousCycle = o => { _focusOn(o, 'pc'); }; // Previous selector in list, then cycles 2 | -------------------------------------------------------------------------------- /src/commands/built-in/ClickoutsideEvent.js: -------------------------------------------------------------------------------- 1 | _a.ClickoutsideEvent = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let cid = _getActiveID(o.secSelObj); 4 | if (o.actVal.indexOf('true') !== -1) { 5 | clickOutsideSels[cid] = []; 6 | clickOutsideSels[cid][0] = true; 7 | clickOutsideSet = true; 8 | if (o.actVal.indexOf('continue') !== -1) { 9 | clickOutsideSels[cid][1] = true; 10 | } 11 | } else { 12 | if (clickOutsideSels[cid]) { 13 | clickOutsideSels[cid][0] = false; 14 | clickOutsideSet = false; 15 | } 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/commands/built-in/Clone.js: -------------------------------------------------------------------------------- 1 | _a.Clone = o => { 2 | let el = _getSel(o, o.actVal); 3 | if (el) { 4 | let ref = _getActiveID(el), obj; 5 | if (el.tagName == 'IFRAME') { 6 | if (el.contentWindow.document.readyState != 'complete') { 7 | // Iframe not ready, come back to this in 200ms to clone. 8 | setTimeout(_a.Clone.bind(this, o), 200); 9 | return false; 10 | } 11 | el = el.contentWindow.document.body; 12 | } 13 | mimicClones[ref] = document.importNode(el, true); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /src/commands/built-in/Continue.js: -------------------------------------------------------------------------------- 1 | _a.Continue = o => { 2 | let continuePar = o.actVal.trim(); 3 | if (DIGITREGEX.test(continuePar)) { 4 | _continue['i' + o._imStCo] = continuePar.trim(); 5 | } else { 6 | _err('Invalid continue parameter: "' + o.actVal + '"', o); 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /src/commands/built-in/CopyToClipboard.js: -------------------------------------------------------------------------------- 1 | _a.CopyToClipboard = o => { 2 | let el = _getSel(o, o.actVal); 3 | var arr = ['INPUT', 'TEXTAREA']; 4 | if (arr.indexOf(el.tagName) !== -1) { 5 | let rO = (el.getAttribute('readonly') == 'readonly'); 6 | el.removeAttribute('readonly'); 7 | el.select(); 8 | document.execCommand('copy'); 9 | if (rO) el.setAttribute('readonly', 'readonly'); 10 | } else { 11 | let txt = document.createElement('textarea'); 12 | txt.id = 'activecss-copy-field'; 13 | txt.innerHTML = el.innerText; 14 | document.body.appendChild(txt); 15 | let docTxt = document.getElementById('activecss-copy-field'); 16 | docTxt.select(); 17 | document.execCommand('copy'); 18 | ActiveCSS._removeObj(docTxt); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /src/commands/built-in/DialogClose.js: -------------------------------------------------------------------------------- 1 | _a.DialogClose = o => _dialog(o, 'close'); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/DialogShow.js: -------------------------------------------------------------------------------- 1 | _a.DialogShow = o => _dialog(o, 'show'); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/DocumentTitle.js: -------------------------------------------------------------------------------- 1 | _a.DocumentTitle = o => { 2 | _setDocTitle(o.actVal._ACSSRepQuo()); 3 | }; 4 | -------------------------------------------------------------------------------- /src/commands/built-in/Empty.js: -------------------------------------------------------------------------------- 1 | _a.Empty = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | let els = _getSels(o, o.actVal); 4 | if (els) { 5 | els.forEach(obj => { 6 | obj.innerHTML = ''; 7 | }); 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /src/commands/built-in/Eval.js: -------------------------------------------------------------------------------- 1 | _a.Eval = o => { 2 | // Run JavaScript dynamically in the global window scope. This is straight-up JavaScript that runs globally. 3 | let evalContent = o.actVal.slice(2, -2); 4 | eval(evalContent); // jshint ignore:line 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/Exit.js: -------------------------------------------------------------------------------- 1 | _a.Exit = o => { 2 | // Exit out of all current loops and prevent further target running and bubbling. 3 | _immediateStop(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/ExitTarget.js: -------------------------------------------------------------------------------- 1 | _a.ExitTarget = o => _exitTarget(o); 2 | 3 | const _exitTarget = o => { 4 | exitTarget['i' + o._imStCo] = true; 5 | }; 6 | -------------------------------------------------------------------------------- /src/commands/built-in/FadeIn.js: -------------------------------------------------------------------------------- 1 | _a.FadeIn = o => _fade(o); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FadeOut.js: -------------------------------------------------------------------------------- 1 | _a.FadeOut = o => _fade(o); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FadeTo.js: -------------------------------------------------------------------------------- 1 | _a.FadeTo = o => _fade(o); 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOff.js: -------------------------------------------------------------------------------- 1 | _a.FocusOff = o => { 2 | if (!_isConnected(o.secSelObj)) return false; 3 | _a.Blur(o); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnFirst.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnFirst = o => { _focusOn(o); }; // First selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnLast.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnLast = o => { _focusOn(o, 'l'); }; // Last selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnNext.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnNext = o => { _focusOn(o, 'n'); }; // Next selector in list, or nothing 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnNextCycle.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnNextCycle = o => { _focusOn(o, 'nc'); }; // Next selector in list, then cycles 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnPrevious.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnPrevious = o => { _focusOn(o, 'p'); }; // Previous selector in list 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FocusOnPreviousCycle.js: -------------------------------------------------------------------------------- 1 | _a.FocusOnPreviousCycle = o => { _focusOn(o, 'pc'); }; // Previous selector in list, then cycles 2 | -------------------------------------------------------------------------------- /src/commands/built-in/FormReset.js: -------------------------------------------------------------------------------- 1 | _a.FormReset = o => { 2 | let el = _getSel(o, o.actVal); 3 | if (el && el.tagName == 'FORM') el.reset(); 4 | }; 5 | -------------------------------------------------------------------------------- /src/commands/built-in/FullscreenExit.js: -------------------------------------------------------------------------------- 1 | _a.FullscreenExit = o => { 2 | if (document.exitFullscreen) { 3 | document.exitFullscreen(); 4 | } else if (document.webkitExitFullscreen) { 5 | document.webkitExitFullscreen(); 6 | } else if (document.mozCancelFullScreen) { 7 | document.mozCancelFullScreen(); 8 | } else if (document.msExitFullscreen) { 9 | document.msExitFullscreen(); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/commands/built-in/FullscreenOn.js: -------------------------------------------------------------------------------- 1 | _a.FullscreenOn = o => { 2 | let el = o.secSelObj; 3 | if (el.requestFullscreen) { 4 | el.requestFullscreen(); 5 | } else if (el.mozRequestFullScreen) { /* Firefox */ 6 | el.mozRequestFullScreen(); 7 | } else if (el.webkitRequestFullscreen) { /* Chrome, Safari and Opera */ 8 | el.webkitRequestFullscreen(); 9 | } else if (el.msRequestFullscreen) { /* IE/Edge */ 10 | el.msRequestFullscreen(); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /src/commands/built-in/Func.js: -------------------------------------------------------------------------------- 1 | _a.Func = o => { 2 | // Parameters are now in pars(), separated by a comma. Change made 2.10.0 to align it more to JS to make it more powerful. 3 | let str = o.actValSing; 4 | let funcArr = o.actValSing.split(' '); 5 | let func = funcArr.shift(); 6 | let parsStr = funcArr.join(' '); 7 | 8 | // Get the parameters. 9 | if (parsStr.indexOf('pars(') === -1) parsStr = 'pars(' + parsStr + ')'; 10 | 11 | let parArr = _extractVarsFromPars(parsStr, o); 12 | 13 | if (!window[func] || typeof window[func] !== 'function') _err('Function ' + func + ' does not exist, is not a function, or is not in the window scope.', o); 14 | window[func](o, parArr); 15 | }; 16 | -------------------------------------------------------------------------------- /src/commands/built-in/IframeReload.js: -------------------------------------------------------------------------------- 1 | _a.IframeReload = o => { 2 | // A cross-domain solution is to clone the iframe, insert before the original iframe and then remove the original iframe. 3 | let el = o.secSelObj.cloneNode(false); 4 | o.secSelObj.parentNode.insertBefore(el, o.secSelObj); 5 | ActiveCSS._removeObj(o.secSelObj); 6 | }; 7 | -------------------------------------------------------------------------------- /src/commands/built-in/LoadAsAjax.js: -------------------------------------------------------------------------------- 1 | _a.LoadAsAjax = o => { 2 | let el = document.querySelector(o.actVal); 3 | if (!el.isConnected) return; 4 | if (!el) { 5 | let pageContents = '

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('