@pandacss/studio 0.0.0-dev-20230801082734 → 0.0.0-dev-20230801084843

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pandacss/studio",
3
- "version": "0.0.0-dev-20230801082734",
3
+ "version": "0.0.0-dev-20230801084843",
4
4
  "description": "The automated token documentation for Panda CSS",
5
5
  "main": "dist/studio.js",
6
6
  "module": "dist/studio.mjs",
@@ -33,19 +33,19 @@
33
33
  "react": "18.2.0",
34
34
  "react-dom": "18.2.0",
35
35
  "vite": "4.4.2",
36
- "@pandacss/types": "0.0.0-dev-20230801082734",
37
- "@pandacss/config": "0.0.0-dev-20230801082734",
38
- "@pandacss/shared": "0.0.0-dev-20230801082734",
39
- "@pandacss/token-dictionary": "0.0.0-dev-20230801082734",
40
- "@pandacss/logger": "0.0.0-dev-20230801082734",
41
- "@pandacss/node": "0.0.0-dev-20230801082734"
36
+ "@pandacss/types": "0.0.0-dev-20230801084843",
37
+ "@pandacss/config": "0.0.0-dev-20230801084843",
38
+ "@pandacss/shared": "0.0.0-dev-20230801084843",
39
+ "@pandacss/token-dictionary": "0.0.0-dev-20230801084843",
40
+ "@pandacss/logger": "0.0.0-dev-20230801084843",
41
+ "@pandacss/node": "0.0.0-dev-20230801084843"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/react": "18.2.14",
45
45
  "@types/react-dom": "18.2.6",
46
46
  "@vitejs/plugin-react": "4.0.3",
47
47
  "execa": "7.1.1",
48
- "@pandacss/dev": "0.0.0-dev-20230801082734"
48
+ "@pandacss/dev": "0.0.0-dev-20230801084843"
49
49
  },
