@hachej/boring-ui-kit 0.4.45 → 0.4.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +0 -4
  2. package/dist/chat-react-session.d.ts +1 -0
  3. package/dist/chat-react-session.js +12 -3
  4. package/dist/chat-view.d.ts +2 -1
  5. package/dist/native-chat.d.ts +39 -2
  6. package/dist/native-chat.js +135 -9
  7. package/dist/remote-chat.d.ts +6 -0
  8. package/dist/remote-chat.js +22 -0
  9. package/dist/shared-chat/index.d.ts +1 -1
  10. package/package.json +2 -6
  11. package/r/agent-target.json +4 -4
  12. package/r/app-shell.json +20 -15
  13. package/r/board-viewer.json +6 -6
  14. package/r/button.json +1 -1
  15. package/r/dock.json +1 -1
  16. package/r/documents.json +12 -12
  17. package/r/feedback.json +24 -12
  18. package/r/file-tree.json +4 -4
  19. package/r/highlights.json +3 -3
  20. package/r/html-viewer.json +3 -3
  21. package/r/looks-viewer.json +2 -2
  22. package/r/maquette-viewer.json +1 -1
  23. package/r/markdown-editor.json +3 -3
  24. package/r/mockup-viewer.json +1 -1
  25. package/r/pi-ambient.json +9 -9
  26. package/r/pi-app-kinds.json +10 -10
  27. package/r/pi-app.json +12 -12
  28. package/r/pi-artifacts.json +2 -2
  29. package/r/pi-chat-approval.json +2 -2
  30. package/r/pi-chat-attachments.json +1 -1
  31. package/r/pi-chat-markdown.json +2 -2
  32. package/r/pi-chat-mentions.json +1 -1
  33. package/r/pi-chat-pickers.json +1 -1
  34. package/r/pi-chat-plugins.json +11 -11
  35. package/r/pi-chat-question.json +1 -1
  36. package/r/pi-chat-slash.json +2 -2
  37. package/r/pi-chat-subagent.json +1 -1
  38. package/r/pi-chat-voice.json +9 -3
  39. package/r/pi-chat.json +11 -24
  40. package/r/pi-workspace.json +3 -3
  41. package/r/placed-agent.json +4 -4
  42. package/r/provider-setup.json +1 -1
  43. package/r/registry.json +1222 -1388
  44. package/r/shared-chat.json +6 -6
  45. package/r/spaces.json +44 -0
  46. package/r/task-list-viewer.json +2 -2
  47. package/r/version-history.json +2 -2
  48. package/r/viewer-code.json +2 -2
  49. package/r/viewer-frame.json +4 -4
  50. package/r/viewer-html.json +4 -4
  51. package/r/viewer-image.json +2 -2
  52. package/r/viewer-markdown.json +5 -5
  53. package/r/viewer-pdf.json +3 -3
  54. package/r/viewers.json +6 -6
  55. package/r/windows.json +1 -1
  56. package/dist/task-board.d.ts +0 -96
  57. package/dist/task-board.js +0 -48
  58. package/r/feedback-preview.json +0 -20
  59. package/r/pm-panel.json +0 -122
  60. package/r/requests-board.json +0 -33
  61. package/r/task-board.json +0 -41
  62. package/r/task-mentions.json +0 -25
package/r/registry.json CHANGED
@@ -253,7 +253,7 @@
253
253
  "lucide-react@^1.51.0"
254
254
  ],
255
255
  "registryDependencies": [
256
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
256
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
257
257
  ],
258
258
  "files": [
259
259
  {
@@ -274,8 +274,8 @@
274
274
  "title": "Markdown editor",
275
275
  "description": "A host-owned styled wrapper over the concrete borrowed Markdown controller.",
276
276
  "dependencies": [
277
- "@hachej/boring-ui-kit@^0.4.45",
278
- "@hachej/boring-files@^0.4.45",
277
+ "@hachej/boring-ui-kit@^0.4.47",
278
+ "@hachej/boring-files@^0.4.47",
279
279
  "react@^19.0.0",
280
280
  "react-dom@^19.0.0",
281
281
  "marked@^17.0.6",
@@ -431,7 +431,7 @@
431
431
  },
432
432
  "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.",
433
433
  "registryDependencies": [
434
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
434
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
435
435
  ]
436
436
  },
437
437
  {
@@ -440,8 +440,8 @@
440
440
  "title": "HTML source and passive preview",
441
441
  "description": "Exact HTML source editing with a reconstructed passive preview and borrowed controller. Browser security qualification remains separate.",
442
442
  "dependencies": [
443
- "@hachej/boring-ui-kit@^0.4.45",
444
- "@hachej/boring-files@^0.4.45",
443
+ "@hachej/boring-ui-kit@^0.4.47",
444
+ "@hachej/boring-files@^0.4.47",
445
445
  "react@^19.0.0",
446
446
  "react-dom@^19.0.0"
447
447
  ],
@@ -489,7 +489,7 @@
489
489
  }
490
490
  },
491
491
  "registryDependencies": [
492
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
492
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
493
493
  ]
494
494
  },
