@hachej/boring-ui-kit 0.4.59 → 0.4.60

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.
Files changed (59) hide show
  1. package/package.json +2 -2
  2. package/r/agent-target.json +4 -4
  3. package/r/app-shell.json +10 -10
  4. package/r/board-viewer.json +7 -7
  5. package/r/button.json +2 -2
  6. package/r/data-table.json +1 -1
  7. package/r/diagram-viewer.json +1 -1
  8. package/r/dock.json +1 -1
  9. package/r/documents.json +12 -12
  10. package/r/drawing-viewer.json +2 -2
  11. package/r/empty-state.json +2 -2
  12. package/r/feedback.json +7 -7
  13. package/r/file-tree.json +4 -4
  14. package/r/highlights.json +3 -3
  15. package/r/html-viewer.json +3 -3
  16. package/r/inline-question.json +22 -0
  17. package/r/kpi-stat.json +2 -2
  18. package/r/list-row.json +1 -1
  19. package/r/looks-viewer.json +3 -3
  20. package/r/maquette-viewer.json +3 -3
  21. package/r/markdown-editor.json +4 -4
  22. package/r/mockup-viewer.json +2 -2
  23. package/r/page-header.json +2 -2
  24. package/r/pi-ambient.json +9 -9
  25. package/r/pi-app-kinds.json +10 -10
  26. package/r/pi-app.json +11 -11
  27. package/r/pi-artifacts.json +3 -3
  28. package/r/pi-chat-approval.json +3 -3
  29. package/r/pi-chat-attachments.json +2 -2
  30. package/r/pi-chat-markdown.json +2 -2
  31. package/r/pi-chat-mentions.json +2 -2
  32. package/r/pi-chat-pickers.json +2 -2
  33. package/r/pi-chat-plugins.json +11 -11
  34. package/r/pi-chat-question.json +2 -2
  35. package/r/pi-chat-slash.json +3 -3
  36. package/r/pi-chat-subagent.json +2 -2
  37. package/r/pi-chat-voice.json +4 -4
  38. package/r/pi-chat.json +8 -8
  39. package/r/pi-workspace.json +3 -3
  40. package/r/placed-agent.json +5 -5
  41. package/r/provider-setup.json +2 -2
  42. package/r/record-viewer.json +1 -1
  43. package/r/registry.json +288 -205
  44. package/r/shared-chat.json +7 -7
  45. package/r/space-card.json +22 -0
  46. package/r/spaces.json +2 -2
  47. package/r/status-narrative.json +22 -0
  48. package/r/task-list-viewer.json +2 -2
  49. package/r/theme.json +3 -0
  50. package/r/version-history.json +2 -2
  51. package/r/viewer-code.json +3 -3
  52. package/r/viewer-frame.json +5 -5
  53. package/r/viewer-html.json +5 -5
  54. package/r/viewer-image.json +3 -3
  55. package/r/viewer-markdown.json +6 -6
  56. package/r/viewer-pdf.json +4 -4
  57. package/r/viewers.json +6 -6
  58. package/r/windows.json +2 -2
  59. package/r/wiring-chips.json +22 -0
@@ -4,16 +4,16 @@
4
4
  "title": "Shared chat",
5
5
  "description": "Optional multi-party host log presentation over PiChat's generic composition seams. No agent runtime or speaking policy.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.59",
7
+ "@hachej/boring-ui-kit@^0.4.60",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/pi-chat.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/pi-chat-plugins.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/pi-chat-markdown.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/pi-chat-mentions.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/pi-chat.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/pi-chat-plugins.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/pi-chat-markdown.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/pi-chat-mentions.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
17
17
  ],
