@synopackageland/ui 0.20.10 → 0.20.12

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.
@@ -146,6 +146,40 @@ this in Chromium at 390 and 768 with touch, with Android emulated by a
146
146
  viewport resize and iOS by a stand-in visual viewport. A real-device pass on
147
147
  iOS Safari and Android Chrome is still needed (spec D6).
148
148
 
149
+ ## Short screens
150
+
151
+ A screen at most 480px tall (a phone in landscape: 753×279, 667×375,
152
+ 844×390) is too short for a page header, a section strip, the settings rows and
153
+ an Apply footer stacked over each other. Outside the phone presentation,
154
+ `AppLayout` then switches to its short mode (`SHORT_VIEWPORT_QUERY`,
155
+ `(max-height: 480px)` of the viewport, so a DSM window on a desktop never gets
156
+ it). The root carries `data-ui-layout-short`, and `APP_SHORT_KEY` tells
157
+ components below it. Every App gets it; there is nothing to set.
158
+
159
+ - **The title is in the bar.** The page's title (AppLayout's `title`, else
160
+ its `PageHeader`'s) leads the bar above the page (`data-ui-layout-bar`),
161
+ in the row of the `toolbar` slot. A `PageHeader` with the same title keeps
162
+ its heading for screen readers only, and takes no room when it has nothing
163
+ else to show.
164
+ - **The page scrolls as one.** A page holding a `SettingsPage` or a
165
+ `SectionTabs fill` no longer squeezes the settings body between the bar,
166
+ the strip and the footer: in a layout with a height of its own (`height="fill"`,
167
+ or a content area the App clips or scrolls) the whole column scrolls, the
168
+ bar and the header scroll away, the section strip sticks at the top and
169
+ Reset / Apply at the bottom.
170
+ Other pages, such as a DataGrid that scrolls itself, keep their layout.
171
+ - **The header does not stick.** A `PageHeader` scrolls with the page, in a
172
+ tight row (8px above and below).
173
+
174
+ At any height, a `SectionTabs fill` strip (and a pushed section's Back header on a phone) sticks below a sticky `PageHeader`
175
+ in the same `PageContent` (`--ui-page-sticky-top`, the header's height)
176
+ instead of sliding under it.
177
+
178
+ A phone in portrait keeps the phone presentation unchanged. `node
179
+ scripts/check-short-viewport.mjs [out-dir]` (after `pnpm build`) checks the
180
+ three landscape sizes, 360×697 and 1280×800 for a shell that hides its title,
181
+ one that shows a `PageHeader` (filled or not) and a filled AppLayout.
182
+
149
183
  ## Web presentation sidebar
150
184
 
151
185
  In `web`, the sidebar's 48px head row ends with a collapse button, and a
@@ -52,6 +52,11 @@ are in [dsm-native-metrics.md](dsm-native-metrics.md).
52
52
  8. An icon-only action is an `IconButton` with a `label`; it shows as its
53
53
  tooltip and names the button for screen readers.
54
54
  9. Labels are verbs, without a closing period: Apply, Disable this connection.
55
+ 10. A label is plain text, with at most an icon before or after it:
56
+ `<Button><Mic :size="16" />Record</Button>`. The Button counts only an `svg`
57
+ or an element marked `data-icon` (`Icon` and `StatusDot` are) as the icon:
58
+ it gets the 8px gap and sits on the label's centre line. Do not wrap the
59
+ text in a `<span>`; a span is read as text, so it gets no gap of its own.
55
60
 
56
61
  ## What the components do
57
62
 
@@ -111,10 +111,12 @@ step 3, so links and selected labels stay readable on a dark page.
111
111
  ## Dark theme
112
112
 
113
113
  The dark theme (`src/theme/dark.css`) ships inside `theme.css` and the embedded stylesheets. It applies wherever
114
- `data-ui-color-scheme="dark"` is set: on the app root through
115
- `<AppRoot color-scheme="dark">`, or on `<html>` for a full page (an app with
116
- an accent still passes `color-scheme="dark"` to AppRoot, which derives the
117
- accent for it). The library does not follow `prefers-color-scheme` by itself;
114
+ `data-ui-color-scheme="dark"` is set: on the app root (`[data-ui-app]`)
115
+ through `<AppRoot color-scheme="dark">`. With `theme.css` on a page of your own,
116
+ `<html data-ui-color-scheme="dark">` works too; the embedded stylesheets (a DSM
117
+ window) are scoped to the app root and read the attribute only there, never on
118
+ the host's `<html>` (an app with an accent passes `color-scheme="dark"` to
119
+ AppRoot in any case, which derives the accent for it). The library does not follow `prefers-color-scheme` by itself;
118
120
  the host decides and sets the attribute.
119
121
 
120
122
  The same roles, with the light page's sage carried into the greys:
@@ -31,7 +31,7 @@ here stay implementation details and can change in any release.
31
31
  | --- | --- | --- |
32
32
  | `data-ui-app` | `AppRoot`'s root and its floating hosts (portals) | present |
33
33
  | `data-ui-theme`, `data-ui-density`, `data-ui-accent` | the app root (mirrored on floating hosts) | theme name, `compact`/`comfortable`, present |
34
- | `data-ui-color-scheme` | the app root (AppRoot `color-scheme`, mirrored on floating hosts) or `<html>` | `dark` |
34
+ | `data-ui-color-scheme` | the app root (AppRoot `color-scheme`, mirrored on floating hosts); `<html>` only with `theme.css`, not the embedded stylesheets | `dark` |
35
35
  | `data-ui-presentation` | `AppRoot` root | `mobile` (640px or narrower), else `web` for a `full-page` root or one holding an `AppLayout` with `wide-layout="web"` from 960px, else `window` (a DSM window at any width) |
36
36
  | `data-ui-floating` | a floating host (dialog, menu, popover) | present |
37
37
  | `data-ui-layout-mode` | `AppLayout` root | `mobile`, `window`, `web` |
package/docs/wizard.md CHANGED
@@ -53,6 +53,10 @@ const open = ref(false)
53
53
  - **Text.** `description` is one short line at the top of the step, under the
54
54
  hero, without a closing period. Keep the content to the controls the step
55
55
  needs; it may be wide (a row of cards) or a form.
56
+ - **Layout.** The step lays its content out as written, in block flow: it
57
+ does not stack its children with a gap. Several blocks go in one `Form`
58
+ (fields one field gap apart) or a `<Space direction="column">`; a lone
59
+ Callout, paragraph or card grid needs no wrapper.
56
60
  - **Choices.** A step's 2–4 options are choice cards:
57
61
  `<RadioGroup variant="card" orientation="horizontal" :options>`. Each card
58
62
  shows the option's `icon` in a tile, its label and one line, and keeps the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/ui",
3
- "version": "0.20.10",
3
+ "version": "0.20.12",
4
4
  "description": "Shared Vue 3 UI component library with a DSM 7 inspired application theme",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -60,6 +60,60 @@
60
60
  "./themes/dsm7-embedded-reset.css": "./dist/themes/dsm7-embedded-reset.css",
61
61
  "./themes/dsm7-embedded-theme.css": "./dist/themes/dsm7-embedded-theme.css"
62
62
  },
