@hachej/boring-ui-kit 0.4.1 → 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
@@ -103,16 +103,22 @@
103
103
  "name": "utils",
104
104
  "type": "registry:lib",
105
105
  "title": "Shared helpers",
106
- "description": "The class merge helper `cn` and `copyText` (host callback, Clipboard API, then a selection copy that works over plain HTTP) shared by every Tailwind item, installed once in components/utils/.",
106
+ "description": "The class merge helper `cn` and `copyText` (host callback, Clipboard API, then a selection copy that works over plain HTTP) shared by every Tailwind item, and the app shell's header slot for an embedded page's controls (`ScreenHeaderSlotContext`), installed once in components/utils/.",
107
107
  "dependencies": [
108
108
  "clsx@^2.1.1",
109
- "tailwind-merge@^3.7.0"
109
+ "tailwind-merge@^3.7.0",
110
+ "react@^19.0.0"
110
111
  ],
111
112
  "files": [
112
113
  {
113
114
  "path": "registry/utils/utils.ts",
114
115
  "type": "registry:lib",
115
116
  "target": "components/utils/utils.ts"
117
+ },
118
+ {
119
+ "path": "registry/utils/screen-header-slot.ts",
120
+ "type": "registry:lib",
121
+ "target": "components/utils/screen-header-slot.ts"
116
122
  }
117
123
  ]
118
124
  },
@@ -127,7 +133,7 @@
127
133
  "lucide-react@^1.51.0"
128
134
  ],
129
135
  "registryDependencies": [
130
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
136
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json",
131
137
  "dropdown-menu",
132
138
  "button",
133
139
  "toggle",
@@ -155,8 +161,8 @@
155
161
  "title": "Markdown editor",
156
162
  "description": "A host-owned styled wrapper over the concrete borrowed Markdown controller.",
157
163
  "dependencies": [
158
- "@hachej/boring-ui-kit@^0.4.1",
159
- "@hachej/boring-files@^0.4.1",
164
+ "@hachej/boring-ui-kit@^0.4.3",
165
+ "@hachej/boring-files@^0.4.3",
160
166
  "react@^19.0.0",
161
167
  "react-dom@^19.0.0",
162
168
  "marked@^17.0.6",
@@ -311,7 +317,7 @@
311
317
  },
312
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.",
313
319
  "registryDependencies": [
314
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/button.json"
320
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json"
315
321
  ]
316
322
  },
317
323
  {
@@ -320,8 +326,8 @@
320
326
  "title": "HTML source and passive preview",
321
327
  "description": "Exact HTML source editing with a reconstructed passive preview and borrowed controller. Browser security qualification remains separate.",
322
328
  "dependencies": [
323
- "@hachej/boring-ui-kit@^0.4.1",
324
- "@hachej/boring-files@^0.4.1",
329
+ "@hachej/boring-ui-kit@^0.4.3",
330
+ "@hachej/boring-files@^0.4.3",
325
331
  "react@^19.0.0",
326
332
  "react-dom@^19.0.0"
327
333
  ],
@@ -369,7 +375,7 @@
369
375
  }
370
376
  },
371
377
  "registryDependencies": [
372
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/button.json"
378
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/button.json"
373
379
  ]
374
380
  },
