@igstack/app-catalog-frontend-core 6.9.0 → 6.10.1

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 (80) hide show
  1. package/dist/esm/__tests__/modules/appCatalog/ui/detail/CommunitySection.feed.test.d.ts +0 -0
  2. package/dist/esm/__tests__/modules/appCatalog/ui/detail/CommunitySection.help.test.d.ts +0 -0
  3. package/dist/esm/__tests__/modules/appCatalog/ui/detail/CommunitySection.input.test.d.ts +0 -0
  4. package/dist/esm/__tests__/modules/appCatalog/ui/detail/composeComments.test.d.ts +1 -0
  5. package/dist/esm/__tests__/ui/detail/CommunityInput.test.d.ts +1 -0
  6. package/dist/esm/modules/appCatalog/hooks/useUpdateApp.d.ts +8 -0
  7. package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js +1 -0
  8. package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js.map +1 -1
  9. package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js +237 -218
  10. package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js.map +1 -1
  11. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.d.ts +17 -0
  12. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.js +187 -0
  13. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.js.map +1 -0
  14. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.d.ts +9 -0
  15. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.js +91 -0
  16. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.js.map +1 -0
  17. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.d.ts +17 -0
  18. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.js +328 -0
  19. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.js.map +1 -0
  20. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.d.ts +15 -0
  21. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.js +26 -0
  22. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.js.map +1 -0
  23. package/dist/esm/modules/appCatalog/ui/detail/DetailTabs.d.ts +8 -19
  24. package/dist/esm/modules/appCatalog/ui/detail/DetailTabs.js +49 -37
  25. package/dist/esm/modules/appCatalog/ui/detail/DetailTabs.js.map +1 -1
  26. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.d.ts +30 -0
  27. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.js +50 -0
  28. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.js.map +1 -0
  29. package/dist/esm/modules/appCatalog/ui/detail/communityError.d.ts +6 -0
  30. package/dist/esm/modules/appCatalog/ui/detail/communityError.js +8 -0
  31. package/dist/esm/modules/appCatalog/ui/detail/communityError.js.map +1 -0
  32. package/dist/esm/modules/appCatalog/ui/detail/composeComments.d.ts +27 -0
  33. package/dist/esm/modules/appCatalog/ui/detail/composeComments.js +66 -0
  34. package/dist/esm/modules/appCatalog/ui/detail/composeComments.js.map +1 -0
  35. package/dist/esm/modules/appCatalog/ui/detail/usePendingCount.d.ts +11 -0
  36. package/dist/esm/modules/appCatalog/ui/detail/usePendingCount.js +15 -0
  37. package/dist/esm/modules/appCatalog/ui/detail/usePendingCount.js.map +1 -0
  38. package/dist/esm/modules/extensions/features/resourceDetail.d.ts +38 -0
  39. package/dist/esm/modules/extensions/features/resourceDetail.js +4 -0
  40. package/dist/esm/modules/extensions/features/resourceDetail.js.map +1 -1
  41. package/dist/esm/modules/extensions/index.d.ts +1 -1
  42. package/dist/esm/modules/extensions/index.js.map +1 -1
  43. package/dist/index.css +501 -49
  44. package/package.json +4 -4
  45. package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.appSwitch.test.tsx +5 -2
  46. package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.enter.test.tsx +5 -2
  47. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.background.test.tsx +9 -10
  48. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.behindThisCard.test.tsx +402 -0
  49. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.doorAndTabs.test.tsx +8 -4
  50. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.escape.test.tsx +5 -2
  51. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.knowMore.test.tsx +175 -0
  52. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.sectionOrder.test.tsx +5 -2
  53. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.subResourceTab.test.tsx +5 -2
  54. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.tags.test.tsx +5 -2
  55. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.feed.test.tsx +281 -0
  56. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.help.test.tsx +179 -0
  57. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.input.test.tsx +423 -0
  58. package/src/__tests__/modules/appCatalog/ui/detail/composeComments.test.ts +170 -0
  59. package/src/__tests__/ui/detail/CommunityInput.test.tsx +39 -0
  60. package/src/index.css +501 -49
  61. package/src/modules/appCatalog/ui/detail/AppDetails.tsx +292 -289
  62. package/src/modules/appCatalog/ui/detail/CommentsFeed.tsx +254 -0
  63. package/src/modules/appCatalog/ui/detail/CommentsHelp.tsx +102 -0
  64. package/src/modules/appCatalog/ui/detail/CommunityInput.tsx +419 -0
  65. package/src/modules/appCatalog/ui/detail/CommunitySection.tsx +41 -0
  66. package/src/modules/appCatalog/ui/detail/DetailTabs.tsx +77 -71
  67. package/src/modules/appCatalog/ui/detail/communityDraft.ts +80 -0
  68. package/src/modules/appCatalog/ui/detail/communityError.ts +10 -0
  69. package/src/modules/appCatalog/ui/detail/composeComments.ts +103 -0
  70. package/src/modules/appCatalog/ui/detail/usePendingCount.ts +26 -0
  71. package/src/modules/extensions/features/resourceDetail.ts +28 -0
  72. package/src/modules/extensions/index.ts +2 -0
  73. package/dist/esm/modules/appCatalog/ui/detail/FeedbackSection.d.ts +0 -13
  74. package/dist/esm/modules/appCatalog/ui/detail/FeedbackSection.js +0 -433
  75. package/dist/esm/modules/appCatalog/ui/detail/FeedbackSection.js.map +0 -1
  76. package/src/__tests__/modules/appCatalog/ui/detail/FeedbackSection.emptyState.test.tsx +0 -181
  77. package/src/__tests__/modules/appCatalog/ui/detail/FeedbackSection.reviewStatus.test.tsx +0 -131
  78. package/src/modules/appCatalog/ui/detail/FeedbackSection.tsx +0 -605
  79. /package/dist/esm/__tests__/modules/appCatalog/ui/detail/{FeedbackSection.emptyState.test.d.ts → AppDetails.behindThisCard.test.d.ts} +0 -0
  80. /package/dist/esm/__tests__/modules/appCatalog/ui/detail/{FeedbackSection.reviewStatus.test.d.ts → AppDetails.knowMore.test.d.ts} +0 -0