63
+ "scripts": {
64
+ "check:docs": "node --test scripts/check-doc-versions.test.mjs && node scripts/check-doc-versions.mjs",
65
+ "dev": "vite build --watch",
66
+ "build": "vite build && vite build --mode json && vite build --mode rich-text && vite build --mode grid && vite build --mode cli && vite build --mode preview && vite build --mode embedded && node scripts/postbuild.mjs",
67
+ "lint": "eslint .",
68
+ "typecheck": "vue-tsc --noEmit -p tsconfig.json",
69
+ "test": "vitest run",
70
+ "test:watch": "vitest",
71
+ "test:changed": "echo \"test:changed skips the tests the changes since ${SYNOPKGLAND_GATE_BASE:-origin/master} do not reach (vitest --changed); pnpm check runs them all\" && vitest run --changed ${SYNOPKGLAND_GATE_BASE:-origin/master}",
72
+ "story": "histoire dev",
73
+ "story:build": "histoire build",
74
+ "check:host": "node scripts/dsm-host-shots.mjs",
75
+ "check:switch": "node scripts/check-switch.mjs",
76
+ "check:tabs": "node scripts/check-tabs.mjs",
77
+ "check:mobile": "node scripts/check-mobile-overflow.mjs",
78
+ "check:ui-patch": "node scripts/check-ui-patch.mjs",
79
+ "check:narrow": "node scripts/check-narrow-controls.mjs",
80
+ "check:drawer-form": "node scripts/check-drawer-form.mjs",
81
+ "check:responsive": "node scripts/check-responsive.mjs",
82
+ "check:adaptive": "node scripts/check-adaptive.mjs",
83
+ "check:sidebar-focus": "node scripts/check-sidebar-focus.mjs",
84
+ "check:json-render": "node scripts/check-json-render.mjs",
85
+ "check:motion": "node scripts/check-motion.mjs",
86
+ "check:topology": "node scripts/check-topology.mjs",
87
+ "check:wizard": "node scripts/check-wizard.mjs",
88
+ "check:edges": "node scripts/check-edges.mjs",
89
+ "check:data-grid": "node scripts/check-data-grid.mjs",
90
+ "check:truncation": "node scripts/check-truncation.mjs",
91
+ "check:link": "node scripts/check-link.mjs",
92
+ "check:text-select": "node scripts/check-text-select.mjs",
93
+ "check:date-picker": "node scripts/check-date-picker.mjs",
94
+ "check:full-page": "node scripts/check-full-page.mjs",
95
+ "check:short-viewport": "node scripts/check-short-viewport.mjs",
96
+ "check:detail-surface": "node scripts/check-detail-surface.mjs",
97
+ "check:internal": "node --test scripts/check-internal-content.test.mjs scripts/check-npm-metadata.test.mjs && node scripts/check-internal-content.mjs --repo .",
98
+ "check:npm-metadata": "node scripts/check-npm-metadata.mjs",
99
+ "check:package": "node scripts/check-package-content.mjs",
100
+ "check:public-api-consumer": "node scripts/check-public-api-consumer.mjs",
101
+ "notices:update": "node scripts/third-party-notices.mjs --write",
102
+ "notices:check": "node scripts/third-party-notices.mjs --check",
103
+ "check": "bash scripts/docker-check.sh \"npm run gates\"",
104
+ "check:fast": "bash scripts/docker-check.sh \"npm run gates\"",
105
+ "check:local-browser": "node scripts/app-local-browser.mjs",
106
+ "check:infotip": "node scripts/check-infotip.mjs",
107
+ "release:stage": "node scripts/stage-release.mjs",
108
+ "check:polish": "bash scripts/docker-check.sh --build --out .polish-shots 'node scripts/check-polish.mjs'",
109
+ "check:acceptance": "node scripts/check-acceptance.mjs",
110
+ "check:palette": "node scripts/check-palette.mjs",
111
+ "gates": "node scripts/gates.mjs",
112
+ "gates:full": "node scripts/gates.mjs --full",
113
+ "check:layout": "node scripts/check-layout.mjs",
114
+ "release:smoke": "node scripts/release-smoke.mjs",
115
+ "check:browser-install": "playwright install chromium"
116
+ },
63
117
  "peerDependencies": {
64
118
  "vue": "^3.5.0"
65
119
  },
