@hanzo/ui 8.4.13 → 8.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/backends/gui/index.cjs +11 -1
  2. package/dist/backends/gui/index.d.ts +3 -0
  3. package/dist/backends/gui/index.d.ts.map +1 -1
  4. package/dist/backends/gui/index.js +3 -0
  5. package/dist/backends/gui/index.js.map +1 -1
  6. package/dist/backends/gui/link.cjs +126 -0
  7. package/dist/backends/gui/link.d.ts +65 -0
  8. package/dist/backends/gui/link.d.ts.map +1 -0
  9. package/dist/backends/gui/link.js +88 -0
  10. package/dist/backends/gui/link.js.map +1 -0
  11. package/dist/backends/gui/prose.cjs +33 -0
  12. package/dist/backends/gui/prose.d.ts +39 -0
  13. package/dist/backends/gui/prose.d.ts.map +1 -0
  14. package/dist/backends/gui/prose.js +30 -0
  15. package/dist/backends/gui/prose.js.map +1 -0
  16. package/dist/backends/gui/video.cjs +89 -0
  17. package/dist/backends/gui/video.d.ts +33 -0
  18. package/dist/backends/gui/video.d.ts.map +1 -0
  19. package/dist/backends/gui/video.js +53 -0
  20. package/dist/backends/gui/video.js.map +1 -0
  21. package/dist/blocks/accordian.cjs +19 -0
  22. package/dist/blocks/accordian.d.ts +4 -0
  23. package/dist/blocks/accordian.d.ts.map +1 -0
  24. package/dist/blocks/accordian.js +16 -0
  25. package/dist/blocks/accordian.js.map +1 -0
  26. package/dist/blocks/bullet-cards.cjs +40 -0
  27. package/dist/blocks/bullet-cards.d.ts +10 -0
  28. package/dist/blocks/bullet-cards.d.ts.map +1 -0
  29. package/dist/blocks/bullet-cards.js +37 -0
  30. package/dist/blocks/bullet-cards.js.map +1 -0
  31. package/dist/blocks/card.cjs +58 -0
  32. package/dist/blocks/card.d.ts +14 -0
  33. package/dist/blocks/card.d.ts.map +1 -0
  34. package/dist/blocks/card.js +55 -0
  35. package/dist/blocks/card.js.map +1 -0
  36. package/dist/blocks/carte-blanche.cjs +38 -0
  37. package/dist/blocks/carte-blanche.d.ts +13 -0
  38. package/dist/blocks/carte-blanche.d.ts.map +1 -0
  39. package/dist/blocks/carte-blanche.js +35 -0
  40. package/dist/blocks/carte-blanche.js.map +1 -0
  41. package/dist/blocks/content.cjs +65 -0
  42. package/dist/blocks/content.d.ts +11 -0
  43. package/dist/blocks/content.d.ts.map +1 -0
  44. package/dist/blocks/content.js +61 -0
  45. package/dist/blocks/content.js.map +1 -0
  46. package/dist/blocks/cta.cjs +103 -0
  47. package/dist/blocks/cta.d.ts +13 -0
  48. package/dist/blocks/cta.d.ts.map +1 -0
  49. package/dist/blocks/cta.js +67 -0
  50. package/dist/blocks/cta.js.map +1 -0
  51. package/dist/blocks/def.cjs +24 -0
  52. package/dist/blocks/def.d.ts +191 -0
  53. package/dist/blocks/def.d.ts.map +1 -0
  54. package/dist/blocks/def.js +22 -0
  55. package/dist/blocks/def.js.map +1 -0
  56. package/dist/blocks/enh-heading.cjs +86 -0
  57. package/dist/blocks/enh-heading.d.ts +7 -0
  58. package/dist/blocks/enh-heading.d.ts.map +1 -0
  59. package/dist/blocks/enh-heading.js +83 -0
  60. package/dist/blocks/enh-heading.js.map +1 -0
  61. package/dist/blocks/grid.cjs +98 -0
  62. package/dist/blocks/grid.d.ts +18 -0
  63. package/dist/blocks/grid.d.ts.map +1 -0
  64. package/dist/blocks/grid.js +62 -0
  65. package/dist/blocks/grid.js.map +1 -0
  66. package/dist/blocks/group.cjs +43 -0
  67. package/dist/blocks/group.d.ts +4 -0
  68. package/dist/blocks/group.d.ts.map +1 -0
  69. package/dist/blocks/group.js +40 -0
  70. package/dist/blocks/group.js.map +1 -0
  71. package/dist/blocks/heading.cjs +22 -0
  72. package/dist/blocks/heading.d.ts +4 -0
  73. package/dist/blocks/heading.d.ts.map +1 -0
  74. package/dist/blocks/heading.js +19 -0
  75. package/dist/blocks/heading.js.map +1 -0
  76. package/dist/blocks/image.cjs +54 -0
  77. package/dist/blocks/image.d.ts +19 -0
  78. package/dist/blocks/image.d.ts.map +1 -0
  79. package/dist/blocks/image.js +51 -0
  80. package/dist/blocks/image.js.map +1 -0
  81. package/dist/blocks/index.cjs +65 -0
  82. package/dist/blocks/index.d.ts +18 -0
  83. package/dist/blocks/index.d.ts.map +1 -0
  84. package/dist/blocks/index.js +30 -0
  85. package/dist/blocks/index.js.map +1 -0
  86. package/dist/blocks/screenful.cjs +139 -0
  87. package/dist/blocks/screenful.d.ts +18 -0
  88. package/dist/blocks/screenful.d.ts.map +1 -0
  89. package/dist/blocks/screenful.js +103 -0
  90. package/dist/blocks/screenful.js.map +1 -0
  91. package/dist/blocks/space.cjs +38 -0
  92. package/dist/blocks/space.d.ts +4 -0
  93. package/dist/blocks/space.d.ts.map +1 -0
  94. package/dist/blocks/space.js +35 -0
  95. package/dist/blocks/space.js.map +1 -0
  96. package/dist/blocks/spec.cjs +58 -0
  97. package/dist/blocks/spec.d.ts +60 -0
  98. package/dist/blocks/spec.d.ts.map +1 -0
  99. package/dist/blocks/spec.js +52 -0
  100. package/dist/blocks/spec.js.map +1 -0
  101. package/dist/blocks/video.cjs +103 -0
  102. package/dist/blocks/video.d.ts +22 -0
  103. package/dist/blocks/video.d.ts.map +1 -0
  104. package/dist/blocks/video.js +67 -0
  105. package/dist/blocks/video.js.map +1 -0
  106. package/dist/gallery.html +102 -1
  107. package/dist/index.cjs +9 -2
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +1 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/index.node.js +1 -1
  113. package/dist/primitives/ApplyTypography.cjs +8 -0
  114. package/dist/primitives/ApplyTypography.d.ts +2 -0
  115. package/dist/primitives/ApplyTypography.d.ts.map +1 -0
  116. package/dist/primitives/ApplyTypography.js +5 -0
  117. package/dist/primitives/ApplyTypography.js.map +1 -0
  118. package/dist/primitives/Link.cjs +8 -0
  119. package/dist/primitives/Link.d.ts +2 -0
  120. package/dist/primitives/Link.d.ts.map +1 -0
  121. package/dist/primitives/Link.js +5 -0
  122. package/dist/primitives/Link.js.map +1 -0
  123. package/dist/primitives/LinkElement.cjs +8 -0
  124. package/dist/primitives/LinkElement.d.ts +2 -0
  125. package/dist/primitives/LinkElement.d.ts.map +1 -0
  126. package/dist/primitives/LinkElement.js +5 -0
  127. package/dist/primitives/LinkElement.js.map +1 -0
  128. package/dist/primitives/MDXLink.cjs +8 -0
  129. package/dist/primitives/MDXLink.d.ts +2 -0
  130. package/dist/primitives/MDXLink.d.ts.map +1 -0
  131. package/dist/primitives/MDXLink.js +5 -0
  132. package/dist/primitives/MDXLink.js.map +1 -0
  133. package/dist/primitives/VideoPlayer.cjs +8 -0
  134. package/dist/primitives/VideoPlayer.d.ts +2 -0
  135. package/dist/primitives/VideoPlayer.d.ts.map +1 -0
  136. package/dist/primitives/VideoPlayer.js +5 -0
  137. package/dist/primitives/VideoPlayer.js.map +1 -0
  138. package/dist/primitives/YouTubeEmbed.cjs +8 -0
  139. package/dist/primitives/YouTubeEmbed.d.ts +2 -0
  140. package/dist/primitives/YouTubeEmbed.d.ts.map +1 -0
  141. package/dist/primitives/YouTubeEmbed.js +5 -0
  142. package/dist/primitives/YouTubeEmbed.js.map +1 -0
  143. package/dist/primitives/useLink.cjs +8 -0
  144. package/dist/primitives/useLink.d.ts +2 -0
  145. package/dist/primitives/useLink.d.ts.map +1 -0
  146. package/dist/primitives/useLink.js +5 -0
  147. package/dist/primitives/useLink.js.map +1 -0
  148. package/dist/product/menu/items.d.ts +1 -1
  149. package/dist/product/menu/items.d.ts.map +1 -1
  150. package/dist/styles.css +101 -0
  151. package/dist/theme.css +101 -0
  152. package/dist/tw.cjs +62 -1
  153. package/dist/tw.d.ts.map +1 -1
  154. package/dist/tw.js +62 -1
  155. package/dist/tw.js.map +1 -1
  156. package/dist/types.cjs +32 -0
  157. package/dist/types.d.ts +136 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +30 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +13 -1
