@starci/grammar 0.4.3 → 0.4.5

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 (118) hide show
  1. package/dist/common/registry.d.ts +2 -2
  2. package/dist/common/renderers.d.ts +2 -2
  3. package/dist/common/renderers.d.ts.map +1 -1
  4. package/dist/common/renderers.js.map +1 -1
  5. package/dist/common/styles.css +640 -14
  6. package/dist/core/branch/MarkdownArticle/classNames.d.ts +9 -4
  7. package/dist/core/branch/MarkdownArticle/classNames.d.ts.map +1 -1
  8. package/dist/core/branch/MarkdownArticle/classNames.js +9 -4
  9. package/dist/core/branch/MarkdownArticle/classNames.js.map +1 -1
  10. package/dist/core/branch/Rail/classNames.d.ts +8 -4
  11. package/dist/core/branch/Rail/classNames.d.ts.map +1 -1
  12. package/dist/core/branch/Rail/classNames.js +8 -4
  13. package/dist/core/branch/Rail/classNames.js.map +1 -1
  14. package/dist/core/branch/Rail/index.d.ts.map +1 -1
  15. package/dist/core/branch/Rail/index.js +1 -2
  16. package/dist/core/branch/Rail/index.js.map +1 -1
  17. package/dist/core/branch/Subnav/classNames.d.ts +14 -7
  18. package/dist/core/branch/Subnav/classNames.d.ts.map +1 -1
  19. package/dist/core/branch/Subnav/classNames.js +14 -7
  20. package/dist/core/branch/Subnav/classNames.js.map +1 -1
  21. package/dist/core/branch/Subnav/index.d.ts.map +1 -1
  22. package/dist/core/branch/Subnav/index.js +2 -2
  23. package/dist/core/branch/Subnav/index.js.map +1 -1
  24. package/dist/core/branch/SurfaceAccordionCard/classNames.d.ts +16 -8
  25. package/dist/core/branch/SurfaceAccordionCard/classNames.d.ts.map +1 -1
  26. package/dist/core/branch/SurfaceAccordionCard/classNames.js +17 -9
  27. package/dist/core/branch/SurfaceAccordionCard/classNames.js.map +1 -1
  28. package/dist/core/branch/SurfaceAccordionCard/index.d.ts.map +1 -1
  29. package/dist/core/branch/SurfaceAccordionCard/index.js +1 -1
  30. package/dist/core/branch/SurfaceAccordionCard/index.js.map +1 -1
  31. package/dist/core/branch/SurfaceCard/classNames.d.ts +16 -7
  32. package/dist/core/branch/SurfaceCard/classNames.d.ts.map +1 -1
  33. package/dist/core/branch/SurfaceCard/classNames.js +17 -8
  34. package/dist/core/branch/SurfaceCard/classNames.js.map +1 -1
  35. package/dist/core/branch/SurfaceCard/index.d.ts.map +1 -1
  36. package/dist/core/branch/SurfaceCard/index.js +6 -2
  37. package/dist/core/branch/SurfaceCard/index.js.map +1 -1
  38. package/dist/core/branch/SurfaceListCard/classNames.d.ts +14 -7
  39. package/dist/core/branch/SurfaceListCard/classNames.d.ts.map +1 -1
  40. package/dist/core/branch/SurfaceListCard/classNames.js +14 -7
  41. package/dist/core/branch/SurfaceListCard/classNames.js.map +1 -1
  42. package/dist/core/branch/SurfaceListCard/index.d.ts +11 -0
  43. package/dist/core/branch/SurfaceListCard/index.d.ts.map +1 -1
  44. package/dist/core/branch/SurfaceListCard/index.js +2 -2
  45. package/dist/core/branch/SurfaceListCard/index.js.map +1 -1
  46. package/dist/core/classNames.d.ts +3 -5
  47. package/dist/core/classNames.d.ts.map +1 -1
  48. package/dist/core/classNames.js +3 -5
  49. package/dist/core/classNames.js.map +1 -1
  50. package/dist/core/composite/EmptyNotice/index.js +1 -1
  51. package/dist/core/composite/EmptyNotice/index.js.map +1 -1
  52. package/dist/core/composite/StaticStateRow/index.d.ts +11 -0
  53. package/dist/core/composite/StaticStateRow/index.d.ts.map +1 -1
  54. package/dist/core/composite/StaticStateRow/index.js +1 -1
  55. package/dist/core/composite/StaticStateRow/index.js.map +1 -1
  56. package/dist/core/composition/ChatWorkspace/classNames.d.ts +16 -9
  57. package/dist/core/composition/ChatWorkspace/classNames.d.ts.map +1 -1
  58. package/dist/core/composition/ChatWorkspace/classNames.js +21 -14
  59. package/dist/core/composition/ChatWorkspace/classNames.js.map +1 -1
  60. package/dist/core/composition/NavigationFeatureNav/classNames.d.ts +13 -8
  61. package/dist/core/composition/NavigationFeatureNav/classNames.d.ts.map +1 -1
  62. package/dist/core/composition/NavigationFeatureNav/classNames.js +13 -8
  63. package/dist/core/composition/NavigationFeatureNav/classNames.js.map +1 -1
  64. package/dist/core/composition/NavigationFeatureNav/index.d.ts +16 -2
  65. package/dist/core/composition/NavigationFeatureNav/index.d.ts.map +1 -1
  66. package/dist/core/composition/NavigationFeatureNav/index.js +2 -2
  67. package/dist/core/composition/NavigationFeatureNav/index.js.map +1 -1
  68. package/dist/core/composition/PrimaryRailLayout/index.d.ts +7 -1
  69. package/dist/core/composition/PrimaryRailLayout/index.d.ts.map +1 -1
  70. package/dist/core/composition/PrimaryRailLayout/index.js +1 -1
  71. package/dist/core/composition/PrimaryRailLayout/index.js.map +1 -1
  72. package/dist/core/dna.d.ts +27 -0
  73. package/dist/core/dna.d.ts.map +1 -1
  74. package/dist/core/dna.js +26 -0
  75. package/dist/core/dna.js.map +1 -1
  76. package/dist/core/index.d.ts +3 -3
  77. package/dist/core/index.d.ts.map +1 -1
  78. package/dist/core/index.js +1 -1
  79. package/dist/core/index.js.map +1 -1
  80. package/dist/core/primitive/Button/index.d.ts +10 -0
  81. package/dist/core/primitive/Button/index.d.ts.map +1 -1
  82. package/dist/core/primitive/Button/index.js +3 -3
  83. package/dist/core/primitive/Button/index.js.map +1 -1
  84. package/dist/core/primitive/Divider/index.js +1 -1
  85. package/dist/core/primitive/Divider/index.js.map +1 -1
  86. package/dist/core/primitive/Icon/index.d.ts.map +1 -1
  87. package/dist/core/primitive/Icon/index.js +8 -7
  88. package/dist/core/primitive/Icon/index.js.map +1 -1
  89. package/dist/core/primitive/IconButton/index.d.ts.map +1 -1
  90. package/dist/core/primitive/IconButton/index.js +7 -5
  91. package/dist/core/primitive/IconButton/index.js.map +1 -1
  92. package/dist/core/primitive/IconTile/index.d.ts.map +1 -1
  93. package/dist/core/primitive/IconTile/index.js +7 -12
  94. package/dist/core/primitive/IconTile/index.js.map +1 -1
  95. package/dist/core/primitive/Input/index.d.ts.map +1 -1
  96. package/dist/core/primitive/Input/index.js +4 -4
  97. package/dist/core/primitive/Input/index.js.map +1 -1
  98. package/dist/core/primitive/Label/classNames.d.ts +10 -6
  99. package/dist/core/primitive/Label/classNames.d.ts.map +1 -1
  100. package/dist/core/primitive/Label/classNames.js +10 -6
  101. package/dist/core/primitive/Label/classNames.js.map +1 -1
  102. package/dist/core/primitive/Label/index.js +1 -1
  103. package/dist/core/primitive/Label/index.js.map +1 -1
  104. package/dist/core/primitive/Progress/index.d.ts.map +1 -1
  105. package/dist/core/primitive/Progress/index.js +6 -2
  106. package/dist/core/primitive/Progress/index.js.map +1 -1
  107. package/dist/core/primitive/Text/index.d.ts +8 -1
  108. package/dist/core/primitive/Text/index.d.ts.map +1 -1
  109. package/dist/core/primitive/Text/index.js +16 -20
  110. package/dist/core/primitive/Text/index.js.map +1 -1
  111. package/dist/core/primitive/TextAction/index.d.ts.map +1 -1
  112. package/dist/core/primitive/TextAction/index.js +24 -23
  113. package/dist/core/primitive/TextAction/index.js.map +1 -1
  114. package/dist/core/primitive/actionStyles.d.ts +10 -2
  115. package/dist/core/primitive/actionStyles.d.ts.map +1 -1
  116. package/dist/core/primitive/actionStyles.js +10 -18
  117. package/dist/core/primitive/actionStyles.js.map +1 -1
  118. package/package.json +2 -2