@@ -79,9 +133,44 @@
79
133
  "@tiptap/vue-3": "3.32.1",
80
134
  "zod": "^4.6.5"
81
135
  },
136
+ "devDependencies": {
137
+ "@eslint/js": "10.0.1",
138
+ "@histoire/plugin-vue": "1.0.0-beta.1",
139
+ "@tailwindcss/vite": "4.3.3",
140
+ "@tanstack/vue-virtual": "3.13.39",
141
+ "@vitejs/plugin-vue": "6.0.9",
142
+ "@vue/test-utils": "2.5.1",
143
+ "@vueuse/core": "14.4.0",
144
+ "eslint": "10.11.0",
145
+ "eslint-plugin-vue": "10.11.1",
146
+ "flexsearch": "0.8.212",
147
+ "globals": "17.12.0",
148
+ "histoire": "1.0.0-beta.1",
149
+ "jsdom": "30.1.1",
150
+ "playwright": "1.58.2",
151
+ "reka-ui": "2.11.0",
152
+ "tailwindcss": "4.3.3",
153
+ "typescript": "5.9.3",
154
+ "typescript-eslint": "8.71.0",
155
+ "vite": "7.3.6",
156
+ "vite-plugin-dts": "5.1.1",
157
+ "vitest": "5.0.2",
158
+ "vscode-oniguruma": "2.0.1",
159
+ "vscode-textmate": "9.3.2",
160
+ "vue": "3.5.43",
161
+ "vue-eslint-parser": "10.4.1",
162
+ "vue-tsc": "3.3.11"
163
+ },
82
164
  "engines": {
83
165
  "node": ">=20"
84
166
  },
167
+ "packageManager": "pnpm@10.33.2",
168
+ "pnpm": {
169
+ "onlyBuiltDependencies": [
170
+ "esbuild",
171
+ "vue-demi"
172
+ ]
173
+ },
85
174
  "config": {
86
175
  "bundledRuntime": {
87
176
  "@tanstack/vue-virtual": "3.13.39",