@godxjp/ui 12.1.0 → 13.1.0

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 (157) hide show
  1. package/dist/app/index.d.ts +2 -2
  2. package/dist/app/index.js +4 -4
  3. package/dist/{app.prop-Cy6dJnU8.d.ts → app.prop-CVY8V4ss.d.ts} +1 -1
  4. package/dist/{checkbox-DPFcnsMZ.d.ts → checkbox-shzpQ_Xo.d.ts} +1 -1
  5. package/dist/{chunk-COD66MFF.js → chunk-2BR7KFCP.js} +1 -1
  6. package/dist/chunk-2H65B4JA.js +1 -0
  7. package/dist/{chunk-JSQOCVM6.js → chunk-2M57K2VW.js} +2 -2
  8. package/dist/{chunk-HTEL5DQI.js → chunk-3R3QVJCB.js} +1 -1
  9. package/dist/{chunk-FK2JDABO.js → chunk-55S5N667.js} +4 -2
  10. package/dist/{chunk-YGD4CCQC.js → chunk-5KK3KJ6L.js} +3 -3
  11. package/dist/chunk-76S3TQFH.js +109 -0
  12. package/dist/{chunk-6WSWK7TU.js → chunk-7HEFQDN5.js} +2 -2
  13. package/dist/{chunk-LCQFYL44.js → chunk-7MXIPSYM.js} +59 -5
  14. package/dist/{chunk-WBUUCU7R.js → chunk-AKFR72DQ.js} +4 -4
  15. package/dist/{chunk-IBK5D2Q6.js → chunk-B4K4BXEF.js} +3 -2
  16. package/dist/{chunk-VOHTRR5X.js → chunk-BNXPDUO4.js} +1 -1
  17. package/dist/chunk-C3PKEV6S.js +22 -0
  18. package/dist/{chunk-MMFIL33F.js → chunk-C6OEAQTO.js} +1 -1
  19. package/dist/{chunk-ASMTSQWA.js → chunk-DWYRIKVD.js} +11 -8
  20. package/dist/chunk-ES4Q3KGL.js +1 -0
  21. package/dist/{chunk-XVD5SLDL.js → chunk-FJBVDJGL.js} +56 -3
  22. package/dist/{chunk-FK5QEFVY.js → chunk-GDHDJAVB.js} +1 -1
  23. package/dist/{chunk-TXRYSMOD.js → chunk-H2TX3OPW.js} +1 -1
  24. package/dist/{chunk-EOTOCNT7.js → chunk-HCCID4YY.js} +1 -1
  25. package/dist/{chunk-2TYRT5XH.js → chunk-I2CYVA7B.js} +31 -18
  26. package/dist/{chunk-4MMIMZMK.js → chunk-IJ5ALJGA.js} +1 -1
  27. package/dist/{chunk-PO5ISUFA.js → chunk-IWAIIBSW.js} +4 -2
  28. package/dist/{chunk-UDEPO3UF.js → chunk-IZGLEPGW.js} +2 -2
  29. package/dist/{chunk-3ELRYXJK.js → chunk-JEIUEOTJ.js} +9 -3
  30. package/dist/{chunk-FTOG7D4T.js → chunk-KQ36FDEE.js} +1 -1
  31. package/dist/{chunk-WJNR3RAG.js → chunk-MTJHEQ46.js} +4 -4
  32. package/dist/{chunk-ZM4SMKEI.js → chunk-QATON677.js} +3 -20
  33. package/dist/{chunk-FOANNF6Z.js → chunk-QD3YG56T.js} +2 -2
  34. package/dist/{chunk-SIUIIIQW.js → chunk-SISAM4JZ.js} +3 -3
  35. package/dist/chunk-VU4GFGDG.js +12 -0
  36. package/dist/{chunk-MXEVP5S2.js → chunk-W2NWOWZ3.js} +5 -5
  37. package/dist/{chunk-7HF56YHC.js → chunk-X4J55OS5.js} +3 -3
  38. package/dist/{chunk-N6ELT7KB.js → chunk-XTVUYEJD.js} +30 -2
  39. package/dist/chunk-XUEDRPWF.js +177 -0
  40. package/dist/{chunk-2JCSS6B4.js → chunk-YVZPAN2W.js} +2 -2
  41. package/dist/{chunk-BCBK4FLV.js → chunk-ZFBIKJSJ.js} +2 -2
  42. package/dist/{chunk-L2MEN2VK.js → chunk-ZPHIXXTK.js} +2 -2
  43. package/dist/components/admin/index.d.ts +14 -15
  44. package/dist/components/admin/index.js +30 -28
  45. package/dist/components/data-display/badge.d.ts +1 -1
  46. package/dist/components/data-display/badge.js +4 -4
  47. package/dist/components/data-display/card.d.ts +2 -2
  48. package/dist/components/data-display/carousel.d.ts +12 -1
  49. package/dist/components/data-display/carousel.js +3 -3
  50. package/dist/components/data-display/index.d.ts +6 -6
  51. package/dist/components/data-display/index.js +9 -9
  52. package/dist/components/data-display/table.js +2 -2
  53. package/dist/components/data-entry/calendar.d.ts +6 -4
  54. package/dist/components/data-entry/calendar.js +2 -2
  55. package/dist/components/data-entry/cascader.d.ts +6 -4
  56. package/dist/components/data-entry/cascader.js +5 -5
  57. package/dist/components/data-entry/checkbox.d.ts +7 -5
  58. package/dist/components/data-entry/color-picker.d.ts +6 -4
  59. package/dist/components/data-entry/color-picker.js +5 -5
  60. package/dist/components/data-entry/command.js +2 -2
  61. package/dist/components/data-entry/date-picker.d.ts +6 -4
  62. package/dist/components/data-entry/date-picker.js +6 -6
  63. package/dist/components/data-entry/date-range-picker.d.ts +6 -4
  64. package/dist/components/data-entry/date-range-picker.js +6 -6
  65. package/dist/components/data-entry/index.d.ts +38 -9
  66. package/dist/components/data-entry/index.js +24 -22
  67. package/dist/components/data-entry/input.js +1 -1
  68. package/dist/components/data-entry/radio.d.ts +6 -4
  69. package/dist/components/data-entry/select.d.ts +6 -4
  70. package/dist/components/data-entry/select.js +6 -6
  71. package/dist/components/data-entry/slider.d.ts +6 -4
  72. package/dist/components/data-entry/switch.d.ts +6 -4
  73. package/dist/components/data-entry/textarea.js +2 -2
  74. package/dist/components/data-entry/time-input.js +2 -2
  75. package/dist/components/data-entry/time-picker.d.ts +6 -4
  76. package/dist/components/data-entry/time-picker.js +4 -4
  77. package/dist/components/data-entry/transfer.d.ts +7 -5
  78. package/dist/components/data-entry/transfer.js +5 -5
  79. package/dist/components/data-entry/tree-select.d.ts +6 -4
  80. package/dist/components/data-entry/tree-select.js +5 -5
  81. package/dist/components/data-entry/upload.d.ts +7 -5
  82. package/dist/components/data-entry/upload.js +8 -7
  83. package/dist/components/data-grid/index.js +9 -9
  84. package/dist/components/feedback/alert.d.ts +4 -4
  85. package/dist/components/feedback/alert.js +4 -4
  86. package/dist/components/feedback/dialog.d.ts +19 -5
  87. package/dist/components/feedback/dialog.js +5 -4
  88. package/dist/components/feedback/index.d.ts +17 -26
  89. package/dist/components/feedback/index.js +13 -12
  90. package/dist/components/feedback/sheet.d.ts +21 -2
  91. package/dist/components/feedback/sheet.js +2 -1
  92. package/dist/components/general/button.d.ts +3 -3
  93. package/dist/components/general/index.d.ts +3 -3
  94. package/dist/components/layout/index.d.ts +6 -6
  95. package/dist/components/layout/index.js +5 -4
  96. package/dist/components/navigation/index.d.ts +8 -8
  97. package/dist/components/navigation/index.js +9 -9
  98. package/dist/components/navigation/pagination.d.ts +4 -4
  99. package/dist/components/navigation/pagination.js +7 -7
  100. package/dist/components/navigation/steps.d.ts +5 -5
  101. package/dist/components/navigation/steps.js +4 -4
  102. package/dist/components/query/index.d.ts +4 -4
  103. package/dist/components/query/index.js +4 -4
  104. package/dist/components/ui/index.d.ts +15 -13
  105. package/dist/components/ui/index.js +27 -26
  106. package/dist/{data-display.prop-Cf2p9QC4.d.ts → data-display.prop-BOtnzI17.d.ts} +3 -3
  107. package/dist/{data-entry.prop-6J0o45se.d.ts → data-entry.prop-DL7kUcJh.d.ts} +32 -3
  108. package/dist/{data-table-B_q7j992.d.ts → data-table-DO-gU4wJ.d.ts} +3 -3
  109. package/dist/{data.prop-DMYMNl6L.d.ts → data.prop-D4uDw_SW.d.ts} +1 -1
  110. package/dist/{feedback.prop-Nc9Aa8SV.d.ts → feedback.prop-CtrL24E1.d.ts} +2 -2
  111. package/dist/{filter-bar-B07JSxME.d.ts → filter-bar-tEwfKthz.d.ts} +1 -1
  112. package/dist/{flex-DXtIALBh.d.ts → flex-88Ps6YCv.d.ts} +1 -1
  113. package/dist/form/index.d.ts +3 -3
  114. package/dist/form/index.js +2 -1
  115. package/dist/{form.prop-Bc6r6JJW.d.ts → form.prop-5cyL3bvT.d.ts} +1 -1
  116. package/dist/{general.prop-DoHDCRmL.d.ts → general.prop-1GgJkf4b.d.ts} +2 -2
  117. package/dist/i18n/index.d.ts +3 -1
  118. package/dist/i18n/index.js +2 -2
  119. package/dist/index.d.ts +14 -15
  120. package/dist/index.js +40 -38
  121. package/dist/{interaction.prop-DSFizzP6.d.ts → interaction.prop-R77MnAMZ.d.ts} +5 -1
  122. package/dist/{layout.prop-B1yQPUNZ.d.ts → layout.prop-ChLFNGJ6.d.ts} +2 -2
  123. package/dist/lib/datetime/index.js +1 -1
  124. package/dist/{navigation.prop-BKlxd-j7.d.ts → navigation.prop-CXDaVNaR.d.ts} +1 -1
  125. package/dist/{navigation.prop-Dumy196X.d.ts → navigation.prop-Cc_Iu87S.d.ts} +2 -2
  126. package/dist/props/components/index.d.ts +13 -13
  127. package/dist/props/index.d.ts +13 -13
  128. package/dist/props/index.js +1 -1
  129. package/dist/props/registry.d.ts +22 -2
  130. package/dist/props/registry.js +1 -1
  131. package/dist/props/vocabulary/index.d.ts +4 -4
  132. package/dist/{query.prop-Dog-EAfG.d.ts → query.prop-CyNxaCHe.d.ts} +2 -2
  133. package/dist/{search-input-BR4nAWiT.d.ts → search-input-CFUtVWQl.d.ts} +2 -2
  134. package/dist/{shared.prop-BsNSXeqD.d.ts → shared.prop-BvMSLFJ6.d.ts} +7 -1
  135. package/dist/styles/alert-layout.css +8 -8
  136. package/dist/styles/card-layout.css +301 -292
  137. package/dist/styles/control.css +8 -9
  138. package/dist/styles/data-display-layout.css +50 -5
  139. package/dist/styles/density.css +4 -0
  140. package/dist/styles/dialog-layout.css +35 -7
  141. package/dist/styles/form-layout.css +161 -0
  142. package/dist/styles/index.css +31 -3
  143. package/dist/styles/layout.css +1 -1
  144. package/dist/styles/navigation-layout.css +1 -1
  145. package/dist/styles/shell-layout.css +12 -12
  146. package/dist/tokens/components/card.css +1 -1
  147. package/dist/tokens/components/feedback.css +9 -1
  148. package/dist/tokens/foundation.css +74 -16
  149. package/dist/tokens/semantic/layout.css +29 -11
  150. package/package.json +1 -1
  151. package/dist/chunk-A6VFHPS6.js +0 -119
  152. package/dist/chunk-B3WX53JQ.js +0 -40
  153. package/dist/chunk-QSGW3ZWK.js +0 -45
  154. package/dist/chunk-WFUIE252.js +0 -61
  155. package/dist/styles/feedback-layout.css +0 -49
  156. package/dist/tooltip-Bf2KjRy8.d.ts +0 -14
  157. package/dist/use-toast-Dsw3yE2S.d.ts +0 -19
