Title: [Feature]: Promote `storybook` to Stable — settle the helper surface · Issue #148 · bQuery/bQuery · GitHub
Open Graph Title: [Feature]: Promote `storybook` to Stable — settle the helper surface · Issue #148 · bQuery/bQuery
X Title: [Feature]: Promote `storybook` to Stable — settle the helper surface · Issue #148 · bQuery/bQuery
Description: Pre-flight checklist I searched existing issues and did not find a duplicate request. I explained the problem or use case, not just the desired API. Problem or use case storybook is Beta (it's not in the issue form's area dropdown, so th...
Open Graph Description: Pre-flight checklist I searched existing issues and did not find a duplicate request. I explained the problem or use case, not just the desired API. Problem or use case storybook is Beta (it's not ...
X Description: Pre-flight checklist I searched existing issues and did not find a duplicate request. I explained the problem or use case, not just the desired API. Problem or use case storybook is Beta (it's ...
Opengraph URL: https://github.com/bQuery/bQuery/issues/148
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Feature]: Promote `storybook` to Stable — settle the helper surface","articleBody":"**Pre-flight checklist**\n- [x] I searched existing issues and did not find a duplicate request.\n- [x] I explained the problem or use case, not just the desired API.\n\n**Problem or use case**\n`storybook` is **Beta** (it's not in the issue form's area dropdown, so this is filed under \"other\"). It's a helper-only entry point — `storyHtml`, `when`, plus the 1.14.0 additions `classMap`, `styleMap`, `ifDefined`, `repeat`, and `unsafeHtml` — and those template helpers are one minor old. Teams writing stories against these helpers need a frozen surface, and `unsafeHtml` in particular needs its security contract pinned down given bQuery's secure-by-default stance.\n\n**Proposed solution**\nFreeze the `storybook` helper API for one cycle, document each helper (especially the safety boundary of `unsafeHtml` and how it interacts with the security module's sanitizer), and add coverage for the template helpers' output. Exit criteria: frozen surface, documented helpers with `unsafeHtml` security guidance, tested rendering output.\n\n**Possible API or UX shape**\n```ts\nimport { storyHtml, classMap, ifDefined, repeat } from \"@bquery/bquery/storybook\";\n\nexport const Default = storyHtml`\n \u003cmy-card class=${classMap({ active: true })} title=${ifDefined(title)}\u003e\n ${repeat(items, i =\u003e i.id, i =\u003e storyHtml`\u003cli\u003e${i.label}\u003c/li\u003e`)}\n \u003c/my-card\u003e\n`;\n```\n\n**Alternatives considered**\nLeaving it Beta as a \"minor helper module\" — but it's part of the stated road-to-stable for all modules, and its `unsafeHtml` helper has a security dimension that warrants a pinned contract. Folding it into `testing` — different purpose (authoring stories vs. assertions), so keep it separate.\n\n**Relevant area**\n`other`\n\n**Additional context**\nFiled as `other` because `storybook` is absent from the area dropdown — flag to maintainers whether the dropdown should add a `storybook` option. The `unsafeHtml` boundary should be defined in terms of the existing security/sanitizer module.\n","author":{"url":"https://github.com/JosunLP","@type":"Person","name":"JosunLP"},"datePublished":"2026-06-26T21:25:56.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/148/bQuery/issues/148"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:d4045e10-e9d3-edc1-bc66-6bebf8b3c463 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C16C:A825:1070628:17EB0E5:6A4E34E3 |
| html-safe-nonce | e4175ea898372bff462a3cfc6a5e0817582b9bd7d8c99795434a9783a65a18e4 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMTZDOkE4MjU6MTA3MDYyODoxN0VCMEU1OjZBNEUzNEUzIiwidmlzaXRvcl9pZCI6IjE0MTEwNTEyNjU2NzMwMTY1NDciLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | bf017834c36df0922200410ad3474e2f5fc5994d7c78fdb12d6a7cb9b42d7af1 |
| hovercard-subject-tag | issue:4755240448 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/bQuery/bQuery/148/issue_layout |
| twitter:image | https://opengraph.githubassets.com/149ded4055e318fc5e838e47f833ae7a47b96ffc77df8a2b26e6ebd064e8cb9d/bQuery/bQuery/issues/148 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/149ded4055e318fc5e838e47f833ae7a47b96ffc77df8a2b26e6ebd064e8cb9d/bQuery/bQuery/issues/148 |
| og:image:alt | Pre-flight checklist I searched existing issues and did not find a duplicate request. I explained the problem or use case, not just the desired API. Problem or use case storybook is Beta (it's not ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | JosunLP |
| hostname | github.com |
| expected-hostname | github.com |
| None | 030096ee0db095447bfe77409d33bfac127ca7128299c58deef27c52eaa1b1f0 |
| turbo-cache-control | no-preview |
| go-import | github.com/bQuery/bQuery git https://github.com/bQuery/bQuery.git |
| octolytics-dimension-user_id | 256381806 |
| octolytics-dimension-user_login | bQuery |
| octolytics-dimension-repository_id | 1139284244 |
| octolytics-dimension-repository_nwo | bQuery/bQuery |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1139284244 |
| octolytics-dimension-repository_network_root_nwo | bQuery/bQuery |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 42a6d378d7587a44c93aca255096cd66b7c8eb2d |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width