{"id":25876088,"url":"https://github.com/andrewarrow/goal","last_synced_at":"2026-04-30T06:39:04.677Z","repository":{"id":57773249,"uuid":"527227794","full_name":"andrewarrow/goal","owner":"andrewarrow","description":"a CLI version of auto layout in go","archived":false,"fork":false,"pushed_at":"2022-08-25T23:42:40.000Z","size":48,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-12-31T04:02:43.274Z","etag":null,"topics":["autolayout","go","golang","swift"],"latest_commit_sha":null,"homepage":"","language":"Go","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/andrewarrow.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":"2022-08-21T14:18:59.000Z","updated_at":"2023-03-13T15:13:42.000Z","dependencies_parsed_at":"2022-09-12T01:30:50.121Z","dependency_job_id":null,"html_url":"https://github.com/andrewarrow/goal","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fgoal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fgoal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fgoal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fgoal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrewarrow","download_url":"https://codeload.github.com/andrewarrow/goal/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241489112,"owners_count":19970997,"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","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":["autolayout","go","golang","swift"],"created_at":"2025-03-02T10:20:47.592Z","updated_at":"2026-04-30T06:38:59.655Z","avatar_url":"https://github.com/andrewarrow.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GOAL\nGo Auto Layout\n\nhttps://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html\n\nTry and implement a CLI version of auto layout in go.\n\nGoal (pun intended) is to try and learn auto layout in a deep way.\n\n# Example Screenshot\n\n\u003cimg src=\"screenshot1.png\" width=\"200\" height=\"433\"\u003e\n\n# Example Json\n```\n{\n  \"root\": {\n    \"id\": \"root\",\n    \"subviews\": [\n      {\n        \"id\": \"view1\",\n        \"class\": \"UIView\",\n        \"leading\": {\"equal\": \"root.leading\", constant: 33},\n        \"top\": {\"equal\": \"root.top\", constant: 33},\n        \"trailing\": {\"equal\": \"root.trailing\", constant: -33},\n        \"bottom\": {\"equal\": \"root.bottom\", constant: -33},\n        \"subviews\": [\n          {\n            \"id\": \"view2\",\n            \"class\": \"UIView\",\n            \"leading\": {\"equal\": \"view1.leading\", constant: 33},\n            \"top\": {\"equal\": \"view1.top\", constant: 33},\n            \"trailing\": {\"equal\": \"label1.trailing\", constant: 33},\n            \"bottom: {\"equal\": \"view1.bottom\", constant: -33},\n            \"subviews\": [\n              {\n                \"id\": \"label1\",\n                \"class\": \"UILabel\",\n                \"text\": \"Hello\"\n                \"leading\": {\"equal\": \"view2.leading\", constant: 33},\n                \"top\": {\"equal\": \"view2.top\", constant: 33},\n              }\n            ]\n          },\n          {\n            \"id\": \"view3\",\n            \"class\": \"UIView\",\n            \"leading\": {\"equal\": \"label1.leading\", constant: 99},\n            \"top\": {\"equal\": \"view1.top\", constant: 33},\n            \"trailing\": {\"equal\": \"label2.trailing\", constant: 33},\n            \"bottom: {\"equal\": \"view1.bottom\", constant: -33},\n            \"subviews\": [\n              {\n                \"id\": \"label2\",\n                \"class\": \"UILabel\",\n                \"text\": \"There\"\n                \"leading\": {\"equal\": \"view3.leading\", constant: 33},\n                \"top\": {\"equal\": \"view3.top\", constant: 33},\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n# Example Swift\n\n```\n        let view1 = UIView()\n        view1.backgroundColor = .cyan\n        view1.translatesAutoresizingMaskIntoConstraints = false\n        view.addSubview(view1)\n        \n        let view2 = UIView()\n        view2.backgroundColor = .orange\n        view2.translatesAutoresizingMaskIntoConstraints = false\n        view1.addSubview(view2)\n        \n        let view3 = UIView()\n        view3.backgroundColor = .red\n        view3.translatesAutoresizingMaskIntoConstraints = false\n        view1.addSubview(view3)\n        \n        let label1 = UILabel()\n        label1.text = \"Hello\"\n        label1.textColor = .black\n        label1.translatesAutoresizingMaskIntoConstraints = false\n        view2.addSubview(label1)\n        \n        let label2 = UILabel()\n        label2.text = \"There\"\n        label2.textColor = .white\n        label2.translatesAutoresizingMaskIntoConstraints = false\n        view3.addSubview(label2)\n\n        NSLayoutConstraint.activate([\n            view1.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 33),\n            view1.topAnchor.constraint(equalTo: view.topAnchor, constant: 33),\n            view1.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -33),\n            view1.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -33),\n             ])\n\n        NSLayoutConstraint.activate([\n            label1.leadingAnchor.constraint(equalTo: view2.leadingAnchor, constant: 33),\n            label1.topAnchor.constraint(equalTo: view2.topAnchor, constant: 33),\n             ])\n\n        NSLayoutConstraint.activate([\n            view2.leadingAnchor.constraint(equalTo: view1.leadingAnchor, constant: 33),\n            view2.topAnchor.constraint(equalTo: view1.topAnchor, constant: 33),\n            view2.trailingAnchor.constraint(equalTo: label1.trailingAnchor, constant: 33),\n            view2.bottomAnchor.constraint(equalTo: view1.bottomAnchor, constant: -33),\n             ])\n        \n        NSLayoutConstraint.activate([\n            label2.leadingAnchor.constraint(equalTo: view3.leadingAnchor, constant: 33),\n            label2.topAnchor.constraint(equalTo: view3.topAnchor, constant: 33),\n             ])\n\n        NSLayoutConstraint.activate([\n            view3.leadingAnchor.constraint(equalTo: label1.leadingAnchor, constant: 99),\n            view3.topAnchor.constraint(equalTo: view1.topAnchor, constant: 33),\n            view3.trailingAnchor.constraint(equalTo: label2.trailingAnchor, constant: 33),\n            view3.bottomAnchor.constraint(equalTo: view1.bottomAnchor, constant: -33),\n             ])\n```\n\n# Render Example\n\n```\n+---------------------------------------------------+\n|                                                   |\n|  +---------------------------------------------+  |\n|  |                                             |  |\n|  |  +---------+  +---------+                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |  Hello  |  |  There  |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  |         |  |         |                   |  |\n|  |  +---------+  +---------+                   |  |\n|  |                                             |  |\n|  +---------------------------------------------+  |\n|                                                   |\n+---------------------------------------------------+\n```\n\n# Running\n\n```\nos/goal $ ./goal\n\n  goal run                       # use examples/layout.json with cols=60 and rows=30\n  goal run ~/layout.json 80 40   # use passed in file, cols, and rows\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Fgoal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrewarrow%2Fgoal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Fgoal/lists"}