state-in-url 6.2.1 → 6.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "state-in-url",
3
- "version": "6.2.1",
3
+ "version": "6.2.2",
4
4
  "description": "Store state in URL as in object, types and structure are preserved, with TS validation. Same API as React.useState, wthout any hasssle or boilerplate. Next.js@14-15, react-router@6-7, and remix@2.",
5
5
  "homepage": "https://state-in-url.dev",
6
6
  "repository": {
@@ -95,17 +95,14 @@
95
95
  "test:int": "wireit",
96
96
  "test:int:ci": "wireit",
97
97
  "test:exports": "pnpm run build && npx babel-node --extensions .js,.mjs,.ts,.mts --config-file ./babel.config.json -- ./packages/urlstate/exportsTest.ts",
98
- "install:all": "pnpm install",
99
- "install:ci": "pnpm install --frozen-lockfile",
100
98
  "test": "wireit",
101
- "tsc": "wireit",
102
99
  "dev": "wireit",
103
100
  "dev:lib": "wireit",
104
101
  "dev:nextjs14": "wireit",
105
102
  "dev:nextjs15": "wireit",
106
103
  "dev:nextjs16": "wireit",
107
104
  "dev:remix2": "wireit",
108
- "bump": "npx standard-version --no-verify",
105
+ "tsc": "wireit",
109
106
  "build": "wireit",
110
107
  "build:demo": "wireit",
111
108
  "start:demo": "wireit",
@@ -117,7 +114,12 @@
117
114
  "start:ci": "wireit",
118
115
  "kill-next": "wireit",
119
116
  "kill-vite": "wireit",
117
+ "kill-remix": "wireit",
118
+ "kill-services": "wireit",
120
119
  "kill": "wireit",
120
+ "bump": "npx standard-version --no-verify",
121
+ "install:all": "pnpm install",
122
+ "install:ci": "pnpm install --frozen-lockfile",
121
123
  "rmdist": "rm -rf dist",
122
124
  "cleanup": "rm -rf dist .wireit node_modules test-results playwright-report coverage-reports nyc_coverage packages/example-nextjs14/node_modules packages/example-nextjs14/.next packages/example-nextjs15/node_modules packages/example-nextjs15/.next packages/example-nextjs16/node_modules packages/example-nextjs16/.next packages/example-react/node_modules packages/example-react-router6/node_modules packages/example-react-router7/node_modules packages/example-remix2/node_modules",
123
125
  "reinstall": "pnpm run cleanup && pnpm install",
@@ -158,16 +160,17 @@
158
160
  "kill-vite": {
159
161
  "command": "ps aux | grep '.bin/vite' | grep -v grep | awk '{print $2}' | xargs kill -9 2>&1; exit 0"
160
162
  },
163
+ "kill-remix": {
164
+ "command": "ps aux | grep -E 'remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs kill -9 2>&1; exit 0"
165
+ },
166
+ "kill-services": {
167
+ "command": "ps aux | grep -E '.next|.bin/vite|remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs -r kill -9 2>&1; exit 0"
168
+ },
161
169
  "kill-wireit": {
162
- "command": "ps axu | grep wireit | awk '{print $2}' | xargs kill -9"
170
+ "command": "ps axu | grep '[w]ireit' | grep -v grep | awk -v me=$PPID '$2 != me {print $2}' | xargs -r kill -9 2>&1; exit 0"
163
171
  },
164
172
  "kill": {
165
- "command": "killed",
166
- "dependencies": [
167
- "kill-next",
168
- "kill-vite",
169
- "kill-wireit"
170
- ]
173
+ "command": "ps aux | grep -E '.next|.bin/vite|remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs -r kill -9 2>&1; ps axu | grep '[w]ireit' | grep -v grep | awk -v me=$PPID '$2 != me {print $2}' | xargs -r kill -9 2>&1; exit 0"
171
174
  },
172
175
  "test:int:ci": {
173
176
  "command": "npx cross-env HOME=/root PLAYWRIGHT_BROWSERS_PATH=0 playwright test"
@@ -259,23 +262,23 @@
259
262
  "dependencies": [
260
263
  "build"
261
264
  ],
262
- "command": "cd packages/example-nextjs15 && pnpm run build"
265
+ "command": "cd packages/example-nextjs16 && pnpm run build"
263
266
  },
264
267
  "build:demo:tests": {
265
268
  "dependencies": [
266
269
  "build"
267
270
  ],
268
- "command": "cd packages/example-nextjs15 && npx cross-env TEST=true pnpm run build"
271
+ "command": "cd packages/example-nextjs16 && npx cross-env TEST=true pnpm run build"
269
272
  },
270
273
  "start:demo": {
271
274
  "dependencies": [
272
275
  "build:demo"
273
276
  ],
274
- "command": "cd packages/example-nextjs15 && pnpm run start",
277
+ "command": "cd packages/example-nextjs16 && pnpm run start",
275
278
  "service": true
276
279
  },
277
280
  "start:demo:ci": {
278
- "command": "cd packages/example-nextjs15 && pnpm run start",
281
+ "command": "cd packages/example-nextjs16 && pnpm run start",
279
282
  "service": true
280
283
  },
281
284
  "start:react": {
@@ -287,6 +290,9 @@
287
290
  },
288
291
  "start:react:ci": {
289
292
  "command": "npx vite preview --port 5180 packages/example-react",
293
+ "dependencies": [
294
+ "kill-services"
295
+ ],
290
296
  "service": true
291
297
  },
292
298
  "start:router6": {
@@ -298,6 +304,9 @@
298
304
  },
299
305
  "start:router6:ci": {
300
306
  "command": "npx vite preview --port 5181 packages/example-react-router6",
307
+ "dependencies": [
308
+ "kill-services"
309
+ ],
301
310
  "service": true
302
311
  },
303
312
  "start:router7": {
@@ -309,6 +318,9 @@
309
318
  },
310
319
  "start:router7:ci": {
311
320
  "command": "npx vite preview --port 5183 packages/example-react-router7",
321
+ "dependencies": [
322
+ "kill-services"
323
+ ],
312
324
  "service": true
313
325
  },
314
326
  "start:remix2": {
@@ -320,6 +332,9 @@
320
332
  },
321
333
  "start:remix2:ci": {
322
334
  "command": "cd packages/example-remix2 && pnpm run start",
335
+ "dependencies": [
336
+ "kill-services"
337
+ ],
323
338
  "service": true
324
339
  },
325
340
  "start:demo14": {
@@ -338,6 +353,9 @@
338
353
  },
339
354
  "start:demo14:ci": {
340
355
  "command": "cd packages/example-nextjs14 && pnpm run start",
356
+ "dependencies": [
357
+ "kill-services"
358
+ ],
341
359
  "service": true
342
360
  },
343
361
  "start:demo15:ci": {
@@ -353,6 +371,9 @@
353
371
  },
354
372
  "start:demo16:ci": {
355
373
  "command": "cd packages/example-nextjs16 && pnpm run start",
374
+ "dependencies": [
375
+ "kill-services"
376
+ ],
356
377
  "service": true
357
378
  },
358
379
  "start": {
@@ -389,7 +410,7 @@
389
410
  "build:react",
390
411
  "build:demo:tests",
391
412
  "build:next14",
392
- "build:next16",
413
+ "build:next15",
393
414
  "build:router6",
394
415
  "build:router7",
395
416
  "build:remix2"
@@ -441,7 +462,6 @@
441
462
  },
442
463
  "devDependencies": {
443
464
  "@babel/core": "^7.28.4",
444
- "@tanstack/intent": "latest",
445
465
  "@babel/node": "^7.28.0",
446
466
  "@babel/preset-env": "^7.28.3",
447
467
  "@babel/preset-typescript": "^7.27.1",
@@ -455,11 +475,12 @@
455
475
  "@semantic-release/git": "^10.0.1",
456
476
  "@semantic-release/npm": "^13.1.3",
457
477
  "@semantic-release/release-notes-generator": "^14.1.0",
478
+ "@tanstack/intent": "latest",
458
479
  "@testing-library/dom": "^10.4.1",
459
480
  "@testing-library/jest-dom": "^6.9.0",
460
481
  "@testing-library/react": "^16.3.0",
461
482
  "@testing-library/react-hooks": "^8.0.1",
462
- "@types/node": "^20.19.18",
483
+ "@types/node": "^24",
463
484
  "@types/react": "^18.3.25",
464
485
  "@types/react-dom": "^18.3.7",
465
486
  "@vitest/coverage-istanbul": "^2.1.9",
@@ -504,7 +525,7 @@
504
525
  "unplugin-auto-import": "^0.18.6",
505
526
  "vitest": "^2.1.9",
506
527
  "wait-on": "^8.0.5",
507
- "wireit": "^0.14.12"
528
+ "wireit": "^0.14.13"
508
529
  },
509
530
  "keywords": [
510
531
  "state in url",
@@ -566,7 +587,8 @@
566
587
  "pnpm": {
567
588
  "overrides": {
568
589
  "@remix-run/react>react": "18.3.1",
569
- "@remix-run/react>react-dom": "18.3.1"
590
+ "@remix-run/react>react-dom": "18.3.1",
591
+ "@types/node": "^24"
570
592
  },
571
593
  "onlyBuiltDependencies": [
572
594
  "@parcel/watcher",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "state-in-url",
3
- "version": "6.2.1",
3
+ "version": "6.2.2",
4
4
  "description": "Store state in URL as in object, types and structure are preserved, with TS validation. Same API as React.useState, wthout any hasssle or boilerplate. Next.js@14-15, react-router@6-7, and remix@2.",
5
5
  "homepage": "https://state-in-url.dev",
6
6
  "repository": {
@@ -95,17 +95,14 @@
95
95
  "test:int": "wireit",
96
96
  "test:int:ci": "wireit",
97
97
  "test:exports": "pnpm run build && npx babel-node --extensions .js,.mjs,.ts,.mts --config-file ./babel.config.json -- ./packages/urlstate/exportsTest.ts",
98
- "install:all": "pnpm install",
99
- "install:ci": "pnpm install --frozen-lockfile",
100
98
  "test": "wireit",
101
- "tsc": "wireit",
102
99
  "dev": "wireit",
103
100
  "dev:lib": "wireit",
104
101
  "dev:nextjs14": "wireit",
105
102
  "dev:nextjs15": "wireit",
106
103
  "dev:nextjs16": "wireit",
107
104
  "dev:remix2": "wireit",
108
- "bump": "npx standard-version --no-verify",
105
+ "tsc": "wireit",
109
106
  "build": "wireit",
110
107
  "build:demo": "wireit",
111
108
  "start:demo": "wireit",
@@ -117,7 +114,12 @@
117
114
  "start:ci": "wireit",
118
115
  "kill-next": "wireit",
119
116
  "kill-vite": "wireit",
117
+ "kill-remix": "wireit",
118
+ "kill-services": "wireit",
120
119
  "kill": "wireit",
120
+ "bump": "npx standard-version --no-verify",
121
+ "install:all": "pnpm install",
122
+ "install:ci": "pnpm install --frozen-lockfile",
121
123
  "rmdist": "rm -rf dist",
122
124
  "cleanup": "rm -rf dist .wireit node_modules test-results playwright-report coverage-reports nyc_coverage packages/example-nextjs14/node_modules packages/example-nextjs14/.next packages/example-nextjs15/node_modules packages/example-nextjs15/.next packages/example-nextjs16/node_modules packages/example-nextjs16/.next packages/example-react/node_modules packages/example-react-router6/node_modules packages/example-react-router7/node_modules packages/example-remix2/node_modules",
123
125
  "reinstall": "pnpm run cleanup && pnpm install",
@@ -158,16 +160,17 @@
158
160
  "kill-vite": {
159
161
  "command": "ps aux | grep '.bin/vite' | grep -v grep | awk '{print $2}' | xargs kill -9 2>&1; exit 0"
160
162
  },
163
+ "kill-remix": {
164
+ "command": "ps aux | grep -E 'remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs kill -9 2>&1; exit 0"
165
+ },
166
+ "kill-services": {
167
+ "command": "ps aux | grep -E '.next|.bin/vite|remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs -r kill -9 2>&1; exit 0"
168
+ },
161
169
  "kill-wireit": {
162
- "command": "ps axu | grep wireit | awk '{print $2}' | xargs kill -9"
170
+ "command": "ps axu | grep '[w]ireit' | grep -v grep | awk -v me=$PPID '$2 != me {print $2}' | xargs -r kill -9 2>&1; exit 0"
163
171
  },
164
172
  "kill": {
165
- "command": "killed",
166
- "dependencies": [
167
- "kill-next",
168
- "kill-vite",
169
- "kill-wireit"
170
- ]
173
+ "command": "ps aux | grep -E '.next|.bin/vite|remix-serve|@remix-run/serve' | grep -v grep | awk '{print $2}' | xargs -r kill -9 2>&1; ps axu | grep '[w]ireit' | grep -v grep | awk -v me=$PPID '$2 != me {print $2}' | xargs -r kill -9 2>&1; exit 0"
171
174
  },
172
175
  "test:int:ci": {
173
176
  "command": "npx cross-env HOME=/root PLAYWRIGHT_BROWSERS_PATH=0 playwright test"
@@ -259,23 +262,23 @@
259
262
  "dependencies": [
260
263
  "build"
261
264
  ],
262
- "command": "cd packages/example-nextjs15 && pnpm run build"
265
+ "command": "cd packages/example-nextjs16 && pnpm run build"
263
266
  },
264
267
  "build:demo:tests": {
265
268
  "dependencies": [
266
269
  "build"
267
270
  ],
268
- "command": "cd packages/example-nextjs15 && npx cross-env TEST=true pnpm run build"
271
+ "command": "cd packages/example-nextjs16 && npx cross-env TEST=true pnpm run build"
269
272
  },
270
273
  "start:demo": {
271
274
  "dependencies": [
272
275
  "build:demo"
273
276
  ],
274
- "command": "cd packages/example-nextjs15 && pnpm run start",
277
+ "command": "cd packages/example-nextjs16 && pnpm run start",
275
278
  "service": true
276
279
  },
277
280
  "start:demo:ci": {
278
- "command": "cd packages/example-nextjs15 && pnpm run start",
281
+ "command": "cd packages/example-nextjs16 && pnpm run start",
279
282
  "service": true
280
283
  },
281
284
  "start:react": {
@@ -287,6 +290,9 @@
287
290
  },
288
291
  "start:react:ci": {
289
292
  "command": "npx vite preview --port 5180 packages/example-react",
293
+ "dependencies": [
294
+ "kill-services"
295
+ ],
290
296
  "service": true
291
297
  },
292
298
  "start:router6": {
@@ -298,6 +304,9 @@
298
304
  },
299
305
  "start:router6:ci": {
300
306
  "command": "npx vite preview --port 5181 packages/example-react-router6",
307
+ "dependencies": [
308
+ "kill-services"
309
+ ],
301
310
  "service": true
302
311
  },
303
312
  "start:router7": {
@@ -309,6 +318,9 @@
309
318
  },
310
319
  "start:router7:ci": {
311
320
  "command": "npx vite preview --port 5183 packages/example-react-router7",
321
+ "dependencies": [
322
+ "kill-services"
323
+ ],
312
324
  "service": true
313
325
  },
314
326
  "start:remix2": {
@@ -320,6 +332,9 @@
320
332
  },
321
333
  "start:remix2:ci": {
322
334
  "command": "cd packages/example-remix2 && pnpm run start",
335
+ "dependencies": [
336
+ "kill-services"
337
+ ],
323
338
  "service": true
324
339
  },
325
340
  "start:demo14": {
@@ -338,6 +353,9 @@
338
353
  },
339
354
  "start:demo14:ci": {
340
355
  "command": "cd packages/example-nextjs14 && pnpm run start",
356
+ "dependencies": [
357
+ "kill-services"
358
+ ],
341
359
  "service": true
342
360
  },
343
361
  "start:demo15:ci": {
@@ -353,6 +371,9 @@
353
371
  },
354
372
  "start:demo16:ci": {
355
373
  "command": "cd packages/example-nextjs16 && pnpm run start",
374
+ "dependencies": [
375
+ "kill-services"
376
+ ],
356
377
  "service": true
357
378
  },
358
379
  "start": {
@@ -389,7 +410,7 @@
389
410
  "build:react",
390
411
  "build:demo:tests",
391
412
  "build:next14",
392
- "build:next16",
413
+ "build:next15",
393
414
  "build:router6",
394
415
  "build:router7",
395
416
  "build:remix2"
@@ -441,7 +462,6 @@
441
462
  },
442
463
  "devDependencies": {
443
464
  "@babel/core": "^7.28.4",
444
- "@tanstack/intent": "latest",
445
465
  "@babel/node": "^7.28.0",
446
466
  "@babel/preset-env": "^7.28.3",
447
467
  "@babel/preset-typescript": "^7.27.1",
@@ -455,11 +475,12 @@
455
475
  "@semantic-release/git": "^10.0.1",
456
476
  "@semantic-release/npm": "^13.1.3",
457
477
  "@semantic-release/release-notes-generator": "^14.1.0",
478
+ "@tanstack/intent": "latest",
458
479
  "@testing-library/dom": "^10.4.1",
459
480
  "@testing-library/jest-dom": "^6.9.0",
460
481
  "@testing-library/react": "^16.3.0",
461
482
  "@testing-library/react-hooks": "^8.0.1",
462
- "@types/node": "^20.19.18",
483
+ "@types/node": "^24",
463
484
  "@types/react": "^18.3.25",
464
485
  "@types/react-dom": "^18.3.7",
465
486
  "@vitest/coverage-istanbul": "^2.1.9",
@@ -504,7 +525,7 @@
504
525
  "unplugin-auto-import": "^0.18.6",
505
526
  "vitest": "^2.1.9",
506
527
  "wait-on": "^8.0.5",
507
- "wireit": "^0.14.12"
528
+ "wireit": "^0.14.13"
508
529
  },
509
530
  "keywords": [
510
531
  "state in url",
@@ -566,7 +587,8 @@
566
587
  "pnpm": {
567
588
  "overrides": {
568
589
  "@remix-run/react>react": "18.3.1",
569
- "@remix-run/react>react-dom": "18.3.1"
590
+ "@remix-run/react>react-dom": "18.3.1",
591
+ "@types/node": "^24"
570
592
  },
571
593
  "onlyBuiltDependencies": [
572
594
  "@parcel/watcher",
@@ -4,16 +4,17 @@ description: >
4
4
  Define typed, module-scoped state and wrap useUrlState in a feature-scoped
5
5
  custom hook so unrelated React components share the same URL-synced state.
6
6
  Covers drawer/modal open-state, tab switching, multi-select toggles,
7
- reset/defaults semantics, and the object-identity-based sharing model.
8
- Load this skill when storing filters, tabs, drawers, selections, paginators,
9
- or any UI state that should survive reloads and be shareable by URL.
10
- type: core
11
- library: state-in-url
12
- library_version: '6.1.3'
7
+ reset/defaults semantics, and the object-identity-based sharing model. Load
8
+ this skill when storing filters, tabs, drawers, selections, paginators, or any
9
+ UI state that should survive reloads and be shareable by URL.
13
10
  sources:
14
11
  - 'asmyshlyaev177/state-in-url:packages/urlstate/next/useUrlState/useUrlState.ts'
15
12
  - 'asmyshlyaev177/state-in-url:packages/urlstate/utils.ts'
16
13
  - 'asmyshlyaev177/state-in-url:README.md'
14
+ metadata:
15
+ type: core
16
+ library: state-in-url
17
+ library_version: '6.1.3'
17
18
  ---
18
19
 
19
20
  # state-in-url — Feature state hook
@@ -345,6 +346,10 @@ Entity IDs (`jobId`, `memberId`, `channelId`) referencing public or semi-public
345
346
 
346
347
  Keep total query-string size well under ~12 KB to stay safe across CDNs and Vercel's 14 KB header limit. See [Limits.md](https://github.com/asmyshlyaev177/state-in-url/blob/master/Limits.md).
347
348
 
349
+ ## Getting help
350
+
351
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
352
+
348
353
  ## See also
349
354
 
350
355
  - `state-in-url/input-handling` — pattern for text inputs and sliders (instant `setState`, deferred `setUrl`).
@@ -1,21 +1,21 @@
1
1
  ---
2
2
  name: form-library-integration
3
3
  description: >
4
- Use the URL as a form draft store by pairing useUrlState with
5
- react-hook-form (or formik). Share one module-scoped defaults object
6
- between both libraries; hydrate useForm.defaultValues from urlState;
7
- push form changes back into setUrl via RHF subscribe() (NOT watch()).
8
- Load this skill when a form should round-trip its values through the
9
- URL — filter forms, search forms, multi-step wizards with shareable
10
- draft links.
11
- type: composition
12
- library: state-in-url
13
- library_version: '6.1.3'
4
+ Use the URL as a form draft store by pairing useUrlState with react-hook-form
5
+ (or formik). Share one module-scoped defaults object between both libraries;
6
+ hydrate useForm.defaultValues from urlState; push form changes back into
7
+ setUrl via RHF subscribe() (NOT watch()). Load this skill when a form should
8
+ round-trip its values through the URL — filter forms, search forms, multi-step
9
+ wizards with shareable draft links.
14
10
  requires:
15
11
  - feature-state-hook
16
12
  sources:
17
13
  - 'asmyshlyaev177/state-in-url:issue#57'
18
14
  - 'asmyshlyaev177/state-in-url:README.md'
15
+ metadata:
16
+ type: composition
17
+ library: state-in-url
18
+ library_version: '6.1.3'
19
19
  ---
20
20
 
21
21
  This skill builds on `state-in-url/feature-state-hook`. Read it first for the module-scoped default-state rule.
@@ -184,6 +184,10 @@ React.useEffect(() => {
184
184
  }, [formik.values, setUrl]);
185
185
  ```
186
186
 
187
+ ## Getting help
188
+
189
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
190
+
187
191
  ## See also
188
192
 
189
193
  - `state-in-url/feature-state-hook` — base pattern; required reading.
@@ -4,18 +4,19 @@ description: >
4
4
  Reconcile instant local input feedback with URL write throttling. setState
5
5
  updates internal state synchronously (instant re-render); setUrl is throttled
6
6
  and asynchronous (URL catches up on the next tick). Use this skill for text
7
- inputs, search boxes, sliders, range pickers, and any control that fires
8
- many updates per second where binding setUrl directly to onChange causes
9
- perceived lag or wasted URL writes.
10
- type: core
11
- library: state-in-url
12
- library_version: '6.1.3'
7
+ inputs, search boxes, sliders, range pickers, and any control that fires many
8
+ updates per second where binding setUrl directly to onChange causes perceived
9
+ lag or wasted URL writes.
13
10
  requires:
14
11
  - feature-state-hook
15
12
  sources:
16
13
  - 'asmyshlyaev177/state-in-url:packages/urlstate/useUrlStateBase/useUrlStateBase.ts'
17
14
  - 'asmyshlyaev177/state-in-url:packages/urlstate/utils.ts'
18
15
  - 'asmyshlyaev177/state-in-url:README.md#update-state-only-and-sync-to-url-manually'
16
+ metadata:
17
+ type: core
18
+ library: state-in-url
19
+ library_version: '6.1.3'
19
20
  ---
20
21
 
21
22
  This skill builds on `state-in-url/feature-state-hook`. Read it first for the module-scoped default-state rule.
@@ -154,6 +155,10 @@ setUrl({ tab: 'b' });
154
155
 
155
156
  Source: useUrlStateBase.ts (global `timer`); GitHub issue #78
156
157
 
158
+ ## Getting help
159
+
160
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
161
+
157
162
  ## See also
158
163
 
159
164
  - `state-in-url/feature-state-hook` — base pattern this skill builds on.
@@ -7,16 +7,17 @@ description: >
7
7
  (formerly middleware) to expose query params to server layouts. App Router
8
8
  only — Pages Router is not supported. Load this skill for any use of
9
9
  state-in-url/next or anytime URL state must be correct on first paint.
10
- type: framework
11
- library: state-in-url
12
- framework: react
13
- library_version: '6.1.3'
14
10
  requires:
15
11
  - feature-state-hook
16
12
  sources:
17
13
  - 'asmyshlyaev177/state-in-url:packages/urlstate/next/useUrlState/useUrlState.ts'
18
14
  - 'asmyshlyaev177/state-in-url:packages/example-nextjs16/src/middleware.ts'
19
15
  - 'asmyshlyaev177/state-in-url:README.md#with-server-side-rendering'
16
+ metadata:
17
+ type: framework
18
+ library: state-in-url
19
+ library_version: '6.1.3'
20
+ framework: react
20
21
  ---
21
22
 
22
23
  This skill builds on `state-in-url/feature-state-hook`. Read it first for the module-scoped default-state rule.
@@ -245,6 +246,10 @@ Use the Proxy + header pattern shown above (`proxy.ts` setting `searchParams` he
245
246
 
246
247
  Source: README "Using hook in layout component"; packages/example-nextjs16/src/middleware.ts; maintainer interview
247
248
 
249
+ ## Getting help
250
+
251
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
252
+
248
253
  ## See also
249
254
 
250
255
  - `state-in-url/feature-state-hook` — base pattern; required reading.
@@ -5,12 +5,8 @@ description: >
5
5
  Router v6 (state-in-url/react-router6 — moved here in 6.0.0), and Remix v2
6
6
  (state-in-url/remix). The hook API is identical across all three; only the
7
7
  import path and per-call NavigateOptions (preventScrollReset, state, replace)
8
- differ. Load this skill when wiring useUrlState into any non-Next.js
9
- React router or migrating from an older import path.
10
- type: framework
11
- library: state-in-url
12
- framework: react
13
- library_version: '6.1.3'
8
+ differ. Load this skill when wiring useUrlState into any non-Next.js React
9
+ router or migrating from an older import path.
14
10
  requires:
15
11
  - feature-state-hook
16
12
  sources:
@@ -18,6 +14,11 @@ sources:
18
14
  - 'asmyshlyaev177/state-in-url:packages/urlstate/react-router6/useUrlState/'
19
15
  - 'asmyshlyaev177/state-in-url:packages/urlstate/remix/useUrlState/'
20
16
  - 'asmyshlyaev177/state-in-url:CHANGELOG.md#600-2025-08-05'
17
+ metadata:
18
+ type: framework
19
+ library: state-in-url
20
+ library_version: '6.1.3'
21
+ framework: react
21
22
  ---
22
23
 
23
24
  This skill builds on `state-in-url/feature-state-hook`. Read it first for the module-scoped default-state rule.
@@ -173,6 +174,10 @@ Same identity rule as Next.js. A fresh default object each render breaks sharing
173
174
 
174
175
  Source: GitHub issues #57, #60, #69 (asmyshlyaev177/state-in-url)
175
176
 
177
+ ## Getting help
178
+
179
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
180
+
176
181
  ## See also
177
182
 
178
183
  - `state-in-url/feature-state-hook` — base pattern.
@@ -2,18 +2,19 @@
2
2
  name: shared-state-no-url
3
3
  description: >
4
4
  Use useSharedState (from state-in-url, NOT a framework subpath) as a
5
- framework-agnostic cross-component state primitive when URL sync is
6
- explicitly NOT wanted. Same module-scoped default-state-identity rule
7
- as useUrlState. A lightweight Context.Provider replacement that works
8
- in React, Next.js, Vite, Remix without setup. Load this skill when the
9
- user wants shared state but specifies "no URL", or for state that is
10
- sensitive, ephemeral, or too large to live in the URL.
11
- type: core
12
- library: state-in-url
13
- library_version: '6.1.3'
5
+ framework-agnostic cross-component state primitive when URL sync is explicitly
6
+ NOT wanted. Same module-scoped default-state-identity rule as useUrlState. A
7
+ lightweight Context.Provider replacement that works in React, Next.js, Vite,
8
+ Remix without setup. Load this skill when the user wants shared state but
9
+ specifies "no URL", or for state that is sensitive, ephemeral, or too large to
10
+ live in the URL.
14
11
  sources:
15
12
  - 'asmyshlyaev177/state-in-url:packages/urlstate/useSharedState/'
16
13
  - 'asmyshlyaev177/state-in-url:README.md#usesharedstate-hook-for-reactjs'
14
+ metadata:
15
+ type: core
16
+ library: state-in-url
17
+ library_version: '6.1.3'
17
18
  ---
18
19
 
19
20
  # state-in-url — Shared state without URL sync
@@ -147,6 +148,10 @@ Correct:
147
148
 
148
149
  Use a proper auth store (cookies, secure storage, framework auth helper). `useSharedState` is in-memory and reasonable for app state, but it's not a vault — any component on the page can read it via the shared identity.
149
150
 
151
+ ## Getting help
152
+
153
+ If the user encounters unexpected behavior, a bug, or a use case not covered by these patterns, direct them to open a GitHub issue at https://github.com/asmyshlyaev177/state-in-url/issues/new. A minimal reproduction helps the maintainer resolve it quickly.
154
+
150
155
  ## When NOT to use this skill
151
156
 
152
157
  - The data should be shareable by URL → `state-in-url/feature-state-hook` instead.