@starci/grammar 0.4.2 → 0.4.4

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 (127) hide show
  1. package/dist/common/registry.d.ts +3 -2
  2. package/dist/common/registry.d.ts.map +1 -1
  3. package/dist/common/registry.js +3 -3
  4. package/dist/common/registry.js.map +1 -1
  5. package/dist/common/renderers.d.ts +1 -0
  6. package/dist/common/renderers.d.ts.map +1 -1
  7. package/dist/common/renderers.js +1 -0
  8. package/dist/common/renderers.js.map +1 -1
  9. package/dist/common/styles.css +795 -9
  10. package/dist/core/branch/MarkdownArticle/classNames.d.ts +9 -4
  11. package/dist/core/branch/MarkdownArticle/classNames.d.ts.map +1 -1
  12. package/dist/core/branch/MarkdownArticle/classNames.js +9 -4
  13. package/dist/core/branch/MarkdownArticle/classNames.js.map +1 -1
  14. package/dist/core/branch/Rail/classNames.d.ts +8 -4
  15. package/dist/core/branch/Rail/classNames.d.ts.map +1 -1
  16. package/dist/core/branch/Rail/classNames.js +8 -4
  17. package/dist/core/branch/Rail/classNames.js.map +1 -1
  18. package/dist/core/branch/Rail/index.d.ts.map +1 -1
  19. package/dist/core/branch/Rail/index.js +1 -2
  20. package/dist/core/branch/Rail/index.js.map +1 -1
  21. package/dist/core/branch/Subnav/classNames.d.ts +14 -7
  22. package/dist/core/branch/Subnav/classNames.d.ts.map +1 -1
  23. package/dist/core/branch/Subnav/classNames.js +14 -7
  24. package/dist/core/branch/Subnav/classNames.js.map +1 -1
  25. package/dist/core/branch/Subnav/index.d.ts.map +1 -1
  26. package/dist/core/branch/Subnav/index.js +2 -2
  27. package/dist/core/branch/Subnav/index.js.map +1 -1
  28. package/dist/core/branch/SurfaceAccordionCard/classNames.d.ts +16 -8
  29. package/dist/core/branch/SurfaceAccordionCard/classNames.d.ts.map +1 -1
  30. package/dist/core/branch/SurfaceAccordionCard/classNames.js +17 -9
  31. package/dist/core/branch/SurfaceAccordionCard/classNames.js.map +1 -1
  32. package/dist/core/branch/SurfaceAccordionCard/index.d.ts.map +1 -1
  33. package/dist/core/branch/SurfaceAccordionCard/index.js +1 -1
  34. package/dist/core/branch/SurfaceAccordionCard/index.js.map +1 -1
  35. package/dist/core/branch/SurfaceCard/classNames.d.ts +16 -7
  36. package/dist/core/branch/SurfaceCard/classNames.d.ts.map +1 -1
  37. package/dist/core/branch/SurfaceCard/classNames.js +17 -8
  38. package/dist/core/branch/SurfaceCard/classNames.js.map +1 -1
  39. package/dist/core/branch/SurfaceCard/index.d.ts.map +1 -1
  40. package/dist/core/branch/SurfaceCard/index.js +6 -2
  41. package/dist/core/branch/SurfaceCard/index.js.map +1 -1
  42. package/dist/core/branch/SurfaceListCard/classNames.d.ts +14 -7
  43. package/dist/core/branch/SurfaceListCard/classNames.d.ts.map +1 -1
  44. package/dist/core/branch/SurfaceListCard/classNames.js +14 -7
  45. package/dist/core/branch/SurfaceListCard/classNames.js.map +1 -1
  46. package/dist/core/branch/SurfaceListCard/index.d.ts.map +1 -1
  47. package/dist/core/branch/SurfaceListCard/index.js +2 -2
  48. package/dist/core/branch/SurfaceListCard/index.js.map +1 -1
  49. package/dist/core/classNames.d.ts +3 -5
  50. package/dist/core/classNames.d.ts.map +1 -1
  51. package/dist/core/classNames.js +3 -5
  52. package/dist/core/classNames.js.map +1 -1
  53. package/dist/core/composite/EmptyNotice/index.js +1 -1
  54. package/dist/core/composite/EmptyNotice/index.js.map +1 -1
  55. package/dist/core/composition/ChatWorkspace/classNames.d.ts +16 -9
  56. package/dist/core/composition/ChatWorkspace/classNames.d.ts.map +1 -1
  57. package/dist/core/composition/ChatWorkspace/classNames.js +21 -14
  58. package/dist/core/composition/ChatWorkspace/classNames.js.map +1 -1
  59. package/dist/core/composition/NavigationFeatureNav/classNames.d.ts +13 -8
  60. package/dist/core/composition/NavigationFeatureNav/classNames.d.ts.map +1 -1
  61. package/dist/core/composition/NavigationFeatureNav/classNames.js +13 -8
  62. package/dist/core/composition/NavigationFeatureNav/classNames.js.map +1 -1
  63. package/dist/core/composition/NavigationFeatureNav/index.d.ts +16 -2
  64. package/dist/core/composition/NavigationFeatureNav/index.d.ts.map +1 -1
  65. package/dist/core/composition/NavigationFeatureNav/index.js +2 -2
  66. package/dist/core/composition/NavigationFeatureNav/index.js.map +1 -1
  67. package/dist/core/composition/PrimaryRailLayout/index.d.ts +7 -1
  68. package/dist/core/composition/PrimaryRailLayout/index.d.ts.map +1 -1
  69. package/dist/core/composition/PrimaryRailLayout/index.js +1 -1
  70. package/dist/core/composition/PrimaryRailLayout/index.js.map +1 -1
  71. package/dist/core/composition/Sidebar/classNames.d.ts +11 -0
  72. package/dist/core/composition/Sidebar/classNames.d.ts.map +1 -0
  73. package/dist/core/composition/Sidebar/classNames.js +12 -0
  74. package/dist/core/composition/Sidebar/classNames.js.map +1 -0
  75. package/dist/core/composition/Sidebar/index.d.ts +7 -1
  76. package/dist/core/composition/Sidebar/index.d.ts.map +1 -1
  77. package/dist/core/composition/Sidebar/index.js +10 -9
  78. package/dist/core/composition/Sidebar/index.js.map +1 -1
  79. package/dist/core/index.d.ts +3 -2
  80. package/dist/core/index.d.ts.map +1 -1
  81. package/dist/core/primitive/Button/index.d.ts +10 -0
  82. package/dist/core/primitive/Button/index.d.ts.map +1 -1
  83. package/dist/core/primitive/Button/index.js +3 -3
  84. package/dist/core/primitive/Button/index.js.map +1 -1
  85. package/dist/core/primitive/Divider/index.js +1 -1
  86. package/dist/core/primitive/Divider/index.js.map +1 -1
  87. package/dist/core/primitive/Icon/index.d.ts.map +1 -1
  88. package/dist/core/primitive/Icon/index.js +8 -7
  89. package/dist/core/primitive/Icon/index.js.map +1 -1
  90. package/dist/core/primitive/IconButton/index.d.ts.map +1 -1
  91. package/dist/core/primitive/IconButton/index.js +7 -5
  92. package/dist/core/primitive/IconButton/index.js.map +1 -1
  93. package/dist/core/primitive/IconTile/index.d.ts.map +1 -1
  94. package/dist/core/primitive/IconTile/index.js +7 -12
  95. package/dist/core/primitive/IconTile/index.js.map +1 -1
  96. package/dist/core/primitive/Input/index.d.ts.map +1 -1
  97. package/dist/core/primitive/Input/index.js +4 -4
  98. package/dist/core/primitive/Input/index.js.map +1 -1
  99. package/dist/core/primitive/Label/classNames.d.ts +10 -6
  100. package/dist/core/primitive/Label/classNames.d.ts.map +1 -1
  101. package/dist/core/primitive/Label/classNames.js +10 -6
  102. package/dist/core/primitive/Label/classNames.js.map +1 -1
  103. package/dist/core/primitive/Label/index.js +1 -1
  104. package/dist/core/primitive/Label/index.js.map +1 -1
  105. package/dist/core/primitive/PressableField/classNames.d.ts +5 -0
  106. package/dist/core/primitive/PressableField/classNames.d.ts.map +1 -0
  107. package/dist/core/primitive/PressableField/classNames.js +6 -0
  108. package/dist/core/primitive/PressableField/classNames.js.map +1 -0
  109. package/dist/core/primitive/PressableField/index.d.ts +22 -0
  110. package/dist/core/primitive/PressableField/index.d.ts.map +1 -0
  111. package/dist/core/primitive/PressableField/index.js +14 -0
  112. package/dist/core/primitive/PressableField/index.js.map +1 -0
  113. package/dist/core/primitive/Progress/index.d.ts.map +1 -1
  114. package/dist/core/primitive/Progress/index.js +6 -2
  115. package/dist/core/primitive/Progress/index.js.map +1 -1
  116. package/dist/core/primitive/Text/index.d.ts +8 -1
  117. package/dist/core/primitive/Text/index.d.ts.map +1 -1
  118. package/dist/core/primitive/Text/index.js +16 -20
  119. package/dist/core/primitive/Text/index.js.map +1 -1
  120. package/dist/core/primitive/TextAction/index.d.ts.map +1 -1
  121. package/dist/core/primitive/TextAction/index.js +24 -23
  122. package/dist/core/primitive/TextAction/index.js.map +1 -1
  123. package/dist/core/primitive/actionStyles.d.ts +10 -2
  124. package/dist/core/primitive/actionStyles.d.ts.map +1 -1
  125. package/dist/core/primitive/actionStyles.js +10 -18
  126. package/dist/core/primitive/actionStyles.js.map +1 -1
  127. package/package.json +2 -2