@@ -177,7 +177,6 @@
177
177
  padding: 0;
178
178
  }
179
179
 
180
-
181
180
  .ui-control {
182
181
  height: var(--control-height);
183
182
  padding-left: var(--control-padding-x);
@@ -255,7 +254,7 @@
255
254
  }
256
255
 
257
256
  .ui-radio {
258
- border-radius: 9999px;
257
+ border-radius: var(--radius-pill);
259
258
  }
260
259
 
261
260
  .ui-checkbox:focus-visible,
@@ -305,7 +304,7 @@
305
304
  cursor: pointer;
306
305
  align-items: center;
307
306
  border: 2px solid transparent;
308
- border-radius: 9999px;
307
+ border-radius: var(--radius-pill);
309
308
  box-shadow: var(--shadow-sm);
310
309
  transition-property: color, background-color, border-color, box-shadow;
311
310
  transition-duration: 150ms;
@@ -324,7 +323,7 @@
324
323
  display: block;
325
324
  width: var(--switch-thumb-size);
326
325
  height: var(--switch-thumb-size);
327
- border-radius: 9999px;
326
+ border-radius: var(--radius-pill);
328
327
  background: hsl(var(--background));
329
328
  box-shadow: var(--shadow-lg);
330
329
  transition: transform 150ms;
