{"_id":"@kurajs/ctrlk","_rev":"4-493d2972dcb63aebb0ef8d36176b59b8","name":"@kurajs/ctrlk","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@kurajs/ctrlk","version":"0.0.1","keywords":["kura","june","command-palette","cmdk","ctrl-k","command-menu","search","headless","a11y"],"author":{"name":"Lawrence Lin"},"license":"MIT","_id":"@kurajs/ctrlk@0.0.1","maintainers":[{"name":"linyiru","email":"deduce@gmail.com"}],"homepage":"https://kura.build","bugs":{"url":"https://github.com/kurajs/kura/issues"},"dist":{"shasum":"fd91d404472a45c451ef47714ba7fce83b257aeb","tarball":"https://registry.npmjs.org/@kurajs/ctrlk/-/ctrlk-0.0.1.tgz","fileCount":14,"integrity":"sha512-nB8omba++6nRsMwAiqgedVDEd/0ZAuqpSR+6cNGD79m14N3NQgsU+TqnStUqJmnZTfZbl3Mv/2zLM1h3QnuFpw==","signatures":[{"sig":"MEQCIHR1rWb18HluImOXnaB45paSN0uXIBIezjSOisI6vdxGAiA/TryN6Pnf5jSlFkGrTeXl9HpXD5WLdmCafOCNWp/dlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43189},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"7f2465d75ca106b6be779025ed236b824d826fea","scripts":{"test":"node --experimental-strip-types --test test/*.test.ts","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"linyiru","email":"deduce@gmail.com"},"repository":{"url":"git+https://github.com/kurajs/kura.git","type":"git","directory":"packages/ctrlk"},"_npmVersion":"10.9.7","description":"Kura — ⌘K command palette: a headless, zero-dependency command/search menu with a built-in default renderer. Framework-agnostic (vanilla DOM); mirrors cmdk's model & accessibility without React.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ctrlk_0.0.1_1782258984933_0.9525645542994239","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@kurajs/ctrlk","version":"0.0.2","keywords":["kura","june","command-palette","cmdk","ctrl-k","command-menu","search","headless","a11y"],"author":{"name":"Lawrence Lin"},"license":"MIT","_id":"@kurajs/ctrlk@0.0.2","maintainers":[{"name":"linyiru","email":"deduce@gmail.com"}],"homepage":"https://kura.build","bugs":{"url":"https://github.com/kurajs/kura/issues"},"dist":{"shasum":"1a096ce70da15d1de7844d9519f08e33790c95a6","tarball":"https://registry.npmjs.org/@kurajs/ctrlk/-/ctrlk-0.0.2.tgz","fileCount":14,"integrity":"sha512-w8Bpv/Q6cDXLfXShbJrLp9YT3usqF3qwijdBAuxMX70RvrpD9Y3ZSgPz61gfEJ1B/qLSc8nwHKXTziPSKUPWxA==","signatures":[{"sig":"MEUCICKM7I8TPq/nwbbenZvu5nSHkSUDtiJ/v5XTal5X9NymAiEA1LLjB1jeWGabdXIVvybGwx6Fw18w3qOOUuW9wqz+BNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kurajs%2fctrlk@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":47039},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"587fda38d9e225522de044f097bb48b4b567b40d","scripts":{"test":"node --experimental-strip-types --test test/*.test.ts","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b48a8f15-4057-426c-be1e-597871d6bd5b"}},"repository":{"url":"git+https://github.com/kurajs/kura.git","type":"git","directory":"packages/ctrlk"},"_npmVersion":"11.17.0","description":"Kura — ⌘K command palette: a headless, zero-dependency command/search menu with a built-in default renderer. Framework-agnostic (vanilla DOM); mirrors cmdk's model & accessibility without React.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ctrlk_0.0.2_1782260285184_0.9204335572890714","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@kurajs/ctrlk","version":"0.0.3","keywords":["kura","june","command-palette","cmdk","ctrl-k","command-menu","search","headless","a11y"],"author":{"name":"Lawrence Lin"},"license":"MIT","_id":"@kurajs/ctrlk@0.0.3","maintainers":[{"name":"linyiru","email":"deduce@gmail.com"}],"homepage":"https://kura.build","bugs":{"url":"https://github.com/kurajs/kura/issues"},"dist":{"shasum":"ccbb55865cb47f22566afe73a344449f4ee5411d","tarball":"https://registry.npmjs.org/@kurajs/ctrlk/-/ctrlk-0.0.3.tgz","fileCount":14,"integrity":"sha512-htHoOEETKLrzrze8jrDVOeQmT/5kJXsRPz6aFMsy5oAZeT9fXPbjVUmE525N79B2S+PTla1GnRu4v908j1NcmA==","signatures":[{"sig":"MEUCIQD+VRf9+HH/4bOWNMspw3ksKyOOKjWfdFGYjED+HK/q7gIgG9ZjwxLavFH+3RtRDDNy/mX4dFVKSk9n4xvaZM7Wwik=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kurajs%2fctrlk@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":51874},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f88f69985d0ae191d8f3b93e6e8fd11e2da3d82b","scripts":{"test":"node --experimental-strip-types --test test/*.test.ts","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b48a8f15-4057-426c-be1e-597871d6bd5b"}},"repository":{"url":"git+https://github.com/kurajs/kura.git","type":"git","directory":"packages/ctrlk"},"_npmVersion":"11.18.0","description":"Kura — ⌘K command palette: a headless, zero-dependency command/search menu with a built-in default renderer. Framework-agnostic (vanilla DOM); mirrors cmdk's model & accessibility without React.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^20.10.6","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/ctrlk_0.0.3_1783023970428_0.6061870090010488","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@kurajs/ctrlk","version":"0.1.0","type":"module","description":"Kura — ⌘K command palette: a headless, zero-dependency command/search menu with a built-in default renderer. Framework-agnostic (vanilla DOM); mirrors cmdk's model & accessibility without React.","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","test":"node --experimental-strip-types --test test/*.test.ts"},"keywords":["kura","june","command-palette","cmdk","ctrl-k","command-menu","search","headless","a11y"],"homepage":"https://kura.build","license":"MIT","devDependencies":{"happy-dom":"^20.10.6","typescript":"^5.7.0"},"author":{"name":"Lawrence Lin"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/kurajs/kura.git","directory":"packages/ctrlk"},"gitHead":"ec0e5383d815c1a8b41de92e02f2c56ba20b00de","_id":"@kurajs/ctrlk@0.1.0","bugs":{"url":"https://github.com/kurajs/kura/issues"},"_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-kt/w7W7uw8vQ0zssPwGobl3cxohjImfwVvu7M9gICUS7es6PnI934U8d+Un0a4LkEgeyvrN2D6T3RseFEEB0fw==","shasum":"7f5f843da3070f1f1b47623e498bedbdaed1afbd","tarball":"https://registry.npmjs.org/@kurajs/ctrlk/-/ctrlk-0.1.0.tgz","fileCount":14,"unpackedSize":51874,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@kurajs%2fctrlk@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDKMfAMxhQ1fcxOjSCkttG0CLzQ43zqx5geR1Ffuxy4mAiBLd9JGtVPb5A7mwp6BDBUZSsT0Px6qB92dunx+xZFJeg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b48a8f15-4057-426c-be1e-597871d6bd5b"}},"directories":{},"maintainers":[{"name":"linyiru","email":"deduce@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ctrlk_0.1.0_1783663187218_0.4590951046151366"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-23T23:56:24.733Z","modified":"2026-07-10T05:59:47.627Z","0.0.1":"2026-06-23T23:56:25.083Z","0.0.2":"2026-06-24T00:18:05.329Z","0.0.3":"2026-07-02T20:26:10.591Z","0.1.0":"2026-07-10T05:59:47.370Z"},"bugs":{"url":"https://github.com/kurajs/kura/issues"},"author":{"name":"Lawrence Lin"},"license":"MIT","homepage":"https://kura.build","keywords":["kura","june","command-palette","cmdk","ctrl-k","command-menu","search","headless","a11y"],"repository":{"type":"git","url":"git+https://github.com/kurajs/kura.git","directory":"packages/ctrlk"},"description":"Kura — ⌘K command palette: a headless, zero-dependency command/search menu with a built-in default renderer. Framework-agnostic (vanilla DOM); mirrors cmdk's model & accessibility without React.","maintainers":[{"name":"linyiru","email":"deduce@gmail.com"}],"readme":"# @kurajs/ctrlk\n\nA headless, **zero-dependency** ⌘K command palette with a built-in default renderer.\nVanilla DOM — no React, no Preact, nothing. It mirrors [cmdk](https://cmdk.paco.me)'s\nmodel and accessibility (dialog + combobox/listbox/option, `aria-activedescendant`,\nfull keyboard) so it drops into any stack — including server-rendered sites with no\nclient framework — and ships zero runtime bytes beyond itself.\n\n## Batteries-included\n\n```ts\nimport { createCtrlk, mountCtrlk } from \"@kurajs/ctrlk\";\n\nconst ctrl = createCtrlk({\n  // Async source: called (debounced, abortable) on every keystroke.\n  search: async (query, signal) => {\n    const res = await fetch(`/search.json?q=${encodeURIComponent(query)}`, { signal });\n    const { hits } = await res.json();\n    return hits.map((h) => ({\n      id: h.slug + \"#\" + h.headingId,\n      title: h.heading ?? h.title,\n      description: `${h.section} › ${h.title}`, // breadcrumb path\n      excerpt: h.text,\n      group: h.section,\n      icon: h.headingId ? \"hash\" : \"page\",\n      href: `/docs/${h.slug}` + (h.headingId ? `#${h.headingId}` : \"\"),\n    }));\n  },\n});\n\nmountCtrlk(ctrl, {\n  trigger: \".search-box\",            // clicking this opens the palette\n  tokensOf: (s) => s.query.split(/\\s+/), // or the engine's matched terms, for exact highlight\n});\n// ⌘K / Ctrl+K and \"/\" now open it; ↑/↓ navigate, Enter opens, Esc closes.\n```\n\n## Static command list\n\nOmit `search` and pass `items` to get cmdk-style local fuzzy filtering:\n\n```ts\nconst ctrl = createCtrlk({\n  items: [\n    { id: \"new\", title: \"New file\", group: \"Actions\", keywords: [\"create\"] },\n    { id: \"theme\", title: \"Toggle theme\", group: \"Actions\" },\n  ],\n  onSelect: (item) => run(item.id),\n});\nmountCtrlk(ctrl);\n```\n\n## Headless\n\n`createCtrlk` is the whole state machine (no DOM): `open/close/toggle`, `setQuery`,\n`move`/`setActive`, `select`, and `subscribe`. Drive your own renderer from `getState()`,\nor render with your framework of choice — `mountCtrlk` is just the default one.\n\n```ts\nconst ctrl = createCtrlk({ items });\nconst stop = ctrl.subscribe((state) => paint(state)); // { open, query, loading, items, groups, activeIndex, error }\n```\n\n## Theming\n\nThe default renderer is styled entirely through `--ctrlk-*` CSS variables (light/dark\nout of the box). Theme it by setting them on `.ctrlk-overlay` — e.g. to inherit a host's\ntokens: `.ctrlk-overlay { --ctrlk-accent: var(--accent); --ctrlk-bg: var(--surface); }`.\nPass `renderItem` to fully control row markup, or `injectStyles: false` to ship your own.\n\n## API\n\n- `createCtrlk(options) → Ctrlk` — headless controller. Options: `search` | `items` + `filter`,\n  `debounce`, `empty`, `loop` (wrap arrow nav, default true), `shouldFilter` (static mode, default\n  true), `value` (initial highlight), `onSelect`, `onValueChange`, `onOpenChange`.\n  Controller methods: `open`/`close`/`toggle`, `setQuery`, `move`/`setActive`, `setValue` (by id),\n  `setItems` (swap the static pool), `select`, `subscribe`, `getState`, `destroy`. State exposes a\n  cmdk-style `value` (the active item id) alongside `activeIndex`.\n- `mountCtrlk(ctrl, opts) → { destroy }` — default DOM. Opts: `trigger`, `hotkey`, `labels`,\n  `tokensOf`, `renderItem`, `injectStyles`, `platform`, `ariaLabel`, `target`.\n- `platformHotkeyLabel()` → `\"⌘K\"` on macOS, `\"Ctrl K\"` elsewhere (for a trigger hint).\n- `highlight(text, tokens)` → segments for custom renderers.\n\nZero dependencies. Runs on Node, Bun, Deno, Cloudflare Workers (core), and every browser.\n","readmeFilename":"README.md"}