375
381
  {
@@ -378,8 +384,8 @@
378
384
  "title": "Pi chat",
379
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.",
380
386
  "dependencies": [
381
- "@hachej/boring-ui-kit@^0.4.1",
382
- "@hachej/boring-files@^0.4.1",
387
+ "@hachej/boring-ui-kit@^0.4.3",
388
+ "@hachej/boring-files@^0.4.3",
383
389
  "react@^19.0.0",
384
390
  "react-dom@^19.0.0",
385
391
  "marked@^17.0.6",
@@ -393,8 +399,8 @@
393
399
  "@shadcn/react@0.3.1"
394
400
  ],
395
401
  "registryDependencies": [
396
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
397
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
398
404
  "trace",
399
405
  "message",
400
406
  "message-scroller",
@@ -646,7 +652,7 @@
646
652
  "title": "Pi ambient agent",
647
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.",
648
654
  "dependencies": [
649
- "@hachej/boring-ui-kit@^0.4.1",
655
+ "@hachej/boring-ui-kit@^0.4.3",
650
656
  "react@^19.0.0",
651
657
  "react-dom@^19.0.0",
652
658
  "@earendil-works/pi-durable@~1.2.0",
@@ -654,11 +660,11 @@
654
660
  "lucide-react@^1.51.0"
655
661
  ],
656
662
  "registryDependencies": [
657
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
658
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
659
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-workspace.json",
660
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
661
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
662
668
  "message-scroller",
663
669
  "button",
664
670
  "toggle",
@@ -694,7 +700,7 @@
694
700
  "react@^19.0.0"
695
701
  ],
696
702
  "registryDependencies": [
697
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json"
703
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/utils.json"
698
704
  ],
699
705
  "files": [
700
706
  {
@@ -714,10 +720,10 @@
714
720
  "react-dom@^19.0.0"
715
721
  ],
716
722
  "registryDependencies": [
717
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
718
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
719
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
720
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
721
727
  "badge",
722
728
  "card"
723
729
  ],
@@ -734,32 +740,240 @@
734
740
  }
735
741
  ]
736
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
+ },
820
+ {
821
+ "name": "maquette-viewer",
822
+ "type": "registry:component",
823
+ "title": "Maquette viewer",
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.",
825
+ "dependencies": [
826
+ "react@^19.0.0",
827
+ "lucide-react@^1.51.0"
828
+ ],
829
+ "registryDependencies": [
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",
832
+ "alert",
833
+ "badge",
834
+ "bubble",
835
+ "button",
836
+ "card",
837
+ "empty",
838
+ "input",
839
+ "item",
840
+ "label",
841
+ "native-select",
842
+ "separator",
843
+ "table",
844
+ "dialog",
845
+ "dropdown-menu",
846
+ "popover",
847
+ "toggle",
848
+ "tooltip"
849
+ ],
850
+ "files": [
851
+ {
852
+ "path": "registry/maquette-viewer/maquette.ts",
853
+ "type": "registry:lib",
854
+ "target": "components/maquette-viewer/maquette.ts"
855
+ },
856
+ {
857
+ "path": "registry/maquette-viewer/maquette-labels.ts",
858
+ "type": "registry:lib",
859
+ "target": "components/maquette-viewer/maquette-labels.ts"
860
+ },
861
+ {
862
+ "path": "registry/maquette-viewer/maquette-blocks.tsx",
863
+ "type": "registry:component",
864
+ "target": "components/maquette-viewer/maquette-blocks.tsx"
865
+ },
866
+ {
867
+ "path": "registry/maquette-viewer/maquette-viewer.tsx",
868
+ "type": "registry:component",
869
+ "target": "components/maquette-viewer/maquette-viewer.tsx"
870
+ }
871
+ ],
872
+ "css": {
873
+ "@layer components": {
874
+ "[data-boring=\"maquette-viewer\"] [data-maquette=\"placeholder\"]": {
875
+ "border-width": "var(--default-border-width, 1px)",
876
+ "border-style": "dashed",
877
+ "border-color": "var(--border)",
878
+ "background-color": "var(--muted)"
879
+ },
880
+ "[data-boring=\"maquette-viewer\"] [data-hint=\"pulse\"] [data-goto]": {
881
+ "animation": "var(--animate-pulse)",
882
+ "animation-iteration-count": "1"
883
+ },
884
+ "[data-boring=\"maquette-viewer\"] [data-goto]:focus-visible": {
885
+ "outline": "2px solid color-mix(in oklch, var(--ring) 55%, transparent)",
886
+ "outline-offset": "2px"
887
+ },
888
+ "@media (hover: hover) and (pointer: fine)": {
889
+ "[data-boring=\"maquette-viewer\"] [data-goto]:hover": {
890
+ "outline": "2px solid color-mix(in oklch, var(--ring) 55%, transparent)",
891
+ "outline-offset": "2px"
892
+ }
893
+ },
894
+ "@media (prefers-reduced-motion: reduce)": {
895
+ "[data-boring=\"maquette-viewer\"] [data-hint=\"pulse\"] [data-goto]": {
896
+ "animation": "none"
897
+ }
898
+ }
899
+ }
900
+ }
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
+ },
737
946
  {
738
947
  "name": "pi-app",
739
948
  "type": "registry:block",
740
949
  "title": "Pi agent app",
741
- "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. Props are data and callbacks; hooks for the conversations handler (useConversations), the chat transport (useRemoteChat) and saved resources (useSaved).",
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).",
742
951
  "dependencies": [
743
- "@hachej/boring-ui-kit@^0.4.1",
744
- "@hachej/boring-files@^0.4.1",
952
+ "@hachej/boring-ui-kit@^0.4.3",
953
+ "@hachej/boring-files@^0.4.3",
745
954
  "react@^19.0.0",
746
955
  "react-dom@^19.0.0",
747
956
  "lucide-react@^1.51.0"
748
957
  ],