package/src/index.css CHANGED
@@ -249,38 +249,27 @@
249
249
  padding-left: 1.25rem;
250
250
  }
251
251
 
252
- /* Review labels. Plain CSS rather than utilities: there is no success token in the
253
- palette, and a tinted chip needs a colour the theme does not name. `--chart-3` is
254
- the palette's green and already shifts for dark mode.
255
-
256
- Mix percentages are low on purpose. At 75%/72% these measured 3.55:1 and 3.24:1
257
- against the cream page — under the 4.5:1 floor for 11px text — and the old 600/700
258
- weights were compensating for that, which is why they shouted and were still hard
259
- to read. Lowering the mix raises contrast in both themes, so there is no .dark
260
- override. Verify any change by measurement, not by eye: 60%/55% looks fine and
261
- still fails. */
262
- .comment-chip {
263
- display: inline-flex;
264
- align-items: center;
265
- gap: 0.25rem;
252
+ /* Comment badges. Plain CSS rather than utilities: there is no success or
253
+ pending token in the palette, so each tints a chart colour, which already
254
+ shifts for dark mode. The text is mixed toward the foreground so it stays
255
+ readable at 10.5px in both themes: an untinted chart colour on its own pale
256
+ ground measured under 4.5:1. Verify any change by measurement, not by eye. */
257
+ .comment__badge {
258
+ margin-left: 0.375rem;
259
+ padding: 0 0.4375rem;
266
260
  border-radius: 999px;
267
- padding: 0.05rem 0.5rem;
268
- font-size: 0.6875rem;
261
+ font-size: 0.65625rem;
269
262
  font-weight: 500;
270
- line-height: 1.5;
263
+ line-height: 1rem;
271
264
  white-space: nowrap;
272
265
  }
273
- .comment-chip-applied {
274
- /* 5.46:1 light, 7.67:1 dark */
275
- color: color-mix(in oklab, var(--chart-3) 50%, var(--foreground));
276
- background: color-mix(in oklab, var(--chart-3) 16%, var(--card));
277
- border: 1px solid color-mix(in oklab, var(--chart-3) 35%, var(--card));
266
+ .comment__badge.is-pending {
267
+ color: color-mix(in oklab, var(--chart-1) 62%, var(--foreground));
268
+ background: color-mix(in oklab, var(--chart-1) 12%, var(--card));
278
269
  }
279
- .comment-chip-seen {
280
- color: var(--muted-foreground);
281
- background: var(--muted);
282
- border: 1px solid var(--border);
283
- font-weight: 400;
270
+ .comment__badge.is-used {
271
+ color: color-mix(in oklab, var(--chart-3) 50%, var(--foreground));
272
+ background: color-mix(in oklab, var(--chart-3) 13%, var(--card));
284
273
  }
285
274
 
286
275
  /* One register for every section label inside the detail card.
@@ -431,16 +420,112 @@
431
420
 
432
421
  /* The tab strip. Horizontally scrollable rather than wrapping: a wrapped strip
433
422
  changes the band's height from one entry to the next. */
423
+ .detail-tabs-row {
424
+ display: flex;
425
+ border-bottom: 1px solid var(--border);
426
+ }
434
427
  .detail-tabs {
435
428
  display: flex;
429
+ flex: 1;
430
+ min-width: 0;
436
431
  gap: 2px;
437
- border-bottom: 1px solid var(--border);
438
432
  overflow-x: auto;
439
433
  scrollbar-width: none;
434
+ scroll-behavior: smooth;
440
435
  }
441
436
  .detail-tabs::-webkit-scrollbar {
442
437
  display: none;
443
438
  }
439
+ /* Outside the scrolling tablist, so the button never scrolls out of view. */
440
+ .detail-tabs-trailing {
441
+ flex: none;
442
+ align-self: center;
443
+ padding-left: 0.75rem;
444
+ }
445
+ .detail-share {
446
+ border: 1px solid var(--border);
447
+ border-radius: 999px;
448
+ background: var(--background);
449
+ color: var(--foreground);
450
+ font-size: 0.8125rem;
451
+ padding: 0.25rem 0.75rem;
452
+ white-space: nowrap;
453
+ cursor: pointer;
454
+ transition:
455
+ color 0.14s ease-out,
456
+ border-color 0.14s ease-out;
457
+ }
458
+ /* Below 640px, render the Share button compact: icon only, text visually hidden. */
459
+ @media (max-width: 639px) {
460
+ .detail-share {
461
+ padding: 0.4375rem;
462
+ width: 36px;
463
+ height: 36px;
464
+ display: inline-flex;
465
+ align-items: center;
466
+ justify-content: center;
467
+ }
468
+ }
469
+ .detail-share:hover {
470
+ color: color-mix(in oklab, var(--primary) 85%, black);
471
+ border-color: color-mix(in oklab, var(--primary) 85%, black);
472
+ }
473
+ .detail-share:focus-visible {
474
+ outline: 2px solid color-mix(in oklab, var(--primary) 85%, black);
475
+ outline-offset: 2px;
476
+ }
477
+
478
+ /* Behind this card: one left-aligned reading column. The input and its
479
+ Comments come first; each later group sits under a hairline with generous
480
+ room either side, and a plain title. */
481
+ .behind-panel {
482
+ max-width: 62ch;
483
+ }
484
+ .behind-group + .behind-group {
485
+ margin-top: 3.5rem;
486
+ padding-top: 2.25rem;
487
+ border-top: 1px solid var(--border);
488
+ }
489
+ .behind-group__title {
490
+ font-size: 0.9375rem;
491
+ font-weight: 600;
492
+ color: var(--foreground);
493
+ margin-bottom: 0.875rem;
494
+ }
495
+ .behind-dates {
496
+ margin-top: 0.375rem;
497
+ font-size: 0.78125rem;
498
+ color: var(--muted-foreground);
499
+ }
500
+ /* Touch targets: inline links in Behind get ≥24px hit area on coarse pointers. */
501
+ @media (pointer: coarse) {
502
+ .behind-group a {
503
+ padding-block: 0.375rem;
504
+ display: inline-block;
505
+ }
506
+ }
507
+ .behind-ai__label {
508
+ font-size: 0.75rem;
509
+ color: var(--muted-foreground);
510
+ margin: 0.5rem 0 0.25rem;
511
+ }
512
+ .behind-ai {
513
+ font-size: 0.8125rem;
514
+ white-space: pre-wrap;
515
+ color: var(--muted-foreground);
516
+ background: var(--muted);
517
+ border-radius: 0.5rem;
518
+ padding: 0.625rem 0.75rem;
519
+ margin-bottom: 0.5rem;
520
+ }
521
+ .behind-card-source {
522
+ margin-top: 2rem;
523
+ font-size: 0.75rem;
524
+ color: var(--muted-foreground);
525
+ }
526
+ .behind-card-source:empty {
527
+ display: none;
528
+ }
444
529
  .detail-tab {
445
530
  position: relative;
446
531
  display: inline-flex;
@@ -516,27 +601,6 @@
516
601
  background: var(--chart-4, oklch(0.72 0.16 70));
517
602
  box-shadow: 0 0 0 2px
518
603
  color-mix(in oklab, var(--chart-4, oklch(0.72 0.16 70)) 25%, transparent);
519
-
520
- /* How many items are still waiting on a maintainer. Amber rather than red: an entry
521
- with open feedback is disputed, not broken, and red is already the withdraw
522
- affordance in the same thread. 5.45:1 light, 8.08:1 dark. */
523
- .feedback-open-count {
524
- display: inline-flex;
525
- align-items: center;
526
- justify-content: center;
527
- min-width: 1.15rem;
528
- border-radius: 999px;
529
- padding: 0.15rem 0.35rem;
530
- font-size: 0.6875rem;
531
- font-weight: 600;
532
- line-height: 1;
533
- letter-spacing: normal;
534
- text-transform: none;
535
- white-space: nowrap;
536
- color: color-mix(in oklab, var(--chart-4) 45%, var(--foreground));
537
- background: color-mix(in oklab, var(--chart-4) 18%, var(--card));
538
- border: 1px solid color-mix(in oklab, var(--chart-4) 38%, var(--card));
539
- }
540
604
  }
541
605
 
542
606
  /* tw-animate-css ships no reduced-motion rules of its own, so honour the
@@ -551,3 +615,391 @@
551
615
  scroll-behavior: auto !important;
552
616
  }
553
617
  }
618
+
619
+ /* Comments on Behind this card: the heading with its help, then one feed.
620
+ A comment is a small meta line above the words, like a thread. */
621
+ .comments-head {
622
+ position: relative;
623
+ display: flex;
624
+ align-items: center;
625
+ gap: 0.375rem;
626
+ margin-bottom: 0.875rem;
627
+ }
628
+ .comments-head .behind-group__title {
629
+ margin-bottom: 0;
630
+ }
631
+ .comments-help-button {
632
+ display: grid;
633
+ place-items: center;
634
+ width: 24px;
635
+ height: 24px;
636
+ border-radius: 999px;
637
+ color: var(--muted-foreground);
638
+ }
639
+ .comments-help-button:hover,
640
+ .comments-help-button[aria-expanded='true'] {
641
+ color: var(--foreground);
642
+ }
643
+ .comments-help-button:focus-visible {
644
+ outline: 2px solid var(--ring);
645
+ outline-offset: 1px;
646
+ }
647
+ /* Touch targets: ≥44×44px on coarse pointers, without moving the icon. */
648
+ @media (pointer: coarse) {
649
+ .comments-help-button {
650
+ width: 44px;
651
+ height: 44px;
652
+ margin: -10px;
653
+ }
654
+ }
655
+ .comments-help {
656
+ position: absolute;
657
+ top: 100%;
658
+ left: 0;
659
+ z-index: 20;
660
+ width: min(24rem, 100%);
661
+ margin-top: 0.375rem;
662
+ padding: 0.75rem 0.875rem;
663
+ border: 1px solid var(--border);
664
+ border-radius: 10px;
665
+ background: var(--popover);
666
+ color: var(--popover-foreground);
667
+ box-shadow: 0 8px 24px rgb(0 0 0 / 0.08);
668
+ font-size: 0.8125rem;
669
+ line-height: 1.5;
670
+ }
671
+ .comments-help[hidden] {
672
+ display: none;
673
+ }
674
+ .comments-help__title {
675
+ font-weight: 600;
676
+ margin-bottom: 0.375rem;
677
+ }
678
+ .comments-help ul {
679
+ list-style: disc;
680
+ margin: 0 0 0.5rem;
681
+ padding-left: 1.125rem;
682
+ }
683
+ .comments-help__note {
684
+ color: var(--muted-foreground);
685
+ }
686
+ .comments {
687
+ display: grid;
688
+ gap: 1.375rem;
689
+ margin: 0;
690
+ padding: 0;
691
+ list-style: none;
692
+ }
693
+ .comment__meta {
694
+ display: flex;
695
+ flex-wrap: wrap;
696
+ align-items: center;
697
+ gap: 0 0.3rem;
698
+ font-size: 0.71875rem;
699
+ line-height: 1.3;
700
+ color: var(--muted-foreground);
701
+ }
702
+ .comment__who {
703
+ font-weight: 500;
704
+ color: color-mix(in oklab, var(--muted-foreground) 60%, var(--foreground));
705
+ }
706
+ .comment__text {
707
+ margin-top: 1px;
708
+ font-size: 0.9375rem;
709
+ line-height: 1.5;
710
+ color: var(--foreground);
711
+ white-space: pre-wrap;
712
+ }
713
+ .comment__text.is-empty {
714
+ font-style: italic;
715
+ color: var(--muted-foreground);
716
+ }
717
+ .comment__reply {
718
+ margin-top: 0.25rem;
719
+ font-size: 0.84375rem;
720
+ color: var(--muted-foreground);
721
+ white-space: pre-wrap;
722
+ }
723
+ .comment__actions {
724
+ display: flex;
725
+ gap: 0.75rem;
726
+ margin-top: 0.25rem;
727
+ font-size: 0.75rem;
728
+ color: var(--muted-foreground);
729
+ }
730
+ .comment__actions button {
731
+ text-decoration: underline;
732
+ }
733
+ .comment__actions button:hover {
734
+ color: var(--foreground);
735
+ }
736
+ .comment__actions button.is-destructive:hover {
737
+ color: var(--destructive);
738
+ }
739
+ .community-shots {
740
+ display: flex;
741
+ flex-wrap: wrap;
742
+ gap: 0.375rem;
743
+ margin-top: 0.375rem;
744
+ }
745
+ .community-shots img {
746
+ display: block;
747
+ width: 48px;
748
+ height: 36px;
749
+ object-fit: cover;
750
+ border-radius: 5px;
751
+ border: 1px solid var(--border);
752
+ }
753
+ .community-shots a:hover img {
754
+ border-color: var(--ring);
755
+ }
756
+ .comments-skeleton {
757
+ display: grid;
758
+ gap: 1.375rem;
759
+ }
760
+ .comments-skeleton__item {
761
+ display: grid;
762
+ gap: 0.375rem;
763
+ }
764
+ .comments-skeleton__item::before,
765
+ .comments-skeleton__item::after {
766
+ content: '';
767
+ height: 1em;
768
+ background: var(--muted);
769
+ border-radius: 4px;
770
+ }
771
+ .comments-skeleton__item::before {
772
+ width: 30%;
773
+ }
774
+ .comments-skeleton__item::after {
775
+ width: 80%;
776
+ margin-top: 0.125rem;
777
+ }
778
+ @media (prefers-reduced-motion: no-preference) {
779
+ .comments-skeleton__item::before,
780
+ .comments-skeleton__item::after {
781
+ animation: skeleton-shimmer 2s ease-in-out infinite;
782
+ }
783
+ }
784
+ @keyframes skeleton-shimmer {
785
+ 0%,
786
+ 100% {
787
+ opacity: 1;
788
+ }
789
+ 50% {
790
+ opacity: 0.5;
791
+ }
792
+ }
793
+ .comments-empty {
794
+ font-size: 0.9375rem;
795
+ line-height: 1.5;
796
+ color: var(--muted-foreground);
797
+ }
798
+
799
+ /* "Know more?" — the input at the top of Behind this card */
800
+ .know-more {
801
+ margin-bottom: 3rem;
802
+ }
803
+ /* "Share what you know" points here; a dragged file shows where it lands. */
804
+ .know-more.is-flash .know-more-field textarea:not(.know-more-mirror),
805
+ .know-more[data-drop] .know-more-field textarea:not(.know-more-mirror) {
806
+ border-color: color-mix(in oklab, var(--primary) 85%, black);
807
+ box-shadow: 0 0 0 4px color-mix(in oklab, var(--primary) 25%, transparent);
808
+ }
809
+ .know-more[data-drop] .know-more-field textarea:not(.know-more-mirror) {
810
+ border-style: dashed;
811
+ }
812
+ .know-more-field {
813
+ position: relative;
814
+ display: flex;
815
+ align-items: flex-end;
816
+ gap: 0.5rem;
817
+ }
818
+ .know-more-field textarea:not(.know-more-mirror) {
819
+ flex: 1;
820
+ min-height: 0;
821
+ resize: none;
822
+ font: inherit;
823
+ font-size: 0.9375rem;
824
+ line-height: 20px;
825
+ padding: 9px 14px;
826
+ border: 1px solid var(--border);
827
+ border-radius: 10px;
828
+ background: var(--card);
829
+ outline: none;
830
+ transition:
831
+ height 0.22s cubic-bezier(0.2, 0.8, 0.2, 1),
832
+ border-color 0.15s,
833
+ background 0.15s,
834
+ box-shadow 0.15s;
835
+ }
836
+ /* iOS zooms inputs under 16px on mobile; use 16px below 640px. */
837
+ @media (max-width: 639px) {
838
+ .know-more-field textarea:not(.know-more-mirror) {
839
+ font-size: 1rem;
840
+ }
841
+ }
842
+ .know-more-field textarea:not(.know-more-mirror):focus {
843
+ border-color: var(--ring);
844
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--ring) 25%, transparent);
845
+ }
846
+ .know-more-field textarea:not(.know-more-mirror)::placeholder {
847
+ white-space: nowrap;
848
+ overflow: hidden;
849
+ text-overflow: ellipsis;
850
+ }
851
+ .know-more-clip {
852
+ flex: none;
853
+ display: grid;
854
+ place-items: center;
855
+ width: 40px;
856
+ height: 40px;
857
+ border-radius: 10px;
858
+ color: var(--muted-foreground);
859
+ opacity: 0.6;
860
+ transition: opacity 0.15s;
861
+ }
862
+ /* Touch targets: ≥44×44px on coarse pointers. */
863
+ @media (pointer: coarse) {
864
+ .know-more-clip {
865
+ width: 44px;
866
+ height: 44px;
867
+ }
868
+ }
869
+ .know-more-clip:hover:not(:disabled),
870
+ .know-more-clip:focus-visible {
871
+ opacity: 1;
872
+ background: var(--muted);
873
+ }
874
+ .know-more-clip:disabled {
875
+ cursor: not-allowed;
876
+ opacity: 0.3;
877
+ }
878
+ .know-more-thumbs {
879
+ display: flex;
880
+ flex-wrap: wrap;
881
+ gap: 0.5rem;
882
+ margin: 0 0 0.5rem;
883
+ padding: 0;
884
+ list-style: none;
885
+ }
886
+ .know-more-thumb {
887
+ position: relative;
888
+ width: 56px;
889
+ height: 42px;
890
+ overflow: hidden;
891
+ border-radius: 6px;
892
+ border: 1px solid var(--border);
893
+ }
894
+ .know-more-thumb img {
895
+ display: block;
896
+ width: 100%;
897
+ height: 100%;
898
+ object-fit: cover;
899
+ }
900
+ .know-more-thumb button {
901
+ position: absolute;
902
+ top: 1px;
903
+ right: 1px;
904
+ display: grid;
905
+ place-items: center;
906
+ width: 16px;
907
+ height: 16px;
908
+ border-radius: 999px;
909
+ background: rgb(0 0 0 / 0.55);
910
+ color: white;
911
+ }
912
+ /* Always there, so the input never shifts; grey until there is something to send. */
913
+ .know-more-send {
914
+ flex: none;
915
+ height: 40px;
916
+ padding-inline: 1rem;
917
+ border-radius: 10px;
918
+ font-size: 0.875rem;
919
+ }
920
+ @media (pointer: coarse) {
921
+ .know-more-send {
922
+ height: 44px;
923
+ }
924
+ }
925
+ .know-more-send:disabled {
926
+ opacity: 1;
927
+ background: var(--muted);
928
+ color: var(--muted-foreground);
929
+ }
930
+ .know-more-mirror {
931
+ position: absolute;
932
+ visibility: hidden;
933
+ height: 0;
934
+ overflow: hidden;
935
+ top: 0;
936
+ left: 0;
937
+ padding: 9px 14px;
938
+ font: inherit;
939
+ font-size: 0.9375rem;
940
+ line-height: 20px;
941
+ border: 1px solid transparent;
942
+ resize: none;
943
+ }
944
+ @media (max-width: 639px) {
945
+ .know-more-mirror {
946
+ font-size: 1rem;
947
+ }
948
+ }
949
+ .know-more-hint {
950
+ font-size: 0.75rem;
951
+ color: var(--muted-foreground);
952
+ max-height: 0;
953
+ opacity: 0;
954
+ overflow: hidden;
955
+ transition:
956
+ max-height 0.2s ease,
957
+ opacity 0.2s ease,
958
+ margin 0.2s ease;
959
+ }
960
+ .know-more-hint.is-on {
961
+ /* Room for two lines: on a narrow card the hint wraps. */
962
+ max-height: 3rem;
963
+ opacity: 1;
964
+ margin-top: 0.375rem;
965
+ }
966
+ .know-more-attaching {
967
+ margin-top: 0.375rem;
968
+ font-size: 0.75rem;
969
+ color: var(--muted-foreground);
970
+ }
971
+ .know-more-attaching:empty {
972
+ display: none;
973
+ }
974
+ .know-more-clip[aria-busy] {
975
+ cursor: progress;
976
+ }
977
+ .know-more-error {
978
+ margin-top: 0.5rem;
979
+ font-size: 0.8125rem;
980
+ color: var(--destructive);
981
+ }
982
+ .know-more-sent {
983
+ font-size: 0.8125rem;
984
+ color: oklch(0.52 0.14 150);
985
+ max-height: 0;
986
+ opacity: 0;
987
+ overflow: hidden;
988
+ transition:
989
+ max-height 0.25s ease,
990
+ opacity 0.25s ease;
991
+ }
992
+ .know-more-sent.is-on {
993
+ max-height: 1.5rem;
994
+ opacity: 1;
995
+ margin-top: 0.5rem;
996
+ }
997
+ @media (prefers-reduced-motion: reduce) {
998
+ .know-more-field textarea:not(.know-more-mirror),
999
+ .know-more-clip,
1000
+ .know-more-hint,
1001
+ .know-more-sent,
1002
+ .detail-share {
1003
+ transition: none;
1004
+ }
1005
+ }