@@ -349,7 +348,7 @@
349
348
  width: 100%;
350
349
  flex-grow: 1;
351
350
  overflow: hidden;
352
- border-radius: 9999px;
351
+ border-radius: var(--radius-pill);
353
352
  background: hsl(var(--primary) / 0.2);
354
353
  }
355
354
 
@@ -364,7 +363,7 @@
364
363
  width: var(--slider-thumb-size);
365
364
  height: var(--slider-thumb-size);
366
365
  border: 1px solid hsl(var(--primary) / 0.5);
367
- border-radius: 9999px;
366
+ border-radius: var(--radius-pill);
368
367
  background: hsl(var(--background));
369
368
  box-shadow: var(--shadow-sm);
370
369
  transition:
@@ -615,7 +614,7 @@
615
614
  height: var(--control-height);
616
615
  align-items: center;
617
616
  justify-content: center;
618
- font-size: 0.875rem;
617
+ font-size: var(--font-size-sm);
619
618
  border: 1px solid hsl(var(--border));
620
619
  border-inline-start-width: 0;
621
620
  background: hsl(var(--background));
@@ -732,7 +731,7 @@
732
731
  display: inline-flex;
733
732
  align-items: center;
734
733
  gap: var(--space-1);
735
- font-size: 0.8125rem;
734
+ font-size: var(--font-size-xs);
736
735
  padding: 0.0625rem var(--space-2);
