@smartsoft001-mobilems/claude-plugins 2.114.0 → 2.116.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.114.0",
3
+ "version": "2.116.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.114.0"
4
+ "version": "2.116.0"
5
5
  }
@@ -66,7 +66,7 @@ README) — never a per-module copy. `scripts/verify-module.sh` fails the run on
66
66
  `kolekcje` route to `appRoutes` in `apps/web/src/app/app.routes.ts` and a matching child under the
67
67
  `wyszukaj/:text` search route.
68
68
  4. **Collections shared component** — see `references/shared-components.md`: build
69
- `components/collections-grid-item` (it imports `public-collections-domain`) in the shared lib and
69
+ `components/collections-grid-item` (it imports `public-collections-domain`) in the shared lib (a component that `extends CollectionsGridItemBaseComponent` with the app's own markup) and
70
70
  export it from `components/index.ts`. Collections contributes no widget-map entry and no model type
71
71
  (those are objects-only).
72
72
  5. **Translations** — copy the module's translation groups (`COLLECTIONS`) from the reference
@@ -21,6 +21,11 @@ Build this component directory and export it from `components/index.ts`:
21
21
  export * from './collections-grid-item';
22
22
  ```
23
23
 
24
+ `CollectionsGridItemComponent` extends `CollectionsGridItemBaseComponent` (the list row, where the
25
+ museum has one, extends `CollectionCardBaseComponent`): the framework holds the logic, the museum
26
+ keeps its own template and styles, and the domain stores stay in the museum, reached through hooks.
27
+ Do not copy the reference's card logic.
28
+
24
29
  `collections-grid-item` carries its own `index.ts`
25
30
  (`export * from './collections-grid-item.component';`) plus the `.component.ts` + `.component.html`.
26
31
  Build the whole dir from the reference and thread `<PREFIX>`.
@@ -66,7 +66,7 @@ README) — never a per-module copy. `scripts/verify-module.sh` fails the run on
66
66
  with the `Masonry` SSR factory. Add the lazy `obiekty` route to `appRoutes` in
67
67
  `apps/web/src/app/app.routes.ts` and a matching child under the `wyszukaj/:text` search route.
68
68
  4. **Objects shared components** — see `references/shared-components.md`: build `objects-grid-item`,
69
- `objects-list-item`, and the object gallery widget (`widget/gallery-object`) in the shared lib +
69
+ `objects-list-item` (each `extends` the framework `Objects…ItemBaseComponent`, with the app's own markup), and the object gallery widget (`widget/gallery-object`) in the shared lib +
70
70
  export them; and register the object gallery widget in the widget content-type map (`GALLERY_OBJECT`).
71
71
  `ISpecificObject` and the filter models come from `@smartsoft001-mobilems/objects-shell-angular`.
72
72
  5. **Translations** — copy the module's translation groups (`OBJECTS`, `DETAILS_PAGE`, `GALLERY`) from the reference
@@ -83,7 +83,7 @@ README) — never a per-module copy. `scripts/verify-module.sh` fails the run on
83
83
  The cross-cutting rules live in `mobilems-project-init`
84
84
  `references/qa-hardening.md`; these are the objects-specific ones:
85
85
 
86
- - **Search debounce.** The panel full-text search (`app-objects-searchbar variant="panel"`, a subclass of `SearchbarBaseComponent` with the museum's own template) must
86
+ - **Search debounce.** The panel full-text search (`app-objects-searchbar variant="panel"`, a standalone component: a live debounced search through `searchEvent` / `closeEvent`, an `autofocus` input, never navigates - it does not extend `SearchbarBaseComponent`, which navigates to the search route) must
87
87
  re-emit through a handler with `@debounce(250)` (`lodash-decorators`) — without it every keystroke
88
88
  hits the API. Collections and news filters already do this; keep the modules consistent.
89
89
  - **List page:** show the total result count (`facade.totalCount()`) and add the shared
@@ -20,8 +20,8 @@ libs/museum-objects/
20
20
  └── lib/
21
21
  ├── objects.module.ts # MuseumObjectsModule (references/module-and-routes.md)
22
22
  ├── objects.routes.ts
23
- ├── components/ # description, filter-input (extends FilterInputBaseComponent), high-def-request-modal,
24
- │ # menu, objects-searchbar (extends SearchbarBaseComponent), tabs/*
23
+ ├── components/ # description, filter-input (may extend FilterInputBaseComponent - its API is a subset), high-def-request-modal,
24
+ │ # menu, objects-searchbar (standalone, live search), tabs/*
25
25
  ├── pages/ # list (ListComponent), item (ItemComponent) + index
26
26
  └── services/ # objects.service.ts + index
27
27
  ```
@@ -16,6 +16,14 @@ Build these component directories and export them from `components/index.ts`:
16
16
  | `components/objects-grid-item` | an object card in the grid view |
17
17
  | `components/objects-list-item` | an object row in the list view |
18
18
 
19
+ Both are **logic-free shells over framework bases**: `ObjectsGridItemComponent extends
20
+ ObjectsGridItemBaseComponent` and `ObjectsListItemComponent extends ObjectsListItemBaseComponent`
21
+ (both build on `ObjectCardBaseComponent`; field helpers `objectCardMeta`/`objectCardPlace`/
22
+ `objectCardExhibition` come from the framework). Do not copy the reference's card logic. The museum
23
+ keeps its own template and styles; the favorites and selection stores stay in the museum and reach
24
+ the base through its hooks (`FavoriteButtonBaseComponent`/`IFavoriteHooks`,
25
+ `SelectionActionsBaseComponent`).
26
+
19
27
  ```ts
20
28
  // components/index.ts — these exports belong to the objects module:
21
29
  export * from './objects-grid-item';
@@ -50,6 +50,18 @@ FEATURE-OWNED. A typical FEATURE-OWNED set (confirm with the classifier on your
50
50
  | `news-grid-item`, `news-list-item` | `mobilems-articles` (news) |
51
51
  | `widget/gallery-article` | `mobilems-articles` |
52
52
 
53
+ The feature-owned cards are still generated by their module skill, but as `extends`
54
+ `ObjectsGridItemBaseComponent` / `ObjectsListItemBaseComponent` (objects) and
55
+ `CollectionsGridItemBaseComponent` (collections; the list row extends `CollectionCardBaseComponent`),
56
+ not as copies of the reference logic. The museum keeps its own template and styles, and the domain
57
+ stores (favorites, selection, downloads, recommended items) stay in the museum and reach the base
58
+ through its hooks (`IFavoriteHooks`, `ISelectionActionsFavorites`, `IRecommendedSources`, the abstract `downloadCardsExport`).
59
+
60
+ The same applies to the foundation shared components `favorite-button`, `favorites-notice`,
61
+ `selection-actions`, `download-cards` and `recommended`: extend `FavoriteButtonBaseComponent`,
62
+ `FavoritesNoticeBaseComponent`, `SelectionActionsBaseComponent`, `DownloadCardsBaseComponent` and
63
+ `RecommendedBaseComponent`, write the markup yourself and wire the museum store through the hooks.
64
+
53
65
  Build everything else — `header`, `footer`, `page`, the `filter*` family, `breadcrumbs`,
54
66
  `pagination`, `searchbar`, `loader`, `error-retry`, `scroll-top`, `wcag`, `gallery`,
55
67
  `map`, `slider`, `carousel`, the three carousels above, `category-dropdown`, `dropdown`, `menu-item`,
@@ -58,10 +70,15 @@ and the `widget` container with its foundation widgets. The logic of `calendar`,
58
70
  `carousel`, the three home carousels, `slider`, `scroll-top`, `gallery` (+ fullscreen dialog),
59
71
  `confirmation-modal`, `newsletter-modal`, `map`, the `filter-input` / `filter-date-input` /
60
72
  `filter-custom-dictionary-input` / `filter-dictionary-input` family, `searchbar`, `catalog-toolbar`,
61
- `catalog-filter-bar`, `theme-tags-filter` and `select-checkbox` is a framework base now (see
73
+ `catalog-filter-bar`, `theme-tags-filter`, `select-checkbox`, `dropdown`, `tabs`, `wcag`, `breadcrumbs`,
74
+ `breadcrumbs-bar` and `menu-item` is a framework base now (see
62
75
  "Framework now → bases"): generate each as `extends …BaseComponent` (`scroll-top` extends `ScrollTopComponent`,
63
76
  which has no `Base` suffix) and write only the museum's own template and styles — the framework
64
- ships no templates. The `app` shell and `skip-links` are
77
+ ships no templates. `dropdown`, `tabs`, `wcag`, `breadcrumbs`, `breadcrumbs-bar` and `menu-item` are
78
+ the shared-lib components that extend `DropdownBaseComponent`, `TabsBaseComponent`, `WcagBaseComponent`,
79
+ `BreadcrumbsBaseComponent`, `BreadcrumbsBarBaseComponent` and `MenuItemBaseComponent`; `category-dropdown`
80
+ and other feature-lib look-alikes are not bases. `in-page-anchors` is not generated: use the framework
81
+ `InPageAnchorsDirective` (`[smartInPageAnchors]`). The `app` shell and `skip-links` are
65
82
  framework components (`smart-mobilems-app`, `smart-mobilems-skip-links`) — do not copy them.
66
83
 
67
84
  > Trust the script over this table for the **leaf** components (the grid/list cards and the
@@ -112,20 +129,20 @@ files duplicate exports that now exist; copying those is the single most common
112
129
 
113
130
  Framework now — do **not** generate (import from `@smartsoft001-mobilems/angular`):
114
131
 
115
- | Kind | Framework exports |
116
- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
117
- | environment | `createMobilemsEnvironment`, `MOBILEMS_ENVIRONMENT`, `EnvironmentService` |
118
- | pipes | `altText`, `fileUrl`, `backgroundUrl`, `plainText`, `stripAnchors`, `capitalize` |
119
- | tools | `classifyLink`, `isInternalLink`, `normalizeUrl`, `stripHtml`, `formatNamedEntries`, `normalizeSearchText`, `newTabText`, `pageToOffset`, `decodeHtmlEntities`, `ElementIdSequence`, `createSafeTimeouts`, `photoFileName`/`urlExtension`, `widgetImageUrl`, `overflowingTags`, `themeTagKey`, `themeTagsLayout`, `THEME_TAGS_VISIBLE_LIMIT` |
120
- | directives | `a[smartExternalLink]`, `[smartExternalLinks]`, `[smartFocusTrap]`, `[smartTruncatedTitle]` (references use `app…` — rename the attributes) |
121
- | services | `ConfirmationModalService`, `ExternalLinkConfirmationService`, `FilterPersistenceService`, `OrientationService`, `WcagChangesService`, `LineHeightService`, `BreadcrumbsService`, `ContactService`, `DataService`, `MuseumSeoService` |
122
- | interceptors | `LanguageInterceptor`, `PreviewAuthInterceptor`, `SsrTimeoutInterceptor`, `DedupeRequestInterceptor` |
123
- | bases | `CalendarBaseComponent`, `PaginationDotsBaseComponent`, `PaginationBaseComponent`, `CarouselBaseComponent`, `PartnersCarouselBaseComponent`, `NewObjectsCarouselBaseComponent`, `ArticlesCarouselBaseComponent`, `SliderBaseComponent` (+ `ISliderOptions`; `ScrollTopComponent` is server-guarded), `GalleryBaseComponent`, `GalleryFullscreenDialogBaseComponent` (`GalleryFullscreenBaseComponent` is `@deprecated`), `ConfirmationModalBaseComponent`, `NewsletterModalBaseComponent`, `MapBaseComponent`, `FilterInputBaseComponent`, `FilterDateInputBaseComponent`, `FilterCustomDictionaryInputBaseComponent`, `FilterDictionaryInputBaseComponent` (inline tree, `source`, paging), `ThemeTagsFilterBaseComponent`, `CatalogFilterBarBaseComponent`, `CatalogToolbarBaseComponent`, `SearchbarBaseComponent`, `SelectCheckboxBaseComponent` (+ `ISelectionHooks`) |
124
- | SSR tools | `injectServerResponseInit`, `appendPreloadLinks` (image preload `Link` headers) |
132
+ | Kind | Framework exports |
133
+ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
134
+ | environment | `createMobilemsEnvironment`, `MOBILEMS_ENVIRONMENT`, `EnvironmentService` |
135
+ | pipes | `altText`, `fileUrl`, `backgroundUrl`, `plainText`, `stripAnchors`, `capitalize` |
136
+ | tools | `classifyLink`, `isInternalLink`, `normalizeUrl`, `stripHtml`, `formatNamedEntries`, `normalizeSearchText`, `newTabText`, `pageToOffset`, `decodeHtmlEntities`, `ElementIdSequence`, `createSafeTimeouts`, `photoFileName`/`urlExtension`, `widgetImageUrl`, `overflowingTags`, `themeTagKey`, `themeTagsLayout`, `THEME_TAGS_VISIBLE_LIMIT`, `resolveMenuItemTarget`, `isNavigableMenuItem` (+ `MenuItemTarget`), `objectCardMeta`/`objectCardPlace`/`objectCardExhibition`/`exhibitionText` (+ `IObjectCardSource`), `SERIES_TITLES_FILTER`, `catalogEntryFilterParams` (the named-entries filter query params), `recommendedPerPage` |
137
+ | directives | `a[smartExternalLink]`, `[smartExternalLinks]`, `[smartFocusTrap]`, `[smartTruncatedTitle]`, `[smartInPageAnchors]` (`InPageAnchorsDirective`; references use `app…` — rename the attributes) |
138
+ | services | `ConfirmationModalService`, `ExternalLinkConfirmationService`, `FilterPersistenceService`, `OrientationService`, `WcagChangesService`, `LineHeightService`, `BreadcrumbsService`, `ContactService`, `DataService`, `MuseumSeoService` |
139
+ | interceptors | `LanguageInterceptor`, `PreviewAuthInterceptor`, `SsrTimeoutInterceptor`, `DedupeRequestInterceptor` |
140
+ | bases | `CalendarBaseComponent`, `PaginationDotsBaseComponent`, `PaginationBaseComponent`, `CarouselBaseComponent`, `PartnersCarouselBaseComponent`, `NewObjectsCarouselBaseComponent`, `ArticlesCarouselBaseComponent`, `SliderBaseComponent` (+ `ISliderOptions`; `ScrollTopComponent` is server-guarded), `GalleryBaseComponent`, `GalleryFullscreenDialogBaseComponent` (`GalleryFullscreenBaseComponent` is `@deprecated`), `ConfirmationModalBaseComponent`, `NewsletterModalBaseComponent`, `MapBaseComponent`, `FilterInputBaseComponent`, `FilterDateInputBaseComponent`, `FilterCustomDictionaryInputBaseComponent`, `FilterDictionaryInputBaseComponent` (inline tree, `source`, paging), `ThemeTagsFilterBaseComponent`, `CatalogFilterBarBaseComponent`, `CatalogToolbarBaseComponent`, `SearchbarBaseComponent`, `SelectCheckboxBaseComponent` (+ `ISelectionHooks`), `DropdownBaseComponent`, `TabsBaseComponent`, `WcagBaseComponent` (+ `WCAG_OPTION_GROUPS`), `BreadcrumbsBaseComponent`, `BreadcrumbsBarBaseComponent`, `MenuItemBaseComponent`, `ObjectCardBaseComponent`, `ObjectsGridItemBaseComponent`, `ObjectsListItemBaseComponent`, `CollectionCardBaseComponent`, `CollectionsGridItemBaseComponent`, `FavoriteButtonBaseComponent` (+ `IFavoriteHooks`, `IFavoriteRef`), `FavoritesNoticeBaseComponent`, `SelectionActionsBaseComponent`, `DownloadCardsBaseComponent`, `RecommendedBaseComponent` |
141
+ | SSR tools | `injectServerResponseInit`, `appendPreloadLinks` (image preload `Link` headers) |
125
142
 
126
143
  What stays in the app lib: the **template and styles** of every base above — the museum keeps its
127
144
  own HTML and Tailwind classes (the filter inputs, searchbar, catalog toolbar and filter bar, theme tags and select
128
- checkbox are logic only — extend the base, write the markup yourself; e.g. the confirmation-modal component is markup over `ConfirmationModalBaseComponent` /
145
+ checkbox, dropdown, tabs, wcag panel, breadcrumbs and menu item are logic only — extend the base, write the markup yourself; e.g. the confirmation-modal component is markup over `ConfirmationModalBaseComponent` /
129
146
  `ConfirmationModalService`), the `leaflet` dependency (`MapBaseComponent` asks the subclass for
130
147
  `loadLeaflet()`), `truncateHtml` and any museum-only tools. `local-storage`, `configs-cache`, `not-found-content` are gone: language lives in
131
148
  the framework `TranslationService`, the config cache in `ConfigsFacade.init()`.
@@ -28,12 +28,12 @@ skeleton; build the foundation with `mobilems-project-init` first.
28
28
  `node_modules/@smartsoft001-mobilems/angular/README.md`)
29
29
  2. `libs/shared/angular/README.md` — the app's own shared lib
30
30
 
31
- | Do not hand-roll | Use |
32
- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
33
- | a tab strip | `TabsComponent` / `Tab` from the shared lib (the page already imports it) |
34
- | result cards | the module's own list-item components (`objects-list-item`, news/collection cards) |
35
- | "next page" behaviour | the shared `NextPageComponent`, same pattern as the module lists |
36
- | a search input | `app-objects-searchbar` / the shared searchbar variants — the logic is `SearchbarBaseComponent`; the museum keeps its own template |
31
+ | Do not hand-roll | Use |
32
+ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
33
+ | a tab strip | `TabsComponent` / `Tab` from the shared lib (the page already imports it; logic: `TabsBaseComponent`, the museum keeps its own template) |
34
+ | result cards | the module's own list-item components (`objects-list-item`, news/collection cards) |
35
+ | "next page" behaviour | the shared `NextPageComponent`, same pattern as the module lists |
36
+ | a search input | the shared `searchbar` (logic: `SearchbarBaseComponent`, navigates to the search route; the museum keeps its own template); `app-objects-searchbar` is standalone and emits a live search instead |
37
37
 
38
38
  Forking a result card for search is the classic mistake: the card then drifts
39
39
  from the module's list and the museum ends up with two visually different