@nextsparkjs/core 0.1.0-beta.67 → 0.1.0-beta.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/components/dashboard/block-editor/block-picker.d.ts +7 -2
  2. package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
  3. package/dist/components/dashboard/block-editor/block-picker.js +27 -20
  4. package/dist/components/dashboard/block-editor/block-preview-canvas.d.ts.map +1 -1
  5. package/dist/components/dashboard/block-editor/block-preview-canvas.js +37 -37
  6. package/dist/components/dashboard/block-editor/block-settings-panel.js +3 -3
  7. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  8. package/dist/components/dashboard/block-editor/builder-editor-view.js +124 -82
  9. package/dist/components/dashboard/block-editor/config-panel.d.ts +18 -0
  10. package/dist/components/dashboard/block-editor/config-panel.d.ts.map +1 -0
  11. package/dist/components/dashboard/block-editor/config-panel.js +413 -0
  12. package/dist/components/dashboard/block-editor/floating-block-toolbar.js +1 -1
  13. package/dist/components/dashboard/block-editor/pattern-card.js +1 -1
  14. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +1 -1
  15. package/dist/components/dashboard/block-editor/sortable-block.js +1 -1
  16. package/dist/components/dashboard/block-editor/tree-view-node.d.ts +11 -0
  17. package/dist/components/dashboard/block-editor/tree-view-node.d.ts.map +1 -0
  18. package/dist/components/dashboard/block-editor/tree-view-node.js +91 -0
  19. package/dist/components/dashboard/block-editor/tree-view.d.ts +17 -0
  20. package/dist/components/dashboard/block-editor/tree-view.d.ts.map +1 -0
  21. package/dist/components/dashboard/block-editor/tree-view.js +125 -0
  22. package/dist/components/dashboard/block-editor/viewport-toggle.d.ts +10 -0
  23. package/dist/components/dashboard/block-editor/viewport-toggle.d.ts.map +1 -0
  24. package/dist/components/dashboard/block-editor/viewport-toggle.js +55 -0
  25. package/dist/components/public/pageBuilder/PageRenderer.d.ts.map +1 -1
  26. package/dist/components/public/pageBuilder/PageRenderer.js +10 -1
  27. package/dist/components/ui/dynamic-icon.d.ts +12 -0
  28. package/dist/components/ui/dynamic-icon.d.ts.map +1 -0
  29. package/dist/components/ui/dynamic-icon.js +11 -0
  30. package/dist/lib/selectors/core-selectors.d.ts +98 -44
  31. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  32. package/dist/lib/selectors/domains/block-editor.selectors.d.ts +136 -71
  33. package/dist/lib/selectors/domains/block-editor.selectors.d.ts.map +1 -1
  34. package/dist/lib/selectors/domains/block-editor.selectors.js +130 -60
  35. package/dist/lib/selectors/selectors.d.ts +196 -88
  36. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  37. package/dist/messages/en/admin.json +15 -1
  38. package/dist/messages/en/index.d.ts +14 -0
  39. package/dist/messages/en/index.d.ts.map +1 -1
  40. package/dist/messages/es/admin.json +16 -1
  41. package/dist/messages/es/index.d.ts +15 -0
  42. package/dist/messages/es/index.d.ts.map +1 -1
  43. package/dist/presets/blocks/cta-section/component.tsx +4 -4
  44. package/dist/presets/blocks/features-grid/component.tsx +5 -5
  45. package/dist/presets/blocks/hero/component.tsx +2 -2
  46. package/dist/presets/blocks/testimonials/component.tsx +4 -4
  47. package/dist/presets/blocks/text-content/component.tsx +2 -2
  48. package/dist/presets/theme/blocks/hero/component.tsx +2 -2
  49. package/dist/presets/theme/tests/cypress/src/core/BlockEditorBasePOM.ts +123 -24
  50. package/dist/styles/classes.json +9 -2
  51. package/dist/styles/ui.css +1 -1
  52. package/dist/templates/features/blog/blocks/post-content/component.tsx +2 -2
  53. package/dist/templates/features/pages/blocks/hero/component.tsx +2 -2
  54. package/dist/templates/next.config.mjs +5 -3
  55. package/package.json +5 -4
  56. package/templates/features/blog/blocks/post-content/component.tsx +2 -2
  57. package/templates/features/pages/blocks/hero/component.tsx +2 -2
  58. package/templates/next.config.mjs +5 -3