737
736
  border-radius: var(--radius-sm);
738
737
  background: hsl(var(--secondary));
@@ -766,6 +765,6 @@
766
765
  border: 0;
767
766
  outline: none;
768
767
  background: transparent;
769
- font-size: 0.875rem;
768
+ font-size: var(--font-size-sm);
770
769
  color: inherit;
771
770
  }
@@ -8,7 +8,7 @@
8
8
  align-items: center;
9
9
  justify-content: center;
10
10
  overflow: hidden;
11
- border-radius: 9999px;
11
+ border-radius: var(--radius-pill);
12
12
  background: hsl(var(--muted));
13
13
  color: hsl(var(--muted-foreground));
14
14
  font-size: var(--font-size-sm);
@@ -39,7 +39,7 @@
39
39
  .ui-progress-track {
40
40
  height: 0.5rem;
41
41
  overflow: hidden;
42
- border-radius: 9999px;
42
+ border-radius: var(--radius-pill);
43
43
  background: hsl(var(--secondary));
44
44
  }
45
45
 
@@ -149,7 +149,7 @@
149
149
  width: 1.5rem;
150
150
  height: 1.5rem;
151
151
  place-items: center;
152
- border-radius: 9999px;
152
+ border-radius: var(--radius-pill);
153
153
  background: hsl(var(--success));
154
154
  color: hsl(var(--success-foreground));
155
155
  }
@@ -239,7 +239,7 @@
239
239
  }
240
240
  .ui-accordion-content {
241
241
  overflow: hidden;
242
- font-size: 0.875rem;
242
+ font-size: var(--font-size-sm);
243
243
  }
244
244
  .ui-accordion-content-inner {
245
245
  padding-bottom: var(--space-4);
@@ -286,7 +286,7 @@
286
286
  width: 2rem;
287
287
  height: 2rem;
288
288
  place-items: center;
289
- border-radius: 9999px;
289
+ border-radius: var(--radius-pill);
290
290
  background: hsl(var(--background));
291
291
  border: 1px solid hsl(var(--border));
292
292
  color: hsl(var(--foreground));
@@ -313,6 +313,51 @@
313
313
  height: 1rem;
314
314
  }
315
315
 
316
+ /* Dot indicators — horizontal, centered row of round dots; the active one fills + widens. */
317
+ .ui-carousel-dots {
318
+ display: flex;
319
+ flex-wrap: wrap;
320
+ align-items: center;
321
+ justify-content: center;
322
+ gap: var(--space-2);
323
+ padding-top: var(--space-4);
324
+ }
325
+
326
+ .ui-carousel-dot {
327
+ width: var(--space-2);
328
+ height: var(--space-2);
329
+ flex-shrink: 0;
330
+ border-radius: var(--radius-pill);
331
+ background: hsl(var(--border));
332
+ transition:
333
+ width 150ms ease,
334
+ background-color 150ms ease;
335
+ }
336
+
337
+ .ui-carousel-dot:hover {
338
+ background: hsl(var(--muted-foreground));
339
+ }
340
+
341
+ .ui-carousel-dot[data-active] {
342
+ width: var(--space-5);
343
+ background: hsl(var(--primary));
344
+ }
345
+
346
+ .ui-carousel-dot:focus-visible {
347
+ outline: 2px solid hsl(var(--ring));
348
+ outline-offset: 2px;
349
+ }
350
+
351
+ /* Vertical orientation — stack the dots into a column beside the track. */
352
+ .ui-carousel[data-orientation="vertical"] .ui-carousel-dots {
353
+ flex-direction: column;
354
+ }
355
+
356
+ .ui-carousel[data-orientation="vertical"] .ui-carousel-dot[data-active] {
357
+ width: var(--space-2);
358
+ height: var(--space-5);
359
+ }
360
+
316
361
  /* Vertical orientation (opts.axis === "y") — flips the track and the arrow positions. */
317
362
  .ui-carousel[data-orientation="vertical"] .ui-carousel-content {
318
363
  flex-direction: column;
@@ -15,6 +15,8 @@
15
15
  --switch-thumb-size: var(--switch-thumb-size-compact);
16
16
  --switch-thumb-translate: var(--switch-thumb-translate-compact);
17
17
  --table-cell-padding-y: var(--space-1);
18
+ /* Tighter overlay/card chrome at compact density (12px vertical). */
19
+ --space-chrome-y: var(--space-3);
18
20
  }
19
21
 
20
22
  .ui-density-default {
@@ -39,5 +41,7 @@
39
41
  --switch-thumb-size: var(--switch-thumb-size-comfortable);
40
42
  --switch-thumb-translate: var(--switch-thumb-translate-comfortable);
41
43
  --table-cell-padding-y: var(--space-2);
44
+ /* Roomier overlay/card chrome at comfortable density (24px vertical). */
45
+ --space-chrome-y: var(--space-6);
42
46
  }
43
47
  }
@@ -3,6 +3,14 @@
3
3
  */
4
4
 
