@hachej/boring-ui-kit 0.4.2 → 0.4.3

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/r/registry.json CHANGED
@@ -133,7 +133,7 @@
133
133
  "lucide-react@^1.51.0"
134
134
  ],
135
135
  "registryDependencies": [
136
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
136
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
137
137
  "dropdown-menu",
138
138
  "button",
139
139
  "toggle",
@@ -161,8 +161,8 @@
161
161
  "title": "Markdown editor",
162
162
  "description": "A host-owned styled wrapper over the concrete borrowed Markdown controller.",
163
163
  "dependencies": [
164
- "@hachej/boring-ui-kit@^0.4.2",
165
- "@hachej/boring-files@^0.4.2",
164
+ "@hachej/boring-ui-kit@^0.4.3",
165
+ "@hachej/boring-files@^0.4.3",
166
166
  "react@^19.0.0",
167
167
  "react-dom@^19.0.0",
168
168
  "marked@^17.0.6",
@@ -317,7 +317,7 @@
317
317
  },
318
318
  "docs": "Create and own a MarkdownController from @hachej/boring-ui-kit/markdown. Pass it to MarkdownEditor. The wrapper does not acquire resources or dispose the controller. Check the repository release notes for available npm versions; local tarball tests do not establish registry availability.",
319
319
  "registryDependencies": [
320
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json"
320
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json"
321
321
  ]
322
322
  },
323
323
  {
@@ -326,8 +326,8 @@
326
326
  "title": "HTML source and passive preview",
327
327
  "description": "Exact HTML source editing with a reconstructed passive preview and borrowed controller. Browser security qualification remains separate.",
328
328
  "dependencies": [
329
- "@hachej/boring-ui-kit@^0.4.2",
330
- "@hachej/boring-files@^0.4.2",
329
+ "@hachej/boring-ui-kit@^0.4.3",
330
+ "@hachej/boring-files@^0.4.3",
331
331
  "react@^19.0.0",
332
332
  "react-dom@^19.0.0"
333
333
  ],
@@ -375,7 +375,7 @@
375
375
  }
376
376
  },
377
377
  "registryDependencies": [
378
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json"
378
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json"
379
379
  ]
380
380
  },
381
381
  {
@@ -384,8 +384,8 @@
384
384
  "title": "Pi chat",
385
385
  "description": "A complete Tailwind chat over the borrowed native chat controller: composer, messages, one collapsible activity block per turn (tool calls and reasoning), message queue, history, a human-in-the-loop question card, an Approve / Deny card for host tools wrapped with requireApproval optional artifact cards that open generated content in the host's panel, and feedback cards for the opt-in feedback tool (lists, and Show offers that the host page resolves). Chat only: no layout. Owned, editable source; no AI SDK. The optional pi-ambient and pi-workspace blocks build on it.",
386
386
  "dependencies": [
387
- "@hachej/boring-ui-kit@^0.4.2",
388
- "@hachej/boring-files@^0.4.2",
387
+ "@hachej/boring-ui-kit@^0.4.3",
388
+ "@hachej/boring-files@^0.4.3",
389
389
  "react@^19.0.0",
390
390
  "react-dom@^19.0.0",
391
391
  "marked@^17.0.6",
@@ -399,8 +399,8 @@
399
399
  "@shadcn/react@0.3.1"
400
400
  ],
401
401
  "registryDependencies": [
402
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
403
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
402
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
403
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
404
404
  "trace",
405
405
  "message",
406
406
  "message-scroller",
@@ -652,7 +652,7 @@
652
652
  "title": "Pi ambient agent",
653
653
  "description": "AmbientChat, a compact floating agent bar that grows into a chat window over an existing page, and AgentNotifications, toasts for finished, failed and waiting tasks (with the one guarded browser Notification helper). A block over the pi-chat item; its in-window artifact panel uses the pi-workspace layout.",
654
654
  "dependencies": [
655
- "@hachej/boring-ui-kit@^0.4.2",
655
+ "@hachej/boring-ui-kit@^0.4.3",
656
656
  "react@^19.0.0",
657
657
  "react-dom@^19.0.0",
658
658
  "@earendil-works/pi-durable@~1.2.0",
@@ -660,11 +660,11 @@
660
660
  "lucide-react@^1.51.0"
661
661
  ],
662
662
  "registryDependencies": [
663
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
664
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
665
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-workspace.json",
666
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
667
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
663
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
664
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
665
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-workspace.json",
666
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
667
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
668
668
  "message-scroller",
669
669
  "button",
670
670
  "toggle",
@@ -700,7 +700,7 @@
700
700
  "react@^19.0.0"
701
701
  ],
702
702
  "registryDependencies": [
703
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json"
703
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json"
704
704
  ],
705
705
  "files": [
706
706
  {
@@ -720,10 +720,10 @@
720
720
  "react-dom@^19.0.0"
721
721
  ],
722
722
  "registryDependencies": [
723
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
724
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
725
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
726
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/dock.json",
723
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
724
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
725
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
726
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/dock.json",
727
727
  "badge",
728
728
  "card"
729
729
  ],
@@ -740,17 +740,95 @@
740
740
  }
741
741
  ]
742
742
  },