@@ -0,0 +1,8 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoPlayer = void 0;
4
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
5
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
6
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
7
+ var video_1 = require("../backends/gui/video.cjs");
8
+ Object.defineProperty(exports, "VideoPlayer", { enumerable: true, get: function () { return video_1.VideoPlayer; } });
@@ -0,0 +1,2 @@
1
+ export { VideoPlayer } from '../backends/gui/video.js';
2
+ //# sourceMappingURL=VideoPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayer.d.ts","sourceRoot":"","sources":["../../src/primitives/VideoPlayer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,5 @@
1
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
2
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
3
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
4
+ export { VideoPlayer } from '../backends/gui/video.js';
5
+ //# sourceMappingURL=VideoPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../src/primitives/VideoPlayer.tsx"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kEAAkE;AAClE,qEAAqE;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,8 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.YouTubeEmbed = void 0;
4
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
5
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
6
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
7
+ var video_1 = require("../backends/gui/video.cjs");
8
+ Object.defineProperty(exports, "YouTubeEmbed", { enumerable: true, get: function () { return video_1.YouTubeEmbed; } });
@@ -0,0 +1,2 @@
1
+ export { YouTubeEmbed } from '../backends/gui/video.js';
2
+ //# sourceMappingURL=YouTubeEmbed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeEmbed.d.ts","sourceRoot":"","sources":["../../src/primitives/YouTubeEmbed.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,5 @@
1
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
2
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
3
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
4
+ export { YouTubeEmbed } from '../backends/gui/video.js';
5
+ //# sourceMappingURL=YouTubeEmbed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeEmbed.js","sourceRoot":"","sources":["../../src/primitives/YouTubeEmbed.tsx"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kEAAkE;AAClE,qEAAqE;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,8 @@
1
+ 'use client';"use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useLink = void 0;
4
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
5
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
6
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
7
+ var link_1 = require("../backends/gui/link.cjs");
8
+ Object.defineProperty(exports, "useLink", { enumerable: true, get: function () { return link_1.useLink; } });
@@ -0,0 +1,2 @@
1
+ export { useLink } from '../backends/gui/link.js';
2
+ //# sourceMappingURL=useLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLink.d.ts","sourceRoot":"","sources":["../../src/primitives/useLink.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,5 @@
1
+ // GENERATED by scripts/gen-primitives.mjs — do not edit. Per-member entrypoint
2
+ // for hosts that modularize `@hanzo/ui` imports. Source of truth:
3
+ // src/backends/gui/index.ts. Re-run: node scripts/gen-primitives.mjs
4
+ export { useLink } from '../backends/gui/link.js';
5
+ //# sourceMappingURL=useLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLink.js","sourceRoot":"","sources":["../../src/primitives/useLink.tsx"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kEAAkE;AAClE,qEAAqE;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
@@ -31,7 +31,7 @@ export type MenuItemSpec = {
31
31
  description?: string;
32
32
  /** Right-aligned shortcut / hint text (e.g. "⌘K"). */
33
33
  shortcut?: string;
34
- /** Renders a right check + purple tint. */
34
+ /** Renders a right check + the ACCENT_SOFT row wash. */
35
35
  selected?: boolean;
36
36
  disabled?: boolean;
37
37
  /** Danger styling (red label/icon). */
@@ -1 +1 @@
1
- {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/product/menu/items.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAcrD,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,eAAO,MAAM,SAAS,IAAI,CAAA;AAsB1B,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAGlD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAc,EACd,SAAe,EACf,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,2CA0BA;AAKD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAgB,EAChB,QAAgB,EAChB,WAAmB,EACnB,UAAkB,EAClB,QAAQ,GACT,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,2CAkElF;AAGD,wBAAgB,iBAAiB,4CAEhC;AAGD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAclE;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,CAgBpF"}
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/product/menu/items.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAcrD,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,eAAO,MAAM,SAAS,IAAI,CAAA;AAsB1B,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAGlD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAc,EACd,SAAe,EACf,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,2CA0BA;AAKD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAgB,EAChB,QAAgB,EAChB,WAAmB,EACnB,UAAkB,EAClB,QAAQ,GACT,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,2CAkElF;AAGD,wBAAgB,iBAAiB,4CAEhC;AAGD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAclE;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,CAgBpF"}
package/dist/styles.css CHANGED
@@ -1341,6 +1341,107 @@
1341
1341
  an indirection through a name that does not exist, with a hardcoded shadow
1342
1342
  behind it, next to a design system that publishes real ones. */
1343
1343
 
1344
+ /* ── Prose ───────────────────────────────────────────────────────────────────
1345
+ What `<ApplyTypography>` turns on: running text — a heading, a byline, a
1346
+ paragraph, a list — styled by TAG, so a block of authored content needs no
1347
+ class on any element inside it. That is the whole point; the content comes
1348
+ from a CMS or an .mdx file and cannot carry classes.
1349
+
1350
+ The 5.x line did this with a tailwind typography plugin, so the sizes lived
1351
+ in a plugin config and arrived as `typography typography-sm` utilities. Those
1352
+ are gone with the engine. These are the same sizes as real rules on the
1353
+ @hanzo/design ramp, which is where every other surface already reads them —
1354
+ so prose and a Button now round to the same scale instead of two.
1355
+
1356
+ Scoped under `.hz-prose` and applied with `>` only one level down, so a nested
1357
+ component keeps its own type. */
1358
+ .hz-prose {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: var(--space-3, 0.75rem);
1362
+ color: var(--foreground);
1363
+ font-family: var(--font-sans), sans-serif;
1364
+ font-size: var(--text-base);
1365
+ line-height: var(--leading-base, var(--leading-normal));
1366
+ }
1367
+
1368
+ .hz-prose > h1, .hz-prose > h2, .hz-prose > h3,
1369
+ .hz-prose > h4, .hz-prose > h5, .hz-prose > h6 {
1370
+ font-family: var(--font-display, var(--font-sans)), sans-serif;
1371
+ font-weight: 600;
1372
+ line-height: var(--leading-tight);
1373
+ letter-spacing: var(--tracking-tight);
1374
+ margin: 0;
1375
+ }
1376
+
1377
+ .hz-prose > h1 { font-size: var(--text-4xl) }
1378
+ .hz-prose > h2 { font-size: var(--text-3xl) }
1379
+ .hz-prose > h3 { font-size: var(--text-2xl) }
1380
+ .hz-prose > h4 { font-size: var(--text-xl) }
1381
+ .hz-prose > h5 { font-size: var(--text-lg) }
1382
+ /* h6 is the byline rung: heading TAG, body weight and colour, because that is
1383
+ what a byline is — subordinate text that happens to sit in the heading
1384
+ stack. */
1385
+ .hz-prose > h6 {
1386
+ font-size: var(--text-base);
1387
+ font-weight: 400;
1388
+ color: var(--muted-foreground);
1389
+ }
1390
+
1391
+ .hz-prose > p { margin: 0 }
1392
+ .hz-prose > ul, .hz-prose > ol { margin: 0; padding-inline-start: 1.5em }
1393
+ .hz-prose li { margin-block: 0.25em }
1394
+ .hz-prose > blockquote {
1395
+ margin: 0;
1396
+ padding-inline-start: 1em;
1397
+ border-inline-start: 2px solid var(--border);
1398
+ color: var(--muted-foreground);
1399
+ }
1400
+ .hz-prose code {
1401
+ font-family: var(--font-mono), ui-monospace, monospace;
1402
+ font-size: 0.9em;
1403
+ }
1404
+ .hz-prose a { color: inherit; text-decoration: underline }
1405
+ .hz-prose strong { font-weight: 600 }
1406
+ .hz-prose :where(img, video) { max-width: 100%; height: auto }
1407
+
1408
+ /* The named rungs. `responsive` is the default and is the only one that moves
1409
+ with the viewport — a t-shirt size is a DECISION, so it stays put. */
1410
+ .hz-prose-sm { font-size: var(--text-sm); gap: var(--space-3, 0.75rem) }
1411
+ .hz-prose-sm > h1 { font-size: var(--text-3xl) }
1412
+ .hz-prose-sm > h2 { font-size: var(--text-2xl) }
1413
+ .hz-prose-sm > h3 { font-size: var(--text-xl) }
1414
+ .hz-prose-sm > p { font-size: var(--text-sm) }
1415
+
1416
+ .hz-prose-lg { font-size: var(--text-lg); gap: var(--space-5, 1.25rem) }
1417
+ .hz-prose-lg > h1 { font-size: var(--text-5xl) }
1418
+ .hz-prose-lg > h2 { font-size: var(--text-4xl) }
1419
+ .hz-prose-lg > h3 { font-size: var(--text-3xl) }
1420
+ .hz-prose-lg > p { font-size: var(--text-lg) }
1421
+
1422
+ .hz-prose-xl { font-size: var(--text-lg); gap: var(--space-6, 1.5rem) }
1423
+ .hz-prose-xl > h1 { font-size: var(--text-6xl) }
1424
+ .hz-prose-xl > h2 { font-size: var(--text-5xl) }
1425
+ .hz-prose-xl > h3 { font-size: var(--text-4xl) }
1426
+ .hz-prose-xl > p { font-size: var(--text-lg) }
1427
+
1428
+ /* Responsive: start at the small rung and climb. Written as min-width so the
1429
+ phone case is the unprefixed one and needs no query at all. */
1430
+ @media (min-width: 640px) {
1431
+ .hz-prose-responsive { gap: var(--space-4, 1rem) }
1432
+ }
1433
+ @media (min-width: 1024px) {
1434
+ .hz-prose-responsive { font-size: var(--text-lg); gap: var(--space-5, 1.25rem) }
1435
+ .hz-prose-responsive > h1 { font-size: var(--text-5xl) }
1436
+ .hz-prose-responsive > h2 { font-size: var(--text-4xl) }
1437
+ .hz-prose-responsive > h3 { font-size: var(--text-3xl) }
1438
+ }
1439
+ @media (min-width: 1280px) {
1440
+ .hz-prose-responsive { gap: var(--space-6, 1.5rem) }
1441
+ .hz-prose-responsive > h1 { font-size: var(--text-6xl) }
1442
+ .hz-prose-responsive > h2 { font-size: var(--text-5xl) }
1443
+ }
1444
+
1344
1445
  /* Glass — the material floating chrome is made of, and the ladder it stands on.
1345
1446
  *
1346
1447
  * import '@hanzo/ui/glass.css' // this slice alone
package/dist/theme.css CHANGED
@@ -1339,6 +1339,107 @@
1339
1339
  an indirection through a name that does not exist, with a hardcoded shadow
1340
1340
  behind it, next to a design system that publishes real ones. */
1341
1341
 
1342
+ /* ── Prose ───────────────────────────────────────────────────────────────────
1343
+ What `<ApplyTypography>` turns on: running text — a heading, a byline, a
1344
+ paragraph, a list — styled by TAG, so a block of authored content needs no
1345
+ class on any element inside it. That is the whole point; the content comes
1346
+ from a CMS or an .mdx file and cannot carry classes.
1347
+
1348
+ The 5.x line did this with a tailwind typography plugin, so the sizes lived
1349
+ in a plugin config and arrived as `typography typography-sm` utilities. Those
1350
+ are gone with the engine. These are the same sizes as real rules on the
1351
+ @hanzo/design ramp, which is where every other surface already reads them —
1352
+ so prose and a Button now round to the same scale instead of two.
1353
+
1354
+ Scoped under `.hz-prose` and applied with `>` only one level down, so a nested
1355
+ component keeps its own type. */
1356
+ .hz-prose {
1357
+ display: flex;
1358
+ flex-direction: column;
1359
+ gap: var(--space-3, 0.75rem);
1360
+ color: var(--foreground);
1361
+ font-family: var(--font-sans), sans-serif;
1362
+ font-size: var(--text-base);
1363
+ line-height: var(--leading-base, var(--leading-normal));
1364
+ }
1365
+
1366
+ .hz-prose > h1, .hz-prose > h2, .hz-prose > h3,
1367
+ .hz-prose > h4, .hz-prose > h5, .hz-prose > h6 {
1368
+ font-family: var(--font-display, var(--font-sans)), sans-serif;
1369
+ font-weight: 600;
1370
+ line-height: var(--leading-tight);
1371
+ letter-spacing: var(--tracking-tight);
1372
+ margin: 0;
1373
+ }
1374
+
1375
+ .hz-prose > h1 { font-size: var(--text-4xl) }
1376
+ .hz-prose > h2 { font-size: var(--text-3xl) }
1377
+ .hz-prose > h3 { font-size: var(--text-2xl) }
1378
+ .hz-prose > h4 { font-size: var(--text-xl) }
1379
+ .hz-prose > h5 { font-size: var(--text-lg) }
1380
+ /* h6 is the byline rung: heading TAG, body weight and colour, because that is
1381
+ what a byline is — subordinate text that happens to sit in the heading
1382
+ stack. */
1383
+ .hz-prose > h6 {
1384
+ font-size: var(--text-base);
1385
+ font-weight: 400;
1386
+ color: var(--muted-foreground);
1387
+ }
1388
+
1389
+ .hz-prose > p { margin: 0 }
1390
+ .hz-prose > ul, .hz-prose > ol { margin: 0; padding-inline-start: 1.5em }
1391
+ .hz-prose li { margin-block: 0.25em }
1392
+ .hz-prose > blockquote {
1393
+ margin: 0;
1394
+ padding-inline-start: 1em;
1395
+ border-inline-start: 2px solid var(--border);
1396
+ color: var(--muted-foreground);
1397
+ }
1398
+ .hz-prose code {
1399
+ font-family: var(--font-mono), ui-monospace, monospace;
1400
+ font-size: 0.9em;
1401
+ }
1402
+ .hz-prose a { color: inherit; text-decoration: underline }
1403
+ .hz-prose strong { font-weight: 600 }
1404
+ .hz-prose :where(img, video) { max-width: 100%; height: auto }
1405
+
1406
+ /* The named rungs. `responsive` is the default and is the only one that moves
1407
+ with the viewport — a t-shirt size is a DECISION, so it stays put. */
1408
+ .hz-prose-sm { font-size: var(--text-sm); gap: var(--space-3, 0.75rem) }
1409
+ .hz-prose-sm > h1 { font-size: var(--text-3xl) }
1410
+ .hz-prose-sm > h2 { font-size: var(--text-2xl) }
1411
+ .hz-prose-sm > h3 { font-size: var(--text-xl) }
1412
+ .hz-prose-sm > p { font-size: var(--text-sm) }
1413
+
1414
+ .hz-prose-lg { font-size: var(--text-lg); gap: var(--space-5, 1.25rem) }
1415
+ .hz-prose-lg > h1 { font-size: var(--text-5xl) }
1416
+ .hz-prose-lg > h2 { font-size: var(--text-4xl) }
1417
+ .hz-prose-lg > h3 { font-size: var(--text-3xl) }
1418
+ .hz-prose-lg > p { font-size: var(--text-lg) }
1419
+
1420
+ .hz-prose-xl { font-size: var(--text-lg); gap: var(--space-6, 1.5rem) }
1421
+ .hz-prose-xl > h1 { font-size: var(--text-6xl) }
1422
+ .hz-prose-xl > h2 { font-size: var(--text-5xl) }
1423
+ .hz-prose-xl > h3 { font-size: var(--text-4xl) }
1424
+ .hz-prose-xl > p { font-size: var(--text-lg) }
1425
+
1426
+ /* Responsive: start at the small rung and climb. Written as min-width so the
1427
+ phone case is the unprefixed one and needs no query at all. */
1428
+ @media (min-width: 640px) {
1429
+ .hz-prose-responsive { gap: var(--space-4, 1rem) }
1430
+ }
1431
+ @media (min-width: 1024px) {
1432
+ .hz-prose-responsive { font-size: var(--text-lg); gap: var(--space-5, 1.25rem) }
1433
+ .hz-prose-responsive > h1 { font-size: var(--text-5xl) }
1434
+ .hz-prose-responsive > h2 { font-size: var(--text-4xl) }
1435
+ .hz-prose-responsive > h3 { font-size: var(--text-3xl) }
1436
+ }
1437
+ @media (min-width: 1280px) {
1438
+ .hz-prose-responsive { gap: var(--space-6, 1.5rem) }
1439
+ .hz-prose-responsive > h1 { font-size: var(--text-6xl) }
1440
+ .hz-prose-responsive > h2 { font-size: var(--text-5xl) }
1441
+ }
1442
+
1342
1443
  /* Glass — the material floating chrome is made of, and the ladder it stands on.
1343
1444
  *
1344
1445
  * import '@hanzo/ui/glass.css' // this slice alone
package/dist/tw.cjs CHANGED
@@ -175,6 +175,23 @@ function one(c) {
175
175
  case 'inline': return { display: 'inline' };
176
176
  case 'inline-block': return { display: 'inline-block' };
177
177
  case 'hidden': return { display: 'none' };
178
+ // `invisible` keeps the box and hides what is in it, which is what a spacer
179
+ // wants — `hidden` above would collapse the very space it exists to take.
180
+ //
181
+ // Rendered as opacity rather than `visibility`, which the native target has
182
+ // no equivalent for. The two differ in one way that matters: `visibility:
183
+ // hidden` also takes the subtree out of the accessibility tree and the tab
184
+ // order, and opacity does not. Anything decorative therefore still needs
185
+ // `aria-hidden` — it always did, since `visibility` cannot cross to native
186
+ // at all.
187
+ case 'invisible': return { opacity: 0 };
188
+ case 'visible': return { opacity: 1 };
189
+ // Where padding and border sit relative to a declared width. `content-box`
190
+ // is the css default but NOT the default here: the browser reset every one
191
+ // of these apps loads sets `border-box` on everything, so an element asking
192
+ // for `box-content` is asking to opt back out and needs the property said.
193
+ case 'box-content': return { boxSizing: 'content-box' };
194
+ case 'box-border': return { boxSizing: 'border-box' };
178
195
  case 'flex-col': return { flexDirection: 'column' };
179
196
  case 'flex-row': return { flexDirection: 'row' };
180
197
  case 'flex-col-reverse': return { flexDirection: 'column-reverse' };
@@ -321,6 +338,16 @@ function one(c) {
321
338
  return { fontSize: FONT_SIZE[v], lineHeight: `var(--text-${v}--line-height)` };
322
339
  if (v === 'left' || v === 'center' || v === 'right' || v === 'justify')
323
340
  return { textAlign: v };
341
+ // `text-` sets a size OR a colour, and an arbitrary value has to say
342
+ // which. A LENGTH is a size: `text-[96px]` was reaching the colour branch
343
+ // and returning `{ color: '96px' }` — a declaration the browser drops, so
344
+ // the heading kept its inherited size and nothing anywhere reported a
345
+ // problem. Measured on lux/bitcoin's 404, where a 96px numeral rendered
346
+ // at 28px.
347
+ const arb = /^\[(.+)]$/.exec(v);
348
+ if (arb && /^-?[\d.]+(px|rem|em|ch|ex|vw|vh|vmin|vmax|%|pt)?$/.test(arb[1])) {
349
+ return { fontSize: arb[1] };
350
+ }
324
351
  const col = color(v);
325
352
  return col ? { color: col } : null;
326
353
  }
@@ -387,6 +414,10 @@ function one(c) {
387
414
  case 'transition': return TRANSITION[v] ? { transitionProperty: TRANSITION[v] } : null;
388
415
  case 'duration': return DURATION[v] !== undefined ? { transitionDuration: `${DURATION[v]}ms` } : null;
389
416
  case 'delay': return DURATION[v] !== undefined ? { transitionDelay: `${DURATION[v]}ms` } : null;
417
+ // `ease` was in the head list with no case, so `transition duration-500
418
+ // ease-out` converted two thirds of one declaration and left the curve on
419
+ // the element as a dead class. The three named curves are Tailwind's own.
420
+ case 'ease': return EASE[v] ? { transitionTimingFunction: EASE[v] } : null;
390
421
  case 'blur': return BLUR[v] !== undefined ? { filter: `blur(${BLUR[v]}px)` } : null;
391
422
  case 'backdrop-blur': return BLUR[v] !== undefined ? { backdropFilter: `blur(${BLUR[v]}px)` } : null;
392
423
  // `space-y` is deliberately NOT converted. It sets margins on the CHILDREN,
@@ -408,10 +439,21 @@ function one(c) {
408
439
  }
409
440
  return null;
410
441
  }
442
+ const EASE = {
443
+ linear: 'linear',
444
+ in: 'cubic-bezier(0.4, 0, 1, 1)',
445
+ out: 'cubic-bezier(0, 0, 0.2, 1)',
446
+ 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
447
+ };
411
448
  const MAX_W = {
412
449
  none: 'none', xs: 320, sm: 384, md: 448, lg: 512, xl: 576, '2xl': 672,
413
450
  '3xl': 768, '4xl': 896, '5xl': 1024, '6xl': 1152, '7xl': 1280, full: '100%',
414
451
  prose: '65ch', screen: '100vw',
452
+ // `max-w-screen-<rung>` is the BREAKPOINT width, not the size ramp above —
453
+ // the idiom for "hold the content to the width this layout was designed at".
454
+ // Unlisted, `max-w-screen-xl` fell through as an unread class and the
455
+ // container it bounds grew to whatever the viewport was.
456
+ 'screen-sm': 640, 'screen-md': 768, 'screen-lg': 1024, 'screen-xl': 1280, 'screen-2xl': 1536,
415
457
  };
416
458
  const CORNER = {
417
459
  t: 'Top', r: 'Right', b: 'Bottom', l: 'Left',
@@ -419,6 +461,18 @@ const CORNER = {
419
461
  };
420
462
  /** Where a prefixed class lands: a gui media prop, or a pseudo-style. */
421
463
  const VARIANT = {
464
+ // `xs` is the smallest rung, so it lands at the BASE — an empty destination,
465
+ // not a `$xs` bucket. gui publishes no `$xs` media prop because there is
466
+ // nothing below it: a style with no media wrapper already applies there, and
467
+ // every larger rung overrides it in turn. That is also what `xs` meant in the
468
+ // tailwind config this notation came from, where it was a custom screen at
469
+ // the bottom rather than one of tailwind's own.
470
+ //
471
+ // It has to be HERE rather than absent: content authored on 5.x writes the
472
+ // rung out explicitly (`SPACE_DEFAULTS` and `GridDef.at` both start at `xs`),
473
+ // and an unlisted prefix keeps the whole class as an unconverted string — so
474
+ // the smallest rung of every ladder would be the one silently dropped.
475
+ xs: '',
422
476
  sm: '$sm', md: '$md', lg: '$lg', xl: '$xl', '2xl': '$2xl',
423
477
  hover: 'hoverStyle', focus: 'focusStyle', 'focus-visible': 'focusVisibleStyle',
424
478
  active: 'pressStyle', disabled: 'disabledStyle', dark: '$theme-dark',
@@ -484,10 +538,17 @@ function tw(input) {
484
538
  continue;
485
539
  }
486
540
  const key = VARIANT[parts[parts.length - 1]];
487
- if (!key) {
541
+ if (key === undefined) {
488
542
  rest.push(raw);
489
543
  continue;
490
544
  }
545
+ // An empty destination is the base rung (`xs:`), which is where a style with
546
+ // no media wrapper already lives — so it merges into props rather than
547
+ // opening a bucket gui would never read.
548
+ if (!key) {
549
+ Object.assign(props, found);
550
+ continue;
551
+ }
491
552
  const bucket = (props[key] ??= {});
492
553
  Object.assign(bucket, found);
493
554
  }
package/dist/tw.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tw.d.ts","sourceRoot":"","sources":["../src/tw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3C,gEAAgE;AAChE,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AA0WnD,MAAM,MAAM,UAAU,GAClB,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,GAC1C,UAAU,EAAE,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAY3B;;;GAGG;AACH,wBAAgB,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAyC5C;eAEc,EAAE"}
1
+ {"version":3,"file":"tw.d.ts","sourceRoot":"","sources":["../src/tw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3C,gEAAgE;AAChE,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAianD,MAAM,MAAM,UAAU,GAClB,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,GAC1C,UAAU,EAAE,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAY3B;;;GAGG;AACH,wBAAgB,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CA6C5C;eAEc,EAAE"}
package/dist/tw.js CHANGED
@@ -172,6 +172,23 @@ function one(c) {
172
172
  case 'inline': return { display: 'inline' };
173
173
  case 'inline-block': return { display: 'inline-block' };
174
174
  case 'hidden': return { display: 'none' };
175
+ // `invisible` keeps the box and hides what is in it, which is what a spacer
176
+ // wants — `hidden` above would collapse the very space it exists to take.
177
+ //
178
+ // Rendered as opacity rather than `visibility`, which the native target has
179
+ // no equivalent for. The two differ in one way that matters: `visibility:
180
+ // hidden` also takes the subtree out of the accessibility tree and the tab
181
+ // order, and opacity does not. Anything decorative therefore still needs
182
+ // `aria-hidden` — it always did, since `visibility` cannot cross to native
183
+ // at all.
184
+ case 'invisible': return { opacity: 0 };
185
+ case 'visible': return { opacity: 1 };
186
+ // Where padding and border sit relative to a declared width. `content-box`
187
+ // is the css default but NOT the default here: the browser reset every one
188
+ // of these apps loads sets `border-box` on everything, so an element asking
189
+ // for `box-content` is asking to opt back out and needs the property said.
190
+ case 'box-content': return { boxSizing: 'content-box' };
191
+ case 'box-border': return { boxSizing: 'border-box' };
175
192
  case 'flex-col': return { flexDirection: 'column' };
176
193
  case 'flex-row': return { flexDirection: 'row' };
177
194
  case 'flex-col-reverse': return { flexDirection: 'column-reverse' };
@@ -318,6 +335,16 @@ function one(c) {
318
335
  return { fontSize: FONT_SIZE[v], lineHeight: `var(--text-${v}--line-height)` };
319
336
  if (v === 'left' || v === 'center' || v === 'right' || v === 'justify')
320
337
  return { textAlign: v };
338
+ // `text-` sets a size OR a colour, and an arbitrary value has to say
339
+ // which. A LENGTH is a size: `text-[96px]` was reaching the colour branch
340
+ // and returning `{ color: '96px' }` — a declaration the browser drops, so
341
+ // the heading kept its inherited size and nothing anywhere reported a
342
+ // problem. Measured on lux/bitcoin's 404, where a 96px numeral rendered
343
+ // at 28px.
344
+ const arb = /^\[(.+)]$/.exec(v);
345
+ if (arb && /^-?[\d.]+(px|rem|em|ch|ex|vw|vh|vmin|vmax|%|pt)?$/.test(arb[1])) {
346
+ return { fontSize: arb[1] };
347
+ }
321
348
  const col = color(v);
322
349
  return col ? { color: col } : null;
323
350
  }
@@ -384,6 +411,10 @@ function one(c) {
384
411
  case 'transition': return TRANSITION[v] ? { transitionProperty: TRANSITION[v] } : null;
385
412
  case 'duration': return DURATION[v] !== undefined ? { transitionDuration: `${DURATION[v]}ms` } : null;
386
413
  case 'delay': return DURATION[v] !== undefined ? { transitionDelay: `${DURATION[v]}ms` } : null;
414
+ // `ease` was in the head list with no case, so `transition duration-500
415
+ // ease-out` converted two thirds of one declaration and left the curve on
416
+ // the element as a dead class. The three named curves are Tailwind's own.
417
+ case 'ease': return EASE[v] ? { transitionTimingFunction: EASE[v] } : null;
387
418
  case 'blur': return BLUR[v] !== undefined ? { filter: `blur(${BLUR[v]}px)` } : null;
388
419
  case 'backdrop-blur': return BLUR[v] !== undefined ? { backdropFilter: `blur(${BLUR[v]}px)` } : null;
389
420
  // `space-y` is deliberately NOT converted. It sets margins on the CHILDREN,
@@ -405,10 +436,21 @@ function one(c) {
405
436
  }
406
437
  return null;
407
438
  }
439
+ const EASE = {
440
+ linear: 'linear',
441
+ in: 'cubic-bezier(0.4, 0, 1, 1)',
442
+ out: 'cubic-bezier(0, 0, 0.2, 1)',
443
+ 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
444
+ };
408
445
  const MAX_W = {
409
446
  none: 'none', xs: 320, sm: 384, md: 448, lg: 512, xl: 576, '2xl': 672,
410
447
  '3xl': 768, '4xl': 896, '5xl': 1024, '6xl': 1152, '7xl': 1280, full: '100%',
411
448
  prose: '65ch', screen: '100vw',
449
+ // `max-w-screen-<rung>` is the BREAKPOINT width, not the size ramp above —
450
+ // the idiom for "hold the content to the width this layout was designed at".
451
+ // Unlisted, `max-w-screen-xl` fell through as an unread class and the
452
+ // container it bounds grew to whatever the viewport was.
453
+ 'screen-sm': 640, 'screen-md': 768, 'screen-lg': 1024, 'screen-xl': 1280, 'screen-2xl': 1536,
412
454
  };
413
455
  const CORNER = {
414
456
  t: 'Top', r: 'Right', b: 'Bottom', l: 'Left',
@@ -416,6 +458,18 @@ const CORNER = {
416
458
  };
417
459
  /** Where a prefixed class lands: a gui media prop, or a pseudo-style. */
418
460
  const VARIANT = {
461
+ // `xs` is the smallest rung, so it lands at the BASE — an empty destination,
462
+ // not a `$xs` bucket. gui publishes no `$xs` media prop because there is
463
+ // nothing below it: a style with no media wrapper already applies there, and
464
+ // every larger rung overrides it in turn. That is also what `xs` meant in the
465
+ // tailwind config this notation came from, where it was a custom screen at
466
+ // the bottom rather than one of tailwind's own.
467
+ //
468
+ // It has to be HERE rather than absent: content authored on 5.x writes the
469
+ // rung out explicitly (`SPACE_DEFAULTS` and `GridDef.at` both start at `xs`),
470
+ // and an unlisted prefix keeps the whole class as an unconverted string — so
471
+ // the smallest rung of every ladder would be the one silently dropped.
472
+ xs: '',
419
473
  sm: '$sm', md: '$md', lg: '$lg', xl: '$xl', '2xl': '$2xl',
420
474
  hover: 'hoverStyle', focus: 'focusStyle', 'focus-visible': 'focusVisibleStyle',
421
475
  active: 'pressStyle', disabled: 'disabledStyle', dark: '$theme-dark',
@@ -481,10 +535,17 @@ export function tw(input) {
481
535
  continue;
482
536
  }
483
537
  const key = VARIANT[parts[parts.length - 1]];
484
- if (!key) {
538
+ if (key === undefined) {
485
539
  rest.push(raw);
486
540
  continue;
487
541
  }
542
+ // An empty destination is the base rung (`xs:`), which is where a style with
543
+ // no media wrapper already lives — so it merges into props rather than
544
+ // opening a bucket gui would never read.
545
+ if (!key) {
546
+ Object.assign(props, found);
547
+ continue;
548
+ }
488
549
  const bucket = (props[key] ??= {});
489
550
  Object.assign(bucket, found);
490
551
  }