5
5
  @layer components {
6
+ /* Sheet (side-panel, Radix Dialog) chrome padding — defaults to the shared global chrome tokens.
7
+ * A service overrides --space-chrome-* once (whole system) or --sheet-pad-* for the Sheet only.
8
+ * (Lives here because Sheet is Dialog-based and dialog-layout.css is in the main bundle.) */
9
+ [data-slot="sheet-content"] {
10
+ --sheet-pad-x: var(--space-chrome-x);
11
+ --sheet-pad-y: var(--space-chrome-y);
12
+ }
13
+
6
14
  .ui-dialog-overlay {
7
15
  position: fixed;
8
16
  inset: 0;
@@ -23,6 +31,8 @@
23
31
  border: 1px solid hsl(var(--border));
24
32
  background-color: hsl(var(--background));
25
33
  padding: var(--dialog-space-inset);
34
+ /* clip so the full-bleed header/footer bands round with the dialog corners (Ant Modal). */
35
+ overflow: hidden;
26
36
  box-shadow: var(--shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
27
37
  }
28
38
 
@@ -32,23 +42,41 @@
32
42
  }
33
43
  }
34
44
 
45
+ /* Ring-safe scrollable body for a tall dialog. Full-bleed inset (matches the dialog padding) so a
46
+ * full-width control's 3px focus ring never clips against the scroll container's computed
47
+ * overflow-x; padding-block keeps the ring visible at the scroll edges. Mirrors SheetBody. */
48
+ [data-slot="dialog-body"] {
49
+ min-height: 0;
50
+ max-height: min(60vh, 32rem);
51
+ overflow-y: auto;
52
+ margin-inline: calc(-1 * var(--dialog-space-x));
53
+ padding-inline: var(--dialog-space-x);
54
+ padding-block: var(--space-1);
55
+ scroll-padding-block: var(--space-1);
56
+ }
57
+
58
+ /* Header = full-bleed band with a bottom border + the shared chrome padding — MIRRORS the footer so
59
+ * the two are symmetric pinned bars (same as Sheet/Drawer). */
35
60
  [data-slot="dialog-header"] {
36
61
  display: flex;
37
62
  flex-direction: column;
38
63
  gap: var(--space-stack-xs);
39
- text-align: center;
40
- }
41
-
42
- @media (min-width: 640px) {
43
- [data-slot="dialog-header"] {
44
- text-align: left;
45
- }
64
+ text-align: start;
65
+ margin-inline: calc(-1 * var(--dialog-space-x));
66
+ margin-block-start: calc(-1 * var(--dialog-space-y));
67
+ padding: var(--dialog-space-y) var(--dialog-space-x);
68
+ border-bottom: 1px solid hsl(var(--border));
46
69
  }
47
70
 
71
+ /* Footer = full-bleed band with a top border + the same chrome padding (mirror of the header). */
48
72
  [data-slot="dialog-footer"] {
49
73
  display: flex;
50
74
  flex-direction: column-reverse;
51
75
  gap: var(--space-inline-sm);
76
+ margin-inline: calc(-1 * var(--dialog-space-x));
77
+ margin-block-end: calc(-1 * var(--dialog-space-y));
78
+ padding: var(--dialog-space-y) var(--dialog-space-x);
79
+ border-top: 1px solid hsl(var(--border));
52
80
  }
53
81
 
