@smartsoft001-mobilems/claude-plugins 2.91.0 → 2.93.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartsoft001-mobilems/claude-plugins",
3
- "version": "2.91.0",
3
+ "version": "2.93.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "mobilems",
3
3
  "description": "MobilEMS-specific Claude Code skills (MuzaCMS / MobileMS indexer API)",
4
- "version": "2.91.0"
4
+ "version": "2.93.0"
5
5
  }
@@ -73,14 +73,19 @@ The list page renders the grid like this — copy this shape, it is the required
73
73
  <ng-template #masonryContentTpl>
74
74
  <div class="masonry-grid-sizer"></div>
75
75
  @for (item of list(); track item.id) {
76
- <div class="masonry-item"><smart-<name>-grid-item [item]="item" /></div>
76
+ <smart-<name>-grid-item [item]="item" />
77
77
  }
78
78
  </ng-template>
79
79
  </smart-mobilems-masonry-grid>
80
80
  ```
81
81
 
82
82
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
83
- `columnWidth` / `itemSelector`. The card (shared-components.md) is the only module-specific part. Inputs,
83
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
84
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
85
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
86
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
87
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
88
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (shared-components.md) is the only module-specific part. Inputs,
84
89
  public methods and the SSR provider are documented in the framework catalog,
85
90
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
86
91
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -86,6 +86,15 @@ if [ -n "$LISTP" ]; then
86
86
  bad "list page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
87
87
  fi
88
88
  fi
89
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
90
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
91
+ # descendants too): the inner card goes position:absolute inside the outer one
92
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
93
+ if [ -n "$LISTP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $LISTP 2>/dev/null; then
94
+ bad "list page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
95
+ else
96
+ pass "no nested .masonry-item wrappers"
97
+ fi
89
98
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
90
99
  # differently-named dir must not silently skip the check
91
100
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"
@@ -101,14 +101,19 @@ The list page renders the grid like this — copy this shape, it is the required
101
101
  <ng-template #masonryContentTpl>
102
102
  <div class="masonry-grid-sizer"></div>
103
103
  @for (item of list(); track item.id) {
104
- <div class="masonry-item"><app-events-grid-item [item]="item" /></div>
104
+ <app-events-grid-item [item]="item" />
105
105
  }
106
106
  </ng-template>
107
107
  </smart-mobilems-masonry-grid>
108
108
  ```
109
109
 
110
110
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
111
- `columnWidth` / `itemSelector`. The card (lib-contents.md) is the only module-specific part. Inputs,
111
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
112
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
113
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
114
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
115
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
116
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (lib-contents.md) is the only module-specific part. Inputs,
112
117
  public methods and the SSR provider are documented in the framework catalog,
113
118
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
114
119
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -83,6 +83,15 @@ if [ -n "$LISTP" ]; then
83
83
  bad "list page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
84
84
  fi
85
85
  fi
