@smartsoft001-mobilems/claude-plugins 2.92.0 → 2.94.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.92.0",
3
+ "version": "2.94.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.92.0"
4
+ "version": "2.94.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)"
@@ -41,10 +41,13 @@ representations of the same object.
41
41
 
42
42
  ## Steps
43
43
 
44
- 1. **Read the mockup** in `docs/mockups/` — the searchbar and the result list
45
- item are usually exported as separate design-system components rather than a
46
- full screen, so match the component and keep the page layout consistent with
47
- the rest of the portal.
44
+ 1. **Read the mockup — once** in `docs/mockups/` and write
45
+ `.ai/tasks/<issue>/mockup-notes.md` (layout, spacing, colours as token names,
46
+ typography, field order, states) before styling; work from the note and do
47
+ not re-read the image in this step. The searchbar and the result list item
48
+ are usually exported as separate design-system components rather than a full
49
+ screen, so match the component and keep the page layout consistent with the
50
+ rest of the portal.
48
51
  2. **Tabs come from modules.** Each feature module registers a child route under
49
52
  `wyszukaj/:text` (its search module) and the page builds its tab list from
50
53
  what is registered. When a tab is missing, fix it in that module's skill
@@ -39,9 +39,13 @@ exists. Re-implementing it is a defect, not a shortcut:
39
39
 
40
40
  ## Steps
41
41
 
42
- 1. **Read the mockup.** Exports live in `docs/mockups/`; read them (Read) rather
43
- than guessing from the Figma link. Note the container width, heading scale,
44
- spacing rhythm and how the page header/hero differs from the module pages.
42
+ 1. **Read the mockup — once.** Exports live in `docs/mockups/`; read them (Read)
43
+ rather than guessing from the Figma link, then immediately write
44
+ `.ai/tasks/<issue>/mockup-notes.md` (layout order, grid and spacing, colours
45
+ as token names, typography, field order, states, header and footer) and work
46
+ from the note. Note the container width, heading scale, spacing rhythm and
47
+ how the page header/hero differs from the module pages. Do not re-read the
48
+ image later in this step; `/flow:impl` reads it once more in its comparison.
45
49
  2. **CMS data — render everything the API sends.** The page payload carries more
46
50
  than a title and body: `image`, `backgroundImage`, `links`, `slides`.
47
51
  A field that arrives and is not rendered reads to the client as a missing
@@ -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)"