50
50
  "scripts": {
51
51
  "codegen": "panda",
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable */
2
2
  export * from './css'
3
3
  export * from './cx'
4
- export * from './cva'
4
+ export * from './cva'
5
+ export * from './sva'
@@ -1,3 +1,4 @@
1
1
  export * from './css.mjs'
2
2
  export * from './cx.mjs'
3
3
  export * from './cva.mjs'
4
+ export * from './sva.mjs'
@@ -0,0 +1,4 @@
1
+ /* eslint-disable */
2
+ import type { SlotRecipeCreatorFn } from '../types/recipe'
3
+
4
+ export declare const sva: SlotRecipeCreatorFn
@@ -0,0 +1,20 @@
1
+ import { getSlotRecipes } from '../helpers.mjs'
2
+ import { cva } from './cva.mjs'
3
+
4
+ export function sva(config) {
5
+ const slots = Object.entries(getSlotRecipes(config)).map(([slot, slotCva]) => [slot, cva(slotCva)])
6
+
7
+ function svaFn(props) {
8
+ const result = slots.map(([slot, cvaFn]) => [slot, cvaFn(props)])
9
+ return Object.fromEntries(result)
10
+ }
11
+
12
+ const [, firstCva] = slots[0]
13
+
14
+ return Object.assign(svaFn, {
15
+ __cva__: false,
16
+ variantMap: firstCva.variantMap,
17
+ variantKeys: firstCva.variantKeys,
18
+ splitVariantProps: firstCva.splitVariantProps,
19
+ })
20
+ }
@@ -224,6 +224,54 @@ function normalizeHTMLProps(props) {
224
224
  }
225
225
  normalizeHTMLProps.keys = htmlProps
226
226
 
227
+ // src/slot.ts
228
+ var assign = (obj, path, value) => {
229
+ const last = path.pop()
230
+ const target = path.reduce((acc, key) => {
231
+ if (acc[key] == null) acc[key] = {}
232
+ return acc[key]
233
+ }, obj)
234
+ if (last != null) target[last] = value
235
+ }
236
+ var getSlotRecipes = (recipe) => {
237
+ const parts = recipe.slots
238
+ .map((slot) => [
239
+ slot,
240
+ // setup base recipe
241
+ {
242
+ // create class-base on BEM
243
+ className: [recipe.className ?? '', slot].join('__'),
244
+ base: {},
245
+ variants: {},
246
+ defaultVariants: recipe.defaultVariants ?? {},
247
+ compoundVariants: [],
248
+ },
249
+ ])
250
+ .map(([slot, cva]) => {
251
+ const base = recipe.base[slot]
252
+ if (base) cva.base = base
253
+ walkObject(
254
+ recipe.variants ?? {},
255
+ (variant, path) => {
256
+ if (!variant[slot]) return
257
+ assign(cva, ['variants', ...path], variant[slot])
258
+ },
259
+ {
260
+ stop: (_value, path) => path.includes(slot),
261
+ },
262
+ )
263
+ if (recipe.compoundVariants) {
264
+ cva.compoundVariants = getSlotCompoundVariant(recipe.compoundVariants, slot)
265
+ }
266
+ return [slot, cva]
267
+ })
268
+ return Object.fromEntries(parts)
269
+ }
270
+ var getSlotCompoundVariant = (compoundVariants, slotName) =>
271
+ compoundVariants
272
+ .filter((compoundVariant) => compoundVariant.css[slotName])
273
+ .map((compoundVariant) => ({ ...compoundVariant, css: compoundVariant.css[slotName] }))
274
+
227
275
  // src/split-props.ts
228
276
  function splitProps(props, ...keys) {
229
277
  const descriptors = Object.getOwnPropertyDescriptors(props)
@@ -248,6 +296,8 @@ export {
248
296
  createCss,
249
297
  createMergeCss,
250
298
  filterBaseConditions,
299
+ getSlotCompoundVariant,
300
+ getSlotRecipes,
251
301
  hypenateProperty,
252
302
  isBaseCondition,
253
303
  isObject,
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable */
2
- import type { RecipeVariantRecord, RecipeConfig } from './recipe'
2
+ import type { RecipeVariantRecord, RecipeConfig, SlotRecipeVariantRecord, SlotRecipeConfig } from './recipe'
3
3
  import type { Parts } from './parts'
4
4
  import type { PatternConfig, PatternProperties } from './pattern'
5
5
  import type { GlobalStyleObject, SystemStyleObject } from './system-types'
@@ -7,10 +7,11 @@ import type { CompositionStyles } from './composition'
7
7
 
8
8
  declare module '@pandacss/dev' {
9
9
  export function defineRecipe<V extends RecipeVariantRecord>(config: RecipeConfig<V>): RecipeConfig
10
+ export function defineSlotRecipe<S extends string, V extends SlotRecipeVariantRecord<S>>(config: SlotRecipeConfig<S, V>): SlotRecipeConfig
10
11
  export function defineStyles(definition: SystemStyleObject): SystemStyleObject
11
12
  export function defineGlobalStyles(definition: GlobalStyleObject): GlobalStyleObject
12
13
  export function defineTextStyles(definition: CompositionStyles['textStyles']): CompositionStyles['textStyles']
13
14
  export function defineLayerStyles(definition: CompositionStyles['layerStyles']): CompositionStyles['layerStyles']
14
15
  export function definePattern<T extends PatternProperties>(config: PatternConfig<T>): PatternConfig
15
- export function defineParts<T extends Parts>(parts: T): (config: Partial<Record<keyof T, SystemStyleObject>>) => Partial<Record<keyof T, SystemStyleObject>>;
16
+ export function defineParts<T extends Parts>(parts: T): (config: Partial<Record<keyof T, SystemStyleObject>>) => Partial<Record<keyof T, SystemStyleObject>>
16
17
  }
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable */
2
2
  import type { SystemStyleObject } from './system-types'
3
3
 
4
- type Pretty<T> = T extends infer U ? { [K in keyof U]: U[K] } : never
4
+ type Pretty<T> = { [K in keyof T]: T[K] } & {}
5
5
 
6
6
  type StringToBoolean<T> = T extends 'true' | 'false' ? boolean : T
7
7
 
@@ -21,6 +21,10 @@ type RecipeVariantMap<T extends RecipeVariantRecord> = {
21
21
  [K in keyof T]: Array<keyof T[K]>
22
22
  }
23
23
 
24
+ /* -----------------------------------------------------------------------------
25
+ * Recipe / Standard
26
+ * -----------------------------------------------------------------------------*/
27
+
24
28
  export type RecipeRuntimeFn<T extends RecipeVariantRecord> = RecipeVariantFn<T> & {
25
29
  __type: RecipeSelection<T>
26
30
  variantKeys: (keyof T)[]
@@ -59,7 +63,7 @@ export type RecipeDefinition<T extends RecipeVariantRecord> = {
59
63
 
60
64
  export type RecipeCreatorFn = <T extends RecipeVariantRecord>(config: RecipeDefinition<T>) => RecipeRuntimeFn<T>
61
65
 
62
- export type RecipeConfig<T extends RecipeVariantRecord = RecipeVariantRecord> = RecipeDefinition<T> & {
66
+ type RecipeConfigMeta = {
63
67
  /**
64
68
  * The name of the recipe.
65
69
  */
@@ -76,3 +80,59 @@ export type RecipeConfig<T extends RecipeVariantRecord = RecipeVariantRecord> =
76
80
  */
77
81
  jsx?: Array<string | RegExp>
78
82
  }
83
+
84
+ export type RecipeConfig<T extends RecipeVariantRecord = RecipeVariantRecord> = RecipeDefinition<T> & RecipeConfigMeta
85
+
86
+ /* -----------------------------------------------------------------------------
87
+ * Recipe / Slot
88
+ * -----------------------------------------------------------------------------*/
89
+
90
+ type SlotRecord<S extends string, T> = Partial<Record<S, T>>
91
+
92
+ export type SlotRecipeVariantRecord<S extends string> = Record<any, Record<any, SlotRecord<S, SystemStyleObject>>>
93
+
94
+ export type SlotRecipeVariantFn<S extends string, T extends RecipeVariantRecord> = (
95
+ props?: RecipeSelection<T>,
96
+ ) => SlotRecord<S, string>
97
+
98
+ export type SlotRecipeRuntimeFn<S extends string, T extends SlotRecipeVariantRecord<S>> = SlotRecipeVariantFn<S, T> & {
99
+ variantKeys: (keyof T)[]
100
+ variantMap: RecipeVariantMap<T>
101
+ splitVariantProps<Props extends RecipeSelection<T>>(props: Props): [RecipeSelection<T>, Pretty<Omit<Props, keyof T>>]
102
+ }
103
+
104
+ export type SlotRecipeCompoundVariant<S extends string, T extends RecipeVariantRecord> = RecipeCompoundSelection<T> & {
105
+ css: SlotRecord<S, SystemStyleObject>
106
+ }
107
+
108
+ export type SlotRecipeDefinition<S extends string, T extends SlotRecipeVariantRecord<S>> = {
109
+ /**
110
+ * The parts/slots of the recipe.
111
+ */
112
+ slots: S[] | Readonly<S[]>
113
+ /**
114
+ * The base styles of the recipe.
115
+ */
116
+ base?: SlotRecord<S, SystemStyleObject>
117
+ /**
118
+ * The multi-variant styles of the recipe.
119
+ */
120
+ variants?: T | SlotRecipeVariantRecord<S>
121
+ /**
122
+ * The default variants of the recipe.
123
+ */
124
+ defaultVariants?: RecipeSelection<T>
125
+ /**
126
+ * The styles to apply when a combination of variants is selected.
127
+ */
128
+ compoundVariants?: Array<SlotRecipeCompoundVariant<S, T>>
129
+ }
130
+
131
+ export type SlotRecipeCreatorFn = <S extends string, T extends SlotRecipeVariantRecord<S>>(
132
+ config: SlotRecipeDefinition<S, T>,
133
+ ) => SlotRecipeRuntimeFn<S, T>
134
+
135
+ export type SlotRecipeConfig<
136
+ S extends string = string,
137
+ T extends SlotRecipeVariantRecord<S> = SlotRecipeVariantRecord<S>,
138
+ > = SlotRecipeDefinition<S, T> & RecipeConfigMeta