@@ -390,6 +390,14 @@
390
390
  .starci-core-label {
391
391
  min-width: 0;
392
392
  margin: 0;
393
+ font-size: 0.875rem;
394
+ font-weight: 600;
395
+ line-height: 1.25rem;
396
+ }
397
+
398
+ .starci-core-label[data-grammar-label-depth="nested"] {
399
+ font-size: 0.75rem;
400
+ line-height: 1rem;
393
401
  }
394
402
 
395
403
  .starci-core-tooltip {
@@ -600,6 +608,7 @@
600
608
  .starci-core-leading-number {
601
609
  display: inline-block;
602
610
  flex: none;
611
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
603
612
  min-width: 1.25rem;
604
613
  color: var(--muted, GrayText);
605
614
  font-size: 0.875rem;
@@ -622,11 +631,63 @@
622
631
  }
623
632
 
624
633
  .starci-core-owned-collection {
634
+ width: 100%;
625
635
  min-width: 0;
626
636
  }
627
637
 
638
+ /* A verdict list is flush inside its shell; the shell already owns the corner. */
639
+ .starci-core-owned-collection[data-grammar-collection="verdict"] {
640
+ border-radius: 0 !important;
641
+ }
642
+
643
+ /*
644
+ * THE VERDICT EDGE IS SHIPPED.
645
+ *
646
+ * A row in a verdict collection reports an outcome, and the outcome is drawn as a 2px edge on
647
+ * the row's leading side. The collection already squares its corners for exactly these rows;
648
+ * this is the paint the squaring was preparing for, and without it an application had to reach
649
+ * across the Grammar boundary with its own inset shadow to get it.
650
+ *
651
+ * It is an INSET SHADOW, not a border and not a padded rule, because the rows of a verdict
652
+ * collection are usually the consumer's own children: a border would move their content two
653
+ * pixels and a padding would fight the inset they already own, while a shadow paints inside the
654
+ * box that is already there. The row is addressed by `data-verdict`, which is the slot contract
655
+ * `SurfaceListCard` documents for its collection, so a Grammar row and an application row draw
656
+ * the same edge from the same attribute.
657
+ *
658
+ * The offset is physical because `box-shadow` has no logical form; under `dir="rtl"` the edge
659
+ * stays on the left. No shipped object mirrors yet, so this is consistent rather than a new gap.
660
+ */
661
+ .starci-core-owned-collection[data-grammar-collection="verdict"] [data-verdict="success"],
662
+ .starci-core-static-row[data-verdict="success"] {
663
+ --starci-core-verdict-edge: inset 2px 0 0 0 var(--success, var(--starci-core-success, #15803d));
664
+ }
665
+
666
+ .starci-core-owned-collection[data-grammar-collection="verdict"] [data-verdict="danger"],
667
+ .starci-core-static-row[data-verdict="danger"] {
668
+ --starci-core-verdict-edge: inset 2px 0 0 0 var(--danger, var(--starci-core-danger, #b91c1c));
669
+ }
670
+
671
+ /*
672
+ * The edge is painted from that one property, including under hover.
673
+ *
674
+ * A hover-invariant list clears every row shadow below, which is right for decoration and wrong
675
+ * for a verdict: an outcome that disappears while the pointer rests on its row is a worse row
676
+ * than one that never drew it. Reading the same property in both places keeps one value.
677
+ */
678
+ .starci-core-owned-collection[data-grammar-collection="verdict"] [data-verdict="success"],
679
+ .starci-core-owned-collection[data-grammar-collection="verdict"] [data-verdict="danger"],
680
+ .starci-core-static-row[data-verdict="success"],
681
+ .starci-core-static-row[data-verdict="danger"],
682
+ .starci-core-list-shell[data-grammar-hover="invariant"] .starci-core-static-row[data-verdict="success"]:hover,
683
+ .starci-core-list-shell[data-grammar-hover="invariant"] .starci-core-static-row[data-verdict="danger"]:hover {
684
+ box-shadow: var(--starci-core-verdict-edge, none);
685
+ }
686
+
628
687
  .starci-core-surface-footer {
688
+ display: flex;
629
689
  min-width: 0;
690
+ align-items: center;
630
691
  }
631
692
 
632
693
  .starci-core-tabs-frame,
@@ -721,31 +782,50 @@
721
782
  }
722
783
 
723
784
  .starci-core-accordion-row {
785
+ width: 100% !important;
786
+ min-width: 0;
787
+ }
788
+
789
+ /* HeroUI's `Accordion` root sizes itself; the Grammar shell owns the measure. */
790
+ .starci-core-accordion-root {
791
+ width: 100% !important;
792
+ min-width: 0;
793
+ }
794
+
795
+ .starci-core-accordion-scroll-region {
724
796
  width: 100%;
725
797
  min-width: 0;
726
798
  }
727
799
 
800
+ /* Expanded content starts flush beneath its trigger, keeping the bottom and inline insets. */
801
+ .starci-core-accordion-body {
802
+ width: 100% !important;
803
+ min-width: 0;
804
+ padding: 0 1rem 0.75rem 1.5rem !important;
805
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
806
+ }
807
+
728
808
  .starci-core-accordion-row + .starci-core-accordion-row {
729
809
  border-top: 1px solid var(--separator, var(--border, GrayText));
730
810
  }
731
811
 
732
812
  .starci-core-accordion-heading {
733
- margin: 0;
813
+ margin: 0 !important;
734
814
  }
735
815
 
736
816
  .starci-core-accordion-trigger {
737
817
  display: block;
738
- width: 100%;
818
+ width: 100% !important;
739
819
  min-width: 0;
740
820
  min-height: 44px;
741
- padding: var(--starci-core-row-inset, 1rem);
821
+ padding: var(--starci-core-row-inset, 1rem) !important;
742
822
  border: 0;
743
823
  background: transparent;
744
824
  box-shadow: none;
745
825
  color: inherit;
746
826
  cursor: pointer;
747
827
  font: inherit;
748
- text-align: left;
828
+ text-align: left !important;
749
829
  transform: none;
750
830
  transition: none;
751
831
  }
@@ -776,10 +856,11 @@
776
856
  }
777
857
  }
778
858
 
859
+ /* The animated vendor region owns no inset, so a closed panel collapses to zero height. */
779
860
  .starci-core-accordion-panel {
780
- width: 100%;
861
+ width: 100% !important;
781
862
  min-width: 0;
782
- padding: 0 var(--starci-core-row-inset, 1rem) var(--starci-core-row-inset, 1rem);
863
+ padding: 0 !important;
783
864
  }
784
865
 
785
866
  .starci-core-markdown-article {
@@ -875,6 +956,7 @@
875
956
  width: 100%;
876
957
  min-width: 0;
877
958
  margin: 0 0 1rem;
959
+ overflow: auto;
878
960
  }
879
961
 
880
962
  .starci-core-fenced-code-header {
@@ -1005,25 +1087,41 @@
1005
1087
  max-width: var(--starci-core-rail-wide, 24rem);
1006
1088
  }
1007
1089
 
1090
+ /*
1091
+ * A sticky rail starts where the band stops.
1092
+ *
1093
+ * `--starci-core-rail-offset` is still the one a consumer sets; when it does not, the rail reads
1094
+ * the offset the sticky band publishes about itself, and only when there is no band at all does
1095
+ * it fall back to the 5.5rem it always used. So `mode="sticky"` under a Grammar band needs no
1096
+ * `calc()` at the call site, and a rail with no band above it is unchanged.
1097
+ */
1008
1098
  .starci-core-rail-frame {
1009
1099
  display: flex;
1010
1100
  min-width: 0;
1011
- max-height: calc(100dvh - var(--starci-core-rail-offset, 5.5rem) - 1.5rem);
1101
+ max-height: calc(100dvh - var(--starci-core-rail-offset, var(--starci-core-band-offset, 5.5rem)) - 1.5rem);
1012
1102
  flex-direction: column;
1013
1103
  gap: var(--starci-core-rail-gap, 1rem);
1014
1104
  }
1015
1105
 
1016
1106
  .starci-core-rail[data-grammar-rail-mode="sticky"] .starci-core-rail-frame {
1017
1107
  position: sticky;
1018
- top: var(--starci-core-rail-offset, 5.5rem);
1108
+ top: var(--starci-core-rail-offset, var(--starci-core-band-offset, 5.5rem));
1019
1109
  }
1020
1110
 
1021
1111
  .starci-core-rail-body {
1112
+ min-width: 0;
1022
1113
  min-height: 0;
1114
+ flex: 1 1 0%;
1023
1115
  overflow-y: auto;
1024
1116
  overscroll-behavior: contain;
1025
1117
  }
1026
1118
 
1119
+ /* Grammar-owned content inset, selected by the attribute the branch already emits. */
1120
+ .starci-core-rail-body[data-grammar-rail-inset="content"] {
1121
+ padding-inline: 0.75rem;
1122
+ padding-block: 1.5rem;
1123
+ }
1124
+
1027
1125
  .starci-core-rail[data-grammar-rail-height="fill"],
1028
1126
  .starci-core-rail[data-grammar-rail-height="fill"] .starci-core-rail-frame,
1029
1127
  .starci-core-rail[data-grammar-rail-height="fill"] .starci-core-rail-body {
@@ -1041,6 +1139,8 @@
1041
1139
  }
1042
1140
 
1043
1141
  .starci-core-rail-footer {
1142
+ display: flex;
1143
+ align-items: center;
1044
1144
  flex: none;
1045
1145
  }
1046
1146
 
@@ -1070,6 +1170,11 @@
1070
1170
  .starci-core-primary-rail-layout {
1071
1171
  grid-template-columns: minmax(0, 1fr);
1072
1172
  }
1173
+
1174
+ /* Collapsed, the rail may lead - a filter or summary a reader needs before the content. */
1175
+ .starci-core-primary-rail-layout[data-grammar-layout-collapsed-order="rail-first"] .starci-core-rail-region {
1176
+ order: -1;
1177
+ }
1073
1178
  }
1074
1179
 
1075
1180
  @container starci-core-primary-rail (max-width: 32rem) {
@@ -1110,6 +1215,40 @@
1110
1215
  top: 0;
1111
1216
  }
1112
1217
 
1218
+ /*
1219
+ * THE BAND PUBLISHES ITS OWN HEIGHT.
1220
+ *
1221
+ * A page under a sticky band needs exactly one number - where the band stops - to pin a rail
1222
+ * beneath it, and until now every consumer RESTATED that number: `calc(4rem + 1px)` for the
1223
+ * primary row and its separator, `calc(4rem + 2rem + 1px)` once a feature layer is stacked.
1224
+ * Restated geometry is wrong the moment the band changes, so the band publishes it instead.
1225
+ *
1226
+ * It is published with `:has()` on the Grammar root, not measured in JS, because presence and
1227
+ * stacking are already spelled by the data attributes these compositions emit, and a custom
1228
+ * property set on the root inherits to every page inside it. The root - not `:root` - keeps the
1229
+ * package inside its own boundary, which is the same reason no rule here touches the document.
1230
+ *
1231
+ * NOTHING is defined when no sticky band is present, so `var(--starci-core-band-offset, X)`
1232
+ * still resolves to a consumer's own X exactly as it did before this property existed.
1233
+ */
1234
+ .grammar-common-root:has(.starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-position="sticky"]),
1235
+ .grammar-common-root:has(.starci-core-subnav[data-grammar-subnav-position="sticky"]) {
1236
+ --starci-core-band-offset: calc(var(--starci-core-band-height, 0rem) + var(--starci-core-band-subnav-height, 0rem));
1237
+ }
1238
+
1239
+ .grammar-common-root:has(.starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-position="sticky"]) {
1240
+ --starci-core-band-height: calc(4rem + 1px);
1241
+ }
1242
+
1243
+ .grammar-common-root:has(.starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-position="sticky"][data-grammar-navigation-feature-nav-layers="two"]) {
1244
+ --starci-core-band-height: calc(4rem + 2rem + 1px);
1245
+ }
1246
+
1247
+ /* A sticky Subnav stacks under the band, so it adds its own height and separator to the offset. */
1248
+ .grammar-common-root:has(.starci-core-subnav[data-grammar-subnav-position="sticky"]) {
1249
+ --starci-core-band-subnav-height: calc(3.25rem + 1px);
1250
+ }
1251
+
1113
1252
  .starci-core-navigation-feature-nav-primary {
1114
1253
  display: grid !important;
1115
1254
  min-height: 4rem;
@@ -1135,6 +1274,14 @@
1135
1274
  display: none !important;
1136
1275
  }