86
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
87
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
88
+ # descendants too): the inner card goes position:absolute inside the outer one
89
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
90
+ if [ -n "$LISTP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $LISTP 2>/dev/null; then
91
+ bad "list page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
92
+ else
93
+ pass "no nested .masonry-item wrappers"
94
+ fi
86
95
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
87
96
  # differently-named dir must not silently skip the check
88
97
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"
@@ -80,16 +80,19 @@ The list page renders the grid like this — copy this shape, it is the required
80
80
  <ng-template #masonryContentTpl>
81
81
  <div class="masonry-grid-sizer"></div>
82
82
  @for (item of list(); track item.id) {
83
- <div class="masonry-item">
84
- <smart-collections-grid-item [item]="item" />
85
- </div>
83
+ <smart-collections-grid-item [item]="item" />
86
84
  }
87
85
  </ng-template>
88
86
  </smart-mobilems-masonry-grid>
89
87
  ```
90
88
 
91
89
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
92
- `columnWidth` / `itemSelector`. The card (shared-components.md) is the only module-specific part. Inputs,
90
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
91
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
92
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
93
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
94
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
95
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (shared-components.md) is the only module-specific part. Inputs,
93
96
  public methods and the SSR provider are documented in the framework catalog,
94
97
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
95
98
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -70,6 +70,15 @@ if [ -n "$ITEMP" ]; then
70
70
  bad "item page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
71
71
  fi
72
72
  fi
73
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
74
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
75
+ # descendants too): the inner card goes position:absolute inside the outer one
76
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
77
+ if [ -n "$ITEMP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $ITEMP 2>/dev/null; then
78
+ bad "item page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
79
+ else
80
+ pass "no nested .masonry-item wrappers"
81
+ fi
73
82
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
74
83
  # differently-named dir must not silently skip the check
75
84
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"
@@ -74,14 +74,19 @@ The list page renders the grid like this — copy this shape, it is the required
74
74
  <ng-template #masonryContentTpl>
75
75
  <div class="masonry-grid-sizer"></div>
76
76
  @for (item of list(); track item.id) {
77
- <div class="masonry-item"><smart-objects-grid-item [item]="item" /></div>
77
+ <smart-objects-grid-item [item]="item" />
78
78
  }
79
79
  </ng-template>
80
80
  </smart-mobilems-masonry-grid>
81
81
  ```
82
82
 
83
83
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
84
- `columnWidth` / `itemSelector`. The card (shared-components.md) is the only module-specific part. Inputs,
84
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
85
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
86
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
87
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
88
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
89
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (shared-components.md) is the only module-specific part. Inputs,
85
90
  public methods and the SSR provider are documented in the framework catalog,
86
91
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
87
92
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -76,6 +76,15 @@ if [ -n "$LISTP" ]; then
76
76
  bad "list page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
77
77
  fi
78
78
  fi
79
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
80
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
81
+ # descendants too): the inner card goes position:absolute inside the outer one
82
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
83
+ if [ -n "$LISTP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $LISTP 2>/dev/null; then
84
+ bad "list page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
85
+ else
86
+ pass "no nested .masonry-item wrappers"
87
+ fi
79
88
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
80
89
  # differently-named dir must not silently skip the check
81
90
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"
@@ -78,14 +78,19 @@ The list page renders the grid like this — copy this shape, it is the required
78
78
  <ng-template #masonryContentTpl>
79
79
  <div class="masonry-grid-sizer"></div>
80
80
  @for (item of list(); track item.id) {
81
- <div class="masonry-item"><app-partners-grid-item [item]="item" /></div>
81
+ <app-partners-grid-item [item]="item" />
82
82
  }
83
83
  </ng-template>
84
84
  </smart-mobilems-masonry-grid>
85
85
  ```
86
86
 
87
87
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
88
- `columnWidth` / `itemSelector`. The card (lib-contents.md) is the only module-specific part. Inputs,
88
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
89
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
90
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
91
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
92
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
93
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (lib-contents.md) is the only module-specific part. Inputs,
89
94
  public methods and the SSR provider are documented in the framework catalog,
90
95
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
91
96
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -84,6 +84,15 @@ if [ -n "$LISTP" ]; then
84
84
  bad "list page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
85
85
  fi
86
86
  fi
87
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
88
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
89
+ # descendants too): the inner card goes position:absolute inside the outer one
90
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
91
+ if [ -n "$LISTP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $LISTP 2>/dev/null; then
92
+ bad "list page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
93
+ else
94
+ pass "no nested .masonry-item wrappers"
95
+ fi
87
96
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
88
97
  # differently-named dir must not silently skip the check
89
98
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"
@@ -81,16 +81,19 @@ The list page renders the grid like this — copy this shape, it is the required
81
81
  <ng-template #masonryContentTpl>
82
82
  <div class="masonry-grid-sizer"></div>
83
83
  @for (item of list(); track item.id) {
84
- <div class="masonry-item">
85
- <app-thematic-paths-list-item [item]="item" />
86
- </div>
84
+ <app-thematic-paths-list-item [item]="item" />
87
85
  }
88
86
  </ng-template>
89
87
  </smart-mobilems-masonry-grid>
90
88
  ```
91
89
 
92
90
  `.masonry-grid-sizer` and `.masonry-item` are required — they are the component's default
93
- `columnWidth` / `itemSelector`. The card (lib-contents.md) is the only module-specific part. Inputs,
91
+ `columnWidth` / `itemSelector`. The grid item CARRIES `masonry-item` on its own root element (host class — exactly like
92
+ `news-grid-item` / `objects-grid-item` in the template's shared components; for a module-local
93
+ card, put `class="masonry-item ..."` on the card's root yourself). **NEVER wrap a card in an
94
+ extra `<div class="masonry-item">`** — masonry itemizes matching descendants too, so the card
95
+ would be laid out twice, collapse to a fraction of the column width and overlap its neighbours
96
+ (this exact defect scored I6b=40 in benchmark batch H s3). The card (lib-contents.md) is the only module-specific part. Inputs,
94
97
  public methods and the SSR provider are documented in the framework catalog,
95
98
  [`packages/shared/angular/README.md`](https://github.com/smartsoft001/mobilems-framework/blob/main/packages/shared/angular/README.md#masonrygridcomponent)
96
99
  (installed as `node_modules/@smartsoft001-mobilems/angular/README.md`).
@@ -80,6 +80,15 @@ if [ -n "$LISTP" ]; then
80
80
  bad "list page does not render <smart-mobilems-masonry-grid> (README.md#masonrygridcomponent)"
81
81
  fi
82
82
  fi
83
+ # 3b. cards carry .masonry-item on their OWN root — wrapping them in another
84
+ # .masonry-item element makes masonry itemize BOTH (fizzy-ui-utils matches
85
+ # descendants too): the inner card goes position:absolute inside the outer one
86
+ # and collapses to a fraction of the column width (batch H s3, gate I6b=40).
87
+ if [ -n "$LISTP" ] && grep -rqE '<div[^>]*class="[^"]*masonry-item' $LISTP 2>/dev/null; then
88
+ bad "list page template wraps cards in <div class=\"masonry-item\"> — the card carries the class itself; render it directly"
89
+ else
90
+ pass "no nested .masonry-item wrappers"
91
+ fi
83
92
  # 4. filters must EXTEND the framework base class — `context.` alone proves nothing, and a
84
93
  # differently-named dir must not silently skip the check
85
94
  FILT="$(find "$LIBDIR/components" -maxdepth 1 -type d \( -name 'filters*' -o -name 'search*' -o -name 'facet*' \) 2>/dev/null || true)"