tw-next-image 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to
6
6
  [Semantic Versioning](https://semver.org/).
7
7
 
8
+ ## [1.1.0] - 2026-01-26
9
+
10
+ ### Added
11
+
12
+ - Support `min-w-*` and `min-h-*` constraints in size inference.
13
+ - Infer aspect ratio from inline `style`.
14
+
8
15
  ## [1.0.0] - 2026-01-02
9
16
 
10
17
  Features:
package/README.md CHANGED
@@ -71,7 +71,8 @@ import { SmartImage } from "tw-next-image";
71
71
  ```
72
72
 
73
73
  `SmartImage` wraps `next/image` with `fill` mode—ensure the wrapper has height via `size-*`, `h-*`, `aspect-*`, or
74
- inline styles.
74
+ inline styles. Inference also respects `min-w-*`/`max-w-*` and `min-h-*`/`max-h-*` constraints, and uses
75
+ `style.aspectRatio` for height-only layouts.
75
76
 
76
77
  ## 🔧 Custom `tailwind-merge`
77
78
 
@@ -1 +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"}
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","sourcesContent":["/**\n * Standard Tailwind CSS v4 breakpoints (min-widths in pixels).\n * @see https://tailwindcss.com/docs/responsive-design\n */\nexport const DEFAULT_BREAKPOINTS = {\n \"2xl\": 1536,\n lg: 1024,\n md: 768,\n sm: 640,\n xl: 1280,\n} as const;\n\nexport type Breakpoint = keyof typeof DEFAULT_BREAKPOINTS;\n\nexport type BreakpointConfig = Record<string, number>;\n"]}
package/dist/index.js.map CHANGED
@@ -1 +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;AAQnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
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;AAQnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["// Core inference\n\nexport { type Breakpoint, type BreakpointConfig, DEFAULT_BREAKPOINTS } from \"./breakpoints.js\";\nexport { inferImageSizes } from \"./infer-sizes.js\";\nexport type {\n CreateSmartImageOptions,\n SmartImageClassNameFn,\n SmartImageComponent,\n SmartImageProps,\n} from \"./smart-image/index.js\";\n// SmartImage component\nexport { createSmartImage, SmartImage } from \"./smart-image/index.js\";\nexport type { InferSizesInput, InferSizesStyle, SizeInfo, StaticImageData } from \"./types.js\";\n"]}
@@ -1 +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"}
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","sourcesContent":["/**\n * Standalone subpath export (`tw-next-image/infer-sizes`) for React-free usage.\n * Use this entry point in server-side code or non-React projects.\n */\nexport { type Breakpoint, type BreakpointConfig, DEFAULT_BREAKPOINTS } from \"../breakpoints.js\";\nexport { inferImageSizes } from \"../infer-sizes.js\";\nexport type { InferSizesInput, InferSizesStyle, SizeInfo, StaticImageData } from \"../types.js\";\n"]}
@@ -1 +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,CAwBjC"}
1
+ {"version":3,"file":"infer-sizes.d.ts","sourceRoot":"","sources":["../src/infer-sizes.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AA8H5D,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,KAAK,EACL,KAAK,EACL,aAAuC,EACvC,GAAG,EACH,WAAiC,EACjC,aAAkB,GACnB,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA8BjC"}
@@ -1,39 +1,75 @@
1
1
  import { DEFAULT_BREAKPOINTS } from "./breakpoints.js";
2
2
  import { getAspectRatioFromClassName, getSrcAspectRatio } from "./internal/aspect-ratio.js";
3
- import { formatPx, minPx, parsePxNumber } from "./internal/css-length.js";
3
+ import { formatPx, maxPx, minPx, parsePxNumber, parseStyleAspectRatio, } from "./internal/css-length.js";
4
4
  import { mergeStyleIntoSizeInfo, parseSizeInfoByBreakpoint } from "./internal/size-info.js";
5
5
  const DEFAULT_BASE_SPACING_PX = 4;
6
- function computeResolvedWidth(info, aspectRatio) {
7
- const fromWidthOrMax = (() => {
8
- if (info.width && info.maxWidth) {
9
- return minPx(info.width, info.maxWidth) ?? `min(${info.width}, ${info.maxWidth})`;
6
+ function applyMinMax(value, minValue, maxValue) {
7
+ if (minValue && maxValue) {
8
+ const minPxValue = parsePxNumber(minValue);
9
+ const maxPxValue = parsePxNumber(maxValue);
10
+ const valuePx = parsePxNumber(value);
11
+ if (minPxValue !== null && maxPxValue !== null && valuePx !== null) {
12
+ const clamped = Math.min(Math.max(valuePx, minPxValue), maxPxValue);
13
+ return formatPx(clamped);
10
14
  }
11
- return info.width ?? info.maxWidth;
12
- })();
13
- if (fromWidthOrMax) {
14
- return fromWidthOrMax;
15
+ return `clamp(${minValue}, ${value}, ${maxValue})`;
15
16
  }
16
- if (!aspectRatio) {
17
- return null;
17
+ if (minValue) {
18
+ return maxPx(value, minValue) ?? `max(${value}, ${minValue})`;
19
+ }
20
+ if (maxValue) {
21
+ return minPx(value, maxValue) ?? `min(${value}, ${maxValue})`;
22
+ }
23
+ return value;
24
+ }
25
+ function resolveHeightPx(info) {
26
+ const heightPx = info.height ? parsePxNumber(info.height) : null;
27
+ const minHeightPx = info.minHeight ? parsePxNumber(info.minHeight) : null;
28
+ const maxHeightPx = info.maxHeight ? parsePxNumber(info.maxHeight) : null;
29
+ if (heightPx !== null) {
30
+ let resolved = heightPx;
31
+ if (minHeightPx !== null) {
32
+ resolved = Math.max(resolved, minHeightPx);
33
+ }
34
+ if (maxHeightPx !== null) {
35
+ resolved = Math.min(resolved, maxHeightPx);
36
+ }
37
+ return resolved;
18
38
  }
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));
39
+ if (maxHeightPx !== null) {
40
+ let resolved = maxHeightPx;
41
+ if (minHeightPx !== null) {
42
+ resolved = Math.max(resolved, minHeightPx);
24
43
  }
25
- return info.height ?? info.maxHeight ?? null;
26
- })();
27
- if (!height) {
44
+ return resolved;
45
+ }
46
+ return null;
47
+ }
48
+ function computeResolvedWidth(info, aspectRatio) {
49
+ if (info.width) {
50
+ return applyMinMax(info.width, info.minWidth, info.maxWidth);
51
+ }
52
+ if (info.maxWidth) {
53
+ return info.maxWidth;
54
+ }
55
+ if (!aspectRatio) {
28
56
  return null;
29
57
  }
30
- const heightPx = parsePxNumber(height);
58
+ const heightPx = resolveHeightPx(info);
31
59
  if (heightPx === null) {
32
60
  return null;
33
61
  }
34
- return formatPx(heightPx * aspectRatio);
62
+ return applyMinMax(formatPx(heightPx * aspectRatio), info.minWidth, info.maxWidth);
63
+ }
64
+ function getBaseConstraints(info) {
65
+ return {
66
+ maxHeight: info.maxHeight,
67
+ maxWidth: info.maxWidth,
68
+ minHeight: info.minHeight,
69
+ minWidth: info.minWidth,
70
+ };
35
71
  }
36
- function buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints) {
72
+ function buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints, baseConstraints) {
37
73
  const conditions = [];
38
74
  const orderedBreakpoints = Object.entries(breakpoints).sort((a, b) => b[1] - a[1]);
39
75
  for (const [breakpoint, minWidthPx] of orderedBreakpoints) {
@@ -41,7 +77,7 @@ function buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints) {
41
77
  if (!sizeInfo) {
42
78
  continue;
43
79
  }
44
- const resolvedWidth = computeResolvedWidth(sizeInfo, aspectRatio);
80
+ const resolvedWidth = computeResolvedWidth({ ...baseConstraints, ...sizeInfo }, aspectRatio);
45
81
  if (!resolvedWidth) {
46
82
  continue;
47
83
  }
@@ -53,12 +89,16 @@ export function inferImageSizes({ className, style, ratio, baseSpacingPx = DEFAU
53
89
  const byBreakpoint = parseSizeInfoByBreakpoint(className, baseSpacingPx, breakpoints, customSpacing);
54
90
  const baseInfo = { ...(byBreakpoint.base ?? {}) };
55
91
  mergeStyleIntoSizeInfo(baseInfo, style);
56
- const aspectRatio = ratio ?? getSrcAspectRatio(src) ?? getAspectRatioFromClassName(className);
92
+ const baseConstraints = getBaseConstraints(baseInfo);
93
+ const aspectRatio = ratio ??
94
+ parseStyleAspectRatio(style?.aspectRatio) ??
95
+ getSrcAspectRatio(src) ??
96
+ getAspectRatioFromClassName(className);
57
97
  const resolvedBase = computeResolvedWidth(baseInfo, aspectRatio);
58
98
  if (!resolvedBase) {
59
99
  return null;
60
100
  }
61
- const conditions = buildBreakpointConditions({ ...byBreakpoint, base: baseInfo }, aspectRatio, breakpoints);
101
+ const conditions = buildBreakpointConditions(byBreakpoint, aspectRatio, breakpoints, baseConstraints);
62
102
  return conditions.length === 0 ? resolvedBase : `${conditions.join(", ")}, ${resolvedBase}`;
63
103
  }
64
104
  //# sourceMappingURL=infer-sizes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"infer-sizes.js","sourceRoot":"","sources":["../src/infer-sizes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"infer-sizes.js","sourceRoot":"","sources":["../src/infer-sizes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BreakpointConfig } from \"./breakpoints.js\";\nimport { DEFAULT_BREAKPOINTS } from \"./breakpoints.js\";\nimport { getAspectRatioFromClassName, getSrcAspectRatio } from \"./internal/aspect-ratio.js\";\nimport {\n formatPx,\n maxPx,\n minPx,\n parsePxNumber,\n parseStyleAspectRatio,\n} from \"./internal/css-length.js\";\nimport { mergeStyleIntoSizeInfo, parseSizeInfoByBreakpoint } from \"./internal/size-info.js\";\nimport type { InferSizesInput, SizeInfo } from \"./types.js\";\n\nconst DEFAULT_BASE_SPACING_PX = 4;\ntype SizeConstraints = Pick<SizeInfo, \"minWidth\" | \"maxWidth\" | \"minHeight\" | \"maxHeight\">;\n\nfunction applyMinMax(\n value: string,\n minValue: string | undefined,\n maxValue: string | undefined\n): string {\n if (minValue && maxValue) {\n const minPxValue = parsePxNumber(minValue);\n const maxPxValue = parsePxNumber(maxValue);\n const valuePx = parsePxNumber(value);\n if (minPxValue !== null && maxPxValue !== null && valuePx !== null) {\n const clamped = Math.min(Math.max(valuePx, minPxValue), maxPxValue);\n return formatPx(clamped);\n }\n return `clamp(${minValue}, ${value}, ${maxValue})`;\n }\n\n if (minValue) {\n return maxPx(value, minValue) ?? `max(${value}, ${minValue})`;\n }\n\n if (maxValue) {\n return minPx(value, maxValue) ?? `min(${value}, ${maxValue})`;\n }\n\n return value;\n}\n\nfunction resolveHeightPx(info: SizeInfo): number | null {\n const heightPx = info.height ? parsePxNumber(info.height) : null;\n const minHeightPx = info.minHeight ? parsePxNumber(info.minHeight) : null;\n const maxHeightPx = info.maxHeight ? parsePxNumber(info.maxHeight) : null;\n\n if (heightPx !== null) {\n let resolved = heightPx;\n if (minHeightPx !== null) {\n resolved = Math.max(resolved, minHeightPx);\n }\n if (maxHeightPx !== null) {\n resolved = Math.min(resolved, maxHeightPx);\n }\n return resolved;\n }\n\n if (maxHeightPx !== null) {\n let resolved = maxHeightPx;\n if (minHeightPx !== null) {\n resolved = Math.max(resolved, minHeightPx);\n }\n return resolved;\n }\n\n return null;\n}\n\nfunction computeResolvedWidth(info: SizeInfo, aspectRatio: number | null): string | null {\n if (info.width) {\n return applyMinMax(info.width, info.minWidth, info.maxWidth);\n }\n\n if (info.maxWidth) {\n return info.maxWidth;\n }\n\n if (!aspectRatio) {\n return null;\n }\n\n const heightPx = resolveHeightPx(info);\n if (heightPx === null) {\n return null;\n }\n\n return applyMinMax(formatPx(heightPx * aspectRatio), info.minWidth, info.maxWidth);\n}\n\nfunction getBaseConstraints(info: SizeInfo): SizeConstraints {\n return {\n maxHeight: info.maxHeight,\n maxWidth: info.maxWidth,\n minHeight: info.minHeight,\n minWidth: info.minWidth,\n };\n}\n\nfunction buildBreakpointConditions(\n byBreakpoint: Partial<Record<string, SizeInfo>>,\n aspectRatio: number | null,\n breakpoints: BreakpointConfig,\n baseConstraints: SizeConstraints\n): string[] {\n const conditions: string[] = [];\n const orderedBreakpoints = (Object.entries(breakpoints) as [string, number][]).sort(\n (a, b) => b[1] - a[1]\n );\n\n for (const [breakpoint, minWidthPx] of orderedBreakpoints) {\n const sizeInfo = byBreakpoint[breakpoint];\n if (!sizeInfo) {\n continue;\n }\n const resolvedWidth = computeResolvedWidth({ ...baseConstraints, ...sizeInfo }, aspectRatio);\n if (!resolvedWidth) {\n continue;\n }\n conditions.push(`(min-width: ${minWidthPx}px) ${resolvedWidth}`);\n }\n\n return conditions;\n}\n\n/**\n * Infer a Next.js `sizes` string from Tailwind sizing utilities applied to the wrapper.\n *\n * Supports:\n * - `size-*`, `w-*`, `min-w-*`, `max-w-*` (with responsive prefixes like `lg:`)\n * - `h-*`, `min-h-*`, `max-h-*` (for ratio-based inference)\n * - Arbitrary values: `w-[350px]`, `max-w-[calc(100vw-640px)]`\n * - Inline styles: `style={{ width: 120, minWidth: 80, aspectRatio: 1.5 }}`\n *\n * Returns `null` when inference is not possible.\n */\nexport function inferImageSizes({\n className,\n style,\n ratio,\n baseSpacingPx = DEFAULT_BASE_SPACING_PX,\n src,\n breakpoints = DEFAULT_BREAKPOINTS,\n customSpacing = {},\n}: InferSizesInput): string | null {\n const byBreakpoint = parseSizeInfoByBreakpoint(\n className,\n baseSpacingPx,\n breakpoints,\n customSpacing\n );\n\n const baseInfo: SizeInfo = { ...(byBreakpoint.base ?? {}) };\n mergeStyleIntoSizeInfo(baseInfo, style);\n\n const baseConstraints = getBaseConstraints(baseInfo);\n const aspectRatio =\n ratio ??\n parseStyleAspectRatio(style?.aspectRatio) ??\n getSrcAspectRatio(src) ??\n getAspectRatioFromClassName(className);\n\n const resolvedBase = computeResolvedWidth(baseInfo, aspectRatio);\n if (!resolvedBase) {\n return null;\n }\n\n const conditions = buildBreakpointConditions(\n byBreakpoint,\n aspectRatio,\n breakpoints,\n baseConstraints\n );\n return conditions.length === 0 ? resolvedBase : `${conditions.join(\", \")}, ${resolvedBase}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"aspect-ratio.js","sourceRoot":"","sources":["../../src/internal/aspect-ratio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aspect-ratio.js","sourceRoot":"","sources":["../../src/internal/aspect-ratio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,qBAAqB,GAAG,2CAA2C,CAAC;AAC1E,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAEjD,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IACE,aAAa,CAAC,GAAG,CAAC;QAClB,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;QAC9B,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACtB,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EACrB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,6BAA6B,CAAC,SAAiB;IACtD,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,EAAE,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IACE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC5B,SAAS,GAAG,CAAC;YACb,WAAW,GAAG,CAAC,EACf,CAAC;YACD,OAAO,SAAS,GAAG,WAAW,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtF,IACE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC5B,SAAS,GAAG,CAAC;YACb,WAAW,GAAG,CAAC,EACf,CAAC;YACD,OAAO,SAAS,GAAG,WAAW,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAA6B;IACvE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type { StaticImageData } from \"../types.js\";\nimport { WHITESPACE_REGEX } from \"./constants.js\";\nimport { parseVariantToken } from \"./tailwind-variants.js\";\n\nconst ASPECT_FRACTION_REGEX = /^aspect-(\\d+(?:\\.\\d+)?)\\/(\\d+(?:\\.\\d+)?)$/;\nconst ASPECT_BRACKET_REGEX = /^aspect-\\[(.+)\\]$/;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isStaticImageData(value: unknown): value is StaticImageData {\n if (!isPlainObject(value)) {\n return false;\n }\n return typeof value.width === \"number\" && typeof value.height === \"number\";\n}\n\nexport function getSrcAspectRatio(src: unknown): number | null {\n if (isStaticImageData(src) && src.height > 0 && src.width > 0) {\n return src.width / src.height;\n }\n\n if (\n isPlainObject(src) &&\n isStaticImageData(src.default) &&\n src.default.height > 0 &&\n src.default.width > 0\n ) {\n return src.default.width / src.default.height;\n }\n\n return null;\n}\n\nfunction parseAspectRatioFromBaseToken(baseToken: string): number | null {\n if (baseToken === \"aspect-square\") {\n return 1;\n }\n if (baseToken === \"aspect-video\") {\n return 16 / 9;\n }\n\n const fractionMatch = ASPECT_FRACTION_REGEX.exec(baseToken);\n if (fractionMatch) {\n const numerator = Number(fractionMatch[1]);\n const denominator = Number(fractionMatch[2]);\n if (\n Number.isFinite(numerator) &&\n Number.isFinite(denominator) &&\n numerator > 0 &&\n denominator > 0\n ) {\n return numerator / denominator;\n }\n return null;\n }\n\n const match = ASPECT_BRACKET_REGEX.exec(baseToken);\n if (!match) {\n return null;\n }\n\n const raw = match[1]?.replaceAll(\"_\", \" \").trim();\n if (!raw) {\n return null;\n }\n\n if (raw.includes(\"/\")) {\n const [numerator, denominator] = raw.split(\"/\", 2).map((part) => Number(part.trim()));\n if (\n Number.isFinite(numerator) &&\n Number.isFinite(denominator) &&\n numerator > 0 &&\n denominator > 0\n ) {\n return numerator / denominator;\n }\n return null;\n }\n\n const value = Number(raw);\n if (Number.isFinite(value) && value > 0) {\n return value;\n }\n\n return null;\n}\n\nexport function getAspectRatioFromClassName(className: string | undefined): number | null {\n if (!className) {\n return null;\n }\n\n for (const token of className.split(WHITESPACE_REGEX)) {\n const { base: baseToken } = parseVariantToken(token);\n const aspectRatio = parseAspectRatioFromBaseToken(baseToken);\n if (aspectRatio !== null) {\n return aspectRatio;\n }\n }\n\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"class-names.js","sourceRoot":"","sources":["../../src/internal/class-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,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,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,GAAa,EAAE,MAAiC,EAAE,KAAa;IACnF,IAAI,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,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,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"class-names.js","sourceRoot":"","sources":["../../src/internal/class-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,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,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,GAAa,EAAE,MAAiC,EAAE,KAAa;IACnF,IAAI,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,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,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC","sourcesContent":["import { WHITESPACE_REGEX } from \"./constants.js\";\nimport { isNonEmptyString } from \"./is-non-empty-string.js\";\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false;\ntype ClassNameArray = ClassNameValue[];\n\nconst MAX_NESTING_DEPTH = 10;\n\nexport function cx(...values: readonly ClassNameValue[]): string {\n if (values.length === 0) {\n return \"\";\n }\n\n const tokens: string[] = [];\n\n appendTokens(tokens, values, 0);\n\n return tokens.join(\" \");\n}\n\nfunction appendTokens(out: string[], values: readonly ClassNameValue[], depth: number) {\n if (depth > MAX_NESTING_DEPTH) {\n return;\n }\n\n for (const value of values) {\n if (!value) {\n continue;\n }\n\n if (Array.isArray(value)) {\n appendTokens(out, value, depth + 1);\n continue;\n }\n\n if (!isNonEmptyString(value)) {\n continue;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n continue;\n }\n\n out.push(...trimmed.split(WHITESPACE_REGEX));\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/internal/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAW,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/internal/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAW,KAAK,CAAC","sourcesContent":["export const WHITESPACE_REGEX: RegExp = /\\s+/;\n"]}
@@ -1,5 +1,7 @@
1
1
  export declare function parseStyleLength(value: unknown): string | null;
2
2
  export declare function parsePxNumber(length: string): number | null;
3
+ export declare function parseStyleAspectRatio(value: unknown): number | null;
3
4
  export declare function formatPx(value: number): string;
4
5
  export declare function minPx(a: string, b: string): string | null;
6
+ export declare function maxPx(a: string, b: string): string | null;
5
7
  //# sourceMappingURL=css-length.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"css-length.d.ts","sourceRoot":"","sources":["../../src/internal/css-length.ts"],"names":[],"mappings":"AAQA,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,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiCnE;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;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOzD"}
@@ -2,6 +2,8 @@ const CSS_LENGTH_LITERAL_REGEX = /^\d+(\.\d+)?(px|rem|em|vw|vh|vmin|vmax|dvw|lvw
2
2
  const CSS_FUNC_LENGTH_REGEX = /^(calc|min|max|clamp)\(.+\)$/;
3
3
  const CSS_VAR_REGEX = /^var\(.+\)$/;
4
4
  const PX_NUMBER_REGEX = /^(\d+(?:\.\d+)?)px$/;
5
+ const ASPECT_RATIO_NUMBER_REGEX = /^\d+(\.\d+)?$/;
6
+ const ASPECT_RATIO_FRACTION_REGEX = /^(\d+(?:\.\d+)?)\s*\/\s*(\d+(?:\.\d+)?)$/;
5
7
  const TRAILING_ZEROES_REGEX = /\.0+$/;
6
8
  export function parseStyleLength(value) {
7
9
  if (value === null || value === undefined) {
@@ -35,6 +37,35 @@ export function parsePxNumber(length) {
35
37
  }
36
38
  return Number(match[1]);
37
39
  }
40
+ export function parseStyleAspectRatio(value) {
41
+ if (value === null || value === undefined) {
42
+ return null;
43
+ }
44
+ if (typeof value === "number") {
45
+ return Number.isFinite(value) && value > 0 ? value : null;
46
+ }
47
+ if (typeof value !== "string") {
48
+ return null;
49
+ }
50
+ const trimmed = value.trim();
51
+ if (trimmed === "") {
52
+ return null;
53
+ }
54
+ if (ASPECT_RATIO_NUMBER_REGEX.test(trimmed)) {
55
+ const numeric = Number(trimmed);
56
+ return numeric > 0 ? numeric : null;
57
+ }
58
+ const fractionMatch = ASPECT_RATIO_FRACTION_REGEX.exec(trimmed);
59
+ if (!fractionMatch) {
60
+ return null;
61
+ }
62
+ const numerator = Number(fractionMatch[1]);
63
+ const denominator = Number(fractionMatch[2]);
64
+ if (!(Number.isFinite(numerator) && Number.isFinite(denominator)) || denominator <= 0) {
65
+ return null;
66
+ }
67
+ return numerator / denominator;
68
+ }
38
69
  export function formatPx(value) {
39
70
  const rounded = Math.round(value * 1000) / 1000;
40
71
  return `${String(rounded).replace(TRAILING_ZEROES_REGEX, "")}px`;
@@ -47,4 +78,12 @@ export function minPx(a, b) {
47
78
  }
48
79
  return formatPx(Math.min(firstPx, secondPx));
49
80
  }
81
+ export function maxPx(a, b) {
82
+ const firstPx = parsePxNumber(a);
83
+ const secondPx = parsePxNumber(b);
84
+ if (firstPx === null || secondPx === null) {
85
+ return null;
86
+ }
87
+ return formatPx(Math.max(firstPx, secondPx));
88
+ }
50
89
  //# sourceMappingURL=css-length.js.map
@@ -1 +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,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"css-length.js","sourceRoot":"","sources":["../../src/internal/css-length.ts"],"names":[],"mappings":"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","sourcesContent":["const CSS_LENGTH_LITERAL_REGEX = /^\\d+(\\.\\d+)?(px|rem|em|vw|vh|vmin|vmax|dvw|lvw|svw|dvh|lvh|svh)$/;\nconst CSS_FUNC_LENGTH_REGEX = /^(calc|min|max|clamp)\\(.+\\)$/;\nconst CSS_VAR_REGEX = /^var\\(.+\\)$/;\nconst PX_NUMBER_REGEX = /^(\\d+(?:\\.\\d+)?)px$/;\nconst ASPECT_RATIO_NUMBER_REGEX = /^\\d+(\\.\\d+)?$/;\nconst ASPECT_RATIO_FRACTION_REGEX = /^(\\d+(?:\\.\\d+)?)\\s*\\/\\s*(\\d+(?:\\.\\d+)?)$/;\nconst TRAILING_ZEROES_REGEX = /\\.0+$/;\n\nexport function parseStyleLength(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === \"number\") {\n return `${value}px`;\n }\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (trimmed === \"\" || trimmed === \"auto\") {\n return null;\n }\n\n if (CSS_LENGTH_LITERAL_REGEX.test(trimmed)) {\n return trimmed;\n }\n if (CSS_FUNC_LENGTH_REGEX.test(trimmed)) {\n return trimmed;\n }\n if (CSS_VAR_REGEX.test(trimmed)) {\n return trimmed;\n }\n\n return null;\n}\n\nexport function parsePxNumber(length: string): number | null {\n const match = PX_NUMBER_REGEX.exec(length);\n if (!match) {\n return null;\n }\n return Number(match[1]);\n}\n\nexport function parseStyleAspectRatio(value: unknown): number | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value > 0 ? value : null;\n }\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (trimmed === \"\") {\n return null;\n }\n\n if (ASPECT_RATIO_NUMBER_REGEX.test(trimmed)) {\n const numeric = Number(trimmed);\n return numeric > 0 ? numeric : null;\n }\n\n const fractionMatch = ASPECT_RATIO_FRACTION_REGEX.exec(trimmed);\n if (!fractionMatch) {\n return null;\n }\n\n const numerator = Number(fractionMatch[1]);\n const denominator = Number(fractionMatch[2]);\n if (!(Number.isFinite(numerator) && Number.isFinite(denominator)) || denominator <= 0) {\n return null;\n }\n\n return numerator / denominator;\n}\n\nexport function formatPx(value: number): string {\n const rounded = Math.round(value * 1000) / 1000;\n return `${String(rounded).replace(TRAILING_ZEROES_REGEX, \"\")}px`;\n}\n\nexport function minPx(a: string, b: string): string | null {\n const firstPx = parsePxNumber(a);\n const secondPx = parsePxNumber(b);\n if (firstPx === null || secondPx === null) {\n return null;\n }\n return formatPx(Math.min(firstPx, secondPx));\n}\n\nexport function maxPx(a: string, b: string): string | null {\n const firstPx = parsePxNumber(a);\n const secondPx = parsePxNumber(b);\n if (firstPx === null || secondPx === null) {\n return null;\n }\n return formatPx(Math.max(firstPx, secondPx));\n}\n"]}
@@ -1 +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"}
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","sourcesContent":["export function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n"]}
@@ -1 +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,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM7D,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AA+CrC,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"}
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,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM7D,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AA6DrC,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,QA8BxF"}
@@ -4,8 +4,10 @@ import { parseTailwindLength } from "./tailwind-length.js";
4
4
  import { getBreakpoint, parseVariantToken } from "./tailwind-variants.js";
5
5
  const SIZE_REGEX = /^size-(.+)$/;
6
6
  const WIDTH_REGEX = /^w-(.+)$/;
7
+ const MIN_WIDTH_REGEX = /^min-w-(.+)$/;
7
8
  const MAX_WIDTH_REGEX = /^max-w-(.+)$/;
8
9
  const HEIGHT_REGEX = /^h-(.+)$/;
10
+ const MIN_HEIGHT_REGEX = /^min-h-(.+)$/;
9
11
  const MAX_HEIGHT_REGEX = /^max-h-(.+)$/;
10
12
  const SIZING_HANDLERS = [
11
13
  {
@@ -21,6 +23,12 @@ const SIZING_HANDLERS = [
21
23
  },
22
24
  regex: WIDTH_REGEX,
23
25
  },
26
+ {
27
+ apply: (info, value) => {
28
+ info.minWidth = value;
29
+ },
30
+ regex: MIN_WIDTH_REGEX,
31
+ },
24
32
  {
25
33
  apply: (info, value) => {
26
34
  info.maxWidth = value;
@@ -33,6 +41,12 @@ const SIZING_HANDLERS = [
33
41
  },
34
42
  regex: HEIGHT_REGEX,
35
43
  },
44
+ {
45
+ apply: (info, value) => {
46
+ info.minHeight = value;
47
+ },
48
+ regex: MIN_HEIGHT_REGEX,
49
+ },
36
50
  {
37
51
  apply: (info, value) => {
38
52
  info.maxHeight = value;
@@ -71,18 +85,26 @@ export function mergeStyleIntoSizeInfo(info, style) {
71
85
  return;
72
86
  }
73
87
  const styleWidth = parseStyleLength(style.width);
88
+ const styleMinWidth = parseStyleLength(style.minWidth);
74
89
  const styleMaxWidth = parseStyleLength(style.maxWidth);
75
90
  const styleHeight = parseStyleLength(style.height);
91
+ const styleMinHeight = parseStyleLength(style.minHeight);
76
92
  const styleMaxHeight = parseStyleLength(style.maxHeight);
77
93
  if (styleWidth) {
78
94
  info.width = styleWidth;
79
95
  }
96
+ if (styleMinWidth) {
97
+ info.minWidth = styleMinWidth;
98
+ }
80
99
  if (styleMaxWidth) {
81
100
  info.maxWidth = styleMaxWidth;
82
101
  }
83
102
  if (styleHeight) {
84
103
  info.height = styleHeight;
85
104
  }
105
+ if (styleMinHeight) {
106
+ info.minHeight = styleMinHeight;
107
+ }
86
108
  if (styleMaxHeight) {
87
109
  info.maxHeight = styleMaxHeight;
88
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"size-info.js","sourceRoot":"","sources":["../../src/internal/size-info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"size-info.js","sourceRoot":"","sources":["../../src/internal/size-info.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BreakpointConfig } from \"../breakpoints.js\";\nimport type { InferSizesStyle, SizeInfo } from \"../types.js\";\nimport { WHITESPACE_REGEX } from \"./constants.js\";\nimport { parseStyleLength } from \"./css-length.js\";\nimport { parseTailwindLength } from \"./tailwind-length.js\";\nimport { getBreakpoint, parseVariantToken } from \"./tailwind-variants.js\";\n\ntype BreakpointKey = string | \"base\";\n\nconst SIZE_REGEX = /^size-(.+)$/;\nconst WIDTH_REGEX = /^w-(.+)$/;\nconst MIN_WIDTH_REGEX = /^min-w-(.+)$/;\nconst MAX_WIDTH_REGEX = /^max-w-(.+)$/;\nconst HEIGHT_REGEX = /^h-(.+)$/;\nconst MIN_HEIGHT_REGEX = /^min-h-(.+)$/;\nconst MAX_HEIGHT_REGEX = /^max-h-(.+)$/;\n\ntype SizingHandler = {\n apply: (info: SizeInfo, value: string) => void;\n regex: RegExp;\n};\n\nconst SIZING_HANDLERS = [\n {\n apply: (info, value) => {\n info.width = value;\n info.height = value;\n },\n regex: SIZE_REGEX,\n },\n {\n apply: (info, value) => {\n info.width = value;\n },\n regex: WIDTH_REGEX,\n },\n {\n apply: (info, value) => {\n info.minWidth = value;\n },\n regex: MIN_WIDTH_REGEX,\n },\n {\n apply: (info, value) => {\n info.maxWidth = value;\n },\n regex: MAX_WIDTH_REGEX,\n },\n {\n apply: (info, value) => {\n info.height = value;\n },\n regex: HEIGHT_REGEX,\n },\n {\n apply: (info, value) => {\n info.minHeight = value;\n },\n regex: MIN_HEIGHT_REGEX,\n },\n {\n apply: (info, value) => {\n info.maxHeight = value;\n },\n regex: MAX_HEIGHT_REGEX,\n },\n] satisfies readonly SizingHandler[];\n\nexport function parseSizeInfoByBreakpoint(\n className: string | undefined,\n baseSpacingPx: number,\n breakpoints: BreakpointConfig,\n customSpacing: Record<string, string> = {}\n): Partial<Record<BreakpointKey, SizeInfo>> {\n const byBreakpoint: Partial<Record<BreakpointKey, SizeInfo>> = {};\n if (!className) {\n return byBreakpoint;\n }\n\n for (const token of className.split(WHITESPACE_REGEX)) {\n if (!token) {\n continue;\n }\n\n const { base: baseToken, variants } = parseVariantToken(token);\n const breakpoint = getBreakpoint(variants, breakpoints);\n const key: BreakpointKey = breakpoint ?? \"base\";\n\n const existing = byBreakpoint[key] ?? {};\n const didApply = applySizingToken({\n baseSpacingPx,\n baseToken,\n breakpoints,\n customSpacing,\n info: existing,\n });\n if (didApply) {\n byBreakpoint[key] = existing;\n }\n }\n\n return byBreakpoint;\n}\n\nexport function mergeStyleIntoSizeInfo(info: SizeInfo, style: InferSizesStyle | undefined) {\n if (!style) {\n return;\n }\n\n const styleWidth = parseStyleLength(style.width);\n const styleMinWidth = parseStyleLength(style.minWidth);\n const styleMaxWidth = parseStyleLength(style.maxWidth);\n const styleHeight = parseStyleLength(style.height);\n const styleMinHeight = parseStyleLength(style.minHeight);\n const styleMaxHeight = parseStyleLength(style.maxHeight);\n\n if (styleWidth) {\n info.width = styleWidth;\n }\n if (styleMinWidth) {\n info.minWidth = styleMinWidth;\n }\n if (styleMaxWidth) {\n info.maxWidth = styleMaxWidth;\n }\n if (styleHeight) {\n info.height = styleHeight;\n }\n if (styleMinHeight) {\n info.minHeight = styleMinHeight;\n }\n if (styleMaxHeight) {\n info.maxHeight = styleMaxHeight;\n }\n}\n\ntype ApplySizingOptions = {\n baseSpacingPx: number;\n baseToken: string;\n breakpoints: BreakpointConfig;\n customSpacing: Record<string, string>;\n info: SizeInfo;\n};\n\nfunction applySizingToken({\n baseSpacingPx,\n baseToken,\n breakpoints,\n customSpacing,\n info,\n}: ApplySizingOptions): boolean {\n for (const handler of SIZING_HANDLERS) {\n const match = handler.regex.exec(baseToken);\n if (!match) {\n continue;\n }\n\n const parsed = parseTailwindLength(match[1] ?? \"\", baseSpacingPx, breakpoints, customSpacing);\n if (!parsed) {\n return false;\n }\n\n handler.apply(info, parsed);\n return true;\n }\n\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-length.js","sourceRoot":"","sources":["../../src/internal/tailwind-length.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tailwind-length.js","sourceRoot":"","sources":["../../src/internal/tailwind-length.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,aAAqB,EACrB,WAA6B,EAC7B,gBAAwC,EAAE;IAE1C,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oCAAoC,CAAC,GAAG,EAAE,aAAa,CAAC;QACxD,6BAA6B,CAAC,GAAG,EAAE,WAAW,CAAC;QAC/C,+BAA+B,CAAC,GAAG,CAAC;QACpC,+BAA+B,CAAC,GAAG,CAAC;QACpC,wCAAwC,CAAC,GAAG,CAAC;QAC7C,sCAAsC,CAAC,GAAG,CAAC;QAC3C,kCAAkC,CAAC,GAAG,EAAE,aAAa,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,SAAS,oCAAoC,CAC3C,GAAW,EACX,aAAqC;IAErC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW,EAAE,WAA6B;IAC/E,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,+BAA+B,CAAC,GAAW;IAClD,IACE,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,KAAK;QACb,GAAG,KAAK,KAAK,EACb,CAAC;QACD,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,+BAA+B,CAAC,GAAW;IAClD,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,GAAG,SAAS,GAAG,CAAC;AACzB,CAAC;AAED,SAAS,wCAAwC,CAAC,GAAW;IAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED,SAAS,sCAAsC,CAAC,GAAW;IACzD,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,KAAK,GAAG,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kCAAkC,CAAC,GAAW,EAAE,aAAqB;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import type { BreakpointConfig } from \"../breakpoints.js\";\nimport { formatPx } from \"./css-length.js\";\n\nconst TRAILING_ZEROES_REGEX = /\\.0+$/;\n\nexport function parseTailwindLength(\n raw: string,\n baseSpacingPx: number,\n breakpoints: BreakpointConfig,\n customSpacing: Record<string, string> = {}\n): string | null {\n if (raw === \"auto\" || raw === \"full\") {\n return null;\n }\n\n return (\n parseTailwindLengthFromCustomSpacing(raw, customSpacing) ??\n parseTailwindLengthFromScreen(raw, breakpoints) ??\n parseTailwindLengthFromViewport(raw) ??\n parseTailwindLengthFromFraction(raw) ??\n parseTailwindLengthFromArbitraryBrackets(raw) ??\n parseTailwindLengthFromArbitraryParens(raw) ??\n parseTailwindLengthFromSpacingUnit(raw, baseSpacingPx)\n );\n}\n\nfunction parseTailwindLengthFromCustomSpacing(\n raw: string,\n customSpacing: Record<string, string>\n): string | null {\n if (raw in customSpacing) {\n return customSpacing[raw];\n }\n if (raw === \"px\") {\n return \"1px\";\n }\n return null;\n}\n\nfunction parseTailwindLengthFromScreen(raw: string, breakpoints: BreakpointConfig): string | null {\n if (raw === \"screen\") {\n return \"100vw\";\n }\n if (!raw.startsWith(\"screen-\")) {\n return null;\n }\n\n const breakpoint = raw.slice(\"screen-\".length);\n if (!(breakpoint in breakpoints)) {\n return null;\n }\n\n return `${breakpoints[breakpoint]}px`;\n}\n\nfunction parseTailwindLengthFromViewport(raw: string): string | null {\n if (\n raw === \"dvw\" ||\n raw === \"lvw\" ||\n raw === \"svw\" ||\n raw === \"dvh\" ||\n raw === \"lvh\" ||\n raw === \"svh\"\n ) {\n return `100${raw}`;\n }\n return null;\n}\n\nfunction parseTailwindLengthFromFraction(raw: string): string | null {\n const [numeratorRaw, denominatorRaw] = raw.split(\"/\", 2);\n if (numeratorRaw === undefined || denominatorRaw === undefined) {\n return null;\n }\n\n const numerator = Number(numeratorRaw);\n const denominator = Number(denominatorRaw);\n if (!(Number.isFinite(numerator) && Number.isFinite(denominator)) || denominator === 0) {\n return null;\n }\n\n const percent = (numerator / denominator) * 100;\n if (!Number.isFinite(percent)) {\n return null;\n }\n\n const rounded = Math.round(percent * 1_000_000) / 1_000_000;\n const formatted = String(rounded).replace(TRAILING_ZEROES_REGEX, \"\");\n return `${formatted}%`;\n}\n\nfunction parseTailwindLengthFromArbitraryBrackets(raw: string): string | null {\n if (!(raw.startsWith(\"[\") && raw.endsWith(\"]\"))) {\n return null;\n }\n\n const inner = raw.slice(1, -1).replaceAll(\"_\", \" \").trim();\n return inner === \"\" ? null : inner;\n}\n\nfunction parseTailwindLengthFromArbitraryParens(raw: string): string | null {\n if (!(raw.startsWith(\"(\") && raw.endsWith(\")\"))) {\n return null;\n }\n\n const inner = raw.slice(1, -1).trim();\n if (inner === \"\") {\n return null;\n }\n if (inner.startsWith(\"--\")) {\n return `var(${inner})`;\n }\n return inner;\n}\n\nfunction parseTailwindLengthFromSpacingUnit(raw: string, baseSpacingPx: number): string | null {\n const numberValue = Number(raw);\n if (!Number.isFinite(numberValue) || numberValue < 0) {\n return null;\n }\n return formatPx(numberValue * baseSpacingPx);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-variants.js","sourceRoot":"","sources":["../../src/internal/tailwind-variants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tailwind-variants.js","sourceRoot":"","sources":["../../src/internal/tailwind-variants.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BreakpointConfig } from \"../breakpoints.js\";\n\ntype VariantSplitState = {\n bracketDepth: number;\n current: string;\n parenDepth: number;\n parts: string[];\n};\n\nfunction splitVariantsAndBase(token: string): string[] {\n const state: VariantSplitState = { bracketDepth: 0, current: \"\", parenDepth: 0, parts: [] };\n\n for (const char of token) {\n state.bracketDepth = nextBracketDepth(state.bracketDepth, state.parenDepth, char);\n state.parenDepth = nextParenDepth(state.parenDepth, state.bracketDepth, char);\n\n if (char === \":\" && state.bracketDepth === 0 && state.parenDepth === 0) {\n state.parts.push(state.current);\n state.current = \"\";\n continue;\n }\n\n state.current += char;\n }\n\n state.parts.push(state.current);\n return state.parts;\n}\n\nfunction nextBracketDepth(current: number, parenDepth: number, char: string): number {\n if (parenDepth !== 0) {\n return current;\n }\n if (char === \"[\") {\n return current + 1;\n }\n if (char === \"]\" && current > 0) {\n return current - 1;\n }\n return current;\n}\n\nfunction nextParenDepth(current: number, bracketDepth: number, char: string): number {\n if (bracketDepth !== 0) {\n return current;\n }\n if (char === \"(\") {\n return current + 1;\n }\n if (char === \")\" && current > 0) {\n return current - 1;\n }\n return current;\n}\n\nexport function parseVariantToken(token: string): { base: string; variants: string[] } {\n if (!token.includes(\":\")) {\n return { base: token, variants: [] };\n }\n\n const parts = splitVariantsAndBase(token);\n\n if (parts.length <= 1) {\n return { base: token, variants: [] };\n }\n\n if (parts.some((part) => part === \"\")) {\n return { base: token, variants: [] };\n }\n\n const base = parts.at(-1) ?? token;\n const variants = parts.slice(0, -1).filter(Boolean);\n return { base, variants };\n}\n\nexport function getBreakpoint(variants: string[], breakpoints: BreakpointConfig): string | null {\n for (const variant of variants) {\n if (variant in breakpoints) {\n return variant;\n }\n }\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"create-smart-image.js","sourceRoot":"","sources":["../../src/smart-image/create-smart-image.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-smart-image.js","sourceRoot":"","sources":["../../src/smart-image/create-smart-image.tsx"],"names":[],"mappings":"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","sourcesContent":["import NextImage from \"next/image.js\";\nimport type { CSSProperties } from \"react\";\n\nimport { inferImageSizes } from \"../infer-sizes.js\";\nimport { cx as defaultCx } from \"../internal/class-names.js\";\nimport type { CreateSmartImageOptions, SmartImageComponent } from \"./create-smart-image.types.js\";\nimport { getAltFromSrc } from \"./get-alt-from-src.js\";\nimport type { SmartImageProps } from \"./smart-image.types.js\";\n\nconst HAS_HEIGHT_OR_ASPECT_CLASS_REGEX = /(^|\\s)(size-|h-|max-h-|aspect-)/;\n\nfunction inferAltText({\n alt,\n ariaHidden,\n src,\n}: {\n alt: string | undefined;\n ariaHidden: unknown;\n src: unknown;\n}): string {\n if (alt !== undefined) {\n return alt;\n }\n const isAriaHidden = ariaHidden === true || ariaHidden === \"true\";\n if (isAriaHidden) {\n return \"\";\n }\n return getAltFromSrc(typeof src === \"string\" ? src : \"\");\n}\n\nfunction warnMissingLayoutSizing({\n className,\n ratio,\n style,\n shouldWarn,\n didWarn,\n}: {\n className: string | undefined;\n ratio: number | undefined;\n style: CSSProperties | undefined;\n shouldWarn: boolean;\n didWarn: boolean;\n}): boolean {\n if (!shouldWarn || didWarn) {\n return didWarn;\n }\n\n const classTokens = className ?? \"\";\n const hasHeightOrAspectClass = HAS_HEIGHT_OR_ASPECT_CLASS_REGEX.test(classTokens);\n const hasHeightOrAspectStyle = Boolean(style?.height || style?.maxHeight || style?.aspectRatio);\n\n if (hasHeightOrAspectClass || hasHeightOrAspectStyle || ratio) {\n return didWarn;\n }\n\n console.warn(\n \"SmartImage: `fill` requires the wrapper to have a height. \" +\n \"Use `size-*`/`h-*`, an `aspect-*` class, inline `style={{ aspectRatio }}`, or pass `ratio`.\"\n );\n return true;\n}\n\n/**\n * Create a `SmartImage` component with an injected `cx` implementation.\n *\n * This is the recommended integration pattern for design systems which:\n * - configure `tailwind-merge` with custom theme tokens, or\n * - want strict \"last class wins\" conflict resolution for wrapper/img classes.\n *\n * @remarks\n * Each factory instance maintains its own warning state. The missing-layout-sizing\n * warning fires only once per factory instance (not per render) to prevent console spam.\n * Call `createSmartImage()` multiple times if you need independent warning behavior.\n */\nexport function createSmartImage(options: CreateSmartImageOptions = {}): SmartImageComponent {\n const cx = options.cx ?? defaultCx;\n const baseWrapperClassName = options.wrapperClassName ?? \"relative inline-block\";\n const baseImgClassName = options.imgClassName ?? \"object-contain\";\n\n let didWarnMissingLayoutSizing = false;\n\n return function SmartImage<\n C extends string | undefined = undefined,\n S extends CSSProperties | undefined = undefined,\n >({\n alt,\n className,\n imgClassName,\n imgStyle,\n ratio,\n sizes,\n src,\n style,\n ...props\n }: SmartImageProps<C, S>) {\n const derivedAlt = inferAltText({ alt, ariaHidden: props[\"aria-hidden\"], src });\n const inferredSizes = sizes ?? inferImageSizes({ className, ratio, src, style });\n\n didWarnMissingLayoutSizing = warnMissingLayoutSizing({\n className,\n didWarn: didWarnMissingLayoutSizing,\n ratio,\n shouldWarn: process.env.NODE_ENV !== \"production\",\n style,\n });\n\n if (!inferredSizes && process.env.NODE_ENV !== \"production\") {\n throw new Error(\n \"SmartImage: missing `sizes` and couldn't infer from className/style. \" +\n \"Add Tailwind sizing classes (size-*, w-*, max-w-*) or pass `sizes` explicitly.\"\n );\n }\n\n return (\n <span className={cx(baseWrapperClassName, className)} style={style}>\n <NextImage\n {...props}\n alt={derivedAlt}\n className={cx(baseImgClassName, imgClassName)}\n fill\n sizes={inferredSizes ?? \"100vw\"}\n src={src}\n style={imgStyle}\n />\n </span>\n );\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"create-smart-image.types.js","sourceRoot":"","sources":["../../src/smart-image/create-smart-image.types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"create-smart-image.types.js","sourceRoot":"","sources":["../../src/smart-image/create-smart-image.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CSSProperties } from \"react\";\n\nimport type { ClassNameValue } from \"../internal/class-names.js\";\nimport type { SmartImageProps } from \"./smart-image.types.js\";\n\nexport type SmartImageClassNameFn = (...values: readonly ClassNameValue[]) => string;\n\nexport type CreateSmartImageOptions = {\n /**\n * How to combine/merge class names.\n *\n * Pass a custom `tailwind-merge` instance (e.g. from `extendTailwindMerge`) if your project extends Tailwind tokens\n * (like `max-w-container`, `px-edge`, etc.) and you want \"last class wins\" semantics.\n */\n cx?: SmartImageClassNameFn;\n /** Base classes applied to the wrapper element. */\n wrapperClassName?: ClassNameValue;\n /** Base classes applied to the underlying `<img>`. */\n imgClassName?: ClassNameValue;\n};\n\nexport type SmartImageComponent = <\n C extends string | undefined = undefined,\n S extends CSSProperties | undefined = undefined,\n>(\n props: SmartImageProps<C, S>\n) => React.ReactElement;\n"]}
@@ -1 +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"}
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","sourcesContent":["const FILE_EXT_REGEX = /\\.[^.]+$/;\n\n/**\n * Extracts alt text from an image src path.\n * Returns the filename without extension.\n */\nexport function getAltFromSrc(src: string): string {\n const filename = src.split(\"/\").pop() ?? \"\";\n return filename.replace(FILE_EXT_REGEX, \"\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/smart-image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/smart-image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { createSmartImage } from \"./create-smart-image.js\";\nexport type {\n CreateSmartImageOptions,\n SmartImageClassNameFn,\n SmartImageComponent,\n} from \"./create-smart-image.types.js\";\nexport { SmartImage } from \"./smart-image.js\";\nexport type { SmartImageProps } from \"./smart-image.types.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"smart-image.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;AAc1C,MAAM,UAAU,UAAU,CAGxB,KAA4B;IAC5B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"smart-image.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;AAc1C,MAAM,UAAU,UAAU,CAGxB,KAA4B;IAC5B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["import type { CSSProperties } from \"react\";\n\nimport { createSmartImage } from \"./create-smart-image.js\";\nimport type { SmartImageProps } from \"./smart-image.types.js\";\n\nconst SmartImageImpl = createSmartImage();\n\n/**\n * A Tailwind-first wrapper around `next/image`:\n * - Never requires `width`/`height`\n * - Always uses `fill`\n * - Infers a correct `sizes` attribute from Tailwind sizing classes\n *\n * @example\n * ```tsx\n * <SmartImage src=\"/logo.png\" className=\"size-11\" />\n * <SmartImage src=\"/hero.webp\" className=\"w-full max-w-80\" sizes=\"(min-width: 1024px) 640px, 100vw\" />\n * ```\n */\nexport function SmartImage<\n C extends string | undefined = undefined,\n S extends CSSProperties | undefined = undefined,\n>(props: SmartImageProps<C, S>) {\n return SmartImageImpl(props);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"smart-image.types.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"smart-image.types.js","sourceRoot":"","sources":["../../src/smart-image/smart-image.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ImageProps as NextImageProps } from \"next/image.js\";\nimport type { CSSProperties } from \"react\";\n\n// Inlined from type-fest to avoid runtime dependency\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\ntype IsStringLiteral<T> = T extends string ? (string extends T ? false : true) : false;\ntype RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &\n { [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>> }[Keys];\n\ntype NextImageBaseProps = Omit<\n NextImageProps,\n \"alt\" | \"className\" | \"fill\" | \"height\" | \"sizes\" | \"style\" | \"width\"\n>;\n\ntype InferableTailwindLengthValue =\n | `${number}`\n | `[${string}]`\n | `(${string})`\n | \"container\"\n | \"edge\"\n | \"dvh\"\n | \"dvw\"\n | \"lvh\"\n | \"lvw\"\n | \"px\"\n | \"screen\"\n | \"svh\"\n | \"svw\"\n | `screen-${string}`;\n\ntype HasInferableClassSizingToken<C extends string> = C extends\n | `${string}size-${InferableTailwindLengthValue}${string}`\n | `${string}w-${InferableTailwindLengthValue}${string}`\n | `${string}max-w-${InferableTailwindLengthValue}${string}`\n ? true\n : false;\n\ntype IsBroadStyle<S> = [NonNullable<S>] extends [CSSProperties]\n ? CSSProperties extends NonNullable<S>\n ? true\n : false\n : false;\n\ntype CanInferFromClassName<C> = [NonNullable<C>] extends [string]\n ? IsStringLiteral<NonNullable<C>> extends true\n ? HasInferableClassSizingToken<NonNullable<C>>\n : false\n : false;\n\ntype InferableStyle = RequireAtLeastOne<CSSProperties, \"maxWidth\" | \"width\">;\n\ntype CanInferFromStyle<S> = [NonNullable<S>] extends [CSSProperties]\n ? IsBroadStyle<S> extends true\n ? false\n : NonNullable<S> extends InferableStyle\n ? true\n : false\n : false;\n\ntype SizesConstraint<C, S> =\n | { sizes: string }\n | (CanInferFromClassName<C> extends true ? { sizes?: string } : never)\n | (CanInferFromStyle<S> extends true ? { sizes?: string } : never)\n | ([NonNullable<C>] extends [string]\n ? IsStringLiteral<NonNullable<C>> extends false\n ? { sizes?: string }\n : never\n : never)\n | (IsBroadStyle<S> extends true ? { sizes?: string } : never);\n\nexport type SmartImageProps<\n C extends string | undefined = undefined,\n S extends CSSProperties | undefined = undefined,\n> = Simplify<\n NextImageBaseProps & {\n /** Alt text. If omitted, derived from src filename or empty for aria-hidden. */\n alt?: string;\n /** Classes for wrapper element. Use Tailwind sizing utilities here. */\n className?: C;\n /** Inline styles for wrapper element. */\n style?: S;\n /** Classes for underlying img. Use object-*, filters, etc. */\n imgClassName?: string;\n /** Inline styles for underlying img. */\n imgStyle?: NextImageProps[\"style\"];\n /** Width/height ratio for height-only layouts. */\n ratio?: number;\n /** Image sizes. Required unless className/style are statically inferable. */\n sizes?: string;\n } & SizesConstraint<C, S>\n>;\n"]}
package/dist/types.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import type { BreakpointConfig } from "./breakpoints.js";
2
2
  export type InferSizesStyle = Partial<{
3
+ aspectRatio: number | string | null | undefined;
3
4
  width: number | string | null | undefined;
5
+ minWidth: number | string | null | undefined;
4
6
  maxWidth: number | string | null | undefined;
5
7
  height: number | string | null | undefined;
8
+ minHeight: number | string | null | undefined;
6
9
  maxHeight: number | string | null | undefined;
7
10
  }>;
8
11
  export type InferSizesInput = {
@@ -16,7 +19,9 @@ export type InferSizesInput = {
16
19
  };
17
20
  export type SizeInfo = {
18
21
  height?: string;
22
+ minHeight?: string;
19
23
  maxHeight?: string;
24
+ minWidth?: string;
20
25
  maxWidth?: string;
21
26
  width?: string;
22
27
  };
@@ -1 +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,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;IAMvC,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"}
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,eAAe,GAAG,OAAO,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,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;IAC9C,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;IAMvC,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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { BreakpointConfig } from \"./breakpoints.js\";\n\nexport type InferSizesStyle = Partial<{\n aspectRatio: number | string | null | undefined;\n width: number | string | null | undefined;\n minWidth: number | string | null | undefined;\n maxWidth: number | string | null | undefined;\n height: number | string | null | undefined;\n minHeight: number | string | null | undefined;\n maxHeight: number | string | null | undefined;\n}>;\n\nexport type InferSizesInput = {\n /**\n * Optional override for Tailwind's base spacing unit in px.\n * Tailwind v4 defaults to 4px (0.25rem).\n */\n baseSpacingPx?: number;\n /**\n * Optional custom breakpoints configuration.\n * Defaults to standard Tailwind CSS v4 breakpoints.\n */\n breakpoints?: BreakpointConfig;\n className?: string;\n /**\n * Optional custom spacing values (e.g., `{ container: \"1312px\" }`).\n * Used for named Tailwind utilities like `w-container`.\n */\n customSpacing?: Record<string, string>;\n /**\n * Optional width-to-height ratio (e.g., `16 / 9` for landscape, `9 / 16` for portrait).\n * Used only when width is not inferable but height is.\n * This is a last-resort escape hatch for layouts like `h-10 w-auto`.\n */\n ratio?: number;\n /**\n * Optional image src (e.g. imported static image) used to infer aspect ratio.\n */\n src?: unknown;\n style?: InferSizesStyle;\n};\n\nexport type SizeInfo = {\n height?: string;\n minHeight?: string;\n maxHeight?: string;\n minWidth?: string;\n maxWidth?: string;\n width?: string;\n};\n\nexport type StaticImageData = {\n height: number;\n width: number;\n};\n"]}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "sideEffects": false,
8
8
  "type": "module",
9
9
  "types": "./dist/index.d.ts",
10
- "version": "1.0.0",
10
+ "version": "1.1.0",
11
11
  "files": [
12
12
  "dist/**",
13
13
  "CHANGELOG.md"
@@ -28,8 +28,8 @@
28
28
  "url": "https://github.com/PaulRBerg/tw-next-image/issues"
29
29
  },
30
30
  "devDependencies": {
31
- "@biomejs/biome": "^2.3.10",
32
- "@sablier/devkit": "^1.10.0",
31
+ "@biomejs/biome": "^2.3.12",
32
+ "@sablier/devkit": "^1.12.1",
33
33
  "@testing-library/jest-dom": "^6.9.1",
34
34
  "@testing-library/react": "^16.3.1",
35
35
  "@types/node": "^25.0.3",
@@ -38,11 +38,11 @@
38
38
  "husky": "^9.1.7",
39
39
  "jsdom": "^27.3.0",
40
40
  "lint-staged": "^16.2.7",
41
- "next": "^16.0.10",
41
+ "next": "^16.0.14",
42
42
  "prettier": "^3.7.4",
43
43
  "react": "^19.2.3",
44
44
  "typescript": "^5.9.3",
45
- "ultracite": "^6.4.2",
45
+ "ultracite": "^7.0.12",
46
46
  "vitest": "^4.0.16"
47
47
  },
48
48
  "exports": {