54
82
  @media (min-width: 640px) {
@@ -0,0 +1,161 @@
1
+ /*
2
+ * FORM — Ant-style layout. Vertical by default (label above control, LEFT-aligned). Horizontal lays
3
+ * the label beside the control from the `collapseBelow` breakpoint UP (mobile-first): below it the
4
+ * field collapses back to vertical. `--form-label-width` / `--form-control-width` come from the Form
5
+ * (or a per-field override). RTL-safe: logical inline axis throughout.
6
+ *
7
+ * IMPORTANT: label alignment (justify/text-align: end) applies ONLY in horizontal/inline mode — never
8
+ * to a vertical field (a right-aligned label above a full-width control is wrong, gh feedback).
9
+ */
10
+
11
+ @layer components {
12
+ .ui-form {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--space-4);
16
+ }
17
+
18
+ /* Vertical (default + collapsed state): label stacked above the control column, LEFT-aligned.
19
+ * Gap = the shared --field-label-gap so FormField matches Descriptions and every label-above stack. */
20
+ .ui-form-field {
21
+ display: grid;
22
+ gap: var(--field-label-gap);
23
+ }
24
+
25
+ .ui-form-field-label {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: var(--space-1);
29
+ min-width: 0;
30
+ }
31
+
32
+ .ui-form-field-control {
33
+ display: grid;
34
+ gap: var(--space-stack-xs); /* 4px between control and helper/error */
35
+ min-width: 0;
36
+ /* Cap the control width when a controlWidth is set; otherwise fill the column. */
37
+ max-inline-size: var(--form-control-width, none);
38
+ }
39
+
40
+ /* ── Horizontal — label beside control. Each block is scoped to [data-layout=horizontal|inline]
41
+ * so it NEVER affects a vertical field. Applies from the collapse breakpoint up (mobile-first). */
42
+
43
+ /* collapseBelow=false → always horizontal (all widths). */
44
+ .ui-form-field[data-collapse-below="false"]:is(
45
+ [data-layout="horizontal"],
46
+ [data-layout="inline"]
47
+ ) {
48
+ grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
49
+ align-items: start;
50
+ column-gap: var(--space-4);
51
+ row-gap: var(--space-stack-xs);
52
+ }
53
+ .ui-form-field[data-collapse-below="false"]:is([data-layout="horizontal"], [data-layout="inline"])
54
+ > .ui-form-field-label {
55
+ min-block-size: var(--control-height);
56
+ }
57
+ .ui-form-field[data-collapse-below="false"][data-label-align="end"]:is(
58
+ [data-layout="horizontal"],
59
+ [data-layout="inline"]
60
+ )
61
+ > .ui-form-field-label {
62
+ justify-content: flex-end;
63
+ text-align: end;
64
+ }
65
+
66
+ @media (min-width: 640px) {
67
+ .ui-form-field[data-collapse-below="sm"]:is(
68
+ [data-layout="horizontal"],
69
+ [data-layout="inline"]
70
+ ) {
71
+ grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
72
+ align-items: start;
73
+ column-gap: var(--space-4);
74
+ row-gap: var(--space-stack-xs);
75
+ }
76
+ .ui-form-field[data-collapse-below="sm"]:is([data-layout="horizontal"], [data-layout="inline"])
77
+ > .ui-form-field-label {
78
+ min-block-size: var(--control-height);
79
+ }
80
+ .ui-form-field[data-collapse-below="sm"][data-label-align="end"]:is(
81
+ [data-layout="horizontal"],
82
+ [data-layout="inline"]
83
+ )
84
+ > .ui-form-field-label {
85
+ justify-content: flex-end;
86
+ text-align: end;
87
+ }
88
+ }
89
+
90
+ @media (min-width: 768px) {
91
+ .ui-form-field[data-collapse-below="md"]:is(
92
+ [data-layout="horizontal"],
93
+ [data-layout="inline"]
94
+ ) {
95
+ grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
96
+ align-items: start;
97
+ column-gap: var(--space-4);
98
+ row-gap: var(--space-stack-xs);
99
+ }
100
+ .ui-form-field[data-collapse-below="md"]:is([data-layout="horizontal"], [data-layout="inline"])
101
+ > .ui-form-field-label {
102
+ min-block-size: var(--control-height);
103
+ }
104
+ .ui-form-field[data-collapse-below="md"][data-label-align="end"]:is(
105
+ [data-layout="horizontal"],
106
+ [data-layout="inline"]
107
+ )
108
+ > .ui-form-field-label {
109
+ justify-content: flex-end;
110
+ text-align: end;
111
+ }
112
+ }
113
+
114
+ @media (min-width: 1024px) {
115
+ .ui-form-field[data-collapse-below="lg"]:is(
116
+ [data-layout="horizontal"],
117
+ [data-layout="inline"]
118
+ ) {
119
+ grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
120
+ align-items: start;
121
+ column-gap: var(--space-4);
122
+ row-gap: var(--space-stack-xs);
123
+ }
124
+ .ui-form-field[data-collapse-below="lg"]:is([data-layout="horizontal"], [data-layout="inline"])
125
+ > .ui-form-field-label {
126
+ min-block-size: var(--control-height);
127
+ }
128
+ .ui-form-field[data-collapse-below="lg"][data-label-align="end"]:is(
129
+ [data-layout="horizontal"],
130
+ [data-layout="inline"]
131
+ )
132
+ > .ui-form-field-label {
133
+ justify-content: flex-end;
134
+ text-align: end;
135
+ }
136
+ }
137
+
138
+ @media (min-width: 1280px) {
139
+ .ui-form-field[data-collapse-below="xl"]:is(
140
+ [data-layout="horizontal"],
141
+ [data-layout="inline"]
142
+ ) {
143
+ grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
144
+ align-items: start;
145
+ column-gap: var(--space-4);
146
+ row-gap: var(--space-stack-xs);
147
+ }
148
+ .ui-form-field[data-collapse-below="xl"]:is([data-layout="horizontal"], [data-layout="inline"])
149
+ > .ui-form-field-label {
150
+ min-block-size: var(--control-height);
151
+ }
152
+ .ui-form-field[data-collapse-below="xl"][data-label-align="end"]:is(
153
+ [data-layout="horizontal"],
154
+ [data-layout="inline"]
155
+ )
156
+ > .ui-form-field-label {
157
+ justify-content: flex-end;
158
+ text-align: end;
159
+ }
160
+ }
161
+ }
@@ -16,6 +16,13 @@
16
16
  @source inline(
17
17
  "{bg,text}-{primary,secondary,muted,accent,destructive,success,warning,info,attention}-foreground"
18
18
  );
