@hachej/boring-ui-kit 0.4.0 → 0.4.2

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.
@@ -8,10 +8,10 @@
8
8
  "react-dom@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/dock.json",
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/pi-chat.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/dock.json",
15
15
  "badge",
16
16
  "card"
17
17
  ],
@@ -9,8 +9,8 @@
9
9
  "lucide-react@^1.51.0"
10
10
  ],
11
11
  "registryDependencies": [
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json",
14
14
  "button",
15
15
  "input",
16
16
  "label",
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.0/r/utils.json",
136
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/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.0",
159
- "@hachej/boring-files@^0.4.0",
164
+ "@hachej/boring-ui-kit@^0.4.2",
165
+ "@hachej/boring-files@^0.4.2",
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.0/r/button.json"
320
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/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.0",
324
- "@hachej/boring-files@^0.4.0",
329
+ "@hachej/boring-ui-kit@^0.4.2",
330
+ "@hachej/boring-files@^0.4.2",
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.0/r/button.json"
378
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/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.0",
382
- "@hachej/boring-files@^0.4.0",
387
+ "@hachej/boring-ui-kit@^0.4.2",
388
+ "@hachej/boring-files@^0.4.2",
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.0/r/utils.json",
397
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
398
404
  "trace",
399
405
  "message",
400
406
  "message-scroller",
@@ -569,6 +575,16 @@
569
575
  "path": "registry/pi-chat/locale.ts",
570
576
  "type": "registry:lib",
571
577
  "target": "components/pi-chat/locale.ts"
578
+ },
579
+ {
580
+ "path": "registry/pi-chat/use-conversations.ts",
581
+ "type": "registry:hook",
582
+ "target": "components/pi-chat/use-conversations.ts"
583
+ },
584
+ {
585
+ "path": "registry/pi-chat/run-card.tsx",
586
+ "type": "registry:component",
587
+ "target": "components/pi-chat/run-card.tsx"
572
588
  }
573
589
  ],
574
590
  "css": {
@@ -636,7 +652,7 @@
636
652
  "title": "Pi ambient agent",
637
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.",
638
654
  "dependencies": [
639
- "@hachej/boring-ui-kit@^0.4.0",
655
+ "@hachej/boring-ui-kit@^0.4.2",
640
656
  "react@^19.0.0",
641
657
  "react-dom@^19.0.0",
642
658
  "@earendil-works/pi-durable@~1.2.0",
@@ -644,11 +660,11 @@
644
660
  "lucide-react@^1.51.0"
645
661
  ],
646
662
  "registryDependencies": [
647
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
648
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
649
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-workspace.json",
650
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
651
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
652
668
  "message-scroller",
653
669
  "button",
654
670
  "toggle",
@@ -684,7 +700,7 @@
684
700
  "react@^19.0.0"
685
701
  ],
686
702
  "registryDependencies": [
687
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json"
703
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/utils.json"
688
704
  ],
689
705
  "files": [
690
706
  {
@@ -704,10 +720,10 @@
704
720
  "react-dom@^19.0.0"
705
721
  ],
706
722
  "registryDependencies": [
707
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
708
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
709
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
710
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/dock.json",
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",
711
727
  "badge",
712
728
  "card"
713
729
  ],
@@ -724,31 +740,119 @@
724
740
  }
725
741
  ]
726
742
  },