743
+ {
744
+ "name": "mockup-viewer",
745
+ "type": "registry:block",
746
+ "title": "HTML mock-up viewer",
747
+ "description": "Sandboxed *.mockup.html artifacts with host theme variables, lazy Tailwind compilation and feedback point comments. Host presentation only; artifact scripts run in an opaque-origin InteractiveFrame, never in the host.",
748
+ "dependencies": [
749
+ "react@^19.0.0",
750
+ "lucide-react@^1.51.0",
751
+ "tailwindcss@4.3.3",
752
+ "zod@^4.6.5"
753
+ ],
754
+ "registryDependencies": [
755
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/viewers.json",
756
+ "badge",
757
+ "toggle",
758
+ "tooltip"
759
+ ],
760
+ "files": [
761
+ {
762
+ "path": "registry/mockup-viewer/mockup-viewer.tsx",
763
+ "type": "registry:component",
764
+ "target": "components/mockup-viewer/mockup-viewer.tsx"
765
+ },
766
+ {
767
+ "path": "registry/mockup-viewer/mockup-frame.ts",
768
+ "type": "registry:lib",
769
+ "target": "components/mockup-viewer/mockup-frame.ts"
770
+ },
771
+ {
772
+ "path": "registry/mockup-viewer/mockup-compile.ts",
773
+ "type": "registry:lib",
774
+ "target": "components/mockup-viewer/mockup-compile.ts"
775
+ },
776
+ {
777
+ "path": "registry/mockup-viewer/mockup-tailwind.ts",
778
+ "type": "registry:lib",
779
+ "target": "components/mockup-viewer/mockup-tailwind.ts"
780
+ }
781
+ ]
782
+ },
783
+ {
784
+ "name": "diagram-viewer",
785
+ "type": "registry:component",
786
+ "title": "Diagram viewer",
787
+ "description": "DiagramViewer, DiagramView and diagramKind: an agent's *.diagram.json (format v1, versioned: nodes, edges, optional groups, highlighted path and note) as boxes and numbered arrows with a legend that says what happens and who acts. Layers run left to right while they fit and top to bottom on a phone, scrolling inside their own box; no layout library. A superset of a maquette's workflow, which the maquette viewer draws with DiagramView. The pi-app artifact panel shows .diagram.json files with it by default; app artifactKinds win.",
788
+ "dependencies": [
789
+ "react@^19.0.0",
790
+ "lucide-react@^1.51.0"
791
+ ],
792
+ "registryDependencies": [
793
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
794
+ "alert",
795
+ "badge"
796
+ ],
797
+ "files": [
798
+ {
799
+ "path": "registry/diagram-viewer/diagram.ts",
800
+ "type": "registry:lib",
801
+ "target": "components/diagram-viewer/diagram.ts"
802
+ },
803
+ {
804
+ "path": "registry/diagram-viewer/diagram-labels.ts",
805
+ "type": "registry:lib",
806
+ "target": "components/diagram-viewer/diagram-labels.ts"
807
+ },
808
+ {
809
+ "path": "registry/diagram-viewer/diagram-view.tsx",
810
+ "type": "registry:component",
811
+ "target": "components/diagram-viewer/diagram-view.tsx"
812
+ },
813
+ {
814
+ "path": "registry/diagram-viewer/diagram-viewer.tsx",
815
+ "type": "registry:component",
816
+ "target": "components/diagram-viewer/diagram-viewer.tsx"
817
+ }
818
+ ]
819
+ },
743
820
  {
744
821
  "name": "maquette-viewer",
745
822
  "type": "registry:component",
746
823
  "title": "Maquette viewer",
747
- "description": "MaquetteViewer and maquetteKind: a PM agent's *.maquette.json mock-up (format v1, versioned) one screen at a time, drawn from the host's shadcn components, under one thin icon bar: Back, previous and next (also arrow keys and swipe), and a menu with guided tours and How it works (the workflow diagram in a dialog). Optional phone or desktop frame and #screen=<id> deep links. The pi-app artifact panel shows .maquette.json files with it by default; app artifactKinds win.",
824
+ "description": "MaquetteViewer and maquetteKind: a PM agent's *.maquette.json mock-up (format v1, versioned) one screen at a time, drawn from the host's shadcn components, under one thin icon bar: Back, previous and next (also arrow keys and swipe), an optional comment icon (point mode of the feedback item: a note pinned on a block names the maquette path, screen id and block id) and a menu with guided tours and How it works (the workflow, inline or a linked *.diagram.json, drawn by the diagram-viewer item in a dialog). Optional phone or desktop frame and #screen=<id> deep links. The pi-app artifact panel shows .maquette.json files with it by default; app artifactKinds win.",
748
825
  "dependencies": [
749
826
  "react@^19.0.0",
750
827
  "lucide-react@^1.51.0"
751
828
  ],
752
829
  "registryDependencies": [
753
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
830
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
831
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/diagram-viewer.json",
754
832
  "alert",
755
833
  "badge",
756
834
  "bubble",
@@ -765,7 +843,9 @@
765
843
  "table",
766
844
  "dialog",
767
845
  "dropdown-menu",
768
- "popover"
846
+ "popover",
847
+ "toggle",
848
+ "tooltip"
769
849
  ],
770
850
  "files": [
771
851
  {
@@ -783,11 +863,6 @@
783
863
  "type": "registry:component",
784
864
  "target": "components/maquette-viewer/maquette-blocks.tsx"
785
865
  },
786
- {
787
- "path": "registry/maquette-viewer/maquette-diagram.tsx",
788
- "type": "registry:component",
789
- "target": "components/maquette-viewer/maquette-diagram.tsx"
790
- },
791
866
  {
792
867
  "path": "registry/maquette-viewer/maquette-viewer.tsx",
793
868
  "type": "registry:component",
@@ -824,29 +899,75 @@
824
899
  }
825
900
  }
826
901
  },