495
495
  {
@@ -498,9 +498,8 @@
498
498
  "title": "Pi chat",
499
499
  "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 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 question, approval, sub-agent and artifact cards are separate items (pi-chat-question, pi-chat-approval, pi-chat-subagent, pi-artifacts); without them a question or an approval shows a \"waiting for your answer\" notice, a sub-agent call is an ordinary tool step and no artifact is offered. The optional pi-ambient and pi-workspace blocks build on it.",
500
500
  "dependencies": [
501
- "@hachej/boring-ui-kit@^0.4.45",
502
- "@hachej/boring-files@^0.4.45",
503
- "@hachej/boring-feedback@^0.4.45",
501
+ "@hachej/boring-ui-kit@^0.4.47",
502
+ "@hachej/boring-files@^0.4.47",
504
503
  "react@^19.0.0",
505
504
  "react-dom@^19.0.0",
506
505
  "@base-ui/react@1.9.0",
@@ -513,8 +512,8 @@
513
512
  "zod@^4.6.5"
514
513
  ],
515
514
  "registryDependencies": [
516
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
517
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
515
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
516
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
518
517
  ],
519
518
  "files": [
520
519
  {
@@ -557,16 +556,6 @@
557
556
  "type": "registry:component",
558
557
  "target": "components/pi-chat/image-viewer.tsx"
559
558
  },
560
- {
561
- "path": "registry/pi-chat/feedback-content.ts",
562
- "type": "registry:lib",
563
- "target": "components/pi-chat/feedback-content.ts"
564
- },
565
- {
566
- "path": "registry/pi-chat/sent-feedback.tsx",
567
- "type": "registry:component",
568
- "target": "components/pi-chat/sent-feedback.tsx"
569
- },
570
559
  {
571
560
  "path": "registry/pi-chat/message.tsx",
572
561
  "type": "registry:component",
@@ -721,13 +710,13 @@
721
710
  "title": "Pi chat Markdown",
722
711
  "description": "Markdown for the chat's assistant replies: safe token-by-token rendering (raw HTML shown as text, no images fetched, http(s) links only), code blocks, tables, task lists and /command buttons. Plug it in with `renderText={markdownText}`; without it pi-chat shows replies as plain text.",
723
712
  "dependencies": [
724
- "@hachej/boring-ui-kit@^0.4.45",
713
+ "@hachej/boring-ui-kit@^0.4.47",
725
714
  "react@^19.0.0",
726
715
  "marked@^17.0.6",
727
716
  "entities@^8.1.0"
728
717
  ],
729
718
  "registryDependencies": [
730
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
719
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
731
720
  ],
732
721
  "files": [
733
722
  {
@@ -743,12 +732,12 @@
743
732
  "title": "Pi chat slash menu",
744
733
  "description": "The composer's `/` menu of commands and skills (and the Commands entry of the + menu). Plug it in with `slash={{ ...config, Picker: SlashPicker }}`; without it pi-chat has no `/` menu.",
745
734
  "dependencies": [
746
- "@hachej/boring-ui-kit@^0.4.45",
735
+ "@hachej/boring-ui-kit@^0.4.47",
747
736
  "react@^19.0.0",
748
737
  "lucide-react@^1.51.0"
749
738
  ],
750
739
  "registryDependencies": [
751
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
740
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
752
741
  ],
753
742
  "files": [
754
743
  {
@@ -768,7 +757,7 @@
768
757
  "lucide-react@^1.51.0"
769
758
  ],
770
759
  "registryDependencies": [
771
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
760
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
772
761
  ],
773
762
  "files": [
774
763
  {
@@ -788,7 +777,7 @@
788
777
  "lucide-react@^1.51.0"
789
778
  ],
790
779
  "registryDependencies": [
791
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
780
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
792
781
  ],
793
782
  "files": [
794
783
  {
@@ -804,13 +793,13 @@
804
793
  "title": "Pi chat voice messages",
805
794
  "description": "Tap-to-record voice messages: a compatibility export of the kit's chat-react/voice recorder hook, the composer's record button and the pending voice bubble, plus useHoldToRecord. Plug it in with `voiceMessage={{ ...config, ...voiceMessagePlugin }}`; without it pi-chat has no voice button.",
806
795
  "dependencies": [
807
- "@hachej/boring-ui-kit@^0.4.45",
796
+ "@hachej/boring-ui-kit@^0.4.47",
808
797
  "react@^19.0.0",
809
798
  "lucide-react@^1.51.0"
810
799
  ],
811
800
  "registryDependencies": [
812
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
813
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
801
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
802
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
814
803
  ],
815
804
  "files": [
816
805
  {
@@ -827,6 +816,11 @@
827
816
  "path": "registry/pi-chat-voice/voice-message.tsx",
828
817
  "type": "registry:component",
829
818
  "target": "components/pi-chat-voice/voice-message.tsx"
819
+ },
820
+ {
821
+ "path": "registry/pi-chat-voice/voice-input.tsx",
822
+ "type": "registry:component",
823
+ "target": "components/pi-chat-voice/voice-input.tsx"
830
824
  }
831
825
  ]
832
826
  },
@@ -841,7 +835,7 @@
841
835
  "lucide-react@^1.51.0"
842
836
  ],
843
837
  "registryDependencies": [
844
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
838
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
845
839
  ],
846
840
  "files": [
847
841
  {
@@ -862,7 +856,7 @@
862
856
  "@earendil-works/pi-ai@~1.4.0"
863
857
  ],
864
858
  "registryDependencies": [
865
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
859
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
866
860
  ],
867
861
  "files": [
868
862
  {
@@ -878,13 +872,13 @@
878
872
  "title": "Pi chat approval card",
879
873
  "description": "The Approve / Deny card for host tools wrapped with `requireApproval`. Plug it in with `cards={{ approval: ApprovalCard }}`; without it pi-chat shows a \"waiting for your answer\" notice with no answer UI.",
880
874
  "dependencies": [
881
- "@hachej/boring-ui-kit@^0.4.45",
875
+ "@hachej/boring-ui-kit@^0.4.47",
882
876
  "react@^19.0.0",
883
877
  "lucide-react@^1.51.0",
884
878
  "@earendil-works/pi-ai@~1.4.0"
885
879
  ],
886
880
  "registryDependencies": [
887
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
881
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
888
882
  ],
889
883
  "files": [
890
884
  {
@@ -905,7 +899,7 @@
905
899
  "@earendil-works/pi-ai@~1.4.0"
906
900
  ],
907
901
  "registryDependencies": [
908
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
902
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
909
903
  ],
910
904
  "files": [
911
905
  {
@@ -926,14 +920,14 @@
926
920
  "title": "Pi artifacts",
927
921
  "description": "Artifact descriptors, kinds and the artifact card that opens generated content in the host's panel. Plug it in with `artifacts={{ ...artifactCards, open, isOpen, kinds }}`; without it pi-chat offers no artifact. pi-app and the viewers import their artifact kinds and types from it.",
928
922
  "dependencies": [
929
- "@hachej/boring-ui-kit@^0.4.45",
923
+ "@hachej/boring-ui-kit@^0.4.47",
930
924
  "react@^19.0.0",
931
925
  "lucide-react@^1.51.0",
932
926
  "@earendil-works/pi-ai@~1.4.0",
933
927
  "@earendil-works/pi-durable@~1.4.0"
934
928
  ],
935
929
  "registryDependencies": [
936
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
930
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
937
931
  ],
938
932
  "files": [
939
933
  {
@@ -957,17 +951,17 @@
957
951
  "react@^19.0.0"
958
952
  ],
959
953
  "registryDependencies": [
960
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
961
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-markdown.json",
962
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-slash.json",
963
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-mentions.json",
964
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-pickers.json",
965
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-voice.json",
966
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-attachments.json",
967
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-question.json",
968
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-approval.json",
969
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-subagent.json",
970
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json"
954
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
955
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-markdown.json",
956
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-slash.json",
957
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-mentions.json",
958
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-pickers.json",
959
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-voice.json",
960
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-attachments.json",
961
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-question.json",
962
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-approval.json",
963
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-subagent.json",
964
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-artifacts.json"
971
965
  ],
972
966
  "files": [
973
967
  {
@@ -983,7 +977,7 @@
983
977
  "title": "Pi ambient agent",
984
978
  "description": "AmbientChat, a compact floating agent bar that grows into a chat window over an existing page, and AgentNotifications, toasts over the kit's shared chat-react run notifications (with the one guarded browser Notification helper). A block over the pi-chat item; its in-window artifact panel uses the pi-workspace layout.",
985
979
  "dependencies": [
986
- "@hachej/boring-ui-kit@^0.4.45",
980
+ "@hachej/boring-ui-kit@^0.4.47",
987
981
  "react@^19.0.0",
988
982
  "react-dom@^19.0.0",
989
983
  "@earendil-works/pi-durable@~1.4.0",
@@ -991,13 +985,13 @@
991
985
  "lucide-react@^1.51.0"
992
986
  ],
993
987
  "registryDependencies": [
994
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
995
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-plugins.json",
996
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-question.json",
997
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json",
998
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-workspace.json",
999
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
1000
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
988
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
989
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-plugins.json",
990
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-question.json",
991
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-artifacts.json",
992
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-workspace.json",
993
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
994
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
1001
995
  ],
1002
996
  "files": [
1003
997
  {
@@ -1026,7 +1020,7 @@
1026
1020
  "react@^19.0.0"
1027
1021
  ],
1028
1022
  "registryDependencies": [
1029
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
1023
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
1030
1024
  ],
1031
1025
  "files": [
1032
1026
  {
@@ -1046,9 +1040,9 @@
1046
1040
  "react-dom@^19.0.0"
1047
1041
  ],
1048
1042
  "registryDependencies": [
1049
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
1050
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
1051
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/dock.json"
1043
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
1044
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
1045
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/dock.json"
1052
1046
  ],
1053
1047
  "files": [
1054
1048
  {
@@ -1075,7 +1069,7 @@
1075
1069
  "zod@^4.6.5"
1076
1070
  ],
1077
1071
  "registryDependencies": [
1078
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json"
1072
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json"
1079
1073
  ],
1080
1074
  "files": [
1081
1075
  {
@@ -1120,8 +1114,8 @@
1120
1114
  "lucide-react@^1.51.0"
1121
1115
  ],
1122
1116
  "registryDependencies": [
1123
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/mockup-viewer.json",
1124
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
1117
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/mockup-viewer.json",
1118
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
1125
1119
  ],
1126
1120
  "files": [
1127
1121
  {
@@ -1220,7 +1214,7 @@
1220
1214
  "lucide-react@^1.51.0"
1221
1215
  ],
1222
1216
  "registryDependencies": [
1223
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/diagram-viewer.json"
1217
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/diagram-viewer.json"
1224
1218
  ],
1225
1219
  "files": [
1226
1220
  {
@@ -1285,17 +1279,17 @@
1285
1279
  "title": "Board viewer",
1286
1280
  "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.",
1287
1281
  "dependencies": [
1288
- "@hachej/boring-ui-kit@^0.4.45",
1289
- "@hachej/boring-files@^0.4.45",
1282
+ "@hachej/boring-ui-kit@^0.4.47",
1283
+ "@hachej/boring-files@^0.4.47",
1290
1284
  "react@^19.0.0",
1291
1285
  "lucide-react@1.51.0",
1292
1286
  "tldraw@5.5.2"
1293
1287
  ],
1294
1288
  "registryDependencies": [
1295
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/maquette-viewer.json",
1296
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/mockup-viewer.json",
1297
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json",
1298
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
1289
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/maquette-viewer.json",
1290
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/mockup-viewer.json",
1291
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-artifacts.json",
1292
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
1299
1293
  ],
1300
1294
  "files": [
1301
1295
  {
@@ -1331,16 +1325,16 @@
1331
1325
  "title": "Shared chat",
1332
1326
  "description": "Optional multi-party host log presentation over PiChat's generic composition seams. No agent runtime or speaking policy.",
1333
1327
  "dependencies": [
1334
- "@hachej/boring-ui-kit@^0.4.45",
1328
+ "@hachej/boring-ui-kit@^0.4.47",
1335
1329
  "react@^19.0.0",
1336
1330
  "lucide-react@^1.51.0"
1337
1331
  ],
1338
1332
  "registryDependencies": [
1339
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
1340
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-plugins.json",
1341
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-markdown.json",
1342
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-mentions.json",
1343
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
1333
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
1334
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-plugins.json",
1335
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-markdown.json",
1336
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-mentions.json",
1337
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
1344
1338
  ],
1345
1339
  "files": [
1346
1340
  {
@@ -1396,21 +1390,21 @@
1396
1390
  "title": "Pi agent app",
1397
1391
  "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 panel (versions, file viewer, auto-open of new artifacts) in the ArtifactWorkspace panel, a full-screen sheet on a phone; it draws files with the kinds the app passes in artifactKinds (defaultKinds of the pi-app-kinds item is the default list). 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).",
1398
1392
  "dependencies": [
1399
- "@hachej/boring-ui-kit@^0.4.45",
1400
- "@hachej/boring-files@^0.4.45",
1393
+ "@hachej/boring-ui-kit@^0.4.47",
1394
+ "@hachej/boring-files@^0.4.47",
1401
1395
  "react@^19.0.0",
1402
1396
  "react-dom@^19.0.0",
1403
1397
  "lucide-react@^1.51.0"
1404
1398
  ],
1405
1399
  "registryDependencies": [
1406
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
1407
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-plugins.json",
1408
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json",
1409
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-workspace.json",
1410
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
1411
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
1412
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json",
1413
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/file-tree.json"
1400
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
1401
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-plugins.json",
1402
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-artifacts.json",
1403
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-workspace.json",
1404
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
1405
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
1406
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json",
1407
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/file-tree.json"
1414
1408
  ],
1415
1409
  "files": [
1416
1410
  {
@@ -1496,16 +1490,16 @@
1496
1490
  "title": "Pi agent app default kinds",
1497
1491
  "description": "defaultKinds({ locale, comments }): the artifact kinds the pi-app item draws with by default, in order: maquette, diagram, mock-up and records, then Markdown, HTML, SVG, CSV, image and PDF (documentKinds). Pass it as AgentWorkspace's artifactKinds (or ViewerOptions.kinds), with an app's own kinds before it. Each kind loads its viewer on first open.",
1498
1492
  "registryDependencies": [
1499
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app.json",
1500
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-markdown.json",
1501
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-html.json",
1502
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-image.json",
1503
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-pdf.json",
1504
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-code.json",
1505
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/maquette-viewer.json",
1506
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/diagram-viewer.json",
1507
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/mockup-viewer.json",
1508
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/record-viewer.json"
1493
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-app.json",
1494
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-markdown.json",
1495
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-html.json",
1496
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-image.json",
1497
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-pdf.json",
1498
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-code.json",
1499
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/maquette-viewer.json",
1500
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/diagram-viewer.json",
1501
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/mockup-viewer.json",
1502
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/record-viewer.json"
1509
1503
  ],
1510
1504
  "files": [
1511
1505
  {
@@ -1526,10 +1520,10 @@
1526
1520
  "lucide-react@^1.51.0"
1527
1521
  ],
1528
1522
  "registryDependencies": [
1529
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app.json",
1530
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-ambient.json",
1531
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/app-shell.json",
1532
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
1523
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-app.json",
1524
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-ambient.json",
1525
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/app-shell.json",
1526
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
1533
1527
  ],
1534
1528
  "files": [
1535
1529
  {
@@ -1540,923 +1534,158 @@
1540
1534
  ]
1541
1535
  },
1542
1536
  {
1543
- "name": "app-shell",
1544
- "type": "registry:block",
1545
- "title": "App shell: layouts, list/detail and agent layer",
1546
- "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.",
1537
+ "name": "feedback",
1538
+ "type": "registry:component",
1539
+ "title": "Feedback",
1540
+ "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.",
1547
1541
  "dependencies": [
1548
- "@hachej/boring-feedback@^0.4.45",
1549
- "@hachej/boring-ui-kit@^0.4.45",
1550
- "@base-ui/react@^1.9.0",
1542
+ "@hachej/boring-feedback@^0.4.47",
1543
+ "@hachej/boring-ui-kit@^0.4.47",
1544
+ "@hachej/boring-files@^0.4.47",
1551
1545
  "react@^19.0.0",
1552
1546
  "react-dom@^19.0.0",
1553
1547
  "lucide-react@^1.51.0"
1554
1548
  ],
1555
- "registryDependencies": [
1556
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
1557
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-plugins.json",
1558
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-voice.json",
1559
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/dock.json",
1560
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pm-panel.json",
1561
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/feedback.json",
1562
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
1563
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
1564
- ],
1565
- "css": {
1566
- "@layer base": {
1567
- ".app-shell :where(*, ::before, ::after)": {
1568
- "border-color": "var(--border)"
1569
- },
1570
- ".app-shell :where(button, [role=button])": {
1571
- "appearance": "none",
1572
- "background-color": "transparent",
1573
- "border": "0 solid",
1574
- "font": "inherit",
1575
- "color": "inherit",
1576
- "cursor": "pointer",
1577
- "padding": "0"
1578
- },
1579
- ".app-shell :where(h2)": {
1580
- "margin": "0",
1581
- "font": "inherit"
1582
- }
1583
- },
1584
- "@layer utilities": {
1585
- "@media (width < 768px), (pointer: coarse)": {
1586
- ".app-shell :is([data-slot=\"button\"], [data-slot=\"toggle\"], [class~=\"group/button\"], [class~=\"group/toggle\"]):not([data-dense]):not([data-dense] *)": {
1587
- "min-height": "2.75rem",
1588
- "min-width": "2.75rem"
1589
- }
1590
- }
1591
- }
1592
- },
1593
1549
  "files": [
1594
1550
  {
1595
- "path": "registry/app-shell/agent-layer.tsx",
1551
+ "path": "registry/feedback/feedback-session.tsx",
1596
1552
  "type": "registry:component",
1597
- "target": "components/app-shell/agent-layer.tsx"
1553
+ "target": "components/feedback/feedback-session.tsx"
1598
1554
  },
1599
1555
  {
1600
- "path": "registry/app-shell/agent-context.ts",
1601
- "type": "registry:lib",
1602
- "target": "components/app-shell/agent-context.ts"
1556
+ "path": "registry/feedback/point-button.tsx",
1557
+ "type": "registry:component",
1558
+ "target": "components/feedback/point-button.tsx"
1603
1559
  },
1604
1560
  {
1605
- "path": "registry/app-shell/agent-link.ts",
1561
+ "path": "registry/feedback/picker-overlay.ts",
1606
1562
  "type": "registry:lib",
1607
- "target": "components/app-shell/agent-link.ts"
1563
+ "target": "components/feedback/picker-overlay.ts"
1608
1564
  },
1609
1565
  {
1610
- "path": "registry/app-shell/use-visual-viewport.ts",
1611
- "type": "registry:hook",
1612
- "target": "components/app-shell/use-visual-viewport.ts"
1566
+ "path": "registry/feedback/annotate-sheet.tsx",
1567
+ "type": "registry:component",
1568
+ "target": "components/feedback/annotate-sheet.tsx"
1613
1569
  },
1614
1570
  {
1615
- "path": "registry/app-shell/shell-layer.ts",
1616
- "type": "registry:lib",
1617
- "target": "components/app-shell/shell-layer.ts"
1571
+ "path": "registry/feedback/feedback-list.tsx",
1572
+ "type": "registry:component",
1573
+ "target": "components/feedback/feedback-list.tsx"
1618
1574
  },
1619
1575
  {
1620
- "path": "registry/app-shell/text.ts",
1621
- "type": "registry:lib",
1622
- "target": "components/app-shell/text.ts"
1576
+ "path": "registry/feedback/feedback-report.tsx",
1577
+ "type": "registry:component",
1578
+ "target": "components/feedback/feedback-report.tsx"
1623
1579
  },
1624
1580
  {
1625
- "path": "registry/app-shell/app-shell.tsx",
1626
- "type": "registry:component",
1627
- "target": "components/app-shell/app-shell.tsx"
1581
+ "path": "registry/feedback/use-external.ts",
1582
+ "type": "registry:hook",
1583
+ "target": "components/feedback/use-external.ts"
1628
1584
  },
1629
1585
  {
1630
- "path": "registry/app-shell/list-detail.tsx",
1586
+ "path": "registry/feedback/feedback-card.tsx",
1631
1587
  "type": "registry:component",
1632
- "target": "components/app-shell/list-detail.tsx"
1588
+ "target": "components/feedback/feedback-card.tsx"
1633
1589
  },
1634
1590
  {
1635
- "path": "registry/app-shell/header.tsx",
1636
- "type": "registry:component",
1637
- "target": "components/app-shell/header.tsx"
1591
+ "path": "registry/feedback/feedback-labels.ts",
1592
+ "type": "registry:lib",
1593
+ "target": "components/feedback/feedback-labels.ts"
1638
1594
  },
1639
1595
  {
1640
- "path": "registry/app-shell/header-actions.tsx",
1596
+ "path": "registry/feedback/point-mode.tsx",
1641
1597
  "type": "registry:component",
1642
- "target": "components/app-shell/header-actions.tsx"
1598
+ "target": "components/feedback/point-mode.tsx"
1643
1599
  },
1644
1600
  {
1645
- "path": "registry/app-shell/nav.tsx",
1646
- "type": "registry:component",
1647
- "target": "components/app-shell/nav.tsx"
1601
+ "path": "registry/feedback/feedback-content.ts",
1602
+ "type": "registry:lib",
1603
+ "target": "components/feedback/feedback-content.ts"
1648
1604
  },
1649
1605
  {
1650
- "path": "registry/app-shell/account.tsx",
1606
+ "path": "registry/feedback/sent-feedback.tsx",
1651
1607
  "type": "registry:component",
1652
- "target": "components/app-shell/account.tsx"
1608
+ "target": "components/feedback/sent-feedback.tsx"
1653
1609
  },
1654
1610
  {
1655
- "path": "registry/app-shell/app-sheet.tsx",
1611
+ "path": "registry/feedback/sent-content.tsx",
1656
1612
  "type": "registry:component",
1657
- "target": "components/app-shell/app-sheet.tsx"
1613
+ "target": "components/feedback/sent-content.tsx"
1614
+ }
1615
+ ],
1616
+ "css": {
1617
+ "[data-boring=\"feedback\"]": {
1618
+ "--boring-feedback-accent": "var(--primary)",
1619
+ "--boring-feedback-reveal": "var(--ring)",
1620
+ "--boring-feedback-surface": "var(--popover)",
1621
+ "--boring-feedback-text": "var(--popover-foreground)",
1622
+ "--boring-feedback-muted": "var(--muted-foreground)",
1623
+ "--boring-feedback-border": "var(--border)",
1624
+ "--boring-feedback-label-background": "var(--foreground)",
1625
+ "--boring-feedback-label-foreground": "var(--background)",
1626
+ "font-family": "inherit",
1627
+ "font-size": "var(--text-sm, 0.875rem)",
1628
+ "line-height": "var(--leading-normal, 1.5)",
1629
+ "color": "var(--boring-feedback-text)"
1658
1630
  },
1659
- {
1660
- "path": "registry/app-shell/use-exclusive-sheet.ts",
1661
- "type": "registry:hook",
1662
- "target": "components/app-shell/use-exclusive-sheet.ts"
1631
+ "@layer base": {
1632
+ "[data-boring=\"feedback\"] :where(button, [role=\"button\"])": {
1633
+ "appearance": "none",
1634
+ "background-color": "transparent",
1635
+ "border": "0",
1636
+ "padding": "0"
1637
+ }
1663
1638
  },
1664
- {
1665
- "path": "registry/app-shell/compact.ts",
1666
- "type": "registry:hook",
1667
- "target": "components/app-shell/compact.ts"
1639
+ "[data-boring=\"feedback\"] *, [data-boring=\"feedback\"] *::before, [data-boring=\"feedback\"] *::after": {
1640
+ "box-sizing": "border-box"
1668
1641
  },
1669
- {
1670
- "path": "registry/app-shell/index.ts",
1671
- "type": "registry:lib",
1672
- "target": "components/app-shell/index.ts"
1642
+ "[data-boring=\"feedback\"].boring-feedback-point": {
1643
+ "display": "inline-flex",
1644
+ "align-items": "center",
1645
+ "gap": "0.625rem"
1673
1646
  },
1674
- {
1675
- "path": "registry/app-shell/use-dictation.ts",
1676
- "type": "registry:hook",
1677
- "target": "components/app-shell/use-dictation.ts"
1678
- }
1679
- ]
1680
- },
1681
- {
1682
- "name": "viewer-frame",
1683
- "type": "registry:component",
1684
- "title": "Viewer frame",
1685
- "description": "The standard viewer top bar every viewer draws in (title, status, viewer controls, Refresh, Share, Copy, Download, Open in new tab, Close, overflow menu), its window labels, download, share and media helpers and the sandboxed interactive HTML frame. The viewers' styles live here. Each viewer is its own item (viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code) with a cheap kind module and a view loaded on first open.",
1686
- "dependencies": [
1687
- "@hachej/boring-ui-kit@^0.4.45",
1688
- "react@^19.0.0",
1689
- "react-dom@^19.0.0",
1690
- "lucide-react@^1.51.0"
1691
- ],
1692
- "registryDependencies": [
1693
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
1694
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json",
1695
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/version-history.json"
1696
- ],
1697
- "files": [
1698
- {
1699
- "path": "registry/viewer-frame/download.ts",
1700
- "type": "registry:lib",
1701
- "target": "components/viewer-frame/download.ts"
1647
+ "[data-boring=\"feedback\"] .boring-feedback-hint": {
1648
+ "max-width": "32rem",
1649
+ "overflow": "hidden",
1650
+ "text-overflow": "ellipsis",
1651
+ "white-space": "nowrap",
1652
+ "color": "var(--boring-feedback-muted)",
1653
+ "font-size": "var(--text-sm, 0.875rem)"
1702
1654
  },
1703
- {
1704
- "path": "registry/viewer-frame/interactive-html.tsx",
1705
- "type": "registry:component",
1706
- "target": "components/viewer-frame/interactive-html.tsx"
1655
+ "[data-boring=\"feedback\"] .boring-feedback-keys": {
1656
+ "opacity": "0.8"
1707
1657
  },
1708
- {
1709
- "path": "registry/viewer-frame/media.ts",
1710
- "type": "registry:lib",
1711
- "target": "components/viewer-frame/media.ts"
1658
+ "[data-boring=\"feedback\"]:is(.boring-feedback-sheet, .boring-feedback-report, .boring-feedback-list, .boring-feedback-bubble, .boring-feedback-review, .boring-feedback-banner, .boring-feedback-preview, .boring-feedback-bar)": {
1659
+ "padding-inline": "var(--card-spacing)"
1712
1660
  },
1713
- {
1714
- "path": "registry/viewer-frame/menu.tsx",
1715
- "type": "registry:component",
1716
- "target": "components/viewer-frame/menu.tsx"
1661
+ "[data-boring=\"feedback\"].boring-feedback-sheet": {
1662
+ "z-index": "2147483000",
1663
+ "max-height": "calc(100dvh - 24px)",
1664
+ "overflow": "auto"
1717
1665
  },
1718
- {
1719
- "path": "registry/viewer-frame/share.ts",
1720
- "type": "registry:lib",
1721
- "target": "components/viewer-frame/share.ts"
1666
+ "[data-boring=\"feedback\"].boring-feedback-sheet[data-docked=\"bottom\"]": {
1667
+ "position": "fixed",
1668
+ "left": "12px",
1669
+ "right": "12px",
1670
+ "bottom": "12px",
1671
+ "max-width": "32rem",
1672
+ "margin": "0 auto"
1722
1673
  },
1723
- {
1724
- "path": "registry/viewer-frame/viewer-frame.tsx",
1725
- "type": "registry:component",
1726
- "target": "components/viewer-frame/viewer-frame.tsx"
1674
+ "[data-boring=\"feedback\"] .boring-feedback-sheet-header": {
1675
+ "display": "flex",
1676
+ "align-items": "center",
1677
+ "justify-content": "space-between",
1678
+ "gap": "0.5rem"
1727
1679
  },
1728
- {
1729
- "path": "registry/viewer-frame/viewer-window.ts",
1730
- "type": "registry:lib",
1731
- "target": "components/viewer-frame/viewer-window.ts"
1680
+ "[data-boring=\"feedback\"] h2": {
1681
+ "margin": "0",
1682
+ "font-family": "var(--font-display, inherit)",
1683
+ "font-size": "var(--text-base, 1rem)",
1684
+ "font-weight": "var(--font-weight-semibold, 600)"
1732
1685
  },
1733
- {
1734
- "path": "registry/viewer-frame/viewer-labels-fr.ts",
1735
- "type": "registry:lib",
1736
- "target": "components/viewer-frame/viewer-labels-fr.ts"
1737
- }
1738
- ],
1739
- "css": {
1740
- "@layer utilities": {
1741
- "@media (width < 768px), (pointer: coarse)": {
1742
- ".boring-viewer :is([data-slot=\"button\"], [data-slot=\"toggle\"], [data-slot=\"toggle-group-item\"], [class~=\"group/button\"], [class~=\"group/toggle\"])": {
1743
- "min-height": "2.75rem",
1744
- "min-width": "2.75rem"
1745
- },
1746
- ".boring-viewer.boring-markdown-bubble :is([data-slot=\"button\"], [data-slot=\"toggle\"])": {
1747
- "min-height": "2.75rem",
1748
- "min-width": "2.75rem"
1749
- }
1750
- }
1751
- },
1752
- "@layer components": {
1753
- ".boring-viewer .boring-markdown-editor, .boring-viewer .boring-html-pane": {
1754
- "display": "flex",
1755
- "flex-direction": "column",
1756
- "flex": "1 1 auto",
1757
- "min-height": "0",
1758
- "min-width": "0",
1759
- "container-type": "inline-size"
1760
- },
1761
- ".boring-viewer .boring-markdown-surface": {
1762
- "flex": "1 1 auto",
1763
- "min-height": "0",
1764
- "overflow": "auto"
1765
- },
1766
- ".boring-viewer .boring-markdown-toolbar, .boring-viewer.boring-markdown-bubble": {
1767
- "display": "flex",
1768
- "flex": "none",
1769
- "align-items": "center",
1770
- "gap": "0.25rem",
1771
- "max-width": "calc(100vw - 24px)"
1772
- },
1773
- ".boring-viewer .boring-markdown-toolbar": {
1774
- "padding": "0.375rem 1.5rem 0.375rem 0.75rem",
1775
- "overflow-x": "auto",
1776
- "scrollbar-width": "none",
1777
- "mask-image": "linear-gradient(to right, black calc(100% - 2rem), transparent)"
1778
- },
1779
- ".boring-viewer .boring-markdown-toolbar::-webkit-scrollbar": {
1780
- "display": "none"
1781
- },
1782
- ".boring-viewer .boring-markdown-tool": {
1783
- "flex": "none"
1784
- },
1785
- ".boring-viewer .boring-markdown-separator": {
1786
- "flex": "none",
1787
- "margin-inline": "0.25rem"
1788
- },
1789
- ".boring-viewer span.boring-markdown-separator": {
1790
- "width": "0.5rem",
1791
- "margin": "0"
1792
- },
1793
- ".boring-viewer .boring-markdown-icon": {
1794
- "display": "block"
1795
- },
1796
- ".boring-viewer .boring-markdown-link, .boring-viewer .boring-markdown-alert, .boring-viewer .boring-markdown-proposal, .boring-viewer [data-boring=\"text-draft-controls\"]": {
1797
- "display": "flex",
1798
- "flex": "none",
1799
- "flex-wrap": "wrap",
1800
- "align-items": "center",
1801
- "gap": "0.5rem",
1802
- "padding": "0.5rem 0.75rem"
1803
- },
1804
- ".boring-viewer .boring-markdown-link [data-slot=\"input\"]": {
1805
- "flex": "1 1 14rem",
1806
- "min-width": "0"
1807
- },
1808
- ".boring-viewer .boring-markdown-notice": {
1809
- "margin": "0.75rem"
1810
- },
1811
- ".boring-viewer .boring-markdown-proposal :is(h3, details)": {
1812
- "flex": "1 1 100%",
1813
- "min-width": "0"
1814
- },
1815
- ".boring-viewer .boring-markdown-proposal pre": {
1816
- "max-height": "12rem",
1817
- "overflow": "auto",
1818
- "white-space": "pre-wrap"
1819
- },
1820
- ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"]": {
1821
- "display": "none"
1822
- },
1823
- "@container (min-width: 46rem)": {
1824
- ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"]": {
1825
- "display": "block",
1826
- "flex": "none",
1827
- "overflow-x": "auto",
1828
- "padding": "0.375rem 0.75rem"
1829
- },
1830
- ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"] ol": {
1831
- "display": "flex",
1832
- "gap": "0.25rem",
1833
- "list-style": "none",
1834
- "margin": "0",
1835
- "padding": "0"
1836
- }
1837
- },
1838
- ".boring-viewer .boring-markdown-source, .boring-viewer .boring-html-viewer__source": {
1839
- "flex": "1 1 auto",
1840
- "width": "100%",
1841
- "min-height": "0",
1842
- "resize": "none"
1843
- },
1844
- ".boring-viewer .boring-markdown-content": {
1845
- "max-width": "68ch",
1846
- "min-height": "100%",
1847
- "margin": "0 auto",
1848
- "padding": "1.5rem 1.5rem 3rem",
1849
- "overflow-wrap": "anywhere",
1850
- "color": "var(--foreground)",
1851
- "font-size": "var(--text-base)",
1852
- "line-height": "var(--leading-relaxed)"
1853
- },
1854
- ".boring-viewer .boring-markdown-content:focus": {
1855
- "outline": "none"
1856
- },
1857
- ".boring-viewer .boring-markdown-content > :first-child": {
1858
- "margin-top": "0"
1859
- },
1860
- ".boring-viewer .boring-markdown-content p": {
1861
- "margin": "0.75rem 0"
1862
- },
1863
- ".boring-viewer .boring-markdown-content p.is-editor-empty:first-child::before": {
1864
- "content": "attr(data-placeholder)",
1865
- "float": "left",
1866
- "height": "0",
1867
- "color": "var(--muted-foreground)",
1868
- "pointer-events": "none"
1869
- },
1870
- ".boring-viewer .boring-markdown-content :is(h1, h2, h3, h4, h5, h6)": {
1871
- "font-weight": "var(--font-weight-semibold)",
1872
- "line-height": "var(--leading-tight)"
1873
- },
1874
- ".boring-viewer .boring-markdown-content h1": {
1875
- "margin": "1.75rem 0 0.75rem",
1876
- "font-size": "var(--text-2xl)"
1877
- },
1878
- ".boring-viewer .boring-markdown-content h2": {
1879
- "margin": "2rem 0 0.75rem",
1880
- "font-size": "var(--text-xl)"
1881
- },
1882
- ".boring-viewer .boring-markdown-content h3": {
1883
- "margin": "1.25rem 0 0.5rem",
1884
- "font-size": "var(--text-lg)"
1885
- },
1886
- ".boring-viewer .boring-markdown-content :is(h4, h5, h6)": {
1887
- "margin": "1rem 0 0.4rem",
1888
- "font-size": "var(--text-base)"
1889
- },
1890
- ".boring-viewer .boring-markdown-content :is(ul, ol)": {
1891
- "margin": "0.75rem 0",
1892
- "padding-left": "1.5rem"
1893
- },
1894
- ".boring-viewer .boring-markdown-content ul": {
1895
- "list-style": "disc"
1896
- },
1897
- ".boring-viewer .boring-markdown-content ol": {
1898
- "list-style": "decimal"
1899
- },
1900
- ".boring-viewer .boring-markdown-content li": {
1901
- "margin": "0.25rem 0"
1902
- },
1903
- ".boring-viewer .boring-markdown-content li > p": {
1904
- "margin": "0"
1905
- },
1906
- ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"]": {
1907
- "padding-left": "0",
1908
- "list-style": "none"
1909
- },
1910
- ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li": {
1911
- "display": "flex",
1912
- "align-items": "flex-start",
1913
- "gap": "0.5rem"
1914
- },
1915
- ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > label": {
1916
- "display": "inline-flex",
1917
- "flex": "none",
1918
- "align-items": "center",
1919
- "height": "1.7em",
1920
- "margin": "0",
1921
- "user-select": "none"
1922
- },
1923
- ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]": {
1924
- "width": "1rem",
1925
- "height": "1rem",
1926
- "margin": "0",
1927
- "accent-color": "var(--primary)",
1928
- "cursor": "pointer"
1929
- },
1930
- ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > div": {
1931
- "flex": "1 1 auto",
1932
- "min-width": "0"
1933
- },
1934
- ".boring-viewer .boring-markdown-content li[data-checked=\"true\"] > div": {
1935
- "color": "var(--muted-foreground)",
1936
- "text-decoration": "line-through"
1937
- },
1938
- ".boring-viewer .boring-markdown-content strong": {
1939
- "font-weight": "var(--font-weight-semibold)"
1940
- },
1941
- ".boring-viewer .boring-markdown-content code": {
1942
- "padding": "0.1em 0.35em",
1943
- "border-radius": "var(--radius-sm)",
1944
- "background": "var(--muted)",
1945
- "font-family": "var(--font-mono)",
1946
- "font-size": "var(--text-sm)"
1947
- },
1948
- ".boring-viewer .boring-markdown-content pre": {
1949
- "margin": "1rem 0",
1950
- "padding": "0.875rem 1rem",
1951
- "overflow-x": "auto",
1952
- "border": "var(--default-border-width) solid var(--border)",
1953
- "border-radius": "var(--radius-lg)",
1954
- "background": "var(--muted)",
1955
- "font-family": "var(--font-mono)",
1956
- "font-size": "var(--text-sm)"
1957
- },
1958
- ".boring-viewer .boring-markdown-content pre code": {
1959
- "padding": "0",
1960
- "background": "transparent",
1961
- "font": "inherit"
1962
- },
1963
- ".boring-viewer .boring-markdown-content blockquote": {
1964
- "margin": "1rem 0",
1965
- "padding": "0.5rem 1rem",
1966
- "border-inline-start": "var(--default-border-width) solid var(--border)",
1967
- "color": "var(--muted-foreground)"
1968
- },
1969
- ".boring-viewer .boring-markdown-content a": {
1970
- "color": "var(--foreground)",
1971
- "text-decoration": "underline",
1972
- "cursor": "text"
1973
- },
1974
- ".boring-viewer .boring-markdown-content hr": {
1975
- "margin": "1.5rem 0",
1976
- "border": "0",
1977
- "border-top": "var(--default-border-width) solid var(--border)"
1978
- },
1979
- ".boring-viewer .boring-markdown-content mark": {
1980
- "background": "var(--accent)",
1981
- "color": "var(--accent-foreground)"
1982
- },
1983
- ".boring-viewer .boring-markdown-content .tableWrapper": {
1984
- "margin": "1rem 0",
1985
- "overflow-x": "auto"
1986
- },
1987
- ".boring-viewer .boring-markdown-content table": {
1988
- "width": "100%",
1989
- "border-collapse": "collapse",
1990
- "font-size": "var(--text-sm)"
1991
- },
1992
- ".boring-viewer .boring-markdown-content :is(th, td)": {
1993
- "min-width": "4rem",
1994
- "padding": "0.5rem 0.75rem",
1995
- "border": "var(--default-border-width) solid var(--border)",
1996
- "text-align": "left",
1997
- "vertical-align": "top"
1998
- },
1999
- ".boring-viewer .boring-markdown-content th": {
2000
- "background": "var(--muted)",
2001
- "font-weight": "var(--font-weight-semibold)"
2002
- },
2003
- ".boring-viewer .boring-markdown-content :is(th, td) > p": {
2004
- "margin": "0"
2005
- },
2006
- ".boring-viewer .boring-markdown-content .selectedCell": {
2007
- "background": "var(--accent)"
2008
- },
2009
- ".boring-viewer .boring-markdown-content img": {
2010
- "display": "block",
2011
- "max-width": "100%",
2012
- "height": "auto",
2013
- "margin": "1rem 0"
2014
- },
2015
- ".boring-viewer .boring-markdown-content .boring-markdown-preserved": {
2016
- "margin": "0.75rem 0",
2017
- "color": "var(--muted-foreground)",
2018
- "font-family": "var(--font-mono)",
2019
- "font-size": "var(--text-sm)"
2020
- },
2021
- ".boring-viewer .boring-markdown-content .boring-markdown-preserved small": {
2022
- "font-size": "var(--text-xs)"
2023
- },
2024
- ".boring-viewer .boring-markdown-content .boring-markdown-preserved pre": {
2025
- "margin": "0.25rem 0",
2026
- "padding": "0.5rem 0.75rem",
2027
- "white-space": "pre-wrap",
2028
- "overflow-wrap": "anywhere"
2029
- },
2030
- ".boring-viewer .boring-markdown-content .boring-markdown-preserved-inline": {
2031
- "color": "var(--muted-foreground)",
2032
- "font-family": "var(--font-mono)",
2033
- "font-size": "var(--text-sm)"
2034
- },
2035
- ".boring-viewer .boring-markdown-content .boring-markdown-image": {
2036
- "display": "inline-flex",
2037
- "max-width": "100%",
2038
- "margin": "0.125rem 0",
2039
- "padding": "0.125rem 0.5rem",
2040
- "background": "var(--muted)",
2041
- "color": "var(--muted-foreground)"
2042
- },
2043
- ".boring-viewer .boring-html-viewer__preview": {
2044
- "display": "flex",
2045
- "flex": "1 1 auto",
2046
- "flex-direction": "column",
2047
- "min-height": "0"
2048
- },
2049
- ".boring-viewer .boring-html-viewer__preview > p": {
2050
- "flex": "none",
2051
- "margin": "0",
2052
- "padding": "0.375rem 0.75rem"
2053
- },
2054
- ".boring-viewer .boring-html-viewer__preview > div": {
2055
- "display": "flex",
2056
- "flex": "1 1 auto",
2057
- "min-height": "0"
2058
- },
2059
- ".boring-viewer .boring-html-viewer__frame": {
2060
- "flex": "1 1 auto",
2061
- "width": "100%",
2062
- "height": "100%",
2063
- "min-height": "0",
2064
- "border": "0"
2065
- },
2066
- ".boring-viewer .boring-viewer-checker": {
2067
- "background-color": "var(--background)",
2068
- "background-image": "linear-gradient(45deg, var(--muted) 25%, transparent 25%, transparent 75%, var(--muted) 75%), linear-gradient(45deg, var(--muted) 25%, transparent 25%, transparent 75%, var(--muted) 75%)",
2069
- "background-position": "0 0, 8px 8px",
2070
- "background-size": "16px 16px"
2071
- },
2072
- ".boring-viewer .boring-viewer-stage": {
2073
- "overflow": "auto"
2074
- },
2075
- "@media (width < 768px)": {
2076
- ".boring-viewer .boring-markdown-content": {
2077
- "padding": "1.25rem 1.25rem 3rem"
2078
- },
2079
- ".boring-viewer .boring-markdown-toolbar": {
2080
- "display": "none"
2081
- },
2082
- ".boring-viewer.boring-markdown-dock": {
2083
- "display": "flex",
2084
- "align-items": "center",
2085
- "gap": "0.125rem",
2086
- "overflow-x": "auto",
2087
- "scrollbar-width": "none",
2088
- "position": "fixed",
2089
- "inset-inline": "0",
2090
- "z-index": "50",
2091
- "padding": "0.25rem 1.5rem 0.25rem 0.5rem",
2092
- "padding-bottom": "calc(0.25rem + env(safe-area-inset-bottom, 0px))",
2093
- "background": "var(--background)",
2094
- "mask-image": "linear-gradient(to right, black calc(100% - 2rem), transparent)"
2095
- },
2096
- ".boring-viewer.boring-markdown-dock[data-keyboard]": {
2097
- "padding-bottom": "0.25rem"
2098
- },
2099
- ".boring-viewer.boring-markdown-dock > .boring-markdown-dock-rule": {
2100
- "position": "absolute",
2101
- "inset-inline": "0",
2102
- "top": "0"
2103
- },
2104
- ".boring-viewer [data-boring=\"markdown-editor\"][data-dock] .boring-markdown-content": {
2105
- "padding-bottom": "6rem"
2106
- }
2107
- }
2108
- }
2109
- }
2110
- },
2111
- {
2112
- "name": "viewer-markdown",
2113
- "type": "registry:component",
2114
- "title": "Markdown viewer",
2115
- "description": "The Markdown kind: `markdownKind` (match, loader) and `MarkdownPane`, the tiptap editor with a formatting toolbar and prose styling over the kit's revisioned Markdown controller, in the viewer frame. The pane and tiptap load the first time a Markdown file opens.",
2116
- "dependencies": [
2117
- "@hachej/boring-ui-kit@^0.4.45",
2118
- "react@^19.0.0",
2119
- "lucide-react@^1.51.0",
2120
- "marked@^17.0.6",
2121
- "@tiptap/core@^3.31.4",
2122
- "@tiptap/react@^3.31.4",
2123
- "@tiptap/pm@^3.31.4",
2124
- "@tiptap/starter-kit@^3.31.4",
2125
- "@tiptap/markdown@^3.31.4",
2126
- "@tiptap/extensions@^3.31.4",
2127
- "@tiptap/extension-list@^3.31.4",
2128
- "@tiptap/extension-table@^3.31.4",
2129
- "@tiptap/extension-image@^3.31.4",
2130
- "@tiptap/extension-highlight@^3.31.4",
2131
- "@tiptap/extension-bubble-menu@^3.31.4",
2132
- "@tiptap/extension-floating-menu@^3.31.4"
2133
- ],
2134
- "registryDependencies": [
2135
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2136
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/markdown-editor.json",
2137
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
2138
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
2139
- ],
2140
- "files": [
2141
- {
2142
- "path": "registry/viewer-markdown/markdown-kind.ts",
2143
- "type": "registry:lib",
2144
- "target": "components/viewer-markdown/markdown-kind.ts"
2145
- },
2146
- {
2147
- "path": "registry/viewer-markdown/markdown-pane.tsx",
2148
- "type": "registry:component",
2149
- "target": "components/viewer-markdown/markdown-pane.tsx"
2150
- }
2151
- ]
2152
- },
2153
- {
2154
- "name": "viewer-html",
2155
- "type": "registry:component",
2156
- "title": "HTML viewer",
2157
- "description": "The HTML kind: `htmlKind` (match, loader) and `HtmlPane`, the passive HTML preview (sandboxed when the host opts in) and source editor, in the viewer frame. The pane loads the first time an HTML file opens.",
2158
- "dependencies": [
2159
- "@hachej/boring-ui-kit@^0.4.45",
2160
- "react@^19.0.0",
2161
- "lucide-react@^1.51.0"
2162
- ],
2163
- "registryDependencies": [
2164
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2165
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
2166
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
2167
- ],
2168
- "files": [
2169
- {
2170
- "path": "registry/viewer-html/html-kind.ts",
2171
- "type": "registry:lib",
2172
- "target": "components/viewer-html/html-kind.ts"
2173
- },
2174
- {
2175
- "path": "registry/viewer-html/html-pane.tsx",
2176
- "type": "registry:component",
2177
- "target": "components/viewer-html/html-pane.tsx"
2178
- }
2179
- ]
2180
- },
2181
- {
2182
- "name": "viewer-image",
2183
- "type": "registry:component",
2184
- "title": "Image viewer",
2185
- "description": "The image kind: `imageKind` (match on PNG, JPEG, GIF, WebP and SVG, loader) and `ImagePane`, zoom and pan in the viewer frame. The pane loads the first time an image opens.",
2186
- "dependencies": [
2187
- "react@^19.0.0",
2188
- "lucide-react@^1.51.0"
2189
- ],
2190
- "registryDependencies": [
2191
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2192
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
2193
- ],
2194
- "files": [
2195
- {
2196
- "path": "registry/viewer-image/image-kind.ts",
2197
- "type": "registry:lib",
2198
- "target": "components/viewer-image/image-kind.ts"
2199
- },
2200
- {
2201
- "path": "registry/viewer-image/image-types.ts",
2202
- "type": "registry:lib",
2203
- "target": "components/viewer-image/image-types.ts"
2204
- },
2205
- {
2206
- "path": "registry/viewer-image/image-pane.tsx",
2207
- "type": "registry:component",
2208
- "target": "components/viewer-image/image-pane.tsx"
2209
- }
2210
- ]
2211
- },
2212
- {
2213
- "name": "viewer-pdf",
2214
- "type": "registry:component",
2215
- "title": "PDF viewer",
2216
- "description": "The PDF kind: `pdfKind` (match, loader) and `PdfPane` in the viewer frame (the browser's viewer, or pdf.js pages where there is none), and LocalFileViewer for browser-only files. The pane loads the first time a PDF opens.",
2217
- "dependencies": [
2218
- "@hachej/boring-files@^0.4.45",
2219
- "react@^19.0.0",
2220
- "lucide-react@^1.51.0",
2221
- "pdfjs-dist@6.4.299"
2222
- ],
2223
- "registryDependencies": [
2224
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2225
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-image.json"
2226
- ],
2227
- "files": [
2228
- {
2229
- "path": "registry/viewer-pdf/pdf-kind.ts",
2230
- "type": "registry:lib",
2231
- "target": "components/viewer-pdf/pdf-kind.ts"
2232
- },
2233
- {
2234
- "path": "registry/viewer-pdf/pdf-pane.tsx",
2235
- "type": "registry:component",
2236
- "target": "components/viewer-pdf/pdf-pane.tsx"
2237
- },
2238
- {
2239
- "path": "registry/viewer-pdf/pdf-pages.tsx",
2240
- "type": "registry:component",
2241
- "target": "components/viewer-pdf/pdf-pages.tsx"
2242
- },
2243
- {
2244
- "path": "registry/viewer-pdf/local-file-viewer.tsx",
2245
- "type": "registry:component",
2246
- "target": "components/viewer-pdf/local-file-viewer.tsx"
2247
- }
2248
- ]
2249
- },
2250
- {
2251
- "name": "viewer-code",
2252
- "type": "registry:component",
2253
- "title": "Code viewers",
2254
- "description": "The SVG and CSV kinds: `svgKind` (a preview from a blob URL, or its source) and `csvKind` (a table), drawn inside the artifact panel's bar. Each view loads the first time its artifact opens; other code stays in the panel's code block.",
2255
- "dependencies": [
2256
- "react@^19.0.0",
2257
- "lucide-react@^1.51.0"
2258
- ],
2259
- "registryDependencies": [
2260
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2261
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
2262
- ],
2263
- "files": [
2264
- {
2265
- "path": "registry/viewer-code/code-kinds.ts",
2266
- "type": "registry:lib",
2267
- "target": "components/viewer-code/code-kinds.ts"
2268
- },
2269
- {
2270
- "path": "registry/viewer-code/svg-view.tsx",
2271
- "type": "registry:component",
2272
- "target": "components/viewer-code/svg-view.tsx"
2273
- },
2274
- {
2275
- "path": "registry/viewer-code/csv-table.tsx",
2276
- "type": "registry:component",
2277
- "target": "components/viewer-code/csv-table.tsx"
2278
- }
2279
- ]
2280
- },
2281
- {
2282
- "name": "viewers",
2283
- "type": "registry:component",
2284
- "title": "Viewers",
2285
- "description": "Deprecated aggregate: installs every viewer item (viewer-frame, viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code). Add the items you use instead.",
2286
- "files": [],
2287
- "registryDependencies": [
2288
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2289
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-markdown.json",
2290
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-html.json",
2291
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-image.json",
2292
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-pdf.json",
2293
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-code.json"
2294
- ]
2295
- },
2296
- {
2297
- "name": "provider-setup",
2298
- "type": "registry:component",
2299
- "title": "Provider setup",
2300
- "description": "A shadcn popover for configuring model access: pick any registered Pi provider and model, save an API key (masked, shows \"saved\"), run a device-code subscription sign-in (code, link and status), set an optional gateway and see when a provider needs one. Transport-agnostic: props in, callbacks out, no fetch. Owned, editable source; fits the pi-chat controls slot.",
2301
- "dependencies": [
2302
- "react@^19.0.0",
2303
- "react-dom@^19.0.0",
2304
- "lucide-react@^1.51.0"
2305
- ],
2306
- "registryDependencies": [
2307
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
2308
- ],
2309
- "files": [
2310
- {
2311
- "path": "registry/provider-setup/provider-setup.tsx",
2312
- "type": "registry:component",
2313
- "target": "components/provider-setup/provider-setup.tsx"
2314
- }
2315
- ]
2316
- },
2317
- {
2318
- "name": "feedback",
2319
- "type": "registry:component",
2320
- "title": "Feedback",
2321
- "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.",
2322
- "dependencies": [
2323
- "@hachej/boring-feedback@^0.4.45",
2324
- "@hachej/boring-ui-kit@^0.4.45",
2325
- "@hachej/boring-files@^0.4.45",
2326
- "react@^19.0.0",
2327
- "react-dom@^19.0.0",
2328
- "lucide-react@^1.51.0"
2329
- ],
2330
- "files": [
2331
- {
2332
- "path": "registry/feedback/feedback-session.tsx",
2333
- "type": "registry:component",
2334
- "target": "components/feedback/feedback-session.tsx"
2335
- },
2336
- {
2337
- "path": "registry/feedback/point-button.tsx",
2338
- "type": "registry:component",
2339
- "target": "components/feedback/point-button.tsx"
2340
- },
2341
- {
2342
- "path": "registry/feedback/picker-overlay.ts",
2343
- "type": "registry:lib",
2344
- "target": "components/feedback/picker-overlay.ts"
2345
- },
2346
- {
2347
- "path": "registry/feedback/annotate-sheet.tsx",
2348
- "type": "registry:component",
2349
- "target": "components/feedback/annotate-sheet.tsx"
2350
- },
2351
- {
2352
- "path": "registry/feedback/feedback-list.tsx",
2353
- "type": "registry:component",
2354
- "target": "components/feedback/feedback-list.tsx"
2355
- },
2356
- {
2357
- "path": "registry/feedback/feedback-report.tsx",
2358
- "type": "registry:component",
2359
- "target": "components/feedback/feedback-report.tsx"
2360
- },
2361
- {
2362
- "path": "registry/feedback/use-external.ts",
2363
- "type": "registry:hook",
2364
- "target": "components/feedback/use-external.ts"
2365
- },
2366
- {
2367
- "path": "registry/feedback/feedback-card.tsx",
2368
- "type": "registry:component",
2369
- "target": "components/feedback/feedback-card.tsx"
2370
- },
2371
- {
2372
- "path": "registry/feedback/voice-input.tsx",
2373
- "type": "registry:component",
2374
- "target": "components/feedback/voice-input.tsx"
2375
- },
2376
- {
2377
- "path": "registry/feedback/feedback-labels.ts",
2378
- "type": "registry:lib",
2379
- "target": "components/feedback/feedback-labels.ts"
2380
- },
2381
- {
2382
- "path": "registry/feedback/point-mode.tsx",
2383
- "type": "registry:component",
2384
- "target": "components/feedback/point-mode.tsx"
2385
- }
2386
- ],
2387
- "css": {
2388
- "[data-boring=\"feedback\"]": {
2389
- "--boring-feedback-accent": "var(--primary)",
2390
- "--boring-feedback-reveal": "var(--ring)",
2391
- "--boring-feedback-surface": "var(--popover)",
2392
- "--boring-feedback-text": "var(--popover-foreground)",
2393
- "--boring-feedback-muted": "var(--muted-foreground)",
2394
- "--boring-feedback-border": "var(--border)",
2395
- "--boring-feedback-label-background": "var(--foreground)",
2396
- "--boring-feedback-label-foreground": "var(--background)",
2397
- "font-family": "inherit",
2398
- "font-size": "var(--text-sm, 0.875rem)",
2399
- "line-height": "var(--leading-normal, 1.5)",
2400
- "color": "var(--boring-feedback-text)"
2401
- },
2402
- "@layer base": {
2403
- "[data-boring=\"feedback\"] :where(button, [role=\"button\"])": {
2404
- "appearance": "none",
2405
- "background-color": "transparent",
2406
- "border": "0",
2407
- "padding": "0"
2408
- }
2409
- },
2410
- "[data-boring=\"feedback\"] *, [data-boring=\"feedback\"] *::before, [data-boring=\"feedback\"] *::after": {
2411
- "box-sizing": "border-box"
2412
- },
2413
- "[data-boring=\"feedback\"].boring-feedback-point": {
2414
- "display": "inline-flex",
2415
- "align-items": "center",
2416
- "gap": "0.625rem"
2417
- },
2418
- "[data-boring=\"feedback\"] .boring-feedback-hint": {
2419
- "max-width": "32rem",
2420
- "overflow": "hidden",
2421
- "text-overflow": "ellipsis",
2422
- "white-space": "nowrap",
2423
- "color": "var(--boring-feedback-muted)",
2424
- "font-size": "var(--text-sm, 0.875rem)"
2425
- },
2426
- "[data-boring=\"feedback\"] .boring-feedback-keys": {
2427
- "opacity": "0.8"
2428
- },
2429
- "[data-boring=\"feedback\"]:is(.boring-feedback-sheet, .boring-feedback-report, .boring-feedback-list, .boring-feedback-bubble, .boring-feedback-review, .boring-feedback-banner, .boring-feedback-preview, .boring-feedback-bar)": {
2430
- "padding-inline": "var(--card-spacing)"
2431
- },
2432
- "[data-boring=\"feedback\"].boring-feedback-sheet": {
2433
- "z-index": "2147483000",
2434
- "max-height": "calc(100dvh - 24px)",
2435
- "overflow": "auto"
2436
- },
2437
- "[data-boring=\"feedback\"].boring-feedback-sheet[data-docked=\"bottom\"]": {
2438
- "position": "fixed",
2439
- "left": "12px",
2440
- "right": "12px",
2441
- "bottom": "12px",
2442
- "max-width": "32rem",
2443
- "margin": "0 auto"
2444
- },
2445
- "[data-boring=\"feedback\"] .boring-feedback-sheet-header": {
2446
- "display": "flex",
2447
- "align-items": "center",
2448
- "justify-content": "space-between",
2449
- "gap": "0.5rem"
2450
- },
2451
- "[data-boring=\"feedback\"] h2": {
2452
- "margin": "0",
2453
- "font-family": "var(--font-display, inherit)",
2454
- "font-size": "var(--text-base, 1rem)",
2455
- "font-weight": "var(--font-weight-semibold, 600)"
2456
- },
2457
- "[data-boring=\"feedback\"] h3": {
2458
- "margin": "0 0 0.25rem",
2459
- "font-size": "var(--text-sm, 0.875rem)"
1686
+ "[data-boring=\"feedback\"] h3": {
1687
+ "margin": "0 0 0.25rem",
1688
+ "font-size": "var(--text-sm, 0.875rem)"
2460
1689
  },
2461
1690
  "[data-boring=\"feedback\"] .boring-feedback-targets": {
2462
1691
  "margin": "0",
@@ -2543,273 +1772,1034 @@
2543
1772
  "[data-boring=\"feedback\"] .boring-feedback-anchors > li": {
2544
1773
  "display": "flex",
2545
1774
  "flex-wrap": "wrap",
2546
- "align-items": "center",
1775
+ "align-items": "center",
1776
+ "gap": "0.5rem"
1777
+ },
1778
+ "[data-boring=\"feedback\"] .boring-feedback-anchors code": {
1779
+ "font-size": "var(--text-xs, 0.75rem)",
1780
+ "color": "var(--boring-feedback-muted)"
1781
+ },
1782
+ "[data-boring=\"feedback\"] .boring-feedback-candidates": {
1783
+ "display": "flex",
1784
+ "flex-wrap": "wrap",
1785
+ "gap": "0.375rem",
1786
+ "margin": "0.375rem 0 0",
1787
+ "padding": "0",
1788
+ "list-style": "none"
1789
+ },
1790
+ "[data-boring=\"feedback\"].boring-feedback-bar": {
1791
+ "position": "fixed",
1792
+ "top": "12px",
1793
+ "left": "0",
1794
+ "right": "0",
1795
+ "z-index": "2147483000",
1796
+ "flex-direction": "row",
1797
+ "flex-wrap": "nowrap",
1798
+ "align-items": "center",
1799
+ "gap": "0.5rem",
1800
+ "width": "max-content",
1801
+ "max-width": "calc(100vw - 24px)",
1802
+ "margin": "0 auto"
1803
+ },
1804
+ "[data-boring=\"feedback\"].boring-feedback-bar[data-docked=\"true\"]": {
1805
+ "position": "static",
1806
+ "width": "auto",
1807
+ "max-width": "none",
1808
+ "margin": "0 0.625rem 0.625rem",
1809
+ "flex-wrap": "wrap"
1810
+ },
1811
+ "[data-boring=\"feedback\"].boring-feedback-bar > *": {
1812
+ "flex": "none"
1813
+ },
1814
+ "[data-boring=\"feedback\"].boring-feedback-bar > .boring-feedback-hint": {
1815
+ "flex": "0 1 auto",
1816
+ "min-width": "0",
1817
+ "max-width": "24rem"
1818
+ },
1819
+ "[data-boring=\"feedback\"] .boring-feedback-bar-title": {
1820
+ "display": "inline-flex",
1821
+ "font-family": "var(--font-display, inherit)",
1822
+ "align-items": "center",
1823
+ "gap": "0.375rem",
1824
+ "font-weight": "var(--font-weight-semibold, 600)"
1825
+ },
1826
+ "[data-boring=\"feedback\"] .boring-feedback-bar-meta": {
1827
+ "color": "var(--boring-feedback-muted)",
1828
+ "font-size": "var(--text-sm, 0.875rem)"
1829
+ },
1830
+ "[data-boring=\"feedback\"].boring-feedback-bar[data-docked=\"true\"] > .boring-feedback-hint": {
1831
+ "flex": "1 1 10rem",
1832
+ "max-width": "none",
1833
+ "white-space": "normal"
1834
+ },
1835
+ "[data-boring=\"feedback\"] .boring-feedback-timer": {
1836
+ "font-variant-numeric": "tabular-nums"
1837
+ },
1838
+ "[data-boring=\"feedback\"] .boring-feedback-voice-problem": {
1839
+ "flex": "1 1 100%",
1840
+ "margin": "0",
1841
+ "color": "var(--destructive)",
1842
+ "font-size": "var(--text-sm, 0.875rem)",
1843
+ "white-space": "normal"
1844
+ },
1845
+ "[data-boring=\"feedback\"] .boring-feedback-element": {
1846
+ "display": "inline-flex",
1847
+ "flex": "1",
1848
+ "align-items": "baseline",
1849
+ "gap": "0.375rem",
1850
+ "min-width": "0",
1851
+ "overflow": "hidden",
1852
+ "white-space": "nowrap"
1853
+ },
1854
+ "[data-boring=\"feedback\"] .boring-feedback-element-name": {
1855
+ "flex": "0 1 auto",
1856
+ "min-width": "2rem",
1857
+ "overflow": "hidden",
1858
+ "text-overflow": "ellipsis",
1859
+ "font-size": "var(--text-sm, 0.875rem)",
1860
+ "font-weight": "var(--font-weight-semibold, 600)"
1861
+ },
1862
+ "[data-boring=\"feedback\"] .boring-feedback-element-file": {
1863
+ "flex": "0 100 auto",
1864
+ "min-width": "0",
1865
+ "overflow": "hidden",
1866
+ "text-overflow": "ellipsis",
1867
+ "color": "var(--boring-feedback-muted)",
1868
+ "font-family": "var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace)",
1869
+ "font-size": "var(--text-xs, 0.75rem)",
1870
+ "line-height": "var(--leading-snug, 1.375)"
1871
+ },
1872
+ "[data-boring=\"feedback\"].boring-feedback-bubble": {
1873
+ "z-index": "2147483001"
1874
+ },
1875
+ "[data-boring=\"feedback\"] .boring-feedback-bubble-head, [data-boring=\"feedback\"] .boring-feedback-note-head": {
1876
+ "display": "flex",
1877
+ "align-items": "center",
1878
+ "gap": "0.375rem",
1879
+ "min-width": "0"
1880
+ },
1881
+ "[data-boring=\"feedback\"] .boring-feedback-bubble-label, [data-boring=\"feedback\"] .boring-feedback-note-label": {
1882
+ "flex": "1",
1883
+ "min-width": "0",
1884
+ "overflow": "hidden",
1885
+ "text-overflow": "ellipsis",
1886
+ "white-space": "nowrap",
1887
+ "color": "var(--boring-feedback-muted)",
1888
+ "font-size": "var(--text-xs, 0.75rem)"
1889
+ },
1890
+ "[data-boring=\"feedback\"] .boring-feedback-pin": {
1891
+ "color": "var(--boring-feedback-accent)",
1892
+ "font-weight": "var(--font-weight-bold, 700)"
1893
+ },
1894
+ "[data-boring=\"feedback\"].boring-feedback-chip": {
1895
+ "position": "relative",
1896
+ "display": "inline-flex",
1897
+ "flex-wrap": "wrap",
1898
+ "align-items": "center",
1899
+ "gap": "0.125rem",
1900
+ "max-width": "100%"
1901
+ },
1902
+ "[data-boring=\"feedback\"] .boring-feedback-chip-route": {
1903
+ "color": "var(--boring-feedback-muted)",
1904
+ "font-family": "var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace)",
1905
+ "font-weight": "var(--font-weight-medium, 500)"
1906
+ },
1907
+ "[data-boring=\"feedback\"].boring-feedback-review": {
1908
+ "z-index": "2147483000",
1909
+ "max-height": "min(28rem, calc(100dvh - 24px))",
1910
+ "overflow": "auto",
1911
+ "text-align": "left"
1912
+ },
1913
+ "[data-boring=\"feedback\"] .boring-feedback-notes": {
1914
+ "display": "flex",
1915
+ "flex-direction": "column",
1916
+ "gap": "0.5rem",
1917
+ "margin": "0",
1918
+ "padding": "0",
1919
+ "list-style": "none"
1920
+ },
1921
+ "[data-boring=\"feedback\"] .boring-feedback-notes > li": {
1922
+ "display": "grid",
1923
+ "gap": "0.25rem"
1924
+ },
1925
+ "[data-boring=\"feedback\"].boring-feedback-banner": {
1926
+ "position": "fixed",
1927
+ "left": "8px",
1928
+ "right": "8px",
1929
+ "z-index": "2147483000",
1930
+ "max-width": "32rem",
1931
+ "margin": "0 auto",
1932
+ "flex-direction": "row",
1933
+ "align-items": "center",
1934
+ "gap": "0.75rem"
1935
+ },
1936
+ "@media (max-width: 640px), (pointer: coarse)": {
1937
+ "[data-boring=\"feedback\"] .boring-feedback-hint": {
1938
+ "display": "none"
1939
+ },
1940
+ "[data-boring=\"feedback\"].boring-feedback-bar": {
1941
+ "top": "auto",
1942
+ "bottom": "12px",
1943
+ "flex-wrap": "wrap"
1944
+ },
1945
+ "[data-boring=\"feedback\"] :is([data-slot=\"button\"], [data-slot=\"toggle\"], [class~=\"group/button\"], [class~=\"group/toggle\"])": {
1946
+ "min-height": "2.75rem",
1947
+ "min-width": "2.75rem"
1948
+ }
1949
+ },
1950
+ "[data-boring=\"feedback\"].boring-feedback-preview": {
1951
+ "position": "fixed",
1952
+ "top": "12px",
1953
+ "left": "0",
1954
+ "right": "0",
1955
+ "z-index": "2147483001",
1956
+ "width": "min(40rem, calc(100vw - 24px))",
1957
+ "margin": "0 auto"
1958
+ },
1959
+ "[data-boring=\"feedback\"] .boring-feedback-preview-head": {
1960
+ "display": "flex",
1961
+ "flex-wrap": "wrap",
1962
+ "align-items": "baseline",
1963
+ "gap": "0.5rem"
1964
+ },
1965
+ "[data-boring=\"feedback\"] .boring-feedback-preview-notice": {
1966
+ "font-weight": "var(--font-weight-semibold, 600)"
1967
+ },
1968
+ "[data-boring=\"feedback\"] .boring-feedback-preview-status": {
1969
+ "margin-left": "auto",
1970
+ "color": "var(--boring-feedback-muted)",
1971
+ "font-size": "var(--text-sm, 0.875rem)"
1972
+ },
1973
+ "[data-boring=\"feedback\"] .boring-feedback-preview-summary": {
1974
+ "margin": "0"
1975
+ },
1976
+ "[data-boring=\"feedback\"] .boring-feedback-preview-changes": {
1977
+ "margin": "0",
1978
+ "padding-left": "1.125rem",
1979
+ "color": "var(--boring-feedback-muted)",
1980
+ "font-size": "var(--text-sm, 0.875rem)"
1981
+ },
1982
+ "[data-boring=\"feedback\"] .boring-feedback-preview-changes code": {
1983
+ "font-size": "var(--text-xs, 0.75rem)"
1984
+ },
1985
+ "[data-boring=\"feedback\"] .boring-feedback-preview-error": {
1986
+ "margin": "0",
1987
+ "color": "var(--destructive)",
1988
+ "font-size": "var(--text-sm, 0.875rem)"
1989
+ },
1990
+ "[data-boring=\"feedback\"] .boring-feedback-preview-actions": {
1991
+ "display": "flex",
1992
+ "flex-wrap": "wrap",
2547
1993
  "gap": "0.5rem"
2548
1994
  },
2549
- "[data-boring=\"feedback\"] .boring-feedback-anchors code": {
2550
- "font-size": "var(--text-xs, 0.75rem)",
2551
- "color": "var(--boring-feedback-muted)"
1995
+ "[data-boring=\"feedback\"] .boring-feedback-pin-field": {
1996
+ "display": "grid"
2552
1997
  },
2553
- "[data-boring=\"feedback\"] .boring-feedback-candidates": {
1998
+ "[data-boring=\"feedback\"] .boring-feedback-pin-field > *": {
1999
+ "grid-column": "1"
2000
+ },
2001
+ "[data-boring=\"feedback\"] .boring-feedback-pin-field > textarea, [data-boring=\"feedback\"] .boring-feedback-pin-field > .boring-feedback-pin-mic": {
2002
+ "grid-row": "1"
2003
+ },
2004
+ "[data-boring=\"feedback\"] .boring-feedback-pin-field > .boring-feedback-voice-problem": {
2005
+ "grid-row": "2"
2006
+ },
2007
+ "[data-boring=\"feedback\"] .boring-feedback-pin-field textarea": {
2008
+ "width": "100%",
2009
+ "padding-inline-end": "3.25rem"
2010
+ },
2011
+ "[data-boring=\"feedback\"] .boring-feedback-pin-mic": {
2012
+ "justify-self": "end",
2013
+ "align-self": "end"
2014
+ },
2015
+ "[data-boring=\"feedback\"] .boring-feedback-bubble-actions": {
2554
2016
  "display": "flex",
2555
2017
  "flex-wrap": "wrap",
2556
- "gap": "0.375rem",
2557
- "margin": "0.375rem 0 0",
2558
- "padding": "0",
2559
- "list-style": "none"
2018
+ "gap": "0.375rem"
2019
+ }
2020
+ },
2021
+ "registryDependencies": [
2022
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
2023
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-voice.json",
2024
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
2025
+ ]
2026
+ },
2027
+ {
2028
+ "name": "app-shell",
2029
+ "type": "registry:block",
2030
+ "title": "App shell: layouts, list/detail and agent layer",
2031
+ "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.",
2032
+ "dependencies": [
2033
+ "@hachej/boring-feedback@^0.4.47",
2034
+ "@hachej/boring-ui-kit@^0.4.47",
2035
+ "@base-ui/react@^1.9.0",
2036
+ "react@^19.0.0",
2037
+ "react-dom@^19.0.0",
2038
+ "lucide-react@^1.51.0"
2039
+ ],
2040
+ "registryDependencies": [
2041
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json",
2042
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-plugins.json",
2043
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat-voice.json",
2044
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/dock.json",
2045
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/feedback.json",
2046
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2047
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
2048
+ ],
2049
+ "css": {
2050
+ "@layer base": {
2051
+ ".app-shell :where(*, ::before, ::after)": {
2052
+ "border-color": "var(--border)"
2053
+ },
2054
+ ".app-shell :where(button, [role=button])": {
2055
+ "appearance": "none",
2056
+ "background-color": "transparent",
2057
+ "border": "0 solid",
2058
+ "font": "inherit",
2059
+ "color": "inherit",
2060
+ "cursor": "pointer",
2061
+ "padding": "0"
2062
+ },
2063
+ ".app-shell :where(h2)": {
2064
+ "margin": "0",
2065
+ "font": "inherit"
2066
+ }
2560
2067
  },
2561
- "[data-boring=\"feedback\"].boring-feedback-bar": {
2562
- "position": "fixed",
2563
- "top": "12px",
2564
- "left": "0",
2565
- "right": "0",
2566
- "z-index": "2147483000",
2567
- "flex-direction": "row",
2568
- "flex-wrap": "nowrap",
2569
- "align-items": "center",
2570
- "gap": "0.5rem",
2571
- "width": "max-content",
2572
- "max-width": "calc(100vw - 24px)",
2573
- "margin": "0 auto"
2068
+ "@layer utilities": {
2069
+ "@media (width < 768px), (pointer: coarse)": {
2070
+ ".app-shell :is([data-slot=\"button\"], [data-slot=\"toggle\"], [class~=\"group/button\"], [class~=\"group/toggle\"]):not([data-dense]):not([data-dense] *)": {
2071
+ "min-height": "2.75rem",
2072
+ "min-width": "2.75rem"
2073
+ }
2074
+ }
2075
+ }
2076
+ },
2077
+ "files": [
2078
+ {
2079
+ "path": "registry/app-shell/agent-layer.tsx",
2080
+ "type": "registry:component",
2081
+ "target": "components/app-shell/agent-layer.tsx"
2574
2082
  },
2575
- "[data-boring=\"feedback\"].boring-feedback-bar[data-docked=\"true\"]": {
2576
- "position": "static",
2577
- "width": "auto",
2578
- "max-width": "none",
2579
- "margin": "0 0.625rem 0.625rem",
2580
- "flex-wrap": "wrap"
2083
+ {
2084
+ "path": "registry/app-shell/agent-context.ts",
2085
+ "type": "registry:lib",
2086
+ "target": "components/app-shell/agent-context.ts"
2581
2087
  },
2582
- "[data-boring=\"feedback\"].boring-feedback-bar > *": {
2583
- "flex": "none"
2088
+ {
2089
+ "path": "registry/app-shell/agent-link.ts",
2090
+ "type": "registry:lib",
2091
+ "target": "components/app-shell/agent-link.ts"
2584
2092
  },
2585
- "[data-boring=\"feedback\"].boring-feedback-bar > .boring-feedback-hint": {
2586
- "flex": "0 1 auto",
2587
- "min-width": "0",
2588
- "max-width": "24rem"
2093
+ {
2094
+ "path": "registry/app-shell/use-visual-viewport.ts",
2095
+ "type": "registry:hook",
2096
+ "target": "components/app-shell/use-visual-viewport.ts"
2589
2097
  },
2590
- "[data-boring=\"feedback\"] .boring-feedback-bar-title": {
2591
- "display": "inline-flex",
2592
- "font-family": "var(--font-display, inherit)",
2593
- "align-items": "center",
2594
- "gap": "0.375rem",
2595
- "font-weight": "var(--font-weight-semibold, 600)"
2098
+ {
2099
+ "path": "registry/app-shell/shell-layer.ts",
2100
+ "type": "registry:lib",
2101
+ "target": "components/app-shell/shell-layer.ts"
2596
2102
  },
2597
- "[data-boring=\"feedback\"] .boring-feedback-bar-meta": {
2598
- "color": "var(--boring-feedback-muted)",
2599
- "font-size": "var(--text-sm, 0.875rem)"
2103
+ {
2104
+ "path": "registry/app-shell/text.ts",
2105
+ "type": "registry:lib",
2106
+ "target": "components/app-shell/text.ts"
2600
2107
  },
2601
- "[data-boring=\"feedback\"].boring-feedback-bar[data-docked=\"true\"] > .boring-feedback-hint": {
2602
- "flex": "1 1 10rem",
2603
- "max-width": "none",
2604
- "white-space": "normal"
2108
+ {
2109
+ "path": "registry/app-shell/app-shell.tsx",
2110
+ "type": "registry:component",
2111
+ "target": "components/app-shell/app-shell.tsx"
2605
2112
  },
2606
- "[data-boring=\"feedback\"] .boring-feedback-timer": {
2607
- "font-variant-numeric": "tabular-nums"
2113
+ {
2114
+ "path": "registry/app-shell/list-detail.tsx",
2115
+ "type": "registry:component",
2116
+ "target": "components/app-shell/list-detail.tsx"
2608
2117
  },
2609
- "[data-boring=\"feedback\"] .boring-feedback-voice-problem": {
2610
- "flex": "1 1 100%",
2611
- "margin": "0",
2612
- "color": "var(--destructive)",
2613
- "font-size": "var(--text-sm, 0.875rem)",
2614
- "white-space": "normal"
2118
+ {
2119
+ "path": "registry/app-shell/header.tsx",
2120
+ "type": "registry:component",
2121
+ "target": "components/app-shell/header.tsx"
2615
2122
  },
2616
- "[data-boring=\"feedback\"] .boring-feedback-element": {
2617
- "display": "inline-flex",
2618
- "flex": "1",
2619
- "align-items": "baseline",
2620
- "gap": "0.375rem",
2621
- "min-width": "0",
2622
- "overflow": "hidden",
2623
- "white-space": "nowrap"
2123
+ {
2124
+ "path": "registry/app-shell/header-actions.tsx",
2125
+ "type": "registry:component",
2126
+ "target": "components/app-shell/header-actions.tsx"
2624
2127
  },
2625
- "[data-boring=\"feedback\"] .boring-feedback-element-name": {
2626
- "flex": "0 1 auto",
2627
- "min-width": "2rem",
2628
- "overflow": "hidden",
2629
- "text-overflow": "ellipsis",
2630
- "font-size": "var(--text-sm, 0.875rem)",
2631
- "font-weight": "var(--font-weight-semibold, 600)"
2128
+ {
2129
+ "path": "registry/app-shell/nav.tsx",
2130
+ "type": "registry:component",
2131
+ "target": "components/app-shell/nav.tsx"
2632
2132
  },
2633
- "[data-boring=\"feedback\"] .boring-feedback-element-file": {
2634
- "flex": "0 100 auto",
2635
- "min-width": "0",
2636
- "overflow": "hidden",
2637
- "text-overflow": "ellipsis",
2638
- "color": "var(--boring-feedback-muted)",
2639
- "font-family": "var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace)",
2640
- "font-size": "var(--text-xs, 0.75rem)",
2641
- "line-height": "var(--leading-snug, 1.375)"
2133
+ {
2134
+ "path": "registry/app-shell/account.tsx",
2135
+ "type": "registry:component",
2136
+ "target": "components/app-shell/account.tsx"
2642
2137
  },
2643
- "[data-boring=\"feedback\"].boring-feedback-bubble": {
2644
- "z-index": "2147483001"
2138
+ {
2139
+ "path": "registry/app-shell/app-sheet.tsx",
2140
+ "type": "registry:component",
2141
+ "target": "components/app-shell/app-sheet.tsx"
2645
2142
  },
2646
- "[data-boring=\"feedback\"] .boring-feedback-bubble-head, [data-boring=\"feedback\"] .boring-feedback-note-head": {
2647
- "display": "flex",
2648
- "align-items": "center",
2649
- "gap": "0.375rem",
2650
- "min-width": "0"
2143
+ {
2144
+ "path": "registry/app-shell/use-exclusive-sheet.ts",
2145
+ "type": "registry:hook",
2146
+ "target": "components/app-shell/use-exclusive-sheet.ts"
2651
2147
  },
2652
- "[data-boring=\"feedback\"] .boring-feedback-bubble-label, [data-boring=\"feedback\"] .boring-feedback-note-label": {
2653
- "flex": "1",
2654
- "min-width": "0",
2655
- "overflow": "hidden",
2656
- "text-overflow": "ellipsis",
2657
- "white-space": "nowrap",
2658
- "color": "var(--boring-feedback-muted)",
2659
- "font-size": "var(--text-xs, 0.75rem)"
2148
+ {
2149
+ "path": "registry/app-shell/shell-panel.tsx",
2150
+ "type": "registry:component",
2151
+ "target": "components/app-shell/shell-panel.tsx"
2660
2152
  },
2661
- "[data-boring=\"feedback\"] .boring-feedback-pin": {
2662
- "color": "var(--boring-feedback-accent)",
2663
- "font-weight": "var(--font-weight-bold, 700)"
2153
+ {
2154
+ "path": "registry/app-shell/compact.ts",
2155
+ "type": "registry:hook",
2156
+ "target": "components/app-shell/compact.ts"
2157
+ },
2158
+ {
2159
+ "path": "registry/app-shell/index.ts",
2160
+ "type": "registry:lib",
2161
+ "target": "components/app-shell/index.ts"
2162
+ },
2163
+ {
2164
+ "path": "registry/app-shell/use-dictation.ts",
2165
+ "type": "registry:hook",
2166
+ "target": "components/app-shell/use-dictation.ts"
2167
+ }
2168
+ ]
2169
+ },
2170
+ {
2171
+ "name": "viewer-frame",
2172
+ "type": "registry:component",
2173
+ "title": "Viewer frame",
2174
+ "description": "The standard viewer top bar every viewer draws in (title, status, viewer controls, Refresh, Share, Copy, Download, Open in new tab, Close, overflow menu), its window labels, download, share and media helpers and the sandboxed interactive HTML frame. The viewers' styles live here. Each viewer is its own item (viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code) with a cheap kind module and a view loaded on first open.",
2175
+ "dependencies": [
2176
+ "@hachej/boring-ui-kit@^0.4.47",
2177
+ "react@^19.0.0",
2178
+ "react-dom@^19.0.0",
2179
+ "lucide-react@^1.51.0"
2180
+ ],
2181
+ "registryDependencies": [
2182
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2183
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json",
2184
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/version-history.json"
2185
+ ],
2186
+ "files": [
2187
+ {
2188
+ "path": "registry/viewer-frame/download.ts",
2189
+ "type": "registry:lib",
2190
+ "target": "components/viewer-frame/download.ts"
2664
2191
  },
2665
- "[data-boring=\"feedback\"].boring-feedback-chip": {
2666
- "position": "relative",
2667
- "display": "inline-flex",
2668
- "flex-wrap": "wrap",
2669
- "align-items": "center",
2670
- "gap": "0.125rem",
2671
- "max-width": "100%"
2192
+ {
2193
+ "path": "registry/viewer-frame/interactive-html.tsx",
2194
+ "type": "registry:component",
2195
+ "target": "components/viewer-frame/interactive-html.tsx"
2672
2196
  },
2673
- "[data-boring=\"feedback\"] .boring-feedback-chip-route": {
2674
- "color": "var(--boring-feedback-muted)",
2675
- "font-family": "var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace)",
2676
- "font-weight": "var(--font-weight-medium, 500)"
2197
+ {
2198
+ "path": "registry/viewer-frame/media.ts",
2199
+ "type": "registry:lib",
2200
+ "target": "components/viewer-frame/media.ts"
2677
2201
  },
2678
- "[data-boring=\"feedback\"].boring-feedback-review": {
2679
- "z-index": "2147483000",
2680
- "max-height": "min(28rem, calc(100dvh - 24px))",
2681
- "overflow": "auto",
2682
- "text-align": "left"
2202
+ {
2203
+ "path": "registry/viewer-frame/menu.tsx",
2204
+ "type": "registry:component",
2205
+ "target": "components/viewer-frame/menu.tsx"
2683
2206
  },
2684
- "[data-boring=\"feedback\"] .boring-feedback-notes": {
2685
- "display": "flex",
2686
- "flex-direction": "column",
2687
- "gap": "0.5rem",
2688
- "margin": "0",
2689
- "padding": "0",
2690
- "list-style": "none"
2207
+ {
2208
+ "path": "registry/viewer-frame/share.ts",
2209
+ "type": "registry:lib",
2210
+ "target": "components/viewer-frame/share.ts"
2691
2211
  },
2692
- "[data-boring=\"feedback\"] .boring-feedback-notes > li": {
2693
- "display": "grid",
2694
- "gap": "0.25rem"
2212
+ {
2213
+ "path": "registry/viewer-frame/viewer-frame.tsx",
2214
+ "type": "registry:component",
2215
+ "target": "components/viewer-frame/viewer-frame.tsx"
2695
2216
  },
2696
- "[data-boring=\"feedback\"].boring-feedback-banner": {
2697
- "position": "fixed",
2698
- "left": "8px",
2699
- "right": "8px",
2700
- "z-index": "2147483000",
2701
- "max-width": "32rem",
2702
- "margin": "0 auto",
2703
- "flex-direction": "row",
2704
- "align-items": "center",
2705
- "gap": "0.75rem"
2217
+ {
2218
+ "path": "registry/viewer-frame/viewer-window.ts",
2219
+ "type": "registry:lib",
2220
+ "target": "components/viewer-frame/viewer-window.ts"
2706
2221
  },
2707
- "@media (max-width: 640px), (pointer: coarse)": {
2708
- "[data-boring=\"feedback\"] .boring-feedback-hint": {
2222
+ {
2223
+ "path": "registry/viewer-frame/viewer-labels-fr.ts",
2224
+ "type": "registry:lib",
2225
+ "target": "components/viewer-frame/viewer-labels-fr.ts"
2226
+ }
2227
+ ],
2228
+ "css": {
2229
+ "@layer utilities": {
2230
+ "@media (width < 768px), (pointer: coarse)": {
2231
+ ".boring-viewer :is([data-slot=\"button\"], [data-slot=\"toggle\"], [data-slot=\"toggle-group-item\"], [class~=\"group/button\"], [class~=\"group/toggle\"])": {
2232
+ "min-height": "2.75rem",
2233
+ "min-width": "2.75rem"
2234
+ },
2235
+ ".boring-viewer.boring-markdown-bubble :is([data-slot=\"button\"], [data-slot=\"toggle\"])": {
2236
+ "min-height": "2.75rem",
2237
+ "min-width": "2.75rem"
2238
+ }
2239
+ }
2240
+ },
2241
+ "@layer components": {
2242
+ ".boring-viewer .boring-markdown-editor, .boring-viewer .boring-html-pane": {
2243
+ "display": "flex",
2244
+ "flex-direction": "column",
2245
+ "flex": "1 1 auto",
2246
+ "min-height": "0",
2247
+ "min-width": "0",
2248
+ "container-type": "inline-size"
2249
+ },
2250
+ ".boring-viewer .boring-markdown-surface": {
2251
+ "flex": "1 1 auto",
2252
+ "min-height": "0",
2253
+ "overflow": "auto"
2254
+ },
2255
+ ".boring-viewer .boring-markdown-toolbar, .boring-viewer.boring-markdown-bubble": {
2256
+ "display": "flex",
2257
+ "flex": "none",
2258
+ "align-items": "center",
2259
+ "gap": "0.25rem",
2260
+ "max-width": "calc(100vw - 24px)"
2261
+ },
2262
+ ".boring-viewer .boring-markdown-toolbar": {
2263
+ "padding": "0.375rem 1.5rem 0.375rem 0.75rem",
2264
+ "overflow-x": "auto",
2265
+ "scrollbar-width": "none",
2266
+ "mask-image": "linear-gradient(to right, black calc(100% - 2rem), transparent)"
2267
+ },
2268
+ ".boring-viewer .boring-markdown-toolbar::-webkit-scrollbar": {
2269
+ "display": "none"
2270
+ },
2271
+ ".boring-viewer .boring-markdown-tool": {
2272
+ "flex": "none"
2273
+ },
2274
+ ".boring-viewer .boring-markdown-separator": {
2275
+ "flex": "none",
2276
+ "margin-inline": "0.25rem"
2277
+ },
2278
+ ".boring-viewer span.boring-markdown-separator": {
2279
+ "width": "0.5rem",
2280
+ "margin": "0"
2281
+ },
2282
+ ".boring-viewer .boring-markdown-icon": {
2283
+ "display": "block"
2284
+ },
2285
+ ".boring-viewer .boring-markdown-link, .boring-viewer .boring-markdown-alert, .boring-viewer .boring-markdown-proposal, .boring-viewer [data-boring=\"text-draft-controls\"]": {
2286
+ "display": "flex",
2287
+ "flex": "none",
2288
+ "flex-wrap": "wrap",
2289
+ "align-items": "center",
2290
+ "gap": "0.5rem",
2291
+ "padding": "0.5rem 0.75rem"
2292
+ },
2293
+ ".boring-viewer .boring-markdown-link [data-slot=\"input\"]": {
2294
+ "flex": "1 1 14rem",
2295
+ "min-width": "0"
2296
+ },
2297
+ ".boring-viewer .boring-markdown-notice": {
2298
+ "margin": "0.75rem"
2299
+ },
2300
+ ".boring-viewer .boring-markdown-proposal :is(h3, details)": {
2301
+ "flex": "1 1 100%",
2302
+ "min-width": "0"
2303
+ },
2304
+ ".boring-viewer .boring-markdown-proposal pre": {
2305
+ "max-height": "12rem",
2306
+ "overflow": "auto",
2307
+ "white-space": "pre-wrap"
2308
+ },
2309
+ ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"]": {
2709
2310
  "display": "none"
2710
2311
  },
2711
- "[data-boring=\"feedback\"].boring-feedback-bar": {
2712
- "top": "auto",
2713
- "bottom": "12px",
2714
- "flex-wrap": "wrap"
2312
+ "@container (min-width: 46rem)": {
2313
+ ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"]": {
2314
+ "display": "block",
2315
+ "flex": "none",
2316
+ "overflow-x": "auto",
2317
+ "padding": "0.375rem 0.75rem"
2318
+ },
2319
+ ".boring-viewer .boring-markdown-editor nav[aria-label=\"Document outline\"] ol": {
2320
+ "display": "flex",
2321
+ "gap": "0.25rem",
2322
+ "list-style": "none",
2323
+ "margin": "0",
2324
+ "padding": "0"
2325
+ }
2326
+ },
2327
+ ".boring-viewer .boring-markdown-source, .boring-viewer .boring-html-viewer__source": {
2328
+ "flex": "1 1 auto",
2329
+ "width": "100%",
2330
+ "min-height": "0",
2331
+ "resize": "none"
2332
+ },
2333
+ ".boring-viewer .boring-markdown-content": {
2334
+ "max-width": "68ch",
2335
+ "min-height": "100%",
2336
+ "margin": "0 auto",
2337
+ "padding": "1.5rem 1.5rem 3rem",
2338
+ "overflow-wrap": "anywhere",
2339
+ "color": "var(--foreground)",
2340
+ "font-size": "var(--text-base)",
2341
+ "line-height": "var(--leading-relaxed)"
2342
+ },
2343
+ ".boring-viewer .boring-markdown-content:focus": {
2344
+ "outline": "none"
2345
+ },
2346
+ ".boring-viewer .boring-markdown-content > :first-child": {
2347
+ "margin-top": "0"
2348
+ },
2349
+ ".boring-viewer .boring-markdown-content p": {
2350
+ "margin": "0.75rem 0"
2351
+ },
2352
+ ".boring-viewer .boring-markdown-content p.is-editor-empty:first-child::before": {
2353
+ "content": "attr(data-placeholder)",
2354
+ "float": "left",
2355
+ "height": "0",
2356
+ "color": "var(--muted-foreground)",
2357
+ "pointer-events": "none"
2358
+ },
2359
+ ".boring-viewer .boring-markdown-content :is(h1, h2, h3, h4, h5, h6)": {
2360
+ "font-weight": "var(--font-weight-semibold)",
2361
+ "line-height": "var(--leading-tight)"
2362
+ },
2363
+ ".boring-viewer .boring-markdown-content h1": {
2364
+ "margin": "1.75rem 0 0.75rem",
2365
+ "font-size": "var(--text-2xl)"
2366
+ },
2367
+ ".boring-viewer .boring-markdown-content h2": {
2368
+ "margin": "2rem 0 0.75rem",
2369
+ "font-size": "var(--text-xl)"
2370
+ },
2371
+ ".boring-viewer .boring-markdown-content h3": {
2372
+ "margin": "1.25rem 0 0.5rem",
2373
+ "font-size": "var(--text-lg)"
2374
+ },
2375
+ ".boring-viewer .boring-markdown-content :is(h4, h5, h6)": {
2376
+ "margin": "1rem 0 0.4rem",
2377
+ "font-size": "var(--text-base)"
2378
+ },
2379
+ ".boring-viewer .boring-markdown-content :is(ul, ol)": {
2380
+ "margin": "0.75rem 0",
2381
+ "padding-left": "1.5rem"
2382
+ },
2383
+ ".boring-viewer .boring-markdown-content ul": {
2384
+ "list-style": "disc"
2385
+ },
2386
+ ".boring-viewer .boring-markdown-content ol": {
2387
+ "list-style": "decimal"
2388
+ },
2389
+ ".boring-viewer .boring-markdown-content li": {
2390
+ "margin": "0.25rem 0"
2391
+ },
2392
+ ".boring-viewer .boring-markdown-content li > p": {
2393
+ "margin": "0"
2394
+ },
2395
+ ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"]": {
2396
+ "padding-left": "0",
2397
+ "list-style": "none"
2398
+ },
2399
+ ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li": {
2400
+ "display": "flex",
2401
+ "align-items": "flex-start",
2402
+ "gap": "0.5rem"
2403
+ },
2404
+ ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > label": {
2405
+ "display": "inline-flex",
2406
+ "flex": "none",
2407
+ "align-items": "center",
2408
+ "height": "1.7em",
2409
+ "margin": "0",
2410
+ "user-select": "none"
2411
+ },
2412
+ ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > label input[type=\"checkbox\"]": {
2413
+ "width": "1rem",
2414
+ "height": "1rem",
2415
+ "margin": "0",
2416
+ "accent-color": "var(--primary)",
2417
+ "cursor": "pointer"
2418
+ },
2419
+ ".boring-viewer .boring-markdown-content ul[data-type=\"taskList\"] li > div": {
2420
+ "flex": "1 1 auto",
2421
+ "min-width": "0"
2715
2422
  },
2716
- "[data-boring=\"feedback\"] :is([data-slot=\"button\"], [data-slot=\"toggle\"], [class~=\"group/button\"], [class~=\"group/toggle\"])": {
2717
- "min-height": "2.75rem",
2718
- "min-width": "2.75rem"
2423
+ ".boring-viewer .boring-markdown-content li[data-checked=\"true\"] > div": {
2424
+ "color": "var(--muted-foreground)",
2425
+ "text-decoration": "line-through"
2426
+ },
2427
+ ".boring-viewer .boring-markdown-content strong": {
2428
+ "font-weight": "var(--font-weight-semibold)"
2429
+ },
2430
+ ".boring-viewer .boring-markdown-content code": {
2431
+ "padding": "0.1em 0.35em",
2432
+ "border-radius": "var(--radius-sm)",
2433
+ "background": "var(--muted)",
2434
+ "font-family": "var(--font-mono)",
2435
+ "font-size": "var(--text-sm)"
2436
+ },
2437
+ ".boring-viewer .boring-markdown-content pre": {
2438
+ "margin": "1rem 0",
2439
+ "padding": "0.875rem 1rem",
2440
+ "overflow-x": "auto",
2441
+ "border": "var(--default-border-width) solid var(--border)",
2442
+ "border-radius": "var(--radius-lg)",
2443
+ "background": "var(--muted)",
2444
+ "font-family": "var(--font-mono)",
2445
+ "font-size": "var(--text-sm)"
2446
+ },
2447
+ ".boring-viewer .boring-markdown-content pre code": {
2448
+ "padding": "0",
2449
+ "background": "transparent",
2450
+ "font": "inherit"
2451
+ },
2452
+ ".boring-viewer .boring-markdown-content blockquote": {
2453
+ "margin": "1rem 0",
2454
+ "padding": "0.5rem 1rem",
2455
+ "border-inline-start": "var(--default-border-width) solid var(--border)",
2456
+ "color": "var(--muted-foreground)"
2457
+ },
2458
+ ".boring-viewer .boring-markdown-content a": {
2459
+ "color": "var(--foreground)",
2460
+ "text-decoration": "underline",
2461
+ "cursor": "text"
2462
+ },
2463
+ ".boring-viewer .boring-markdown-content hr": {
2464
+ "margin": "1.5rem 0",
2465
+ "border": "0",
2466
+ "border-top": "var(--default-border-width) solid var(--border)"
2467
+ },
2468
+ ".boring-viewer .boring-markdown-content mark": {
2469
+ "background": "var(--accent)",
2470
+ "color": "var(--accent-foreground)"
2471
+ },
2472
+ ".boring-viewer .boring-markdown-content .tableWrapper": {
2473
+ "margin": "1rem 0",
2474
+ "overflow-x": "auto"
2475
+ },
2476
+ ".boring-viewer .boring-markdown-content table": {
2477
+ "width": "100%",
2478
+ "border-collapse": "collapse",
2479
+ "font-size": "var(--text-sm)"
2480
+ },
2481
+ ".boring-viewer .boring-markdown-content :is(th, td)": {
2482
+ "min-width": "4rem",
2483
+ "padding": "0.5rem 0.75rem",
2484
+ "border": "var(--default-border-width) solid var(--border)",
2485
+ "text-align": "left",
2486
+ "vertical-align": "top"
2487
+ },
2488
+ ".boring-viewer .boring-markdown-content th": {
2489
+ "background": "var(--muted)",
2490
+ "font-weight": "var(--font-weight-semibold)"
2491
+ },
2492
+ ".boring-viewer .boring-markdown-content :is(th, td) > p": {
2493
+ "margin": "0"
2494
+ },
2495
+ ".boring-viewer .boring-markdown-content .selectedCell": {
2496
+ "background": "var(--accent)"
2497
+ },
2498
+ ".boring-viewer .boring-markdown-content img": {
2499
+ "display": "block",
2500
+ "max-width": "100%",
2501
+ "height": "auto",
2502
+ "margin": "1rem 0"
2503
+ },
2504
+ ".boring-viewer .boring-markdown-content .boring-markdown-preserved": {
2505
+ "margin": "0.75rem 0",
2506
+ "color": "var(--muted-foreground)",
2507
+ "font-family": "var(--font-mono)",
2508
+ "font-size": "var(--text-sm)"
2509
+ },
2510
+ ".boring-viewer .boring-markdown-content .boring-markdown-preserved small": {
2511
+ "font-size": "var(--text-xs)"
2512
+ },
2513
+ ".boring-viewer .boring-markdown-content .boring-markdown-preserved pre": {
2514
+ "margin": "0.25rem 0",
2515
+ "padding": "0.5rem 0.75rem",
2516
+ "white-space": "pre-wrap",
2517
+ "overflow-wrap": "anywhere"
2518
+ },
2519
+ ".boring-viewer .boring-markdown-content .boring-markdown-preserved-inline": {
2520
+ "color": "var(--muted-foreground)",
2521
+ "font-family": "var(--font-mono)",
2522
+ "font-size": "var(--text-sm)"
2523
+ },
2524
+ ".boring-viewer .boring-markdown-content .boring-markdown-image": {
2525
+ "display": "inline-flex",
2526
+ "max-width": "100%",
2527
+ "margin": "0.125rem 0",
2528
+ "padding": "0.125rem 0.5rem",
2529
+ "background": "var(--muted)",
2530
+ "color": "var(--muted-foreground)"
2531
+ },
2532
+ ".boring-viewer .boring-html-viewer__preview": {
2533
+ "display": "flex",
2534
+ "flex": "1 1 auto",
2535
+ "flex-direction": "column",
2536
+ "min-height": "0"
2537
+ },
2538
+ ".boring-viewer .boring-html-viewer__preview > p": {
2539
+ "flex": "none",
2540
+ "margin": "0",
2541
+ "padding": "0.375rem 0.75rem"
2542
+ },
2543
+ ".boring-viewer .boring-html-viewer__preview > div": {
2544
+ "display": "flex",
2545
+ "flex": "1 1 auto",
2546
+ "min-height": "0"
2547
+ },
2548
+ ".boring-viewer .boring-html-viewer__frame": {
2549
+ "flex": "1 1 auto",
2550
+ "width": "100%",
2551
+ "height": "100%",
2552
+ "min-height": "0",
2553
+ "border": "0"
2554
+ },
2555
+ ".boring-viewer .boring-viewer-checker": {
2556
+ "background-color": "var(--background)",
2557
+ "background-image": "linear-gradient(45deg, var(--muted) 25%, transparent 25%, transparent 75%, var(--muted) 75%), linear-gradient(45deg, var(--muted) 25%, transparent 25%, transparent 75%, var(--muted) 75%)",
2558
+ "background-position": "0 0, 8px 8px",
2559
+ "background-size": "16px 16px"
2560
+ },
2561
+ ".boring-viewer .boring-viewer-stage": {
2562
+ "overflow": "auto"
2563
+ },
2564
+ "@media (width < 768px)": {
2565
+ ".boring-viewer .boring-markdown-content": {
2566
+ "padding": "1.25rem 1.25rem 3rem"
2567
+ },
2568
+ ".boring-viewer .boring-markdown-toolbar": {
2569
+ "display": "none"
2570
+ },
2571
+ ".boring-viewer.boring-markdown-dock": {
2572
+ "display": "flex",
2573
+ "align-items": "center",
2574
+ "gap": "0.125rem",
2575
+ "overflow-x": "auto",
2576
+ "scrollbar-width": "none",
2577
+ "position": "fixed",
2578
+ "inset-inline": "0",
2579
+ "z-index": "50",
2580
+ "padding": "0.25rem 1.5rem 0.25rem 0.5rem",
2581
+ "padding-bottom": "calc(0.25rem + env(safe-area-inset-bottom, 0px))",
2582
+ "background": "var(--background)",
2583
+ "mask-image": "linear-gradient(to right, black calc(100% - 2rem), transparent)"
2584
+ },
2585
+ ".boring-viewer.boring-markdown-dock[data-keyboard]": {
2586
+ "padding-bottom": "0.25rem"
2587
+ },
2588
+ ".boring-viewer.boring-markdown-dock > .boring-markdown-dock-rule": {
2589
+ "position": "absolute",
2590
+ "inset-inline": "0",
2591
+ "top": "0"
2592
+ },
2593
+ ".boring-viewer [data-boring=\"markdown-editor\"][data-dock] .boring-markdown-content": {
2594
+ "padding-bottom": "6rem"
2595
+ }
2719
2596
  }
2597
+ }
2598
+ }
2599
+ },
2600
+ {
2601
+ "name": "viewer-markdown",
2602
+ "type": "registry:component",
2603
+ "title": "Markdown viewer",
2604
+ "description": "The Markdown kind: `markdownKind` (match, loader) and `MarkdownPane`, the tiptap editor with a formatting toolbar and prose styling over the kit's revisioned Markdown controller, in the viewer frame. The pane and tiptap load the first time a Markdown file opens.",
2605
+ "dependencies": [
2606
+ "@hachej/boring-ui-kit@^0.4.47",
2607
+ "react@^19.0.0",
2608
+ "lucide-react@^1.51.0",
2609
+ "marked@^17.0.6",
2610
+ "@tiptap/core@^3.31.4",
2611
+ "@tiptap/react@^3.31.4",
2612
+ "@tiptap/pm@^3.31.4",
2613
+ "@tiptap/starter-kit@^3.31.4",
2614
+ "@tiptap/markdown@^3.31.4",
2615
+ "@tiptap/extensions@^3.31.4",
2616
+ "@tiptap/extension-list@^3.31.4",
2617
+ "@tiptap/extension-table@^3.31.4",
2618
+ "@tiptap/extension-image@^3.31.4",
2619
+ "@tiptap/extension-highlight@^3.31.4",
2620
+ "@tiptap/extension-bubble-menu@^3.31.4",
2621
+ "@tiptap/extension-floating-menu@^3.31.4"
2622
+ ],
2623
+ "registryDependencies": [
2624
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2625
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/markdown-editor.json",
2626
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2627
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
2628
+ ],
2629
+ "files": [
2630
+ {
2631
+ "path": "registry/viewer-markdown/markdown-kind.ts",
2632
+ "type": "registry:lib",
2633
+ "target": "components/viewer-markdown/markdown-kind.ts"
2720
2634
  },
2721
- "[data-boring=\"feedback\"].boring-feedback-preview": {
2722
- "position": "fixed",
2723
- "top": "12px",
2724
- "left": "0",
2725
- "right": "0",
2726
- "z-index": "2147483001",
2727
- "width": "min(40rem, calc(100vw - 24px))",
2728
- "margin": "0 auto"
2729
- },
2730
- "[data-boring=\"feedback\"] .boring-feedback-preview-head": {
2731
- "display": "flex",
2732
- "flex-wrap": "wrap",
2733
- "align-items": "baseline",
2734
- "gap": "0.5rem"
2735
- },
2736
- "[data-boring=\"feedback\"] .boring-feedback-preview-notice": {
2737
- "font-weight": "var(--font-weight-semibold, 600)"
2738
- },
2739
- "[data-boring=\"feedback\"] .boring-feedback-preview-status": {
2740
- "margin-left": "auto",
2741
- "color": "var(--boring-feedback-muted)",
2742
- "font-size": "var(--text-sm, 0.875rem)"
2743
- },
2744
- "[data-boring=\"feedback\"] .boring-feedback-preview-summary": {
2745
- "margin": "0"
2746
- },
2747
- "[data-boring=\"feedback\"] .boring-feedback-preview-changes": {
2748
- "margin": "0",
2749
- "padding-left": "1.125rem",
2750
- "color": "var(--boring-feedback-muted)",
2751
- "font-size": "var(--text-sm, 0.875rem)"
2752
- },
2753
- "[data-boring=\"feedback\"] .boring-feedback-preview-changes code": {
2754
- "font-size": "var(--text-xs, 0.75rem)"
2755
- },
2756
- "[data-boring=\"feedback\"] .boring-feedback-preview-error": {
2757
- "margin": "0",
2758
- "color": "var(--destructive)",
2759
- "font-size": "var(--text-sm, 0.875rem)"
2760
- },
2761
- "[data-boring=\"feedback\"] .boring-feedback-preview-actions": {
2762
- "display": "flex",
2763
- "flex-wrap": "wrap",
2764
- "gap": "0.5rem"
2635
+ {
2636
+ "path": "registry/viewer-markdown/markdown-pane.tsx",
2637
+ "type": "registry:component",
2638
+ "target": "components/viewer-markdown/markdown-pane.tsx"
2639
+ }
2640
+ ]
2641
+ },
2642
+ {
2643
+ "name": "viewer-html",
2644
+ "type": "registry:component",
2645
+ "title": "HTML viewer",
2646
+ "description": "The HTML kind: `htmlKind` (match, loader) and `HtmlPane`, the passive HTML preview (sandboxed when the host opts in) and source editor, in the viewer frame. The pane loads the first time an HTML file opens.",
2647
+ "dependencies": [
2648
+ "@hachej/boring-ui-kit@^0.4.47",
2649
+ "react@^19.0.0",
2650
+ "lucide-react@^1.51.0"
2651
+ ],
2652
+ "registryDependencies": [
2653
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2654
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2655
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
2656
+ ],
2657
+ "files": [
2658
+ {
2659
+ "path": "registry/viewer-html/html-kind.ts",
2660
+ "type": "registry:lib",
2661
+ "target": "components/viewer-html/html-kind.ts"
2765
2662
  },
2766
- "[data-boring=\"feedback\"] .boring-feedback-pin-field": {
2767
- "display": "grid"
2663
+ {
2664
+ "path": "registry/viewer-html/html-pane.tsx",
2665
+ "type": "registry:component",
2666
+ "target": "components/viewer-html/html-pane.tsx"
2667
+ }
2668
+ ]
2669
+ },
2670
+ {
2671
+ "name": "viewer-image",
2672
+ "type": "registry:component",
2673
+ "title": "Image viewer",
2674
+ "description": "The image kind: `imageKind` (match on PNG, JPEG, GIF, WebP and SVG, loader) and `ImagePane`, zoom and pan in the viewer frame. The pane loads the first time an image opens.",
2675
+ "dependencies": [
2676
+ "react@^19.0.0",
2677
+ "lucide-react@^1.51.0"
2678
+ ],
2679
+ "registryDependencies": [
2680
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2681
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
2682
+ ],
2683
+ "files": [
2684
+ {
2685
+ "path": "registry/viewer-image/image-kind.ts",
2686
+ "type": "registry:lib",
2687
+ "target": "components/viewer-image/image-kind.ts"
2768
2688
  },
2769
- "[data-boring=\"feedback\"] .boring-feedback-pin-field > *": {
2770
- "grid-column": "1"
2689
+ {
2690
+ "path": "registry/viewer-image/image-types.ts",
2691
+ "type": "registry:lib",
2692
+ "target": "components/viewer-image/image-types.ts"
2771
2693
  },
2772
- "[data-boring=\"feedback\"] .boring-feedback-pin-field > textarea, [data-boring=\"feedback\"] .boring-feedback-pin-field > .boring-feedback-pin-mic": {
2773
- "grid-row": "1"
2694
+ {
2695
+ "path": "registry/viewer-image/image-pane.tsx",
2696
+ "type": "registry:component",
2697
+ "target": "components/viewer-image/image-pane.tsx"
2698
+ }
2699
+ ]
2700
+ },
2701
+ {
2702
+ "name": "viewer-pdf",
2703
+ "type": "registry:component",
2704
+ "title": "PDF viewer",
2705
+ "description": "The PDF kind: `pdfKind` (match, loader) and `PdfPane` in the viewer frame (the browser's viewer, or pdf.js pages where there is none), and LocalFileViewer for browser-only files. The pane loads the first time a PDF opens.",
2706
+ "dependencies": [
2707
+ "@hachej/boring-files@^0.4.47",
2708
+ "react@^19.0.0",
2709
+ "lucide-react@^1.51.0",
2710
+ "pdfjs-dist@6.4.299"
2711
+ ],
2712
+ "registryDependencies": [
2713
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2714
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-image.json"
2715
+ ],
2716
+ "files": [
2717
+ {
2718
+ "path": "registry/viewer-pdf/pdf-kind.ts",
2719
+ "type": "registry:lib",
2720
+ "target": "components/viewer-pdf/pdf-kind.ts"
2774
2721
  },
2775
- "[data-boring=\"feedback\"] .boring-feedback-pin-field > .boring-feedback-voice-problem": {
2776
- "grid-row": "2"
2722
+ {
2723
+ "path": "registry/viewer-pdf/pdf-pane.tsx",
2724
+ "type": "registry:component",
2725
+ "target": "components/viewer-pdf/pdf-pane.tsx"
2777
2726
  },
2778
- "[data-boring=\"feedback\"] .boring-feedback-pin-field textarea": {
2779
- "width": "100%",
2780
- "padding-inline-end": "3.25rem"
2727
+ {
2728
+ "path": "registry/viewer-pdf/pdf-pages.tsx",
2729
+ "type": "registry:component",
2730
+ "target": "components/viewer-pdf/pdf-pages.tsx"
2781
2731
  },
2782
- "[data-boring=\"feedback\"] .boring-feedback-pin-mic": {
2783
- "justify-self": "end",
2784
- "align-self": "end"
2732
+ {
2733
+ "path": "registry/viewer-pdf/local-file-viewer.tsx",
2734
+ "type": "registry:component",
2735
+ "target": "components/viewer-pdf/local-file-viewer.tsx"
2736
+ }
2737
+ ]
2738
+ },
2739
+ {
2740
+ "name": "viewer-code",
2741
+ "type": "registry:component",
2742
+ "title": "Code viewers",
2743
+ "description": "The SVG and CSV kinds: `svgKind` (a preview from a blob URL, or its source) and `csvKind` (a table), drawn inside the artifact panel's bar. Each view loads the first time its artifact opens; other code stays in the panel's code block.",
2744
+ "dependencies": [
2745
+ "react@^19.0.0",
2746
+ "lucide-react@^1.51.0"
2747
+ ],
2748
+ "registryDependencies": [
2749
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2750
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
2751
+ ],
2752
+ "files": [
2753
+ {
2754
+ "path": "registry/viewer-code/code-kinds.ts",
2755
+ "type": "registry:lib",
2756
+ "target": "components/viewer-code/code-kinds.ts"
2785
2757
  },
2786
- "[data-boring=\"feedback\"] .boring-feedback-bubble-actions": {
2787
- "display": "flex",
2788
- "flex-wrap": "wrap",
2789
- "gap": "0.375rem"
2758
+ {
2759
+ "path": "registry/viewer-code/svg-view.tsx",
2760
+ "type": "registry:component",
2761
+ "target": "components/viewer-code/svg-view.tsx"
2762
+ },
2763
+ {
2764
+ "path": "registry/viewer-code/csv-table.tsx",
2765
+ "type": "registry:component",
2766
+ "target": "components/viewer-code/csv-table.tsx"
2790
2767
  }
2791
- },
2768
+ ]
2769
+ },
2770
+ {
2771
+ "name": "viewers",
2772
+ "type": "registry:component",
2773
+ "title": "Viewers",
2774
+ "description": "Deprecated aggregate: installs every viewer item (viewer-frame, viewer-markdown, viewer-html, viewer-image, viewer-pdf, viewer-code). Add the items you use instead.",
2775
+ "files": [],
2792
2776
  "registryDependencies": [
2793
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
2794
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-voice.json",
2795
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
2777
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2778
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-markdown.json",
2779
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-html.json",
2780
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-image.json",
2781
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-pdf.json",
2782
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-code.json"
2796
2783
  ]
2797
2784
  },
2798
2785
  {
2799
- "name": "feedback-preview",
2786
+ "name": "provider-setup",
2800
2787
  "type": "registry:component",
2801
- "title": "Feedback preview",
2802
- "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).",
2788
+ "title": "Provider setup",
2789
+ "description": "A shadcn popover for configuring model access: pick any registered Pi provider and model, save an API key (masked, shows \"saved\"), run a device-code subscription sign-in (code, link and status), set an optional gateway and see when a provider needs one. Transport-agnostic: props in, callbacks out, no fetch. Owned, editable source; fits the pi-chat controls slot.",
2803
2790
  "dependencies": [
2804
- "@hachej/boring-feedback@^0.4.45",
2805
- "@earendil-works/pi-ai@~1.4.0",
2806
- "react@^19.0.0"
2791
+ "react@^19.0.0",
2792
+ "react-dom@^19.0.0",
2793
+ "lucide-react@^1.51.0"
2794
+ ],
2795
+ "registryDependencies": [
2796
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
2807
2797
  ],
2808
2798
  "files": [
2809
2799
  {
2810
- "path": "registry/feedback-preview/preview-banner.tsx",
2800
+ "path": "registry/provider-setup/provider-setup.tsx",
2811
2801
  "type": "registry:component",
2812
- "target": "components/feedback-preview/preview-banner.tsx"
2802
+ "target": "components/provider-setup/provider-setup.tsx"
2813
2803
  }
2814
2804
  ]
2815
2805
  },
@@ -2819,8 +2809,8 @@
2819
2809
  "title": "Consumer task-list viewer",
2820
2810
  "description": "A consumer-defined task-list schema and controller over the shared text buffer, with a restylable borrowed React renderer.",
2821
2811
  "dependencies": [
2822
- "@hachej/boring-ui-kit@^0.4.45",
2823
- "@hachej/boring-files@^0.4.45",
2812
+ "@hachej/boring-ui-kit@^0.4.47",
2813
+ "@hachej/boring-files@^0.4.47",
2824
2814
  "react@^19.0.0",
2825
2815
  "react-dom@^19.0.0",
2826
2816
  "zod@^4.6.5"
@@ -2870,11 +2860,11 @@
2870
2860
  "title": "Version history rows",
2871
2861
  "description": "Shared view-only version rows and menu metadata with relative time, provenance and Current. No file reads, publication or restoration.",
2872
2862
  "dependencies": [
2873
- "@hachej/boring-files@^0.4.45",
2863
+ "@hachej/boring-files@^0.4.47",
2874
2864
  "react@^19.0.0"
2875
2865
  ],
2876
2866
  "registryDependencies": [
2877
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json"
2867
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json"
2878
2868
  ],
2879
2869
  "files": [
2880
2870
  {
@@ -2890,14 +2880,14 @@
2890
2880
  "title": "File tree",
2891
2881
  "description": "Browse, search, upload, rename, move, delete and inspect retained versions through one revisionProvider binding. Uses the consumer's shadcn Button, dropdown-menu and dialog with shared version-history rows; Base UI style only.",
2892
2882
  "dependencies": [
2893
- "@hachej/boring-ui-kit@^0.4.45",
2894
- "@hachej/boring-files@^0.4.45",
2883
+ "@hachej/boring-ui-kit@^0.4.47",
2884
+ "@hachej/boring-files@^0.4.47",
2895
2885
  "react@^19.0.0",
2896
2886
  "lucide-react@^1.51.0"
2897
2887
  ],
2898
2888
  "registryDependencies": [
2899
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
2900
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/version-history.json"
2889
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2890
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/version-history.json"
2901
2891
  ],
2902
2892
  "files": [
2903
2893
  {
@@ -2914,22 +2904,22 @@
2914
2904
  "title": "Documents: the Library, a file and its revisions",
2915
2905
  "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.",
2916
2906
  "dependencies": [
2917
- "@hachej/boring-ui-kit@^0.4.45",
2918
- "@hachej/boring-files@^0.4.45",
2907
+ "@hachej/boring-ui-kit@^0.4.47",
2908
+ "@hachej/boring-files@^0.4.47",
2919
2909
  "react@^19.0.0",
2920
2910
  "lucide-react@^1.51.0"
2921
2911
  ],
2922
2912
  "registryDependencies": [
2923
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
2924
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/button.json",
2925
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json",
2926
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app.json",
2927
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app-kinds.json",
2928
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/app-shell.json",
2929
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/file-tree.json",
2930
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json",
2931
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-image.json",
2932
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-pdf.json"
2913
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json",
2914
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/button.json",
2915
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-artifacts.json",
2916
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-app.json",
2917
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-app-kinds.json",
2918
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/app-shell.json",
2919
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/file-tree.json",
2920
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-frame.json",
2921
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-image.json",
2922
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/viewer-pdf.json"
2933
2923
  ],
2934
2924
  "files": [
2935
2925
  {
@@ -2965,15 +2955,15 @@
2965
2955
  "title": "Point and dictate on app data",
2966
2956
  "description": "Tap explicitly marked JSON app context, dictate once and show the same app agent’s native reply without opening chat. Host-controlled presentation; no feedback report or second controller.",
2967
2957
  "dependencies": [
2968
- "@hachej/boring-ui-kit@^0.4.45",
2969
- "@hachej/boring-feedback@^0.4.45",
2958
+ "@hachej/boring-ui-kit@^0.4.47",
2959
+ "@hachej/boring-feedback@^0.4.47",
2970
2960
  "@earendil-works/pi-durable@~1.4.0",
2971
2961
  "react@^19.0.0",
2972
2962
  "react-dom@^19.0.0"
2973
2963
  ],
2974
2964
  "registryDependencies": [
2975
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/app-shell.json",
2976
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json"
2965
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/app-shell.json",
2966
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/pi-chat.json"
2977
2967
  ],
2978
2968
  "files": [
2979
2969
  {
@@ -2988,154 +2978,19 @@
2988
2978
  }
2989
2979
  ]
2990
2980
  },
2991
- {
2992
- "name": "pm-panel",
2993
- "type": "registry:block",
2994
- "title": "Shared PM composer and in-app panel",
2995
- "description": "« Améliorer l'app »: the embedded AgentWorkspace chat, History, read-only Library and host Tasks panel, with the shared pointing strip, numbered pins and timestamped chips. Docked beside the app on desktop and full screen on phones; PmChat gives Studio the same component.",
2996
- "registryDependencies": [
2997
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app.json",
2998
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-app-kinds.json",
2999
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
3000
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-markdown.json",
3001
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-plugins.json",
3002
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-voice.json",
3003
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/feedback.json",
3004
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/task-board.json",
3005
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/task-mentions.json",
3006
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json",
3007
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-artifacts.json",
3008
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/viewer-frame.json"
3009
- ],
3010
- "dependencies": [
3011
- "@hachej/boring-ui-kit@^0.4.45",
3012
- "@hachej/boring-feedback@^0.4.45",
3013
- "@hachej/boring-files@^0.4.45",
3014
- "@earendil-works/pi-durable@~1.4.0",
3015
- "lucide-react@^1.51.0",
3016
- "react@^19.0.0",
3017
- "react-dom@^19.0.0"
3018
- ],
3019
- "files": [
3020
- {
3021
- "path": "registry/pm-panel/pm-panel.tsx",
3022
- "type": "registry:component",
3023
- "target": "components/pm-panel/pm-panel.tsx"
3024
- },
3025
- {
3026
- "path": "registry/pm-panel/pm-composer.tsx",
3027
- "type": "registry:component",
3028
- "target": "components/pm-panel/pm-composer.tsx"
3029
- },
3030
- {
3031
- "path": "registry/pm-panel/use-pm-panel.ts",
3032
- "type": "registry:hook",
3033
- "target": "components/pm-panel/use-pm-panel.ts"
3034
- },
3035
- {
3036
- "path": "registry/pm-panel/point-state.ts",
3037
- "type": "registry:lib",
3038
- "target": "components/pm-panel/point-state.ts"
3039
- },
3040
- {
3041
- "path": "registry/pm-panel/use-point-page.ts",
3042
- "type": "registry:hook",
3043
- "target": "components/pm-panel/use-point-page.ts"
3044
- },
3045
- {
3046
- "path": "registry/pm-panel/point-frames.ts",
3047
- "type": "registry:hook",
3048
- "target": "components/pm-panel/point-frames.ts"
3049
- },
3050
- {
3051
- "path": "registry/pm-panel/pm-host-theme.ts",
3052
- "type": "registry:hook",
3053
- "target": "components/pm-panel/pm-host-theme.ts"
3054
- },
3055
- {
3056
- "path": "registry/pm-panel/capture.ts",
3057
- "type": "registry:lib",
3058
- "target": "components/pm-panel/capture.ts"
3059
- },
3060
- {
3061
- "path": "registry/pm-panel/point-message.tsx",
3062
- "type": "registry:component",
3063
- "target": "components/pm-panel/point-message.tsx"
3064
- },
3065
- {
3066
- "path": "registry/pm-panel/inline-point-input.tsx",
3067
- "type": "registry:component",
3068
- "target": "components/pm-panel/inline-point-input.tsx"
3069
- },
3070
- {
3071
- "path": "registry/pm-panel/point-comment.tsx",
3072
- "type": "registry:component",
3073
- "target": "components/pm-panel/point-comment.tsx"
3074
- },
3075
- {
3076
- "path": "registry/pm-panel/pm-mentions.tsx",
3077
- "type": "registry:component",
3078
- "target": "components/pm-panel/pm-mentions.tsx"
3079
- },
3080
- {
3081
- "path": "registry/pm-panel/pm-task-source.tsx",
3082
- "type": "registry:component",
3083
- "target": "components/pm-panel/pm-task-source.tsx"
3084
- },
3085
- {
3086
- "path": "registry/pm-panel/pm-text.ts",
3087
- "type": "registry:lib",
3088
- "target": "components/pm-panel/pm-text.ts"
3089
- },
3090
- {
3091
- "path": "registry/pm-panel/use-improve-agent.ts",
3092
- "type": "registry:hook",
3093
- "target": "components/pm-panel/use-improve-agent.ts"
3094
- }
3095
- ]
3096
- },
3097
- {
3098
- "name": "requests-board",
3099
- "type": "registry:block",
3100
- "title": "Requests board",
3101
- "description": "Host-fed compact requests and responsive list/detail with questions and decisions.",
3102
- "registryDependencies": [
3103
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
3104
- ],
3105
- "files": [
3106
- {
3107
- "path": "registry/requests-board/requests-board.tsx",
3108
- "type": "registry:component",
3109
- "target": "components/requests-board/requests-board.tsx"
3110
- },
3111
- {
3112
- "path": "registry/requests-board/requests.ts",
3113
- "type": "registry:lib",
3114
- "target": "components/requests-board/requests.ts"
3115
- },
3116
- {
3117
- "path": "registry/requests-board/requests-labels.ts",
3118
- "type": "registry:lib",
3119
- "target": "components/requests-board/requests-labels.ts"
3120
- }
3121
- ],
3122
- "dependencies": [
3123
- "react@^19.0.0"
3124
- ]
3125
- },
3126
2981
  {
3127
2982
  "name": "highlights",
3128
2983
  "type": "registry:block",
3129
2984
  "title": "Anchored highlights",
3130
2985
  "description": "Exact Markdown highlights and comments in a conditional workspace sidecar.",
3131
2986
  "dependencies": [
3132
- "@hachej/boring-ui-kit@^0.4.45",
3133
- "@hachej/boring-files@^0.4.45",
2987
+ "@hachej/boring-ui-kit@^0.4.47",
2988
+ "@hachej/boring-files@^0.4.47",
3134
2989
  "react@^19.0.0",
3135
2990
  "react-dom@^19.0.0"
3136
2991
  ],
3137
2992
  "registryDependencies": [
3138
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/markdown-editor.json"
2993
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/markdown-editor.json"
3139
2994
  ],
3140
2995
  "files": [
3141
2996
  {
@@ -3156,7 +3011,7 @@
3156
3011
  "lucide-react@^1.51.0"
3157
3012
  ],
3158
3013
  "registryDependencies": [
3159
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
3014
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.47/r/utils.json"
3160
3015
  ],
3161
3016
  "files": [
3162
3017
  {
@@ -3167,61 +3022,40 @@
3167
3022
  ]
3168
3023
  },
3169
3024
  {
3170
- "name": "task-mentions",
3025
+ "name": "spaces",
3171
3026
  "type": "registry:component",
3172
- "title": "Task mentions",
3173
- "description": "Optional authorized task catalog for the existing PM composer, composed with host file search.",
3174
- "dependencies": [
3175
- "@hachej/boring-ui-kit@^0.4.45",
3176
- "react@^19.0.0",
3177
- "lucide-react@^1.51.0"
3178
- ],
3179
- "registryDependencies": [
3180
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/task-board.json",
3181
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat.json",
3182
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/pi-chat-mentions.json"
3183
- ],
3184
- "files": [
3185
- {
3186
- "path": "registry/task-mentions/task-mentions.tsx",
3187
- "type": "registry:component",
3188
- "target": "components/task-mentions/task-mentions.tsx"
3189
- }
3190
- ]
3191
- },
3192
- {
3193
- "name": "task-board",
3194
- "type": "registry:block",
3195
- "title": "Task board",
3196
- "description": "Host-owned business requests: board, stacked task/file overlays and compact own-request rows. No agent or task backend required.",
3027
+ "title": "Spaces",
3028
+ "description": "A client for a host's Spaces service: useSpaces, SpaceSwitcher and MembersSheet over a transport the app gives. Membership and roles stay the host's; no route or app wording.",
3197
3029
  "dependencies": [
3198
- "@hachej/boring-ui-kit@^0.4.45",
3030
+ "@hachej/boring-files@^0.4.47",
3199
3031
  "react@^19.0.0",
3200
3032
  "lucide-react@^1.51.0"
3201
3033
  ],
3202
- "registryDependencies": [
3203
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.45/r/utils.json"
3204
- ],
3205
3034
  "files": [
3206
3035
  {
3207
- "path": "registry/task-board/compact-presentation.ts",
3036
+ "path": "registry/spaces/spaces.ts",
3208
3037
  "type": "registry:lib",
3209
- "target": "components/task-board/compact-presentation.ts"
3038
+ "target": "components/spaces/spaces.ts"
3210
3039
  },
3211
3040
  {
3212
- "path": "registry/task-board/task-board.tsx",
3213
- "type": "registry:component",
3214
- "target": "components/task-board/task-board.tsx"
3041
+ "path": "registry/spaces/use-spaces.ts",
3042
+ "type": "registry:hook",
3043
+ "target": "components/spaces/use-spaces.ts"
3044
+ },
3045
+ {
3046
+ "path": "registry/spaces/spaces-labels.ts",
3047
+ "type": "registry:lib",
3048
+ "target": "components/spaces/spaces-labels.ts"
3215
3049
  },
3216
3050
  {
3217
- "path": "registry/task-board/task-request-card.tsx",
3051
+ "path": "registry/spaces/space-switcher.tsx",
3218
3052
  "type": "registry:component",
3219
- "target": "components/task-board/task-request-card.tsx"
3053
+ "target": "components/spaces/space-switcher.tsx"
3220
3054
  },
3221
3055
  {
3222
- "path": "registry/task-board/task-detail.tsx",
3056
+ "path": "registry/spaces/members-sheet.tsx",
3223
3057
  "type": "registry:component",
3224
- "target": "components/task-board/task-detail.tsx"
3058
+ "target": "components/spaces/members-sheet.tsx"
3225
3059
  }
3226
3060
  ]
3227
3061
  }