@@ -71,13 +71,13 @@ export function HeroBlock({
71
71
  {/* Content */}
72
72
  <div className="container relative z-10 mx-auto max-w-4xl text-center">
73
73
  {title && (
74
- <h1 className="mb-6 text-5xl font-bold leading-tight md:text-6xl lg:text-7xl">
74
+ <h1 className="mb-6 text-5xl font-bold leading-tight @md:text-6xl @lg:text-7xl">
75
75
  {title}
76
76
  </h1>
77
77
  )}
78
78
 
79
79
  {displayContent && (
80
- <p className="mb-8 text-xl md:text-2xl opacity-90">
80
+ <p className="mb-8 text-xl @md:text-2xl opacity-90">
81
81
  {displayContent}
82
82
  </p>
83
83
  )}
@@ -30,13 +30,13 @@ export function TestimonialsBlock({
30
30
  }: TestimonialsBlockProps) {
31
31
  // Build column classes based on columns prop
32
32
  const columnClasses: Record<string, string> = {
33
- '2': 'md:grid-cols-2',
34
- '3': 'md:grid-cols-2 lg:grid-cols-3',
33
+ '2': '@md:grid-cols-2',
34
+ '3': '@md:grid-cols-2 @lg:grid-cols-3',
35
35
  }
36
36
 
37
37
  // Build section classes with background and custom className
38
38
  const sectionClasses = buildSectionClasses(
39
- 'py-16 px-4 md:py-24',
39
+ 'py-16 px-4 @md:py-24',
40
40
  { backgroundColor, className }
41
41
  )
42
42
 
@@ -50,7 +50,7 @@ export function TestimonialsBlock({
50
50
  {(title || content) && (
51
51
  <div className="mb-12 text-center">
52
52
  {title && (
53
- <h2 className="mb-4 text-4xl font-bold md:text-5xl">
53
+ <h2 className="mb-4 text-4xl font-bold @md:text-5xl">
54
54
  {title}
55
55
  </h2>
56
56
  )}
@@ -43,7 +43,7 @@ export function TextContentBlock({
43
43
 
44
44
  // Build section classes with background and custom className
45
45
  const sectionClasses = buildSectionClasses(
46
- 'py-16 px-4 md:py-24',
46
+ 'py-16 px-4 @md:py-24',
47
47
  { backgroundColor, className }
48
48
  )
49
49
 
@@ -57,7 +57,7 @@ export function TextContentBlock({
57
57
  maxWidthClasses[maxWidth],
58
58
  alignmentClasses[alignment]
59
59
  )}>
60
- <h2 className="text-3xl font-bold md:text-4xl">
60
+ <h2 className="text-3xl font-bold @md:text-4xl">
61
61
  {title}
62
62
  </h2>
63
63
  </div>
@@ -71,13 +71,13 @@ export function HeroBlock({
71
71
  {/* Content */}
72
72
  <div className="container relative z-10 mx-auto max-w-4xl text-center">
73
73
  {title && (
74
- <h1 className="mb-6 text-5xl font-bold leading-tight md:text-6xl lg:text-7xl">
74
+ <h1 className="mb-6 text-5xl font-bold leading-tight @md:text-6xl @lg:text-7xl">
75
75
  {title}
76
76
  </h1>
77
77
  )}
78
78
 
79
79
  {displayContent && (
80
- <p className="mb-8 text-xl md:text-2xl opacity-90">
80
+ <p className="mb-8 text-xl @md:text-2xl opacity-90">
81
81
  {displayContent}
82
82
  </p>
83
83
  )}
@@ -65,8 +65,10 @@ export abstract class BlockEditorBasePOM extends BasePOM {
65
65
  slugInput: cySelector('blockEditor.header.slugInput'),
66
66
  externalLink: cySelector('blockEditor.header.externalLink'),
67
67
  viewModeToggle: cySelector('blockEditor.header.viewToggle'),
68
- viewEditor: cySelector('blockEditor.header.viewEditor'),
69
68
  viewPreview: cySelector('blockEditor.header.viewPreview'),
69
+ viewSettings: cySelector('blockEditor.header.viewSettings'),
70
+ /** @deprecated Use viewSettings instead - v2.0 renamed viewEditor to viewSettings */
71
+ viewEditor: cySelector('blockEditor.header.viewSettings'),
70
72
  saveButton: cySelector('blockEditor.header.saveButton'),
71
73
  publishButton: cySelector('blockEditor.header.publishButton'),
72
74
  settingsButton: cySelector('blockEditor.header.settingsButton'),
@@ -85,10 +87,15 @@ export abstract class BlockEditorBasePOM extends BasePOM {
85
87
  // BLOCK PICKER - Left column "Bloques" tab
86
88
  // =========================================================================
87
89
  blockPicker: cySelector('blockEditor.blockPicker.container'),
88
- // Tabs
90
+ // Tabs (v2.0: Blocks | Patterns | Layout)
89
91
  tabBlocks: cySelector('blockEditor.blockPicker.tabBlocks'),
90
- tabConfig: cySelector('blockEditor.blockPicker.tabConfig'),
91
92
  tabIndicator: cySelector('blockEditor.blockPicker.tabIndicator'),
93
+ /**
94
+ * @deprecated tabConfig no longer exists in v2.0.
95
+ * Entity fields moved to Settings mode (viewSettings) in center column.
96
+ * Use tabLayout for tree view, or viewSettings for entity config.
97
+ */
98
+ tabConfig: cySelector('blockEditor.blockPicker.tabLayout'),
92
99
  // Search
93
100
  searchWrapper: cySelector('blockEditor.blockPicker.searchWrapper'),
94
101
  searchIcon: cySelector('blockEditor.blockPicker.searchIcon'),
@@ -104,13 +111,68 @@ export abstract class BlockEditorBasePOM extends BasePOM {
104
111
  blockName: (slug: string) => cySelector('blockEditor.blockPicker.blockName', { slug }),
105
112
  addBlock: (slug: string) => cySelector('blockEditor.blockPicker.addButton', { slug }),
106
113
  blockPickerEmpty: cySelector('blockEditor.blockPicker.empty'),
114
+ // Generic selector for counting all categories
115
+ categoryGeneric: '[data-cy^="block-picker-category-"]',
107
116
 
108
117
  // =========================================================================
109
- // ENTITY FIELDS PANEL - Left column "Configuración" tab
118
+ // PATTERNS TAB (in block picker)
110
119
  // =========================================================================
111
- entityFieldsPanel: cySelector('blockEditor.entityFieldsPanel.container'),
120
+ tabPatterns: cySelector('blockEditor.blockPicker.tabPatterns'),
121
+ patternsSearch: cySelector('blockEditor.blockPicker.patternsSearch'),
122
+ patternsList: cySelector('blockEditor.blockPicker.patternsList'),
123
+ patternsEmpty: cySelector('blockEditor.blockPicker.patternsEmpty'),
124
+ // Pattern cards (dynamic)
125
+ patternCard: (id: string) =>
126
+ cySelector('blockEditor.blockPicker.patternCard', { id }),
127
+ patternCardIcon: (id: string) =>
128
+ cySelector('blockEditor.blockPicker.patternCardIcon', { id }),
129
+ patternCardTitle: (id: string) =>
130
+ cySelector('blockEditor.blockPicker.patternCardTitle', { id }),
131
+ patternCardDescription: (id: string) =>
132
+ cySelector('blockEditor.blockPicker.patternCardDescription', { id }),
133
+ patternCardInsertButton: (id: string) =>
134
+ cySelector('blockEditor.blockPicker.patternCardInsertButton', { id }),
135
+ // Generic selector for counting patterns
136
+ patternCardGeneric: '[data-cy^="block-picker-pattern-card-"]',
137
+
138
+ // =========================================================================
139
+ // TREE VIEW (Layout tab)
140
+ // =========================================================================
141
+ tabLayout: cySelector('blockEditor.blockPicker.tabLayout'),
142
+ treeView: cySelector('blockEditor.treeView.container'),
143
+ treeViewEmpty: cySelector('blockEditor.treeView.empty'),
144
+ treeNode: (id: string) => cySelector('blockEditor.treeView.node', { id }),
145
+ treeNodeIcon: (id: string) =>
146
+ cySelector('blockEditor.treeView.nodeIcon', { id }),
147
+ treeNodeName: (id: string) =>
148
+ cySelector('blockEditor.treeView.nodeName', { id }),
149
+
150
+ // =========================================================================
151
+ // CONFIG PANEL - Center column - Settings mode (v2.0)
152
+ // =========================================================================
153
+ configPanel: cySelector('blockEditor.configPanel.container'),
154
+ configPanelScroll: cySelector('blockEditor.configPanel.scroll'),
155
+ // Entity Fields Section (collapsible)
156
+ configEntitySection: cySelector('blockEditor.configPanel.entityFieldsSection.container'),
157
+ configEntityTrigger: cySelector('blockEditor.configPanel.entityFieldsSection.trigger'),
158
+ configEntityContent: cySelector('blockEditor.configPanel.entityFieldsSection.content'),
159
+ configEntityField: (name: string) =>
160
+ cySelector('blockEditor.configPanel.entityFieldsSection.field', { name }),
161
+ // SEO Section (collapsible) - v2.0 moved from entityMetaPanel
162
+ configSeoSection: cySelector('blockEditor.configPanel.seoMetaSection.container'),
163
+ configSeoTrigger: cySelector('blockEditor.configPanel.seoMetaSection.trigger'),
164
+ configSeoContent: cySelector('blockEditor.configPanel.seoMetaSection.content'),
165
+ configMetaTitle: cySelector('blockEditor.configPanel.seoMetaSection.metaTitle'),
166
+ configMetaDescription: cySelector('blockEditor.configPanel.seoMetaSection.metaDescription'),
167
+
168
+ // =========================================================================
169
+ // ENTITY FIELDS PANEL - DEPRECATED (moved to configPanel in v2.0)
170
+ // =========================================================================
171
+ /** @deprecated Use configEntitySection in Settings mode instead */
172
+ entityFieldsPanel: cySelector('blockEditor.configPanel.entityFieldsSection.container'),
173
+ /** @deprecated Use configEntityField instead */
112
174
  entityField: (name: string) =>
113
- cySelector('blockEditor.entityFieldsPanel.field', { name }),
175
+ cySelector('blockEditor.configPanel.entityFieldsSection.field', { name }),
114
176
  entityCategoryList: cySelector('blockEditor.entityFieldsPanel.categoryList'),
115
177
  entityCategory: (slug: string) =>
116
178
  cySelector('blockEditor.entityFieldsPanel.categoryItem', { slug }),
@@ -154,9 +216,9 @@ export abstract class BlockEditorBasePOM extends BasePOM {
154
216
  cySelector('blockEditor.previewCanvas.blockSelected', { id }),
155
217
  // Generic selector for counting all preview blocks
156
218
  previewBlockGeneric: '[data-cy^="preview-block-"]',
157
- // Move buttons (legacy selectors for backward compatibility)
158
- moveUpBtn: (id: string) => `[data-cy="preview-block-${id}-move-up"]`,
159
- moveDownBtn: (id: string) => `[data-cy="preview-block-${id}-move-down"]`,
219
+ // Move buttons
220
+ moveUpBtn: (id: string) => cySelector('blockEditor.previewCanvas.moveUp', { id }),
221
+ moveDownBtn: (id: string) => cySelector('blockEditor.previewCanvas.moveDown', { id }),
160
222
  // Floating toolbar
161
223
  floatingToolbar: (id: string) =>
162
224
  cySelector('blockEditor.previewCanvas.floatingToolbar.container', { id }),
@@ -169,6 +231,22 @@ export abstract class BlockEditorBasePOM extends BasePOM {
169
231
  floatingToolbarDelete: (id: string) =>
170
232
  cySelector('blockEditor.previewCanvas.floatingToolbar.deleteBtn', { id }),
171
233
 
234
+ // =========================================================================
235
+ // PATTERN REFERENCE (in canvas)
236
+ // =========================================================================
237
+ patternReference: (ref: string) =>
238
+ cySelector('blockEditor.patternReference.container', { ref }),
239
+ patternReferenceBadge: (ref: string) =>
240
+ cySelector('blockEditor.patternReference.badge', { ref }),
241
+ patternReferenceRemove: (ref: string) =>
242
+ cySelector('blockEditor.patternReference.remove', { ref }),
243
+ patternReferenceLocked: (ref: string) =>
244
+ cySelector('blockEditor.patternReference.locked', { ref }),
245
+ patternReferenceEditLink: (ref: string) =>
246
+ cySelector('blockEditor.patternReference.editLink', { ref }),
247
+ // Generic selector for counting pattern references
248
+ patternReferenceGeneric: '[data-cy^="pattern-reference-"]',
249
+
172
250
  // =========================================================================
173
251
  // ENTITY META PANEL - SEO and custom fields
174
252
  // =========================================================================
@@ -214,8 +292,8 @@ export abstract class BlockEditorBasePOM extends BasePOM {
214
292
  cySelector('blockEditor.blockPropertiesPanel.form.field', { name }),
215
293
  fieldGroup: (id: string) =>
216
294
  cySelector('blockEditor.blockPropertiesPanel.form.fieldGroup', { id }),
217
- // Reset props button (legacy selector)
218
- resetPropsBtn: '[data-cy="reset-block-props"]',
295
+ // Reset props button
296
+ resetPropsBtn: cySelector('blockEditor.blockPropertiesPanel.resetPropsBtn'),
219
297
  // Array field
220
298
  arrayFieldContainer: (name: string) =>
221
299
  cySelector('blockEditor.blockPropertiesPanel.form.arrayField.container', { name }),
@@ -231,6 +309,12 @@ export abstract class BlockEditorBasePOM extends BasePOM {
231
309
  cySelector('blockEditor.blockPropertiesPanel.form.arrayField.itemRemove', { name, index }),
232
310
  arrayFieldAdd: (name: string) =>
233
311
  cySelector('blockEditor.blockPropertiesPanel.form.arrayField.addButton', { name }),
312
+ // Generic selectors for array fields (for counting/prefix matching)
313
+ arrayFieldGeneric: '[data-cy^="block-array-"]',
314
+ arrayFieldAddGeneric: '[data-cy$="-add"][data-cy^="block-array-"]',
315
+ arrayFieldRemoveGeneric: '[data-cy$="-remove"][data-cy^="block-array-"]',
316
+ arrayFieldUpGeneric: '[data-cy$="-up"][data-cy^="block-array-"]',
317
+ arrayFieldDownGeneric: '[data-cy$="-down"][data-cy^="block-array-"]',
234
318
 
235
319
  // =========================================================================
236
320
  // LEGACY ALIASES (for backward compatibility - will be removed)
@@ -347,20 +431,24 @@ export abstract class BlockEditorBasePOM extends BasePOM {
347
431
  return this
348
432
  }
349
433
 
434
+ /**
435
+ * Switch to Settings mode (v2.0 - entity fields, SEO, etc.)
436
+ * In v2.0, this shows the configPanel in the center column.
437
+ */
438
+ switchToSettingsMode() {
439
+ cy.get(this.editorSelectors.viewSettings).click()
440
+ return this
441
+ }
442
+
350
443
  /**
351
444
  * Switch to Layout/Editor mode
445
+ * @deprecated In v2.0, Layout is now a tab in BlockPicker (tabLayout), not a view mode.
446
+ * Use selectLayoutTab() for tree view, or switchToSettingsMode() for entity config.
352
447
  */
353
448
  switchToLayoutMode() {
354
- cy.get(this.editorSelectors.viewEditor).click()
355
- // Wait for layout canvas OR empty state to render (depends on whether blocks exist)
356
- cy.get('body').then(($body) => {
357
- // Either the canvas with blocks or the empty state should exist
358
- if ($body.find(this.editorSelectors.layoutCanvas).length > 0) {
359
- cy.get(this.editorSelectors.layoutCanvas, { timeout: 5000 }).should('exist')
360
- } else {
361
- cy.get(this.editorSelectors.layoutCanvasEmpty, { timeout: 5000 }).should('exist')
362
- }
363
- })
449
+ // v2.0: "Layout" mode is now accessed via the Layout tab in left sidebar
450
+ // This method now clicks the Layout tab for backward compatibility
451
+ cy.get(this.editorSelectors.tabLayout).click()
364
452
  return this
365
453
  }
366
454
 
@@ -382,9 +470,20 @@ export abstract class BlockEditorBasePOM extends BasePOM {
382
470
 
383
471
  /**
384
472
  * Select Config/Fields tab in left sidebar
473
+ * @deprecated In v2.0, entity fields moved to Settings mode (center column).
474
+ * Use switchToSettingsMode() for entity config/fields.
385
475
  */
386
476
  selectConfigTab() {
387
- cy.get(this.editorSelectors.tabConfig).click()
477
+ // v2.0: Config is now accessed via Settings mode, not a tab
478
+ cy.get(this.editorSelectors.viewSettings).click()
479
+ return this
480
+ }
481
+
482
+ /**
483
+ * Select Layout tab in left sidebar (tree view)
484
+ */
485
+ selectLayoutTab() {
486
+ cy.get(this.editorSelectors.tabLayout).click()
388
487
  return this
389
488
  }
390
489
 
@@ -712,7 +811,7 @@ export abstract class BlockEditorBasePOM extends BasePOM {
712
811
  * Assert block count in canvas
713
812
  */
714
813
  assertBlockCount(count: number) {
715
- cy.get('[data-cy^="sortable-block-"]').should('have.length', count)
814
+ cy.get(this.editorSelectors.sortableBlockGeneric).should('have.length', count)
716
815
  return this
717
816
  }
718
817
 
@@ -720,7 +819,7 @@ export abstract class BlockEditorBasePOM extends BasePOM {
720
819
  * Assert preview block count
721
820
  */
722
821
  assertPreviewBlockCount(count: number) {
723
- cy.get('[data-cy^="preview-block-"]').should('have.length', count)
822
+ cy.get(this.editorSelectors.previewBlockGeneric).should('have.length', count)
724
823
  return this
725
824
  }
726
825
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "generated": "2026-01-22T13:56:10.187Z",
3
- "totalClasses": 1047,
2
+ "generated": "2026-01-24T00:12:50.267Z",
3
+ "totalClasses": 1054,
4
4
  "classes": [
5
5
  "!text-2xl",
6
6
  "''",
@@ -56,6 +56,7 @@
56
56
  ":",
57
57
  "===",
58
58
  "?",
59
+ "@container",
59
60
  "Fifth",
60
61
  "First",
61
62
  "Fourth",
@@ -480,6 +481,7 @@
480
481
  "hover:bg-muted/30",
481
482
  "hover:bg-muted/50",
482
483
  "hover:bg-muted/70",
484
+ "hover:bg-muted/80",
483
485
  "hover:bg-primary",
484
486
  "hover:bg-primary-foreground/20",
485
487
  "hover:bg-primary/20",
@@ -918,6 +920,7 @@
918
920
  "text-left",
919
921
  "text-lg",
920
922
  "text-muted-foreground",
923
+ "text-muted-foreground/30",
921
924
  "text-muted-foreground/50",
922
925
  "text-muted-foreground/70",
923
926
  "text-orange-600",
@@ -967,6 +970,10 @@
967
970
  "tracking-widest",
968
971
  "transform",
969
972
  "transition",
973
+ "transition-[border-color,box-shadow]",
974
+ "transition-[border-color]",
975
+ "transition-[width,padding]",
976
+ "transition-[width]",
970
977
  "transition-all",
971
978
  "transition-colors",
972
979
  "transition-opacity",