{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":51668609,"defaultBranch":"main","name":"kurve","ownerLogin":"SimonAlling","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-02-13T22:22:37.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/7497533?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1697211574.0","currentOid":""},"activityList":{"items":[{"before":"582d40b2cd846fe2387f147758157266fab2d360","after":null,"ref":"refs/heads/wip-confirm-quit","pushedAt":"2023-10-13T15:39:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"c4f39c27043d5ef0b09599515c38f85fe3c932cd","after":"75261c693c7fc84e842b520c7058aadf8035f452","ref":"refs/heads/WIP-declarative-heads","pushedAt":"2023-10-13T15:35:17.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Vet inte vad detta är men nåt med onAnimationFrameDelta och inga huvuden","shortMessageHtmlLink":"Vet inte vad detta är men nåt med onAnimationFrameDelta och inga huvuden"}},{"before":null,"after":"97aa50352fbaef85c92868c8f9303e5050de0e19","ref":"refs/heads/WTF-stateToRender","pushedAt":"2023-05-02T07:24:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"console.warn","shortMessageHtmlLink":"console.warn"}},{"before":"6a457685de19dd64e56b0f3f0d073834ae0a3f68","after":"01ca8e7aff424418e78d3ad94da8afa8afb41a5f","ref":"refs/heads/EXPERIMENTAL-performance","pushedAt":"2023-05-02T07:24:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"DRY up init","shortMessageHtmlLink":"DRY up init"}},{"before":null,"after":"6a457685de19dd64e56b0f3f0d073834ae0a3f68","ref":"refs/heads/EXPERIMENTAL-performance","pushedAt":"2023-05-01T15:53:53.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Implement \"Fix Your Timestep\"\n\nSee last code example here:\n\nhttps://gafferongames.com/post/fix_your_timestep/","shortMessageHtmlLink":"Implement \"Fix Your Timestep\""}},{"before":null,"after":"c4f39c27043d5ef0b09599515c38f85fe3c932cd","ref":"refs/heads/WIP-declarative-heads","pushedAt":"2023-04-26T12:59:45.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"First POC of declarative heads","shortMessageHtmlLink":"First POC of declarative heads"}},{"before":"b9188e7d3d524ba0c5b6d5fd467b536bae490aca","after":null,"ref":"refs/heads/confirm-quit","pushedAt":"2023-04-25T19:45:24.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"05cef13f91f5be01866edb97c25c0311c96d9497","after":"2c25a7fb133fdd28ab41f3f752653396937bc0db","ref":"refs/heads/main","pushedAt":"2023-04-25T19:45:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Add confirmation dialog when quitting (#83)\n\nIn the original MS-DOS game, when Escape is pressed between rounds, the\r\ngame immediately exits to the splash screen. In\r\n83ca2595037f462f6467d196d15ae146aaeec5b9, the legacy JavaScript version\r\nintroduced an optional confirmation dialog (enabled by default), because\r\naccidentally quitting in the middle of a game _sucks_. Unlike in the\r\noriginal game, \"quitting\" in the legacy JavaScript version means going\r\nto the lobby, not the splash screen, because that's almost always more\r\nuseful.\r\n\r\nThis PR brings a similar confirmation dialog to the Elm version. Since\r\nwe don't have any user-facing preferences (yet), it's always enabled.\r\n\r\nHaving experimented with various approaches, I've decided to go with\r\nthis one, which implements keyboard interaction entirely in Elm, instead\r\nof relying on the browser's native behavior.\r\n\r\nNeither solution is without its flaws. The browser approach has these\r\ndisadvantages:\r\n\r\n * The arrow keys don't work for moving focus between the buttons.\r\n * Pressing Tab (or Shift + Tab) cycles through _all focusable\r\n elements_ in the page, and even the browser chrome, so the dialog\r\n doesn't feel modal.\r\n * When the dialog is opened, the \"No\" button must be focused with\r\n `Browser.Dom.focus` and `Task.attempt`. That is, we must look it up\r\n by ID and handle the possibility that it doesn't exist, even though\r\n we know that it does.\r\n * We have to control in Elm whether we should call the\r\n `preventDefault` method in JavaScript or not (for example by\r\n conditionally setting an attribute in Elm and check for it in\r\n JavaScript).\r\n\r\nThe Elm approach has these:\r\n\r\n * We're reinventing the wheel when it comes to moving focus between\r\n input elements and interacting with them.\r\n * Supporting more than two input elements would require a more general\r\n implementation for the complexity to stay reasonable.\r\n * Since we use `event.code` (the physical key), not `event.key` (the\r\n meaning of the key), the dialog may not behave as expected with\r\n non-QWERTY layouts.\r\n\r\nWhile we suspect that the Elm approach may not cut it if/when we\r\nintroduce more input elements down the road, I think this implementation\r\nis good enough for now. I also believe there's value in documenting in\r\nthe Git history that we initially did it this way and why.\r\n\r\nI decided to go with `
` rather than `` because [the latter\r\nisn't supported in relatively new versions of Firefox (97) and Safari\r\n(15.3)](https://caniuse.com/dialog).\r\n\r\n💡 `git show --color-words='goToLobby .+|\\w+|.' --ignore-space-change`","shortMessageHtmlLink":"Add confirmation dialog when quitting (#83)"}},{"before":"43b2599843df9ccad959758475adc8f38b1489d8","after":"b9188e7d3d524ba0c5b6d5fd467b536bae490aca","ref":"refs/heads/confirm-quit","pushedAt":"2023-04-25T19:40:01.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Increase text–buttons spacing","shortMessageHtmlLink":"Increase text–buttons spacing"}},{"before":"04756d0c10c991234b5661f0d41c58258f911667","after":"43b2599843df9ccad959758475adc8f38b1489d8","ref":"refs/heads/confirm-quit","pushedAt":"2023-04-23T11:14:51.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Add comment about \"impossible\" case","shortMessageHtmlLink":"Add comment about \"impossible\" case"}},{"before":"6a36585f8069b9a0b14663fcf713decca3b4fa85","after":"04756d0c10c991234b5661f0d41c58258f911667","ref":"refs/heads/confirm-quit","pushedAt":"2023-04-23T10:54:23.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Adjust text–buttons spacing","shortMessageHtmlLink":"Adjust text–buttons spacing"}},{"before":null,"after":"0a7997af6fd698a1eaeaf60f278d62a9db720f13","ref":"refs/heads/WIP-performance","pushedAt":"2023-04-22T23:05:14.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Don't include MidRoundState in GameTick","shortMessageHtmlLink":"Don't include MidRoundState in GameTick"}},{"before":"23e92b431e14fef0b3100c65f692969d4bc1cc66","after":null,"ref":"refs/heads/watch-start","pushedAt":"2023-04-22T16:55:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"543b3ac7efcc0742e71c4181a94a3fc5adcc4719","after":"05cef13f91f5be01866edb97c25c0311c96d9497","ref":"refs/heads/main","pushedAt":"2023-04-22T16:55:02.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Rename `watch` script to `start` (#91)\n\nI prefer `npm start` over `npm run watch`.\r\n\r\n💡 `git show --color-words='\\w+|.'`","shortMessageHtmlLink":"Rename watch script to start (#91)"}},{"before":null,"after":"23e92b431e14fef0b3100c65f692969d4bc1cc66","ref":"refs/heads/watch-start","pushedAt":"2023-04-22T16:51:43.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Rename `watch` script to `start`","shortMessageHtmlLink":"Rename watch script to start"}},{"before":"5b2cbdf2c6d187131c5a292dc72d326138537ca3","after":"6a36585f8069b9a0b14663fcf713decca3b4fa85","ref":"refs/heads/confirm-quit","pushedAt":"2023-04-22T16:21:46.000Z","pushType":"push","commitsCount":8,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Merge branch 'main' into confirm-quit","shortMessageHtmlLink":"Merge branch 'main' into confirm-quit"}},{"before":"79de35117d3735563e51b74294c5033f51ee81e6","after":"39e9029cadf150ea2f1c1e1371bc5e25d156c4d5","ref":"refs/heads/WIP-confirm-quit-native-browser","pushedAt":"2023-04-22T16:01:51.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"dialog button","shortMessageHtmlLink":"dialog button"}},{"before":null,"after":"79de35117d3735563e51b74294c5033f51ee81e6","ref":"refs/heads/WIP-confirm-quit-native-browser","pushedAt":"2023-04-18T19:56:48.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Merge branch 'main' into WIP-confirm-quit-native-browser","shortMessageHtmlLink":"Merge branch 'main' into WIP-confirm-quit-native-browser"}},{"before":"d31e6d3b5fd40a5361da05c83f7deead20ce3385","after":null,"ref":"refs/heads/fix-canvas-clearing-issue","pushedAt":"2023-04-18T19:17:43.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"ba9226a202f2d88db70bb9e647df4dc469e18e73","after":"543b3ac7efcc0742e71c4181a94a3fc5adcc4719","ref":"refs/heads/main","pushedAt":"2023-04-18T19:17:42.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Fix canvas clearing issue (#90)\n\nIn Firefox on Ubuntu on my ThinkPad X1 Carbon 5th Gen, holes are\r\nconsistently \"invisible\" (there appears to be no hole, even though there\r\nactually is) and Kurves are consistently not cleared when proceeding to\r\nthe next round. After a confusing debugging session, Kryddan and I\r\nconcluded that when the `clearRect` method is called with very large\r\nvalues for the width and height, the canvas isn’t cleared. I have\r\nreported it as a bug in Firefox:\r\n\r\nhttps://bugzilla.mozilla.org/show_bug.cgi?id=1828137\r\n\r\nI have only encountered the issue in Firefox 109–112 (and all the way\r\nback to 106 with `mozregression`; see Bugzilla thread) on said ThinkPad\r\nwith a Core i7-7500U running Ubuntu 20.04.1 with Linux 5.15.0. It\r\ndoesn't happen in Chrome on Ubuntu, Firefox on Windows 10 (on the same\r\nlaptop), or Firefox on Ubuntu 20.04.4 with Linux 5.4.0 on my main PC\r\nwith an RTX 2060 Super.\r\n\r\nThe reason I haven't noticed such an obvious bug until now is that it\r\ndidn't manifest itself until I did `sudo apt update && sudo apt upgrade`\r\na week or two ago and (apparently) got a new version of Firefox.\r\n\r\n💡 `git show --color-words='[A-Za-z._]+|.'`","shortMessageHtmlLink":"Fix canvas clearing issue (#90)"}},{"before":null,"after":"d31e6d3b5fd40a5361da05c83f7deead20ce3385","ref":"refs/heads/fix-canvas-clearing-issue","pushedAt":"2023-04-17T22:11:46.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Fix canvas clearing issue","shortMessageHtmlLink":"Fix canvas clearing issue"}},{"before":"36e58165b56ce37ee4720ffd125f417dd35868fb","after":null,"ref":"refs/heads/fix-broken-text","pushedAt":"2023-04-17T21:58:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"cce28ec8509846f64ba1fcddf997c6edffc194ac","after":"ba9226a202f2d88db70bb9e647df4dc469e18e73","ref":"refs/heads/main","pushedAt":"2023-04-17T21:58:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Fix broken GUI text in Webkit browsers (#89)\n\nTurns out the \"READY\" text in the lobby is utterly broken in Chrome: it\r\nshows up as `$% 23`, and the characters are 8 × 8 instead of\r\n16 × 16 and repeated in a visually weird fashion. The same goes for the\r\n\"Press Space to continue\" text and the end-screen scoreboard.\r\n\r\nThe root cause is missing `mask-size` support – adding a `-webkit-`\r\nfallback makes everything render correctly. According to\r\nhttps://caniuse.com, this should be enough to support all major browsers\r\nat least back to 2017. (I'm also adding a fallback for `mask-repeat`, of\r\ncourse, but that doesn't have any visible effect as long as we only try\r\nto render supported characters.)","shortMessageHtmlLink":"Fix broken GUI text in Webkit browsers (#89)"}},{"before":null,"after":"36e58165b56ce37ee4720ffd125f417dd35868fb","ref":"refs/heads/fix-broken-text","pushedAt":"2023-04-17T21:20:07.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Fix broken GUI text in Webkit browsers","shortMessageHtmlLink":"Fix broken GUI text in Webkit browsers"}},{"before":"8db915a8b3d2ce2306be368f57e8740ce42e48aa","after":null,"ref":"refs/heads/refactor-canvas-context","pushedAt":"2023-04-17T21:03:27.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"c3b65d781422d5cea0eacb2de865f788610bb61f","after":"cce28ec8509846f64ba1fcddf997c6edffc194ac","ref":"refs/heads/main","pushedAt":"2023-04-17T21:03:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Refactor JavaScript canvas/context handling (#88)\n\nThe `getCanvasContext` abstraction just makes the code harder to\r\nunderstand and work with.\r\n\r\n💡 `git show --color-words='function .|const context = .+;|\\w+|.'`","shortMessageHtmlLink":"Refactor JavaScript canvas/context handling (#88)"}},{"before":null,"after":"8db915a8b3d2ce2306be368f57e8740ce42e48aa","ref":"refs/heads/refactor-canvas-context","pushedAt":"2023-04-17T20:54:35.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Refactor JavaScript canvas/context handling","shortMessageHtmlLink":"Refactor JavaScript canvas/context handling"}},{"before":"2db7adb2c5e0752fad47f7a82554747a1f403a11","after":null,"ref":"refs/heads/semicolons","pushedAt":"2023-04-12T15:08:48.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"}},{"before":"4c8c739f4c24f46c50cdef2a071c419cb5a884b8","after":"c3b65d781422d5cea0eacb2de865f788610bb61f","ref":"refs/heads/main","pushedAt":"2023-04-12T15:08:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Use semicolons in JavaScript code (#87)\n\nI'll probably never settle on an opinion in the \"to semicolon or not to\r\nsemicolon\" debate. This time, I think semicolons make it easier to see\r\nwhere statements end, and they objectively protect against some nasty\r\nbugs that can occur when relying on ASI.\r\n\r\nPossibly relevant observations:\r\n\r\n * The legacy JavaScript version used semicolons.\r\n * No decision on semicolons seems to be mentioned anywhere in the Git\r\n history (see e.g. `git log --grep semi`).\r\n * The JavaScript code in `index.html` came into existence in\r\n aa844b379662bfb3fe35c50dbd7a15350aed9409.\r\n\r\n💡 `git show --color-words=.`","shortMessageHtmlLink":"Use semicolons in JavaScript code (#87)"}},{"before":null,"after":"2db7adb2c5e0752fad47f7a82554747a1f403a11","ref":"refs/heads/semicolons","pushedAt":"2023-04-12T14:50:11.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SimonAlling","name":"Simon Alling","path":"/SimonAlling","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7497533?s=80&v=4"},"commit":{"message":"Use semicolons in JavaScript code","shortMessageHtmlLink":"Use semicolons in JavaScript code"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAADlomVEQA","startCursor":null,"endCursor":null}},"title":"Activity · SimonAlling/kurve"}