@@ -251,6 +251,89 @@
251
251
  border: 0;
252
252
  }
253
253
 
254
+ /*
255
+ * A field-shaped press target is FIELD anatomy, not a button variant.
256
+ *
257
+ * Two applications had already cloned it - a search trigger that looks exactly like the input
258
+ * it replaces - and both did it by pushing field geometry into a Grammar Button through
259
+ * `className`, which is an app override of a Grammar object. The anatomy lives here instead,
260
+ * reading the same `--field-*` contract the Input primitive reads, so the two clones can be
261
+ * deleted and no application has to restate the field's height, inset, corner or paint.
262
+ */
263
+ .starci-core-pressable-field {
264
+ display: flex;
265
+ width: 100%;
266
+ min-width: 0;
267
+ height: 2.25rem;
268
+ align-items: center;
269
+ justify-content: space-between;
270
+ gap: 0.5rem;
271
+ border: var(--field-border-width, 1px) solid var(--field-border, var(--border, ButtonBorder));
272
+ border-radius: var(--field-radius, calc(var(--radius, 0.5rem) * 1.5));
273
+ padding-inline: 0.75rem;
274
+ background: var(--field-background, var(--surface, Canvas));
275
+ color: var(--field-foreground, var(--foreground, CanvasText));
276
+ box-shadow: var(--field-shadow, none);
277
+ font: inherit;
278
+ text-align: start;
279
+ cursor: pointer;
280
+ transition:
281
+ background-color var(--starci-core-motion-duration, 180ms) var(--starci-core-motion-easing, cubic-bezier(0.2, 0, 0, 1)),
282
+ border-color var(--starci-core-motion-duration, 180ms) var(--starci-core-motion-easing, cubic-bezier(0.2, 0, 0, 1));
283
+ -webkit-appearance: none;
284
+ appearance: none;
285
+ }
286
+
287
+ .starci-core-pressable-field:hover {
288
+ border-color: var(--field-border-hover, var(--field-border, var(--border, ButtonBorder)));
289
+ background: var(--field-hover, var(--field-background, var(--surface, Canvas)));
290
+ }
291
+
292
+ .starci-core-pressable-field:focus-visible {
293
+ outline: 2px solid var(--focus, var(--starci-core-focus, Highlight));
294
+ outline-offset: 2px;
295
+ }
296
+
297
+ .starci-core-pressable-field:disabled,
298
+ .starci-core-pressable-field[data-disabled="true"] {
299
+ opacity: 0.5;
300
+ cursor: default;
301
+ }
302
+
303
+ .starci-core-pressable-field-content {
304
+ display: inline-flex;
305
+ min-width: 0;
306
+ align-items: center;
307
+ gap: 0.5rem;
308
+ }
309
+
310
+ .starci-core-pressable-field-placeholder {
311
+ min-width: 0;
312
+ overflow: hidden;
313
+ font-size: 0.875rem;
314
+ color: var(--field-placeholder, var(--muted, GrayText));
315
+ text-overflow: ellipsis;
316
+ white-space: nowrap;
317
+ }
318
+
319
+ .starci-core-pressable-field-shortcut {
320
+ flex-shrink: 0;
321
+ border: 1px solid var(--border, var(--starci-core-border, ButtonBorder));
322
+ border-radius: var(--radius-sm, calc(var(--radius, 0.5rem) * 0.75));
323
+ padding: 0.25rem;
324
+ background: var(--surface-secondary, var(--starci-core-surface-secondary, Canvas));
325
+ color: var(--muted, var(--starci-core-muted, GrayText));
326
+ font-family: inherit;
327
+ font-size: 0.75rem;
328
+ line-height: 1;
329
+ }
330
+
331
+ @media (prefers-reduced-motion: reduce) {
332
+ .starci-core-pressable-field {
333
+ transition: none;
334
+ }
335
+ }
336
+
254
337
  .starci-core-horizontal-scroll-region {
255
338
  width: 100%;
256
339
  min-width: 0;
@@ -307,6 +390,14 @@
307
390
  .starci-core-label {
308
391
  min-width: 0;
309
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;
310
401
  }
311
402
 
312
403
  .starci-core-tooltip {
@@ -517,6 +608,7 @@
517
608
  .starci-core-leading-number {
518
609
  display: inline-block;
519
610
  flex: none;
611
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
520
612
  min-width: 1.25rem;
521
613
  color: var(--muted, GrayText);
522
614
  font-size: 0.875rem;
@@ -539,11 +631,19 @@
539
631
  }
540
632
 
541
633
  .starci-core-owned-collection {
634
+ width: 100%;
542
635
  min-width: 0;
543
636
  }
544
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
+
545
643
  .starci-core-surface-footer {
644
+ display: flex;
546
645
  min-width: 0;
646
+ align-items: center;
547
647
  }
548
648
 
549
649
  .starci-core-tabs-frame,
@@ -638,31 +738,50 @@
638
738
  }
639
739
 
640
740
  .starci-core-accordion-row {
741
+ width: 100% !important;
742
+ min-width: 0;
743
+ }
744
+
745
+ /* HeroUI's `Accordion` root sizes itself; the Grammar shell owns the measure. */
746
+ .starci-core-accordion-root {
747
+ width: 100% !important;
748
+ min-width: 0;
749
+ }
750
+
751
+ .starci-core-accordion-scroll-region {
641
752
  width: 100%;
642
753
  min-width: 0;
643
754
  }
644
755
 
756
+ /* Expanded content starts flush beneath its trigger, keeping the bottom and inline insets. */
757
+ .starci-core-accordion-body {
758
+ width: 100% !important;
759
+ min-width: 0;
760
+ padding: 0 1rem 0.75rem 1.5rem !important;
761
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
762
+ }
763
+
645
764
  .starci-core-accordion-row + .starci-core-accordion-row {
646
765
  border-top: 1px solid var(--separator, var(--border, GrayText));
647
766
  }
648
767
 
649
768
  .starci-core-accordion-heading {
650
- margin: 0;
769
+ margin: 0 !important;
651
770
  }
652
771
 
653
772
  .starci-core-accordion-trigger {
654
773
  display: block;
655
- width: 100%;
774
+ width: 100% !important;
656
775
  min-width: 0;
657
776
  min-height: 44px;
658
- padding: var(--starci-core-row-inset, 1rem);
777
+ padding: var(--starci-core-row-inset, 1rem) !important;
659
778
  border: 0;
660
779
  background: transparent;
661
780
  box-shadow: none;
662
781
  color: inherit;
663
782
  cursor: pointer;
664
783
  font: inherit;
665
- text-align: left;
784
+ text-align: left !important;
666
785
  transform: none;
667
786
  transition: none;
668
787
  }
@@ -693,10 +812,11 @@
693
812
  }