1137
1276
 
1277
+ /*
1278
+ * A bar with no primary destinations renders no `nav` at all, so the grid loses a track rather
1279
+ * than keeping an empty one: identity leads, the remaining row belongs to what is still there.
1280
+ */
1281
+ .starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-destinations="absent"] .starci-core-navigation-feature-nav-primary {
1282
+ grid-template-columns: minmax(0, 1fr) auto !important;
1283
+ }
1284
+
1138
1285
  .starci-core-navigation-feature-nav-compact-navigation {
1139
1286
  display: block !important;
1140
1287
  }
@@ -1204,7 +1351,8 @@
1204
1351
  .starci-core-subnav[data-grammar-subnav-position="sticky"] {
1205
1352
  position: sticky;
1206
1353
  z-index: var(--starci-core-subnav-z, 40);
1207
- top: var(--starci-core-subnav-offset, 4rem);
1354
+ /* The band's own published height, so a stacked Subnav no longer needs a consumer's calc. */
1355
+ top: var(--starci-core-subnav-offset, var(--starci-core-band-height, 4rem));
1208
1356
  backface-visibility: hidden;
1209
1357
  transform: translateZ(0);
1210
1358
  will-change: transform;
@@ -1232,20 +1380,36 @@
1232
1380
  white-space: nowrap;
1233
1381
  }
