@synopackageland/ui 0.23.6 → 0.23.8
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 +14 -0
- package/README.md +7 -3
- package/dist/cli.js +0 -0
- package/dist/components/app/app-layout/hideOnScroll.d.ts +12 -1
- package/dist/components/app/app-root/AppRoot.vue.d.ts +2 -0
- package/dist/components/app/settings-page/SettingsPage.vue.d.ts +2 -2
- package/dist/index.js +1783 -1777
- package/dist/json-preview/preview.js +2373 -2367
- package/dist/reka-runtime.json +1 -1
- package/dist/theme.css +1 -1
- package/dist/themes/dsm7-embedded-theme.css +1 -1
- package/dist/themes/dsm7-embedded.css +1 -1
- package/dist/themes/dsm7.css +1 -1
- package/docs/color-system.md +10 -3
- package/docs/mobile-native.md +22 -9
- package/docs/release-checks.md +1 -1
- package/docs/theme-hooks.md +5 -0
- package/package.json +3 -88
package/docs/color-system.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The theme draws every colour from five 12-step scales built from DSM 7's own
|
|
4
4
|
colours (`src/theme/palette.css`). Components use the semantic tokens
|
|
5
5
|
(`--ui-primary`, `--ui-text-secondary`, …) in `src/theme/dsm7.css`, and each
|
|
6
|
-
of those is one step of a scale. The theme is light
|
|
6
|
+
of those is one step of a scale. The default theme is light, like DSM 7.
|
|
7
7
|
|
|
8
8
|
## Scales
|
|
9
9
|
|
|
@@ -110,14 +110,21 @@ step 3, so links and selected labels stay readable on a dark page.
|
|
|
110
110
|
|
|
111
111
|
## Dark theme
|
|
112
112
|
|
|
113
|
+
In a DSM window, leave AppRoot's `color-scheme` unset and do not set
|
|
114
|
+
`data-ui-color-scheme`. DSM draws the window light, even when the operating
|
|
115
|
+
system prefers dark mode. Do not follow `prefers-color-scheme` in a DSM window.
|
|
116
|
+
Only a full page of the app's own (a portal or its own browser tab) may follow
|
|
117
|
+
that preference.
|
|
118
|
+
|
|
113
119
|
The dark theme (`src/theme/dark.css`) ships inside `theme.css` and the embedded stylesheets. It applies wherever
|
|
114
120
|
`data-ui-color-scheme="dark"` is set: on the app root (`[data-ui-app]`)
|
|
115
121
|
through `<AppRoot color-scheme="dark">`. With `theme.css` on a page of your own,
|
|
116
122
|
`<html data-ui-color-scheme="dark">` works too; the embedded stylesheets (a DSM
|
|
117
123
|
window) are scoped to the app root and read the attribute only there, never on
|
|
118
124
|
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
|
|
120
|
-
|
|
125
|
+
AppRoot in any case, which derives the accent for it). The library does not
|
|
126
|
+
follow `prefers-color-scheme` by itself; an app that owns its full page decides
|
|
127
|
+
and sets the attribute.
|
|
121
128
|
|
|
122
129
|
The same roles, with the light page's sage carried into the greys:
|
|
123
130
|
|
package/docs/mobile-native.md
CHANGED
|
@@ -14,7 +14,8 @@ App. Each line links to its details below.
|
|
|
14
14
|
| One compact top bar | One 44px row: Back, the menu button or the App icon, the title, at most two icons and one "…". No brand row, no second header row. |
|
|
15
15
|
| No tab heading on tab pages | A page of the tab bar draws no title, icon or brand in the bar (`phone-bar-title="none"`) and no heading of its own: the tab bar says where the user is. A sub-page keeps Back and its title. |
|
|
16
16
|
| Title on a tab page is opt-in | Showing a title on a tab page is the App's explicit choice: `phone-bar-title="auto"` on `AppLayout`, and the SDK AppShell's own opt-in (`phoneTitle`). |
|
|
17
|
-
| Hide on scroll | By `transform` only; the scroller keeps its size, position and padding and nothing writes `scrollTop`, so a momentum fling keeps going. Slow scrolls use distance hysteresis, flicks decide at once. See [Hide on scroll](#native-phone-shell) and [Gesture velocity](#gesture-velocity). |
|
|
17
|
+
| Hide on scroll | By `transform` only; the scroller keeps its size, position and padding and nothing writes `scrollTop`, so a momentum fling keeps going. Slow scrolls use distance hysteresis, flicks decide at once. While the page has scrolled less than the room above its content (the bar's row, a toolbar row, a host header's room), the bars show, a bounce past the top included; a scroll back into that zone shows them before the room shows empty, so the first content never sits below an empty band. See [Hide on scroll](#native-phone-shell) and [Gesture velocity](#gesture-velocity). |
|
|
18
|
+
| Commit footers never hide on scroll | A `SettingsPage` commit footer (Reset / Apply) is out of sight while the form is clean, slides in when it becomes dirty, invalid or saving, and stays in one place through every scroll and fling; Apply, Reset or the form becoming clean slides it out. On a phone it is a compact bar (8px padding, 32px buttons with 14px text and a 44px hit area: 48px plus its divider and the real safe-area inset), the tab bar stays directly under it, and the page's end space includes it so the last field scrolls fully above it. See [Settings footer](#native-phone-shell). |
|
|
18
19
|
| No horizontal pan | The page never pans sideways: the phone layout's content area and page scroller clip `overflow-x`, a `PageHeader`'s last action keeps its tap box inside the header, and `check:phone-layout` asserts `scrollWidth == clientWidth` for the document and the page's scrollers at 320, 360, 390 and 430px and in landscape (825x360, 753x279), also when the scroller is an App's own element in a fill page. An inner horizontal scroller (a table, a tab strip) still scrolls. |
|
|
19
20
|
| Bottom accessory | `#accessory` docks above the tab bar, lifts the FAB and toasts, and slides into the tab bar's place with the bars. |
|
|
20
21
|
| Sticky offsets | `--ui-sticky-top-offset` counts the covered padding, a sticky `PageHeader`, the tabs strip and every `data-ui-sticky` row, so scrolling to an element lands below them. A row in an App's own nested scroller (a side pane, a record pane) sticks below the sticky `PageHeader` and tabs strip in that scroller and counts only there. |
|
|
@@ -716,14 +717,20 @@ scrolls natively; the decision reads the shared velocity estimator (see
|
|
|
716
717
|
[Gesture velocity](#gesture-velocity)) and the distance travelled one way:
|
|
717
718
|
|
|
718
719
|
- a slow scroll down of `hideDistance` (48px) slides the bar, the tab bar,
|
|
719
|
-
the FAB
|
|
720
|
+
and the FAB out (`data-ui-bars-hidden`); a slow
|
|
720
721
|
scroll up of `showDistance` (24px) brings them back, so a slow or wobbly
|
|
721
722
|
drag never flickers them;
|
|
722
723
|
- a flick at `flick` (1000 px/s) or faster hides them, or shows them, at
|
|
723
724
|
once, and they move in 60% of `--ui-motion-bars` (never under 120ms;
|
|
724
725
|
`--ui-bars-motion` on the layout), else in `--ui-motion-bars` (200ms; at
|
|
725
726
|
once with reduced motion);
|
|
726
|
-
-
|
|
727
|
+
- while the page has scrolled less than the room above its content (the
|
|
728
|
+
top of the content area measured from the layout's column: the bar's row,
|
|
729
|
+
a toolbar row, a DSM portal header's room), they show whatever the
|
|
730
|
+
direction or speed, a bounce past the top included; they hide only once
|
|
731
|
+
content lies under them, and a scroll back into that zone shows them
|
|
732
|
+
before the room above the content can show empty;
|
|
733
|
+
- a scroll that stops at the page's end brings them back.
|
|
727
734
|
|
|
728
735
|
The bars move by `transform` only. When the page scrolls in an area under
|
|
729
736
|
the bar (a fill layout, or an App shell whose `main` does not let the
|
|
@@ -746,14 +753,20 @@ page that scrolls less than the bars' room never hides them.
|
|
|
746
753
|
|
|
747
754
|
- Opt out for the App: `<AppLayout :hide-on-scroll="false">`; for one page:
|
|
748
755
|
`<PageContent :hide-on-scroll="false">`. Both keep the settings footer too.
|
|
749
|
-
- **Settings footer.**
|
|
750
|
-
|
|
751
|
-
in
|
|
756
|
+
- **Settings footer.** On a phone a `SettingsPage` footer is a commit bar
|
|
757
|
+
and never takes part in hide on scroll. It is out of sight while the form
|
|
758
|
+
is clean and slides in when the form is dirty, invalid or saving; it then
|
|
759
|
+
stays in one place through every scroll and fling, and slides out after
|
|
760
|
+
Apply, Reset or the form becoming clean. While it shows, the tab bar stays
|
|
761
|
+
directly under it (one bottom edge), and the page's end space includes it,
|
|
762
|
+
so the last field scrolls fully above it. It moves by `transform` only;
|
|
763
|
+
the scroller is never resized. Set `dirty`, `invalid` and `saving` on the
|
|
752
764
|
SettingsPage, or let it read them: clean while the footer's primary button
|
|
753
765
|
(every button, without a primary) is disabled, invalid while a field has
|
|
754
|
-
`aria-invalid="true"`, saving while a footer button is loading.
|
|
755
|
-
footer
|
|
756
|
-
|
|
766
|
+
`aria-invalid="true"`, saving while a footer button is loading. The phone
|
|
767
|
+
footer is compact: 8px above and below 32px buttons (14px text, 12px side
|
|
768
|
+
padding), 48px plus its divider and only the real safe-area inset; each button keeps a 44px
|
|
769
|
+
hit area inside the footer. A DSM window and a desktop are unchanged.
|
|
757
770
|
|
|
758
771
|
**Bottom accessory.** `AppLayout`'s `#accessory` slot is a bar across the
|
|
759
772
|
bottom of the page for something the App is running (a recording bar, a mini
|
package/docs/release-checks.md
CHANGED
|
@@ -8,7 +8,7 @@ checks through the optional build-isolation wrapper.
|
|
|
8
8
|
|
|
9
9
|
| Entry point | Default | Explicit full |
|
|
10
10
|
| --- | --- | --- |
|
|
11
|
-
| `npm run gates`, `scripts/gates.mjs` | Internal-content checks, build, lint, typecheck, unit tests, notices, isolated pack and tarball content audit | Adds Chromium installation, responsive/adaptive/date-picker/JSON/host/switch/layout/InfoTip/motion/short-viewport/phone-layout/focus-restore browser checks, Histoire build, exact-tarball registry consumer smoke |
|
|
11
|
+
| `npm run gates`, `scripts/gates.mjs` | Internal-content checks, build, lint, typecheck, unit tests, notices, isolated pack and tarball content audit | Adds Chromium and WebKit installation, responsive/adaptive/date-picker/JSON/host/switch/layout/InfoTip/motion/short-viewport/phone-layout/phone-bars (Chromium and WebKit)/focus-restore browser checks, Histoire build, exact-tarball registry consumer smoke |
|
|
12
12
|
| `pnpm check`, `check:fast` | Basic, with optional Docker host build isolation | `SPL_FULL_GATE=1` selects the same full plan |
|
|
13
13
|
| `fast-ci.yml`, composite verify action | Basic | No automatic extended checks |
|
|
14
14
|
| Disabled CI/release workflow templates | Basic, version/tag/ancestry checks, stage, pack and actual archive audit | No implicit browser or registry consumer smoke |
|
package/docs/theme-hooks.md
CHANGED
|
@@ -27,6 +27,11 @@ here stay implementation details and can change in any release.
|
|
|
27
27
|
|
|
28
28
|
### Application root and layout
|
|
29
29
|
|
|
30
|
+
In a DSM window, leave AppRoot's `color-scheme` unset and do not set
|
|
31
|
+
`data-ui-color-scheme`: DSM draws the window light, even when the operating
|
|
32
|
+
system prefers dark mode. Only a full page of the app's own (a portal or its
|
|
33
|
+
own browser tab) may follow `prefers-color-scheme` (see [Dark theme](color-system.md#dark-theme)).
|
|
34
|
+
|
|
30
35
|
| Attribute | On | Values |
|
|
31
36
|
| --- | --- | --- |
|
|
32
37
|
| `data-ui-app` | `AppRoot`'s root and its floating hosts (portals) | present |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synopackageland/ui",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.8",
|
|
4
4
|
"description": "Shared Vue 3 UI component library with a DSM 7 inspired application theme",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -79,34 +79,6 @@
|
|
|
79
79
|
"@tiptap/vue-3": "3.32.1",
|
|
80
80
|
"zod": "^4.6.5"
|
|
81
81
|
},
|
|
82
|
-
"devDependencies": {
|
|
83
|
-
"@eslint/js": "10.0.1",
|
|
84
|
-
"@histoire/plugin-vue": "1.0.0-beta.1",
|
|
85
|
-
"@tailwindcss/vite": "4.3.3",
|
|
86
|
-
"@tanstack/vue-virtual": "3.13.39",
|
|
87
|
-
"@vitejs/plugin-vue": "6.0.9",
|
|
88
|
-
"@vue/test-utils": "2.5.1",
|
|
89
|
-
"@vueuse/core": "14.4.0",
|
|
90
|
-
"eslint": "10.11.0",
|
|
91
|
-
"eslint-plugin-vue": "10.11.1",
|
|
92
|
-
"flexsearch": "0.8.212",
|
|
93
|
-
"globals": "17.12.0",
|
|
94
|
-
"histoire": "1.0.0-beta.1",
|
|
95
|
-
"jsdom": "30.1.1",
|
|
96
|
-
"playwright": "1.58.2",
|
|
97
|
-
"reka-ui": "2.11.0",
|
|
98
|
-
"tailwindcss": "4.3.3",
|
|
99
|
-
"typescript": "5.9.3",
|
|
100
|
-
"typescript-eslint": "8.71.0",
|
|
101
|
-
"vite": "7.3.6",
|
|
102
|
-
"vite-plugin-dts": "5.1.1",
|
|
103
|
-
"vitest": "5.0.2",
|
|
104
|
-
"vscode-oniguruma": "2.0.1",
|
|
105
|
-
"vscode-textmate": "9.3.2",
|
|
106
|
-
"vue": "3.5.43",
|
|
107
|
-
"vue-eslint-parser": "10.4.1",
|
|
108
|
-
"vue-tsc": "3.3.11"
|
|
109
|
-
},
|
|
110
82
|
"engines": {
|
|
111
83
|
"node": ">=20"
|
|
112
84
|
},
|
|
@@ -117,62 +89,5 @@
|
|
|
117
89
|
"reka-ui": "2.11.0"
|
|
118
90
|
}
|
|
119
91
|
},
|
|
120
|
-
"homepage": "https://www.varvis.me/docs/"
|
|
121
|
-
|
|
122
|
-
"check:docs": "node --test scripts/check-doc-versions.test.mjs && node scripts/check-doc-versions.mjs",
|
|
123
|
-
"dev": "vite build --watch",
|
|
124
|
-
"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",
|
|
125
|
-
"lint": "eslint .",
|
|
126
|
-
"typecheck": "vue-tsc --noEmit -p tsconfig.json",
|
|
127
|
-
"test": "vitest run",
|
|
128
|
-
"test:watch": "vitest",
|
|
129
|
-
"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}",
|
|
130
|
-
"story": "histoire dev",
|
|
131
|
-
"story:build": "histoire build",
|
|
132
|
-
"check:host": "node scripts/dsm-host-shots.mjs",
|
|
133
|
-
"check:switch": "node scripts/check-switch.mjs",
|
|
134
|
-
"check:tabs": "node scripts/check-tabs.mjs",
|
|
135
|
-
"check:mobile": "node scripts/check-mobile-overflow.mjs",
|
|
136
|
-
"check:ui-patch": "node scripts/check-ui-patch.mjs",
|
|
137
|
-
"check:narrow": "node scripts/check-narrow-controls.mjs",
|
|
138
|
-
"check:drawer-form": "node scripts/check-drawer-form.mjs",
|
|
139
|
-
"check:responsive": "node scripts/check-responsive.mjs",
|
|
140
|
-
"check:adaptive": "node scripts/check-adaptive.mjs",
|
|
141
|
-
"check:sidebar-focus": "node scripts/check-sidebar-focus.mjs",
|
|
142
|
-
"check:json-render": "node scripts/check-json-render.mjs",
|
|
143
|
-
"check:motion": "node scripts/check-motion.mjs",
|
|
144
|
-
"check:topology": "node scripts/check-topology.mjs",
|
|
145
|
-
"check:wizard": "node scripts/check-wizard.mjs",
|
|
146
|
-
"check:edges": "node scripts/check-edges.mjs",
|
|
147
|
-
"check:data-grid": "node scripts/check-data-grid.mjs",
|
|
148
|
-
"check:truncation": "node scripts/check-truncation.mjs",
|
|
149
|
-
"check:link": "node scripts/check-link.mjs",
|
|
150
|
-
"check:text-select": "node scripts/check-text-select.mjs",
|
|
151
|
-
"check:date-picker": "node scripts/check-date-picker.mjs",
|
|
152
|
-
"check:full-page": "node scripts/check-full-page.mjs",
|
|
153
|
-
"check:short-viewport": "node scripts/check-short-viewport.mjs",
|
|
154
|
-
"check:phone-layout": "node scripts/check-phone-layout.mjs",
|
|
155
|
-
"check:text-zoom": "node scripts/check-text-zoom.mjs",
|
|
156
|
-
"check:focus-restore": "node scripts/check-focus-restore.mjs",
|
|
157
|
-
"check:detail-surface": "node scripts/check-detail-surface.mjs",
|
|
158
|
-
"check:internal": "node --test scripts/check-internal-content.test.mjs scripts/check-npm-metadata.test.mjs && node scripts/check-internal-content.mjs --repo .",
|
|
159
|
-
"check:npm-metadata": "node scripts/check-npm-metadata.mjs",
|
|
160
|
-
"check:package": "node scripts/check-package-content.mjs",
|
|
161
|
-
"check:public-api-consumer": "node scripts/check-public-api-consumer.mjs",
|
|
162
|
-
"notices:update": "node scripts/third-party-notices.mjs --write",
|
|
163
|
-
"notices:check": "node scripts/third-party-notices.mjs --check",
|
|
164
|
-
"check": "bash scripts/docker-check.sh \"npm run gates\"",
|
|
165
|
-
"check:fast": "bash scripts/docker-check.sh \"npm run gates\"",
|
|
166
|
-
"check:local-browser": "node scripts/app-local-browser.mjs",
|
|
167
|
-
"check:infotip": "node scripts/check-infotip.mjs",
|
|
168
|
-
"release:stage": "node scripts/stage-release.mjs",
|
|
169
|
-
"check:polish": "bash scripts/docker-check.sh --build --out .polish-shots 'node scripts/check-polish.mjs'",
|
|
170
|
-
"check:acceptance": "node scripts/check-acceptance.mjs",
|
|
171
|
-
"check:palette": "node scripts/check-palette.mjs",
|
|
172
|
-
"gates": "node scripts/gates.mjs",
|
|
173
|
-
"gates:full": "node scripts/gates.mjs --full",
|
|
174
|
-
"check:layout": "node scripts/check-layout.mjs",
|
|
175
|
-
"release:smoke": "node scripts/release-smoke.mjs",
|
|
176
|
-
"check:browser-install": "playwright install chromium"
|
|
177
|
-
}
|
|
178
|
-
}
|
|
92
|
+
"homepage": "https://www.varvis.me/docs/"
|
|
93
|
+
}
|