749
958
  "registryDependencies": [
750
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
751
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
752
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-workspace.json",
753
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/viewers.json",
754
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
755
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
756
968
  "drawer",
757
969
  "button",
758
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/file-tree.json",
970
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/file-tree.json",
759
971
  "dropdown-menu",
760
972
  "scroll-area",
761
973
  "separator",
762
- "table"
974
+ "table",
975
+ "popover",
976
+ "tooltip"
763
977
  ],
764
978
  "files": [
765
979
  {
@@ -777,6 +991,11 @@
777
991
  "type": "registry:component",
778
992
  "target": "components/pi-app/history-column.tsx"
779
993
  },
994
+ {
995
+ "path": "registry/pi-app/workspace-bar.tsx",
996
+ "type": "registry:component",
997
+ "target": "components/pi-app/workspace-bar.tsx"
998
+ },
780
999
  {
781
1000
  "path": "registry/pi-app/artifact-panel.tsx",
782
1001
  "type": "registry:component",
@@ -835,19 +1054,19 @@
835
1054
  "title": "App shell: layouts, list/detail and agent layer",
836
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.",
837
1056
  "dependencies": [
838
- "@hachej/boring-feedback@^0.4.1",
839
- "@hachej/boring-ui-kit@^0.4.1",
1057
+ "@hachej/boring-feedback@^0.4.3",
1058
+ "@hachej/boring-ui-kit@^0.4.3",
840
1059
  "@base-ui/react@^1.9.0",
841
1060
  "react@^19.0.0",
842
1061
  "react-dom@^19.0.0",
843
1062
  "lucide-react@^1.51.0"
844
1063
  ],
845
1064
  "registryDependencies": [
846
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
847
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/dock.json",
848
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/feedback.json",
849
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
850
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
851
1070
  "drawer",
852
1071
  "sidebar",
853
1072
  "avatar",
@@ -972,8 +1191,8 @@
972
1191
  "title": "Viewers",
973
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.",
974
1193
  "dependencies": [
975
- "@hachej/boring-ui-kit@^0.4.1",
976
- "@hachej/boring-files@^0.4.1",
1194
+ "@hachej/boring-ui-kit@^0.4.3",
1195
+ "@hachej/boring-files@^0.4.3",
977
1196
  "react@^19.0.0",
978
1197
  "react-dom@^19.0.0",
979
1198
  "marked@^17.0.6",
@@ -993,12 +1212,12 @@
993
1212
  "pdfjs-dist@6.3.289"
994
1213
  ],
995
1214
  "registryDependencies": [
996
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
997
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
998
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
999
1218
  "button",
1000
1219
  "toggle",
1001
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/version-history.json",
1220
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.3/r/version-history.json",
1002
1221
  "toggle-group",
1003
1222
  "dialog",
1004
1223
  "textarea",
@@ -1435,8 +1654,8 @@
1435
1654
  "lucide-react@^1.51.0"
1436
1655
  ],
1437
1656
  "registryDependencies": [
1438
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
1439
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
1440
1659
  "button",
1441
1660
  "input",
1442
1661
  "label",
@@ -1457,9 +1676,9 @@
1457
1676
  "title": "Feedback",
1458
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.",
1459
1678
  "dependencies": [
1460
- "@hachej/boring-feedback@^0.4.1",
1461
- "@hachej/boring-ui-kit@^0.4.1",
1462
- "@hachej/boring-files@^0.4.1",
1679
+ "@hachej/boring-feedback@^0.4.3",
1680
+ "@hachej/boring-ui-kit@^0.4.3",
1681
+ "@hachej/boring-files@^0.4.3",
1463
1682
  "react@^19.0.0",
1464
1683
  "react-dom@^19.0.0",
1465
1684
  "lucide-react@^1.51.0"
@@ -1957,8 +2176,8 @@
1957
2176
  }
1958
2177
  },
1959
2178
  "registryDependencies": [
1960
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
1961
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
1962
2181
  "button",
1963
2182
  "toggle",
1964
2183
  "badge",
@@ -1973,7 +2192,7 @@
1973
2192
  "title": "Feedback preview",
1974
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).",
1975
2194
  "dependencies": [
1976
- "@hachej/boring-feedback@^0.4.1",
2195
+ "@hachej/boring-feedback@^0.4.3",
1977
2196
  "@earendil-works/pi-ai@~1.2.0",
1978
2197
  "react@^19.0.0"
1979
2198
  ],
@@ -1997,8 +2216,8 @@
1997
2216
  "title": "Consumer task-list viewer",
1998
2217
  "description": "A consumer-defined task-list schema and controller over the shared text buffer, with a restylable borrowed React renderer.",
1999
2218
  "dependencies": [
2000
- "@hachej/boring-ui-kit@^0.4.1",
2001
- "@hachej/boring-files@^0.4.1",
2219
+ "@hachej/boring-ui-kit@^0.4.3",
2220
+ "@hachej/boring-files@^0.4.3",
2002
2221
  "react@^19.0.0",
2003
2222
  "react-dom@^19.0.0",
2004
2223
  "zod@^4.6.5"
@@ -2054,12 +2273,12 @@
2054
2273
  "title": "Version history rows",
2055
2274
  "description": "Shared view-only version rows and menu metadata with relative time, provenance and Current. No file reads, publication or restoration.",
2056
2275
  "dependencies": [
2057
- "@hachej/boring-files@^0.4.1",
2276
+ "@hachej/boring-files@^0.4.3",
2058
2277
  "react@^19.0.0"
2059
2278
  ],
2060
2279
  "registryDependencies": [
2061
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
2062
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
2063
2282
  "button"
2064
2283
  ],
2065
2284
  "files": [
@@ -2076,20 +2295,21 @@
2076
2295
  "title": "File tree",
2077
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.",
2078
2297
  "dependencies": [
2079
- "@hachej/boring-ui-kit@^0.4.1",
2080
- "@hachej/boring-files@^0.4.1",
2298
+ "@hachej/boring-ui-kit@^0.4.3",
2299
+ "@hachej/boring-files@^0.4.3",
2081
2300
  "react@^19.0.0",
2082
2301
  "lucide-react@^1.51.0"
2083
2302
  ],
2084
2303
  "registryDependencies": [
2085
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
2086
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
2087
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
2088
2307
  "button",
2089
2308
  "dropdown-menu",
2090
2309
  "collapsible",
2091
2310
  "empty",
2092
2311
  "input",
2312
+ "progress",
2093
2313
  "separator",
2094
2314
  "sidebar"
2095
2315
  ],
@@ -2108,20 +2328,20 @@
2108
2328
  "title": "Documents: the Library, a file and its revisions",
2109
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.",
2110
2330
  "dependencies": [
2111
- "@hachej/boring-ui-kit@^0.4.1",
2112
- "@hachej/boring-files@^0.4.1",
2331
+ "@hachej/boring-ui-kit@^0.4.3",
2332
+ "@hachej/boring-files@^0.4.3",
2113
2333
  "react@^19.0.0",
2114
2334
  "lucide-react@^1.51.0"
2115
2335
  ],
2116
2336
  "registryDependencies": [
2117
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/theme.json",
2118
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/utils.json",
2119
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/button.json",
2120
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-chat.json",
2121
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/pi-app.json",
2122
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/app-shell.json",
2123
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/r/file-tree.json",
2124
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.1/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",
2125
2345
  "drawer",
2126
2346
  "button",
2127
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.1",
8
- "@hachej/boring-files@^0.4.1",
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"
package/r/utils.json CHANGED
@@ -2,10 +2,11 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "utils",
4
4
  "title": "Shared helpers",
5
- "description": "The class merge helper `cn` and `copyText` (host callback, Clipboard API, then a selection copy that works over plain HTTP) shared by every Tailwind item, installed once in components/utils/.",
5
+ "description": "The class merge helper `cn` and `copyText` (host callback, Clipboard API, then a selection copy that works over plain HTTP) shared by every Tailwind item, and the app shell's header slot for an embedded page's controls (`ScreenHeaderSlotContext`), installed once in components/utils/.",
6
6
  "dependencies": [
7
7
  "clsx@^2.1.1",
8
- "tailwind-merge@^3.7.0"
8
+ "tailwind-merge@^3.7.0",
9
+ "react@^19.0.0"
9
10
  ],
10
11
  "files": [
11
12
  {
@@ -13,6 +14,12 @@
13
14
  "content": "import { clsx } from 'clsx';\nimport type { ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string { return twMerge(clsx(inputs)); }\n\n/** Thrown when no automatic copy worked; `text` is what the person must copy by hand (a viewer shows it selected). */\nexport class ManualCopyError extends Error {\n readonly text: string;\n constructor(text: string) { super('Copy the text by hand'); this.name = 'ManualCopyError'; this.text = text; }\n}\n\n/**\n * Copies `text` using the host's callback when given, else the async Clipboard API (secure contexts only), else a hidden\n * textarea and `document.execCommand('copy')` (works over plain HTTP). Throws `ManualCopyError` when none worked.\n * This is the one place this item touches the clipboard; `npm run check` keeps it that way.\n */\nexport async function copyText(text: string, onCopy?: (text: string) => Promise<void>): Promise<void> {\n if (onCopy) return onCopy(text);\n try { const clipboard = globalThis.navigator?.clipboard; if (clipboard) { await clipboard.writeText(text); return; } }\n catch { /* denied or unfocused: use the selection route */ }\n const doc = globalThis.document;\n if (doc?.body && typeof doc.execCommand === 'function') {\n const area = doc.createElement('textarea');\n area.value = text;\n area.setAttribute('readonly', '');\n area.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none';\n const focus = doc.activeElement instanceof HTMLElement ? doc.activeElement : undefined;\n doc.body.append(area);\n try { area.select(); area.setSelectionRange(0, text.length); if (doc.execCommand('copy')) return; }\n catch { /* fall through */ }\n finally { area.remove(); focus?.focus({ preventScroll: true }); }\n }\n throw new ManualCopyError(text);\n}\n\n/**\n * A block's `labels` or `icons`: `defaults` with each partial override on top, later ones winning. A key an override leaves `undefined`\n * keeps the value below it, so a host can pass `{ title: maybe }` safely.\n */\nexport function withDefaults<T extends object>(defaults: T, ...overrides: readonly (Partial<T> | undefined)[]): T {\n const merged: Record<string, unknown> = { ...defaults as Record<string, unknown> };\n for (const override of overrides) for (const [key, value] of Object.entries(override ?? {})) if (value !== undefined) merged[key] = value;\n return merged as T;\n}\n",
14
15
  "type": "registry:lib",
15
16
  "target": "components/utils/utils.ts"
17
+ },
18
+ {
19
+ "path": "registry/utils/screen-header-slot.ts",
20
+ "content": "// Where an embedded page puts its own header controls when a host header already exists. The app shell (`app-shell`) provides the\n// element of its screen header to the screen on show; `AgentWorkspace layout=\"embedded\"` (`pi-app`) renders its bar's controls there\n// (a React portal), so the page has one header row. Null outside a shell screen on show: the page keeps its own bar. Host concern: Pi has\n// no layout. It lives here because both items depend on `utils` and neither imports the other.\nimport { createContext, useContext } from 'react';\n\nexport const ScreenHeaderSlotContext = createContext<HTMLElement | null>(null);\n\n/** The host header's slot for the calling screen's controls, or null when there is none. */\nexport const useScreenHeaderSlot = (): HTMLElement | null => useContext(ScreenHeaderSlotContext);\n",
21
+ "type": "registry:lib",
22
+ "target": "components/utils/screen-header-slot.ts"
16
23
  }
17
24
  ],
18
25
  "type": "registry:lib"