743
+ {
744
+ "name": "maquette-viewer",
745
+ "type": "registry:component",
746
+ "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.",
748
+ "dependencies": [
749
+ "react@^19.0.0",
750
+ "lucide-react@^1.51.0"
751
+ ],
752
+ "registryDependencies": [
753
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/theme.json",
754
+ "alert",
755
+ "badge",
756
+ "bubble",
757
+ "button",
758
+ "card",
759
+ "empty",
760
+ "input",
761
+ "item",
762
+ "label",
763
+ "native-select",
764
+ "separator",
765
+ "table",
766
+ "dialog",
767
+ "dropdown-menu",
768
+ "popover"
769
+ ],
770
+ "files": [
771
+ {
772
+ "path": "registry/maquette-viewer/maquette.ts",
773
+ "type": "registry:lib",
774
+ "target": "components/maquette-viewer/maquette.ts"
775
+ },
776
+ {
777
+ "path": "registry/maquette-viewer/maquette-labels.ts",
778
+ "type": "registry:lib",
779
+ "target": "components/maquette-viewer/maquette-labels.ts"
780
+ },
781
+ {
782
+ "path": "registry/maquette-viewer/maquette-blocks.tsx",
783
+ "type": "registry:component",
784
+ "target": "components/maquette-viewer/maquette-blocks.tsx"
785
+ },
786
+ {
787
+ "path": "registry/maquette-viewer/maquette-diagram.tsx",
788
+ "type": "registry:component",
789
+ "target": "components/maquette-viewer/maquette-diagram.tsx"
790
+ },
791
+ {
792
+ "path": "registry/maquette-viewer/maquette-viewer.tsx",
793
+ "type": "registry:component",
794
+ "target": "components/maquette-viewer/maquette-viewer.tsx"
795
+ }
796
+ ],
797
+ "css": {
798
+ "@layer components": {
799
+ "[data-boring=\"maquette-viewer\"] [data-maquette=\"placeholder\"]": {
800
+ "border-width": "var(--default-border-width, 1px)",
801
+ "border-style": "dashed",
802
+ "border-color": "var(--border)",
803
+ "background-color": "var(--muted)"
804
+ },
805
+ "[data-boring=\"maquette-viewer\"] [data-hint=\"pulse\"] [data-goto]": {
806
+ "animation": "var(--animate-pulse)",
807
+ "animation-iteration-count": "1"
808
+ },
809
+ "[data-boring=\"maquette-viewer\"] [data-goto]:focus-visible": {
810
+ "outline": "2px solid color-mix(in oklch, var(--ring) 55%, transparent)",
811
+ "outline-offset": "2px"
812
+ },
813
+ "@media (hover: hover) and (pointer: fine)": {
814
+ "[data-boring=\"maquette-viewer\"] [data-goto]:hover": {
815
+ "outline": "2px solid color-mix(in oklch, var(--ring) 55%, transparent)",
816
+ "outline-offset": "2px"
817
+ }
818
+ },
819
+ "@media (prefers-reduced-motion: reduce)": {
820
+ "[data-boring=\"maquette-viewer\"] [data-hint=\"pulse\"] [data-goto]": {
821
+ "animation": "none"
822
+ }
823
+ }
824
+ }
825
+ }
826
+ },
727
827
  {
728
828
  "name": "pi-app",
729
829
  "type": "registry:block",
730
830
  "title": "Pi agent app",
731
- "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).",
831
+ "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).",
732
832
  "dependencies": [
733
- "@hachej/boring-ui-kit@^0.4.0",
734
- "@hachej/boring-files@^0.4.0",
833
+ "@hachej/boring-ui-kit@^0.4.2",
834
+ "@hachej/boring-files@^0.4.2",
735
835
  "react@^19.0.0",
736
836
  "react-dom@^19.0.0",
737
837
  "lucide-react@^1.51.0"
738
838
  ],
739
839
  "registryDependencies": [
740
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
741
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
742
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-workspace.json",
743
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/viewers.json",
744
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
745
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
746
847
  "drawer",
747
848
  "button",
748
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/file-tree.json",
849
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/file-tree.json",
749
850
  "dropdown-menu",
750
851
  "scroll-area",
751
- "separator"
852
+ "separator",
853
+ "table",
854
+ "popover",
855
+ "tooltip"
752
856
  ],
753
857
  "files": [
754
858
  {
@@ -766,6 +870,11 @@
766
870
  "type": "registry:component",
767
871
  "target": "components/pi-app/history-column.tsx"
768
872
  },
873
+ {
874
+ "path": "registry/pi-app/workspace-bar.tsx",
875
+ "type": "registry:component",
876
+ "target": "components/pi-app/workspace-bar.tsx"
877
+ },
769
878
  {
770
879
  "path": "registry/pi-app/artifact-panel.tsx",
771
880
  "type": "registry:component",
@@ -796,11 +905,6 @@
796
905
  "type": "registry:component",
797
906
  "target": "components/pi-app/new-version-notice.tsx"
798
907
  },
799
- {
800
- "path": "registry/pi-app/use-conversations.ts",
801
- "type": "registry:hook",
802
- "target": "components/pi-app/use-conversations.ts"
803
- },
804
908
  {
805
909
  "path": "registry/pi-app/app-labels.ts",
806
910
  "type": "registry:lib",
@@ -829,19 +933,19 @@
829
933
  "title": "App shell: layouts, list/detail and agent layer",
830
934
  "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.",
831
935
  "dependencies": [
832
- "@hachej/boring-feedback@^0.4.0",
833
- "@hachej/boring-ui-kit@^0.4.0",
936
+ "@hachej/boring-feedback@^0.4.2",
937
+ "@hachej/boring-ui-kit@^0.4.2",
834
938
  "@base-ui/react@^1.9.0",
835
939
  "react@^19.0.0",
836
940
  "react-dom@^19.0.0",
837
941
  "lucide-react@^1.51.0"
838
942
  ],
839
943
  "registryDependencies": [
840
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
841
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/dock.json",
842
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/feedback.json",
843
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
844
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
845
949
  "drawer",
846
950
  "sidebar",
847
951
  "avatar",
@@ -966,8 +1070,8 @@
966
1070
  "title": "Viewers",
967
1071
  "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.",
968
1072
  "dependencies": [
969
- "@hachej/boring-ui-kit@^0.4.0",
970
- "@hachej/boring-files@^0.4.0",
1073
+ "@hachej/boring-ui-kit@^0.4.2",
1074
+ "@hachej/boring-files@^0.4.2",
971
1075
  "react@^19.0.0",
972
1076
  "react-dom@^19.0.0",
973
1077
  "marked@^17.0.6",
@@ -987,12 +1091,12 @@
987
1091
  "pdfjs-dist@6.3.289"
988
1092
  ],
989
1093
  "registryDependencies": [
990
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
991
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
992
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
993
1097
  "button",
994
1098
  "toggle",
995
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/version-history.json",
1099
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.2/r/version-history.json",
996
1100
  "toggle-group",
997
1101
  "dialog",
998
1102
  "textarea",
@@ -1429,8 +1533,8 @@
1429
1533
  "lucide-react@^1.51.0"
1430
1534
  ],
1431
1535
  "registryDependencies": [
1432
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
1433
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
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",
1434
1538
  "button",
1435
1539
  "input",
1436
1540
  "label",
@@ -1451,9 +1555,9 @@
1451
1555
  "title": "Feedback",
1452
1556
  "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.",
1453
1557
  "dependencies": [
1454
- "@hachej/boring-feedback@^0.4.0",
1455
- "@hachej/boring-ui-kit@^0.4.0",
1456
- "@hachej/boring-files@^0.4.0",
1558
+ "@hachej/boring-feedback@^0.4.2",
1559
+ "@hachej/boring-ui-kit@^0.4.2",
1560
+ "@hachej/boring-files@^0.4.2",
1457
1561
  "react@^19.0.0",
1458
1562
  "react-dom@^19.0.0",
1459
1563
  "lucide-react@^1.51.0"
@@ -1951,8 +2055,8 @@
1951
2055
  }
1952
2056
  },
1953
2057
  "registryDependencies": [
1954
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
1955
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
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",
1956
2060
  "button",
1957
2061
  "toggle",
1958
2062
  "badge",
@@ -1967,7 +2071,7 @@
1967
2071
  "title": "Feedback preview",
1968
2072
  "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).",
1969
2073
  "dependencies": [
1970
- "@hachej/boring-feedback@^0.4.0",
2074
+ "@hachej/boring-feedback@^0.4.2",
1971
2075
  "@earendil-works/pi-ai@~1.2.0",
1972
2076
  "react@^19.0.0"
1973
2077
  ],
@@ -1991,8 +2095,8 @@
1991
2095
  "title": "Consumer task-list viewer",
1992
2096
  "description": "A consumer-defined task-list schema and controller over the shared text buffer, with a restylable borrowed React renderer.",
1993
2097
  "dependencies": [
1994
- "@hachej/boring-ui-kit@^0.4.0",
1995
- "@hachej/boring-files@^0.4.0",
2098
+ "@hachej/boring-ui-kit@^0.4.2",
2099
+ "@hachej/boring-files@^0.4.2",
1996
2100
  "react@^19.0.0",
1997
2101
  "react-dom@^19.0.0",
1998
2102
  "zod@^4.6.5"
@@ -2048,12 +2152,12 @@
2048
2152
  "title": "Version history rows",
2049
2153
  "description": "Shared view-only version rows and menu metadata with relative time, provenance and Current. No file reads, publication or restoration.",
2050
2154
  "dependencies": [
2051
- "@hachej/boring-files@^0.4.0",
2155
+ "@hachej/boring-files@^0.4.2",
2052
2156
  "react@^19.0.0"
2053
2157
  ],
2054
2158
  "registryDependencies": [
2055
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
2056
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
2057
2161
  "button"
2058
2162
  ],
2059
2163
  "files": [
@@ -2070,15 +2174,15 @@
2070
2174
  "title": "File tree",
2071
2175
  "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.",
2072
2176
  "dependencies": [
2073
- "@hachej/boring-ui-kit@^0.4.0",
2074
- "@hachej/boring-files@^0.4.0",
2177
+ "@hachej/boring-ui-kit@^0.4.2",
2178
+ "@hachej/boring-files@^0.4.2",
2075
2179
  "react@^19.0.0",
2076
2180
  "lucide-react@^1.51.0"
2077
2181
  ],
2078
2182
  "registryDependencies": [
2079
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
2080
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
2081
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/version-history.json",
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",
2082
2186
  "button",
2083
2187
  "dropdown-menu",
2084
2188
  "collapsible",
@@ -2102,20 +2206,20 @@
2102
2206
  "title": "Documents: the Library, a file and its revisions",
2103
2207
  "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.",
2104
2208
  "dependencies": [
2105
- "@hachej/boring-ui-kit@^0.4.0",
2106
- "@hachej/boring-files@^0.4.0",
2209
+ "@hachej/boring-ui-kit@^0.4.2",
2210
+ "@hachej/boring-files@^0.4.2",
2107
2211
  "react@^19.0.0",
2108
2212
  "lucide-react@^1.51.0"
2109
2213
  ],
2110
2214
  "registryDependencies": [
2111
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
2112
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/utils.json",
2113
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
2114
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-chat.json",
2115
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/pi-app.json",
2116
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/app-shell.json",
2117
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/file-tree.json",
2118
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/viewers.json",
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",
2119
2223
  "drawer",
2120
2224
  "button",
2121
2225
  "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.0",
8
- "@hachej/boring-files@^0.4.0",
7
+ "@hachej/boring-ui-kit@^0.4.2",
8
+ "@hachej/boring-files@^0.4.2",
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"
@@ -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.0",
7
+ "@hachej/boring-files@^0.4.2",
8
8
  "react@^19.0.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/theme.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.0/r/button.json",
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",
13
13
  "button"
14
14
  ],
15
15
  "files": [