694
813
  }
695
814
 
815
+ /* The animated vendor region owns no inset, so a closed panel collapses to zero height. */
696
816
  .starci-core-accordion-panel {
697
- width: 100%;
817
+ width: 100% !important;
698
818
  min-width: 0;
699
- padding: 0 var(--starci-core-row-inset, 1rem) var(--starci-core-row-inset, 1rem);
819
+ padding: 0 !important;
700
820
  }
701
821
 
702
822
  .starci-core-markdown-article {
@@ -792,6 +912,7 @@
792
912
  width: 100%;
793
913
  min-width: 0;
794
914
  margin: 0 0 1rem;
915
+ overflow: auto;
795
916
  }
796
917
 
797
918
  .starci-core-fenced-code-header {
@@ -936,11 +1057,19 @@
936
1057
  }
937
1058
 
938
1059
  .starci-core-rail-body {
1060
+ min-width: 0;
939
1061
  min-height: 0;
1062
+ flex: 1 1 0%;
940
1063
  overflow-y: auto;
941
1064
  overscroll-behavior: contain;
942
1065
  }
943
1066
 
1067
+ /* Grammar-owned content inset, selected by the attribute the branch already emits. */
1068
+ .starci-core-rail-body[data-grammar-rail-inset="content"] {
1069
+ padding-inline: 0.75rem;
1070
+ padding-block: 1.5rem;
1071
+ }
1072
+
944
1073
  .starci-core-rail[data-grammar-rail-height="fill"],