1234
1382
 
1383
+ /*
1384
+ * The toggle is a HeroUI `Button`, whose own fill, corner and shadow live in the vendor's
1385
+ * `components` layer - declared after `starci-grammar-common`, so it wins every normal
1386
+ * declaration here regardless of specificity. These are the ones the utilities used to carry,
1387
+ * so they are the ones that have to be important - the 2.75rem target included, because the
1388
+ * vendor sizes its own button and a consumer was re-forcing `size-11` to get the target back.
1389
+ */
1235
1390
  .starci-core-subnav-toggle {
1236
1391
  display: inline-flex;
1237
- width: 2.75rem;
1238
- height: 2.75rem;
1392
+ width: 2.75rem !important;
1393
+ height: 2.75rem !important;
1239
1394
  align-items: center;
1240
1395
  justify-content: center;
1241
- border-radius: 0;
1242
- background: transparent;
1243
- box-shadow: none;
1396
+ border-radius: 0 !important;
1397
+ background: transparent !important;
1398
+ box-shadow: none !important;
1244
1399
  color: inherit;
1245
1400
  cursor: pointer;
1246
1401
  }
1247
1402
 
1403
+ .starci-core-subnav-toggle:hover,
1404
+ .starci-core-subnav-toggle[data-hovered="true"] {
1405
+ background: transparent !important;
1406
+ }
1407
+
1248
1408
  @media (min-width: 48rem) {
1409
+ .starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-destinations="absent"] .starci-core-navigation-feature-nav-primary {
1410
+ grid-template-columns: auto minmax(0, 1fr) !important;
1411
+ }
1412
+
1249
1413
  .starci-core-navigation-feature-nav-primary {
1250
1414
  grid-template-columns: auto minmax(0, 1fr) auto !important;
1251
1415
  }
