tailwind-styled-v4 5.1.31 → 5.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -52,8 +52,22 @@ interface SubComponentConfig {
52
52
  class: string;
53
53
  [key: string]: string;
54
54
  }>;
55
+ /**
56
+ * Override HTML tag untuk direct sub-component (bare key + base/variants).
57
+ * Default: "div" kalau tidak diset (backward-compatible).
58
+ * @example canvas: { tag: "section", base: "...", variants: {...} }
59
+ */
60
+ tag?: HtmlTagName;
55
61
  }
56
- type SubValue = string | Record<string, string | SubComponentConfig>;
62
+ type SubValue = string | SubComponentConfig | Record<string, string | SubComponentConfig>;
63
+ /**
64
+ * Mirror dari disambiguation logic runtime di createComponent.ts (registerSubComponents):
65
+ * `"base" in value || "variants" in value`
66
+ * Kalau bare-key punya property "base"/"variants" langsung, value itu adalah
67
+ * SubComponentConfig untuk key itu sendiri — bukan map { namaSubkomponen: classes }.
68
+ * Contoh: `canvas: { base: "...", variants: {...} }` → key "canvas" ITU sendiri nama sub-component.
69
+ */
70
+ type IsDirectSubConfig<T> = T extends object ? ("base" extends keyof T ? true : "variants" extends keyof T ? true : false) : false;
57
71
  /**
58
72
  * Boolean props yang di-resolve via bitmask lookup table (pre-generated di build time).
59
73
  * Berbeda dari `state` (CSS data-attribute driven) — ini adalah React props boolean.
@@ -148,7 +162,7 @@ type ExtractSubName<K extends string> = K extends `${string}:${infer Name}` ? Na
148
162
  type InferSubFromConfig<C extends ComponentConfig> = C extends {
149
163
  sub: infer S extends Record<string, SubValue>;
150
164
  } ? {
151
- [K in keyof S]: S[K] extends string ? K extends string ? ExtractSubName<K> : never : S[K] extends Record<infer N extends string, string> ? N : never;
165
+ [K in keyof S]: S[K] extends string ? K extends string ? ExtractSubName<K> : never : IsDirectSubConfig<S[K]> extends true ? K : S[K] extends Record<infer N extends string, string | SubComponentConfig> ? N : never;
152
166
  }[keyof S] : never;
153
167
  /**
154
168
  * HTML tags yang otomatis dikenali sebagai tag dari bare sub-key (tanpa "tag:name" syntax).
@@ -182,8 +196,14 @@ type InferSubTagsFromConfig<C extends ComponentConfig> = C extends {
182
196
  } ? UnionToIntersection<{
183
197
  [K in keyof S]: K extends string ? S[K] extends string ? {
184
198
  [N in ExtractSubName<K>]: ResolveSubTag<K>;
185
- } : S[K] extends Record<string, string> ? {
186
- [N in keyof S[K]]: K extends HtmlTagName ? K : "span";
199
+ } : IsDirectSubConfig<S[K]> extends true ? {
200
+ [N in K]: S[K] extends {
201
+ tag: infer T extends HtmlTagName;
202
+ } ? T : "div";
203
+ } : S[K] extends Record<string, string | SubComponentConfig> ? {
204
+ [N in keyof S[K]]: S[K][N] extends {
205
+ tag: infer T extends HtmlTagName;
206
+ } ? T : K extends HtmlTagName ? K : "span";
187
207
  } : never : never;
188
208
  }[keyof S]> : Record<string, never>;
189
209
  interface ContainerConfig {
package/dist/index.d.ts CHANGED
@@ -52,8 +52,22 @@ interface SubComponentConfig {
52
52
  class: string;
53
53
  [key: string]: string;
54
54
  }>;
55
+ /**
56
+ * Override HTML tag untuk direct sub-component (bare key + base/variants).
57
+ * Default: "div" kalau tidak diset (backward-compatible).
58
+ * @example canvas: { tag: "section", base: "...", variants: {...} }
59
+ */
60
+ tag?: HtmlTagName;
55
61
  }
