{"_id":"@aturi.to/waypoints-react","_rev":"5-c211cec50c47d543668da7fe76072d4c","name":"@aturi.to/waypoints-react","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@aturi.to/waypoints-react","version":"0.1.0","keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"author":{"name":"dame.art"},"license":"MIT","_id":"@aturi.to/waypoints-react@0.1.0","maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"homepage":"https://aturi.to","bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"dist":{"shasum":"60985cb345d40efd470c44b85b90dedec8944d4a","tarball":"https://registry.npmjs.org/@aturi.to/waypoints-react/-/waypoints-react-0.1.0.tgz","fileCount":10,"integrity":"sha512-zitgQqhNKG4Qz7wch6RjIfCvDS+Ost8Zb9cjhHGVZN+1g2kIjJNEpsQVuTSOP888CJJY0ZzwHs6MvjVmvkH+iQ==","signatures":[{"sig":"MEQCIAx2D0xTkzLpdb5gFYqidULa1oK/oFou3AU3HHKBuU0JAiBiaQ77mV3cLW/iDZFFV3ZQB2Kd15mWP9L96XVD0yPKvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":486604},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"4b767badcc9afe4136f1837d95d7e8cc5f660c1c","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"atpota.to","email":"contact@atpota.to"},"repository":{"url":"git+https://github.com/atpota-to/aturi.git","type":"git","directory":"packages/waypoints-react"},"_npmVersion":"10.9.4","description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.0","dependencies":{"@aturi.to/waypoints":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19","react-dom":"^19","typescript":"^5.7.2","@types/react":"^19","lucide-react":"^0.562.0","@types/react-dom":"^19"},"peerDependencies":{"react":">=18","react-dom":">=18","lucide-react":">=0.300.0"},"_npmOperationalInternal":{"tmp":"tmp/waypoints-react_0.1.0_1780069028622_0.4302313243443734","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aturi.to/waypoints-react","version":"0.1.1","keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"author":{"name":"atpotato, LLC"},"license":"MIT","_id":"@aturi.to/waypoints-react@0.1.1","maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"homepage":"https://aturi.to","bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"dist":{"shasum":"32fc27db43a9421e5ec1b6d91c7c4fd0068fec9f","tarball":"https://registry.npmjs.org/@aturi.to/waypoints-react/-/waypoints-react-0.1.1.tgz","fileCount":10,"integrity":"sha512-40qrzJaHs0YDCdCLRIApChhUrA9qzYJyif1S0jhoj83TIF2hGIDxNiE4wnKuTejz6GGUlVPA+Lm9mKzED7KsxQ==","signatures":[{"sig":"MEQCIGluaxnvdjZitE6AgRroB+f25vJ3OcwzY7+/+/mshLvEAiAWFMl0p1h/i9rJmj+z7rUZeATgCsPmofywtNZmLFq1JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":486619},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"393bb1d349c938cae2ba334f7f13db4155700f48","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"atpota.to","email":"contact@atpota.to"},"repository":{"url":"git+https://github.com/atpota-to/aturi.git","type":"git","directory":"packages/waypoints-react"},"_npmVersion":"10.9.4","description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.0","dependencies":{"@aturi.to/waypoints":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19","react-dom":"^19","typescript":"^5.7.2","@types/react":"^19","lucide-react":"^0.562.0","@types/react-dom":"^19"},"peerDependencies":{"react":">=18","react-dom":">=18","lucide-react":">=0.300.0"},"_npmOperationalInternal":{"tmp":"tmp/waypoints-react_0.1.1_1780070080636_0.3881383307156945","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aturi.to/waypoints-react","version":"0.1.2","keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"author":{"name":"atpotato, LLC"},"license":"MIT","_id":"@aturi.to/waypoints-react@0.1.2","maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"homepage":"https://aturi.to","bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"dist":{"shasum":"6c75ac7c41752a7c79b22122725cfb3ceb7ebf7d","tarball":"https://registry.npmjs.org/@aturi.to/waypoints-react/-/waypoints-react-0.1.2.tgz","fileCount":10,"integrity":"sha512-7Bkzh/VdHHpD9NRM2LFExEfpJLBcH4E0dPp8DDllE3bCfGBCENFStvkDeUIhMgv8rsCi+B5kEUgmDxY2P3WO/Q==","signatures":[{"sig":"MEUCIAgK7Y7bOJjJBwy4/FAuxDul/2VpUq7yWcGVGFGY0EoIAiEA8KxE/uebkn/iEBXiZQQqDUnpif9v8muF/sHEPFN9oxA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aturi.to%2fwaypoints-react@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":479528},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"2d430754ac664b1fb3b7cecb97322393a2f04a3c","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:972a4ca2-cbbc-44be-ac8b-a8ca1a110ccb"}},"repository":{"url":"git+https://github.com/atpota-to/aturi.git","type":"git","directory":"packages/waypoints-react"},"_npmVersion":"11.19.0","description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.0","dependencies":{"@aturi.to/waypoints":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19","react-dom":"^19","typescript":"^5.7.2","@types/react":"^19","lucide-react":"^0.562.0","@types/react-dom":"^19"},"peerDependencies":{"react":">=18","react-dom":">=18","lucide-react":">=0.300.0"},"_npmOperationalInternal":{"tmp":"tmp/waypoints-react_0.1.2_1786386366049_0.2900916341131583","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aturi.to/waypoints-react","version":"0.1.3","keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"author":{"name":"atpotato, LLC"},"license":"MIT","_id":"@aturi.to/waypoints-react@0.1.3","maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"homepage":"https://aturi.to","bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"dist":{"shasum":"71dd924a640721778041e4b8e779646d01805461","tarball":"https://registry.npmjs.org/@aturi.to/waypoints-react/-/waypoints-react-0.1.3.tgz","fileCount":10,"integrity":"sha512-VMk9clh+2HR2wYvpTrV34UCGdv09E6jAnwX81nns1F5E2b6pcGBmngbhdkHO6BGyWVUHw77lgzorAS5iBhfZxQ==","signatures":[{"sig":"MEQCIENP8zd9u0dDJLumrH2kb4WF1S5c58BGEJT364lHMszvAiB4ylwJEjumt1EUrQenVxiYyZPpO7V1jYs7DVXG5iL5XQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aturi.to%2fwaypoints-react@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":543004},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"feea54c74661778da5cb22c2bb576f8c2b58e74e","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:972a4ca2-cbbc-44be-ac8b-a8ca1a110ccb"}},"repository":{"url":"git+https://github.com/atpota-to/aturi.git","type":"git","directory":"packages/waypoints-react"},"_npmVersion":"11.19.0","description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.0","dependencies":{"@aturi.to/waypoints":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^19","react-dom":"^19","typescript":"^5.7.2","@types/react":"^19","lucide-react":"^0.562.0","@types/react-dom":"^19"},"peerDependencies":{"react":">=18","react-dom":">=18","lucide-react":">=0.300.0"},"_npmOperationalInternal":{"tmp":"tmp/waypoints-react_0.1.3_1787153465271_0.6378906286094121","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aturi.to/waypoints-react","version":"0.1.4","description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","license":"MIT","author":{"name":"atpotato, LLC"},"homepage":"https://aturi.to","repository":{"type":"git","url":"git+https://github.com/atpota-to/aturi.git","directory":"packages/waypoints-react"},"keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"type":"module","sideEffects":["**/*.css"],"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"engines":{"node":">=18"},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"peerDependencies":{"lucide-react":">=0.300.0","react":">=18","react-dom":">=18"},"dependencies":{"@aturi.to/waypoints":"^0.1.0"},"devDependencies":{"@types/react":"^19","@types/react-dom":"^19","lucide-react":"^0.562.0","react":"^19","react-dom":"^19","tsup":"^8.3.5","typescript":"^5.7.2"},"publishConfig":{"access":"public"},"gitHead":"2759b7c1aa1666d8ab6af8da0786d1d5012e125e","_id":"@aturi.to/waypoints-react@0.1.4","bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"_nodeVersion":"22.22.0","_npmVersion":"11.19.1","dist":{"integrity":"sha512-5pHFJ5jLrx1cf+AcK//UOQp7QRBSVSfecXvojg0cI0E7ftEi/UpKbr7RrEuU73O1P5DgJq3mBKA5IwVcLqkgzQ==","shasum":"7adf7e77293da2e68d453168fd54754d8fa30cb8","tarball":"https://registry.npmjs.org/@aturi.to/waypoints-react/-/waypoints-react-0.1.4.tgz","fileCount":10,"unpackedSize":543420,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aturi.to%2fwaypoints-react@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEzhMVm3UZKEfaLaQFdiWcumQsjI6vW8qGlvedSBnGR6AiEAzao8I1dg79w/3HDS3Jw2p21oboqqm+zyx7nfqX7ACyE="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:972a4ca2-cbbc-44be-ac8b-a8ca1a110ccb"}},"directories":{},"maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/waypoints-react_0.1.4_1788889657576_0.40727606581290265"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-29T15:37:08.479Z","modified":"2026-09-08T17:47:38.121Z","0.1.0":"2026-05-29T15:37:08.777Z","0.1.1":"2026-05-29T15:54:40.810Z","0.1.2":"2026-08-10T18:26:06.225Z","0.1.3":"2026-08-19T15:31:05.431Z","0.1.4":"2026-09-08T17:47:37.746Z"},"bugs":{"url":"https://github.com/atpota-to/aturi/issues"},"author":{"name":"atpotato, LLC"},"license":"MIT","homepage":"https://aturi.to","keywords":["atproto","atmosphere","bluesky","react","aturi","waypoints"],"repository":{"type":"git","url":"git+https://github.com/atpota-to/aturi.git","directory":"packages/waypoints-react"},"description":"[Beta] React picker UI + client icons for Aturi's Atmosphere (AT Protocol) waypoint catalog. Headless-first and fully themeable; ships zero CSS by default.","maintainers":[{"name":"atpota.to","email":"contact@atpota.to"}],"readme":"# @aturi.to/waypoints-react\n\nA drop-in React \"Open in…\" picker for the Atmosphere, built on\n[`@aturi.to/waypoints`](../waypoints). Add per-client links, smart recommendations,\nand client icons to your app in a few lines.\n\n**Headless-first**: the components ship **zero CSS** by default and emit stable,\nnamespaced styling hooks. Use your own design system, opt into the polished Aturi\ntheme, or drop down to a hook and render everything yourself.\n\n> **Beta: early release.** This is a `0.x` package that hasn't been\n> thoroughly tested in production yet. Expect rough edges, and possible\n> breaking changes between minor versions while the API settles. Bug reports\n> and feedback are very welcome at\n> [github.com/atpota-to/aturi/issues](https://github.com/atpota-to/aturi/issues).\n\n## Install\n\n```sh\nnpm install @aturi.to/waypoints-react\n# peers (you almost certainly already have react/react-dom):\nnpm install react react-dom lucide-react\n```\n\n`@aturi.to/waypoints-react` re-exports everything from `@aturi.to/waypoints`, so a\nsingle install gives you the components *and* the catalog/resolvers.\n\nAlso mirrored to GitHub Packages as `@atpota-to/waypoints-react` (GitHub only\naccepts a scope matching the repository owner, and it rejects the dot in\n`aturi.to`). Installing from there needs an `.npmrc`, because GitHub Packages\nrequires a token even for public packages:\n\n```sh\n@atpota-to:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}   # PAT with read:packages\n```\n\nThe mirror keeps its dependency on `@aturi.to/waypoints` from npm rather than\npointing at the mirrored core, because the published bundle re-exports that exact\nspecifier. npm resolves it from npmjs with no token involved.\n\n## Server vs. client components\n\nThis is a **client** package: its entry carries the `\"use client\"` directive,\nso the components work out of the box in the Next.js App Router and other React\nServer Components setups (no wrapper needed). Because the directive applies to\nthe whole entry, reach for [`@aturi.to/waypoints`](../waypoints) directly when you\nneed the framework-agnostic helpers (`resolveAtUri`, `buildWaypointsForParsed`,\nthe catalog, …) inside a Server Component.\n\n## Three ways to use it\n\n### 1. Drop-in picker (headless markup, bring your own styles)\n\n```tsx\nimport { WaypointPicker } from '@aturi.to/waypoints-react';\n\n<WaypointPicker\n  type=\"post\"\n  handle=\"alice.bsky.social\"\n  collection=\"app.bsky.feed.post\"\n  rkey=\"3k7qw...\"\n/>;\n```\n\nThis renders clean semantic markup with no CSS attached. Every element carries\nboth a `data-aturi-wp=\"…\"` attribute and an `aturi-wp-*` class so you can style\nit however you like. Map your own classes per slot, or pass `unstyled` to drop\nthe built-in class names entirely:\n\n```tsx\n<WaypointPicker\n  type=\"profile\"\n  handle=\"alice.bsky.social\"\n  unstyled\n  classNames={{\n    button: 'flex items-center gap-3 rounded-lg border p-4 hover:bg-gray-50',\n    name: 'font-semibold',\n    description: 'text-sm text-gray-500',\n  }}\n/>\n```\n\nReplace a row entirely with `renderWaypoint` while still getting the computed\n`url`, `description`, `icon`, and `isRecommended` flag:\n\n```tsx\n<WaypointPicker\n  type=\"post\"\n  handle=\"alice.bsky.social\"\n  collection=\"app.bsky.feed.post\"\n  rkey=\"3k7qw...\"\n  renderWaypoint={({ waypoint }) => (\n    <a href={waypoint.url} className=\"my-row\">\n      {waypoint.icon}\n      {waypoint.name}\n    </a>\n  )}\n/>\n```\n\n### 2. The `useWaypoints` hook (no markup at all)\n\nFor full control, the hook returns render-ready data and `copy` / `open`\nhelpers. Render 100% your own UI:\n\n```tsx\nimport { useWaypoints } from '@aturi.to/waypoints-react';\n\nfunction MyPicker() {\n  const { recommended, categories, waypoints, copy, open } = useWaypoints({\n    type: 'post',\n    handle: 'alice.bsky.social',\n    collection: 'app.bsky.feed.post',\n    rkey: '3k7qw...',\n  });\n\n  return (\n    <ul>\n      {waypoints.map((w) => (\n        <li key={w.id}>\n          {w.icon}\n          <button onClick={() => open(w.url)}>{w.name}</button>\n          <button onClick={() => copy(w.url)}>Copy</button>\n        </li>\n      ))}\n    </ul>\n  );\n}\n```\n\nEach entry carries `{ id, name, label, description, url, icon, category, isRecommended, composeIntent }`.\n\n#### Compose intents\n\n`composeIntent` is a link that opens that client's own composer\n([Bluesky's intent links](https://docs.bsky.app/docs/advanced-guides/intent-links)),\nor `null` when the client has no confirmed route — enough on its own to gate a\n\"post this over there\" button. Pass `composeText` to have the links built for\nyou:\n\n```tsx\nconst { waypoints } = useWaypoints({\n  type: 'post',\n  handle: 'alice.bsky.social',\n  composeText: 'found via my app',\n});\n\n{waypoints\n  .filter((w) => w.composeIntent?.prefillsText)\n  .map((w) => (\n    <button key={w.id} onClick={() => open(w.composeIntent!.url)}>\n      Post in {w.name}\n    </button>\n  ))}\n```\n\nThe `prefillsText` filter matters: one client routes the intent but ignores the\ntext, so without it a share button would open an empty composer. Drop the filter\nwhen you just want to send someone to a composer. Custom waypoints can declare a\n`composeIntent` of their own and they'll surface the same way.\n\n### 3. The polished theme (opt-in)\n\nWant the Aturi look without writing CSS? Import the stylesheet once:\n\n```tsx\nimport '@aturi.to/waypoints-react/styles.css';\nimport { WaypointPicker } from '@aturi.to/waypoints-react';\n```\n\nIt targets the namespaced classes and is fully themeable via CSS custom\nproperties (with light/dark defaults). Recolor or respace by overriding a few\ntokens:\n\n```css\n.aturi-wp {\n  --aturi-wp-accent: #db2777;\n  --aturi-wp-radius: 4px;\n  --aturi-wp-bg: #fffaf5;\n}\n```\n\nAvailable tokens: `--aturi-wp-accent`, `--aturi-wp-accent-contrast`,\n`--aturi-wp-bg`, `--aturi-wp-surface`, `--aturi-wp-surface-hover`,\n`--aturi-wp-border`, `--aturi-wp-text`, `--aturi-wp-text-secondary`,\n`--aturi-wp-text-tertiary`, `--aturi-wp-radius`, `--aturi-wp-gap`,\n`--aturi-wp-pad`, `--aturi-wp-font`.\n\n## `<WaypointPicker>` props\n\n| Prop | Type | Description |\n| --- | --- | --- |\n| `type` | `WaypointType` | `'post' \\| 'profile' \\| 'list' \\| 'record' \\| 'unknown'` |\n| `handle` | `string` | Handle or DID of the target repo |\n| `collection`, `rkey`, `did` | `string?` | Record coordinates / explicit DID |\n| `displayName` | `string?` | Shown in the subtitle; defaults to `@handle` |\n| `waypointIds` | `string[]?` | Allowlist of waypoint ids to surface |\n| `hiddenIds` | `string[]?` | Ids to remove |\n| `customWaypoints` | `CustomWaypoint[]?` | Your own destinations |\n| `composeText` | `string?` | Pre-fills each entry's `composeIntent` link |\n| `showRecommended` | `boolean?` | Default `true` |\n| `showCopy` | `boolean?` | Default `true` |\n| `onSelect` | `(waypoint, event) => void` | Override open-in-new-tab |\n| `unstyled` | `boolean?` | Drop built-in class names |\n| `classNames` | `WaypointClassNames?` | Per-slot class map |\n| `renderWaypoint` | render prop | Replace the row markup |\n| `className` | `string?` | Extra class on the root |\n\n## Universal links\n\nThe picker asks \"where do you want to open this?\". A universal link answers the\nsame question for someone who isn't here yet: an `aturi.to/…` URL you can paste\nanywhere, where the recipient gets a preview and picks their own client. Two\nexports offer one from your UI: a button, and the hook behind it.\n\n`<UniversalLinkButton>` is the whole control. It opens the native share sheet\nin browsers that implement `navigator.share` and copies to the clipboard in the\nones that don't, with the transient \"Copied\" state already wired up:\n\n```tsx\nimport { UniversalLinkButton } from '@aturi.to/waypoints-react';\n\n<UniversalLinkButton target={post.uri} />\n<UniversalLinkButton target=\"https://bsky.app/profile/alice.bsky.social/post/3k7\" mode=\"copy\" />\n```\n\n`target` takes anything that names a record: an AT URI, a handle, a DID, a page\nURL from any client in the catalog. The button renders nothing when it doesn't\nresolve, so it's safe to drop into a row whose data is still loading.\n\n| Prop | Type | Description |\n| --- | --- | --- |\n| `target` | `UniversalLinkTarget` | AT URI, handle, DID, client URL, or `ParsedURI` |\n| `mode` | `'auto' \\| 'copy' \\| 'share'` | Default `'auto'`: share sheet where `navigator.share` exists, clipboard where it doesn't |\n| `label`, `copiedLabel` | `ReactNode?` | Button text; default `Copy link` / `Copied` |\n| `iconOnly` | `boolean?` | Icon only; the label still names the button for assistive tech |\n| `onAction` | `(outcome, link) => void` | `'shared' \\| 'copied' \\| 'dismissed' \\| 'failed' \\| 'copy-failed'` |\n| `origin`, `did`, `preferDid`, `params`, `title`, `text` | | Passed through to `describeUniversalLink` |\n| `resetAfterMs` | `number?` | How long `Copied` shows. Default `2000`; `0` keeps it |\n| `unstyled`, `classNames`, `className` | | Same styling hooks as the picker |\n\n`useUniversalLink` is the same logic without markup:\n\n```tsx\nconst { url, link, copy, copied, share, canShare } = useUniversalLink({\n  target: 'at://alice.bsky.social/app.bsky.feed.post/3k7',\n});\n\n<button onClick={() => (canShare ? share() : copy())}>\n  {copied ? 'Copied' : url}\n</button>\n<button onClick={() => copy(link.snippets.markdown)}>Copy as Markdown</button>\n```\n\n`link` is the full [`describeUniversalLink`](../waypoints/README.md#universal-links)\nresult: label, `navigator.share()` payload, markdown/HTML snippets, oEmbed URL.\n`canShare` is false on the server and on the first client render (it can't be\nread before mount without risking a hydration mismatch), so branch on it for the\nicon, not for whether to render the control.\n\n## Icons\n\nThe per-client SVG components and the `WAYPOINT_ICONS` map are exported too:\n\n```tsx\nimport { WAYPOINT_ICONS, BlueskySVG } from '@aturi.to/waypoints-react';\n```\n\nThe same marks are available as plain SVG strings from\n[`@aturi.to/waypoints/icons`](../waypoints#icons), which is the one to reach for\noutside React or when you need markup rather than a component. Both are\ngenerated from the same catalog.\n\nMarks render at 24x24 and paint in `currentColor`, so they take the colour of\nthe surrounding text and a CSS rule resizes them. Three of them (Lea, Leaflet,\npckt) knock part of the shape out to `var(--bg-primary, white)`, so set\n`--bg-primary` on an ancestor if your surface is not white. `<WaypointButton>`\nalready names itself for assistive tech, but a mark you place yourself does not:\nsee the core package's [styling](../waypoints#styling) and\n[accessibility](../waypoints#accessibility) notes, which apply here unchanged.\n\n## License\n\nMIT © atpotato, LLC.\n","readmeFilename":"README.md"}