18
18
  "files": [
19
19
  {
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "space-card",
4
+ "title": "Space card",
5
+ "description": "One app or space at a glance: working and waiting counts, a Quiet state when both are 0, an unreadable state that is never shown as quiet, an optional last ship. Props only; a button when it can open.",
6
+ "dependencies": [
7
+ "react@^19.0.0"
8
+ ],
9
+ "registryDependencies": [
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "registry/space-card/space-card.tsx",
16
+ "content": "import type { ReactNode } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '../utils/utils';\nimport { MoonIcon, MessageCircleQuestionIcon } from '../_shared/icons';\n\n/** What the space is doing. `'unknown'` means the status could not be read: never shown as quiet. */\nexport type SpaceActivity = { working: number; waiting: number } | 'unknown';\n\nexport type SpaceCardLabels = { working: string; waiting: string; quiet: string; unknown: string; lastShip: string };\n\nexport const spaceCardLabels: SpaceCardLabels = {\n working: 'working', waiting: 'wait on you', quiet: 'Quiet', unknown: 'Status unreadable. Not the same as quiet.', lastShip: 'last ship',\n};\n\nexport type SpaceCardProps = {\n name: string;\n /** A logo or avatar. Defaults to the first letter of the name. */\n leading?: ReactNode;\n activity: SpaceActivity;\n /** When the space last shipped, already formatted (\"2h ago\"). Optional; hidden when unknown. */\n lastShip?: string;\n /** Makes the card a button. */\n onOpen?: () => void;\n labels?: Partial<SpaceCardLabels>;\n className?: string;\n};\n\nconst box = 'flex h-auto min-h-11 w-full min-w-0 flex-col items-stretch justify-start gap-2 rounded-(--radius) px-3 py-3 text-left whitespace-normal';\n\n/** One app or space at a glance: working and waiting counts, Quiet when both are 0, \"unreadable\" when the status could not be read. */\nexport function SpaceCard({ name, leading, activity, lastShip, onOpen, labels, className }: SpaceCardProps) {\n const t = { ...spaceCardLabels, ...labels };\n const unknown = activity === 'unknown';\n const quiet = !unknown && activity.working === 0 && activity.waiting === 0;\n const content = (\n <>\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"flex size-6 shrink-0 items-center justify-center rounded-(--radius) bg-card text-xs font-semibold text-card-foreground\">{leading ?? name.slice(0, 1)}</span>\n <span className=\"truncate text-sm font-medium\">{name}</span>\n </span>\n {unknown ? (\n <span className=\"flex items-start gap-2 text-xs text-muted-foreground\"><MessageCircleQuestionIcon aria-hidden className=\"mt-0.5 size-4 shrink-0\" /><span>{t.unknown}</span></span>\n ) : quiet ? (\n <span className=\"flex items-center gap-2 text-xs text-muted-foreground\"><MoonIcon aria-hidden className=\"size-4 shrink-0\" /><span>{t.quiet}</span></span>\n ) : (\n <span className=\"flex gap-4 text-xs text-muted-foreground\">\n <Count value={activity.working} label={t.working} />\n <Count value={activity.waiting} label={t.waiting} attention={activity.waiting > 0} />\n </span>\n )}\n {lastShip && !unknown ? <span className=\"truncate font-mono text-xs text-muted-foreground\">{t.lastShip} {lastShip}</span> : null}\n </>\n );\n if (onOpen) return <Button variant=\"secondary\" className={cn(box, className)} onClick={onOpen}>{content}</Button>;\n return <div className={cn(box, 'bg-muted', className)}>{content}</div>;\n}\n\nfunction Count({ value, label, attention }: { value: number; label: string; attention?: boolean }) {\n return (\n <span className=\"flex flex-col\">\n <b className={cn('font-mono text-sm tabular-nums', attention ? 'text-warning-soft-foreground' : 'text-foreground')}>{value}</b>\n <span>{label}</span>\n </span>\n );\n}\n",
17
+ "type": "registry:component",
18
+ "target": "components/space-card/space-card.tsx"
19
+ }
20
+ ],
21
+ "type": "registry:component"
22
+ }
package/r/spaces.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "title": "Spaces",
5
5
  "description": "A client for a host's Spaces service: useSpaces, SpaceSwitcher and MembersSheet over a transport the app gives. Membership and roles stay the host's; no route or app wording.",