19
+ /* Extended text hierarchy + interaction-ramp utilities (library may not reference them directly). */
20
+ @source inline("{text,bg,border}-{foreground-tertiary,foreground-disabled,link,brand}");
21
+ @source inline("bg-{primary,secondary,destructive}-{hover,active}");
22
+ /* Force the extended radius steps so Tailwind emits --radius-xs/-xl/-2xl to :root (consumers read
23
+ * `var(--radius-2xl)` directly; without a generated utility Tailwind drops the unused var). */
24
+ @source inline("rounded-{xs,xl,2xl}");
25
+ @source inline("text-2xs");
19
26
  @source "../**/*.{tsx,ts}";
20
27
  @import "../tokens/base.css";
21
28
  @import "./density.css";
@@ -29,6 +36,7 @@
29
36
  @import "./badge-layout.css";
30
37
  @import "./data-display-layout.css";
31
38
  @import "./data-entry-layout.css";
39
+ @import "./form-layout.css";
32
40
  @import "./navigation-layout.css";
33
41
 
34
42
  @theme {
@@ -65,9 +73,28 @@
65
73
  --color-chart-4: var(--chart-4);
66
74
  --color-chart-5: var(--chart-5);
67
75
  --color-chart-6: var(--chart-6);
76
+ /* Golden-ratio radius scale — every step derives from --radius × (--radius-ratio = φ)ⁿ, so
77
+ * overriding --radius alone rescales the whole scale proportionally (≈ 1.4/2.3/3.7/6/9.7/15.7px). */
78
+ --radius-xs: calc(
79
+ var(--radius) / var(--radius-ratio) / var(--radius-ratio) / var(--radius-ratio)
80
+ );
81
+ --radius-sm: calc(var(--radius) / var(--radius-ratio) / var(--radius-ratio));
82
+ --radius-md: calc(var(--radius) / var(--radius-ratio));
68
83
  --radius-lg: var(--radius);
69
- --radius-md: calc(var(--radius) - 2px);
70
- --radius-sm: calc(var(--radius) - 4px);
84
+ --radius-xl: calc(var(--radius) * var(--radius-ratio));
85
+ --radius-2xl: calc(var(--radius) * var(--radius-ratio) * var(--radius-ratio));
86
+ /* Extended text-hierarchy roles (tertiary / disabled / link / brand) → text-* / bg-* utilities. */
87
+ --color-foreground-tertiary: hsl(var(--text-tertiary));
88
+ --color-foreground-disabled: hsl(var(--text-disabled));
89
+ --color-link: hsl(var(--text-link));
90
+ --color-brand: hsl(var(--text-brand));
91
+ /* Interaction ramp (hover / active) → bg-primary-hover etc. */
92
+ --color-primary-hover: hsl(var(--primary-hover));
93
+ --color-primary-active: hsl(var(--primary-active));
94
+ --color-secondary-hover: hsl(var(--secondary-hover));
95
+ --color-secondary-active: hsl(var(--secondary-active));
96
+ --color-destructive-hover: hsl(var(--destructive-hover));
97
+ --color-destructive-active: hsl(var(--destructive-active));
71
98
  /* Wire Tailwind's font-sans/mono (and preflight) to the design-system fonts. */
72
99
  --font-sans: var(--font-family-sans);
73
100
  --font-mono: var(--font-family-mono);
@@ -86,6 +113,7 @@
86
113
  --color-wa-sumi: var(--wa-sumi);
87
114
  --color-wa-nezu: var(--wa-nezu);
88
115
  /* Wire Tailwind text-* utilities to runtime typography tokens (fontSize toolbar). */
116
+ --text-2xs: var(--font-size-2xs);
89
117
  --text-xs: var(--font-size-xs);
90
118
  --text-sm: var(--font-size-sm);
91
119
  --text-base: var(--font-size-base);
@@ -103,7 +131,7 @@
103
131
  background-color: hsl(var(--background));
104
132
  color: hsl(var(--foreground));
105
133
  font-family: var(--font-family-sans);
106
- font-size: var(--font-size-sm);
134
+ font-size: var(--font-size-base);
107
135
  line-height: var(--line-height-body);
108
136
  font-feature-settings:
109
137
  "cv02",
@@ -451,7 +451,7 @@
451
451
  justify-content: center;
452
452
  width: 3rem;
453
453
  height: 3rem;
454
- border-radius: 9999px;
454
+ border-radius: var(--radius-pill);
455
455
  background-color: hsl(var(--muted));
456
456
  }
457
457
  }
@@ -127,7 +127,7 @@
127
127
  .ui-menubar-dot {
128
128
  width: 0.5rem;
129
129
  height: 0.5rem;
130
- border-radius: 9999px;
130
+ border-radius: var(--radius-pill);
131
131
  background: currentColor;
132
132
  }
133
133
 
@@ -173,7 +173,7 @@
173
173
 