@@ -1263,6 +1427,11 @@
1263
1427
  .starci-core-subnav[data-grammar-subnav-visibility="compact"] {
1264
1428
  display: none;
1265
1429
  }
1430
+
1431
+ /* A compact Subnav is not on screen here, so it contributes no height to the band offset. */
1432
+ .grammar-common-root:has(.starci-core-subnav[data-grammar-subnav-position="sticky"][data-grammar-subnav-visibility="compact"]) {
1433
+ --starci-core-band-subnav-height: 0rem;
1434
+ }
1266
1435
  }
1267
1436
 
1268
1437
  .starci-core-workspace-shell {
@@ -1815,5 +1984,462 @@
1815
1984
  scroll-behavior: auto;
1816
1985
  }
1817
1986
  }
1987
+
1988
+ /*
1989
+ * ============================================================================================
1990
+ * SHIPPED OBJECT GEOMETRY (0.4.4)
1991
+ * ============================================================================================
1992
+ *
1993
+ * Everything below used to be a Tailwind utility string inside a Grammar component or its
1994
+ * `classNames.ts`. A class only exists if the CONSUMER's Tailwind build scanned the file that
1995
+ * spells it, and almost nobody scans `node_modules/@starci/grammar` - so those objects arrived
1996
+ * in a consuming app with no box at all. The utilities are gone; the box lives here, selected
1997
+ * by the data attributes each component already emits.
1998
+ *
1999
+ * `!important` appears ONLY where the class lands on a HeroUI part - `Card`, `Accordion`,
2000
+ * `Button`, `TextField`, `Input`, `Skeleton`, `ProgressBar`, `ScrollShadow` - whose own rules
2001
+ * live in the vendor's `components` layer. That layer is declared AFTER `starci-grammar-common`
2002
+ * and therefore wins every normal declaration regardless of specificity; an important
2003
+ * declaration in the earlier layer is the only thing that reproduces what the utilities did.
2004
+ * Corners come from the theme radius ramp (`--radius-*`), never from a HeroUI v2 radius name
2005
+ * such as `rounded-large`, which emits nothing anywhere.
2006
+ */
2007
+
2008
+ /* --- Surface card: the card, its label row and its content shell are HeroUI `Card` parts. --- */
2009
+ .starci-core-surface-card {
2010
+ display: flex !important;
2011
+ width: 100% !important;
2012
+ min-width: 0;
2013
+ flex-direction: column !important;
2014
+ gap: var(--starci-core-section-gap, 0.75rem) !important;
2015
+ }
2016
+
2017
+ .starci-core-surface-label {
2018
+ padding: 0 !important;
2019
+ }
2020
+
2021
+ .starci-core-surface {
2022
+ padding: 0 !important;
2023
+ }
2024
+
2025
+ .starci-core-surface-highlight {
2026
+ position: relative;
2027
+ height: 100%;
2028
+ }
2029
+
2030
+ /* --- Surface list --- */
2031
+ .starci-core-surface-fact {
2032
+ color: var(--muted, var(--starci-core-muted, GrayText));
2033
+ font-size: 0.875rem;
2034
+ line-height: 1.25rem;
2035
+ }
2036
+
2037
+ .starci-core-surface-fact[data-grammar-surface-depth="nested"] {
2038
+ font-size: 0.75rem;
2039
+ line-height: 1rem;
2040
+ }
2041
+
2042
+ /* --- Empty notice --- */
2043
+ .starci-core-empty-notice {
2044
+ display: flex;
2045
+ min-width: 0;
2046
+ flex-direction: column;
2047
+ align-items: center;
2048
+ gap: 0.75rem;
2049
+ padding: 1rem;
2050
+ text-align: center;
2051
+ }
2052
+
2053
+ /* --- Divider --- */
2054
+ .starci-core-divider {
2055
+ display: flex;
2056
+ min-width: 0;
2057
+ flex-direction: row;
2058
+ align-items: center;
2059
+ gap: 0.75rem;
2060
+ }
2061
+
2062
+ .starci-core-divider-rule {
2063
+ height: 1px;
2064
+ flex: 1 1 0%;
2065
+ background: var(--border, var(--separator, var(--starci-core-separator, GrayText)));
2066
+ }
2067
+
2068
+ /* --- Icon: an app-owned SVG has no intrinsic box, so usage sizing must ship. --- */
2069
+ .starci-core-icon {
2070
+ flex: none;
2071
+ }
2072
+
2073
+ .starci-core-icon[data-usage="heading"] {
2074
+ width: 1.5rem;
2075
+ height: 1.5rem;
2076
+ }
2077
+
2078
+ .starci-core-icon[data-usage="leading"] {
2079
+ width: 1.25rem;
2080
+ height: 1.25rem;
2081
+ }
2082
+
2083
+ .starci-core-icon[data-usage="chip"] {
2084
+ width: 1rem;
2085
+ height: 1rem;
2086
+ }
2087
+
2088
+ .starci-core-icon-skeleton {
2089
+ display: inline-block;
2090
+ width: 1.25rem !important;
2091
+ height: 1.25rem !important;
2092
+ flex: none;
2093
+ border-radius: var(--starci-core-pill-radius, 999px) !important;
2094
+ }
2095
+
2096
+ /* --- Icon button: a HeroUI `Button` worn as a circle. --- */
2097
+ .starci-core-icon-button {
2098
+ border-radius: var(--starci-core-pill-radius, 999px) !important;
2099
+ }
2100
+
2101
+ /* --- Icon tile --- */
2102
+ .starci-core-icon-tile {
2103
+ display: inline-flex;
2104
+ flex: none;
2105
+ align-items: center;
2106
+ justify-content: center;
2107
+ overflow: hidden;
2108
+ }
2109
+
2110
+ .starci-core-icon-tile[data-size="sm"] {
2111
+ width: 2rem;
2112
+ height: 2rem;
2113
+ border-radius: var(--radius-lg, var(--radius, 0.5rem));
2114
+ }
2115
+
2116
+ .starci-core-icon-tile[data-size="md"] {
2117
+ width: 2.5rem;
2118
+ height: 2.5rem;
2119
+ border-radius: var(--radius-xl, calc(var(--radius, 0.5rem) * 1.5));
2120
+ }
2121
+
2122
+ /* A tone pair is painted only when the plate draws its own glyph. */
2123
+ .starci-core-icon-tile[data-tone="neutral"][data-artwork="false"][data-loading="false"] {
2124
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2125
+ color: var(--muted, var(--starci-core-muted, GrayText));
2126
+ }
2127
+
2128
+ .starci-core-icon-tile[data-tone="accent"][data-artwork="false"][data-loading="false"] {
2129
+ background: var(--accent-soft, var(--starci-core-accent, Highlight));
2130
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2131
+ }
2132
+
2133
+ .starci-core-icon-tile[data-tone="success"][data-artwork="false"][data-loading="false"] {
2134
+ background: var(--success-soft, var(--success, Canvas));
2135
+ color: var(--success-soft-foreground, var(--success-foreground, CanvasText));
2136
+ }
2137
+
2138
+ .starci-core-icon-tile[data-tone="warning"][data-artwork="false"][data-loading="false"] {
2139
+ background: var(--warning-soft, var(--warning, Canvas));
2140
+ color: var(--warning-soft-foreground, var(--warning-foreground, CanvasText));
2141
+ }
2142
+
2143
+ .starci-core-icon-tile[data-tone="danger"][data-artwork="false"][data-loading="false"] {
2144
+ background: var(--danger-soft, var(--danger, Canvas));
2145
+ color: var(--danger-soft-foreground, var(--danger-foreground, CanvasText));
2146
+ }
2147
+
2148
+ /* --- Progress: a HeroUI `ProgressBar`, and a resting bar of the same measure. --- */
2149
+ .starci-core-progress {
2150
+ width: 100% !important;
2151
+ }
2152
+
2153
+ .starci-core-progress[data-loading="true"] {
2154
+ display: block;
2155
+ height: 0.5rem !important;
2156
+ }
2157
+
2158
+ /*
2159
+ * --- Input ---
2160
+ *
2161
+ * The reveal toggle sits on top of the control, so the field RESERVES room for it rather than
2162
+ * letting the value slide underneath. That inset used to be spelled `pr-9`, a utility no app in
2163
+ * this repository writes, so it was generated nowhere and the toggle overlapped the text at
2164
+ * every width.
2165
+ */
2166
+ .starci-core-input {
2167
+ display: grid !important;
2168
+ min-width: 0;
2169
+ gap: 0.5rem !important;
2170
+ }
2171
+
2172
+ .starci-core-input-control {
2173
+ position: relative;
2174
+ display: flex;
2175
+ min-width: 0;
2176
+ align-items: center;
2177
+ }
2178
+
2179
+ .starci-core-input-control[data-reveal="true"] .starci-core-input-field {
2180
+ padding-inline-end: 2.75rem !important;
2181
+ }
2182
+
2183
+ .starci-core-input-reveal {
2184
+ position: absolute;
2185
+ inset-inline-end: 0.5rem;
2186
+ top: 50%;
2187
+ display: inline-flex;
2188
+ align-items: center;
2189
+ justify-content: center;
2190
+ transform: translateY(-50%);
2191
+ border: 0;
2192
+ background: transparent;
2193
+ color: var(--muted, var(--starci-core-muted, GrayText));
2194
+ cursor: pointer;
2195
+ }
2196
+
2197
+ .starci-core-input-reveal:disabled {
2198
+ cursor: default;
2199
+ }
2200
+
2201
+ .starci-core-input-reveal :where(svg),
2202
+ .starci-core-input-reveal-icon {
2203
+ width: 1rem;
2204
+ height: 1rem;
2205
+ }
2206
+
2207
+ .starci-core-input-reveal-label {
2208
+ font-size: 0.75rem;
2209
+ }
2210
+
2211
+ .starci-core-input-resting-label {
2212
+ width: 33.333333% !important;
2213
+ height: 1rem !important;
2214
+ border-radius: var(--radius-md, calc(var(--radius, 0.5rem) * 0.75)) !important;
2215
+ }
2216
+
2217
+ .starci-core-input-resting-control {
2218
+ width: 100% !important;
2219
+ height: 2.5rem !important;
2220
+ border-radius: var(--field-radius, calc(var(--radius, 0.5rem) * 1.5)) !important;
2221
+ }
2222
+
2223
+ /* --- Text: one resolved line of copy, drawn from the attributes it already emits. --- */
2224
+ .starci-core-text {
2225
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2226
+ font-size: 1rem;
2227
+ font-weight: 400;
2228
+ line-height: 1.5rem;
2229
+ }
2230
+
2231
+ .starci-core-text[data-size="xs"] {
2232
+ font-size: 0.75rem;
2233
+ line-height: 1rem;
2234
+ }
2235
+
2236
+ .starci-core-text[data-size="sm"] {
2237
+ font-size: 0.875rem;
2238
+ line-height: 1.25rem;
2239
+ }
2240
+
2241
+ .starci-core-text[data-size="metric-lead"] {
2242
+ font-size: 1.875rem;
2243
+ line-height: 2.25rem;
2244
+ }
2245
+
2246
+ .starci-core-text[data-tone="muted"] {
2247
+ color: var(--muted, var(--starci-core-muted, GrayText));
2248
+ }
2249
+
2250
+ .starci-core-text[data-tone="accent"] {
2251
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2252
+ }
2253
+
2254
+ .starci-core-text[data-weight="medium"] { font-weight: 500; }
2255
+ .starci-core-text[data-weight="semibold"] { font-weight: 600; }
2256
+
2257
+ .starci-core-text[data-start-content="true"] {
2258
+ display: inline-flex;
2259
+ align-items: center;
2260
+ gap: 0.5rem;
2261
+ }
2262
+
2263
+ .starci-core-text[data-superseded="true"] {
2264
+ text-decoration-line: line-through;
2265
+ }
2266
+
2267
+ :where(.group)[data-selected="true"] .starci-core-text[data-parent-emphasis="accent-soft"] {
2268
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2269
+ }
2270
+
2271
+ /* Authored overflow behaviour: wrap is the resting answer, the other two are opted into. */
2272
+ .starci-core-text[data-overflow="wrap"] {
2273
+ overflow-wrap: anywhere;
2274
+ word-break: break-word;
2275
+ }
2276
+
2277
+ .starci-core-text[data-overflow="truncate"] {
2278
+ display: block;
2279
+ min-width: 0;
2280
+ overflow: hidden;
2281
+ text-overflow: ellipsis;
2282
+ white-space: nowrap;
2283
+ }
2284
+
2285
+ .starci-core-text[data-overflow="clamp-2"] {
2286
+ display: -webkit-box;
2287
+ overflow: hidden;
2288
+ -webkit-box-orient: vertical;
2289
+ -webkit-line-clamp: 2;
2290
+ line-clamp: 2;
2291
+ }
2292
+
2293
+ /* The resting line keeps its size geometry and hides its copy; no tone is visible to claim. */
2294
+ .starci-core-text[data-loading="true"] {
2295
+ display: inline-block;
2296
+ max-width: 100%;
2297
+ border-radius: var(--radius, 0.25rem);
2298
+ color: transparent;
2299
+ user-select: none;
2300
+ }
2301
+
2302
+ .starci-core-text[data-loading="true"][data-size="xs"] { width: 2.5rem; }
2303
+ .starci-core-text[data-loading="true"][data-size="sm"] { width: 3rem; }
2304
+ .starci-core-text[data-loading="true"][data-size="md"] { width: 10rem; }
2305
+ .starci-core-text[data-loading="true"][data-size="metric-lead"] { width: 10rem; }
2306
+
2307
+ /* --- Text action: one recipe, eight appearances, selected by data attributes. --- */
2308
+ .starci-core-text-action {
2309
+ display: inline-flex;
2310
+ width: fit-content;
2311
+ min-width: 0;
2312
+ flex: none;
2313
+ align-items: center;
2314
+ gap: 0.5rem;
2315
+ outline: none;
2316
+ text-underline-offset: 4px;
2317
+ }
2318
+
2319
+ .starci-core-text-action:disabled {
2320
+ opacity: 0.5;
2321
+ cursor: default;
2322
+ }
2323
+
2324
+ .starci-core-text-action[data-size="xs"] { font-size: 0.75rem; line-height: 1rem; }
2325
+ .starci-core-text-action[data-size="sm"] { font-size: 0.875rem; line-height: 1.25rem; }
2326
+ .starci-core-text-action[data-size="md"] { font-size: 1rem; line-height: 1.5rem; }
2327
+
2328
+ .starci-core-text-action[data-appearance="inline"] {
2329
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2330
+ font-weight: 500;
2331
+ }
2332
+
2333
+ .starci-core-text-action[data-appearance="muted"] {
2334
+ color: var(--muted, var(--starci-core-muted, GrayText));
2335
+ font-weight: 500;
2336
+ }
2337
+
2338
+ .starci-core-text-action[data-appearance="inline"]:hover,
2339
+ .starci-core-text-action[data-appearance="inline"]:focus-visible,
2340
+ .starci-core-text-action[data-appearance="muted"]:hover,
2341
+ .starci-core-text-action[data-appearance="muted"]:focus-visible,
2342
+ .starci-core-text-action[data-appearance="disclosure"]:hover,
2343
+ .starci-core-text-action[data-appearance="disclosure"]:focus-visible {
2344
+ text-decoration-line: underline;
2345
+ }
2346
+
2347
+ .starci-core-text-action[data-appearance="choice"] {
2348
+ border-radius: var(--starci-core-pill-radius, 999px);
2349
+ padding: 0.25rem 0.5rem;
2350
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2351
+ font-weight: 500;
2352
+ }
2353
+
2354
+ .starci-core-text-action[data-appearance="route"] {
2355
+ border-radius: var(--starci-core-pill-radius, 999px);
2356
+ padding: 0.5rem 0.75rem;
2357
+ color: var(--muted, var(--starci-core-muted, GrayText));
2358
+ }
2359
+
2360
+ .starci-core-text-action[data-appearance="section"] {
2361
+ border-radius: var(--radius-xl, calc(var(--radius, 0.5rem) * 1.5));
2362
+ padding: 0.5rem 0.75rem;
2363
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2364
+ }
2365
+
2366
+ .starci-core-text-action[data-appearance="section"]:hover,
2367
+ .starci-core-text-action[data-appearance="section"]:focus-visible {
2368
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2369
+ }
2370
+
2371
+ .starci-core-text-action[data-appearance="tab"] {
2372
+ border-block-end: 2px solid transparent;
2373
+ padding-block: 0.75rem;
2374
+ color: var(--muted, var(--starci-core-muted, GrayText));
2375
+ }
2376
+
2377
+ .starci-core-text-action[data-appearance="tab"][data-current="true"] {
2378
+ border-block-end-color: var(--accent, var(--starci-core-accent, Highlight));
2379
+ color: var(--accent, var(--starci-core-accent, Highlight));
2380
+ font-weight: 600;
2381
+ }
2382
+
2383
+ .starci-core-text-action[data-appearance="choice"][data-current="true"],
2384
+ .starci-core-text-action[data-appearance="route"][data-current="true"],
2385
+ .starci-core-text-action[data-appearance="section"][data-current="true"] {
2386
+ background: var(--accent-soft, var(--starci-core-accent, Highlight));
2387
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2388
+ }
2389
+
2390
+ .starci-core-text-action[data-appearance="route"][data-current="true"],
2391
+ .starci-core-text-action[data-appearance="section"][data-current="true"] {
2392
+ font-weight: 600;
2393
+ }
2394
+
2395
+ .starci-core-text-action[data-appearance="disclosure"] {
2396
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2397
+ font-weight: 600;
2398
+ }
2399
+
2400
+ .starci-core-text-action[data-appearance="plain"] {
2401
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2402
+ text-decoration-line: none;
2403
+ }
2404
+
2405
+ .starci-core-text-action-resting {
2406
+ display: inline-flex;
2407
+ width: 4rem;
2408
+ flex: none;
2409
+ color: transparent;
2410
+ user-select: none;
2411
+ }
2412
+
2413
+ /*
2414
+ * --- Button: full width ---
2415
+ *
2416
+ * A full-width action stretches to its parent and lets its label wrap onto a second line rather
2417
+ * than overflow, so the vendor's fixed control height is released to the content.
2418
+ */
2419
+ .starci-core-button[data-width="fill"] {
2420
+ width: 100% !important;
2421
+ max-width: 100% !important;
2422
+ height: auto !important;
2423
+ min-height: var(--starci-core-control-min-size, 2.75rem);
2424
+ white-space: normal !important;
2425
+ }
2426
+
2427
+ /* --- Chat workspace: the compact rail trigger's resting paint. --- */
2428
+ .starci-core-chat-workspace-rail-trigger {
2429
+ box-shadow: 0 1px 2px 0 color-mix(in srgb, CanvasText 8%, transparent);
2430
+ outline: none;
2431
+ transition: background-color var(--starci-core-motion-duration, 180ms) var(--starci-core-motion-easing, cubic-bezier(0.2, 0, 0, 1));
2432
+ }
2433
+
2434
+ .starci-core-chat-workspace-rail-trigger:hover {
2435
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2436
+ }
2437
+
2438
+ @media (prefers-reduced-motion: reduce) {
2439
+ .starci-core-chat-workspace-rail-trigger {
2440
+ transition: none;
2441
+ }
2442
+ }
2443
+
1818
2444
  }
1819
2445