6
6
  "dependencies": [
7
- "@hachej/boring-files@^0.4.59",
7
+ "@hachej/boring-files@^0.4.60",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
12
12
  ],
13
13
  "files": [
14
14
  {
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "status-narrative",
4
+ "title": "Status narrative",
5
+ "description": "The status paragraph of a home or a chat: text and link parts in order, the time and author underneath, one needs-you count, an optional refresh. Props only: the host fetches, writes the sentences and formats the time.",
6
+ "dependencies": [
7
+ "react@^19.0.0"
8
+ ],
9
+ "registryDependencies": [
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "registry/status-narrative/status-narrative.tsx",
16
+ "content": "'use client';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '../utils/utils';\nimport { RefreshCwIcon } from '../_shared/icons';\n\n/** A link inside the sentence. The host decides what opening it means: an app, a task, or both. */\nexport type StatusLink = { label: string; app?: string; task?: string };\n/** Plain text (code-made or model-made) or a link. */\nexport type StatusSegment = string | StatusLink;\n\nexport type StatusNarrativeLabels = { needsYou: (count: number) => string; refresh: string };\n\nexport const statusNarrativeLabels: StatusNarrativeLabels = {\n needsYou: count => (count === 1 ? '1 needs you' : `${count} need you`),\n refresh: 'Refresh status',\n};\n\nexport type StatusNarrativeProps = {\n /** The paragraph as parts, in order. Strings are shown as is; link parts become buttons that call `onOpen`. */\n segments: readonly StatusSegment[];\n /** When the status was made, already formatted by the host (\"2 min ago\", \"on open\"). The block reads no clock. */\n at?: string;\n /** What wrote it, small, after the text (\"router\", \"meta agent\"). */\n by?: string;\n /** The one number of things waiting on the person: tasks waiting + open gates + critical security alerts. Hidden at 0 or when omitted. */\n needsYou?: number;\n /** A link part was tapped. */\n onOpen?: (link: StatusLink) => void;\n /** Shows a refresh button when given. */\n onRefresh?: () => void;\n labels?: Partial<StatusNarrativeLabels>;\n className?: string;\n};\n\nconst tap = 'min-h-11 md:min-h-6';\n\n/** The status paragraph of a home or a chat: two or three sentences, links inside, the time and the author underneath. Flat, no border. */\nexport function StatusNarrative({ segments, at, by, needsYou, onOpen, onRefresh, labels, className }: StatusNarrativeProps) {\n const t = { ...statusNarrativeLabels, ...labels };\n const waiting = needsYou !== undefined && needsYou > 0;\n return (\n <div className={cn('flex min-w-0 flex-col gap-2 rounded-(--radius) bg-muted p-3 text-sm', className)}>\n <p className=\"min-w-0 break-words\">\n {segments.map((part, index) =>\n typeof part === 'string' ? (\n <span key={index}>{part}</span>\n ) : onOpen ? (\n <Button key={index} variant=\"link\" className=\"inline h-auto align-baseline\" onClick={() => onOpen(part)}>\n {part.label}\n </Button>\n ) : (\n <span key={index} className=\"font-medium\">{part.label}</span>\n ),\n )}\n </p>\n <div className=\"flex min-w-0 items-center gap-2 font-mono text-xs text-muted-foreground\">\n {waiting ? <span className=\"rounded-(--radius) bg-warning-soft px-2 text-warning-soft-foreground\">{t.needsYou(needsYou)}</span> : null}\n {by ? <span className=\"truncate\">{by}</span> : null}\n {at ? <span className=\"truncate\">{at}</span> : null}\n {onRefresh ? (\n <Button variant=\"ghost\" size=\"icon-sm\" className={cn('ml-auto', tap)} aria-label={t.refresh} onClick={onRefresh}>\n <RefreshCwIcon aria-hidden className=\"size-4\" />\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n",
17
+ "type": "registry:component",
18
+ "target": "components/status-narrative/status-narrative.tsx"
19
+ }
20
+ ],
21
+ "type": "registry:component"
22
+ }
@@ -4,8 +4,8 @@
4
4
  "title": "Consumer task-list viewer",