902
+ {
903
+ "name": "board-viewer",
904
+ "type": "registry:block",
905
+ "title": "Board viewer",
906
+ "description": "A board@1 artifact kind for *.board.json. Lazy native tldraw projection of maquette screens, sandboxed HTML mock-ups, goto arrows and notes. Conditional board-file autosave; phone viewing without accidental frame edits. Hosts supply their resource client, asset URLs and license key.",
907
+ "dependencies": [
908
+ "@hachej/boring-ui-kit@^0.4.3",
909
+ "@hachej/boring-files@^0.4.3",
910
+ "react@^19.0.0",
911
+ "lucide-react@1.51.0",
912
+ "tldraw@5.5.2"
913
+ ],
914
+ "registryDependencies": [
915
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/maquette-viewer.json",
916
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/mockup-viewer.json",
917
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
918
+ "button",
919
+ "alert",
920
+ "card",
921
+ "tooltip"
922
+ ],
923
+ "files": [
924
+ {
925
+ "path": "registry/board-viewer/board.ts",
926
+ "type": "registry:lib",
927
+ "target": "components/board-viewer/board.ts"
928
+ },
929
+ {
930
+ "path": "registry/board-viewer/board-viewer.tsx",
931
+ "type": "registry:component",
932
+ "target": "components/board-viewer/board-viewer.tsx"
933
+ },
934
+ {
935
+ "path": "registry/board-viewer/board-canvas.tsx",
936
+ "type": "registry:component",
937
+ "target": "components/board-viewer/board-canvas.tsx"
938
+ },
939
+ {
940
+ "path": "registry/board-viewer/board-props.ts",
941
+ "type": "registry:lib",
942
+ "target": "components/board-viewer/board-props.ts"
943
+ }
944
+ ]
945
+ },
827
946
  {
828
947
  "name": "pi-app",
829
948
  "type": "registry:block",
830
949
  "title": "Pi agent app",
831
950
  "description": "AgentWorkspace: a whole agent page in one component. Left: the sessions pane (search, New, rename, archive, delete; collapsible, a drawer on a narrow screen). Center: PiChat. Right: the artifact viewers (artifact panel with versions, file viewer, auto-open of new artifacts) in the ArtifactWorkspace panel, a full-screen sheet on a phone. layout=\"embedded\" drops the left column for one compact top bar (title, History, Library, New) that joins an app-shell screen header. Props are data and callbacks; hooks for the conversations handler (useConversations), the chat transport (useRemoteChat) and saved resources (useSaved).",
832
951
  "dependencies": [
833
- "@hachej/boring-ui-kit@^0.4.2",
834
- "@hachej/boring-files@^0.4.2",
952
+ "@hachej/boring-ui-kit@^0.4.3",
953
+ "@hachej/boring-files@^0.4.3",
835
954
  "react@^19.0.0",
836
955
  "react-dom@^19.0.0",
837
956
  "lucide-react@^1.51.0"
838
957
  ],
839
958
  "registryDependencies": [
840
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
841
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
842
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-workspace.json",
843
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/viewers.json",
844
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/maquette-viewer.json",
845
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
846
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
959
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
960
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
961
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-workspace.json",
962
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/viewers.json",
963
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/maquette-viewer.json",
964
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/diagram-viewer.json",
965
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/mockup-viewer.json",
966
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
967
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
847
968
  "drawer",
848
969
  "button",
849
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/file-tree.json",
970
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/file-tree.json",
850
971
  "dropdown-menu",
851
972
  "scroll-area",
852
973
  "separator",
@@ -933,19 +1054,19 @@
933
1054
  "title": "App shell: layouts, list/detail and agent layer",
934
1055
  "description": "AppShell with three layouts. B \"workspace\" puts a ListDetail on a screen (phone: the list, then the detail as a stack step with Back; wide: a 20rem list and the detail side by side, sidebar as an icon rail). C \"chat\" wraps the app's own AgentWorkspace (untouched, passed as the nav item's render; install the pi-app item yourself) in the same sidebar, account menu and header; it takes no shell agent. A \"screen\": one screen at a time, every screen kept mounted. On a phone bottom tabs (at most four; more give three plus a « Plus » sheet) and an avatar button that opens the account sheet; on a wide screen the shadcn sidebar (icon rail, NavUser). One header per screen through useScreenHeader (title, subtitle, back, up to two actions, the rest behind « … »). The account menu holds « Améliorer l'app » (the improve agent), the app's own entries and sign out. AppSheet is the one bottom sheet (one open at a time, Back closes it). It mounts the AgentLayer: one agent's PiChat above the app (phone: a drawer with peek, half and full snap points; wide: a right panel), the improve agent in the same layer, optional push-to-talk and point mode. Also useAgentContext and readAgentContext (the screen on show travels as `context` with each submit) and useBackLayer, the one Back manager. Built on explicitly pinned Base UI drawer and dropdown-menu recipes, plus the sidebar and avatar of the host's own shadcn style.",
935
1056
  "dependencies": [
936
- "@hachej/boring-feedback@^0.4.2",
937
- "@hachej/boring-ui-kit@^0.4.2",
1057
+ "@hachej/boring-feedback@^0.4.3",
1058
+ "@hachej/boring-ui-kit@^0.4.3",
938
1059
  "@base-ui/react@^1.9.0",
939
1060
  "react@^19.0.0",
940
1061
  "react-dom@^19.0.0",
941
1062
  "lucide-react@^1.51.0"
942
1063
  ],
943
1064
  "registryDependencies": [
944
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
945
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/dock.json",
946
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/feedback.json",
947
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
948
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
1065
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
1066
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/dock.json",
1067
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/feedback.json",
1068
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
1069
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
949
1070
  "drawer",
950
1071
  "sidebar",
951
1072
  "avatar",
@@ -1070,8 +1191,8 @@
1070
1191
  "title": "Viewers",
1071
1192
  "description": "The standard viewer top bar (title, status, viewer controls, Refresh, Share, Copy, Download, Open in new tab, Close, overflow menu) with Tailwind panes over it: the Markdown editor with a formatting toolbar and prose styling, the passive HTML preview and source editor, an image viewer with zoom and pan, and a PDF viewer. Owned, editable source over the borrowed controllers; no AI SDK.",
1072
1193
  "dependencies": [
1073
- "@hachej/boring-ui-kit@^0.4.2",
1074
- "@hachej/boring-files@^0.4.2",
1194
+ "@hachej/boring-ui-kit@^0.4.3",
1195
+ "@hachej/boring-files@^0.4.3",
1075
1196
  "react@^19.0.0",
1076
1197
  "react-dom@^19.0.0",
1077
1198
  "marked@^17.0.6",
@@ -1091,12 +1212,12 @@
1091
1212
  "pdfjs-dist@6.3.289"
1092
1213
  ],
1093
1214
  "registryDependencies": [
1094
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
1095
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
1096
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
1215
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
1216
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
1217
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
1097
1218
  "button",
1098
1219
  "toggle",
1099
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/version-history.json",
1220
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/version-history.json",
1100
1221
  "toggle-group",
1101
1222
  "dialog",
1102
1223
  "textarea",
@@ -1533,8 +1654,8 @@
1533
1654
  "lucide-react@^1.51.0"
1534
1655
  ],
1535
1656
  "registryDependencies": [
1536
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
1537
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
1657
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
1658
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
1538
1659
  "button",
1539
1660
  "input",
1540
1661
  "label",
@@ -1555,9 +1676,9 @@
1555
1676
  "title": "Feedback",
1556
1677
  "description": "Feedback from the chat composer: one Feedback button starts feedback mode on the application page (hover, click to pin a numbered note, hold ⌥ to use the app, optional voice), and one chip carries the notes to the next message. FeedbackBar, NoteBubble, FeedbackChip with its review, useComposerFeedback for the pi-chat composer, and PickerOverlay styles. Optional, not mounted by default: PointButton, AnnotateSheet, FeedbackList and FeedbackReport. Picking, masking, anchoring and placement stay in @hachej/boring-feedback/page and /ui, so restyling cannot weaken them.",
1557
1678
  "dependencies": [
1558
- "@hachej/boring-feedback@^0.4.2",
1559
- "@hachej/boring-ui-kit@^0.4.2",
1560
- "@hachej/boring-files@^0.4.2",
1679
+ "@hachej/boring-feedback@^0.4.3",
1680
+ "@hachej/boring-ui-kit@^0.4.3",
1681
+ "@hachej/boring-files@^0.4.3",
1561
1682
  "react@^19.0.0",
1562
1683
  "react-dom@^19.0.0",
1563
1684
  "lucide-react@^1.51.0"
@@ -2055,8 +2176,8 @@
2055
2176
  }
2056
2177
  },
2057
2178
  "registryDependencies": [
2058
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
2059
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
2179
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
2180
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
2060
2181
  "button",
2061
2182
  "toggle",
2062
2183
  "badge",
@@ -2071,7 +2192,7 @@
2071
2192
  "title": "Feedback preview",
2072
2193
  "description": "PreviewBanner: a live, reversible preview of a change in the page (Approve / Discard) over `@hachej/boring-feedback/preview`, whose subagent calls models through a host gateway. Separate from `feedback` so annotation-only apps do not install the model SDK; install `feedback` first (its styles cover the banner).",
2073
2194
  "dependencies": [
2074
- "@hachej/boring-feedback@^0.4.2",
2195
+ "@hachej/boring-feedback@^0.4.3",
2075
2196
  "@earendil-works/pi-ai@~1.2.0",
2076
2197
  "react@^19.0.0"
2077
2198
  ],
@@ -2095,8 +2216,8 @@
2095
2216
  "title": "Consumer task-list viewer",
2096
2217
  "description": "A consumer-defined task-list schema and controller over the shared text buffer, with a restylable borrowed React renderer.",
2097
2218
  "dependencies": [
2098
- "@hachej/boring-ui-kit@^0.4.2",
2099
- "@hachej/boring-files@^0.4.2",
2219
+ "@hachej/boring-ui-kit@^0.4.3",
2220
+ "@hachej/boring-files@^0.4.3",
2100
2221
  "react@^19.0.0",
2101
2222
  "react-dom@^19.0.0",
2102
2223
  "zod@^4.6.5"
@@ -2152,12 +2273,12 @@
2152
2273
  "title": "Version history rows",
2153
2274
  "description": "Shared view-only version rows and menu metadata with relative time, provenance and Current. No file reads, publication or restoration.",
2154
2275
  "dependencies": [
2155
- "@hachej/boring-files@^0.4.2",
2276
+ "@hachej/boring-files@^0.4.3",
2156
2277
  "react@^19.0.0"
2157
2278
  ],
2158
2279
  "registryDependencies": [
2159
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
2160
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
2280
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
2281
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
2161
2282
  "button"
2162
2283
  ],
2163
2284
  "files": [
@@ -2174,20 +2295,21 @@
2174
2295
  "title": "File tree",
2175
2296
  "description": "Browse, search, upload and inspect retained versions through one revisionProvider binding. Uses the consumer's shadcn Button and dropdown-menu with shared version-history rows; Base UI style only.",
2176
2297
  "dependencies": [
2177
- "@hachej/boring-ui-kit@^0.4.2",
2178
- "@hachej/boring-files@^0.4.2",
2298
+ "@hachej/boring-ui-kit@^0.4.3",
2299
+ "@hachej/boring-files@^0.4.3",
2179
2300
  "react@^19.0.0",
2180
2301
  "lucide-react@^1.51.0"
2181
2302
  ],
2182
2303
  "registryDependencies": [
2183
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
2184
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
2185
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/version-history.json",
2304
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
2305
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
2306
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/version-history.json",
2186
2307
  "button",
2187
2308
  "dropdown-menu",
2188
2309
  "collapsible",
2189
2310
  "empty",
2190
2311
  "input",
2312
+ "progress",
2191
2313
  "separator",
2192
2314
  "sidebar"
2193
2315
  ],
@@ -2206,20 +2328,20 @@
2206
2328
  "title": "Documents: the Library, a file and its revisions",
2207
2329
  "description": "The workspace's Library as the list, the chosen file in its viewer and its retained revisions beside it (an older one opens read-only). DocumentSheet opens one document over the app for a host's « Voir la fiche », with an optional « Toutes les fiches ». Every read goes through one revisionProvider binding.",
2208
2330
  "dependencies": [
2209
- "@hachej/boring-ui-kit@^0.4.2",
2210
- "@hachej/boring-files@^0.4.2",
2331
+ "@hachej/boring-ui-kit@^0.4.3",
2332
+ "@hachej/boring-files@^0.4.3",
2211
2333
  "react@^19.0.0",
2212
2334
  "lucide-react@^1.51.0"
2213
2335
  ],
2214
2336
  "registryDependencies": [
2215
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
2216
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
2217
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
2218
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-chat.json",
2219
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/pi-app.json",
2220
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/app-shell.json",
2221
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/file-tree.json",
2222
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/viewers.json",
2337
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
2338
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
2339
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
2340
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-chat.json",
2341
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/pi-app.json",
2342
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/app-shell.json",
2343
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/file-tree.json",
2344
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/viewers.json",
2223
2345
  "drawer",
2224
2346
  "button",
2225
2347
  "scroll-area",
@@ -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.2",
8
- "@hachej/boring-files@^0.4.2",
7
+ "@hachej/boring-ui-kit@^0.4.3",
8
+ "@hachej/boring-files@^0.4.3",
9
9
  "react@^19.0.0",
10
10
  "react-dom@^19.0.0",
11
11
  "zod@^4.6.5"
@@ -4,12 +4,12 @@
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.2",
7
+ "@hachej/boring-files@^0.4.3",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
13
13
  "button"
14
14
  ],
15
15
  "files": [
package/r/viewers.json CHANGED
@@ -4,8 +4,8 @@
4
4
  "title": "Viewers",
5
5
  "description": "The standard viewer top bar (title, status, viewer controls, Refresh, Share, Copy, Download, Open in new tab, Close, overflow menu) with Tailwind panes over it: the Markdown editor with a formatting toolbar and prose styling, the passive HTML preview and source editor, an image viewer with zoom and pan, and a PDF viewer. Owned, editable source over the borrowed controllers; no AI SDK.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.2",
8
- "@hachej/boring-files@^0.4.2",
7
+ "@hachej/boring-ui-kit@^0.4.3",
8
+ "@hachej/boring-files@^0.4.3",
9
9
  "react@^19.0.0",
10
10
  "react-dom@^19.0.0",
11
11
  "marked@^17.0.6",
@@ -25,12 +25,12 @@
25
25
  "pdfjs-dist@6.3.289"
26
26
  ],
27
27
  "registryDependencies": [
28
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
29
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
30
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/button.json",
28
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/theme.json",
29
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
30
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json",
31
31
  "button",
32
32
  "toggle",
33
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/version-history.json",
33
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/version-history.json",
34
34
  "toggle-group",
35
35
  "dialog",
36
36
  "textarea",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  {
60
60
  "path": "registry/viewers/interactive-html.tsx",
61
- "content": "'use client';\n\nimport type { ReactNode } from 'react';\n\n/**\n * Host opt-in for running an HTML document's own scripts. `scriptSources` are the HTTPS origins the page may load libraries, styles and fonts\n * from (for example `https://cdnjs.cloudflare.com`). Everything else is closed: no network requests from the page, no frames, no forms.\n * Pinning library versions is the page's responsibility.\n */\nexport interface InteractiveHtml { readonly scriptSources: readonly string[] }\n\n/** An origin only: `https://host` with an optional port, no path, no wildcard, nothing that could add a second CSP directive. */\nconst ORIGIN = /^https:\\/\\/[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(:\\d{1,5})?$/i;\n\nexport function allowedOrigins(sources: readonly string[]): string[] {\n return [...new Set(sources.map(source => source.trim().toLowerCase()).filter(source => ORIGIN.test(source)))];\n}\n\n/** The Content-Security-Policy the running page gets: inline script and style, the allow-listed origins for libraries, nothing else. */\nexport function interactivePolicy(sources: readonly string[]): string {\n const origins = allowedOrigins(sources).join(' ');\n const list = (...extra: string[]) => [...extra, ...(origins ? [origins] : [])].join(' ');\n return [\n \"default-src 'none'\",\n `script-src ${list(\"'unsafe-inline'\")}`,\n `style-src ${list(\"'unsafe-inline'\")}`,\n 'img-src data: blob:',\n `font-src ${list('data:')}`,\n \"connect-src 'none'\",\n \"frame-src 'none'\",\n \"base-uri 'none'\",\n \"form-action 'none'\",\n ].join('; ');\n}\n\n/**\n * The document the frame loads: the policy and a no-referrer rule come first, so they apply before any of the page's own markup is parsed.\n * A second doctype or head in the page is ignored by the parser; a meta policy of the page's own can only tighten this one.\n */\nexport function interactiveDocument(text: string, sources: readonly string[]): string {\n return `<!doctype html><meta http-equiv=\"Content-Security-Policy\" content=\"${interactivePolicy(sources).replaceAll('\"', '&quot;')}\"><meta name=\"referrer\" content=\"no-referrer\">${text}`;\n}\n\n/**\n * The page running in a sandboxed frame: `allow-scripts` only. There is no `allow-same-origin`, so the page has an opaque origin (no cookies,\n * storage or access to this page), and no top navigation, popups, forms, downloads or modals. `allow=\"\"` withholds camera, microphone, location\n * and the other powerful features. Changing `reload` loads the page again from the start.\n */\nexport function InteractiveFrame({ text, sources, reload = 0, title = 'HTML page (running)', testId = 'viewer', children }: {\n readonly text: string;\n readonly sources: readonly string[];\n readonly reload?: number;\n readonly title?: string;\n readonly testId?: string;\n readonly children?: ReactNode;\n}) {\n return <div className=\"boring-html-run flex min-h-0 flex-1 flex-col\" data-testid={`${testId}-run`}>\n <iframe key={reload} title={title} sandbox=\"allow-scripts\" allow=\"\" referrerPolicy=\"no-referrer\" srcDoc={interactiveDocument(text, sources)}\n data-testid={`${testId}-run-frame`} className=\"size-full min-h-0 flex-1\" />\n {children}\n </div>;\n}\n",
61
+ "content": "'use client';\n\nimport type { ReactNode, Ref } from 'react';\n\n/**\n * Host opt-in for running an HTML document's own scripts. `scriptSources` are the HTTPS origins the page may load libraries, styles and fonts\n * from (for example `https://cdnjs.cloudflare.com`). Everything else is closed: no network requests from the page, no frames, no forms.\n * Pinning library versions is the page's responsibility.\n */\nexport interface InteractiveHtml { readonly scriptSources: readonly string[] }\n\n/** An origin only: `https://host` with an optional port, no path, no wildcard, nothing that could add a second CSP directive. */\nconst ORIGIN = /^https:\\/\\/[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(:\\d{1,5})?$/i;\n\nexport function allowedOrigins(sources: readonly string[]): string[] {\n return [...new Set(sources.map(source => source.trim().toLowerCase()).filter(source => ORIGIN.test(source)))];\n}\n\n/** The Content-Security-Policy the running page gets: inline script and style, the allow-listed origins for libraries, nothing else. */\nexport function interactivePolicy(sources: readonly string[]): string {\n const origins = allowedOrigins(sources).join(' ');\n const list = (...extra: string[]) => [...extra, ...(origins ? [origins] : [])].join(' ');\n return [\n \"default-src 'none'\",\n `script-src ${list(\"'unsafe-inline'\")}`,\n `style-src ${list(\"'unsafe-inline'\")}`,\n 'img-src data: blob:',\n `font-src ${list('data:')}`,\n \"connect-src 'none'\",\n \"frame-src 'none'\",\n \"base-uri 'none'\",\n \"form-action 'none'\",\n ].join('; ');\n}\n\n/**\n * The document the frame loads: the policy and a no-referrer rule come first, so they apply before any of the page's own markup is parsed.\n * A second doctype or head in the page is ignored by the parser; a meta policy of the page's own can only tighten this one.\n */\nexport function interactiveDocument(text: string, sources: readonly string[]): string {\n return `<!doctype html><meta http-equiv=\"Content-Security-Policy\" content=\"${interactivePolicy(sources).replaceAll('\"', '&quot;')}\"><meta name=\"referrer\" content=\"no-referrer\">${text}`;\n}\n\n/**\n * The page running in a sandboxed frame: `allow-scripts` only. There is no `allow-same-origin`, so the page has an opaque origin (no cookies,\n * storage or access to this page), and no top navigation, popups, forms, downloads or modals. `allow=\"\"` withholds camera, microphone, location\n * and the other powerful features. Changing `reload` loads the page again from the start.\n */\nexport function InteractiveFrame({ text, sources, reload = 0, title = 'HTML page (running)', testId = 'viewer', children, frameRef, onLoad }: {\n readonly text: string;\n readonly sources: readonly string[];\n readonly reload?: number;\n readonly title?: string;\n readonly testId?: string;\n readonly children?: ReactNode;\n /** Host message bridges may identify the sender, never read the frame's document. */\n readonly frameRef?: Ref<HTMLIFrameElement> | undefined;\n readonly onLoad?: (() => void) | undefined;\n}) {\n return <div className=\"boring-html-run flex min-h-0 flex-1 flex-col\" data-testid={`${testId}-run`}>\n <iframe key={reload} ref={frameRef} onLoad={onLoad} title={title} sandbox=\"allow-scripts\" allow=\"\" referrerPolicy=\"no-referrer\" srcDoc={interactiveDocument(text, sources)}\n data-testid={`${testId}-run-frame`} className=\"size-full min-h-0 flex-1\" />\n {children}\n </div>;\n}\n",
62
62
  "type": "registry:component",
63
63
  "target": "components/viewers/interactive-html.tsx"
64
64
  },