@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.
- package/dist/backends/gui/index.cjs +11 -1
- package/dist/backends/gui/index.d.ts +3 -0
- package/dist/backends/gui/index.d.ts.map +1 -1
- package/dist/backends/gui/index.js +3 -0
- package/dist/backends/gui/index.js.map +1 -1
- package/dist/backends/gui/link.cjs +126 -0
- package/dist/backends/gui/link.d.ts +65 -0
- package/dist/backends/gui/link.d.ts.map +1 -0
- package/dist/backends/gui/link.js +88 -0
- package/dist/backends/gui/link.js.map +1 -0
- package/dist/backends/gui/prose.cjs +33 -0
- package/dist/backends/gui/prose.d.ts +39 -0
- package/dist/backends/gui/prose.d.ts.map +1 -0
- package/dist/backends/gui/prose.js +30 -0
- package/dist/backends/gui/prose.js.map +1 -0
- package/dist/backends/gui/video.cjs +89 -0
- package/dist/backends/gui/video.d.ts +33 -0
- package/dist/backends/gui/video.d.ts.map +1 -0
- package/dist/backends/gui/video.js +53 -0
- package/dist/backends/gui/video.js.map +1 -0
- package/dist/blocks/accordian.cjs +19 -0
- package/dist/blocks/accordian.d.ts +4 -0
- package/dist/blocks/accordian.d.ts.map +1 -0
- package/dist/blocks/accordian.js +16 -0
- package/dist/blocks/accordian.js.map +1 -0
- package/dist/blocks/bullet-cards.cjs +40 -0
- package/dist/blocks/bullet-cards.d.ts +10 -0
- package/dist/blocks/bullet-cards.d.ts.map +1 -0
- package/dist/blocks/bullet-cards.js +37 -0
- package/dist/blocks/bullet-cards.js.map +1 -0
- package/dist/blocks/card.cjs +58 -0
- package/dist/blocks/card.d.ts +14 -0
- package/dist/blocks/card.d.ts.map +1 -0
- package/dist/blocks/card.js +55 -0
- package/dist/blocks/card.js.map +1 -0
- package/dist/blocks/carte-blanche.cjs +38 -0
- package/dist/blocks/carte-blanche.d.ts +13 -0
- package/dist/blocks/carte-blanche.d.ts.map +1 -0
- package/dist/blocks/carte-blanche.js +35 -0
- package/dist/blocks/carte-blanche.js.map +1 -0
- package/dist/blocks/content.cjs +65 -0
- package/dist/blocks/content.d.ts +11 -0
- package/dist/blocks/content.d.ts.map +1 -0
- package/dist/blocks/content.js +61 -0
- package/dist/blocks/content.js.map +1 -0
- package/dist/blocks/cta.cjs +103 -0
- package/dist/blocks/cta.d.ts +13 -0
- package/dist/blocks/cta.d.ts.map +1 -0
- package/dist/blocks/cta.js +67 -0
- package/dist/blocks/cta.js.map +1 -0
- package/dist/blocks/def.cjs +24 -0
- package/dist/blocks/def.d.ts +191 -0
- package/dist/blocks/def.d.ts.map +1 -0
- package/dist/blocks/def.js +22 -0
- package/dist/blocks/def.js.map +1 -0
- package/dist/blocks/enh-heading.cjs +86 -0
- package/dist/blocks/enh-heading.d.ts +7 -0
- package/dist/blocks/enh-heading.d.ts.map +1 -0
- package/dist/blocks/enh-heading.js +83 -0
- package/dist/blocks/enh-heading.js.map +1 -0
- package/dist/blocks/grid.cjs +98 -0
- package/dist/blocks/grid.d.ts +18 -0
- package/dist/blocks/grid.d.ts.map +1 -0
- package/dist/blocks/grid.js +62 -0
- package/dist/blocks/grid.js.map +1 -0
- package/dist/blocks/group.cjs +43 -0
- package/dist/blocks/group.d.ts +4 -0
- package/dist/blocks/group.d.ts.map +1 -0
- package/dist/blocks/group.js +40 -0
- package/dist/blocks/group.js.map +1 -0
- package/dist/blocks/heading.cjs +22 -0
- package/dist/blocks/heading.d.ts +4 -0
- package/dist/blocks/heading.d.ts.map +1 -0
- package/dist/blocks/heading.js +19 -0
- package/dist/blocks/heading.js.map +1 -0
- package/dist/blocks/image.cjs +54 -0
- package/dist/blocks/image.d.ts +19 -0
- package/dist/blocks/image.d.ts.map +1 -0
- package/dist/blocks/image.js +51 -0
- package/dist/blocks/image.js.map +1 -0
- package/dist/blocks/index.cjs +65 -0
- package/dist/blocks/index.d.ts +18 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +30 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/blocks/screenful.cjs +139 -0
- package/dist/blocks/screenful.d.ts +18 -0
- package/dist/blocks/screenful.d.ts.map +1 -0
- package/dist/blocks/screenful.js +103 -0
- package/dist/blocks/screenful.js.map +1 -0
- package/dist/blocks/space.cjs +38 -0
- package/dist/blocks/space.d.ts +4 -0
- package/dist/blocks/space.d.ts.map +1 -0
- package/dist/blocks/space.js +35 -0
- package/dist/blocks/space.js.map +1 -0
- package/dist/blocks/spec.cjs +58 -0
- package/dist/blocks/spec.d.ts +60 -0
- package/dist/blocks/spec.d.ts.map +1 -0
- package/dist/blocks/spec.js +52 -0
- package/dist/blocks/spec.js.map +1 -0
- package/dist/blocks/video.cjs +103 -0
- package/dist/blocks/video.d.ts +22 -0
- package/dist/blocks/video.d.ts.map +1 -0
- package/dist/blocks/video.js +67 -0
- package/dist/blocks/video.js.map +1 -0
- package/dist/gallery.html +102 -1
- package/dist/index.cjs +9 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.js +1 -1
- package/dist/primitives/ApplyTypography.cjs +8 -0
- package/dist/primitives/ApplyTypography.d.ts +2 -0
- package/dist/primitives/ApplyTypography.d.ts.map +1 -0
- package/dist/primitives/ApplyTypography.js +5 -0
- package/dist/primitives/ApplyTypography.js.map +1 -0
- package/dist/primitives/Link.cjs +8 -0
- package/dist/primitives/Link.d.ts +2 -0
- package/dist/primitives/Link.d.ts.map +1 -0
- package/dist/primitives/Link.js +5 -0
- package/dist/primitives/Link.js.map +1 -0
- package/dist/primitives/LinkElement.cjs +8 -0
- package/dist/primitives/LinkElement.d.ts +2 -0
- package/dist/primitives/LinkElement.d.ts.map +1 -0
- package/dist/primitives/LinkElement.js +5 -0
- package/dist/primitives/LinkElement.js.map +1 -0
- package/dist/primitives/MDXLink.cjs +8 -0
- package/dist/primitives/MDXLink.d.ts +2 -0
- package/dist/primitives/MDXLink.d.ts.map +1 -0
- package/dist/primitives/MDXLink.js +5 -0
- package/dist/primitives/MDXLink.js.map +1 -0
- package/dist/primitives/VideoPlayer.cjs +8 -0
- package/dist/primitives/VideoPlayer.d.ts +2 -0
- package/dist/primitives/VideoPlayer.d.ts.map +1 -0
- package/dist/primitives/VideoPlayer.js +5 -0
- package/dist/primitives/VideoPlayer.js.map +1 -0
- package/dist/primitives/YouTubeEmbed.cjs +8 -0
- package/dist/primitives/YouTubeEmbed.d.ts +2 -0
- package/dist/primitives/YouTubeEmbed.d.ts.map +1 -0
- package/dist/primitives/YouTubeEmbed.js +5 -0
- package/dist/primitives/YouTubeEmbed.js.map +1 -0
- package/dist/primitives/useLink.cjs +8 -0
- package/dist/primitives/useLink.d.ts +2 -0
- package/dist/primitives/useLink.d.ts.map +1 -0
- package/dist/primitives/useLink.js +5 -0
- package/dist/primitives/useLink.js.map +1 -0
- package/dist/product/menu/items.d.ts +1 -1
- package/dist/product/menu/items.d.ts.map +1 -1
- package/dist/styles.css +101 -0
- package/dist/theme.css +101 -0
- package/dist/tw.cjs +62 -1
- package/dist/tw.d.ts.map +1 -1
- package/dist/tw.js +62 -1
- package/dist/tw.js.map +1 -1
- package/dist/types.cjs +32 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +30 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 +
|
|
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,
|
|
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 (
|
|
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;
|
|
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 (
|
|
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
|
}
|