56
- type SubValue = string | Record<string, string | SubComponentConfig>;
62
+ type SubValue = string | SubComponentConfig | Record<string, string | SubComponentConfig>;
63
+ /**
64
+ * Mirror dari disambiguation logic runtime di createComponent.ts (registerSubComponents):
65
+ * `"base" in value || "variants" in value`
66
+ * Kalau bare-key punya property "base"/"variants" langsung, value itu adalah
67
+ * SubComponentConfig untuk key itu sendiri — bukan map { namaSubkomponen: classes }.
68
+ * Contoh: `canvas: { base: "...", variants: {...} }` → key "canvas" ITU sendiri nama sub-component.
69
+ */
70
+ type IsDirectSubConfig<T> = T extends object ? ("base" extends keyof T ? true : "variants" extends keyof T ? true : false) : false;
57
71
  /**
58
72
  * Boolean props yang di-resolve via bitmask lookup table (pre-generated di build time).
59
73
  * Berbeda dari `state` (CSS data-attribute driven) — ini adalah React props boolean.
@@ -148,7 +162,7 @@ type ExtractSubName<K extends string> = K extends `${string}:${infer Name}` ? Na
148
162
  type InferSubFromConfig<C extends ComponentConfig> = C extends {
149
163
  sub: infer S extends Record<string, SubValue>;
150
164
  } ? {
151
- [K in keyof S]: S[K] extends string ? K extends string ? ExtractSubName<K> : never : S[K] extends Record<infer N extends string, string> ? N : never;
165
+ [K in keyof S]: S[K] extends string ? K extends string ? ExtractSubName<K> : never : IsDirectSubConfig<S[K]> extends true ? K : S[K] extends Record<infer N extends string, string | SubComponentConfig> ? N : never;
152
166
  }[keyof S] : never;
153
167
  /**
154
168
  * HTML tags yang otomatis dikenali sebagai tag dari bare sub-key (tanpa "tag:name" syntax).
@@ -182,8 +196,14 @@ type InferSubTagsFromConfig<C extends ComponentConfig> = C extends {
182
196
  } ? UnionToIntersection<{
183
197
  [K in keyof S]: K extends string ? S[K] extends string ? {
184
198
  [N in ExtractSubName<K>]: ResolveSubTag<K>;
185
- } : S[K] extends Record<string, string> ? {
186
- [N in keyof S[K]]: K extends HtmlTagName ? K : "span";
199
+ } : IsDirectSubConfig<S[K]> extends true ? {
200
+ [N in K]: S[K] extends {
201
+ tag: infer T extends HtmlTagName;
202
+ } ? T : "div";
203
+ } : S[K] extends Record<string, string | SubComponentConfig> ? {
204
+ [N in keyof S[K]]: S[K][N] extends {
205
+ tag: infer T extends HtmlTagName;
206
+ } ? T : K extends HtmlTagName ? K : "span";
187
207
  } : never : never;
188
208
  }[keyof S]> : Record<string, never>;
189
209
  interface ContainerConfig {
package/dist/index.js CHANGED
@@ -913,7 +913,8 @@ function registerSubComponents(component, template, configSub) {
913
913
  tag
914
914
  );
915
915
  } else if ("base" in value || "variants" in value) {
916
- map[key] = createComponent("div", value);
916
+ const explicitTag = value.tag ?? "div";
917
+ map[key] = createComponent(explicitTag, value);
917
918
  } else {
918
919
  const tag = key;
919
920
  for (const [componentName, classesOrConfig] of Object.entries(value)) {
@@ -925,7 +926,8 @@ function registerSubComponents(component, template, configSub) {
925
926
  tag
926
927
  );
927
928
  } else {
928
- map[componentName] = createComponent(tag, classesOrConfig);
929
+ const nestedTag = classesOrConfig.tag ?? tag;
930
+ map[componentName] = createComponent(nestedTag, classesOrConfig);
929
931
  }
930
932
  }
931
933
  }