Very nice, but IMO, this is over-engineering. We are talking about a space-delimited list where some portion of it is considered "fixed" another portion is user-settable and another portion comes from other attributes. Some generic StringUtils or ListUtils might be more PAYG, especially if they are opt-in and just used to manage the user-settable portion. Think of it this way: Every MDL app needs to carry around ClassList even if they never change the classname. I don't care too much since it is in MDL and not in the core, so keep it if you want to, but I can think of lots of other tasks we should be working on than creating cool classes to manage a list of strings.
My 2 cents, -Alex On 3/1/18, 3:51 PM, "Harbs" <harbs.li...@gmail.com> wrote: >What do you think of the CSSClassList class I just committed? > >I *think* that makes the pattern more recognizable and probably is less >heavy if more than one class can be used. > >Harbs > >> On Mar 1, 2018, at 11:56 PM, Piotr Zarzycki <piotrzarzyck...@gmail.com> >>wrote: >> >> Harbs, Alex, >> >> I just pushed implementation of computeFinalClassNames to >> branch feature/type_names_class_name_issue124. You can review >> implementation in this commit [1] and example of usage in Card and >>Button. >> >> I have tested with Harbs example [3] and with Card by changing orders. >>It's >> working. >> >> [1] >>https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fbit.ly%2F >>2HTHaFQ&data=02%7C01%7Caharui%40adobe.com%7C9ba2ae2d1a6e4fdc774508d57fcf6 >>c56%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C1%7C636555451956879397&sdata >>=5EDairk%2BdGWuPE20vIR8jGFcRSflwqQIcw48oCPydYU%3D&reserved=0 >> [2] >>https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fbit.ly%2F >>2oJgKOf&data=02%7C01%7Caharui%40adobe.com%7C9ba2ae2d1a6e4fdc774508d57fcf6 >>c56%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C1%7C636555451956879397&sdata >>=8hIfKGYzhaInYfubnf3lUKbYZWRUANzEcWHj3Pkn3Ho%3D&reserved=0 >> [3] >>https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fbit.ly%2F >>2F734nx&data=02%7C01%7Caharui%40adobe.com%7C9ba2ae2d1a6e4fdc774508d57fcf6 >>c56%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C1%7C636555451956879397&sdata >>=9I9q1KjL5VNE5CJSAVTtwN9hhR2rco4ovIzJjQ74%2FeY%3D&reserved=0 >> >> Waiting for your review. >> >> Thanks, >> Piotr >> >> >> 2018-02-28 23:31 GMT+01:00 Piotr Zarzycki <piotrzarzyck...@gmail.com>: >> >>> Let me play with implementation of that function. It seems to me that >>>will >>> be much cleaner than current solution. >>> >>> If user actually wanted to do anythin with className - let the >>>overriding >>> speaks. >>> >>> >>> >>> On Wed, Feb 28, 2018, 21:51 Alex Harui <aha...@adobe.com.invalid> >>>wrote: >>> >>>> On 2/28/18, 12:27 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>>> >>>>> OK. I think that will work for DML components, but what if there’s a >>>>>bead >>>>> which needs to add class names? What would be the “right” way to do >>>>>that? >>>>> A bead cannot override the function on the strand. >>>> >>>> Do we have beads that manipulate className? >>>> >>>> IMO, the principle behind how to handle that is knowing whether you >>>>are >>>> sharing something or not. There may not be one right way to handle >>>>it, >>>> but if I had to handle it, I would have the bead set something in the >>>> model or presentation model of the component. And the component would >>>> override computeFinalClassNames to take that into account. >>>> >>>> >>>> Although having just written that, maybe this computeFinalClassNames >>>> should be in the view instead of on the base class so it is >>>>replaceable >>>> instead of overridable. >>>> >>>> Thoughts? >>>> -Alex >>>>> >>>>>> On Feb 28, 2018, at 10:17 PM, Alex Harui <aha...@adobe.com.INVALID> >>>>>> wrote: >>>>>> >>>>>> I think you are missing that the element.className is set to >>>>>> computeFinalClassNames. So the user is welcome to manipulate the >>>>>> UIBase.className however they see fit. They can assign it a whole >>>>>>new >>>>>> space-delimited list if they want. But what gets set on >>>>>> element.className >>>>>> is computed from typeNames and className by default, and MDL would >>>>>> override it to factor in fab, raised, colored into the computing of >>>>>>the >>>>>> final classnames. >>>>>> >>>>>> I would prefer that we don't make requirements on users as to what >>>>>>they >>>>>> can or can't do with the className property, like requiring them to >>>>>>use >>>>>> addClassName/removeClassNames. MXML and States might set className, >>>> as >>>>>> could any other AS logic. I think folks may even be used to setting >>>>>> className in JavaScript. So letting UIBase.className be the >>>>>>"variable" >>>>>> part and having computeFinalClassNames be the way the "fixed" part >>>>>>is >>>>>> handled makes sense to me. >>>>>> >>>>>> Of course, I could be wrong... >>>>>> -Alex >>>>>> >>>>>> On 2/28/18, 12:03 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>>>>> >>>>>>> The problem which sparked this whole issue is like this: >>>>>>> >>>>>>> 1. We have some components (i.e. in MDL) which add “pieces” to the >>>>>>> class >>>>>>> names (such as “fab”, “raised”, “colored”, etc. >>>>>>> 2. The client might subsequently set the className to something >>>>>>>else. >>>>>>> 3. When the component sets the “pieces” first and the client sets >>>>>>>the >>>>>>> className later, the client will overwrite these “pieces” which >>>>>>>were >>>>>>> added by the component. >>>>>>> >>>>>>> My suggestion to have addClassName() and removeClassName() was to >>>>>>>have >>>>>>> a >>>>>>> “safe” way to add class names which would get computed together >>>>>>>with >>>>>>> the >>>>>>> className when the className is replaced. >>>>>>> >>>>>>> The way you have it seems to just be modifying the existing >>>>>>>className >>>>>>> property. If that’s overwritten by a client, the logic falls apart. >>>>>>> >>>>>>> It feels like only having typeNames which are set inside the >>>>>>>component >>>>>>> and className which is set outside the component is not really >>>>>>>enough. >>>>>>> (Unless I’m missing something.) >>>>>>> >>>>>>> Harbs >>>>>>> >>>>>>>> On Feb 28, 2018, at 9:31 PM, Alex Harui <aha...@adobe.com.INVALID> >>>>>>>> wrote: >>>>>>>> >>>>>>>> On 2/28/18, 10:44 AM, "Harbs" <harbs.li...@gmail.com> wrote: >>>>>>>> >>>>>>>>> If it’s not public, I don’t see how a utility method could call >>>>>>>>>it >>>>>>>>> though. >>>>>>>> >>>>>>>> I didn't think the utility methods like >>>>>>>>addClassName/removeClassName >>>>>>>> would >>>>>>>> need to alter computeFinalClassNames(). >>>>>>>> >>>>>>>> AIUI, for most UIBase subclasses, the final element.className is a >>>> mix >>>>>>>> of >>>>>>>> the className property and the typeNames. The typenames are >>>>>>>>thought >>>>>>>> to >>>>>>>> be >>>>>>>> "fixed" and the space-delimited list of names in className are the >>>>>>>> ones >>>>>>>> the user wants to manipulate in their code. So, I would expect >>>>>>>>them >>>>>>>> to >>>>>>>> write: >>>>>>>> >>>>>>>> org.apache.royale.utils.addClassName(myComponent, "pinkStyles"); >>>>>>>> >>>>>>>> >>>>>>>> addClassName should just do something like: >>>>>>>> >>>>>>>> myComponent.className += value; >>>>>>>> >>>>>>>> That will call the className setter that will run: >>>>>>>> >>>>>>>> element.className = computeFinalClassNames(); >>>>>>>> >>>>>>>> If you call >>>>>>>> >>>>>>>> org.apache.royale.utils.removeClassName(myComponent, >>>>>>>>"pinkStyles"); >>>>>>>> >>>>>>>> removeClassName should just do something like: >>>>>>>> >>>>>>>> Var s:String = myComponent.className; >>>>>>>> Var c:int = s.indexOf(nameToRemove + " "); >>>>>>>> If (c != -1) >>>>>>>> s = s.substr(0, c) + s.substr(c + nameToRemove.length + 1); >>>>>>>> Else >>>>>>>> { >>>>>>>> c= s.indexOf(" " + nameToRemove); >>>>>>>> if (c != -1) >>>>>>>> s = s.substr(0, c); // remove last item >>>>>>>> } >>>>>>>> myComponent.className = s; >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> It seems like it should be that simple. What am I missing? >>>>>>>> >>>>>>>> -Alex >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>>> On Feb 28, 2018, at 8:21 PM, Alex Harui >>>>>>>>>><aha...@adobe.com.INVALID> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On 2/28/18, 9:50 AM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com >>>>>>>>>> <mailto:piotrzarzyck...@gmail.com>> wrote: >>>>>>>>>> >>>>>>>>>>> Ok Understand, but do you agree that computeFinalClassNames - >>>>>>>>>>>is >>>>>>>>>>> something >>>>>>>>>>> which is in the UIBase ? >>>>>>>>>> >>>>>>>>>> Yes, and probably protected instead of public. The one in >>>>>>>>>>UIBase >>>>>>>>>> just >>>>>>>>>> appends typenames to className. It gets overridden in MDL where >>>>>>>>>> needed >>>>>>>>>> for shadow and other attributes. >>>>>>>>>> >>>>>>>>>> My 2 cents, >>>>>>>>>> -Alex >>>>>>>>>>> >>>>>>>>>>> 2018-02-28 18:47 GMT+01:00 Alex Harui >>>>>>>>>>><aha...@adobe.com.invalid>: >>>>>>>>>>> >>>>>>>>>>>> I think that in the shadow setter, it would change _shadow and >>>>>>>>>>>> call >>>>>>>>>>>> setClassName(computeFinalClassNames()); >>>>>>>>>>>> >>>>>>>>>>>> On 2/28/18, 9:33 AM, "Piotr Zarzycki" >>>>>>>>>>>><piotrzarzyck...@gmail.com >>>>> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Alex, >>>>>>>>>>>>> >>>>>>>>>>>>> So we are getting back to the idea where you proposed to have >>>>>>>>>>>>> function >>>>>>>>>>>>> which computes everything. >>>>>>>>>>>>> >>>>>>>>>>>>> override public function computeFinalClassNames():String >>>>>>>>>>>>> { >>>>>>>>>>>>> return super.computeFinalClassNames() + " " + _shadow; >>>>>>>>>>>>> } >>>>>>>>>>>>> >>>>>>>>>>>>> Where does that function should be placed ? Does that >>>>>>>>>>>>>function >>>>>>>>>>>>> should >>>>>>>>>>>> be >>>>>>>>>>>>> called in addedToParent plus whenever someone change _shadow >>>>>>>>>>>>>? - >>>>>>>>>>>>> >>>>>>>>>>>>> Because I really don't know how to handle scenario where you >>>> have >>>>>>>>>>>>> some >>>>>>>>>>>>> property isActive = true/false and I need to add/remove >>>>>>>>>>>>>class. - >>>>>>>>>>>>> In >>>>>>>>>>>>> the >>>>>>>>>>>>> first launch I use computeFinalClassNames, but how to handle >>>>>>>>>>>>> changing >>>>>>>>>>>> ? >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2018-02-28 18:26 GMT+01:00 Alex Harui >>>>>>>>>>>>><aha...@adobe.com.invalid >>>>> : >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Piotr, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I think am I not communicating the principles effectively. >>>>>>>>>>>>>> >>>>>>>>>>>>>> First, IMO, addClassName and removeClassName should not be >>>>>>>>>>>>>>in >>>>>>>>>>>>>> UIBase. >>>>>>>>>>>>>> Lots of apps can be written without needing these methods. >>>>>>>>>>>>>>I >>>>>>>>>>>>>> think >>>>>>>>>>>> they >>>>>>>>>>>>>> can be written as utility functions. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Second, the computation of the final element.className >>>>>>>>>>>>>>should >>>>>>>>>>>> represent >>>>>>>>>>>>>> the state of the component, so I don't get why you need an >>>>>>>>>>>>>> _internalClassName or should ever set it to "". The >>>> computation >>>>>>>>>>>>>> for >>>>>>>>>>>> a >>>>>>>>>>>>>> component with a shadow would be to check the shadow >>>>>>>>>>>>>>property >>>>>>>>>>>>>> and >>>>>>>>>>>>>> if >>>>>>>>>>>> it >>>>>>>>>>>>>> is >>>>>>>>>>>>>> true, add a className for the shadow to the list. Then I >>>>>>>>>>>>>>think >>>>>>>>>>>>>> you >>>>>>>>>>>>>> wouldn't have the problem you showed in the animated GIF. >>>>>>>>>>>>>>When >>>>>>>>>>>>>> the >>>>>>>>>>>>>> classname property is set from the outside by >>>>>>>>>>>>>> MXMLDataInterpreter >>>>>>>>>>>>>> or >>>>>>>>>>>>>> even >>>>>>>>>>>>>> user-written code, those classNames are added to the list >>>>>>>>>>>>>>with >>>>>>>>>>>>>> the >>>>>>>>>>>>>> typeNames and the shadow className if shadow is true and >>>>>>>>>>>>>>then >>>>>>>>>>>>>> set >>>>>>>>>>>>>> on >>>>>>>>>>>> the >>>>>>>>>>>>>> element. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Finally, for addClassName and removeClassName, and all other >>>>>>>>>>>>>> Royale >>>>>>>>>>>>>> code, >>>>>>>>>>>>>> we don't want to do much if any parameter checking. That is >>>>>>>>>>>>>> also >>>>>>>>>>>>>> just-in-case code. The production code should not be >>>>>>>>>>>>>>passing >>>> in >>>>>>>>>>>> null or >>>>>>>>>>>>>> other bad values. And once you fix that, then the checks >>>>>>>>>>>>>>that >>>>>>>>>>>>>> you >>>>>>>>>>>> have >>>>>>>>>>>>>> written do not add value. I have proposed that there are >>>>>>>>>>>>>> debug-only >>>>>>>>>>>>>> code >>>>>>>>>>>>>> that does parameter checking. There is a goog.DEBUG flag >>>>>>>>>>>>>>you >>>>>>>>>>>>>> can >>>>>>>>>>>>>> use >>>>>>>>>>>>>> for >>>>>>>>>>>>>> that. >>>>>>>>>>>>>> >>>>>>>>>>>>>> HTH, >>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 2/28/18, 12:40 AM, "Piotr Zarzycki" >>>>>>>>>>>>>> <piotrzarzyck...@gmail.com> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Alex, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Sorry about that. Let me show you code and I recorded GIF >>>>>>>>>>>>>>>with >>>>>>>>>>>> problem >>>>>>>>>>>>>>> debugging. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> *Code in UIBase which I have implemented:* >>>>>>>>>>>>>>> addClassName and removeClassName [1]. >>>>>>>>>>>>>>> addedToParent what is happen with internal field which I >>>>>>>>>>>>>>>have >>>>>>>>>>>>>>> added >>>>>>>>>>>> [2] >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> *Code for Testing* [3] - I'm adding first className, than >>>>>>>>>>>>>>> shadow. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> *GIF* [4] We are starting from the constructor. Pay >>>>>>>>>>>>>>>attention >>>>>>>>>>>>>>> to >>>>>>>>>>>>>>> the >>>>>>>>>>>>>>> moment >>>>>>>>>>>>>>> where className is being wiped out, later I have to use my >>>>>>>>>>>>>>> internal >>>>>>>>>>>>>>> variable to get it back. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Does that more clean now ? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>>> che.org%2FEumG&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> sdata=cDT88OF63TdBMPxYY2vwMSIRxD%2FP3DvwHupj%2BQHsofw%3D& >>>> reserve >>>>>>>>>>>>>>> d= >>>>>>>>>>>>>>> 0 >>>>>>>>>>>>>>> [2] >>>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>>> che.org%2FArmU&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>>> sdata=m6whImrP70u7kzRxCbErlxCHWef8TK >>>> Nejwm4Sr7bw7g%3D&reserved=0 >>>>>>>>>>>>>>> [3] >>>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>>> che.org%2FKrxq&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>>> sdata=tpeUYSQIXGXtES8hyr7zSeet528ZTc >>>> zSltcNccqRGDo%3D&reserved=0 >>>>>>>>>>>>>>> [4] >>>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2F1drv.ms%2 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Fu%2Fs!ApVpLyjpHDC2hPtoCi65kIZZPwjSpQ >>>> &data=02%7C01%7Caharui%40ad >>>>>>>>>>>>>>> ob >>>>>>>>>>>>>>> e >>>>>>>>>>>> .com >>>>>>>>>>>>>> %7C >>>>>>>>>>>>>>> ee5c84b4e3ff4ddb578008d57e87046f% >>>> 7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>> cee1%7C0%7C >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 0%7C636554040718214998&sdata=eX%2FgZ0MA% >>>> 2BdQJjcpYtMkk1pw3r0iVkdR >>>>>>>>>>>>>>> a% >>>>>>>>>>>>>> 2F6TWRTG >>>>>>>>>>>>>>> 10OY%3D&reserved=0 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>> Piotr >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2018-02-27 23:31 GMT+01:00 Alex Harui >>>>>>>>>>>>>>> <aha...@adobe.com.invalid>: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Piotr, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I could not understand this explanation. Might be better >>>>>>>>>>>>>>>>to >>>>>>>>>>>>>>>> show >>>>>>>>>>>>>> actual >>>>>>>>>>>>>>>> code. For example in #3, there is a cssClass variable >>>>>>>>>>>>>>>>that I >>>>>>>>>>>> don't >>>>>>>>>>>>>> know >>>>>>>>>>>>>>>> about. Also you mention at the bottom setting something >>>>>>>>>>>>>>>>as >>>>>>>>>>>>>>>> empty, >>>>>>>>>>>>>> but >>>>>>>>>>>>>>>> I'm >>>>>>>>>>>>>>>> not sure what that is. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> However, IMO, this code should be in utility functions, >>>>>>>>>>>>>>>>not >>>> in >>>>>>>>>>>>>> UIBase. >>>>>>>>>>>>>>>> I >>>>>>>>>>>>>>>> think plenty of useful applications can be built without >>>>>>>>>>>>>>>> changing >>>>>>>>>>>>>>>> classNames at runtime. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I'm off-line for the next several hours so we can pick >>>>>>>>>>>>>>>>this >>>> up >>>>>>>>>>>> again >>>>>>>>>>>>>> in >>>>>>>>>>>>>>>> your morning. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thanks for working on it, >>>>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 2/27/18, 2:21 PM, "Piotr Zarzycki" >>>>>>>>>>>>>>>> <piotrzarzyck...@gmail.com> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Here is how I'm thinking to resolve that issue. I would >>>>>>>>>>>>>>>>>take >>>>>>>>>>>> Harb's >>>>>>>>>>>>>>>>> proposition and add to UIBase addClassName() and >>>>>>>>>>>> removeClassName(). >>>>>>>>>>>>>>>> Next >>>>>>>>>>>>>>>>> I >>>>>>>>>>>>>>>>> would add internal field _internalClassName:String. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> addClassName(value): >>>>>>>>>>>>>>>>> 1) Will check if provided class name exits in _className >>>>>>>>>>>>>>>>>and >>>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>> _internalClassName. >>>>>>>>>>>>>>>>> 2) Will add to _internalClassName += value >>>>>>>>>>>>>>>>> 3) Assign to the element.className in the following way: >>>>>>>>>>>>>>>> element.className >>>>>>>>>>>>>>>>> = cssClass + " " + _className + " " + typeNames; >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> removeClassName(value) >>>>>>>>>>>>>>>>> 1) Will check if provided classs name exists in >>>>>>>>>>>>>>>>>_className >>>>>>>>>>>>>>>>> or >>>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>> _internalClassName >>>>>>>>>>>>>>>>> 2) Make a replace to empty string if css class name >>>>>>>>>>>>>>>>>exists. >>>>>>>>>>>>>>>>> _className.replace(value, ""); >>>>>>>>>>>>>>>>> 3) Assign to the element.className: element.className = >>>>>>>>>>>> _className >>>>>>>>>>>>>> + " >>>>>>>>>>>>>>>> " + >>>>>>>>>>>>>>>>> typeNames; >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> In added to parent we are computing _internalClassName >>>>>>>>>>>>>>>>>with >>>>>>>>>>>>>> _className >>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>> typeNames. Then it's being set as empty. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> element.className = _internalClassName + " " + >>>>>>>>>>>>>>>>>_className >>>>>>>>>>>>>>>>> + " >>>>>>>>>>>> " + >>>>>>>>>>>>>>>>> typeNames; >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I have implemented it and it seems to be working. Waiting >>>> for >>>>>>>>>>>> your >>>>>>>>>>>>>>>>> thoughts >>>>>>>>>>>>>>>>> on that solution. The last step where we are adding all >>>> three >>>>>>>>>>>>>> fields is >>>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>> most important. Points 3 in addClassName and >>>>>>>>>>>>>>>>>removeClassName >>>>>>>>>>>>>>>>> are >>>>>>>>>>>>>>>>> necessary, >>>>>>>>>>>>>>>>> because user may want to more dynamically manipulate >>>>>>>>>>>>>>>>>classes >>>>>>>>>>>>>>>>> once >>>>>>>>>>>>>>>>> component >>>>>>>>>>>>>>>>> is created. Ex. "is-active" class is removed and added on >>>>>>>>>>>>>>>>> demand. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 2018-02-27 13:38 GMT+01:00 Piotr Zarzycki >>>>>>>>>>>>>> <piotrzarzyck...@gmail.com>: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I think I have analyzed everything and have some >>>>>>>>>>>>>>>>>> implementation >>>>>>>>>>>>>>>>>> proposition. I will try to provide it later today. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 2018-02-27 13:35 GMT+01:00 Harbs >>>>>>>>>>>>>>>>>><harbs.li...@gmail.com>: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> ExpandableSearch broke too. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki >>>>>>>>>>>>>>>>>>> <piotrzarzyck...@gmail.com> >>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Harbs, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> If you are using something more than MDL Dialog in >>>>>>>>>>>>>>>>>>>>your >>>>>>>>>>>>>>>> application >>>>>>>>>>>>>>>>>>> it >>>>>>>>>>>>>>>>>>>> would be great to get feedback whether I didn't break >>>>>>>>>>>>>>>>>>>>for >>>>>>>>>>>> you >>>>>>>>>>>>>>>>>>> anything. >>>>>>>>>>>>>>>>>>> :) >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.co >>>>>>>>>>>>>>>>>>m >>>>>>>>>>>>>>>> %7C45a065853ba1 >>>>>>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >>>>>>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>>> 9liXcy%2BPg%3D&rese >>>>>>>>>>>>>>>>>> rved=0 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.co >>>>>>>>>>>>>>>>>>m >>>>>>>>>>>>>>>> %7C45a065853ba1 >>>>>>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >>>>>>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>>> 9liXcy%2BPg%3D&rese >>>>>>>>>>>>>>>>>> rved=0>* >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>>>> 7C45a065853ba14a >>>>>>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >>>>>>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >>>>>>>>>>>>>>>>> =0 >>>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>>>> 7C45a065853ba14a >>>>>>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >>>>>>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >>>>>>>>>>>>>>>>> =0>* >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>> 7Cee5c84b4e3ff4d >>>>>>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>> cee1%7C0%7C0%7C6365540407 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 18214998&sdata=VYtgB8rsurZAHpO%2FVs% >>>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >>>>>>>>>>>>>>> % >>>>>>>>>>>>>> 3D&reserv >>>>>>>>>>>>>>> ed=0 >>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>> 7Cee5c84b4e3ff4d >>>>>>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>> cee1%7C0%7C0%7C6365540407 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 18214998&sdata=VYtgB8rsurZAHpO%2FVs% >>>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >>>>>>>>>>>>>>> % >>>>>>>>>>>>>> 3D&reserv >>>>>>>>>>>>>>> ed=0>* >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> >>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>> >>>>>>>>>>>>> Patreon: >>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>> 7Cda0fd75922c94d >>>>>>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>> cee1%7C0%7C0%7C6365543602 >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >>>> oJqA6J42ZuhcA%3D&rese >>>>>>>>>>>>> rv >>>>>>>>>>>>> ed >>>>>>>>>>>>> =0 >>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>> 7Cda0fd75922c94d >>>>>>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>> cee1%7C0%7C0%7C6365543602 >>>>>>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >>>>>>>>>>>> oJqA6J42ZuhcA%3D&reserved=0>* >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> >>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>> >>>>>>>>>>> Patreon: >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>*https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=https%3A%2F%2Fww >>>>>>>>>>> w. >>>>>>>>>>> pa >>>>>>>>>>> tr >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=https%3A%2F%2Fww >>>>>>>>>>> w. >>>>>>>>>>> pa >>>>>>>>>>> tr> >>>>>>>>>>> eon.com >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=http%3A%2F%2Feon >>>>>>>>>>> .c >>>>>>>>>>> om >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> %2F&data=02%7C01%7Caharui%40adobe.com% >>>> 7C75519f53f52b4fde36b108d57edb >>>>>>>>>>> 59 >>>>>>>>>>> 03 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> %7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636554402926763835&sda >>>>>>>>>>> ta >>>>>>>>>>> =G >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >>>> 2Fpiotrzar >>>>>>>>>>> zy >>>>>>>>>>> ck >>>>>>>>>>> i&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=http%3A%2F%2F40a >>>>>>>>>>> do >>>>>>>>>>> be >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> .com%2F&data=02%7C01%7Caharui%40adobe.com% >>>> 7C75519f53f52b4fde36b108d5 >>>>>>>>>>> 7e >>>>>>>>>>> db >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636554402926763835 >>>>>>>>>>> &s >>>>>>>>>>> da >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >>>> reserved=0>%7Cf2 >>>>>>>>>>> 5d >>>>>>>>>>> bf >>>>>>>>>>> 20138f47 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C6365 >>>>>>>>>>> 54 >>>>>>>>>>> 37 >>>>>>>>>>> 41 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >>>> etW7oghI4s%3D&rese >>>>>>>>>>> rv >>>>>>>>>>> ed >>>>>>>>>>> =0 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=https%3A%2F%2Fww >>>>>>>>>>> w. >>>>>>>>>>> pa >>>>>>>>>>> tr >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=https%3A%2F%2Fww >>>>>>>>>>> w. >>>>>>>>>>> pa >>>>>>>>>>> tr> >>>>>>>>>>> eon.com >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=http%3A%2F%2Feon >>>>>>>>>>> .c >>>>>>>>>>> om >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> %2F&data=02%7C01%7Caharui%40adobe.com% >>>> 7C75519f53f52b4fde36b108d57edb >>>>>>>>>>> 59 >>>>>>>>>>> 03 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> %7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636554402926763835&sda >>>>>>>>>>> ta >>>>>>>>>>> =G >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >>>> 2Fpiotrzar >>>>>>>>>>> zy >>>>>>>>>>> ck >>>>>>>>>>> i&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F% >>>>>>>>>>>2Fna01.safelinks.protection.outlook&data=02%7C01%7Caharui%40adob >>>>>>>>>>>e.com%7C9ba2ae2d1a6e4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed >>>>>>>>>>>2c178decee1%7C0%7C0%7C636555451956879397&sdata=9%2BK%2FO6A3X%2FV >>>>>>>>>>>r0TGaLRYxNlYT6va%2BE2FnpXhigerfODc%3D&reserved=0. >>>> com/?url=http%3A%2F%2F40a >>>>>>>>>>> do >>>>>>>>>>> be >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> .com%2F&data=02%7C01%7Caharui%40adobe.com% >>>> 7C75519f53f52b4fde36b108d5 >>>>>>>>>>> 7e >>>>>>>>>>> db >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636554402926763835 >>>>>>>>>>> &s >>>>>>>>>>> da >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >>>> reserved=0>%7Cf2 >>>>>>>>>>> 5d >>>>>>>>>>> bf >>>>>>>>>>> 20138f47 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C6365 >>>>>>>>>>> 54 >>>>>>>>>>> 37 >>>>>>>>>>> 41 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >>>> etW7oghI4s%3D&rese >>>>>>>>>>> rv >>>>>>>>>>> ed >>>>>>>>>>> =0 >>>>>>>>>>>> * >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>>> >> >> >> -- >> >> Piotr Zarzycki >> >> Patreon: >>*https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.pat >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C9ba2ae2d1a6e >>4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365554 >>51956879397&sdata=GQq8YFsWjlmTvhQ3JIbegCvt1P1brQoyfshLnt8lxqg%3D&reserved >>=0 >> >><https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.pat >>reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C9ba2ae2d1a6e >>4fdc774508d57fcf6c56%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C6365554 >>51956879397&sdata=GQq8YFsWjlmTvhQ3JIbegCvt1P1brQoyfshLnt8lxqg%3D&reserved >>=0>* >