@synopackageland/ui 0.13.0 → 0.13.1

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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.1 (2026-10-21)
4
+
5
+ Additive only: existing props, default appearance and DOM structure are unchanged (new attributes only), so this is a patch release within the 0.13 line.
6
+
7
+ - Add `AppLayout navigation="top"` (also JSON `AppShell`): the `sidebar` slot becomes one bar above the page in the DSM-window and web presentations, with the brand, the `AppSidebar` items in a row (a row with children opens them in a menu; the bar scrolls sideways when the items run out of room) and `sidebar-footer`. There is no collapse or resize in this mode. A phone keeps the drawer. The default `"sidebar"` is unchanged. The SDK's `AppShell` has to forward the prop before an app can choose it through that shell (#19).
8
+ - Add theme tokens `--ui-icon-size` (navigation icons), `--ui-heading-weight` (`PageHeader`, `Card`, `TypoHeader` and web toolbar titles) and `--ui-card-padding` (a regular `Card`'s inset), plus `--ui-top-nav-height/-bg/-border` for the top bar and `--ui-mobile-bar-bg/-fg/-border` for the phone bar. Each is read with a fallback equal to the previous value: unset, nothing changes (#19).
9
+ - `Button`, `IconButton` and `SplitButton`'s group expose their variant as `data-variant`; the phone bar's menu button has `data-ui-mobile-menu` (#19).
10
+ - `docs/theme-hooks.md` (shipped in the package) makes the listed `data-ui-*`/`data-*` attributes and layout tokens public API, with stability rules: names, elements and listed values hold until a release marked breaking; values may be added in a patch; classes and nesting are not API (#19).
11
+
3
12
  ## 0.13.0 (2026-10-20)
4
13
 
5
14
  - Fix `SegmentControl variant="sheet"`: the selected tab keeps the content surface and accent text. Unselected background and text classes now apply only to unselected tabs, so stylesheet order cannot make the selected tab grey again (#16).
package/README.md CHANGED
@@ -350,6 +350,22 @@ import { AppLayout, Button, PageHeader } from '@synopackageland/ui'
350
350
 
351
351
  `AppLayout` also accepts `sidebar`, `toolbar`, and `footer` slots.
352
352
 
353
+ `navigation="top"` (0.13.1+) lays the `sidebar` slot out as one bar above the
354
+ page instead of a left column: the brand, then the `AppSidebar` items in a row
355
+ (a row with children opens them in a menu; the bar scrolls sideways when the
356
+ items run out of room), then `sidebar-footer`. It applies in the DSM-window
357
+ and web presentations; a phone keeps the drawer. The default `"sidebar"` is
358
+ unchanged. The JSON `AppShell` accepts the same prop; the SDK's `AppShell` must
359
+ forward it before an app can choose it through that shell.
360
+
361
+ ```vue
362
+ <AppLayout navigation="top" wide-layout="web">
363
+ <template #sidebar><AppSidebar v-model="page" :groups="groups" /></template>
364
+ <template #sidebar-footer><AppSidebarUser name="Ada Lin" /></template>
365
+ <PageContent>…</PageContent>
366
+ </AppLayout>
367
+ ```
368
+
353
369
  For standalone content that owns its layout, use `<PageContent surface="none" height="fill">`.
354
370
  It removes the page's horizontal gutters and adds no surface in web, DSM-window
355
371
  or phone layouts. The default `surface="auto"` remains unchanged; `flat` keeps
@@ -431,6 +447,15 @@ Status tones come in pairs, a soft fill and the text that reads on it:
431
447
  `StatusDot`, `StepList` and `ConnectionTopology` use only these and the base
432
448
  tones (`--ui-success`, …).
433
449
 
450
+ **Theme hooks.** The `data-ui-*` and `data-*` attributes and the layout tokens
451
+ listed in [docs/theme-hooks.md](docs/theme-hooks.md) are public API with
452
+ stability rules (0.13.1+): `--ui-icon-size`, `--ui-heading-weight`,
453
+ `--ui-card-padding`, the top bar's `--ui-top-nav-*` and the phone bar's
454
+ `--ui-mobile-bar-*`, `Button`'s `data-variant`, the layout regions
455
+ (`data-ui-layout-sidebar`, `data-ui-layout-main`, `data-ui-mobile-navigation`,
456
+ …). Each token is unset by default and the component then looks as before.
457
+ Everything else (classes, nesting) is an implementation detail.
458
+
434
459
  Density can be switched per application subtree:
435
460
 
436
461
  ```html
@@ -1,4 +1,4 @@
1
- import { WideLayout } from '../../../lib/adaptiveLayout';
1
+ import { AppNavigation, WideLayout } from '../../../lib/adaptiveLayout';
2
2
  type __VLS_Props = {
3
3
  sidebarWidth?: string;
4
4
  minHeight?: string;
@@ -18,6 +18,12 @@ type __VLS_Props = {
18
18
  * page can keep its header and pager in view.
19
19
  */
20
20
  height?: 'auto' | 'fill';
21
+ /**
22
+ * `'top'` lays the `sidebar` slot out as a bar across the top: brand,
23
+ * then the navigation in one row, then `sidebar-footer`. A phone keeps the
24
+ * drawer. Defaults to the left sidebar.
25
+ */
26
+ navigation?: AppNavigation;
21
27
  };
22
28
  type __VLS_Slots = {
23
29
  sidebar?: () => unknown;
@@ -36,6 +42,7 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {},
36
42
  sidebarStorageKey: string;
37
43
  brandName: string;
38
44
  brandIcon: string;
45
+ navigation: AppNavigation;
39
46
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
40
47
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
41
48
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,12 @@
1
+ import { AppSidebarItem } from './types';
2
+ type __VLS_Props = {
3
+ items: AppSidebarItem[];
4
+ modelValue?: string;
5
+ };
6
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
+ select: (item: AppSidebarItem) => any;
8
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
9
+ onSelect?: ((item: AppSidebarItem) => any) | undefined;
10
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
package/dist/index.d.ts CHANGED
@@ -183,7 +183,7 @@ export type { AccentScale } from './lib/accent';
183
183
  export { default as AppLayout } from './components/app/app-layout/AppLayout.vue';
184
184
  export { default as ResponsiveView } from './components/app/responsive-view/ResponsiveView.vue';
185
185
  export { appPresentationForWidth, MOBILE_LAYOUT_MAX, WEB_LAYOUT_MIN } from './lib/adaptiveLayout';
186
- export type { AppPresentation, WideLayout } from './lib/adaptiveLayout';
186
+ export type { AppNavigation, AppPresentation, WideLayout } from './lib/adaptiveLayout';
187
187
  export { ensureDeviceViewport } from './lib/deviceViewport';
188
188
  export { default as AppSidebar } from './components/app/app-sidebar/AppSidebar.vue';
189
189
  export { default as AppSidebarUser } from './components/app/app-sidebar/AppSidebarUser.vue';