174
174
  .sb-product-tenant {
175
175
  overflow: hidden;
176
- font-size: 10px;
176
+ font-size: var(--font-size-2xs);
177
177
  font-weight: 700;
178
178
  letter-spacing: 0.08em;
179
179
  line-height: 1.2;
@@ -203,7 +203,7 @@
203
203
  .sb-section-label {
204
204
  padding: 0 var(--space-2) var(--space-1);
205
205
  color: hsl(var(--muted-foreground));
206
- font-size: 10px;
206
+ font-size: var(--font-size-2xs);
207
207
  font-weight: 700;
208
208
  letter-spacing: 0.08em;
209
209
  line-height: 1.2;
@@ -270,12 +270,12 @@
270
270
  min-width: 1.125rem;
271
271
  align-items: center;
272
272
  justify-content: center;
273
- border-radius: 9999px;
273
+ border-radius: var(--radius-pill);
274
274
  background: hsl(var(--secondary));
275
275
  color: hsl(var(--muted-foreground));
276
- font-size: 10px;
276
+ font-size: var(--font-size-2xs);
277
277
  font-weight: var(--font-weight-medium);
278
- line-height: 1.125rem;
278
+ line-height: 1.2;
279
279
  padding-inline: 0.375rem;
280
280
  }
281
281
 
@@ -319,7 +319,7 @@
319
319
  width: 4px;
320
320
  height: 4px;
321
321
  flex: 0 0 auto;
322
- border-radius: 9999px;
322
+ border-radius: var(--radius-pill);
323
323
  background: currentColor;
324
324
  opacity: 0.4;
325
325
  }
@@ -397,7 +397,7 @@
397
397
  flex: 0 0 auto;
398
398
  align-items: center;
399
399
  justify-content: center;
400
- border-radius: 9999px;
400
+ border-radius: var(--radius-pill);
401
401
  background: hsl(var(--secondary));
402
402
  color: hsl(var(--muted-foreground));
403
403
  font-size: 11px;
@@ -410,7 +410,7 @@
410
410
  bottom: -1px;
411
411
  width: 0.5625rem;
412
412
  height: 0.5625rem;
413
- border-radius: 9999px;
413
+ border-radius: var(--radius-pill);
414
414
  border: 1.5px solid hsl(var(--card));
415
415
  background: hsl(var(--success));
416
416
  }
@@ -433,7 +433,7 @@
433
433
  .sb-user-role {
434
434
  overflow: hidden;
435
435
  color: hsl(var(--muted-foreground));
436
- font-size: 10px;
436
+ font-size: var(--font-size-2xs);
437
437
  line-height: 1.3;
438
438
  text-overflow: ellipsis;
439
439
  white-space: nowrap;
@@ -515,7 +515,7 @@
515
515
  place-items: center;
516
516
  border-radius: calc(var(--radius) - 2px);
517
517
  color: white;
518
- font-size: 10px;
518
+ font-size: var(--font-size-2xs);
519
519
  font-weight: 700;
520
520
  }
521
521
 
@@ -570,7 +570,7 @@
570
570
  background: hsl(var(--secondary));
571
571
  color: hsl(var(--muted-foreground));
572
572
  font-family: var(--font-family-mono);
573
- font-size: 10px;
573
+ font-size: var(--font-size-2xs);
574
574
  line-height: 1.2;
575
575
  }
576
576
 
@@ -610,7 +610,7 @@
610
610
  right: 0.35rem;
611
611
  width: 0.375rem;
612
612
  height: 0.375rem;
613
- border-radius: 9999px;
613
+ border-radius: var(--radius-pill);
614
614
  background: hsl(var(--attention));
615
615
  }
616
616
 
@@ -19,7 +19,7 @@
19
19
  --stat-card-label-font-size: var(--font-size-xs);
20
20
  --stat-card-label-font-weight: var(--font-weight-medium);
21
21
  --stat-card-label-letter-spacing: 0.04em;
22
- --stat-card-value-font-size: 1.625rem;
22
+ --stat-card-value-font-size: var(--font-size-2xl);
23
23
  --stat-card-value-line-height: 1.1;
24
24
  --stat-card-value-font-weight: var(--font-weight-semibold);
25
25
  --stat-card-hint-font-size: var(--font-size-xs);
@@ -1,13 +1,21 @@
1
1
  /* Feedback primitive tokens: dialog, alert, empty state. */
2
2
 
3
3
  :root {
4
- --dialog-space-inset: var(--space-5);
4
+ /* Dialog inset defaults to the shared global chrome tokens (override --space-chrome-* once for the
5
+ * whole system, or --dialog-space-x/-y for dialogs only). */
6
+ --dialog-space-x: var(--space-chrome-x);
7
+ --dialog-space-y: var(--space-chrome-y);
8
+ --dialog-space-inset: var(--dialog-space-y) var(--dialog-space-x);
5
9
  --dialog-space-gap: var(--space-stack-md);
6
10
  --dialog-close-space-offset: var(--space-4);
7
11
  --alert-space-inset: var(--space-section-active);
8
12
  --alert-space-gap: var(--space-inline-md);
9
13
  --alert-inner-space-gap: var(--space-stack-sm);
10
14
  --alert-dismiss-space-offset: var(--space-3);
15
+ /* Soft (subtle) semantic tint ratios — themeable so a service can hit its exact spec
16
+ * (a brand's success-bg/-border are often more present than the faint 5%/30% default). */
17
+ --alert-bg-alpha: 0.05;
18
+ --alert-border-alpha: 0.3;
11
19
  --empty-state-space-y: var(--space-10);
12
20
  --empty-state-space-x: var(--space-6);
13
21
  --skeleton-row-gap: var(--space-stack-sm);