945
1074
  .starci-core-rail[data-grammar-rail-height="fill"] .starci-core-rail-frame,
946
1075
  .starci-core-rail[data-grammar-rail-height="fill"] .starci-core-rail-body {
@@ -958,6 +1087,8 @@
958
1087
  }
959
1088
 
960
1089
  .starci-core-rail-footer {
1090
+ display: flex;
1091
+ align-items: center;
961
1092
  flex: none;
962
1093
  }
963
1094
 
@@ -987,6 +1118,11 @@
987
1118
  .starci-core-primary-rail-layout {
988
1119
  grid-template-columns: minmax(0, 1fr);
989
1120
  }
1121
+
1122
+ /* Collapsed, the rail may lead - a filter or summary a reader needs before the content. */
1123
+ .starci-core-primary-rail-layout[data-grammar-layout-collapsed-order="rail-first"] .starci-core-rail-region {
1124
+ order: -1;
1125
+ }
990
1126
  }
991
1127
 
992
1128
  @container starci-core-primary-rail (max-width: 32rem) {
@@ -1052,6 +1188,14 @@
1052
1188
  display: none !important;
1053
1189
  }
1054
1190
 
1191
+ /*
1192
+ * A bar with no primary destinations renders no `nav` at all, so the grid loses a track rather
1193
+ * than keeping an empty one: identity leads, the remaining row belongs to what is still there.
1194
+ */
1195
+ .starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-destinations="absent"] .starci-core-navigation-feature-nav-primary {
1196
+ grid-template-columns: minmax(0, 1fr) auto !important;
1197
+ }
1198
+
1055
1199
  .starci-core-navigation-feature-nav-compact-navigation {
1056
1200
  display: block !important;
1057
1201
  }
@@ -1149,20 +1293,35 @@
1149
1293
  white-space: nowrap;
1150
1294
  }
1151
1295
 
1296
+ /*
1297
+ * The toggle is a HeroUI `Button`, whose own fill, corner and shadow live in the vendor's
1298
+ * `components` layer - declared after `starci-grammar-common`, so it wins every normal
1299
+ * declaration here regardless of specificity. These four are the ones the utilities used to
1300
+ * carry, so they are the ones that have to be important.
1301
+ */
1152
1302
  .starci-core-subnav-toggle {
1153
1303
  display: inline-flex;
1154
1304
  width: 2.75rem;
1155
1305
  height: 2.75rem;
1156
1306
  align-items: center;
1157
1307
  justify-content: center;
1158
- border-radius: 0;
1159
- background: transparent;
1160
- box-shadow: none;
1308
+ border-radius: 0 !important;
1309
+ background: transparent !important;
1310
+ box-shadow: none !important;
1161
1311
  color: inherit;
1162
1312
  cursor: pointer;
1163
1313
  }
1164
1314
 
1315
+ .starci-core-subnav-toggle:hover,
1316
+ .starci-core-subnav-toggle[data-hovered="true"] {
1317
+ background: transparent !important;
1318
+ }
1319
+
1165
1320
  @media (min-width: 48rem) {
1321
+ .starci-core-navigation-feature-nav[data-grammar-navigation-feature-nav-destinations="absent"] .starci-core-navigation-feature-nav-primary {
1322
+ grid-template-columns: auto minmax(0, 1fr) !important;
1323
+ }
1324
+
1166
1325
  .starci-core-navigation-feature-nav-primary {
1167
1326
  grid-template-columns: auto minmax(0, 1fr) auto !important;
1168
1327
  }
@@ -1302,6 +1461,176 @@
1302
1461
  overscroll-behavior: contain;
1303
1462
  }
1304
1463
 
