@measured/puck-plugin-heading-analyzer 0.20.0-canary.f768aab9 → 0.20.1-canary.38076a94

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
@@ -1,4 +1,4 @@
1
- import { ReactElement, ReactNode } from 'react';
1
+ import { ReactElement, CSSProperties, ReactNode, JSX } from 'react';
2
2
 
3
3
  type ItemSelector = {
4
4
  index: number;
@@ -7,7 +7,7 @@ type ItemSelector = {
7
7
 
8
8
  type FieldOption = {
9
9
  label: string;
10
- value: string | number | boolean;
10
+ value: string | number | boolean | undefined | null | object;
11
11
  };
12
12
  type FieldOptions = Array<FieldOption> | ReadonlyArray<FieldOption>;
13
13
  type BaseField = {
@@ -19,6 +19,7 @@ type BaseField = {
19
19
  type TextField = BaseField & {
20
20
  type: "text";
21
21
  placeholder?: string;
22
+ contentEditable?: boolean;
22
23
  };
23
24
  type NumberField = BaseField & {
24
25
  type: "number";
@@ -30,6 +31,7 @@ type NumberField = BaseField & {
30
31
  type TextareaField = BaseField & {
31
32
  type: "textarea";
32
33
  placeholder?: string;
34
+ contentEditable?: boolean;
33
35
  };
34
36
  type SelectField = BaseField & {
35
37
  type: "select";
@@ -39,26 +41,30 @@ type RadioField = BaseField & {
39
41
  type: "radio";
40
42
  options: FieldOptions;
41
43
  };
42
- type ArrayField<Props extends any = {
44
+ type ArrayField<Props extends {
43
45
  [key: string]: any;
44
- }> = Props extends {
46
+ }[] = {
45
47
  [key: string]: any;
46
- } ? BaseField & {
48
+ }[], UserField extends {} = {}> = BaseField & {
47
49
  type: "array";
48
50
  arrayFields: {
49
- [SubPropName in keyof Props[0]]: Field<Props[0][SubPropName]>;
51
+ [SubPropName in keyof Props[0]]: UserField extends {
52
+ type: PropertyKey;
53
+ } ? Field<Props[0][SubPropName], UserField> | UserField : Field<Props[0][SubPropName], UserField>;
50
54
  };
51
55
  defaultItemProps?: Props[0];
52
56
  getItemSummary?: (item: Props[0], index?: number) => string;
53
57
  max?: number;
54
58
  min?: number;
55
- } : never;
59
+ };
56
60
  type ObjectField<Props extends any = {
57
61
  [key: string]: any;
58
- }> = BaseField & {
62
+ }, UserField extends {} = {}> = BaseField & {
59
63
  type: "object";
60
64
  objectFields: {
61
- [SubPropName in keyof Props]: Field<Props[SubPropName]>;
65
+ [SubPropName in keyof Props]: UserField extends {
66
+ type: PropertyKey;
67
+ } ? Field<Props[SubPropName]> | UserField : Field<Props[SubPropName]>;
62
68
  };
63
69
  };
64
70
  type Adaptor<AdaptorParams = {}, TableShape extends Record<string, any> = {}, PropShape = TableShape> = {
@@ -66,7 +72,7 @@ type Adaptor<AdaptorParams = {}, TableShape extends Record<string, any> = {}, Pr
66
72
  fetchList: (adaptorParams?: AdaptorParams) => Promise<TableShape[] | null>;
67
73
  mapProp?: (value: TableShape) => PropShape;
68
74
  };
69
- type NotUndefined<T> = T extends undefined ? Record<string, any> : T;
75
+ type NotUndefined<T> = T extends undefined ? never : T;
70
76
  type ExternalFieldWithAdaptor<Props extends any = {
71
77
  [key: string]: any;
72
78
  }> = BaseField & {
@@ -107,13 +113,21 @@ type CustomFieldRender<Value extends any> = (props: {
107
113
  type CustomField<Value extends any> = BaseField & {
108
114
  type: "custom";
109
115
  render: CustomFieldRender<Value>;
116
+ contentEditable?: boolean;
110
117
  };
111
118
  type SlotField = BaseField & {
112
119
  type: "slot";
113
120
  allow?: string[];
114
121
  disallow?: string[];
115
122
  };
116
- type Field<ValueType = any> = TextField | NumberField | TextareaField | SelectField | RadioField | ArrayField<ValueType> | ObjectField<ValueType> | ExternalField<ValueType> | ExternalFieldWithAdaptor<ValueType> | CustomField<ValueType> | SlotField;
123
+ type Field<ValueType = any, UserField extends {} = {}> = TextField | NumberField | TextareaField | SelectField | RadioField | ArrayField<ValueType extends {
124
+ [key: string]: any;
125
+ }[] ? ValueType : never, UserField> | ObjectField<ValueType, UserField> | ExternalField<ValueType> | ExternalFieldWithAdaptor<ValueType> | CustomField<ValueType> | SlotField;
126
+ type Fields<ComponentProps extends DefaultComponentProps = DefaultComponentProps, UserField extends {} = {}> = {
127
+ [PropName in keyof Omit<ComponentProps, "editMode">]: UserField extends {
128
+ type: PropertyKey;
129
+ } ? Field<ComponentProps[PropName], UserField> | UserField : Field<ComponentProps[PropName]>;
130
+ };
117
131
  type FieldProps<F = Field<any>, ValueType = any> = {
118
132
  field: F;
119
133
  value: ValueType;
@@ -122,6 +136,164 @@ type FieldProps<F = Field<any>, ValueType = any> = {
122
136
  readOnly?: boolean;
123
137
  };
124
138
 
139
+ type DropZoneProps = {
140
+ zone: string;
141
+ allow?: string[];
142
+ disallow?: string[];
143
+ style?: CSSProperties;
144
+ minEmptyHeight?: number;
145
+ className?: string;
146
+ collisionAxis?: DragAxis;
147
+ };
148
+
149
+ type PuckContext = {
150
+ renderDropZone: React.FC<DropZoneProps>;
151
+ metadata: Metadata;
152
+ isEditing: boolean;
153
+ dragRef: ((element: Element | null) => void) | null;
154
+ };
155
+ type DefaultRootFieldProps = {
156
+ title?: string;
157
+ };
158
+ type DefaultComponentProps = {
159
+ [key: string]: any;
160
+ };
161
+
162
+ type WithId<Props> = Props & {
163
+ id: string;
164
+ };
165
+ type WithPuckProps<Props> = Props & {
166
+ puck: PuckContext;
167
+ editMode?: boolean;
168
+ };
169
+ type AsFieldProps<Props> = Omit<Props, "children" | "puck" | "editMode">;
170
+ type WithChildren<Props> = Props & {
171
+ children: ReactNode;
172
+ };
173
+ type UserGenerics<UserConfig extends Config = Config, UserParams extends ExtractConfigParams<UserConfig> = ExtractConfigParams<UserConfig>, UserData extends Data<UserParams["props"], UserParams["rootProps"]> | Data = Data<UserParams["props"], UserParams["rootProps"]>, UserAppState extends PrivateAppState<UserData> = PrivateAppState<UserData>, UserPublicAppState extends AppState<UserData> = AppState<UserData>, UserComponentData extends ComponentData = UserData["content"][0]> = {
174
+ UserConfig: UserConfig;
175
+ UserParams: UserParams;
176
+ UserProps: UserParams["props"];
177
+ UserRootProps: UserParams["rootProps"] & DefaultRootFieldProps;
178
+ UserData: UserData;
179
+ UserAppState: UserAppState;
180
+ UserPublicAppState: UserPublicAppState;
181
+ UserComponentData: UserComponentData;
182
+ UserField: UserParams["field"];
183
+ };
184
+ type ExtractField<UserField extends {
185
+ type: PropertyKey;
186
+ }, T extends UserField["type"]> = Extract<UserField, {
187
+ type: T;
188
+ }>;
189
+
190
+ type SlotComponent = (props?: Omit<DropZoneProps, "zone">) => ReactNode;
191
+ type PuckComponent<Props> = (props: WithId<WithPuckProps<{
192
+ [K in keyof Props]: WithDeepSlots<Props[K], SlotComponent>;
193
+ }>>) => JSX.Element;
194
+ type ResolveDataTrigger = "insert" | "replace" | "load" | "force";
195
+ type WithPartialProps<T, Props extends DefaultComponentProps> = Omit<T, "props"> & {
196
+ props?: Partial<Props>;
197
+ };
198
+ type ComponentConfigInternal<RenderProps extends DefaultComponentProps, FieldProps extends DefaultComponentProps, DataShape = Omit<ComponentData<FieldProps>, "type">, // NB this doesn't include AllProps, so types will not contain deep slot types. To fix, we require a breaking change.
199
+ UserField extends BaseField = {}> = {
200
+ render: PuckComponent<RenderProps>;
201
+ label?: string;
202
+ defaultProps?: FieldProps;
203
+ fields?: Fields<FieldProps, UserField>;
204
+ permissions?: Partial<Permissions>;
205
+ inline?: boolean;
206
+ resolveFields?: (data: DataShape, params: {
207
+ changed: Partial<Record<keyof FieldProps, boolean> & {
208
+ id: string;
209
+ }>;
210
+ fields: Fields<FieldProps>;
211
+ lastFields: Fields<FieldProps>;
212
+ lastData: DataShape | null;
213
+ appState: AppState;
214
+ parent: ComponentData | null;
215
+ }) => Promise<Fields<FieldProps>> | Fields<FieldProps>;
216
+ resolveData?: (data: DataShape, params: {
217
+ changed: Partial<Record<keyof FieldProps, boolean> & {
218
+ id: string;
219
+ }>;
220
+ lastData: DataShape | null;
221
+ metadata: Metadata;
222
+ trigger: ResolveDataTrigger;
223
+ }) => Promise<WithPartialProps<DataShape, FieldProps>> | WithPartialProps<DataShape, FieldProps>;
224
+ resolvePermissions?: (data: DataShape, params: {
225
+ changed: Partial<Record<keyof FieldProps, boolean> & {
226
+ id: string;
227
+ }>;
228
+ lastPermissions: Partial<Permissions>;
229
+ permissions: Partial<Permissions>;
230
+ appState: AppState;
231
+ lastData: DataShape | null;
232
+ }) => Promise<Partial<Permissions>> | Partial<Permissions>;
233
+ metadata?: Metadata;
234
+ };
235
+ type RootConfigInternal<RootProps extends DefaultComponentProps = DefaultComponentProps, UserField extends BaseField = {}> = Partial<ComponentConfigInternal<WithChildren<RootProps>, AsFieldProps<RootProps>, RootData<AsFieldProps<RootProps>>, UserField>>;
236
+ type Category<ComponentName> = {
237
+ components?: ComponentName[];
238
+ title?: string;
239
+ visible?: boolean;
240
+ defaultExpanded?: boolean;
241
+ };
242
+ type ConfigInternal<Props extends DefaultComponents = DefaultComponents, RootProps extends DefaultComponentProps = DefaultComponentProps, CategoryName extends string = string, UserField extends {} = {}> = {
243
+ categories?: Record<CategoryName, Category<keyof Props>> & {
244
+ other?: Category<keyof Props>;
245
+ };
246
+ components: {
247
+ [ComponentName in keyof Props]: Omit<ComponentConfigInternal<Props[ComponentName], Props[ComponentName], Omit<ComponentData<Props[ComponentName]>, "type">, UserField>, "type">;
248
+ };
249
+ root?: RootConfigInternal<RootProps, UserField>;
250
+ };
251
+ type DefaultComponents = Record<string, any>;
252
+ type Config<PropsOrParams extends LeftOrExactRight<PropsOrParams, DefaultComponents, ConfigParams> = DefaultComponents | ConfigParams, RootProps extends DefaultComponentProps = any, CategoryName extends string = string> = PropsOrParams extends ConfigParams<infer ParamComponents, infer ParamRoot, infer ParamCategoryName, never> ? ConfigInternal<ParamComponents, ParamRoot, ParamCategoryName[number]> : PropsOrParams extends ConfigParams<infer ParamComponents, infer ParamRoot, infer ParamCategoryName, infer ParamFields> ? ConfigInternal<ParamComponents, ParamRoot, ParamCategoryName[number], ParamFields[keyof ParamFields] & BaseField> : PropsOrParams extends ConfigParams<infer ParamComponents, infer ParamRoot, infer ParamCategoryName, any> ? ConfigInternal<ParamComponents, ParamRoot, ParamCategoryName[number], {}> : ConfigInternal<PropsOrParams, RootProps, CategoryName>;
253
+ type ExtractConfigParams<UserConfig extends ConfigInternal> = UserConfig extends ConfigInternal<infer PropsOrParams, infer RootProps, infer CategoryName, infer UserField> ? {
254
+ props: PropsOrParams;
255
+ rootProps: RootProps & DefaultRootFieldProps;
256
+ categoryNames: CategoryName;
257
+ field: UserField extends {
258
+ type: string;
259
+ } ? UserField : Field;
260
+ } : never;
261
+
262
+ type BaseData<Props extends {
263
+ [key: string]: any;
264
+ } = {
265
+ [key: string]: any;
266
+ }> = {
267
+ readOnly?: Partial<Record<keyof Props, boolean>>;
268
+ };
269
+ type RootDataWithProps<Props extends DefaultComponentProps = DefaultRootFieldProps> = BaseData<Props> & {
270
+ props: Props;
271
+ };
272
+ type RootDataWithoutProps<Props extends DefaultComponentProps = DefaultRootFieldProps> = Props;
273
+ type RootData<Props extends DefaultComponentProps = DefaultRootFieldProps> = Partial<RootDataWithProps<AsFieldProps<Props>>> & Partial<RootDataWithoutProps<Props>>;
274
+ type ComponentData<Props extends DefaultComponentProps = DefaultComponentProps, Name = string, Components extends Record<string, DefaultComponentProps> = Record<string, DefaultComponentProps>> = {
275
+ type: Name;
276
+ props: WithDeepSlots<WithId<Props>, Content<Components>>;
277
+ } & BaseData<Props>;
278
+ type ComponentDataOptionalId<Props extends DefaultComponentProps = DefaultComponentProps, Name = string> = {
279
+ type: Name;
280
+ props: Props & {
281
+ id?: string;
282
+ };
283
+ } & BaseData<Props>;
284
+ type ComponentDataMap<Components extends DefaultComponents = DefaultComponents> = {
285
+ [K in keyof Components]: ComponentData<Components[K], K extends string ? K : never, Components>;
286
+ }[keyof Components];
287
+ type Content<PropsMap extends {
288
+ [key: string]: DefaultComponentProps;
289
+ } = {
290
+ [key: string]: DefaultComponentProps;
291
+ }> = ComponentDataMap<PropsMap>[];
292
+ type Data<Components extends DefaultComponents = DefaultComponents, RootProps extends DefaultComponentProps = DefaultRootFieldProps> = {
293
+ root: WithDeepSlots<RootData<RootProps>, Content<Components>>;
294
+ content: Content<Components>;
295
+ zones?: Record<string, Content<Components>>;
296
+ };
125
297
  type Metadata = {
126
298
  [key: string]: any;
127
299
  };
@@ -137,6 +309,8 @@ type ArrayState = {
137
309
  type UiState = {
138
310
  leftSideBarVisible: boolean;
139
311
  rightSideBarVisible: boolean;
312
+ leftSideBarWidth?: number | null;
313
+ rightSideBarWidth?: number | null;
140
314
  itemSelector: ItemSelector | null;
141
315
  arrayState: Record<string, ArrayState | undefined>;
142
316
  previewMode: "interactive" | "edit";
@@ -159,19 +333,89 @@ type UiState = {
159
333
  focus?: string | null;
160
334
  };
161
335
  };
336
+ type AppState<UserData extends Data = Data> = {
337
+ data: UserData;
338
+ ui: UiState;
339
+ };
340
+
341
+ type ZoneType = "root" | "dropzone" | "slot";
342
+ type PuckNodeData = {
343
+ data: ComponentData;
344
+ flatData: ComponentData;
345
+ parentId: string | null;
346
+ zone: string;
347
+ path: string[];
348
+ };
349
+ type PuckZoneData = {
350
+ contentIds: string[];
351
+ type: ZoneType;
352
+ };
353
+ type NodeIndex = Record<string, PuckNodeData>;
354
+ type ZoneIndex = Record<string, PuckZoneData>;
355
+ type PrivateAppState<UserData extends Data = Data> = AppState<UserData> & {
356
+ indexes: {
357
+ nodes: NodeIndex;
358
+ zones: ZoneIndex;
359
+ };
360
+ };
361
+ type BuiltinTypes = Date | RegExp | Error | Function | symbol | null | undefined;
362
+ /**
363
+ * Recursively walk T and replace Slots with SlotComponents
364
+ */
365
+ type WithDeepSlots<T, SlotType = T> = T extends Slot ? SlotType : T extends (infer U)[] ? Array<WithDeepSlots<U, SlotType>> : T extends (infer U)[] ? WithDeepSlots<U, SlotType>[] : T extends BuiltinTypes ? T : T extends object ? {
366
+ [K in keyof T]: WithDeepSlots<T[K], SlotType>;
367
+ } : T;
368
+ type ConfigParams<Components extends DefaultComponents = DefaultComponents, RootProps extends DefaultComponentProps = any, CategoryNames extends string[] = string[], UserFields extends FieldsExtension = FieldsExtension> = {
369
+ components?: Components;
370
+ root?: RootProps;
371
+ categories?: CategoryNames;
372
+ fields?: AssertHasValue<UserFields>;
373
+ };
374
+ type FieldsExtension = {
375
+ [Type in string]: {
376
+ type: Type;
377
+ };
378
+ };
379
+ type Exact<T, Target> = Record<Exclude<keyof T, keyof Target>, never>;
380
+ type LeftOrExactRight<Union, Left, Right> = (Left & Union extends Right ? Exact<Union, Right> : Left) | (Right & Exact<Union, Right>);
381
+ type AssertHasValue<T, True = T, False = never> = [keyof T] extends [
382
+ never
383
+ ] ? False : True;
384
+
385
+ type MapFnParams<ThisField = Field> = {
386
+ value: any;
387
+ parentId: string;
388
+ propName: string;
389
+ field: ThisField;
390
+ propPath: string;
391
+ };
392
+
393
+ type FieldTransformFnParams<T> = Omit<MapFnParams<T>, "parentId"> & {
394
+ isReadOnly: boolean;
395
+ componentId: string;
396
+ };
397
+ type FieldTransformFn<T> = (params: FieldTransformFnParams<T>) => any;
398
+ type FieldTransforms<UserConfig extends Config = Config<{
399
+ fields: {};
400
+ }>, // Setting fields: {} helps TS choose default field types
401
+ G extends UserGenerics<UserConfig> = UserGenerics<UserConfig>, UserField extends {
402
+ type: string;
403
+ } = Field | G["UserField"]> = Partial<{
404
+ [Type in UserField["type"]]: FieldTransformFn<ExtractField<UserField, Type>>;
405
+ }>;
162
406
 
163
407
  type RenderFunc<Props extends {
164
408
  [key: string]: any;
165
409
  } = {
166
410
  children: ReactNode;
167
411
  }> = (props: Props) => ReactElement;
168
- declare const overrideKeys: readonly ["header", "headerActions", "fields", "fieldLabel", "components", "componentItem", "outline", "puck", "preview"];
412
+ declare const overrideKeys: readonly ["header", "headerActions", "fields", "fieldLabel", "drawer", "drawerItem", "componentOverlay", "outline", "puck", "preview"];
169
413
  type OverrideKey = (typeof overrideKeys)[number];
170
414
  type OverridesGeneric<Shape extends {
171
415
  [key in OverrideKey]: any;
172
416
  }> = Shape;
173
- type Overrides = OverridesGeneric<{
174
- fieldTypes: Partial<FieldRenderFunctions>;
417
+ type Overrides<UserConfig extends Config = Config> = OverridesGeneric<{
418
+ fieldTypes: Partial<FieldRenderFunctions<UserConfig>>;
175
419
  header: RenderFunc<{
176
420
  actions: ReactNode;
177
421
  children: ReactNode;
@@ -203,26 +447,35 @@ type Overrides = OverridesGeneric<{
203
447
  children: ReactNode;
204
448
  name: string;
205
449
  }>;
450
+ drawer: RenderFunc;
451
+ drawerItem: RenderFunc<{
452
+ children: ReactNode;
453
+ name: string;
454
+ }>;
206
455
  iframe: RenderFunc<{
207
456
  children: ReactNode;
208
457
  document?: Document;
209
458
  }>;
210
459
  outline: RenderFunc;
211
- puck: RenderFunc;
212
- }>;
213
- type FieldRenderFunctions = Omit<{
214
- [Type in Field["type"]]: React.FunctionComponent<FieldProps<Extract<Field, {
215
- type: Type;
216
- }>, any> & {
460
+ componentOverlay: RenderFunc<{
217
461
  children: ReactNode;
218
- name: string;
462
+ hover: boolean;
463
+ isSelected: boolean;
464
+ componentId: string;
465
+ componentType: string;
219
466
  }>;
220
- }, "custom"> & {
221
- [key: string]: React.FunctionComponent<FieldProps<any> & {
467
+ puck: RenderFunc;
468
+ }>;
469
+ type FieldRenderFunctions<UserConfig extends Config = Config, G extends UserGenerics<UserConfig> = UserGenerics<UserConfig>, UserField extends {
470
+ type: string;
471
+ } = Field | G["UserField"]> = Omit<{
472
+ [Type in UserField["type"]]: React.FunctionComponent<FieldProps<ExtractField<UserField, Type>, any> & {
222
473
  children: ReactNode;
223
474
  name: string;
224
475
  }>;
225
- };
476
+ }, "custom">;
477
+
478
+ type DragAxis = "dynamic" | "y" | "x";
226
479
 
227
480
  type iconTypes = "Smartphone" | "Monitor" | "Tablet";
228
481
  type Viewport = {
@@ -232,9 +485,24 @@ type Viewport = {
232
485
  icon?: iconTypes | ReactNode;
233
486
  };
234
487
 
235
- type Plugin = {
236
- overrides: Partial<Overrides>;
488
+ type Permissions = {
489
+ drag: boolean;
490
+ duplicate: boolean;
491
+ delete: boolean;
492
+ edit: boolean;
493
+ insert: boolean;
494
+ } & Record<string, boolean>;
495
+ type Plugin<UserConfig extends Config = Config> = {
496
+ overrides?: Partial<Overrides<UserConfig>>;
497
+ fieldTransforms?: FieldTransforms<UserConfig>;
237
498
  };
499
+ type Slot<Props extends {
500
+ [key: string]: DefaultComponentProps;
501
+ } = {
502
+ [key: string]: DefaultComponentProps;
503
+ }> = {
504
+ [K in keyof Props]: ComponentDataOptionalId<Props[K], K extends string ? K : never>;
505
+ }[keyof Props][];
238
506
 
239
507
  declare const headingAnalyzer: Plugin;
240
508