Jamie Kyle's Avatar

Jamie Kyle

@jamie.build.bsky.social

Comic books. Board games. Open source. Prev: Babel, Yarn, Flow, Parcel, Biome

1,942 Followers  |  336 Following  |  430 Posts  |  Joined: 01.08.2023  |  2.1137

Latest posts by jamie.build on Bluesky

Lost dog in SF.
If spotted text John 8572340177 or call animal control 4155546364.
Very shy. Do not chase!

Dog pictured is about 35 pounds, lean, brown brindle coat with black stripes, large pointed ears like a heeler, and dark muzzle.

Lost dog in SF. If spotted text John 8572340177 or call animal control 4155546364. Very shy. Do not chase! Dog pictured is about 35 pounds, lean, brown brindle coat with black stripes, large pointed ears like a heeler, and dark muzzle.

SF, please help me find my dog. She was lost by her sitter in the mission. But when she escaped 2 years ago, she made it all the way to Golden Gate Park. She is very sweet but very shy.

I am very worried about her getting hurt while she’s loose.

04.08.2025 23:09 β€” πŸ‘ 5275    πŸ” 3507    πŸ’¬ 235    πŸ“Œ 128

If you're virtualizing a list view, be sure to always render whatever you consider the "first" and "last" item that should be tabbable

So that if your focus is before/after the list and you tab or shift-tab, the browser will take you to the correct location

Also helps with screenreader shortcuts

31.07.2025 19:56 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Random little react opinion: Don’t use built-in onEvent names as props with different signatures

OK:
onChange(Event)
onValueChange(string)
onFocus(FocusEvent)

NO:
onChange(string)
onChange(string, Event)
onChange(Event, string)
onFocus(Event)
onFocus()

30.07.2025 15:16 β€” πŸ‘ 8    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

There’s also been a couple people that I thought did something really bad, but then I looked into it and what actually happened was blown way out of proportion

I think video editing makes it easier to make things sound worse, and TikTok encourages piling on and on with less and less context

30.07.2025 01:28 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

No worries, thank you for your work

30.07.2025 01:20 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

My team was just talking about implementing it in Rust but wanted to look around to see if anyone else was working on it first

29.07.2025 19:39 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Proposed Draft UTS #58: Unicode Link Detection and Serialization

@manishearth.bsky.social Random hopeful question: Once UTS #58 is published in Unicode 17 (assuming it will be), any plans to implement it in github.com/unicode-rs (or maybe github.com/servo/rust-url)?

www.unicode.org/reports/tr58/
www.unicode.org/versions/Uni...

29.07.2025 19:37 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 2    πŸ“Œ 0

Is `text-wrap: pretty` any better?

16.07.2025 16:07 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

Oh noooo I can’t stand hooks that provide their own ref, just have your users always create them and pass them in. Otherwise eslint doesn’t understand it’s a ref

03.07.2025 00:24 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
function Example() {
  let [cardNumber, setCardNumber] = useState()
  
  let { inputProps, ...otherStuff } = useInputMask({
    mask: "0000 0000 0000 0000",
    value: cardNumber,
    onValueChange: setCardNumber,
  })
  
  // <MyInput> needs to accept all of these props:
  // 
  // inputProps = {
  //   value,
  //   onInput, onPaste, onFocus, onBlur,
  //   onKeyDown, onKeyPress, onKeyUp,
  // }
  
  return <MyInput {...inputProps}/>
}