1464
+ /*
1465
+ * Sidebar geometry is SHIPPED, not generated.
1466
+ *
1467
+ * Every rule below used to be a Tailwind utility string in the component's JSX, which means a
1468
+ * consumer only saw a sidebar if its own Tailwind build happened to scan
1469
+ * `node_modules/@starci/grammar`. One that scans only its own source got no separator, no rail
1470
+ * width and square items - and `rounded-large` emitted nothing anywhere, because the theme's
1471
+ * radius ramp is `--radius-*`, not a HeroUI v2 name. A composition object owns its layout in
1472
+ * this stylesheet; the JSX carries class names and state attributes only.
1473
+ *
1474
+ * `!important` appears exactly where HeroUI's own `.list-box`, `.list-box-item`,
1475
+ * `.list-box-section` and `.header` rules set the same property. Those live in the vendor's
1476
+ * `components` layer, which is declared after `starci-grammar-common` and therefore wins every
1477
+ * normal declaration regardless of specificity; an important declaration in the earlier layer
1478
+ * is the only thing that keeps the geometry the utilities used to produce.
1479
+ */
1480
+ .starci-core-sidebar {
1481
+ display: flex;
1482
+ min-height: 0;
1483
+ min-width: 0;
1484
+ flex-direction: column;
1485
+ overflow: hidden;
1486
+ background: var(--background, var(--starci-core-canvas, Canvas));
1487
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
1488
+ }
1489
+
1490
+ .starci-core-sidebar[data-presentation="drawer"] {
1491
+ width: 100%;
1492
+ }
1493
+
1494
+ .starci-core-sidebar[data-presentation="rail"] {
1495
+ width: var(--starci-core-sidebar-width, 16rem);
1496
+ height: 100%;
1497
+ border-inline-end: 1px solid var(--separator, var(--starci-core-separator, GrayText));
1498
+ transition: width var(--starci-core-motion-duration, 180ms) var(--starci-core-motion-easing, cubic-bezier(0.2, 0, 0, 1));
1499
+ }
1500
+
1501
+ .starci-core-sidebar[data-presentation="rail"][data-collapsed="true"] {
1502
+ width: var(--starci-core-sidebar-collapsed-width, 4rem);
1503
+ }
1504
+
1505
+ .starci-core-sidebar-toggle {
1506
+ display: flex;
1507
+ justify-content: flex-end;
1508
+ padding: 0.5rem;
1509
+ }
1510
+
1511
+ .starci-core-sidebar[data-collapsed="true"] .starci-core-sidebar-toggle {
1512
+ justify-content: center;
1513
+ }
1514
+
1515
+ .starci-core-sidebar-header {
1516
+ min-width: 0;
1517
+ padding-inline: 0.75rem;
1518
+ padding-block-end: 0.75rem;
1519
+ }
1520
+
1521
+ .starci-core-sidebar-list {
1522
+ display: flex;
1523
+ min-height: 0;
1524
+ min-width: 0;
1525
+ flex: 1 1 0%;
1526
+ flex-direction: column;
1527
+ gap: 0.25rem;
1528
+ overflow-y: auto !important;
1529
+ padding: 0.75rem !important;
1530
+ }
1531
+
1532
+ .starci-core-sidebar[data-collapsed="true"] .starci-core-sidebar-list {
1533
+ align-items: center;
1534
+ padding: 0.5rem !important;
1535
+ }
1536
+
1537
+ .starci-core-sidebar-section {
1538
+ display: flex;
1539
+ min-width: 0;
1540
+ flex-direction: column;
1541
+ gap: 0.25rem !important;
1542
+ }
1543
+
1544
+ .starci-core-sidebar[data-collapsed="true"] .starci-core-sidebar-section {
1545
+ align-items: center !important;
1546
+ }
1547
+
1548
+ .starci-core-sidebar-section-label {
1549
+ padding-inline: 0.5rem;
1550
+ padding-block: 0.75rem 0.25rem !important;
1551
+ font-size: 0.75rem;
1552
+ font-weight: 500;
1553
+ color: var(--muted, var(--starci-core-muted, GrayText));
1554
+ }
1555
+
1556
+ /* A collapsed rail keeps the group name for assistive technology and drops it from the paint. */
1557
+ .starci-core-sidebar[data-collapsed="true"] .starci-core-sidebar-section-label {
1558
+ position: absolute;
1559
+ width: 1px !important;
1560
+ height: 1px;
1561
+ overflow: hidden;
1562
+ margin: -1px;
1563
+ padding: 0 !important;
1564
+ border: 0;
1565
+ clip: rect(0, 0, 0, 0);
1566
+ white-space: nowrap;
1567
+ }
1568
+
1569
+ .starci-core-sidebar-item {
1570
+ display: flex;
1571
+ min-width: 0;
1572
+ align-items: center;
1573
+ gap: 0.75rem;
1574
+ border-radius: var(--radius-xl, calc(var(--radius, 0.5rem) * 1.5)) !important;
1575
+ padding: 0.5rem 0.75rem !important;
1576
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
1577
+ cursor: pointer;
1578
+ outline: none;
1579
+ }
1580
+
1581
+ .starci-core-sidebar[data-collapsed="true"] .starci-core-sidebar-item {
1582
+ width: 2.75rem !important;
1583
+ height: 2.75rem;
1584
+ justify-content: center !important;
1585
+ gap: 0 !important;
1586
+ border-radius: var(--starci-core-pill-radius, 999px) !important;
1587
+ padding: 0 !important;
1588
+ }
1589
+
1590
+ .starci-core-sidebar-item[data-hovered="true"] {
1591
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
1592
+ }
1593
+
1594
+ .starci-core-sidebar-item[data-selected="true"] {
1595
+ background: var(--accent-soft, var(--starci-core-accent, Highlight)) !important;
1596
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
1597
+ }
1598
+
1599
+ .starci-core-sidebar-item[data-focus-visible="true"] {
1600
+ box-shadow: 0 0 0 2px var(--accent, var(--starci-core-accent, Highlight));
1601
+ }
1602
+
1603
+ .starci-core-sidebar-item[data-disabled="true"] {
1604
+ opacity: 0.5;
1605
+ cursor: default;
1606
+ }
1607
+
1608
+ .starci-core-sidebar-item-label {
1609
+ min-width: 0;
1610
+ flex: 1 1 0%;
1611
+ overflow: hidden;
1612
+ font-size: 0.875rem;
1613
+ font-weight: 500;
1614
+ text-overflow: ellipsis;
1615
+ white-space: nowrap;
1616
+ }
1617
+
1618
+ .starci-core-sidebar-item-trailing {
1619
+ flex-shrink: 0;
1620
+ }
1621
+
1622
+ .starci-core-sidebar-footer {
1623
+ min-width: 0;
1624
+ padding: 0.75rem;
1625
+ padding-block-start: 0;
1626
+ }
1627
+
1628
+ @media (prefers-reduced-motion: reduce) {
1629
+ .starci-core-sidebar[data-presentation="rail"] {
1630
+ transition: none;
1631
+ }
1632
+ }
1633
+
1305
1634
  .starci-core-chat-workspace {
1306
1635
  display: flex;
1307
1636
  height: 100%;
@@ -1562,5 +1891,462 @@
1562
1891
  scroll-behavior: auto;
1563
1892
  }
1564
1893
  }