5
5
  "description": "A consumer-defined task-list schema and controller over the shared text buffer, with a restylable borrowed React renderer.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.59",
8
- "@hachej/boring-files@^0.4.59",
7
+ "@hachej/boring-ui-kit@^0.4.60",
8
+ "@hachej/boring-files@^0.4.60",
9
9
  "react@^19.0.0",
10
10
  "react-dom@^19.0.0",
11
11
  "zod@^4.6.5"
package/r/theme.json CHANGED
@@ -3,6 +3,9 @@
3
3
  "name": "theme",
4
4
  "title": "Theme",
5
5
  "description": "Optional default theme tokens and Tailwind v4 bindings: original grey canvas, flat white surface roles, compact type and semantic statuses. Explicit shadcn add overwrites matching host tokens; blocks never install this theme automatically. Font families are declarations only; hosts load the fonts and own primitive geometry and icons.",
6
+ "dependencies": [
7
+ "@fontsource-variable/geist-mono@5.3.0"
8
+ ],
6
9
  "cssVars": {
7
10
  "theme": {
8
11
  "color-background": "var(--background)",
@@ -4,11 +4,11 @@
4
4
  "title": "Version history rows",
5
5
  "description": "Shared view-only version rows and menu metadata with relative time, provenance and Current. No file reads, publication or restoration.",
6
6
  "dependencies": [
7
- "@hachej/boring-files@^0.4.59",
7
+ "@hachej/boring-files@^0.4.60",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/button.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/button.json"
12
12
  ],
13
13
  "files": [
14
14
  {
@@ -7,9 +7,9 @@
7
7
  "react@^19.0.0"
8
8
  ],
9
9
  "registryDependencies": [
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/pi-chat.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/pi-chat.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -4,15 +4,15 @@
4
4
  "title": "Viewer frame",
5
5
  "description": "The standard viewer top bar every viewer draws in (title, status, viewer controls, Refresh, Share, Copy, Download, Open in new tab, Close, overflow menu), its window labels, download, share and media helpers and the sandboxed interactive HTML frame. The viewers' styles live here. Each viewer is its own item (viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code) with a cheap kind module and a view loaded on first open.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.59",
7
+ "@hachej/boring-ui-kit@^0.4.60",
8
8
  "react@^19.0.0",
9
9
  "react-dom@^19.0.0"
10
10
  ],
11
11
  "registryDependencies": [
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/button.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/version-history.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/button.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/version-history.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
16
16
  ],
17
17
  "files": [
18
18
  {
@@ -4,14 +4,14 @@
4
4
  "title": "HTML viewer",
5
5
  "description": "The HTML kind: `htmlKind` (match, loader) and `HtmlPane`, the passive HTML preview (sandboxed when the host opts in) and source editor, in the viewer frame. The pane loads the first time an HTML file opens.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.59",
7
+ "@hachej/boring-ui-kit@^0.4.60",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/button.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/button.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -7,9 +7,9 @@
7
7
  "react@^19.0.0"
8
8
  ],
9
9
  "registryDependencies": [
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -4,7 +4,7 @@
4
4
  "title": "Markdown viewer",
5
5
  "description": "The Markdown kind: `markdownKind` (match, loader) and `MarkdownPane`, the tiptap editor with a formatting toolbar and prose styling over the kit's revisioned Markdown controller, in the viewer frame. The pane and tiptap load the first time a Markdown file opens.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.59",
7
+ "@hachej/boring-ui-kit@^0.4.60",
8
8
  "react@^19.0.0",
9
9
  "marked@^17.0.6",
10
10
  "@tiptap/core@^3.31.4",
@@ -21,11 +21,11 @@
21
21
  "@tiptap/extension-floating-menu@^3.31.4"
22
22
  ],
23
23
  "registryDependencies": [
24
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
25
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/markdown-editor.json",
26
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
27
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/button.json",
28
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
24
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
25
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/markdown-editor.json",
26
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
27
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/button.json",
28
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
29
29
  ],
30
30
  "files": [
31
31
  {
package/r/viewer-pdf.json CHANGED
@@ -4,14 +4,14 @@
4
4
  "title": "PDF viewer",
5
5
  "description": "The PDF kind: `pdfKind` (match, loader) and `PdfPane` in the viewer frame (the browser's viewer, or pdf.js pages where there is none), and LocalFileViewer for browser-only files. The pane loads the first time a PDF opens.",
6
6
  "dependencies": [
7
- "@hachej/boring-files@^0.4.59",
7
+ "@hachej/boring-files@^0.4.60",
8
8
  "react@^19.0.0",
9
9
  "pdfjs-dist@6.5.438"
10
10
  ],
11
11
  "registryDependencies": [
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-image.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-image.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
15
15
  ],
16
16
  "files": [
17
17
  {
package/r/viewers.json CHANGED
@@ -4,12 +4,12 @@
4
4
  "title": "Viewers",
5
5
  "description": "Deprecated aggregate: installs every viewer item (viewer-frame, viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code). Add the items you use instead.",
6
6
  "registryDependencies": [
7
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-frame.json",
8
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-markdown.json",
9
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-html.json",
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-image.json",
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-pdf.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/viewer-code.json"
7
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-frame.json",
8
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-markdown.json",
9
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-html.json",
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-image.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-pdf.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/viewer-code.json"
13
13
  ],
14
14
  "files": [],
15
15
  "type": "registry:component"
package/r/windows.json CHANGED
@@ -8,8 +8,8 @@
8
8
  "react-dom@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/utils.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.59/r/_shared.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "wiring-chips",
4
+ "title": "Wiring chips",
5
+ "description": "What an app is wired to, one small chip each with a state dot (ok, needs attention, not readable); the state is also spoken, not colour alone. Props only.",
6
+ "dependencies": [
7
+ "react@^19.0.0"
8
+ ],
9
+ "registryDependencies": [
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/utils.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.60/r/_shared.json"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "registry/wiring-chips/wiring-chips.tsx",
16
+ "content": "import { cn } from '../utils/utils';\n\n/** ok = working, warn = needs attention (sign-in, error), unknown = could not be read. */\nexport type WiringState = 'ok' | 'warn' | 'unknown';\n/** `state` is required: a host that could not read the state says `'unknown'`, never ok by omission. */\nexport type WiringChip = { label: string; state: WiringState };\n\nexport type WiringChipsProps = {\n chips: readonly WiringChip[];\n /** The state word read by assistive tech (the dot alone is colour). Put the state in the chip text too when it matters to sighted people, as in \"Calendar needs sign-in\". */\n labels?: Partial<Record<WiringState, string>>;\n className?: string;\n};\n\nconst defaults: Record<WiringState, string> = { ok: 'ok', warn: 'needs attention', unknown: 'not readable' };\nconst dot: Record<WiringState, string> = { ok: 'bg-success', warn: 'bg-warning', unknown: 'bg-muted-foreground' };\n\n/** What an app is wired to (domain, repo, channels, connections), one small chip each with a state dot. */\nexport function WiringChips({ chips, labels, className }: WiringChipsProps) {\n const t = { ...defaults, ...labels };\n return (\n <ul className={cn('flex min-w-0 flex-wrap gap-1', className)}>\n {chips.map((chip, index) => {\n const state = chip.state ?? 'unknown'; // a missing state (untyped host) reads as unknown, never ok\n return (\n <li key={index} className=\"flex min-w-0 items-center gap-1 rounded-(--radius) bg-muted px-2 py-1 text-xs\">\n <span aria-hidden className={cn('size-2 shrink-0 rounded-(--radius)', dot[state])} />\n <span className=\"truncate\">{chip.label}</span>\n {state === 'ok' ? null : <span className=\"sr-only\">{t[state]}</span>}\n </li>\n );\n })}\n </ul>\n );\n}\n",
17
+ "type": "registry:component",
18
+ "target": "components/wiring-chips/wiring-chips.tsx"
19
+ }
20
+ ],
21
+ "type": "registry:component"
22
+ }