tw-next-image 1.0.0-beta.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -0
  3. package/dist/breakpoints.d.ts +10 -0
  4. package/dist/breakpoints.d.ts.map +1 -0
  5. package/dist/breakpoints.js +8 -0
  6. package/dist/breakpoints.js.map +1 -0
  7. package/dist/index.d.ts +6 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +4 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/infer-sizes/index.d.ts +4 -0
  12. package/dist/infer-sizes/index.d.ts.map +1 -0
  13. package/dist/infer-sizes/index.js +3 -0
  14. package/dist/infer-sizes/index.js.map +1 -0
  15. package/dist/infer-sizes.d.ts +3 -0
  16. package/dist/infer-sizes.d.ts.map +1 -0
  17. package/dist/infer-sizes.js +65 -0
  18. package/dist/infer-sizes.js.map +1 -0
  19. package/dist/internal/aspect-ratio.d.ts +3 -0
  20. package/dist/internal/aspect-ratio.d.ts.map +1 -0
  21. package/dist/internal/aspect-ratio.js +73 -0
  22. package/dist/internal/aspect-ratio.js.map +1 -0
  23. package/dist/internal/class-names.d.ts +3 -0
  24. package/dist/internal/class-names.d.ts.map +1 -0
  25. package/dist/internal/class-names.js +20 -0
  26. package/dist/internal/class-names.js.map +1 -0
  27. package/dist/internal/css-length.d.ts +5 -0
  28. package/dist/internal/css-length.d.ts.map +1 -0
  29. package/dist/internal/css-length.js +50 -0
  30. package/dist/internal/css-length.js.map +1 -0
  31. package/dist/internal/is-non-empty-string.d.ts +2 -0
  32. package/dist/internal/is-non-empty-string.d.ts.map +1 -0
  33. package/dist/internal/is-non-empty-string.js +4 -0
  34. package/dist/internal/is-non-empty-string.js.map +1 -0
  35. package/dist/internal/size-info.d.ts +5 -0
  36. package/dist/internal/size-info.d.ts.map +1 -0
  37. package/dist/internal/size-info.js +105 -0
  38. package/dist/internal/size-info.js.map +1 -0
  39. package/dist/internal/tailwind-length.d.ts +3 -0
  40. package/dist/internal/tailwind-length.d.ts.map +1 -0
  41. package/dist/internal/tailwind-length.js +93 -0
  42. package/dist/internal/tailwind-length.js.map +1 -0
  43. package/dist/internal/tailwind-variants.d.ts +7 -0
  44. package/dist/internal/tailwind-variants.d.ts.map +1 -0
  45. package/dist/internal/tailwind-variants.js +63 -0
  46. package/dist/internal/tailwind-variants.js.map +1 -0
  47. package/dist/smart-image/get-alt-from-src.d.ts +2 -0
  48. package/dist/smart-image/get-alt-from-src.d.ts.map +1 -0
  49. package/dist/smart-image/get-alt-from-src.js +6 -0
  50. package/dist/smart-image/get-alt-from-src.js.map +1 -0
  51. package/dist/smart-image/index.d.ts +3 -0
  52. package/dist/smart-image/index.d.ts.map +1 -0
  53. package/dist/smart-image/index.js +2 -0
  54. package/dist/smart-image/index.js.map +1 -0
  55. package/dist/smart-image/smart-image.d.ts +4 -0
  56. package/dist/smart-image/smart-image.d.ts.map +1 -0
  57. package/dist/smart-image/smart-image.js +27 -0
  58. package/dist/smart-image/smart-image.js.map +1 -0
  59. package/dist/smart-image/smart-image.types.d.ts +38 -0
  60. package/dist/smart-image/smart-image.types.d.ts.map +1 -0
  61. package/dist/smart-image/smart-image.types.js +2 -0
  62. package/dist/smart-image/smart-image.types.js.map +1 -0
  63. package/dist/types.d.ts +28 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +75 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 prb
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # tw-next-image
2
+
3
+ Tailwind-first Next.js image component with automatic `sizes` inference.
4
+
5
+ See [DOCS.md](./DOCS.md) for full examples and API reference.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ bun add tw-next-image
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```tsx
16
+ import { SmartImage } from "tw-next-image";
17
+
18
+ // sizes inferred from className
19
+ <SmartImage src="/logo.png" className="size-11" />
20
+ // → sizes="44px"
21
+
22
+ // Responsive breakpoints
23
+ <SmartImage src="/avatar.webp" className="size-25 lg:size-30" />
24
+ // → sizes="(min-width: 1024px) 120px, 100px"
25
+ ```
26
+
27
+ `SmartImage` wraps `next/image` with `fill` mode—ensure the wrapper has height via `size-*`, `h-*`, `aspect-*`, or
28
+ inline styles.
29
+
30
+ ## License
31
+
32
+ MIT
@@ -0,0 +1,10 @@
1
+ export declare const DEFAULT_BREAKPOINTS: {
2
+ readonly "2xl": 1536;
3
+ readonly lg: 1024;
4
+ readonly md: 768;
5
+ readonly sm: 640;
6
+ readonly xl: 1280;
7
+ };
8
+ export type Breakpoint = keyof typeof DEFAULT_BREAKPOINTS;
9
+ export type BreakpointConfig = Record<string, number>;
10
+ //# sourceMappingURL=breakpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../src/breakpoints.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB;;;;;;CAMtB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_BREAKPOINTS = {
2
+ "2xl": 1536,
3
+ lg: 1024,
4
+ md: 768,
5
+ sm: 640,
6
+ xl: 1280,
7
+ };
8
+ //# sourceMappingURL=breakpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../src/breakpoints.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,IAAI;IACX,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,IAAI;CACA,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { type Breakpoint, type BreakpointConfig, DEFAULT_BREAKPOINTS } from "./breakpoints.js";
2
+ export { inferImageSizes } from "./infer-sizes.js";
3
+ export type { SmartImageProps } from "./smart-image/index.js";
4
+ export { SmartImage } from "./smart-image/index.js";
5
+ export type { InferSizesInput, InferSizesStyle, SizeInfo, StaticImageData } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DEFAULT_BREAKPOINTS } from "./breakpoints.js";
2
+ export { inferImageSizes } from "./infer-sizes.js";
3
+ export { SmartImage } from "./smart-image/index.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { type Breakpoint, type BreakpointConfig, DEFAULT_BREAKPOINTS } from "../breakpoints.js";
2
+ export { inferImageSizes } from "../infer-sizes.js";
3
+ export type { InferSizesInput, InferSizesStyle, SizeInfo, StaticImageData } from "../types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/infer-sizes/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_BREAKPOINTS } from "../breakpoints.js";
2
+ export { inferImageSizes } from "../infer-sizes.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infer-sizes/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0C,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { InferSizesInput } from "./types.js";
2
+ export declare function inferImageSizes({ className, style, ratio, baseSpacingPx, src, breakpoints, customSpacing, }: InferSizesInput): string | null;
3
+ //# sourceMappingURL=infer-sizes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-sizes.d.ts","sourceRoot":"","sources":["../src/infer-sizes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AA6E5D,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,KAAK,EACL,KAAK,EACL,aAAuC,EACvC,GAAG,EACH,WAAiC,EACjC,aAAkB,GACnB,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAqBjC"}
@@ -0,0 +1,65 @@
1
+ import { DEFAULT_BREAKPOINTS } from "./breakpoints.js";
2
+ import { getAspectRatioFromClassName, getSrcAspectRatio } from "./internal/aspect-ratio.js";
3
+ import { formatPx, minPx, parsePxNumber } from "./internal/css-length.js";
4
+ import { mergeStyleIntoSizeInfo, parseSizeInfoByBreakpoint } from "./internal/size-info.js";
5
+ const DEFAULT_BASE_SPACING_PX = 4;
6
+ function resolveWidthCandidate(info, aspectRatio) {
7
+ const fromWidthOrMax = (() => {
8
+ if (info.width && info.maxWidth) {
9
+ return minPx(info.width, info.maxWidth) ?? `min(${info.width}, ${info.maxWidth})`;
10
+ }
11
+ return info.width ?? info.maxWidth;
12
+ })();
13
+ if (fromWidthOrMax) {
14
+ return fromWidthOrMax;
15
+ }
16
+ if (!aspectRatio) {
17
+ return null;
18
+ }
19
+ const height = (() => {
20
+ if (info.height && info.maxHeight) {
21
+ return (minPx(info.height, info.maxHeight) ??
22
+ (parsePxNumber(info.height) === null ? null : info.height) ??
23
+ (parsePxNumber(info.maxHeight) === null ? null : info.maxHeight));
24
+ }
25
+ return info.height ?? info.maxHeight ?? null;
26
+ })();
27
+ if (!height) {
28
+ return null;
29
+ }
30
+ const heightPx = parsePxNumber(height);
31
+ if (heightPx === null) {
32
+ return null;
33
+ }
34
+ return formatPx(heightPx * aspectRatio);
35
+ }
36
+ function buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints) {
37
+ const conditions = [];
38
+ const orderedBreakpoints = Object.entries(breakpoints).sort((a, b) => b[1] - a[1]);
39
+ for (const [breakpoint, minWidthPx] of orderedBreakpoints) {
40
+ const info = byBreakpoint[breakpoint];
41
+ if (!info) {
42
+ continue;
43
+ }
44
+ const resolved = resolveWidthCandidate(info, aspectRatio);
45
+ if (!resolved) {
46
+ continue;
47
+ }
48
+ conditions.push(`(min-width: ${minWidthPx}px) ${resolved}`);
49
+ }
50
+ return conditions;
51
+ }
52
+ export function inferImageSizes({ className, style, ratio, baseSpacingPx = DEFAULT_BASE_SPACING_PX, src, breakpoints = DEFAULT_BREAKPOINTS, customSpacing = {}, }) {
53
+ const byBreakpoint = parseSizeInfoByBreakpoint(className, baseSpacingPx, breakpoints, customSpacing);
54
+ const baseInfo = byBreakpoint.base ?? {};
55
+ byBreakpoint.base = baseInfo;
56
+ mergeStyleIntoSizeInfo(baseInfo, style);
57
+ const aspectRatio = ratio ?? getSrcAspectRatio(src) ?? getAspectRatioFromClassName(className);
58
+ const resolvedBase = resolveWidthCandidate(baseInfo, aspectRatio);
59
+ if (!resolvedBase) {
60
+ return null;
61
+ }
62
+ const conditions = buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints);
63
+ return conditions.length === 0 ? resolvedBase : `${conditions.join(", ")}, ${resolvedBase}`;
64
+ }
65
+ //# sourceMappingURL=infer-sizes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-sizes.js","sourceRoot":"","sources":["../src/infer-sizes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getSrcAspectRatio(src: unknown): number | null;
2
+ export declare function getAspectRatioFromClassName(className: string | undefined): number | null;
3
+ //# sourceMappingURL=aspect-ratio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../src/internal/aspect-ratio.ts"],"names":[],"mappings":"AAkBA,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAU7D;AA8CD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcxF"}
@@ -0,0 +1,73 @@
1
+ import { parseVariantToken } from "./tailwind-variants.js";
2
+ const WHITESPACE_REGEX = /\s+/;
3
+ const ASPECT_FRACTION_REGEX = /^aspect-(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?)$/;
4
+ const ASPECT_ARBITRARY_REGEX = /^aspect-\[(.+)\]$/;
5
+ function isRecord(value) {
6
+ return typeof value === "object" && value !== null;
7
+ }
8
+ function isStaticImageData(value) {
9
+ if (!isRecord(value)) {
10
+ return false;
11
+ }
12
+ return typeof value.width === "number" && typeof value.height === "number";
13
+ }
14
+ export function getSrcAspectRatio(src) {
15
+ if (isStaticImageData(src) && src.height !== 0) {
16
+ return src.width / src.height;
17
+ }
18
+ if (isRecord(src) && isStaticImageData(src.default) && src.default.height !== 0) {
19
+ return src.default.width / src.default.height;
20
+ }
21
+ return null;
22
+ }
23
+ function parseAspectRatioFromBaseToken(baseToken) {
24
+ if (baseToken === "aspect-square") {
25
+ return 1;
26
+ }
27
+ if (baseToken === "aspect-video") {
28
+ return 16 / 9;
29
+ }
30
+ const fractionMatch = ASPECT_FRACTION_REGEX.exec(baseToken);
31
+ if (fractionMatch) {
32
+ const numerator = Number(fractionMatch[1]);
33
+ const denominator = Number(fractionMatch[2]);
34
+ if (Number.isFinite(numerator) && Number.isFinite(denominator) && denominator !== 0) {
35
+ return numerator / denominator;
36
+ }
37
+ return null;
38
+ }
39
+ const match = ASPECT_ARBITRARY_REGEX.exec(baseToken);
40
+ if (!match) {
41
+ return null;
42
+ }
43
+ const raw = match[1]?.replaceAll("_", " ").trim();
44
+ if (!raw) {
45
+ return null;
46
+ }
47
+ if (raw.includes("/")) {
48
+ const [numerator, denominator] = raw.split("/", 2).map((part) => Number(part.trim()));
49
+ if (Number.isFinite(numerator) && Number.isFinite(denominator) && denominator !== 0) {
50
+ return numerator / denominator;
51
+ }
52
+ return null;
53
+ }
54
+ const value = Number(raw);
55
+ if (Number.isFinite(value) && value !== 0) {
56
+ return value;
57
+ }
58
+ return null;
59
+ }
60
+ export function getAspectRatioFromClassName(className) {
61
+ if (!className) {
62
+ return null;
63
+ }
64
+ for (const token of className.split(WHITESPACE_REGEX)) {
65
+ const { base: baseToken } = parseVariantToken(token);
66
+ const aspectRatio = parseAspectRatioFromBaseToken(baseToken);
67
+ if (aspectRatio !== null) {
68
+ return aspectRatio;
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ //# sourceMappingURL=aspect-ratio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aspect-ratio.js","sourceRoot":"","sources":["../../src/internal/aspect-ratio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type ClassNameValue = string | false | null | undefined;
2
+ export declare function cx(...values: readonly ClassNameValue[]): string;
3
+ //# sourceMappingURL=class-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-names.d.ts","sourceRoot":"","sources":["../../src/internal/class-names.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAI/D,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAqB/D"}
@@ -0,0 +1,20 @@
1
+ import { isNonEmptyString } from "./is-non-empty-string.js";
2
+ const whitespaceRegex = /\s+/;
3
+ export function cx(...values) {
4
+ if (values.length === 0) {
5
+ return "";
6
+ }
7
+ const tokens = [];
8
+ for (const value of values) {
9
+ if (!isNonEmptyString(value)) {
10
+ continue;
11
+ }
12
+ const trimmed = value.trim();
13
+ if (!trimmed) {
14
+ continue;
15
+ }
16
+ tokens.push(...trimmed.split(whitespaceRegex));
17
+ }
18
+ return tokens.join(" ");
19
+ }
20
+ //# sourceMappingURL=class-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-names.js","sourceRoot":"","sources":["../../src/internal/class-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,MAAM,UAAU,EAAE,CAAC,GAAG,MAAiC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function parseStyleLength(value: unknown): string | null;
2
+ export declare function parsePxNumber(length: string): number | null;
3
+ export declare function formatPx(value: number): string;
4
+ export declare function minPx(a: string, b: string): string | null;
5
+ //# sourceMappingURL=css-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-length.d.ts","sourceRoot":"","sources":["../../src/internal/css-length.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA2B9D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD"}
@@ -0,0 +1,50 @@
1
+ const CSS_LENGTH_LITERAL_REGEX = /^\d+(\.\d+)?(px|rem|em|vw|vh|vmin|vmax|dvw|lvw|svw|dvh|lvh|svh)$/;
2
+ const CSS_FUNC_LENGTH_REGEX = /^(calc|min|max|clamp)\(.+\)$/;
3
+ const CSS_VAR_REGEX = /^var\(.+\)$/;
4
+ const PX_NUMBER_REGEX = /^(\d+(?:\.\d+)?)px$/;
5
+ const TRAILING_ZEROES_REGEX = /\.0+$/;
6
+ export function parseStyleLength(value) {
7
+ if (value === null || value === undefined) {
8
+ return null;
9
+ }
10
+ if (typeof value === "number") {
11
+ return `${value}px`;
12
+ }
13
+ if (typeof value !== "string") {
14
+ return null;
15
+ }
16
+ const trimmed = value.trim();
17
+ if (trimmed === "" || trimmed === "auto") {
18
+ return null;
19
+ }
20
+ if (CSS_LENGTH_LITERAL_REGEX.test(trimmed)) {
21
+ return trimmed;
22
+ }
23
+ if (CSS_FUNC_LENGTH_REGEX.test(trimmed)) {
24
+ return trimmed;
25
+ }
26
+ if (CSS_VAR_REGEX.test(trimmed)) {
27
+ return trimmed;
28
+ }
29
+ return null;
30
+ }
31
+ export function parsePxNumber(length) {
32
+ const match = PX_NUMBER_REGEX.exec(length);
33
+ if (!match) {
34
+ return null;
35
+ }
36
+ return Number(match[1]);
37
+ }
38
+ export function formatPx(value) {
39
+ const rounded = Math.round(value * 1000) / 1000;
40
+ return `${String(rounded).replace(TRAILING_ZEROES_REGEX, "")}px`;
41
+ }
42
+ export function minPx(a, b) {
43
+ const aPx = parsePxNumber(a);
44
+ const bPx = parsePxNumber(b);
45
+ if (aPx === null || bPx === null) {
46
+ return null;
47
+ }
48
+ return formatPx(Math.min(aPx, bPx));
49
+ }
50
+ //# sourceMappingURL=css-length.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-length.js","sourceRoot":"","sources":["../../src/internal/css-length.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,kEAAkE,CAAC;AACpG,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAC7D,MAAM,aAAa,GAAG,aAAa,CAAC;AACpC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAAG,KAAK,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isNonEmptyString(value: unknown): value is string;
2
+ //# sourceMappingURL=is-non-empty-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-non-empty-string.d.ts","sourceRoot":"","sources":["../../src/internal/is-non-empty-string.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE"}
@@ -0,0 +1,4 @@
1
+ export function isNonEmptyString(value) {
2
+ return typeof value === "string" && value.length > 0;
3
+ }
4
+ //# sourceMappingURL=is-non-empty-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-non-empty-string.js","sourceRoot":"","sources":["../../src/internal/is-non-empty-string.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BreakpointConfig } from "../breakpoints.js";
2
+ import type { BreakpointKey, InferSizesStyle, SizeInfo } from "../types.js";
3
+ export declare function parseSizeInfoByBreakpoint(className: string | undefined, baseSpacingPx: number, breakpoints: BreakpointConfig, customSpacing?: Record<string, string>): Partial<Record<BreakpointKey, SizeInfo>>;
4
+ export declare function mergeStyleIntoSizeInfo(info: SizeInfo, style: InferSizesStyle | undefined): void;
5
+ //# sourceMappingURL=size-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-info.d.ts","sourceRoot":"","sources":["../../src/internal/size-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmD5E,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,gBAAgB,EAC7B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CA6B1C;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,GAAG,SAAS,QAsBxF"}
@@ -0,0 +1,105 @@
1
+ import { parseStyleLength } from "./css-length.js";
2
+ import { parseTailwindLength } from "./tailwind-length.js";
3
+ import { getBreakpoint, parseVariantToken } from "./tailwind-variants.js";
4
+ const WHITESPACE_REGEX = /\s+/;
5
+ const SIZE_REGEX = /^size-(.+)$/;
6
+ const WIDTH_REGEX = /^w-(.+)$/;
7
+ const MAX_WIDTH_REGEX = /^max-w-(.+)$/;
8
+ const HEIGHT_REGEX = /^h-(.+)$/;
9
+ const MAX_HEIGHT_REGEX = /^max-h-(.+)$/;
10
+ const SIZING_HANDLERS = [
11
+ {
12
+ apply: (info, value) => {
13
+ info.width = value;
14
+ info.height = value;
15
+ },
16
+ regex: SIZE_REGEX,
17
+ },
18
+ {
19
+ apply: (info, value) => {
20
+ info.width = value;
21
+ },
22
+ regex: WIDTH_REGEX,
23
+ },
24
+ {
25
+ apply: (info, value) => {
26
+ info.maxWidth = value;
27
+ },
28
+ regex: MAX_WIDTH_REGEX,
29
+ },
30
+ {
31
+ apply: (info, value) => {
32
+ info.height = value;
33
+ },
34
+ regex: HEIGHT_REGEX,
35
+ },
36
+ {
37
+ apply: (info, value) => {
38
+ info.maxHeight = value;
39
+ },
40
+ regex: MAX_HEIGHT_REGEX,
41
+ },
42
+ ];
43
+ export function parseSizeInfoByBreakpoint(className, baseSpacingPx, breakpoints, customSpacing = {}) {
44
+ const byBreakpoint = {};
45
+ if (!className) {
46
+ return byBreakpoint;
47
+ }
48
+ for (const token of className.split(WHITESPACE_REGEX)) {
49
+ if (!token) {
50
+ continue;
51
+ }
52
+ const { base: baseToken, variants } = parseVariantToken(token);
53
+ const breakpoint = getBreakpoint(variants, breakpoints);
54
+ const key = breakpoint ?? "base";
55
+ const existing = byBreakpoint[key] ?? {};
56
+ const didApply = applySizingBaseTokenToInfo({
57
+ baseSpacingPx,
58
+ baseToken,
59
+ breakpoints,
60
+ customSpacing,
61
+ info: existing,
62
+ });
63
+ if (didApply) {
64
+ byBreakpoint[key] = existing;
65
+ }
66
+ }
67
+ return byBreakpoint;
68
+ }
69
+ export function mergeStyleIntoSizeInfo(info, style) {
70
+ if (!style) {
71
+ return;
72
+ }
73
+ const styleWidth = parseStyleLength(style.width);
74
+ const styleMaxWidth = parseStyleLength(style.maxWidth);
75
+ const styleHeight = parseStyleLength(style.height);
76
+ const styleMaxHeight = parseStyleLength(style.maxHeight);
77
+ if (styleWidth) {
78
+ info.width = styleWidth;
79
+ }
80
+ if (styleMaxWidth) {
81
+ info.maxWidth = styleMaxWidth;
82
+ }
83
+ if (styleHeight) {
84
+ info.height = styleHeight;
85
+ }
86
+ if (styleMaxHeight) {
87
+ info.maxHeight = styleMaxHeight;
88
+ }
89
+ }
90
+ function applySizingBaseTokenToInfo({ baseSpacingPx, baseToken, breakpoints, customSpacing, info, }) {
91
+ for (const handler of SIZING_HANDLERS) {
92
+ const match = handler.regex.exec(baseToken);
93
+ if (!match) {
94
+ continue;
95
+ }
96
+ const parsed = parseTailwindLength(match[1] ?? "", baseSpacingPx, breakpoints, customSpacing);
97
+ if (!parsed) {
98
+ return false;
99
+ }
100
+ handler.apply(info, parsed);
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ //# sourceMappingURL=size-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-info.js","sourceRoot":"","sources":["../../src/internal/size-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BreakpointConfig } from "../breakpoints.js";
2
+ export declare function parseTailwindLength(raw: string, baseSpacingPx: number, breakpoints: BreakpointConfig, customSpacing?: Record<string, string>): string | null;
3
+ //# sourceMappingURL=tailwind-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-length.d.ts","sourceRoot":"","sources":["../../src/internal/tailwind-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,gBAAgB,EAC7B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,MAAM,GAAG,IAAI,CAcf"}
@@ -0,0 +1,93 @@
1
+ import { formatPx } from "./css-length.js";
2
+ const TRAILING_ZEROES_REGEX = /\.0+$/;
3
+ export function parseTailwindLength(raw, baseSpacingPx, breakpoints, customSpacing = {}) {
4
+ if (raw === "auto" || raw === "full") {
5
+ return null;
6
+ }
7
+ return (parseTailwindLengthFromCustomSpacing(raw, customSpacing) ??
8
+ parseTailwindLengthFromScreen(raw, breakpoints) ??
9
+ parseTailwindLengthFromViewport(raw) ??
10
+ parseTailwindLengthFromFraction(raw) ??
11
+ parseTailwindLengthFromArbitraryBrackets(raw) ??
12
+ parseTailwindLengthFromArbitraryParens(raw) ??
13
+ parseTailwindLengthFromNumber(raw, baseSpacingPx));
14
+ }
15
+ function parseTailwindLengthFromCustomSpacing(raw, customSpacing) {
16
+ if (raw in customSpacing) {
17
+ return customSpacing[raw];
18
+ }
19
+ if (raw === "px") {
20
+ return "1px";
21
+ }
22
+ return null;
23
+ }
24
+ function parseTailwindLengthFromScreen(raw, breakpoints) {
25
+ if (raw === "screen") {
26
+ return "100vw";
27
+ }
28
+ if (!raw.startsWith("screen-")) {
29
+ return null;
30
+ }
31
+ const breakpoint = raw.slice("screen-".length);
32
+ if (!(breakpoint in breakpoints)) {
33
+ return null;
34
+ }
35
+ return `${breakpoints[breakpoint]}px`;
36
+ }
37
+ function parseTailwindLengthFromViewport(raw) {
38
+ if (raw === "dvw" ||
39
+ raw === "lvw" ||
40
+ raw === "svw" ||
41
+ raw === "dvh" ||
42
+ raw === "lvh" ||
43
+ raw === "svh") {
44
+ return `100${raw}`;
45
+ }
46
+ return null;
47
+ }
48
+ function parseTailwindLengthFromFraction(raw) {
49
+ const [numeratorRaw, denominatorRaw] = raw.split("/", 2);
50
+ if (numeratorRaw === undefined || denominatorRaw === undefined) {
51
+ return null;
52
+ }
53
+ const numerator = Number(numeratorRaw);
54
+ const denominator = Number(denominatorRaw);
55
+ if (!(Number.isFinite(numerator) && Number.isFinite(denominator)) || denominator === 0) {
56
+ return null;
57
+ }
58
+ const percent = (numerator / denominator) * 100;
59
+ if (!Number.isFinite(percent)) {
60
+ return null;
61
+ }
62
+ const rounded = Math.round(percent * 1_000_000) / 1_000_000;
63
+ const formatted = String(rounded).replace(TRAILING_ZEROES_REGEX, "");
64
+ return `${formatted}%`;
65
+ }
66
+ function parseTailwindLengthFromArbitraryBrackets(raw) {
67
+ if (!(raw.startsWith("[") && raw.endsWith("]"))) {
68
+ return null;
69
+ }
70
+ const inner = raw.slice(1, -1).replaceAll("_", " ").trim();
71
+ return inner === "" ? null : inner;
72
+ }
73
+ function parseTailwindLengthFromArbitraryParens(raw) {
74
+ if (!(raw.startsWith("(") && raw.endsWith(")"))) {
75
+ return null;
76
+ }
77
+ const inner = raw.slice(1, -1).trim();
78
+ if (inner === "") {
79
+ return null;
80
+ }
81
+ if (inner.startsWith("--")) {
82
+ return `var(${inner})`;
83
+ }
84
+ return inner;
85
+ }
86
+ function parseTailwindLengthFromNumber(raw, baseSpacingPx) {
87
+ const numberValue = Number(raw);
88
+ if (!Number.isFinite(numberValue) || numberValue < 0) {
89
+ return null;
90
+ }
91
+ return formatPx(numberValue * baseSpacingPx);
92
+ }
93
+ //# sourceMappingURL=tailwind-length.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-length.js","sourceRoot":"","sources":["../../src/internal/tailwind-length.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BreakpointConfig } from "../breakpoints.js";
2
+ export declare function parseVariantToken(token: string): {
3
+ base: string;
4
+ variants: string[];
5
+ };
6
+ export declare function getBreakpoint(variants: string[], breakpoints: BreakpointConfig): string | null;
7
+ //# sourceMappingURL=tailwind-variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-variants.d.ts","sourceRoot":"","sources":["../../src/internal/tailwind-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAuD1D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBrF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAO9F"}
@@ -0,0 +1,63 @@
1
+ function splitVariantsAndBase(token) {
2
+ const state = { bracketDepth: 0, current: "", parenDepth: 0, parts: [] };
3
+ for (const char of token) {
4
+ state.bracketDepth = nextBracketDepth(state.bracketDepth, state.parenDepth, char);
5
+ state.parenDepth = nextParenDepth(state.parenDepth, state.bracketDepth, char);
6
+ if (char === ":" && state.bracketDepth === 0 && state.parenDepth === 0) {
7
+ state.parts.push(state.current);
8
+ state.current = "";
9
+ continue;
10
+ }
11
+ state.current += char;
12
+ }
13
+ state.parts.push(state.current);
14
+ return state.parts;
15
+ }
16
+ function nextBracketDepth(current, parenDepth, char) {
17
+ if (parenDepth !== 0) {
18
+ return current;
19
+ }
20
+ if (char === "[") {
21
+ return current + 1;
22
+ }
23
+ if (char === "]" && current > 0) {
24
+ return current - 1;
25
+ }
26
+ return current;
27
+ }
28
+ function nextParenDepth(current, bracketDepth, char) {
29
+ if (bracketDepth !== 0) {
30
+ return current;
31
+ }
32
+ if (char === "(") {
33
+ return current + 1;
34
+ }
35
+ if (char === ")" && current > 0) {
36
+ return current - 1;
37
+ }
38
+ return current;
39
+ }
40
+ export function parseVariantToken(token) {
41
+ if (!token.includes(":")) {
42
+ return { base: token, variants: [] };
43
+ }
44
+ const parts = splitVariantsAndBase(token);
45
+ if (parts.length <= 1) {
46
+ return { base: token, variants: [] };
47
+ }
48
+ if (parts.some((part) => part === "")) {
49
+ return { base: token, variants: [] };
50
+ }
51
+ const base = parts.at(-1) ?? token;
52
+ const variants = parts.slice(0, -1).filter(Boolean);
53
+ return { base, variants };
54
+ }
55
+ export function getBreakpoint(variants, breakpoints) {
56
+ for (const variant of variants) {
57
+ if (variant in breakpoints) {
58
+ return variant;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ //# sourceMappingURL=tailwind-variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-variants.js","sourceRoot":"","sources":["../../src/internal/tailwind-variants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getAltFromSrc(src: string): string;
2
+ //# sourceMappingURL=get-alt-from-src.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-alt-from-src.d.ts","sourceRoot":"","sources":["../../src/smart-image/get-alt-from-src.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD"}
@@ -0,0 +1,6 @@
1
+ const FILE_EXT_REGEX = /\.[^.]+$/;
2
+ export function getAltFromSrc(src) {
3
+ const filename = src.split("/").pop() ?? "";
4
+ return filename.replace(FILE_EXT_REGEX, "");
5
+ }
6
+ //# sourceMappingURL=get-alt-from-src.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-alt-from-src.js","sourceRoot":"","sources":["../../src/smart-image/get-alt-from-src.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,UAAU,CAAC;AAMlC,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { SmartImage } from "./smart-image.js";
2
+ export type { SmartImageProps } from "./smart-image.types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smart-image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { SmartImage } from "./smart-image.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/smart-image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { SmartImageProps } from "./smart-image.types.js";
3
+ export declare function SmartImage<C extends string | undefined = undefined, S extends CSSProperties | undefined = undefined>({ alt, className, imgClassName, imgStyle, ratio, sizes, src, style, ...props }: SmartImageProps<C, S>): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=smart-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-image.d.ts","sourceRoot":"","sources":["../../src/smart-image/smart-image.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAkB9D,wBAAgB,UAAU,CACxB,CAAC,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACxC,CAAC,SAAS,aAAa,GAAG,SAAS,GAAG,SAAS,EAC/C,EACA,GAAG,EACH,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,EACH,KAAK,EACL,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,2CAwCvB"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import NextImage from "next/image.js";
3
+ import { inferImageSizes } from "../infer-sizes.js";
4
+ import { cx } from "../internal/class-names.js";
5
+ import { getAltFromSrc } from "./get-alt-from-src.js";
6
+ const HAS_HEIGHT_OR_ASPECT_CLASS_REGEX = /(^|\s)(size-|h-|max-h-|aspect-)/;
7
+ let didWarnMissingLayoutSizing = false;
8
+ export function SmartImage({ alt, className, imgClassName, imgStyle, ratio, sizes, src, style, ...props }) {
9
+ const derivedAlt = alt ?? (props["aria-hidden"] ? "" : getAltFromSrc(typeof src === "string" ? src : ""));
10
+ const inferredSizes = sizes ?? inferImageSizes({ className, ratio, src, style });
11
+ if (!didWarnMissingLayoutSizing && process.env.NODE_ENV !== "production") {
12
+ const classTokens = className ?? "";
13
+ const hasHeightOrAspectClass = HAS_HEIGHT_OR_ASPECT_CLASS_REGEX.test(classTokens);
14
+ const hasHeightOrAspectStyle = Boolean(style?.height || style?.maxHeight || style?.aspectRatio);
15
+ if (!(hasHeightOrAspectClass || hasHeightOrAspectStyle || ratio)) {
16
+ didWarnMissingLayoutSizing = true;
17
+ console.warn("SmartImage: `fill` requires the wrapper to have a height. " +
18
+ "Use `size-*`/`h-*`, an `aspect-*` class, inline `style={{ aspectRatio }}`, or pass `ratio`.");
19
+ }
20
+ }
21
+ if (!inferredSizes && process.env.NODE_ENV !== "production") {
22
+ throw new Error("SmartImage: missing `sizes` and couldn't infer from className/style. " +
23
+ "Add Tailwind sizing classes (size-*, w-*, max-w-*) or pass `sizes` explicitly.");
24
+ }
25
+ return (_jsx("span", { className: cx("relative inline-block", className), style: style, children: _jsx(NextImage, { ...props, alt: derivedAlt, className: cx("object-contain", imgClassName), fill: true, sizes: inferredSizes ?? "100vw", src: src, style: imgStyle }) }));
26
+ }
27
+ //# sourceMappingURL=smart-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-image.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.tsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,gCAAgC,GAAG,iCAAiC,CAAC;AAE3E,IAAI,0BAA0B,GAAG,KAAK,CAAC;AAcvC,MAAM,UAAU,UAAU,CAGxB,EACA,GAAG,EACH,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,EACH,KAAK,EACL,GAAG,KAAK,EACc;IACtB,MAAM,UAAU,GACd,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzF,MAAM,aAAa,GAAG,KAAK,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjF,IAAI,CAAC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,SAAS,IAAI,EAAE,CAAC;QACpC,MAAM,sBAAsB,GAAG,gCAAgC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClF,MAAM,sBAAsB,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,WAAW,CAAC,CAAC;QAEhG,IAAI,CAAC,CAAC,sBAAsB,IAAI,sBAAsB,IAAI,KAAK,CAAC,EAAE,CAAC;YACjE,0BAA0B,GAAG,IAAI,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,4DAA4D;gBAC1D,6FAA6F,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,uEAAuE;YACrE,gFAAgF,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAM,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YACnE,KAAC,SAAS,OACJ,KAAK,EACT,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAC7C,IAAI,QACJ,KAAK,EAAE,aAAa,IAAI,OAAO,EAC/B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,QAAQ,GACf,GACG,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { ImageProps as NextImageProps } from "next/image.js";
2
+ import type { CSSProperties } from "react";
3
+ type Simplify<T> = {
4
+ [K in keyof T]: T[K];
5
+ } & {};
6
+ type IsStringLiteral<T> = T extends string ? (string extends T ? false : true) : false;
7
+ type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
8
+ [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
9
+ }[Keys];
10
+ type NextImageBaseProps = Omit<NextImageProps, "alt" | "className" | "fill" | "height" | "sizes" | "style" | "width">;
11
+ type InferableTailwindLengthValue = `${number}` | `[${string}]` | `(${string})` | "container" | "edge" | "dvh" | "dvw" | "lvh" | "lvw" | "px" | "screen" | "svh" | "svw" | `screen-${string}`;
12
+ type HasInferableClassSizingToken<C extends string> = C extends `${string}size-${InferableTailwindLengthValue}${string}` | `${string}w-${InferableTailwindLengthValue}${string}` | `${string}max-w-${InferableTailwindLengthValue}${string}` ? true : false;
13
+ type IsBroadStyle<S> = [NonNullable<S>] extends [CSSProperties] ? CSSProperties extends NonNullable<S> ? true : false : false;
14
+ type CanInferFromClassName<C> = [NonNullable<C>] extends [string] ? IsStringLiteral<NonNullable<C>> extends true ? HasInferableClassSizingToken<NonNullable<C>> : false : false;
15
+ type InferableStyle = RequireAtLeastOne<CSSProperties, "maxWidth" | "width">;
16
+ type CanInferFromStyle<S> = [NonNullable<S>] extends [CSSProperties] ? IsBroadStyle<S> extends true ? false : NonNullable<S> extends InferableStyle ? true : false : false;
17
+ type SizesConstraint<C, S> = {
18
+ sizes: string;
19
+ } | (CanInferFromClassName<C> extends true ? {
20
+ sizes?: string;
21
+ } : never) | (CanInferFromStyle<S> extends true ? {
22
+ sizes?: string;
23
+ } : never) | ([NonNullable<C>] extends [string] ? IsStringLiteral<NonNullable<C>> extends false ? {
24
+ sizes?: string;
25
+ } : never : never) | (IsBroadStyle<S> extends true ? {
26
+ sizes?: string;
27
+ } : never);
28
+ export type SmartImageProps<C extends string | undefined = undefined, S extends CSSProperties | undefined = undefined> = Simplify<NextImageBaseProps & {
29
+ alt?: string;
30
+ className?: C;
31
+ style?: S;
32
+ imgClassName?: string;
33
+ imgStyle?: NextImageProps["style"];
34
+ ratio?: number;
35
+ sizes?: string;
36
+ } & SizesConstraint<C, S>>;
37
+ export {};
38
+ //# sourceMappingURL=smart-image.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-image.types.d.ts","sourceRoot":"","sources":["../../src/smart-image/smart-image.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=smart-image.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-image.types.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { BreakpointConfig } from "./breakpoints.js";
2
+ export type BreakpointKey = string | "base";
3
+ export type InferSizesStyle = Partial<{
4
+ width: number | string | null | undefined;
5
+ maxWidth: number | string | null | undefined;
6
+ height: number | string | null | undefined;
7
+ maxHeight: number | string | null | undefined;
8
+ }>;
9
+ export type InferSizesInput = {
10
+ baseSpacingPx?: number;
11
+ breakpoints?: BreakpointConfig;
12
+ className?: string;
13
+ customSpacing?: Record<string, string>;
14
+ ratio?: number;
15
+ src?: unknown;
16
+ style?: InferSizesStyle;
17
+ };
18
+ export type SizeInfo = {
19
+ height?: string;
20
+ maxHeight?: string;
21
+ maxWidth?: string;
22
+ width?: string;
23
+ };
24
+ export type StaticImageData = {
25
+ height: number;
26
+ width: number;
27
+ };
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC/C,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG;IAK5B,aAAa,CAAC,EAAE,MAAM,CAAC;IAKvB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IAKnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAKvC,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "description": "Tailwind-first Next.js Image component with automatic sizes inference.",
3
+ "homepage": "https://github.com/PaulRBerg/tw-next-image",
4
+ "license": "MIT",
5
+ "main": "./dist/index.js",
6
+ "name": "tw-next-image",
7
+ "sideEffects": false,
8
+ "type": "module",
9
+ "types": "./dist/index.d.ts",
10
+ "version": "1.0.0-beta.0",
11
+ "files": [
12
+ "dist/**",
13
+ "LICENSE"
14
+ ],
15
+ "keywords": [
16
+ "nextjs",
17
+ "next-image",
18
+ "tailwindcss",
19
+ "tailwind",
20
+ "images",
21
+ "react"
22
+ ],
23
+ "author": {
24
+ "name": "Paul Razvan Berg",
25
+ "url": "https://github.com/PaulRBerg"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/PaulRBerg/tw-next-image/issues"
29
+ },
30
+ "devDependencies": {
31
+ "@biomejs/biome": "^2.3.10",
32
+ "@sablier/devkit": "^1.9.1",
33
+ "@testing-library/jest-dom": "^6.9.1",
34
+ "@testing-library/react": "^16.3.1",
35
+ "@types/node": "^25.0.3",
36
+ "@types/react": "^19.2.7",
37
+ "@vitest/ui": "^4.0.16",
38
+ "husky": "^9.1.7",
39
+ "jsdom": "^27.3.0",
40
+ "lint-staged": "^16.2.7",
41
+ "next": "^16.0.10",
42
+ "prettier": "^3.7.4",
43
+ "react": "^19.2.3",
44
+ "typescript": "^5.9.3",
45
+ "ultracite": "^6.4.2",
46
+ "vitest": "^4.0.16"
47
+ },
48
+ "exports": {
49
+ ".": {
50
+ "types": "./dist/index.d.ts",
51
+ "import": "./dist/index.js"
52
+ },
53
+ "./infer-sizes": {
54
+ "types": "./dist/infer-sizes/index.d.ts",
55
+ "import": "./dist/infer-sizes/index.js"
56
+ },
57
+ "./smart-image": {
58
+ "types": "./dist/smart-image/index.d.ts",
59
+ "import": "./dist/smart-image/index.js"
60
+ },
61
+ "./internal/*": null,
62
+ "./package.json": "./package.json"
63
+ },
64
+ "peerDependencies": {
65
+ "next": ">=13.0.0",
66
+ "react": ">=18.0.0"
67
+ },
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "https://github.com/PaulRBerg/tw-next-image.git"
71
+ },
72
+ "scripts": {
73
+ "setup": "husky"
74
+ }
75
+ }