function Example() { let [cardNumber, setCardNumber] = useState() let { inputProps, ...otherStuff } = useInputMask({ mask: "0000 0000 0000 0000", value: cardNumber, onValueChange: setCardNumber, }) // <MyInput> needs to accept all of these props: // // inputProps = { // value, // onInput, onPaste, onFocus, onBlur, // onKeyDown, onKeyPress, onKeyUp, // } return <MyInput {...inputProps}/> }

function Example() {
  let [cardNumber, setCardNumber] = useState()
  
  let ref = useRef()
  
  let { ...otherStuff } = useInputMask(ref, {
    mask: "0000 0000 0000 0000",
    value: cardNumber,
    onValueChange: setCardNumber,
  })
  
  // <MyInput> only needs to accept a ref
  
  return <MyInput ref={ref} />
}

function Example() { let [cardNumber, setCardNumber] = useState() let ref = useRef() let { ...otherStuff } = useInputMask(ref, { mask: "0000 0000 0000 0000", value: cardNumber, onValueChange: setCardNumber, }) // <MyInput> only needs to accept a ref return <MyInput ref={ref} /> }

Opinions needed: If I'm writing a React UI library that provides a hook that needs to attach a bunch of events and other stuff, do people prefer:

- Returning a props object to pass to the right component
- Accepting a ref and adding events/mutating props directly

02.07.2025 18:36 β€” πŸ‘ 4    πŸ” 0    πŸ’¬ 3    πŸ“Œ 0

You're literally benefiting so much from our neurospiciness and trauma-induced need to provide service to others to feel any self-worth

You can at least say please

02.07.2025 18:09 β€” πŸ‘ 16    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

More people need to understand that most open source maintainers would move mountains for you if only you:

1. Are friendly and not entitled
2. Showed interest in helping however you can
3. Communicate your request clearly
4. Are respectful of their time (be brief/responsive)

These cost you nothing

02.07.2025 18:06 β€” πŸ‘ 80    πŸ” 7    πŸ’¬ 2    πŸ“Œ 0

Like needing to stop the entire world and get an admin for your org to disable branch protections so you can force push a change to a commit message is wild

26.06.2025 20:29 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

I wish git had a better mechanism for editing commit history, even just simple edits

I’m imagining some new diff format for commit history itself that can be applied on a branch

Then GitHub/etc could have PR-like flows for reviewing these changes/running CI instead of having forced pushes

26.06.2025 20:26 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 2    πŸ“Œ 0

Queer β€˜discourse’ always gets bad around this time of year because the kids are out of school and all they’ve got is posting

26.06.2025 16:46 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

It's cool that React-Aria provides things like onPress, but it shouldn't come at the cost of breaking pointer/keyboard events

- Pass all DOM events through to elements
- Stop calling stopPropagation() everywhere (continueProp()` doesn't solve the problems this creates)
- Forward refs to elements

23.05.2025 20:04 β€” πŸ‘ 6    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

Doing the hackiest shit ever because React Aria wants all the browser events to itself

Might end up just writing our own versions of ListBox/GridList so we can move to Radix-UI

23.05.2025 19:58 β€” πŸ‘ 6    πŸ” 0    πŸ’¬ 3    πŸ“Œ 0

(Context: Dude is picking a fight with the CEO of The Onion because he is?/was a journalist and he's dating some local political candidate)
bsky.app/profile/benc...

15.05.2025 23:46 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

You know what? Hell yeah

If bluesky is ever going to be successful, it will need more of these chronically online people starting shit for no good reason

Great content, very entertaining, 10/10

15.05.2025 23:41 β€” πŸ‘ 27    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
Preview
Dialog Mishaps ...

Here's a little demo of what I mean codepen.io/thejameskyle...

15.05.2025 23:01 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Does anyone have ideas on how to handle scenarios where a user is in the middle of typing in an <input> then some <dialog> opens, and before the user notices, they've typed some character that does something in the <dialog>

I want to handle this in a smarter way

15.05.2025 22:52 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 2    πŸ“Œ 0

Billionaires could easily just go create more apps, throw millions around at every idea they have

But then if they fail they'd be confronted with the fact that their idea is something less than brilliant

(I would be so much better at being a billionaire, someone just give me a chance)

13.05.2025 23:07 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Urbanists would be more successful in America if they incorporated more roller coasters

02.05.2025 16:54 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Screenshot of code in linked gist

Screenshot of code in linked gist

We found a bug in React's legacy renderer that causes a child to be re-rendered before its parent (its in an older release of React so probably not worth filing an issue)

I think this is the first bug of its kind Ive found in React though, was kinda fun to hunt down

gist.github.com/jamiebuilds/...

01.05.2025 21:20 β€” πŸ‘ 9    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

My take that has been controversial at the companies I’ve worked at, has been that this should just be a very large tooltip: non-interactive, descriptive of the content behind a link/button. So I would suggest a name like TooltipCard

30.04.2025 06:33 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Anything that borks up my app? You assume I can remember the implementation details of things I wrote 3 years ago

29.04.2025 16:28 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

If you start on June 25, you can do every word of the song leading up to the final "it's gonna be me" on a separate day

28.04.2025 16:41 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

You need to start this on May 2nd for next year

28.04.2025 16:35 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

I haven’t done any cross browser testing outside of chrome since we’re an electron app, but for a tooltip component I had to fully wire it up together as if I was building it without popover. Which is fine I guess, the auto anchor behavior and top-layer is nice enough on its own

26.04.2025 18:46 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

I take this back, it was easy enough to work around. But inspecting the accessibility tree and using a screenreader, it still requires a fair bit of wiring up with aria attrs

26.04.2025 18:42 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

@jamie.build is following 18 prominent accounts