## Changes made
- Updated `useClipboard` API to require passing the text in via the
`copyToClipboard` function, rather than requiring that the text gets
specified in render logic
- Ensured that the `copyToClipboard` function always stays stable across
all React lifecycles
- Updated all existing uses to use the new function signatures
- Updated all tests and added new cases
Closes https://github.com/coder/coder/issues/18879
Builds on https://github.com/coder/coder/pull/18895
## Changes made
- Deleted `BatchUpdateConfirmation` component, replacing it with
`BatchUpdateModalForm`
- Added stories for the new component, trying to capture every variant I
could think of
## Screenshots
<img width="840" height="1059" alt="image"
src="https://github.com/user-attachments/assets/0fdac28e-19e8-4a14-a20a-fc1fd3758c81"
/>
## Notes
- There's too many problems to list, but look at the issue to see all
the problems we had with the old implementation
- It's definitely helpful to look at the stories to see all the things
the component is meant to cover
Take 2
Closes https://github.com/coder/internal/issues/644
## Changes made
- Updated how `useAgentLogs` was defined to make it easier to inject
specific data dependencies (basically making the hook more
unit-testable)
- Simplified the hook API to limit the amount of scope of data it needs
to work
- Added more test cases, and re-enabled the one test case we had
previously disabled
- Extracted our mock websocket code into a separate file, and added more
methods to it
- Updated all runtime code to accommodate new changes
## Changes made
- Patched React `CSSProperties` type to add support for custom CSS
properties
- Updated several of the components in the `components` directory to
Tailwind
- Updated most of the `WorkspacePageBuildView` component to Tailwind to
account for CSS specificity changes
- Updated `Search` to address accessibility violation and removed all
MUI logic
- Updated `Search` stories (added new story, decoupled all stories from
single decorator)
- Updated `autoFocus` behavior in `SearchField`
- Updated the styling for `WorkspacePageBuildView` to make sure the tabs
had enough padding
- Fixed layout effect in `WorkspacePageBuildView` to fire correctly
Fixes some accidental styling issues introduced in #19242
## Changes made
- Updated styles
- Added support for `className` prop so that we can override the styles
as needed
- Removed the aria-label in favor of injecting the main text directly
## Notes
- This feels like a case where the changes in the previous PR were
actually *correct overall*, but something with our MUI+Tailwind setup
created conflicting styles, and we accidentally introduced an underline
style that shouldn't be there
- Removed the Aria label because I've realized in the past year that
Aria is really easy to misuse, and it's best just to do things with the
base HTML features as much as possible. There's a risk that the old code
had compliance issues with certain types of screen readers (even though
it worked fine when I did manual testing back in 2023). These changes
hopefully remove those risks completely
Precursor to https://github.com/coder/coder/pull/18895
Splitting this off so that the changes are easier to review.
## Changes made
- Improve type-safety for the `withQuery` Storybook decorator
- Centralized almost all queries that deal with template versions to use
a shared, exported query key prefix
- Updated `useFilter` and `usePagination` to have much more strict
return types, and decoupled them from React Router at the interface
level
- Also added some extra input validation and performance optimizations
to `useFilter` and `usePagination`
- Removed a stale data when working with checked workspaces for the
`/workspaces` page
- Removed hacky `useEffect` call for syncing URL state to checked
workspaces, in favor of explicit state syncs
- Did some extra cleanup and removed unused values
## Notes
- Many of the changes here were in service of the main PR. I'll try to
highlight notable areas, but if there's anything that's not clear, feel
free to post a comment in this PR. Ideally you shouldn't really have to
look at the other PR to understand this one, so if something's
confusing, that's a sign that something's wrong
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Refactor**
* Improved handling of URL search parameters and state synchronization
in filter and pagination features across multiple pages.
* Centralized and clarified state management for workspace selection and
batch actions on the Workspaces page.
* Enhanced type safety and naming consistency in batch actions and
filter components.
* Updated filter and pagination hooks to accept explicit parameters and
callbacks for better maintainability.
* Streamlined prop naming and menu handling in workspace filter
components for clarity.
* **Bug Fixes**
* Prevented unnecessary state updates when filter values remain
unchanged.
* **Tests**
* Updated tests for improved type safety and more precise assertions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
No issue to link – I'm basically pushing some updates upstream from the
version of the hook I copied over for the Registry website.
## Changes made
- Updated debounce functions to have input validation for timeouts
- Updated `useDebouncedValue` to flush state syncs immediately if
timeout value is `0`
- Updated tests to reflect changes
- Cleaned up some comments and parameter names to make things more clear
Closes https://github.com/coder/coder/issues/16759
## Changes made
- Replaced all instances of `Array.prototype.toSorted` with
`Array.prototype.sort` to provide better support for older browsers
- Updated all `Array.prototype.sort` calls where necessary to remove
risks of mutation render bugs
- Refactored some code (moved things around, added comments) to make it
more clear that certain `.sort` calls are harmless and don't have any
risks
## Changes made
- Updated `Line` type in `LogLine.tsx` to support an ID value to prevent
key conflicts during React rendering. Also deleted the `LineWithID`
type, which became redundant after the change
- Updated the `Logs` component to use the ID to avoid render key
conflicts
- Updated any component calls to add the ID as a prop
## Notes
- This does prevent a bunch of extra `console.error` calls that React
will automatically spit out, so this should help us a good bit in the
future
- Beyond being a little annoying, there was a chance (that was tiny for
now) that React could accidentally mix up component instances during
re-renders. That wasn't my main goal with this PR (I just wanted less
noisy logs), but that should now be impossible
## Changes made
- Updated `OneWayWebSocket` class to prevent errors from being
dispatched after a connection has been manually closed.
- Renamed one of the class properties for less ambiguity
- Made error messages for the class constructor more specific
## Changes made
- Switched almost all headers to use the `SettingHeader` component
- Redesigned component to be more composition-based, to stay in line
with the patterns we're starting to use more throughout the codebase
- Refactored `SettingHeader` to be based on Radix and Tailwind, rather
than Emotion/MUI
- Added additional props to `SettingHeader` to help resolve issues with
the component creating invalid HTML
- Beefed up `SettingHeader` to have better out-of-the-box accessibility
- Addressed some typographic problems in `SettingHeader`
- Addressed some responsive layout problems for `SettingsHeader`
- Added first-ever stories for `SettingsHeader`
## Notes
- There are still a few headers that aren't using `SettingHeader` yet.
There were some UI edge cases that meant I couldn't reliably bring it in
without consulting the Design team first. I'm a little less worried
about them, because they at least *look* like the other headers, but
it'd be nice if we could centralize everything in a followup PR
Closes https://github.com/coder/coder/issues/16775
## Changes made
- Added `OneWayWebSocket` function that establishes WebSocket
connections that don't allow client-to-server communication
- Added tests for the new function
- Updated API endpoints to make new WS-based endpoints, and mark
previous SSE-based endpoints as deprecated
- Updated existing SSE handlers to use the same core logic as the new WS
handlers
## Notes
- Frontend changes handled via #16855
## Changes made
- Updated links in the deployment settings page to ensure that they're
highlighted properly
- Updated comment about previous PR to make sure it's clear why we
needed a workaround.
## Changes made
- Replaced previous `ErrorBoundary` functionality with
`GlobalErrorBoundary` component
- Wired up `GlobalErrorBoundary` to React Router rather than the top of
the app
Closes#15212
## Changes made
- Updated logic so that proxy config is only requested when appropriate,
instead of for all users on all deployment pages
- Split up the main context provider for the `/deployment` and
`/organizations` routes, and updated layout logic for
`ManagementSettingsLayout` layout component. This ensures the sidebar is
always visible, even if request errors happen
- Added additional routing safeguards to make sure that even if a user
can view one page in the deployment section, they won't be able to
navigate directly to any arbitrary deployment page
- Updated logic for sidebar navigation to ensure that nav items only
appear when the user truly has permission
- Centralized a lot of the orgs logic into the `useAuthenticated` hook
- Added additional check cases to the `permissions.tsx` file, to give
more granularity, and added missing type-checking
- Extended the API for the `RequirePermissions` component to let it
redirect users anywhere
- Updated some of our testing setup files to ensure that types were
defined correctly
---------
Co-authored-by: McKayla Washburn <mckayla@hey.com>
## Changes made
- Updated custom avatar components to favor background color by default
- Updated `AvatarData` component to let you manually specify the source
of the text used when images fail to load, and updated the orgs
breadcrumb segment to use it
- Added some logic for handling emoji images better
* chore: finish draft work for FeatureBadge component
* fix: add visually-hidden helper text for screen readers
* chore: add stories for highlighted state
* fix: update base styles
* chore: remove debug display option
* chore: update Popover to propagate events
* wip: commit progress on FeatureBadge update
* wip: commit more progress
* chore: update tag definitions to satify Biome
* chore: update all colors for preview role
* fix: make sure badge shows as hovered while inside tooltip
* wip: commit progress on adding story for controlled variant
* fix: sort imports
* refactor: change component API to be more obvious/ergonomic
* fix: add biome-ignore comments to more base files
* fix: update import order again
* chore: revert biome-ignore comment
* chore: update body text for tooltip
* chore: update dark preivew role to use sky palette
* chore: update color palettes for light/darkBlue themes
* chore: add beta badge to organizations subheader
* chore: add beta badge to organizations settings page
* chore: beef up font weight for form header
* fix: update text contrast for org menu list
* chore: add beta badge to deployment dropdown
* fix: run biome on imports
* chore: remove API for controlling FeatureBadge hover styling externally
* chore: add xs size for badge
* fix: update font weight for xs feature badges
* chore: add beta badges to all org headers
* fix: turn badges and tooltips into separate concerns
* fix: update hover styling
* docs: update wording on comment
* fix: apply formatting
* chore: rename FeatureBadge to FeatureStageBadge
* refactor: redefine FeatureStageBadge
* chore: update stories
* fix: add blur behavior to popover
* chore: revert theme colors
* chore: create featureStage branding namespace
* fix: make sure cleanup function is set up properly
* docs: update wording on comment for clarity
* refactor: move styles down
* chore: move schedule controls to the right side of the screen
* chore: add org display to workspace topbar
* fix: force organizations to be readonly array
* fix update type mismatch for organizations again
* refactor: tuck main loading skeleton for filter into base definition
* refactor: give filter files different names to reduce confusion
* refactor: remove separate base filter skeleton
* fix: update responsive logic for audit table filter
* chore: add organizations option group to workspaces table
* refactor: make prop contracts more explicit
* refactor: centralize the organizations dropdown logic
* fix: update imports and formatting
* fix: update quota querying logic to use new endpoint
* fix: add logic for handling long workspace or org names
* chore: add links for workspaces by org
* chore: expand tooltip styling for org
* chore: expand tooltip styling for owner
* refactor: split off breadcrumbs for readability
* fix: display correct template version name in dropdown
* fix: update overflow styling for breadcrumb segments
* fix: favor org display name
* fix: centralize org display name logic
* fix: make sure skeletons stay synced with org feature toggles
* fix: ensure that mock query cache key and component key are properly synced for storybook
* docs: clean up wording on SearchField comment
* fix: shrink mix width threshold for search field
* chore: add navigation test for workspace details page (#14629)
* chore: add tests for WorkspacePage cross-page navigation
* fix: update story to use mock organizations menu
* chore: move schedule controls to the right side of the screen
* chore: add org display to workspace topbar
* fix: force organizations to be readonly array
* fix update type mismatch for organizations again
* fix: update quota querying logic to use new endpoint
* fix: add logic for handling long workspace or org names
* chore: add links for workspaces by org
* chore: expand tooltip styling for org
* chore: expand tooltip styling for owner
* refactor: split off breadcrumbs for readability
* fix: display correct template version name in dropdown
* fix: update overflow styling for breadcrumb segments
* fix: favor org display name
* fix: centralize org display name logic
* fix: ensure that mock query cache key and component key are properly synced for storybook
* fix: prefer organization display name for workspaces table
* fix: update story to account for organization name changes
* fix: resolve typo in regex search for test
* chore: add organization label to workspace template column
* chore: add test for presence of showOrganizations context value
* fix: organize imports
* fix: expose table row subtitles only to screen readers
* fix: get basic fix in for preventing download logs from blowing up UI
* fix: make sure blob units can't go out of bounds
* fix: make sure timeout is cleared on component unmount
* fix: reduce risk of shared cache state breaking useAgentLogs
* fix: allow partial downloading of logs
* fix: make sure useMemo cache is used properly
* wip: commit current progress on updated logs functionality
* docs: rewrite comment for clarity
* refactor: clean up current code
* fix: update styles for unavailable logs
* fix: resolve linter violations
* fix: update type signature of getErrorDetail
* fix: revert log/enabled logic for useAgentLogs
* fix: remove memoization from DownloadLogsDialog
* fix: update name of timeout state
* refactor: make log web sockets logic more clear
* docs: reword comment for clarity
* fix: commit current style update progress
* fix: finish style updates
* wip: commit progress on test revamps
* fix: update existing tests to new format
* chore: add test case for global snackbar
* refactor: consolidate files
* refactor: make http dependency more explicit
* chore: add extra test case for exposed error value
* docs: fix typos
* fix: make sure clipboard is reset between test runs
* docs: add more context to comments
* refactor: update mock console.error logic to use jest.spyOn
* docs: add more clarifying comments
* refactor: split off type alias for clarity
* wip: commit progress on code split-up
* wip: commit more progress
* wip: finish initial version of class implementation
* chore: update all import paths to go through client instance
* fix: remove temp comments
* refactor: smoooooooosh the API
* refactor: update import setup for tests
* fix: remove some of the jank around our core App component
* refactor: scope navigation logic more aggressively
* refactor: add explicit return type to useAuthenticated
* refactor: clean up ProxyContext code
* wip: add code for consolidating the HTML metadata
* refactor: clean up hook logic
* refactor: rename useHtmlMetadata to useEmbeddedMetadata
* fix: correct names that weren't updated
* fix: update type-safety of useEmbeddedMetadata further
* wip: switch codebase to use metadata hook
* refactor: simplify design of metadata hook
* fix: update stray type mismatches
* fix: more type fixing
* fix: resolve illegal invocation error
* fix: get metadata issue resolved
* fix: update comments
* chore: add unit tests for MetadataManager
* fix: beef up tests
* fix: update typo in tests
* fix: update API code to use Axios instance
* docs: fix typo
* fix: update all global axios imports to use Coder instance
* fix: remove needless import
* fix: update import order
* refactor: rename coderAxiosInstance to axiosInstance
* docs: update variable reference in FE contributing docs
* chore: rename useTab to useSearchParamsKey and add test
* chore: mark old renderHookWithAuth as deprecated (temp)
* fix: update imports for useResourcesNav
* refactor: change API for useSearchParamsKey
* chore: let user pass in their own URLSearchParams value
* refactor: clean up comments for clarity
* fix: update import
* wip: commit progress on useWorkspaceDuplication revamp
* chore: migrate duplication test to new helper
* refactor: update code for clarity
* refactor: reorder test cases for clarity
* refactor: split off hook helper into separate file
* refactor: remove reliance on internal React Router state property
* refactor: move variables around for more clarity
* refactor: more updates for clarity
* refactor: reorganize test cases for clarity
* refactor: clean up test cases for useWorkspaceDupe
* refactor: clean up test cases for useWorkspaceDupe
* fix: ensure auto-workspace creation waits until all parameters are ready
* refactor: move creation blocking logic to main callback
* fix: let creation start if experimental feature is off
* refactor: clean up and update API for useClipboard
* wip: commit current progress on useClipboard test
* docs: clean up wording on showCopySuccess
* chore: make sure tests can differentiate between HTTP/HTTPS
* chore: add test ID to dummy input
* wip: commit progress on useClipboard test
* wip: commit more test progress
* refactor: rewrite code for clarity
* chore: finish clipboard tests
* fix: prevent double-firing for button click aliases
* refactor: clean up test setup
* fix: rename incorrect test file
* refactor: update code to display user errors
* refactor: redesign useClipboard to be easier to test
* refactor: clean up GlobalSnackbar
* feat: add functionality for notifying user of errors (with tests)
* refactor: clean up test code
* refactor: centralize cleanup steps
* refactor: clean up tests for debounce
* refactor: clean up tests for useCustomEvent
* refactor: clean up events file
* refactor: clean up tests for hookPolyfills
- These CSS changes were for making sure there weren't layout shifts
when using the non-secure clipboard fallback, which could cause janky
UI flickers. It seems to be breaking things for some users on HTTP-only
connections, though.
* wip: commit progress for clipboard update
* wip: push more progress
* chore: finish initial version of useClipboard revamp
* refactor: update API query to use newer RQ patterns
* fix: update importers of useClipboard
* fix: increase clickable area of CodeExample
* fix: update styles for CliAuthPageView
* fix: resolve issue with ref re-routing
* docs: update comments for clarity
* wip: commit progress on clipboard tests
* chore: add extra test case for referential stability
* wip: disable test stub to avoid breaking CI
* wip: add test case for tab-switching
* feat: finish changes
* fix: improve styling for strong text
* fix: make sure period doesn't break onto separate line
* fix: make center styling more friendly to screen readers
* refactor: clean up mocking implementation
* fix: resolve security concern for clipboard text
* fix: update CodeExample to obscure text when appropriate
* fix: apply secret changes to relevant code examples
* refactor: simplify code for obfuscating text
* fix: partially revert clipboard changes
* fix: clean up page styling further
* fix: remove duplicate property identifier
* refactor: rename variables for clarity
* fix: simplify/revert CopyButton component design
* fix: update how dummy input is hidden from page
* fix: remove unused onClick handler prop
* fix: resolve unused import
* fix: opt code examples out of secret behavior
* chore: add Pagination component, add new test, and update other pagination tests
* fix: add back temp spacing for WorkspacesPageView
* chore: update AuditPage to use Pagination
* chore: update UsersPage to use Pagination
* refactor: move parts of Pagination into WorkspacesPageView
* fix: handle empty states for pagination labels better
* docs: rewrite comment for clarity
* refactor: rename components/properties for clarity
* fix: rename component files for clarity
* chore: add story for PaginationContainer
* chore: rename story for clarity
* fix: handle undefined case better
* fix: update imports for PaginationContainer mocks
* fix: update story values for clarity
* fix: update scroll logic to go to the bottom instead of the top
* fix: update mock setup for test
* fix: update stories
* fix: remove scrolling functionality
* fix: remove deprecated property
* refactor: rename prop
* fix: remove debounce flake
* wip: commit current progress on usePaginatedQuery
* chore: add cacheTime to users query
* chore: update cache logic for UsersPage usersQuery
* wip: commit progress on Pagination
* chore: add function overloads to prepareQuery
* wip: commit progress on usePaginatedQuery
* docs: add clarifying comment about implementation
* chore: remove optional prefetch property from query options
* chore: redefine queryKey
* refactor: consolidate how queryKey/queryFn are called
* refactor: clean up pagination code more
* fix: remove redundant properties
* refactor: clean up code
* wip: commit progress on usePaginatedQuery
* wip: commit current pagination progress
* docs: clean up comments for clarity
* wip: get type signatures compatible (breaks runtime logic slightly)
* refactor: clean up type definitions
* chore: add support for custom onInvalidPage functions
* refactor: clean up type definitions more for clarity reasons
* chore: delete Pagination component (separate PR)
* chore: remove cacheTime fixes (to be resolved in future PR)
* docs: add clarifying/intellisense comments for DX
* refactor: link users queries to same queryKey implementation
* docs: remove misleading comment
* docs: more comments
* chore: update onInvalidPage params for more flexibility
* fix: remove explicit any
* refactor: clean up type definitions
* refactor: rename query params for consistency
* refactor: clean up input validation for page changes
* refactor/fix: update hook to be aware of async data
* chore: add contravariance to dictionary
* refactor: increase type-safety of usePaginatedQuery
* docs: more comments
* chore: move usePaginatedQuery file
* fix: add back cacheTime
* chore: swap in usePaginatedQuery for users table
* chore: add goToFirstPage to usePaginatedQuery
* fix: make page redirects work properly
* refactor: clean up clamp logic
* chore: swap in usePaginatedQuery for Audits table
* refactor: move dependencies around
* fix: remove deprecated properties from hook
* refactor: clean up code more
* docs: add todo comment
* chore: update testing fixtures
* wip: commit current progress for tests
* fix: update useEffectEvent to sync via layout effects
* wip: commit more progress on tests
* wip: stub out all expected test cases
* wip: more test progress
* wip: more test progress
* wip: commit more test progress
* wip: AHHHHHHHH
* chore: finish two more test cases
* wip: add in all tests (still need to investigate prefetching
* refactor: clean up code slightly
* fix: remove math bugs when calculating pages
* fix: wrap up all testing and clean up cases
* docs: update comments for clarity
* fix: update error-handling for invalid page handling
* fix: apply suggestions
* refactor: remove workspace error enums
* fix: add in retry button for failed workspaces
* fix: make handleBuildRetry auto-detect debug permissions
* chore: consolidate retry messaging
* chore: update renderWorkspacePage to accept parameters
* chore: make workspace test helpers take explicit workspace parameter
* refactor: update how parameters for tests are defined
* fix: update old tests to be correctly parameterized
* fix: add focus styling to checkboxes
* fix: add focus styling to icon buttons
* fix: add focus styling to switches
* fix: swap outlines for box-shadows for more styling control
* chore: revamp Page Utility tests
* refactor: simplify component design for PageButton
* chore: beef up isNonInitialPage and add tests
* docs: clean up comments
* chore: quick refactor for buildPagedList
* refactor: clean up math calculations for buildPagedList
* chore: rename PageButtons file
* chore: revamp how nav buttons are defined
* fix: remove test disabled state
* chore: clean up base nav button
* chore: rename props for clarity
* refactor: clean up logic for isNonInitialPage
* chore: add more tests and catch bugs
* docs: fix confusing typo in comments
* chore: add one more test case for pagination buttons
* refactor: update props definition for PaginationNavButton
* fix: remove possible state sync bugs
* chore: add query for a user's groups
* chore: integrate user groups into UI
* refactor: split UI card into separate component
* chore: enforce alt text for AvatarCard
* chore: add proper alt text support for Avatar
* fix: update props for Avatar call sites
* finish AccountPage changes
* wip: commit progress on AvatarCard
* fix: add better UI error handling
* fix: update theme setup for AvatarCard
* fix: update styling for AccountPage
* fix: make error message conditional
* chore: update styling for AvatarCard
* chore: finish AvatarCard
* fix: add maxWidth support to AvatarCard
* chore: update how no max width is defined
* chore: add AvatarCard stories
* fix: remove incorrect semantics for AvatarCard
* docs: add comment about flexbox behavior
* docs: add clarifying text about prop
* fix: fix grammar for singular groups
* refactor: split off AccountUserGroups and add story
* fix: differentiate mock groups more
* refactor: extract UserRoleCell into separate component
* wip: add placeholder Groups column
* fix: remove redundant css styles
* refactor: update EditRolesButton to use Sets to detect selections
* wip: commit progress for updated roles column
* wip: commit current role pill progress
* fix: update state sync logic
* chore: add groupsByUserId query options factory
* fix: update return value of select function
* chore: drill groups data down to cell component
* wip: commit current cell progress
* fix: remove redundant classes
* wip: commit current styling progress
* fix: update line height for CTA
* fix: update spacing
* chore: add tooltip for Groups column header
* fix: remove tsbuild file
* refactor: consolidate tooltip components
* fix: update font size defaults inside theme
* fix: expand hoverable/clickable area of groups cell
* fix: remove possible undefined cases from HelpTooltip
* chore: add popover functionality to groups
* wip: commit progress on groups tooltip
* fix: remove zero-height group name visual bug
* feat: get basic version of user group tooltips done
* perf: move sort order callback outside loop
* fix: update spacing for tooltip
* feat: make popovers entirely hover-based
* fix: disable scroll locking for popover
* docs: add comments explaining some pitfalls with Popover component
* refactor: simplify userRoleCell implementation
* feat: complete main feature
* fix: prevent scroll lock for role tooltips
* fix: change import to type import
* refactor: simplify how groups are clustered
* refactor: update UserRoleCell to use Popover
* refactor: remove unnecessary fragment
* chore: add id/aria support for Popover
* refactor: update UserGroupsCell to use Popover
* chore: redo visual design for UserGroupsCell
* fix: shrink UserGroupsCell text
* fix: update UsersTable test to include groups info
* fix: make error text less naggy
* fix: make input colors sync with confirmation text state
* fix: more color sync fixes
* fix: remove flaky warning messages in test
* fix: remove needless braces
* refactor: clean up code
* refactor: clean up code more
* fix: remove hsl color from initial form state
* chore: add extra color helpers
* chore: add extra runtime validation for colors
* chore: clean up comments for clarity
* chore: add tests for colors
* chore: add generic ref support for useClickable
* chore: update useClickable call sites to use type parameter
* chore: update useClickableTableRow implementation
* chore: update other components using useClickableTableRow
* feat: add middle-click and cmd-click support for rows
* refactor: rename variable for clarity
* docs: add comment for clarity
* chore: add more click logic and comments
* refactor: clean up useClickableTableRow
* docs: rewrite comments for clarity
* fix: update TimelineEntry to accept forwarded ref
* fix: fix keyboard event logic to respond to spaces properly
* chore: Add benchmark logs to test
* chore: Remove benchmark logic
* chore: add hard cutoff for waitFor calls
* refactor: clean up waitFor cut-off logic
* chore: add assertion that submit button is not disabled
* chore: Remove disabled check at the start of the test
* fix: extend cutoff for waitFor config
* minor: Add useEffectEvent polyfill
* chore: update filter to have better callback support
* docs: Clean up comments
* fix: add localStorage to useWorkspacesFilter
* refactor: Centralize stable useSearchParams
* refactor: clean up filter to be fully pure on mount
* chore: add tests for useEffectEvent
* wip: commit progress for searchbar fix
* chore: clean up WorkspacesPage
* fix: add logic for syncing queries with search params
* chore: Rename initialValue to fallbackFilter
* chore: Remove todo comment
* refactor: update code to use useEffectEvent
* docs: clean up comments for clarity
* fix: update url check to use regex
* chore: Reorganize hook calls for useWorkspacesFilter
* refactor: Clean up some filter logic
* refactor: Create debounce utility hooks
* docs: Clean up comments for clarity
* fix: Update focus logic to apply for any inner focus
* fix: Add onBlur behavior for state syncs
* chore: Add progress for debounce test
* chore: Finish tests for debounce hooks
* docs: Add file description and warning