@duskmoon-dev/components 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@
4
4
  import { useCallback, useState } from "react";
5
5
 
6
6
  // src/generated/version.ts
7
- var version = "0.5.1";
7
+ var version = "0.5.3";
8
8
 
9
9
  // src/infrastructure.ts
10
10
  var theme = {
package/dist/styles.css CHANGED
@@ -43,8 +43,8 @@ html {
43
43
  color: var(--color-base-content);
44
44
  }
45
45
 
46
- /* Focus ring utility */
47
- :focus-visible {
46
+ /* Focus ring utility; the integrated chat input uses its composer's ring. */
47
+ :focus-visible:not(:where(.chat-composer .chat-composer-input)) {
48
48
  outline: 2px solid var(--color-primary);
49
49
  outline-offset: 2px;
50
50
  }
@@ -434,29 +434,33 @@ html {
434
434
  grid-template-columns: repeat(auto-fit, minmax(min(calc(--value(integer) * 0.25rem), 100%), 1fr));
435
435
  }
436
436
 
437
- /* Screen reader only utility - visually hidden but accessible */
438
- .sr-only {
439
- position: absolute;
440
- width: 1px;
441
- height: 1px;
442
- padding: 0;
443
- margin: -1px;
444
- overflow: hidden;
445
- clip: rect(0, 0, 0, 0);
446
- white-space: nowrap;
447
- border: 0;
448
- }
437
+ /* Low-specificity fallbacks let Tailwind variants override either import order. */
438
+ @layer utilities {
439
+ /* Screen reader only utility - visually hidden but accessible */
440
+ :where(.sr-only) {
441
+ position: absolute;
442
+ width: 1px;
443
+ height: 1px;
444
+ padding: 0;
445
+ margin: -1px;
446
+ overflow: hidden;
447
+ clip-path: inset(50%);
448
+ white-space: nowrap;
449
+ border: 0;
450
+ }
449
451
 
450
- /* Undo sr-only for focus states (useful for skip links) */
451
- .not-sr-only {
452
- position: static;
453
- width: auto;
454
- height: auto;
455
- padding: 0;
456
- margin: 0;
457
- overflow: visible;
458
- clip: auto;
459
- white-space: normal;
452
+ /* Undo sr-only for focus states (useful for skip links) */
453
+ :where(.not-sr-only) {
454
+ position: static;
455
+ width: auto;
456
+ height: auto;
457
+ padding: 0;
458
+ margin: 0;
459
+ overflow: visible;
460
+ clip: auto;
461
+ clip-path: none;
462
+ white-space: normal;
463
+ }
460
464
  }
461
465
 
462
466
 
@@ -5075,6 +5079,10 @@ html {
5075
5079
  .pagination-item-active,
5076
5080
  .pagination-item-active-primary,
5077
5081
  .pagination-item[aria-current="page"],
5082
+ .pagination li > a.pagination-item-active,
5083
+ .pagination li > button.pagination-item-active,
5084
+ .pagination li > a.pagination-item-active-primary,
5085
+ .pagination li > button.pagination-item-active-primary,
5078
5086
  .pagination li > a.active,
5079
5087
  .pagination li > button.active,
5080
5088
  .pagination li > a[aria-current="page"],
@@ -5084,13 +5092,19 @@ html {
5084
5092
  border-color: var(--color-primary);
5085
5093
  }
5086
5094
 
5087
- .pagination-item-active-secondary {
5095
+ .pagination-item-active-secondary,
5096
+ .pagination-item-active-secondary[aria-current="page"],
5097
+ .pagination li > a.pagination-item-active-secondary,
5098
+ .pagination li > button.pagination-item-active-secondary {
5088
5099
  background-color: var(--color-secondary);
5089
5100
  color: var(--color-secondary-content);
5090
5101
  border-color: var(--color-secondary);
5091
5102
  }
5092
5103
 
5093
- .pagination-item-active-tertiary {
5104
+ .pagination-item-active-tertiary,
5105
+ .pagination-item-active-tertiary[aria-current="page"],
5106
+ .pagination li > a.pagination-item-active-tertiary,
5107
+ .pagination li > button.pagination-item-active-tertiary {
5094
5108
  background-color: var(--color-tertiary);
5095
5109
  color: var(--color-tertiary-content);
5096
5110
  border-color: var(--color-tertiary);
@@ -5099,11 +5113,29 @@ html {
5099
5113
  .pagination-item-active:hover,
5100
5114
  .pagination-item-active-primary:hover,
5101
5115
  .pagination-item[aria-current="page"]:hover,
5116
+ .pagination li > a.pagination-item-active:hover,
5117
+ .pagination li > button.pagination-item-active:hover,
5118
+ .pagination li > a.pagination-item-active-primary:hover,
5119
+ .pagination li > button.pagination-item-active-primary:hover,
5102
5120
  .pagination li > a[aria-current="page"]:hover,
5103
5121
  .pagination li > button[aria-current="page"]:hover {
5104
5122
  background-color: color-mix(in oklch, var(--color-primary), black 10%);
5105
5123
  }
5106
5124
 
5125
+ .pagination-item-active-secondary:hover,
5126
+ .pagination-item-active-secondary[aria-current="page"]:hover,
5127
+ .pagination li > a.pagination-item-active-secondary:hover,
5128
+ .pagination li > button.pagination-item-active-secondary:hover {
5129
+ background-color: color-mix(in oklch, var(--color-secondary), black 10%);
5130
+ }
5131
+
5132
+ .pagination-item-active-tertiary:hover,
5133
+ .pagination-item-active-tertiary[aria-current="page"]:hover,
5134
+ .pagination li > a.pagination-item-active-tertiary:hover,
5135
+ .pagination li > button.pagination-item-active-tertiary:hover {
5136
+ background-color: color-mix(in oklch, var(--color-tertiary), black 10%);
5137
+ }
5138
+
5107
5139
  .pagination-item:focus-visible,
5108
5140
  .pagination-prev:focus-visible,
5109
5141
  .pagination-next:focus-visible,
@@ -5318,7 +5350,9 @@ html {
5318
5350
  .megamenu-panel[popover] {
5319
5351
  position-anchor: var(--megamenu-anchor);
5320
5352
  position-area: block-end span-inline-end;
5321
- position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
5353
+ /* Narrow viewports need candidates spanning the whole inline axis. */
5354
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline,
5355
+ block-end span-all, block-start span-all;
5322
5356
  display: none; box-sizing: border-box;
5323
5357
  width: min(48rem, calc(100vw - 2rem)); max-width: calc(100vw - 2rem);
5324
5358
  max-height: min(36rem, calc(100dvh - 2rem)); margin: 0.5rem; padding: 1rem;
@@ -6643,6 +6677,103 @@ html {
6643
6677
  justify-self: end;
6644
6678
  }
6645
6679
 
6680
+ .chat-agent {
6681
+ align-items: start;
6682
+ row-gap: 0.5rem;
6683
+ padding: 0.75rem 0;
6684
+ min-inline-size: 0;
6685
+ color: var(--color-on-surface);
6686
+ }
6687
+
6688
+ .chat-agent:not(:has(> .chat-avatar)) {
6689
+ grid-template-columns: minmax(0, 1fr);
6690
+ }
6691
+
6692
+ .chat-agent:not(:has(> .chat-avatar)) > * {
6693
+ grid-column: 1;
6694
+ }
6695
+
6696
+ .chat-agent .chat-avatar {
6697
+ grid-row: 1;
6698
+ }
6699
+
6700
+ .chat-content {
6701
+ width: 100%;
6702
+ min-inline-size: 0;
6703
+ box-sizing: border-box;
6704
+ color: var(--color-on-surface);
6705
+ font-size: 0.9375rem;
6706
+ line-height: 1.6;
6707
+ overflow-wrap: anywhere;
6708
+ }
6709
+
6710
+ .chat-content pre {
6711
+ max-inline-size: 100%;
6712
+ min-inline-size: 0;
6713
+ overflow: auto;
6714
+ white-space: pre;
6715
+ }
6716
+
6717
+ .chat-content a {
6718
+ overflow-wrap: anywhere;
6719
+ text-decoration: underline;
6720
+ }
6721
+
6722
+ .chat-work {
6723
+ width: 100%;
6724
+ min-inline-size: 0;
6725
+ border: 0;
6726
+ padding: 0;
6727
+ background: transparent;
6728
+ }
6729
+
6730
+ .chat-work-summary {
6731
+ display: flex;
6732
+ flex-wrap: wrap;
6733
+ align-items: center;
6734
+ gap: 0.5rem;
6735
+ padding: 0.5rem 0;
6736
+ border-block-end: 1px solid var(--color-outline-variant);
6737
+ color: var(--color-on-surface-variant);
6738
+ font-size: 0.8125rem;
6739
+ line-height: 1.5;
6740
+ overflow-wrap: anywhere;
6741
+ list-style: none;
6742
+ cursor: pointer;
6743
+ }
6744
+
6745
+ .chat-work-summary::-webkit-details-marker {
6746
+ display: none;
6747
+ }
6748
+
6749
+ .chat-work-summary::after {
6750
+ content: "›";
6751
+ flex-shrink: 0;
6752
+ }
6753
+
6754
+ .chat-work[open] > .chat-work-summary::after {
6755
+ transform: rotate(90deg);
6756
+ }
6757
+
6758
+ .chat-work-summary:focus-visible {
6759
+ outline: none;
6760
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
6761
+ }
6762
+
6763
+ .chat-work-body {
6764
+ display: flex;
6765
+ flex-direction: column;
6766
+ gap: 0.5rem;
6767
+ padding: 0.75rem 0;
6768
+ }
6769
+
6770
+ .chat-agent .chat-reasoning,
6771
+ .chat-agent .chat-tool {
6772
+ width: 100%;
6773
+ max-width: none;
6774
+ box-sizing: border-box;
6775
+ }
6776
+
6646
6777
  .chat-header,
6647
6778
  .chat-footer {
6648
6779
  color: var(--color-on-surface-variant);
@@ -6707,6 +6838,206 @@ html {
6707
6838
  }
6708
6839
  }
6709
6840
 
6841
+ /** Waiting messages; the application owns dispatch, steer, and removal. */
6842
+ .chat-input-area {
6843
+ display: flex;
6844
+ flex-direction: column;
6845
+ min-inline-size: 0;
6846
+ box-sizing: border-box;
6847
+ color: var(--color-on-surface);
6848
+ }
6849
+
6850
+ .chat-input-area > .chat-queue {
6851
+ margin-inline: 0.75rem;
6852
+ margin-block-end: -0.5rem;
6853
+ padding: 0.125rem 0.5rem 0.625rem;
6854
+ border-block-end: 0;
6855
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
6856
+ }
6857
+
6858
+ .chat-input-area > .chat-queue .chat-queue-header:not(.sr-only) {
6859
+ padding: 0.125rem 0 0.5rem;
6860
+ }
6861
+
6862
+ .chat-input-area > .chat-queue .chat-queue-list {
6863
+ padding: 0;
6864
+ }
6865
+
6866
+ .chat-queue {
6867
+ min-inline-size: 0;
6868
+ max-inline-size: 100%;
6869
+ box-sizing: border-box;
6870
+ border: 1px solid var(--color-outline-variant);
6871
+ border-radius: var(--radius-md);
6872
+ background-color: var(--color-surface-container-low);
6873
+ color: var(--color-on-surface);
6874
+ font-size: 0.875rem;
6875
+ line-height: 1.45;
6876
+ }
6877
+
6878
+ .chat-queue-header:not(.sr-only) {
6879
+ display: flex;
6880
+ flex-wrap: wrap;
6881
+ align-items: center;
6882
+ justify-content: space-between;
6883
+ gap: 0.5rem;
6884
+ padding: 0.625rem 0.875rem;
6885
+ }
6886
+
6887
+ .chat-queue-title {
6888
+ margin: 0;
6889
+ font-size: inherit;
6890
+ font-weight: 600;
6891
+ overflow-wrap: anywhere;
6892
+ }
6893
+
6894
+ .chat-queue-list {
6895
+ display: flex;
6896
+ flex-direction: column;
6897
+ gap: 0;
6898
+ max-block-size: 16rem;
6899
+ overflow-y: auto;
6900
+ overscroll-behavior: contain;
6901
+ margin: 0;
6902
+ padding: 0 0.875rem 0.875rem;
6903
+ box-sizing: border-box;
6904
+ list-style: none;
6905
+ }
6906
+
6907
+ .chat-queue-item {
6908
+ display: flex;
6909
+ flex-shrink: 0;
6910
+ flex-wrap: nowrap;
6911
+ align-items: center;
6912
+ gap: 0.375rem;
6913
+ min-inline-size: 0;
6914
+ max-inline-size: 100%;
6915
+ box-sizing: border-box;
6916
+ padding: 0.375rem 0.5rem;
6917
+ border: 0;
6918
+ background-color: transparent;
6919
+ }
6920
+
6921
+ .chat-queue-icon {
6922
+ flex-shrink: 0;
6923
+ inline-size: 1rem;
6924
+ block-size: 1rem;
6925
+ color: var(--color-on-surface-variant);
6926
+ }
6927
+
6928
+ .chat-queue-item-active .chat-queue-icon {
6929
+ color: var(--color-on-surface);
6930
+ }
6931
+
6932
+ .chat-queue-attachment {
6933
+ flex-shrink: 0;
6934
+ inline-size: 2rem;
6935
+ block-size: 2rem;
6936
+ object-fit: cover;
6937
+ border-radius: var(--radius-xs);
6938
+ }
6939
+
6940
+ .chat-queue-number {
6941
+ flex-shrink: 0;
6942
+ color: var(--color-on-surface-variant);
6943
+ font-variant-numeric: tabular-nums;
6944
+ }
6945
+
6946
+ .chat-queue-count {
6947
+ white-space: nowrap;
6948
+ }
6949
+
6950
+ .chat-queue-content {
6951
+ flex: 1 1 8rem;
6952
+ min-inline-size: 0;
6953
+ margin: 0;
6954
+ overflow: hidden;
6955
+ white-space: nowrap;
6956
+ text-overflow: ellipsis;
6957
+ }
6958
+
6959
+ .chat-queue-actions {
6960
+ flex-wrap: nowrap;
6961
+ flex-shrink: 0;
6962
+ margin-inline-start: auto;
6963
+ }
6964
+
6965
+ .chat-queue-steer,
6966
+ .chat-queue-remove {
6967
+ flex-shrink: 0;
6968
+ }
6969
+
6970
+ .chat-queue[hidden],
6971
+ .chat-queue-item[hidden] {
6972
+ display: none;
6973
+ }
6974
+
6975
+ .chat-composer {
6976
+ position: relative;
6977
+ display: flex;
6978
+ flex-direction: column;
6979
+ gap: 0.5rem;
6980
+ min-inline-size: 0;
6981
+ box-sizing: border-box;
6982
+ margin: 0;
6983
+ padding: 1rem;
6984
+ border: 1px solid currentColor;
6985
+ border-radius: var(--radius-xl);
6986
+ background-color: var(--color-surface-container-high);
6987
+ color: var(--color-on-surface);
6988
+ }
6989
+
6990
+ .chat-composer:focus-within {
6991
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
6992
+ }
6993
+
6994
+ .chat-composer-input {
6995
+ display: block;
6996
+ width: 100%;
6997
+ min-inline-size: 0;
6998
+ min-block-size: 3rem;
6999
+ box-sizing: border-box;
7000
+ margin: 0;
7001
+ padding: 0;
7002
+ border: 0;
7003
+ outline: none;
7004
+ background-color: transparent;
7005
+ color: var(--color-on-surface);
7006
+ font: inherit;
7007
+ font-size: 0.9375rem;
7008
+ line-height: 1.5;
7009
+ resize: vertical;
7010
+ }
7011
+
7012
+ .chat-composer-input::placeholder {
7013
+ color: var(--color-on-surface-variant);
7014
+ opacity: 1;
7015
+ }
7016
+
7017
+ .chat-composer-actions {
7018
+ display: flex;
7019
+ flex-wrap: wrap;
7020
+ align-items: center;
7021
+ justify-content: flex-end;
7022
+ gap: 0.5rem;
7023
+ }
7024
+
7025
+ .chat-composer-hint {
7026
+ font-family: inherit;
7027
+ font-size: 0.75rem;
7028
+ font-weight: 400;
7029
+ opacity: 1;
7030
+ }
7031
+
7032
+ .chat-composer-primary { color: var(--color-primary); }
7033
+ .chat-composer-secondary { color: var(--color-secondary); }
7034
+ .chat-composer-tertiary { color: var(--color-tertiary); }
7035
+ .chat-composer-info { color: var(--color-info); }
7036
+ .chat-composer-success { color: var(--color-success); }
7037
+ .chat-composer-warning { color: var(--color-warning); }
7038
+ .chat-composer-error { color: var(--color-error); }
7039
+ .chat-composer-ghost { border-color: transparent; }
7040
+
6710
7041
  .chat-bubble {
6711
7042
  --chat-bubble-bg: var(--color-surface-container-highest);
6712
7043
  --chat-bubble-fg: var(--color-on-surface);
@@ -6732,40 +7063,29 @@ html {
6732
7063
  .chat-bubble-content {
6733
7064
  min-width: 0;
6734
7065
  }
6735
- .chat-bubble pre { max-inline-size: 100%; min-inline-size: 0; overflow: auto; white-space: pre; }
6736
- .chat-bubble a { overflow-wrap: anywhere; text-decoration: underline; }
6737
7066
 
6738
- .chat-start .chat-bubble::before,
6739
- .chat-end .chat-bubble::before {
6740
- content: "";
6741
- position: absolute;
6742
- inset-block-start: 0;
6743
- inline-size: 0.75rem;
6744
- block-size: 0.75rem;
6745
- background-color: var(--chat-bubble-bg);
6746
- mask-image: radial-gradient(ellipse at 0 100%, transparent 68%, black 72%);
6747
- pointer-events: none;
6748
- }
6749
-
6750
- .chat-start .chat-bubble::before {
6751
- inset-inline-start: -0.5rem;
7067
+ .chat-bubble-collapsible > .chat-bubble-content {
7068
+ max-block-size: 6lh;
7069
+ overflow: hidden;
7070
+ white-space: pre-wrap;
6752
7071
  }
6753
7072
 
6754
- .chat-start .chat-bubble {
6755
- border-start-start-radius: 0;
7073
+ .chat-bubble-collapsible:has(> .chat-bubble-toggle[aria-expanded="true"]) > .chat-bubble-content {
7074
+ max-block-size: none;
7075
+ overflow: visible;
6756
7076
  }
6757
7077
 
6758
- .chat-end .chat-bubble::before {
6759
- inset-inline-end: -0.5rem;
6760
- transform: scaleX(-1);
7078
+ .chat-bubble-toggle {
7079
+ align-self: flex-end;
7080
+ color: inherit;
6761
7081
  }
6762
7082
 
6763
- .chat-end .chat-bubble {
6764
- border-start-end-radius: 0;
7083
+ .chat-bubble-toggle[hidden] {
7084
+ display: none;
6765
7085
  }
6766
7086
 
6767
- .chat-start:dir(rtl) .chat-bubble::before { transform: scaleX(-1); }
6768
- .chat-end:dir(rtl) .chat-bubble::before { transform: none; }
7087
+ .chat-bubble pre { max-inline-size: 100%; min-inline-size: 0; overflow: auto; white-space: pre; }
7088
+ .chat-bubble a { overflow-wrap: anywhere; text-decoration: underline; }
6769
7089
 
6770
7090
  .chat-bubble-primary {
6771
7091
  --chat-bubble-bg: var(--color-primary-container);
@@ -7035,6 +7355,7 @@ html {
7035
7355
  animation-delay: 300ms;
7036
7356
  }
7037
7357
 
7358
+ .chat-streaming::after,
7038
7359
  .chat-bubble-streaming::after,
7039
7360
  .chat-bubble-content.chat-bubble-streaming::after {
7040
7361
  content: "";
@@ -7114,12 +7435,14 @@ html {
7114
7435
  .chat-typing::before,
7115
7436
  .chat-typing::after,
7116
7437
  .chat-typing span,
7438
+ .chat-streaming::after,
7117
7439
  .chat-bubble-streaming::after,
7118
7440
  .chat-bubble-content.chat-bubble-streaming::after,
7119
7441
  .chat-tool-running .chat-tool-header::before {
7120
7442
  animation: none;
7121
7443
  }
7122
7444
 
7445
+ .chat-streaming::after,
7123
7446
  .chat-bubble-streaming::after,
7124
7447
  .chat-bubble-content.chat-bubble-streaming::after {
7125
7448
  opacity: 1;
@@ -22845,6 +23168,20 @@ html {
22845
23168
  margin-block-end: 0.5rem;
22846
23169
  }
22847
23170
 
23171
+ /* Chat prose follows the bubble; embedded surfaces keep their own color pair. */
23172
+ .chat-bubble .markdown-body,
23173
+ .chat-bubble .markdown-body :is(a, blockquote, h6, del, s, figcaption) {
23174
+ color: inherit;
23175
+ }
23176
+
23177
+ .chat-bubble .markdown-body a {
23178
+ text-decoration: underline;
23179
+ }
23180
+
23181
+ .chat-bubble .markdown-body :is(code, pre, kbd, th, tr:nth-child(2n)) {
23182
+ color: var(--color-on-surface);
23183
+ }
23184
+
22848
23185
  /* ============================================
22849
23186
  * EDGE CASES (T042-T043)
22850
23187
  * ============================================ */
@@ -29382,19 +29719,7 @@ html {
29382
29719
  width: 100%;
29383
29720
  }
29384
29721
 
29385
- /* Composer state and layout are independent from conversation rows. */
29386
- .chat-composer {
29387
- display: flex;
29388
- flex-direction: column;
29389
- gap: 0.625rem;
29390
- min-width: 0;
29391
- padding: 0.75rem;
29392
- border: 1px solid var(--color-outline-variant);
29393
- border-radius: var(--radius-box, 0.75rem);
29394
- background: var(--color-surface);
29395
- color: var(--color-on-surface);
29396
- }
29397
-
29722
+ /* The controlled helper retains its bounded editor; Core owns composer presentation. */
29398
29723
  .chat-composer .chat-composer-editor {
29399
29724
  box-sizing: border-box;
29400
29725
  width: 100%;
@@ -29404,7 +29729,6 @@ html {
29404
29729
  line-height: 1.5rem;
29405
29730
  }
29406
29731
 
29407
- .chat-composer-actions,
29408
29732
  .chat-composer-attachments {
29409
29733
  display: flex;
29410
29734
  align-items: center;
@@ -29470,6 +29794,6 @@ html {
29470
29794
  font-size: 0.875rem;
29471
29795
  }
29472
29796
 
29473
- .chat-composer-error {
29797
+ .chat-composer .chat-composer-error {
29474
29798
  color: var(--color-error);
29475
29799
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duskmoon-dev/components",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -472,7 +472,7 @@
472
472
  }
473
473
  ],
474
474
  "peerDependencies": {
475
- "@duskmoon-dev/core": ">=1.20.3",
475
+ "@duskmoon-dev/core": ">=1.20.6",
476
476
  "react": ">=19.0.0",
477
477
  "react-dom": ">=19.0.0"
478
478
  },
@@ -485,7 +485,7 @@
485
485
  "ajv-formats": "^3.0.1"
486
486
  },
487
487
  "devDependencies": {
488
- "@duskmoon-dev/core": "1.20.3",
488
+ "@duskmoon-dev/core": "1.20.7",
489
489
  "@testing-library/react": "16.3.2",
490
490
  "@types/react": "19.2.18",
491
491
  "@types/react-dom": "19.2.4",