@vc-shell/vc-app-skill 2.0.1 → 2.0.3-pr222.ba0d3c5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.3](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.2...v2.0.3) (2026-04-30)
4
+
5
+ **Note:** Version bump only for package @vc-shell/vc-app-skill
6
+
7
+ ## [2.0.2](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.1...v2.0.2) (2026-04-27)
8
+
9
+ **Note:** Version bump only for package @vc-shell/vc-app-skill
10
+
3
11
  ## [2.0.1](https://github.com/VirtoCommerce/vc-shell/compare/v2.0.0...v2.0.1) (2026-04-24)
4
12
 
5
13
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vc-shell/vc-app-skill",
3
- "version": "2.0.1",
3
+ "version": "2.0.3-pr222.ba0d3c5",
4
4
  "description": "AI coding skill for scaffolding and generating VirtoCommerce Shell applications. Works with Claude Code, OpenCode, Gemini, Codex, Cursor.",
5
5
  "bin": "./bin/install.cjs",
6
6
  "files": [
package/runtime/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.1
1
+ 2.0.3
@@ -1 +1 @@
1
- Synced from framework at commit 5f8005c08 on 2026-04-24T08:05:31.316Z
1
+ Synced from framework at commit d658f5b4c on 2026-04-30T07:59:28.391Z
@@ -19,22 +19,20 @@ This centralized approach has several advantages:
19
19
 
20
20
  ### Blade Navigation
21
21
 
22
- | Key | Type | Description |
23
- | --------------------------- | -------------------------------------- | -------------------------------------------- |
24
- | `NavigationViewLocationKey` | `BladeVNode` | Current blade VNode location in navigation |
25
- | `BladeDescriptorKey` | `ComputedRef<BladeDescriptor>` | Current blade descriptor metadata |
26
- | `BladeBackButtonKey` | `Component \| undefined` | Custom back button component for a blade |
27
- | `BladeDataKey` | _(from blade-navigation types)_ | Data passed between parent/child blades |
28
- | `BladeContextKey` | `ComputedRef<Record<string, unknown>>` | Blade-exposed context for widgets/extensions |
29
- | `BladeRoutesKey` | `BladeRoutesRecord[]` | Registered blade routes |
30
- | `InternalRoutesKey` | `BladeRoutesRecord[]` | Internal framework routes |
22
+ | Key | Type | Description |
23
+ | -------------------- | -------------------------------------- | -------------------------------------------- |
24
+ | `BladeDescriptorKey` | `ComputedRef<BladeDescriptor>` | Current blade descriptor metadata |
25
+ | `BladeBackButtonKey` | `Component \| undefined` | Custom back button component for a blade |
26
+ | `BladeDataKey` | _(from blade-navigation types)_ | Data passed between parent/child blades |
27
+ | `BladeContextKey` | `ComputedRef<Record<string, unknown>>` | Blade-exposed context for widgets/extensions |
28
+ | `BladeRoutesKey` | `BladeRoutesRecord[]` | Registered blade routes |
29
+ | `InternalRoutesKey` | `BladeRoutesRecord[]` | Internal framework routes |
31
30
 
32
31
  ### Notifications
33
32
 
34
- | Key | Type | Description |
35
- | -------------------------- | ----------------------------------- | ------------------------------------------- |
36
- | `NotificationTemplatesKey` | `NotificationTemplateConstructor[]` | Registered notification template components |
37
- | `NotificationStoreKey` | `NotificationStore` | Shared notification store singleton |
33
+ | Key | Type | Description |
34
+ | ---------------------- | ------------------- | ----------------------------------- |
35
+ | `NotificationStoreKey` | `NotificationStore` | Shared notification store singleton |
38
36
 
39
37
  ### Services
40
38
 
@@ -42,7 +40,6 @@ This centralized approach has several advantages:
42
40
  | ------------------------------- | ----------------------------- | ------------------------------ |
43
41
  | `WidgetServiceKey` | `IWidgetService` | Widget registration and lookup |
44
42
  | `DashboardServiceKey` | `IDashboardService` | Dashboard widget management |
45
- | `GlobalSearchKey` | `GlobalSearchState` | Global search state |
46
43
  | `MenuServiceKey` | `MenuService` | Main navigation menu |
47
44
  | `SettingsMenuServiceKey` | `ISettingsMenuService` | Settings sidebar menu |
48
45
  | `AppBarWidgetServiceKey` | `IAppBarWidgetService` | App bar widget slots |
@@ -81,14 +78,23 @@ This centralized approach has several advantages:
81
78
 
82
79
  ### Legacy Aliases (Deprecated)
83
80
 
84
- | Deprecated | Use Instead |
85
- | ----------------------------- | --------------------------- |
86
- | `navigationViewLocation` | `NavigationViewLocationKey` |
87
- | `BladeDescriptor` | `BladeDescriptorKey` |
88
- | `NotificationTemplatesSymbol` | `NotificationTemplatesKey` |
89
- | `BLADE_BACK_BUTTON` | `BladeBackButtonKey` |
90
- | `TOOLBAR_SERVICE` | `ToolbarServiceKey` |
91
- | `EMBEDDED_MODE` | `EmbeddedModeKey` |
81
+ | Deprecated | Use Instead |
82
+ | ------------------- | -------------------- |
83
+ | `BladeDescriptor` | `BladeDescriptorKey` |
84
+ | `BLADE_BACK_BUTTON` | `BladeBackButtonKey` |
85
+ | `TOOLBAR_SERVICE` | `ToolbarServiceKey` |
86
+ | `EMBEDDED_MODE` | `EmbeddedModeKey` |
87
+
88
+ ### Removed Keys (No Replacement)
89
+
90
+ These keys existed in v1.2.3 but have been removed from the framework entirely. There is no drop-in symbol replacement.
91
+
92
+ | Removed | Notes |
93
+ | ----------------------------- | ------------------------------------------------------------------------------ |
94
+ | `navigationViewLocation` | Internal framework concern — no public replacement |
95
+ | `BladeInstance` | Use `useBlade()` composable, or `inject(BladeDescriptorKey)` |
96
+ | `NotificationTemplatesSymbol` | Template system replaced by `NotificationStoreKey` + `useBladeNotifications()` |
97
+ | `GlobalSearchKey` | Internal concern now — no public replacement |
92
98
 
93
99
  ## Usage Examples
94
100
 
@@ -122,6 +122,8 @@ function resetLayout() {
122
122
  - **Widget registration**: Widgets must be registered via `useDashboard().registerWidget()` before the dashboard mounts. The component reads the widget registry and creates grid items for each.
123
123
  - **markRaw requirement**: Widget components must be wrapped in `markRaw()` when registering to prevent Vue from making them reactive (which would cause performance issues with the grid system).
124
124
  - **Responsive behavior**: On mobile viewports, widgets stack vertically in a single column. Drag-and-drop is disabled on touch devices for better usability.
125
+ - **Module-ready gate**: When the host injects `ModulesReadyKey` (provided by `@vc-shell/mf-host`'s `registerRemoteModules`), the grid is held back until remote modules finish installing. This prevents widgets from mounting before their owning module's `defineAppModule.install` has merged its locales into vue-i18n — which would render translation keys instead of translated strings. Hosts without Module Federation (or tests/Storybook) inject nothing, and a fallback `ref(true)` keeps behavior unchanged.
126
+ - **Loading skeletons**: While `ModulesReadyKey` is `false`, the dashboard renders a CSS-grid of pulsing placeholder cards instead of an empty container. Card sizes are restored from the last persisted layout in `localStorage` (so returning users see placeholders matching their real widgets); first-time visitors get a default layout of four 6×6 placeholders. Animations respect `prefers-reduced-motion`.
125
127
 
126
128
  ## Tips
127
129
 
@@ -196,6 +196,15 @@ For read-only display, `VcField` is lighter and cleaner than a disabled `VcInput
196
196
 
197
197
  The `type` prop affects rendering, not validation. Setting `type="email"` does not validate the email format -- it only renders the value as a `mailto:` link. For input validation, use VcInput with validation rules.
198
198
 
199
+ ## Horizontal Layout Without Label
200
+
201
+ In `orientation="horizontal"` the component reserves the `aspectRatio[0]` track even when `label` is omitted. This keeps a column of `VcField`s aligned with their labeled siblings in a form grid. Use vertical orientation if you do not want this reservation.
202
+
203
+ ```vue
204
+ <!-- Reserves the label column to align with sibling fields -->
205
+ <VcField orientation="horizontal" :aspect-ratio="[1, 2]" model-value="No label" />
206
+ ```
207
+
199
208
  ## Related Components
200
209
 
201
210
  - [VcInput](../vc-input/) -- editable text field (use instead when user input is needed)
@@ -1,28 +0,0 @@
1
- # usePlatformLocaleSync
2
-
3
- One-way reactive bridge from the VirtoCommerce platform's locale storage key (`NG_TRANSLATE_LANG_KEY`, set by AngularJS + angular-translate) to the shell's language service.
4
-
5
- Call this composable only when the shell runs embedded inside the platform — `useShellBootstrap` invokes it automatically when `options.isEmbedded === true`. In standalone mode the shell owns its own locale via `VC_LANGUAGE_SETTINGS`, and this composable should not be used.
6
-
7
- ## When to Use
8
-
9
- - Never call directly from feature code. This is a framework-internal sync primitive.
10
- - It is invoked once per `VcApp` mount from `useShellBootstrap`.
11
-
12
- ## Behaviour
13
-
14
- - Reads `localStorage["NG_TRANSLATE_LANG_KEY"]` via VueUse's `useLocalStorage`, which subscribes to `storage` events for cross-tab reactivity.
15
- - On setup, if the value is non-empty, calls `LanguageService.setLocale(value)`. `setLocale` normalises the value (e.g. `en-US` → `en-us`), falls back to `en` for unsupported locales, updates `vue-i18n`, reconfigures `vee-validate`, and persists to `VC_LANGUAGE_SETTINGS`.
16
- - On subsequent changes of the platform key, re-applies the value.
17
- - Skips empty strings (platform clearing the key does not blank the shell locale).
18
- - Skips values equal to `currentLocale` to avoid redundant re-configuration.
19
-
20
- ## How It Works
21
-
22
- `useLocalStorage("NG_TRANSLATE_LANG_KEY", "")` returns a `Ref<string>` that VueUse keeps in sync with `localStorage` and the DOM `storage` event (which fires in tabs other than the writer). The composable applies the current ref value once synchronously and then registers a `watch` on it; any cross-tab mutation flows through the ref into `setLocale`.
23
-
24
- The watcher is bound to the active effect scope (typically `VcApp`'s setup). When `VcApp` unmounts, the watcher stops; `useLocalStorage` cleans up its own `storage` listener.
25
-
26
- ## Relationship to `VC_LANGUAGE_SETTINGS`
27
-
28
- The sync is strictly one-directional. `setLocale` writes to `VC_LANGUAGE_SETTINGS` as a side effect, but this composable never writes to `NG_TRANSLATE_LANG_KEY`. In embedded mode the in-shell `LanguageSelector` is unreachable (it lives inside `UserDropdownButton`, which is hidden when `isEmbedded` is `true`), so there is no competing writer from the shell side.