1894
+
1895
+ /*
1896
+ * ============================================================================================
1897
+ * SHIPPED OBJECT GEOMETRY (0.4.4)
1898
+ * ============================================================================================
1899
+ *
1900
+ * Everything below used to be a Tailwind utility string inside a Grammar component or its
1901
+ * `classNames.ts`. A class only exists if the CONSUMER's Tailwind build scanned the file that
1902
+ * spells it, and almost nobody scans `node_modules/@starci/grammar` - so those objects arrived
1903
+ * in a consuming app with no box at all. The utilities are gone; the box lives here, selected
1904
+ * by the data attributes each component already emits.
1905
+ *
1906
+ * `!important` appears ONLY where the class lands on a HeroUI part - `Card`, `Accordion`,
1907
+ * `Button`, `TextField`, `Input`, `Skeleton`, `ProgressBar`, `ScrollShadow` - whose own rules
1908
+ * live in the vendor's `components` layer. That layer is declared AFTER `starci-grammar-common`
1909
+ * and therefore wins every normal declaration regardless of specificity; an important
1910
+ * declaration in the earlier layer is the only thing that reproduces what the utilities did.
1911
+ * Corners come from the theme radius ramp (`--radius-*`), never from a HeroUI v2 radius name
1912
+ * such as `rounded-large`, which emits nothing anywhere.
1913
+ */
1914
+
1915
+ /* --- Surface card: the card, its label row and its content shell are HeroUI `Card` parts. --- */
1916
+ .starci-core-surface-card {
1917
+ display: flex !important;
1918
+ width: 100% !important;
1919
+ min-width: 0;
1920
+ flex-direction: column !important;
1921
+ gap: var(--starci-core-section-gap, 0.75rem) !important;
1922
+ }
1923
+
1924
+ .starci-core-surface-label {
1925
+ padding: 0 !important;
1926
+ }
1927
+
1928
+ .starci-core-surface {
1929
+ padding: 0 !important;
1930
+ }
1931
+
1932
+ .starci-core-surface-highlight {
1933
+ position: relative;
1934
+ height: 100%;
1935
+ }
1936
+
1937
+ /* --- Surface list --- */
1938
+ .starci-core-surface-fact {
1939
+ color: var(--muted, var(--starci-core-muted, GrayText));
1940
+ font-size: 0.875rem;
1941
+ line-height: 1.25rem;
1942
+ }
1943
+
1944
+ .starci-core-surface-fact[data-grammar-surface-depth="nested"] {
1945
+ font-size: 0.75rem;
1946
+ line-height: 1rem;
1947
+ }
1948
+
1949
+ /* --- Empty notice --- */
1950
+ .starci-core-empty-notice {
1951
+ display: flex;
1952
+ min-width: 0;
1953
+ flex-direction: column;
1954
+ align-items: center;
1955
+ gap: 0.75rem;
1956
+ padding: 1rem;
1957
+ text-align: center;
1958
+ }
1959
+
1960
+ /* --- Divider --- */
1961
+ .starci-core-divider {
1962
+ display: flex;
1963
+ min-width: 0;
1964
+ flex-direction: row;
1965
+ align-items: center;
1966
+ gap: 0.75rem;
1967
+ }
1968
+
1969
+ .starci-core-divider-rule {
1970
+ height: 1px;
1971
+ flex: 1 1 0%;
1972
+ background: var(--border, var(--separator, var(--starci-core-separator, GrayText)));
1973
+ }
1974
+
1975
+ /* --- Icon: an app-owned SVG has no intrinsic box, so usage sizing must ship. --- */
1976
+ .starci-core-icon {
1977
+ flex: none;
1978
+ }
1979
+
1980
+ .starci-core-icon[data-usage="heading"] {
1981
+ width: 1.5rem;
1982
+ height: 1.5rem;
1983
+ }
1984
+
1985
+ .starci-core-icon[data-usage="leading"] {
1986
+ width: 1.25rem;
1987
+ height: 1.25rem;
1988
+ }
1989
+
1990
+ .starci-core-icon[data-usage="chip"] {
1991
+ width: 1rem;
1992
+ height: 1rem;
1993
+ }
1994
+
1995
+ .starci-core-icon-skeleton {
1996
+ display: inline-block;
1997
+ width: 1.25rem !important;
1998
+ height: 1.25rem !important;
1999
+ flex: none;
2000
+ border-radius: var(--starci-core-pill-radius, 999px) !important;
2001
+ }
2002
+
2003
+ /* --- Icon button: a HeroUI `Button` worn as a circle. --- */
2004
+ .starci-core-icon-button {
2005
+ border-radius: var(--starci-core-pill-radius, 999px) !important;
2006
+ }
2007
+
2008
+ /* --- Icon tile --- */
2009
+ .starci-core-icon-tile {
2010
+ display: inline-flex;
2011
+ flex: none;
2012
+ align-items: center;
2013
+ justify-content: center;
2014
+ overflow: hidden;
2015
+ }
2016
+
2017
+ .starci-core-icon-tile[data-size="sm"] {
2018
+ width: 2rem;
2019
+ height: 2rem;
2020
+ border-radius: var(--radius-lg, var(--radius, 0.5rem));
2021
+ }
2022
+
2023
+ .starci-core-icon-tile[data-size="md"] {
2024
+ width: 2.5rem;
2025
+ height: 2.5rem;
2026
+ border-radius: var(--radius-xl, calc(var(--radius, 0.5rem) * 1.5));
2027
+ }
2028
+
2029
+ /* A tone pair is painted only when the plate draws its own glyph. */
2030
+ .starci-core-icon-tile[data-tone="neutral"][data-artwork="false"][data-loading="false"] {
2031
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2032
+ color: var(--muted, var(--starci-core-muted, GrayText));
2033
+ }
2034
+
2035
+ .starci-core-icon-tile[data-tone="accent"][data-artwork="false"][data-loading="false"] {
2036
+ background: var(--accent-soft, var(--starci-core-accent, Highlight));
2037
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2038
+ }
2039
+
2040
+ .starci-core-icon-tile[data-tone="success"][data-artwork="false"][data-loading="false"] {
2041
+ background: var(--success-soft, var(--success, Canvas));
2042
+ color: var(--success-soft-foreground, var(--success-foreground, CanvasText));
2043
+ }
2044
+
2045
+ .starci-core-icon-tile[data-tone="warning"][data-artwork="false"][data-loading="false"] {
2046
+ background: var(--warning-soft, var(--warning, Canvas));
2047
+ color: var(--warning-soft-foreground, var(--warning-foreground, CanvasText));
2048
+ }
2049
+
2050
+ .starci-core-icon-tile[data-tone="danger"][data-artwork="false"][data-loading="false"] {
2051
+ background: var(--danger-soft, var(--danger, Canvas));
2052
+ color: var(--danger-soft-foreground, var(--danger-foreground, CanvasText));
2053
+ }
2054
+
2055
+ /* --- Progress: a HeroUI `ProgressBar`, and a resting bar of the same measure. --- */
2056
+ .starci-core-progress {
2057
+ width: 100% !important;
2058
+ }
2059
+
2060
+ .starci-core-progress[data-loading="true"] {
2061
+ display: block;
2062
+ height: 0.5rem !important;
2063
+ }
2064
+
2065
+ /*
2066
+ * --- Input ---
2067
+ *
2068
+ * The reveal toggle sits on top of the control, so the field RESERVES room for it rather than
2069
+ * letting the value slide underneath. That inset used to be spelled `pr-9`, a utility no app in
2070
+ * this repository writes, so it was generated nowhere and the toggle overlapped the text at
2071
+ * every width.
2072
+ */
2073
+ .starci-core-input {
2074
+ display: grid !important;
2075
+ min-width: 0;
2076
+ gap: 0.5rem !important;
2077
+ }
2078
+
2079
+ .starci-core-input-control {
2080
+ position: relative;
2081
+ display: flex;
2082
+ min-width: 0;
2083
+ align-items: center;
2084
+ }
2085
+
2086
+ .starci-core-input-control[data-reveal="true"] .starci-core-input-field {
2087
+ padding-inline-end: 2.75rem !important;
2088
+ }
2089
+
2090
+ .starci-core-input-reveal {
2091
+ position: absolute;
2092
+ inset-inline-end: 0.5rem;
2093
+ top: 50%;
2094
+ display: inline-flex;
2095
+ align-items: center;
2096
+ justify-content: center;
2097
+ transform: translateY(-50%);
2098
+ border: 0;
2099
+ background: transparent;
2100
+ color: var(--muted, var(--starci-core-muted, GrayText));
2101
+ cursor: pointer;
2102
+ }
2103
+
2104
+ .starci-core-input-reveal:disabled {
2105
+ cursor: default;
2106
+ }
2107
+
2108
+ .starci-core-input-reveal :where(svg),
2109
+ .starci-core-input-reveal-icon {
2110
+ width: 1rem;
2111
+ height: 1rem;
2112
+ }
2113
+
2114
+ .starci-core-input-reveal-label {
2115
+ font-size: 0.75rem;
2116
+ }
2117
+
2118
+ .starci-core-input-resting-label {
2119
+ width: 33.333333% !important;
2120
+ height: 1rem !important;
2121
+ border-radius: var(--radius-md, calc(var(--radius, 0.5rem) * 0.75)) !important;
2122
+ }
2123
+
2124
+ .starci-core-input-resting-control {
2125
+ width: 100% !important;
2126
+ height: 2.5rem !important;
2127
+ border-radius: var(--field-radius, calc(var(--radius, 0.5rem) * 1.5)) !important;
2128
+ }
2129
+
2130
+ /* --- Text: one resolved line of copy, drawn from the attributes it already emits. --- */
2131
+ .starci-core-text {
2132
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2133
+ font-size: 1rem;
2134
+ font-weight: 400;
2135
+ line-height: 1.5rem;
2136
+ }
2137
+
2138
+ .starci-core-text[data-size="xs"] {
2139
+ font-size: 0.75rem;
2140
+ line-height: 1rem;
2141
+ }
2142
+
2143
+ .starci-core-text[data-size="sm"] {
2144
+ font-size: 0.875rem;
2145
+ line-height: 1.25rem;
2146
+ }
2147
+
2148
+ .starci-core-text[data-size="metric-lead"] {
2149
+ font-size: 1.875rem;
2150
+ line-height: 2.25rem;
2151
+ }
2152
+
2153
+ .starci-core-text[data-tone="muted"] {
2154
+ color: var(--muted, var(--starci-core-muted, GrayText));
2155
+ }
2156
+
2157
+ .starci-core-text[data-tone="accent"] {
2158
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2159
+ }
2160
+
2161
+ .starci-core-text[data-weight="medium"] { font-weight: 500; }
2162
+ .starci-core-text[data-weight="semibold"] { font-weight: 600; }
2163
+
2164
+ .starci-core-text[data-start-content="true"] {
2165
+ display: inline-flex;
2166
+ align-items: center;
2167
+ gap: 0.5rem;
2168
+ }
2169
+
2170
+ .starci-core-text[data-superseded="true"] {
2171
+ text-decoration-line: line-through;
2172
+ }
2173
+
2174
+ :where(.group)[data-selected="true"] .starci-core-text[data-parent-emphasis="accent-soft"] {
2175
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2176
+ }
2177
+
2178
+ /* Authored overflow behaviour: wrap is the resting answer, the other two are opted into. */
2179
+ .starci-core-text[data-overflow="wrap"] {
2180
+ overflow-wrap: anywhere;
2181
+ word-break: break-word;
2182
+ }
2183
+
2184
+ .starci-core-text[data-overflow="truncate"] {
2185
+ display: block;
2186
+ min-width: 0;
2187
+ overflow: hidden;
2188
+ text-overflow: ellipsis;
2189
+ white-space: nowrap;
2190
+ }
2191
+
2192
+ .starci-core-text[data-overflow="clamp-2"] {
2193
+ display: -webkit-box;
2194
+ overflow: hidden;
2195
+ -webkit-box-orient: vertical;
2196
+ -webkit-line-clamp: 2;
2197
+ line-clamp: 2;
2198
+ }
2199
+
2200
+ /* The resting line keeps its size geometry and hides its copy; no tone is visible to claim. */
2201
+ .starci-core-text[data-loading="true"] {
2202
+ display: inline-block;
2203
+ max-width: 100%;
2204
+ border-radius: var(--radius, 0.25rem);
2205
+ color: transparent;
2206
+ user-select: none;
2207
+ }
2208
+
2209
+ .starci-core-text[data-loading="true"][data-size="xs"] { width: 2.5rem; }
2210
+ .starci-core-text[data-loading="true"][data-size="sm"] { width: 3rem; }
2211
+ .starci-core-text[data-loading="true"][data-size="md"] { width: 10rem; }
2212
+ .starci-core-text[data-loading="true"][data-size="metric-lead"] { width: 10rem; }
2213
+
2214
+ /* --- Text action: one recipe, eight appearances, selected by data attributes. --- */
2215
+ .starci-core-text-action {
2216
+ display: inline-flex;
2217
+ width: fit-content;
2218
+ min-width: 0;
2219
+ flex: none;
2220
+ align-items: center;
2221
+ gap: 0.5rem;
2222
+ outline: none;
2223
+ text-underline-offset: 4px;
2224
+ }
2225
+
2226
+ .starci-core-text-action:disabled {
2227
+ opacity: 0.5;
2228
+ cursor: default;
2229
+ }
2230
+
2231
+ .starci-core-text-action[data-size="xs"] { font-size: 0.75rem; line-height: 1rem; }
2232
+ .starci-core-text-action[data-size="sm"] { font-size: 0.875rem; line-height: 1.25rem; }
2233
+ .starci-core-text-action[data-size="md"] { font-size: 1rem; line-height: 1.5rem; }
2234
+
2235
+ .starci-core-text-action[data-appearance="inline"] {
2236
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2237
+ font-weight: 500;
2238
+ }
2239
+
2240
+ .starci-core-text-action[data-appearance="muted"] {
2241
+ color: var(--muted, var(--starci-core-muted, GrayText));
2242
+ font-weight: 500;
2243
+ }
2244
+
2245
+ .starci-core-text-action[data-appearance="inline"]:hover,
2246
+ .starci-core-text-action[data-appearance="inline"]:focus-visible,
2247
+ .starci-core-text-action[data-appearance="muted"]:hover,
2248
+ .starci-core-text-action[data-appearance="muted"]:focus-visible,
2249
+ .starci-core-text-action[data-appearance="disclosure"]:hover,
2250
+ .starci-core-text-action[data-appearance="disclosure"]:focus-visible {
2251
+ text-decoration-line: underline;
2252
+ }
2253
+
2254
+ .starci-core-text-action[data-appearance="choice"] {
2255
+ border-radius: var(--starci-core-pill-radius, 999px);
2256
+ padding: 0.25rem 0.5rem;
2257
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2258
+ font-weight: 500;
2259
+ }
2260
+
2261
+ .starci-core-text-action[data-appearance="route"] {
2262
+ border-radius: var(--starci-core-pill-radius, 999px);
2263
+ padding: 0.5rem 0.75rem;
2264
+ color: var(--muted, var(--starci-core-muted, GrayText));
2265
+ }
2266
+
2267
+ .starci-core-text-action[data-appearance="section"] {
2268
+ border-radius: var(--radius-xl, calc(var(--radius, 0.5rem) * 1.5));
2269
+ padding: 0.5rem 0.75rem;
2270
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2271
+ }
2272
+
2273
+ .starci-core-text-action[data-appearance="section"]:hover,
2274
+ .starci-core-text-action[data-appearance="section"]:focus-visible {
2275
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2276
+ }
2277
+
2278
+ .starci-core-text-action[data-appearance="tab"] {
2279
+ border-block-end: 2px solid transparent;
2280
+ padding-block: 0.75rem;
2281
+ color: var(--muted, var(--starci-core-muted, GrayText));
2282
+ }
2283
+
2284
+ .starci-core-text-action[data-appearance="tab"][data-current="true"] {
2285
+ border-block-end-color: var(--accent, var(--starci-core-accent, Highlight));
2286
+ color: var(--accent, var(--starci-core-accent, Highlight));
2287
+ font-weight: 600;
2288
+ }
2289
+
2290
+ .starci-core-text-action[data-appearance="choice"][data-current="true"],
2291
+ .starci-core-text-action[data-appearance="route"][data-current="true"],
2292
+ .starci-core-text-action[data-appearance="section"][data-current="true"] {
2293
+ background: var(--accent-soft, var(--starci-core-accent, Highlight));
2294
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2295
+ }
2296
+
2297
+ .starci-core-text-action[data-appearance="route"][data-current="true"],
2298
+ .starci-core-text-action[data-appearance="section"][data-current="true"] {
2299
+ font-weight: 600;
2300
+ }
2301
+
2302
+ .starci-core-text-action[data-appearance="disclosure"] {
2303
+ color: var(--accent-soft-foreground, var(--starci-core-accent, HighlightText));
2304
+ font-weight: 600;
2305
+ }
2306
+
2307
+ .starci-core-text-action[data-appearance="plain"] {
2308
+ color: var(--foreground, var(--starci-core-foreground, CanvasText));
2309
+ text-decoration-line: none;
2310
+ }
2311
+
2312
+ .starci-core-text-action-resting {
2313
+ display: inline-flex;
2314
+ width: 4rem;
2315
+ flex: none;
2316
+ color: transparent;
2317
+ user-select: none;
2318
+ }
2319
+
2320
+ /*
2321
+ * --- Button: full width ---
2322
+ *
2323
+ * A full-width action stretches to its parent and lets its label wrap onto a second line rather
2324
+ * than overflow, so the vendor's fixed control height is released to the content.
2325
+ */
2326
+ .starci-core-button[data-width="fill"] {
2327
+ width: 100% !important;
2328
+ max-width: 100% !important;
2329
+ height: auto !important;
2330
+ min-height: var(--starci-core-control-min-size, 2.75rem);
2331
+ white-space: normal !important;
2332
+ }
2333
+
2334
+ /* --- Chat workspace: the compact rail trigger's resting paint. --- */
2335
+ .starci-core-chat-workspace-rail-trigger {
2336
+ box-shadow: 0 1px 2px 0 color-mix(in srgb, CanvasText 8%, transparent);
2337
+ outline: none;
2338
+ transition: background-color var(--starci-core-motion-duration, 180ms) var(--starci-core-motion-easing, cubic-bezier(0.2, 0, 0, 1));
2339
+ }
2340
+
2341
+ .starci-core-chat-workspace-rail-trigger:hover {
2342
+ background: var(--default, var(--starci-core-surface-secondary, Canvas));
2343
+ }
2344
+
2345
+ @media (prefers-reduced-motion: reduce) {
2346
+ .starci-core-chat-workspace-rail-trigger {
2347
+ transition: none;
2348
+ }
2349
+ }
2350
+
1565
2351
  }
1566
2352