{"id":18016930,"url":"https://github.com/fitzgen/bender","last_synced_at":"2025-10-15T12:18:23.502Z","repository":{"id":66008011,"uuid":"1909603","full_name":"fitzgen/bender","owner":"fitzgen","description":"Create robust user interfaces with finite state machines.","archived":false,"fork":false,"pushed_at":"2011-06-17T06:10:00.000Z","size":112,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-13T00:09:13.758Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fitzgen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-06-17T05:57:00.000Z","updated_at":"2014-04-27T07:50:57.000Z","dependencies_parsed_at":"2023-02-19T21:15:41.766Z","dependency_job_id":null,"html_url":"https://github.com/fitzgen/bender","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fitzgen/bender","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fitzgen%2Fbender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fitzgen%2Fbender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fitzgen%2Fbender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fitzgen%2Fbender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fitzgen","download_url":"https://codeload.github.com/fitzgen/bender/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fitzgen%2Fbender/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279077248,"owners_count":26098234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-15T02:00:07.814Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-30T04:19:42.577Z","updated_at":"2025-10-15T12:18:23.457Z","avatar_url":"https://github.com/fitzgen.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bender\n\nBender is a JavaScript library for creating robust user interfaces with finite\nstate machines.\n\n## Define finite state machines\n\n    var inputFSM = bender.defineFSM({\n        initialize: function (opts) {\n            this.pattern = opts.pattern;\n            this.successCallback = opts.successCallback;\n\n            this.divElement = opts.element;\n            this.inputElement = this.divElement.querySelector('input[type=text]');\n            this.submitElement = this.divElement.querySelector('input[type=submit]');\n\n            if ( this.pattern.test(this.inputElement.value) ) {\n                this.submitElement.removeAttribute('disabled');\n                return 'valid';\n            } else {\n                this.submitElement.disabled = true;\n                return 'invalid';\n            }\n        },\n        valid: function (msg) {\n            if ( msg === 'submit' ) {\n                this.successCallback(this.inputElement.value);\n                this.inputElement.value = '';\n                if ( ! this.pattern.test(this.inputElement.value) ) {\n                    this.submitElement.disabled = true;\n                    return 'invalid';\n                }\n            } else if ( msg === 'valueChange' ) {\n                if ( ! this.pattern.test(this.inputElement.value) ) {\n                    this.submitElement.disabled = true;\n                    return 'invalid';\n                }\n            }\n        },\n        invalid: function (msg) {\n            if ( msg === 'valueChange' ) {\n                if ( this.pattern.test(this.inputElement.value) ) {\n                    this.submitElement.removeAttribute('disabled');\n                    return 'valid';\n                }\n            }\n        }\n    });\n\n## Connect your FSMs to the dom and translate events\n\n    function makeInputWidget (pattern) {\n        var widget = document.createElement('div');\n        widget.innerHTML = '\u003cinput type=\"text\" /\u003e\u003cinput type=\"submit\" /\u003e';\n\n        return bender.connect({\n            element: widget,\n            fsm: new inputFSM({\n                element: widget,\n                pattern: pattern,\n                successCallback: function (value) {\n                    alert('Success: ' + value);\n                }\n            }),\n            events: {\n                'keyup input[type=text]': function (e) {\n                    switch ( e.keyCode ) {\n                    case 13:\n                        e.preventDefault();\n                        return 'submit';\n                    default:\n                        return 'valueChange';\n                    }\n                },\n                'click input[type=submit]': function (e) {\n                    e.preventDefault();\n                    return 'submit';\n                }\n            }\n        });\n    }\n\n    var integerField = makeInputWidget(/^\\d+$/);\n    var emailField = makeInputWidget(/^\\w+@\\w+\\.com$/);\n    // etc...\n\n\n\n--------------------------------------------------------------------------------\n\nBender is named after a lovable, alcoholic robot.\n\n                                                    =MMI\n                                                   M ,, M\n                                                   $ :, M\n                                                    OMMD\n                                                    ~7~M\n                                                    ~?~D\n                                                    ~$=+\"\n                                                    8:=~O\n                                                    M~=~M\n                                                   ,N~=~D?\n                                                  D=:ID$  $D  ,\n                                                 $ ,,,,,: +D,=ZM,\n                                              =M7~ZM8O8NN=,:::::~M=\n                                            =M:~::::::::::::::::::=M\n                                           O::::::::::::::::::::::::7Z\n                                          M:~::::::::::::::::::::::::I7\n                                         D~~::::::::::::::::::::::::::M\n                                        =$::::::::::::::::::::::::::::~,\n                                       :O::::::::::::::::::::::::::::::N\n                                       +7::::::::::::::::::::::::::::::M\n                                       $+~::::::::,,====~~::::~=+7ONMO+  8$\n                                       $=::::::::7+,..............,,,,,,,, :M+\n                                       $=~::::::M ,,,,,,,,,,,,,,,,,,::::,,,:: M\n                                       I?:::::,M ,,,,, IN7NMMMMMMMMMMMMMI?MMMM+ M\n                                       +7:::::,?,,,,,$7 ,,., ZZMMMMMMMI,,,..MMMM N:\n                                       ~$:::::=~,,,,++, ,,,,,, ZZDMM:,,,,..,.MMMM M\n                                       ,O:::::?:,,,,N ..$Z?...,,,+,+,,,,,,,..OMMM?+O\n                                        D,::::+=,,,,M , NM7,..,,,, Z OM8.,,,.DMMMI,D\n                                        M,::::,D,,,,I+, +?:,,,,,,,,I,$D$,,,.~MMMM:~I\n                                        M,::::::N ,,,=N  ,,,,,,,, M ,,,,,,.7MMMM,,O\n                                        M,::::::,M :,,,,7DNNNDNNNMDDDDNMMMNO$?  77\n                                        N,::::::::+M8$I+~,,...........,:~+?I$OD?\n                                        8::::::::::::~:~~::::::::::::::O,\n                                        Z::::::::::::::::::::::::::::::O:\n                                        $~~:::::::::~::~~~~~~::~:::::~~O\n                                        ?+::::::~8NMI+~  D:~=+?M77$NM88+\n                                        =I:::~:M7  N,,   O ,   D,,,:=\n                                        ,7::::N  ,7MNMMMMMMNMMMMMMMM:\n                                         Z::::M    N  ,, $, ,, D, ,=,\n                                         8:::~8D+, N,  , $, ,, D,  I\n                                         D::::,M  ?MDMMNNNDDNMMMMD88M7\n                                         M,:::~~ $DM,    7,    8,=?N,:D\n                                       ,NN :::::::~,,:=?II7II+=:,,:~::M\n                                     ~M= :N=,:::::::::::::::::::::::::MO$\n                                   I+,,: ,,, ~$D8?, ,::::~:::,  =$DN$,,,, N+\n                                 IN ,,,,,,,,,,,,, ,~+I$OOOO$7?=:  ,,,,,,,,: N+\n                               =M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::Z\n                             OM ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, N,\n                             7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, M\n                            7N:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O77:\n                            $~:,8MI,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.ZM~~~=MN\n                           $MMM8?::,$MN$~,..,,,,,,,,,,,,,,,,,,,,,,,...:OM7,:~:::++,M\n                         MZ,::::,ZM:::~:,:?DNMDZI=:,.......,:~+7DMMD?,,~:::::::~$::,N\n                       N+::::::::::~+~:::::::::::~~::,:,,:~~~~~:~:::~::::::::::~8::~7\n                      8~::~,:::~::::M:::::::::::::::::::::::::::::::::::::::::::N,::=D\n                      8,~DMNNM?:::::~D,::::::::::::::::::::::::::::::::~~,,,::::N,::~:M,\n                      M$~+=====N::::,N,::::,,,,:~~~~~~:::::~~:~:, ,=7DM$+,, M::,M:::7==+D\n                     N~========M~::::8~~:~+O7IZDMNNMMNDD888DDNN8?=:,,:::::::8~:,N,::M===8M\n                    M=========~M,::::M~~::N~::~~~~:~::::::::::~~::::::::::::8~:,D:::8=I7=+D\n                  $$=========7N:::::$$~:::N:::::::::::::::::::::::::::::::::8~:,8:,MN=====~M\n                 Z8NMD:======I~:::~=7:::::8:::::::::::::::::::::::::::::::::N::,N?M~=======+\n                $I+===+M===$M:~::=MI~::::~7,:::::::::::::::::::::::::::::::,N:::M ~M~=====~~O\n               N========~NMIIDM8~:~::::::~~::::::::::::::::::::::::::::::::,M,:~O   M======M+I\n               $========~M~   77~:::::::::,=:::::::::::::::::::::::::::::::,M,:~$   ,~=+8D~=~N\n              M===~====~N:    :O::::::::::,$::::::::::::::::::::::::::::::: M,:~7    M~~======7\n             8I=======~M       M,:::::::::~M:::::::::::::::::::::::::::::::,N,~$+    +I=======8,\n            ,M8ODNZ+=+M,       Z::::::::::~N,::::::::::::::::::::::::::::::,D,~$~     M~======~O\n            M=======N8+        ,$~:::::::::8:::::::::::::::::::::::::::, ::,D,~7:     $===~=+:NM\n           +?=~=====~M          M,:::::::::++:::::::::::::::::::::::::O ,=D,8:~Z:      MO8ND=~=7~\n           M~=====~=7I          D:::::::::::7::::::::::::::::::::::::,M~~:N,8,~O,      8,======~$\n          ,O=======~M           =I:::::::::,D::::::::::::::::::::::::::DDN::D:~8,      +~======:N\n          D========?Z            M,:::::::::N::::::::::::::::::::::::::~:::~8::8,      ,8=======N\n          M=ZMNNMM$D=            N,::::::::~O~::::::::::::::::::::::::::::~~Z::D        M~=====~M\n          M=======~M             =I~:::::::~=I::::::::::::::::::::::::::::~=$::N        M7~~~IM7Z,\n          M~======~N              M,::::::::,M::::::::::::::::::::::::::::~7+::N        N:======?=\n          M~=======O:             M,:::::::::M,::::::::::::::::::::::::::::O~~,M        D~======+?\n          N========7I             I=::::::::~$=:::::::::::::::::::::::::::,N::,M        Z~=======7\n          +$=====~~:M             ,D::::::::::D:::::::::::::::::::::::::::,M,:,M        I=======~$\n           M~==MNO$8N7             M~::::::::,M,::::::::::::::::::::::::::,M,:~8        +7~~~~~7M$\n           DZM=+=====D             8::::::::::M:::::::::::::::::::::::::::,M,:?7        =$+7$I+~~Z\n            M~~======~O            ~,::::::::~$=::::::::::::::::::::::::::,M,:8~        =I+======Z\n            ,8========OI            =~::::::::+7~:::::::::::::::::::::::~~M:::N,        +I======+$\n             N+=======~8I           O:::::::::,M:::::::::::::::::::::~,?MI:::~M         7?======?7\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffitzgen%2Fbender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffitzgen%2Fbender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffitzgen%2Fbender/lists"}