{"id":32191353,"url":"https://github.com/dotboris/tie","last_synced_at":"2025-10-22T01:38:20.844Z","repository":{"id":62432445,"uuid":"66689510","full_name":"dotboris/tie","owner":"dotboris","description":"A set of data-bound from controls for reagent","archived":true,"fork":false,"pushed_at":"2016-09-05T07:17:51.000Z","size":31,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-17T22:57:00.574Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Clojure","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/dotboris.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2016-08-27T01:36:03.000Z","updated_at":"2025-09-21T00:35:17.000Z","dependencies_parsed_at":"2022-11-01T20:47:03.975Z","dependency_job_id":null,"html_url":"https://github.com/dotboris/tie","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/dotboris/tie","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotboris%2Ftie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotboris%2Ftie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotboris%2Ftie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotboris%2Ftie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dotboris","download_url":"https://codeload.github.com/dotboris/tie/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotboris%2Ftie/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280365575,"owners_count":26318385,"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-21T02:00:06.614Z","response_time":58,"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":"2025-10-22T01:38:18.439Z","updated_at":"2025-10-22T01:38:20.835Z","avatar_url":"https://github.com/dotboris.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"tie\n===\n\n[![Build Status](https://travis-ci.org/dotboris/tie.svg?branch=master)](https://travis-ci.org/dotboris/tie)\n[![Clojars Project](https://img.shields.io/clojars/v/dotboris/tie.svg)](https://clojars.org/dotboris/tie)\n\nA ClojureScript library that provides data-bound form controls for reagent.\n\nWhy\n---\n\nBuilding forms in reagent is pretty tedious. For every control, you need to\ndefine `:value` / `:checked` and `:on-change`. These are always implemented the\nsame way. They read from an atom and write back to it. Tie solves this by\nletting you just pass in the atom and the data binding is automatic.\n\nUsage\n-----\n\nLet's start with a quick example:\n\n```clojure\n(ns my.core\n  (:require [tie.core :as t] ; require tie\n            [reagent.core :as r]))\n\n(defonce state (r/atom {}))\n\n(defn my-component [state]\n  [:form\n    [:label \"What is your name?\"\n      ; use control components\n      [t/text {:atom (r/cursor state [:name])}]]\n    [:label \"Tell me a story.\"\n      ; use more control components\n      [t/textarea {:atom (r/cursor state [:story])}]]\n\n    [:button {:type \"submit\"}]])\n\n(r/render [my-component state]\n          (.getElementById js/document \"app\"))\n```\n\n### Components\n\nYou create components using the square bracket notation. They take a map of\nproperties as their first argument. Data binding is done with the `:atom`\nproperty. Extra properties will be passed to the underlying control. The exact\nproperty will vary from one component to the next.\n\nHere is a simple example with a textbox:\n\n```clojure\n[t/text {:atom some-atom :class \"fancy-textbox\"}]\n```\n\nThis creates a textbox that is data-bound to the `some-atom` atom and that has\nthe `fancy-textbox` class.\n\nFor documentation on specific components, you can look at the documentation of\nthe docstrings on the component functions.\n\nDevelopment\n-----------\n\n### Setup\n\nInstall node dependencies\n\n```sh\nnpm install\n```\n\n### Running tests\n\n```sh\n# once\nlein test once\n\n# auto / watched\nlein test auto\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotboris%2Ftie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdotboris%2Ftie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotboris%2Ftie/lists"}