@plitzi/sdk-shared 0.38.3 → 0.38.4

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,198 @@
1
1
  # @plitzi/sdk-shared
2
2
 
3
+ ## 0.38.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 6ae4161: ## `plitzi push`: a self-hosted project back on its space
8
+
9
+ `plitzi create --from` and `plitzi pull` took a space out as a project and kept it in step; nothing put the project's
10
+ own changes back but a command per part, and no command at all for its pages. `plitzi push` is the way back
11
+ (`docs/en/projects-from-spaces.md`):
12
+
13
+ - **What changed, or what is named.** `plitzi push` sends what changed since the project last had the space — at a
14
+ terminal, offered as a ticked list to choose from (`↑/↓`, space, Enter); `plitzi push space functions` sends only
15
+ those parts: `space`, `functions`, `runtime`, `plugins`.
16
+ - **In order:** each changed plugin packed and uploaded (`pack plugin` + `upload plugin`, `--cdn`/`--bucket`), the
17
+ functions, the runtime, then the space — `src/space.ts` authored, the actions `src/actions.ts` serves and the manifests
18
+ in `src/connectors/` — as the space's draft. Never a published environment.
19
+ - **Never over the builder's work unseen.** The export now carries which state the draft is in (`SpaceExport.draft`),
20
+ recorded in `.plitzi/space.json` by `create --from` and `pull`; a push names it, and a draft edited since is refused
21
+ until `--force`. A project that never had the space may take one nobody has worked on; one holding work takes
22
+ `--force`.
23
+ - **Then `pull` follows it.** `.plitzi/space.json` records what was sent — only that, so a builder's change to a part
24
+ not pushed is still the next pull's — and a project that started on its own works with `pull` from then on.
25
+ - `@plitzi/sdk-shared/source`: `SpaceImport` / `SpaceImportResult` (`SPACE_IMPORT_FORMAT`), the push's one shape for
26
+ both ends, beside `SpaceExport`, which gains `draft`.
27
+ - `functions push`, `runtime push` and `upload plugin` keep their behaviour; their cores are what `push` runs.
28
+
29
+ ## A project's folders: `tmp/` for what it writes, `.plitzi/` committed, `public/` said to be public
30
+ - **`tmp/` is what a project writes for itself.** `@plitzi/sdk-server` keeps the plugins it builds in `tmp/.sdk-plugins`
31
+ and resized pictures in `tmp/images` by default (were `.sdk-plugins` and `.plitzi/images`). A project the CLI writes
32
+ puts the port it took (`tmp/dev-server.json`), the space as last authored while developing (`tmp/space.json`) and
33
+ Playwright's output (`tmp/visual`) there too, and its `.gitignore` ignores `tmp` — one line for all of it.
34
+ - **`.plitzi/` is committed.** The scaffold ignored it whole, so a clone lost `space.json`, `functions.json` and
35
+ `scaffold.json` — what `pull`, `push`, `functions push` and `upgrade` stand on. Now it holds only what the CLI records.
36
+ `npx plitzi upgrade --write` brings an existing project's `.gitignore` up.
37
+ - **No `space/offline-data.json`.** `npm run author` checks the space and writes nothing; the server asks it for the
38
+ documents with `--out tmp/space.json` while developing. The space is `src/space.ts`, and nothing beside it says
39
+ otherwise.
40
+ - **`public/` is on the internet.** The generated `README.md` and `AGENTS.md`, the CLI and authoring skills, the MCP
41
+ guide, `@plitzi/sdk-server`'s README and the docs now say so where data goes: never a secret, a key or data only
42
+ some visitors may read — in `public/`, or in a space's documents, which reach every visitor too.
43
+
44
+ ## An agent leaves the project clean
45
+
46
+ `AGENTS.md` gains **Keep the project clean** — nothing unused left behind, scratch work in `tmp/`, one of everything,
47
+ files a reader can find, and `author`, `typecheck`, `lint`, `format` and `check` passing — and the authoring skill's
48
+ review checklist a **Nothing left behind** section.
49
+
50
+ ## The dev tools' X-ray is the outlines too
51
+
52
+ The QA tab had **Outlines** (every element's box, its type and id when pointed at) and **X-ray** (the same boxes,
53
+ fainter, with what is wired to each). They are one tool now: the X-ray draws every box with its type and id, and marks
54
+ the wiring picked — all of it, one kind, or **Boxes only**.
55
+
56
+ ## A new space that says where to go
57
+
58
+ The space a new account and `plitzi create` start from keeps its welcome, and gains the three ways to change it — the
59
+ builder, code (with the command to run) and an agent — before the guides, which are shorter. Header, navigation, main
60
+ and footer are landmarks; the grid behind the top fades out instead of ending at an edge; the footer's line spans the
61
+ content; the links say their words and icon themselves, with no suggestion left.
62
+
63
+ ## Server data reads the same everywhere
64
+ - **One shape for a provider with a `query`.** A `runtime: 'server'` provider that only reads a JSON file the server
65
+ serves answered the body itself, while the same provider in the browser publishes `{ status, data }` — so moving it
66
+ to the server broke every binding. `publicFileResolver` and the builder's mock now answer `{ status, data }` too:
67
+ `<source>.data.<field>` whichever runtime.
68
+ - **Server data is on unless a space turns it off.** The page render read a missing `rsc` as on and the connector
69
+ resolver as off, so a server provider in a space the builder or the MCP made (neither writes `rsc`) resolved to
70
+ nothing, silently. Both read it as on now; only `rsc: { enabled: false }` turns it off (and is warned with a server
71
+ element). `authorSpace` writes `enabled: true` for a space that has one.
72
+ - **Never inside a component.** The page server resolves a page's tree and its layouts only, so a server provider in a
73
+ component rendered nothing, silently. Refused now (`server-provider-in-component`), with the fix: the provider on
74
+ the page, the rows handed in as a prop.
75
+ - **Bindings held to the data.** `authorSpace` takes `data` — what a provider's `query` answers — and
76
+ `publicData(folder)` (`@plitzi/sdk-authoring/node`) reads it from `public/`. A binding onto a path the file does not
77
+ have is warned (`path-not-in-data`) with the keys it does have. Generated projects pass it.
78
+ - **`plitzi check` reads the data too.** A binding that reads a path its provider's answer lacks, a provider that
79
+ failed (once, not as every element it left empty) and the rows each list rendered (`dataIssues`). `--ssr` names what
80
+ the server's HTML lacks that the hydrated page has. The dev tools' badge and panel (`data-plitzi-devtools`) are hidden
81
+ while `check` and `shot` look.
82
+
83
+ ## Authoring, clearer where agents tripped
84
+ - **`controls` on a button** (`aria-controls`): named by the element's id; authoring gives that element the anchor and
85
+ refuses an id the space lacks (`controls-unknown`); a saved document naming no anchor is warned
86
+ (`controls-no-anchor`). The accordion recipe uses it.
87
+ - **`live` on a container** (`aria-live`, `polite` or `assertive`) for words that change while a visitor reads them.
88
+ - **`subType: 'p'`** for a paragraph made of parts; `span-holds-block` covers it.
89
+ - **`formControl` types `search`, `url` and `tel`.**
90
+ - **Images:** no `src` draws the SDK's own placeholder (the CDN one answered 404); `resize: false` keeps a picture as
91
+ written; an SVG is never resized — `/_plitzi/img` redirects to it (`307`) instead of refusing it.
92
+ - **Messages:** an id taken by another page or layout names it and the id to write; a hyphenated source in a template
93
+ (`list_study-plans`) is explained as valid; an unknown CSS property says to write it in `customCss`; an unknown
94
+ variant on `custom` says it is never a prop of the component it hosts.
95
+ - **`plitzi explain` knows the helpers** — `bindTemplate`, `visibleWhen`, `variantFrom`, `activeOn`, `activeWhen`,
96
+ `when`, `named`, `scope`, `source`, `twig` — and `motion`, from the presets the SDK plays (`MOTION_ENTERS`,
97
+ `MOTION_TRIGGERS`, `MOTION_LOOPS`, now exported). `--list helpers` lists them.
98
+ - **`plitzi shot`** writes to `tmp/shots/` by default, and a full page shows the arrivals tied to the scroll as they
99
+ end. `inspectPage` no longer reports an image a hidden ancestor hides.
100
+ - **Style inspector:** `container-type` in Size.
101
+ - **New recipes:** `server-data.ts`, `accordion.ts`.
102
+
103
+ ## Matching a page to another, measured
104
+ - **A whole page is the whole page.** The SDK scrolls a pane of its own, so `shot`'s full-page picture was one
105
+ screen; the pane is unrolled now (`unrollPage`) — the viewport untouched, so a `100vh` hero stays one screen.
106
+ - **`plitzi shot --compare` says why, not only how much.** Every lazy picture on both pages is loaded before they are
107
+ taken (`loadImages`), so a section no longer swings between 23 % and 40 % on how many covers had arrived. Each section
108
+ is compared where it is on the other page (`alignPictures` over row profiles): a page 400 px longer is said once, with
109
+ the section the drift starts at, instead of a footer with the same styles reading 100 %. And the texts both pages
110
+ have are paired (`pageTexts`, `compareTexts`), each with what it does differently there —
111
+ `h1 "Learn CSS" — font-size 68px → 60px · y +19px` — position less the drift of its section. `comparePictures` takes
112
+ its options as an object now (`{ regions, tolerance, align }`).
113
+ - **`--scheme` is the space's theme.** A space whose default is dark painted dark under `--scheme light`, and the file
114
+ said light. `check` and `shot` now set the `theme` cookie a visitor's toggle writes; left out, the space's default is
115
+ pictured and the file is named by the theme actually painted.
116
+
117
+ ## `motion: { on: 'view' }` arrives once
118
+
119
+ `view` was tied to the scroll both ways: cards faded out again as the reader scrolled back up. Now it plays once, the
120
+ first time the element comes into view, with its `duration`, and stays — `revealOnView` (`@plitzi/sdk-shared/schema/
121
+ motionReveal`), one observer under the SDK's root, marks it `data-motion-seen`. The scroll-driven arrival is
122
+ `on: 'scroll'`. A page read without scripts shows them as they end (`@media (scripting: none)`); the builder's previews
123
+ and the MCP's local screenshots hold motion at its end. The builder's Motion tab has the three.
124
+
125
+ The builder's preview plays motion as the published page does. It held everything at its end, and nothing marked
126
+ the canvas `data-hydrated`, so neither the loops nor a space's own `[data-hydrated]` animations ever started there.
127
+ Now an arrival plays as it comes into view, and the loops and keyframes run; **▶** on the canvas being edited runs the
128
+ space's own `[data-hydrated]` loops too. The motion guide adds the rule this needs from a space: `[data-hydrated]` is for
129
+ loops; an entrance of its own that plays once (`transform`/`opacity` only) plays from the first paint with
130
+ `backwards`, as the presets do — gated on hydration it jumps when the page goes live, and a canvas that never goes
131
+ live holds it on its first frame.
132
+
133
+ ## Thirteen ways in, nine loops
134
+
135
+ `motion` grows from six arrivals and four loops to thirteen and nine, all still `opacity` and the transforms:
136
+
137
+ - **Bold arrivals:** `slide-up` (from well below), `zoom-in` (from 60%), `zoom-out` (settling from 125%), `tilt`
138
+ (rising as it turns straight), `spin-in` (half a turn as it grows).
139
+ - **Springy arrivals:** `pop` overshoots and settles; `bounce-in` falls into place and bounces.
140
+ - **Loops:** `bounce`, `wobble`, `orbit` (a slow circle round where it is), `heartbeat`, `drift`.
141
+
142
+ An arrival is now a list of frames (`MOTION_ENTER_FRAMES` in `@plitzi/sdk-shared/schema/motion`; `MOTION_ENTER_FROM`
143
+ is its first), and so is a loop (`MOTION_LOOP_FRAMES[name].frames`, replacing `transform`/`at`). Arrivals move the
144
+ individual `translate`, `scale` and `rotate`, so they still compose with an element's own `transform` and with a loop.
145
+ The builder's Motion tab previews every frame; authoring, the MCP, `explain motion` and GraphQL read the same lists.
146
+
147
+ An arrival from the side no longer scrolls the page sideways. `slide-left` starts 32px to the right of where it lands,
148
+ past a phone's 16px gutter, and until it had played the page could be dragged sideways. The SDK's root clips that way
149
+ now (`overflow-x: clip`, which keeps the window the scroller: sticky bars and scroll timelines are untouched), and the
150
+ builder's preview does the same. Content wider than the page is cut rather than scrolling the page — give it a box of
151
+ its own with `overflow-x: auto`.
152
+
153
+ **3D and the transform parts are style properties.** `transform-style`, `perspective-origin`, `backface-visibility`,
154
+ `translate`, `rotate` and `scale` join the vocabulary (they were refused as `css-property-unknown` and had to go in
155
+ `customCss`); `scale: 0.94` is a factor, not pixels.
156
+
157
+ **The builder's placeholder for an empty element is 24px** (was 50px), one size for every element that has one. It
158
+ is a minimum, so it also grew empty shapes with a size of their own — a dot, a planet — while editing; 24px is still
159
+ a box to see, pick and drop into.
160
+
161
+ The desktop app's window was blank: authoring, run in the renderer to build the rail, asked Vite's `process` shim for
162
+ a working directory it does not have. It reads one only where there is one now — and only when a class conflict is
163
+ reported, rather than for every element of every space it writes.
164
+
165
+ ## Authoring advice that knows where and when
166
+ - **`class-conflict` says where both declarations are:** `styles('md-menu-button') at src/components/dropdown.ts:12,
167
+ used by button at …, and styles('md-menu-button') at src/site/layout.ts:8, used by …` — `styles()` records its line as
168
+ an element factory does.
169
+ - **`repeated-shape` leaves controls alone.** Siblings that read different sources or write different state keys — a
170
+ menu for the language, one for the level — are not offered as a list.
171
+ - **`quiet: ['repeated-shape']`** on an element says a suggestion was left on purpose, and it is not offered again.
172
+ Only suggestions' codes (`quiet-unknown`). It is saved on the element (`definition.quiet`), so the builder's problems
173
+ panel, the MCP's `upsertElement`/`patchElement` and a project pulled back with `plitzi pull` all leave it alone.
174
+
175
+ ## What the docs say is what the code does
176
+
177
+ A pass across authoring's own messages, the skills, the MCP guide, `docs/en`, the CLI's README and the website, so an
178
+ agent reading two of them is never told two things:
179
+
180
+ - **A binding's `source` is the bound value, and only that.** With no value yet it fell back to the attribute's
181
+ current one — `sourceTo` — so `{{ source|default('…') }}` never took its default and `{{ source ? … }}` read an
182
+ element's placeholder ("Text") as an answer. It is `undefined` until the source has a value now; `sourceTo` is still
183
+ the value before.
184
+ - **`explain` writes a step the way its builder is called:** `delay(ms)`, `openModal('modal-id', data?)`,
185
+ `scrollBy('row-id', { x: '80%' })` — not `delay(…)` above the document's param names, which read as `delay({ time })`.
186
+ - **A page field nobody takes is told what it was probably for** — `seo` → `seoTitle` and `seoDescription` — instead of a
187
+ hint about keeping state appended to every one.
188
+ - Docs set straight: an element's id is `data-plitzi-el` in the page (`data-id` is the builder's, with debugging on);
189
+ a visibility condition writes nothing while its source has no value and is a yes or a no once it has one; `mobile`
190
+ is up to and including 48rem; `loadStrategy` defaults by type (`lazy` for a modal); the accessibility codes listed
191
+ in full everywhere (`embed-without-title`, `dropdown-without-control`, `controls-no-anchor`); the generated
192
+ `AGENTS.md` says a repeated block is a component and rows of data a list, as the skill does; `plitzi runtime` is
193
+ documented in the CLI's README, its skill and the website, which no longer says state across requests needs a
194
+ server of your own.
195
+
3
196
  ## 0.38.3
4
197
 
5
198
  ### Patch Changes
@@ -53,13 +53,13 @@ export declare const SCROLL_CALLBACKS: {
53
53
  type: "select";
54
54
  description: string;
55
55
  default: string;
56
- options: ("end" | "start" | "center" | "nearest")[];
56
+ options: ("start" | "center" | "end" | "nearest")[];
57
57
  };
58
58
  inline: {
59
59
  type: "select";
60
60
  description: string;
61
61
  default: string;
62
- options: ("end" | "start" | "center" | "nearest")[];
62
+ options: ("start" | "center" | "end" | "nearest")[];
63
63
  };
64
64
  behavior: BuiltinParam;
65
65
  };
@@ -8,7 +8,7 @@ import { produce as s } from "immer";
8
8
  var c = (e, t, n, r, a) => {
9
9
  let o = r === "initialState" ? `definition.${r}.${a}` : `${r}.${a}`;
10
10
  return {
11
- fromValue: t ? i(e, t, i(n, o)) : void 0,
11
+ fromValue: t ? i(e, t) : void 0,
12
12
  toValue: i(n, o, t ? i(e, t) : void 0)
13
13
  };
14
14
  }, l = (l, u, d = {}) => {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The attribute every piece of the dev tools' own chrome carries — the badge, the panel — so whatever looks at the
3
+ * page rather than at the tools can leave it out: `plitzi shot` and `plitzi check` hide it, and a picture of a page is
4
+ * a picture of the page.
5
+ */
6
+ export declare const DEV_TOOLS_ATTRIBUTE = "data-plitzi-devtools";
7
+ /** The rule that hides the dev tools' chrome, for a capture of the page alone. */
8
+ export declare const HIDE_DEV_TOOLS_CSS = "[data-plitzi-devtools] { display: none !important; }";
@@ -0,0 +1,4 @@
1
+ //#region src/devTools/chrome.ts
2
+ var e = "data-plitzi-devtools", t = `[${e}] { display: none !important; }`;
3
+ //#endregion
4
+ export { e as DEV_TOOLS_ATTRIBUTE, t as HIDE_DEV_TOOLS_CSS };
@@ -2,6 +2,7 @@ import { default as debugCookieName } from './debugCookie';
2
2
  import { default as DevToolsContext } from './DevToolsContext';
3
3
  import { default as isInteractionFlow } from './interactionLog';
4
4
  import { default as PlitziConsole } from './utils/PlitziConsole';
5
+ export * from './chrome';
5
6
  export * from './debugCookie';
6
7
  export * from './DevToolsContext';
7
8
  export * from './interactionLog';
@@ -1,5 +1,6 @@
1
1
  import e from "./DevToolsContext.mjs";
2
- import { debugCookieName as t } from "./debugCookie.mjs";
3
- import n from "./interactionLog.mjs";
4
- import r, { createStoreDevToolsLogger as i, pConsole as a } from "./utils/PlitziConsole.mjs";
5
- export { e as DevToolsContext, r as PlitziConsole, i as createStoreDevToolsLogger, t as debugCookieName, n as isInteractionFlow, a as pConsole };
2
+ import { DEV_TOOLS_ATTRIBUTE as t, HIDE_DEV_TOOLS_CSS as n } from "./chrome.mjs";
3
+ import { debugCookieName as r } from "./debugCookie.mjs";
4
+ import i from "./interactionLog.mjs";
5
+ import a, { createStoreDevToolsLogger as o, pConsole as s } from "./utils/PlitziConsole.mjs";
6
+ export { t as DEV_TOOLS_ATTRIBUTE, e as DevToolsContext, n as HIDE_DEV_TOOLS_CSS, a as PlitziConsole, o as createStoreDevToolsLogger, r as debugCookieName, i as isInteractionFlow, s as pConsole };
@@ -12,6 +12,11 @@ export type ImageWidth = (typeof IMAGE_WIDTHS)[number];
12
12
  export declare const isImageWidth: (width: number) => width is ImageWidth;
13
13
  /** A picture another site serves — the only kind there is anything to resize; a path of this site is served as it is. */
14
14
  export declare const isRemoteImage: (src: string) => boolean;
15
+ /**
16
+ * Whether the page server makes sizes of a picture: another site's, and not a vector — an SVG is the same at any width,
17
+ * and the endpoint sends one back to where it is.
18
+ */
19
+ export declare const isResizableImage: (src: string) => boolean;
15
20
  /** The address of `src` at `width` on the endpoint. */
16
21
  export declare const imageUrl: (endpoint: string, src: string, width: ImageWidth) => string;
17
22
  /** Every width as a `srcset`, for the browser to pick the one its layout needs. */
@@ -8,6 +8,6 @@ var e = "/_plitzi/img", t = [
8
8
  1280,
9
9
  1600,
10
10
  1920
11
- ], n = (e) => t.some((t) => t === e), r = (e) => /^https?:\/\//i.test(e), i = (e, t, n) => `${e}?url=${encodeURIComponent(t)}&w=${String(n)}`, a = (e, n) => t.map((t) => `${i(e, n, t)} ${String(t)}w`).join(", ");
11
+ ], n = (e) => t.some((t) => t === e), r = (e) => /^https?:\/\//i.test(e), i = (e) => r(e) && !/\.svgz?(?:[?#]|$)/i.test(e), a = (e, t, n) => `${e}?url=${encodeURIComponent(t)}&w=${String(n)}`, o = (e, n) => t.map((t) => `${a(e, n, t)} ${String(t)}w`).join(", ");
12
12
  //#endregion
13
- export { e as IMAGE_PATH, t as IMAGE_WIDTHS, a as imageSrcSet, i as imageUrl, n as isImageWidth, r as isRemoteImage };
13
+ export { e as IMAGE_PATH, t as IMAGE_WIDTHS, o as imageSrcSet, a as imageUrl, n as isImageWidth, r as isRemoteImage, i as isResizableImage };
package/dist/index.mjs CHANGED
@@ -34,57 +34,58 @@ import ye from "./dataSource/helpers/getSourceName.mjs";
34
34
  import be from "./dataSource/hooks/useRegisterSource.mjs";
35
35
  import xe from "./dataSource/resolveVariables.mjs";
36
36
  import Se from "./devTools/DevToolsContext.mjs";
37
- import { debugCookieName as Ce } from "./devTools/debugCookie.mjs";
38
- import we from "./devTools/interactionLog.mjs";
39
- import Te, { createStoreDevToolsLogger as Ee, pConsole as De } from "./devTools/utils/PlitziConsole.mjs";
40
- import Oe from "./elements/ComponentContext.mjs";
41
- import { FLAG_GATE_PATTERN as ke, FLAG_NAME_PATTERN as Ae, isFlagName as je, isSchemaFlag as Me } from "./flags/schemaFlag.mjs";
42
- import { flagsCookieName as Ne, forcedFlagsFromCookies as Pe, parseFlagList as Fe, serializeFlagList as Ie, withForcedFlag as Le, writeForcedFlags as Re } from "./flags/flagsCookie.mjs";
43
- import { FLAG_LAYERS as ze, flagUserFromSSR as Be, flagValues as Ve, hasConditions as He, passesFlagGate as Ue, resolveFlags as We, undeclaredFlagOverrides as Ge } from "./flags/resolveFlags.mjs";
44
- import Ke from "./hooks/useStableValue.mjs";
45
- import { describeChange as qe, fieldChanges as Je, uniqueLines as Ye } from "./history/describe.mjs";
46
- import { diffSchema as Xe, diffStyle as Ze, jsonCopy as Qe, sameValue as $e } from "./history/diff.mjs";
47
- import et from "./hooks/useFontHead.mjs";
48
- import tt from "./hooks/useNetwork.mjs";
49
- import nt, { PlitziServiceContext as rt, PlitziServiceProvider as it } from "./hooks/usePlitziServiceContext.mjs";
50
- import { WHILE_RUNNING_MODES as at } from "./types/SchemaTypes.mjs";
51
- import { StyleVariableCategory as ot, isStyleVariableCategory as st } from "./types/StyleTypes.mjs";
52
- import ct, { EMPTY_STYLE_SCHEMA as lt, StyleBindingsAllowed as ut, baseDefaultValue as dt, inheritableAttributesBase as ft } from "./style/styleConstants.mjs";
53
- import { DISPLAY_MODE_MIN_WIDTH as pt, displayModeAt as mt, displayModeWidthRem as ht } from "./style/breakpoints.mjs";
54
- import { DISPLAY_MODES as gt, isDisplayMode as _t } from "./style/displayModes.mjs";
55
- import { fontLinkAssets as vt } from "./style/fontAssets.mjs";
56
- import { SYSTEM_FONTS as yt, availableFonts as bt, familiesInCss as xt, fontFamilyStack as St, fontUrlResolver as Ct, fontsToHead as wt, googleCss2Url as Tt, googleTextSubsetUrl as Et, isSafeFontUrl as Dt, primaryFamily as Ot } from "./style/fonts.mjs";
57
- import { FontValidationError as kt, parseSpaceFont as At } from "./style/fontValidation.mjs";
58
- import { fallbackForFamily as jt, fontsFromCss as Mt } from "./style/fontsFromCss.mjs";
59
- import { LAYOUT_GRIDS as Nt, layoutGridCss as Pt, layoutGridLook as Ft } from "./style/layoutGrid.mjs";
60
- import { RUNTIME_STYLE_ID as It, markStyleCache as Lt, styleCacheFromDocument as Rt, styleCacheTravelsInDocument as zt } from "./style/runtimeStyle.mjs";
61
- import { mergeSnippetStyle as Bt, sameSelector as Vt, selectorsOf as Ht } from "./style/snippetStyle.mjs";
62
- import { CURRENT_PAGE_SELECTOR as Ut, HIDDEN_CLASS as Wt, STYLE_STATES as Gt, STYLE_STATE_LABELS as Kt, inCascadeOrder as qt, isKnownState as Jt, isStartingState as Yt, stateSuffix as Xt } from "./style/styleStates.mjs";
63
- import Zt from "./schema/SchemaContext.mjs";
64
- import { ANCHOR_PATTERN as Qt, isAnchor as $t } from "./schema/anchor.mjs";
65
- import { COMPONENT_PROPS_SOURCE as en, EMPTY_SCHEMA as tn, VARIABLE_REGEX as nn } from "./schema/schemaConstants.mjs";
66
- import { findLayoutCycle as rn, resolveLayoutChain as an } from "./schema/layoutChain.mjs";
67
- import { collectServerElements as on, hasServerElements as sn } from "./schema/serverElements.mjs";
68
- import { isSnippet as cn } from "./schema/snippet.mjs";
69
- import ln from "./network/NetworkContext.mjs";
70
- import un from "./network/NetworkInternalContext.mjs";
71
- import { elementFromWire as dn, schemaFromWire as fn, schemaToWire as pn } from "./schema/wire.mjs";
72
- import { SpaceEvents as mn, spaceEventSchemas as hn, validateSpaceEvent as gn } from "./network/spaceEvents.mjs";
73
- import _n from "./network/graphql/builder/Mutations/index.mjs";
74
- import vn from "./network/graphql/builder/Queries/index.mjs";
75
- import yn from "./network/graphql/builder/Subscriptions/index.mjs";
76
- import bn from "./network/graphql/sdk/Mutations/index.mjs";
77
- import xn from "./network/graphql/sdk/Queries/index.mjs";
78
- import Sn, { RTEvent as Cn, RTEventCloseCode as wn, getInstance as Tn, isRTEvent as En, isRTEventCloseCode as Dn, setInstance as On } from "./websockets/RTCodec.mjs";
79
- import { THEME_CLASSES as kn, THEME_COOKIE_NAME as An, applyThemeClass as jn, isTheme as Mn, readThemeCookie as Nn, themeFromCookies as Pn, writeThemeCookie as Fn } from "./theme/themeCookie.mjs";
80
- import In, { createThemeState as Ln, createThemeStore as Rn, resolveScheme as zn, setAreaTheme as Bn, setMachineScheme as Vn, setThemeMode as Hn, themeFor as Un } from "./theme/themeStore.mjs";
81
- import { useThemeStore as Wn } from "./theme/ThemeScope.mjs";
82
- import Gn from "./theme/ThemeProvider.mjs";
83
- import Kn, { SPACE_THEME_AREA as qn } from "./theme/useTheme.mjs";
84
- import Jn from "./server/actions/useActionsSync.mjs";
85
- import Yn, { currentRscLocation as Xn, rscDataPath as Zn } from "./server/rsc/refreshRsc.mjs";
86
- import Qn from "./server/rsc/useRscRefresh.mjs";
87
- import $n from "./server/rsc/useRscSync.mjs";
88
- import { PAINTED_STATE_BUDGET as er, clearPaintedEntry as tr, paintedEntryFromCookies as nr, paintedKeys as rr, paintedStateCookieName as ir, paintedStateFor as ar, pickPainted as or, readPaintedEntry as sr, writePaintedEntry as cr } from "./state/paintedState.mjs";
89
- import { runtimeStatePersist as lr, stateOwner as ur } from "./state/runtimeStatePersist.mjs";
90
- export { Qt as ANCHOR_PATTERN, x as BODYLESS_METHODS, y as BuilderContext, _n as BuilderMutations, vn as BuilderQueries, en as COMPONENT_PROPS_SOURCE, N as COMPUTED_GLOBALS, S as CONNECTOR_HTTP_METHODS, Ut as CURRENT_PAGE_SELECTOR, Oe as ComponentContext, C as DEFAULT_READ_ENDPOINT, gt as DISPLAY_MODES, pt as DISPLAY_MODE_MIN_WIDTH, Se as DevToolsContext, w as EMPTY_RESPONSE_METHODS, tn as EMPTY_SCHEMA, lt as EMPTY_STYLE_SCHEMA, ke as FLAG_GATE_PATTERN, ze as FLAG_LAYERS, Ae as FLAG_NAME_PATTERN, kt as FontValidationError, P as GLOBAL_SOURCES, Wt as HIDDEN_CLASS, ee as INTERVAL_TRIGGER, Nt as LAYOUT_GRIDS, m as MAX_PARAM_PASSES, te as MIN_INTERVAL_MS, ln as NetworkContext, un as NetworkInternalContext, er as PAINTED_STATE_BUDGET, oe as ParamsFromURL, Te as PlitziConsole, rt as PlitziServiceContext, it as PlitziServiceProvider, T as READ_ENDPOINT_NAMES, Sn as RTCodec, Cn as RTEvent, wn as RTEventCloseCode, It as RUNTIME_STYLE_ID, qn as SPACE_THEME_AREA, Gt as STYLE_STATES, Kt as STYLE_STATE_LABELS, yt as SYSTEM_FONTS, Zt as SchemaContext, bn as SdkMutations, xn as SdkQueries, yn as SpaceEventSubscription, mn as SpaceEvents, ut as StyleBindingsAllowed, ot as StyleVariableCategory, kn as THEME_CLASSES, An as THEME_COOKIE_NAME, Gn as ThemeProvider, nn as VARIABLE_REGEX, a as VISITOR_NAME, at as WHILE_RUNNING_MODES, E as WRITE_ENDPOINT_NAMES, jn as applyThemeClass, t as authFailureFromResponse, bt as availableFonts, dt as baseDefaultValue, o as checkVisitorRoles, tr as clearPaintedEntry, on as collectServerElements, k as connectorPresets, D as connectorTokens, b as contexts, B as cookieFromHeader, Ee as createStoreDevToolsLogger, Ln as createThemeState, Rn as createThemeStore, Xn as currentRscLocation, Ce as debugCookieName, se as delay, qe as describeChange, Xe as diffSchema, Ze as diffStyle, he as disableReactDevTools, mt as displayModeAt, ht as displayModeWidthRem, V as documentCookies, dn as elementFromWire, H as elementOf, A as emptyManifest, ce as emptyObject, F as evaluateComputed, ae as evaluateRuleGroup, jt as fallbackForFamily, xt as familiesInCss, L as fetchManifest, Je as fieldChanges, c as filters, rn as findLayoutCycle, Be as flagUserFromSSR, Ve as flagValues, Ne as flagsCookieName, St as fontFamilyStack, vt as fontLinkAssets, Ct as fontUrlResolver, Mt as fontsFromCss, wt as fontsToHead, Pe as forcedFlagsFromCookies, K as formatDate, q as formatDateUTC, J as formatFromNow, Y as formatUTCToLocal, R as generateFacade, ve as getBindingsDetails, O as getConnectorTokens, le as getDisplayName, X as getDurationMs, Tn as getInstance, ue as getKeyDecoded, de as getPathsFromObeject, ye as getSourceName, Tt as googleCss2Url, Et as googleTextSubsetUrl, He as hasConditions, sn as hasServerElements, f as hasTemplateSyntax, p as hasValidToken, fe as hexToRGB, qt as inCascadeOrder, ft as inheritableAttributesBase, g as inspectTemplate, ne as intervalOf, $t as isAnchor, j as isConnectorManifestDraft, re as isDate, _t as isDisplayMode, U as isElementTarget, je as isFlagName, pe as isInViewport, we as isInteractionFlow, Jt as isKnownState, W as isNodeTarget, En as isRTEvent, Dn as isRTEventCloseCode, e as isRecord, Dt as isSafeFontUrl, Me as isSchemaFlag, cn as isSnippet, Yt as isStartingState, st as isStyleVariableCategory, Mn as isTheme, ie as isUserEdit, Z as isValidFormat, Qe as jsonCopy, Pt as layoutGridCss, Ft as layoutGridLook, I as liveSources, me as makeId, Lt as markStyleCache, Bt as mergeSnippetStyle, G as nodeOf, n as onAuthFailure, De as pConsole, nr as paintedEntryFromCookies, rr as paintedKeys, ir as paintedStateCookieName, ar as paintedStateFor, Q as parseDate, Fe as parseFlagList, At as parseSpaceFont, Ue as passesFlagGate, or as pickPainted, Ot as primaryFamily, l as processTwig, u as processTwigParam, d as processTwigValue, sr as readPaintedEntry, Nn as readThemeCookie, Yn as refreshRsc, r as reportAuthFailure, We as resolveFlags, an as resolveLayoutChain, zn as resolveScheme, h as resolveStepParam, xe as resolveVariables, Zn as rscDataPath, lr as runtimeStatePersist, i as sameRegistrableDomain, Vt as sameSelector, $e as sameValue, fn as schemaFromWire, pn as schemaToWire, Ht as selectorsOf, Ie as serializeFlagList, Bn as setAreaTheme, On as setInstance, Vn as setMachineScheme, Hn as setThemeMode, hn as spaceEventSchemas, ur as stateOwner, Xt as stateSuffix, Rt as styleCacheFromDocument, zt as styleCacheTravelsInDocument, ct as styleConstants, z as syntaxHighlight, _ as templatePaths, v as templateRootNames, Un as themeFor, Pn as themeFromCookies, In as themeStore, $ as toUnixSeconds, Ge as undeclaredFlagOverrides, Ye as uniqueLines, Jn as useActionsSync, et as useFontHead, tt as useNetwork, nt as usePlitziServiceContext, be as useRegisterSource, Qn as useRscRefresh, $n as useRscSync, Ke as useStableValue, Kn as useTheme, Wn as useThemeStore, ge as utility, _e as utilityOptions, M as validateConnectorManifest, gn as validateSpaceEvent, s as visitorAccess, Le as withForcedFlag, Re as writeForcedFlags, cr as writePaintedEntry, Fn as writeThemeCookie };
37
+ import { DEV_TOOLS_ATTRIBUTE as Ce, HIDE_DEV_TOOLS_CSS as we } from "./devTools/chrome.mjs";
38
+ import { debugCookieName as Te } from "./devTools/debugCookie.mjs";
39
+ import Ee from "./devTools/interactionLog.mjs";
40
+ import De, { createStoreDevToolsLogger as Oe, pConsole as ke } from "./devTools/utils/PlitziConsole.mjs";
41
+ import Ae from "./elements/ComponentContext.mjs";
42
+ import { FLAG_GATE_PATTERN as je, FLAG_NAME_PATTERN as Me, isFlagName as Ne, isSchemaFlag as Pe } from "./flags/schemaFlag.mjs";
43
+ import { flagsCookieName as Fe, forcedFlagsFromCookies as Ie, parseFlagList as Le, serializeFlagList as Re, withForcedFlag as ze, writeForcedFlags as Be } from "./flags/flagsCookie.mjs";
44
+ import { FLAG_LAYERS as Ve, flagUserFromSSR as He, flagValues as Ue, hasConditions as We, passesFlagGate as Ge, resolveFlags as Ke, undeclaredFlagOverrides as qe } from "./flags/resolveFlags.mjs";
45
+ import Je from "./hooks/useStableValue.mjs";
46
+ import { describeChange as Ye, fieldChanges as Xe, uniqueLines as Ze } from "./history/describe.mjs";
47
+ import { diffSchema as Qe, diffStyle as $e, jsonCopy as et, sameValue as tt } from "./history/diff.mjs";
48
+ import nt from "./hooks/useFontHead.mjs";
49
+ import rt from "./hooks/useNetwork.mjs";
50
+ import it, { PlitziServiceContext as at, PlitziServiceProvider as ot } from "./hooks/usePlitziServiceContext.mjs";
51
+ import { WHILE_RUNNING_MODES as st } from "./types/SchemaTypes.mjs";
52
+ import { StyleVariableCategory as ct, isStyleVariableCategory as lt } from "./types/StyleTypes.mjs";
53
+ import ut, { EMPTY_STYLE_SCHEMA as dt, StyleBindingsAllowed as ft, baseDefaultValue as pt, inheritableAttributesBase as mt } from "./style/styleConstants.mjs";
54
+ import { DISPLAY_MODE_MIN_WIDTH as ht, displayModeAt as gt, displayModeWidthRem as _t } from "./style/breakpoints.mjs";
55
+ import { DISPLAY_MODES as vt, isDisplayMode as yt } from "./style/displayModes.mjs";
56
+ import { fontLinkAssets as bt } from "./style/fontAssets.mjs";
57
+ import { SYSTEM_FONTS as xt, availableFonts as St, familiesInCss as Ct, fontFamilyStack as wt, fontUrlResolver as Tt, fontsToHead as Et, googleCss2Url as Dt, googleTextSubsetUrl as Ot, isSafeFontUrl as kt, primaryFamily as At } from "./style/fonts.mjs";
58
+ import { FontValidationError as jt, parseSpaceFont as Mt } from "./style/fontValidation.mjs";
59
+ import { fallbackForFamily as Nt, fontsFromCss as Pt } from "./style/fontsFromCss.mjs";
60
+ import { LAYOUT_GRIDS as Ft, layoutGridCss as It, layoutGridLook as Lt } from "./style/layoutGrid.mjs";
61
+ import { RUNTIME_STYLE_ID as Rt, markStyleCache as zt, styleCacheFromDocument as Bt, styleCacheTravelsInDocument as Vt } from "./style/runtimeStyle.mjs";
62
+ import { mergeSnippetStyle as Ht, sameSelector as Ut, selectorsOf as Wt } from "./style/snippetStyle.mjs";
63
+ import { CURRENT_PAGE_SELECTOR as Gt, HIDDEN_CLASS as Kt, STYLE_STATES as qt, STYLE_STATE_LABELS as Jt, inCascadeOrder as Yt, isKnownState as Xt, isStartingState as Zt, stateSuffix as Qt } from "./style/styleStates.mjs";
64
+ import $t from "./schema/SchemaContext.mjs";
65
+ import { ANCHOR_PATTERN as en, isAnchor as tn } from "./schema/anchor.mjs";
66
+ import { COMPONENT_PROPS_SOURCE as nn, EMPTY_SCHEMA as rn, VARIABLE_REGEX as an } from "./schema/schemaConstants.mjs";
67
+ import { findLayoutCycle as on, resolveLayoutChain as sn } from "./schema/layoutChain.mjs";
68
+ import { collectServerElements as cn, hasServerElements as ln } from "./schema/serverElements.mjs";
69
+ import { isSnippet as un } from "./schema/snippet.mjs";
70
+ import dn from "./network/NetworkContext.mjs";
71
+ import fn from "./network/NetworkInternalContext.mjs";
72
+ import { elementFromWire as pn, schemaFromWire as mn, schemaToWire as hn } from "./schema/wire.mjs";
73
+ import { SpaceEvents as gn, spaceEventSchemas as _n, validateSpaceEvent as vn } from "./network/spaceEvents.mjs";
74
+ import yn from "./network/graphql/builder/Mutations/index.mjs";
75
+ import bn from "./network/graphql/builder/Queries/index.mjs";
76
+ import xn from "./network/graphql/builder/Subscriptions/index.mjs";
77
+ import Sn from "./network/graphql/sdk/Mutations/index.mjs";
78
+ import Cn from "./network/graphql/sdk/Queries/index.mjs";
79
+ import wn, { RTEvent as Tn, RTEventCloseCode as En, getInstance as Dn, isRTEvent as On, isRTEventCloseCode as kn, setInstance as An } from "./websockets/RTCodec.mjs";
80
+ import { THEME_CLASSES as jn, THEME_COOKIE_NAME as Mn, applyThemeClass as Nn, isTheme as Pn, readThemeCookie as Fn, themeFromCookies as In, writeThemeCookie as Ln } from "./theme/themeCookie.mjs";
81
+ import Rn, { createThemeState as zn, createThemeStore as Bn, resolveScheme as Vn, setAreaTheme as Hn, setMachineScheme as Un, setThemeMode as Wn, themeFor as Gn } from "./theme/themeStore.mjs";
82
+ import { useThemeStore as Kn } from "./theme/ThemeScope.mjs";
83
+ import qn from "./theme/ThemeProvider.mjs";
84
+ import Jn, { SPACE_THEME_AREA as Yn } from "./theme/useTheme.mjs";
85
+ import Xn from "./server/actions/useActionsSync.mjs";
86
+ import Zn, { currentRscLocation as Qn, rscDataPath as $n } from "./server/rsc/refreshRsc.mjs";
87
+ import er from "./server/rsc/useRscRefresh.mjs";
88
+ import tr from "./server/rsc/useRscSync.mjs";
89
+ import { PAINTED_STATE_BUDGET as nr, clearPaintedEntry as rr, paintedEntryFromCookies as ir, paintedKeys as ar, paintedStateCookieName as or, paintedStateFor as sr, pickPainted as cr, readPaintedEntry as lr, writePaintedEntry as ur } from "./state/paintedState.mjs";
90
+ import { runtimeStatePersist as dr, stateOwner as fr } from "./state/runtimeStatePersist.mjs";
91
+ export { en as ANCHOR_PATTERN, x as BODYLESS_METHODS, y as BuilderContext, yn as BuilderMutations, bn as BuilderQueries, nn as COMPONENT_PROPS_SOURCE, N as COMPUTED_GLOBALS, S as CONNECTOR_HTTP_METHODS, Gt as CURRENT_PAGE_SELECTOR, Ae as ComponentContext, C as DEFAULT_READ_ENDPOINT, Ce as DEV_TOOLS_ATTRIBUTE, vt as DISPLAY_MODES, ht as DISPLAY_MODE_MIN_WIDTH, Se as DevToolsContext, w as EMPTY_RESPONSE_METHODS, rn as EMPTY_SCHEMA, dt as EMPTY_STYLE_SCHEMA, je as FLAG_GATE_PATTERN, Ve as FLAG_LAYERS, Me as FLAG_NAME_PATTERN, jt as FontValidationError, P as GLOBAL_SOURCES, Kt as HIDDEN_CLASS, we as HIDE_DEV_TOOLS_CSS, ee as INTERVAL_TRIGGER, Ft as LAYOUT_GRIDS, m as MAX_PARAM_PASSES, te as MIN_INTERVAL_MS, dn as NetworkContext, fn as NetworkInternalContext, nr as PAINTED_STATE_BUDGET, oe as ParamsFromURL, De as PlitziConsole, at as PlitziServiceContext, ot as PlitziServiceProvider, T as READ_ENDPOINT_NAMES, wn as RTCodec, Tn as RTEvent, En as RTEventCloseCode, Rt as RUNTIME_STYLE_ID, Yn as SPACE_THEME_AREA, qt as STYLE_STATES, Jt as STYLE_STATE_LABELS, xt as SYSTEM_FONTS, $t as SchemaContext, Sn as SdkMutations, Cn as SdkQueries, xn as SpaceEventSubscription, gn as SpaceEvents, ft as StyleBindingsAllowed, ct as StyleVariableCategory, jn as THEME_CLASSES, Mn as THEME_COOKIE_NAME, qn as ThemeProvider, an as VARIABLE_REGEX, a as VISITOR_NAME, st as WHILE_RUNNING_MODES, E as WRITE_ENDPOINT_NAMES, Nn as applyThemeClass, t as authFailureFromResponse, St as availableFonts, pt as baseDefaultValue, o as checkVisitorRoles, rr as clearPaintedEntry, cn as collectServerElements, k as connectorPresets, D as connectorTokens, b as contexts, B as cookieFromHeader, Oe as createStoreDevToolsLogger, zn as createThemeState, Bn as createThemeStore, Qn as currentRscLocation, Te as debugCookieName, se as delay, Ye as describeChange, Qe as diffSchema, $e as diffStyle, he as disableReactDevTools, gt as displayModeAt, _t as displayModeWidthRem, V as documentCookies, pn as elementFromWire, H as elementOf, A as emptyManifest, ce as emptyObject, F as evaluateComputed, ae as evaluateRuleGroup, Nt as fallbackForFamily, Ct as familiesInCss, L as fetchManifest, Xe as fieldChanges, c as filters, on as findLayoutCycle, He as flagUserFromSSR, Ue as flagValues, Fe as flagsCookieName, wt as fontFamilyStack, bt as fontLinkAssets, Tt as fontUrlResolver, Pt as fontsFromCss, Et as fontsToHead, Ie as forcedFlagsFromCookies, K as formatDate, q as formatDateUTC, J as formatFromNow, Y as formatUTCToLocal, R as generateFacade, ve as getBindingsDetails, O as getConnectorTokens, le as getDisplayName, X as getDurationMs, Dn as getInstance, ue as getKeyDecoded, de as getPathsFromObeject, ye as getSourceName, Dt as googleCss2Url, Ot as googleTextSubsetUrl, We as hasConditions, ln as hasServerElements, f as hasTemplateSyntax, p as hasValidToken, fe as hexToRGB, Yt as inCascadeOrder, mt as inheritableAttributesBase, g as inspectTemplate, ne as intervalOf, tn as isAnchor, j as isConnectorManifestDraft, re as isDate, yt as isDisplayMode, U as isElementTarget, Ne as isFlagName, pe as isInViewport, Ee as isInteractionFlow, Xt as isKnownState, W as isNodeTarget, On as isRTEvent, kn as isRTEventCloseCode, e as isRecord, kt as isSafeFontUrl, Pe as isSchemaFlag, un as isSnippet, Zt as isStartingState, lt as isStyleVariableCategory, Pn as isTheme, ie as isUserEdit, Z as isValidFormat, et as jsonCopy, It as layoutGridCss, Lt as layoutGridLook, I as liveSources, me as makeId, zt as markStyleCache, Ht as mergeSnippetStyle, G as nodeOf, n as onAuthFailure, ke as pConsole, ir as paintedEntryFromCookies, ar as paintedKeys, or as paintedStateCookieName, sr as paintedStateFor, Q as parseDate, Le as parseFlagList, Mt as parseSpaceFont, Ge as passesFlagGate, cr as pickPainted, At as primaryFamily, l as processTwig, u as processTwigParam, d as processTwigValue, lr as readPaintedEntry, Fn as readThemeCookie, Zn as refreshRsc, r as reportAuthFailure, Ke as resolveFlags, sn as resolveLayoutChain, Vn as resolveScheme, h as resolveStepParam, xe as resolveVariables, $n as rscDataPath, dr as runtimeStatePersist, i as sameRegistrableDomain, Ut as sameSelector, tt as sameValue, mn as schemaFromWire, hn as schemaToWire, Wt as selectorsOf, Re as serializeFlagList, Hn as setAreaTheme, An as setInstance, Un as setMachineScheme, Wn as setThemeMode, _n as spaceEventSchemas, fr as stateOwner, Qt as stateSuffix, Bt as styleCacheFromDocument, Vt as styleCacheTravelsInDocument, ut as styleConstants, z as syntaxHighlight, _ as templatePaths, v as templateRootNames, Gn as themeFor, In as themeFromCookies, Rn as themeStore, $ as toUnixSeconds, qe as undeclaredFlagOverrides, Ze as uniqueLines, Xn as useActionsSync, nt as useFontHead, rt as useNetwork, it as usePlitziServiceContext, be as useRegisterSource, er as useRscRefresh, tr as useRscSync, Je as useStableValue, Jn as useTheme, Kn as useThemeStore, ge as utility, _e as utilityOptions, M as validateConnectorManifest, vn as validateSpaceEvent, s as visitorAccess, ze as withForcedFlag, Be as writeForcedFlags, ur as writePaintedEntry, Ln as writeThemeCookie };
@@ -9,5 +9,5 @@ export type TInitQuery = {
9
9
  style: Style;
10
10
  };
11
11
  };
12
- declare const InitQuery = "\n query InitQuery($environment: String!, $revision: Int) {\n PlatformFlags\n Space(environment: $environment, revision: $revision) {\n definition {\n name\n permanentUrl\n }\n schema {\n settings\n rsc\n flat {\n id\n definition {\n label\n type\n initialState\n styleSelectors\n bindings\n interactions\n parentId\n rootId\n items\n runtime\n loadStrategy\n flag {\n name\n is\n }\n anchor\n motion {\n enter\n on\n duration\n delay\n stagger\n loop\n }\n }\n attributes\n }\n pages\n components\n flags\n pageFolders {\n id\n name\n slug\n parentId\n }\n variables {\n name\n category\n type\n value\n subValues {\n when\n value\n }\n }\n }\n plugins {\n type\n resource\n settings\n }\n style {\n id\n platform\n variables\n mode\n fonts\n cache\n }\n }\n }\n";
12
+ declare const InitQuery = "\n query InitQuery($environment: String!, $revision: Int) {\n PlatformFlags\n Space(environment: $environment, revision: $revision) {\n definition {\n name\n permanentUrl\n }\n schema {\n settings\n rsc\n flat {\n id\n definition {\n label\n type\n initialState\n styleSelectors\n bindings\n interactions\n parentId\n rootId\n items\n runtime\n loadStrategy\n flag {\n name\n is\n }\n anchor\n motion {\n enter\n on\n duration\n delay\n stagger\n loop\n }\n quiet\n }\n attributes\n }\n pages\n components\n flags\n pageFolders {\n id\n name\n slug\n parentId\n }\n variables {\n name\n category\n type\n value\n subValues {\n when\n value\n }\n }\n }\n plugins {\n type\n resource\n settings\n }\n style {\n id\n platform\n variables\n mode\n fonts\n cache\n }\n }\n }\n";
13
13
  export default InitQuery;
@@ -1,4 +1,4 @@
1
1
  //#region src/network/graphql/builder/Queries/InitQuery.ts
2
- var e = "\n query InitQuery($environment: String!, $revision: Int) {\n PlatformFlags\n Space(environment: $environment, revision: $revision) {\n definition {\n name\n permanentUrl\n }\n schema {\n settings\n rsc\n flat {\n id\n definition {\n label\n type\n initialState\n styleSelectors\n bindings\n interactions\n parentId\n rootId\n items\n runtime\n loadStrategy\n flag {\n name\n is\n }\n anchor\n motion {\n enter\n on\n duration\n delay\n stagger\n loop\n }\n }\n attributes\n }\n pages\n components\n flags\n pageFolders {\n id\n name\n slug\n parentId\n }\n variables {\n name\n category\n type\n value\n subValues {\n when\n value\n }\n }\n }\n plugins {\n type\n resource\n settings\n }\n style {\n id\n platform\n variables\n mode\n fonts\n cache\n }\n }\n }\n";
2
+ var e = "\n query InitQuery($environment: String!, $revision: Int) {\n PlatformFlags\n Space(environment: $environment, revision: $revision) {\n definition {\n name\n permanentUrl\n }\n schema {\n settings\n rsc\n flat {\n id\n definition {\n label\n type\n initialState\n styleSelectors\n bindings\n interactions\n parentId\n rootId\n items\n runtime\n loadStrategy\n flag {\n name\n is\n }\n anchor\n motion {\n enter\n on\n duration\n delay\n stagger\n loop\n }\n quiet\n }\n attributes\n }\n pages\n components\n flags\n pageFolders {\n id\n name\n slug\n parentId\n }\n variables {\n name\n category\n type\n value\n subValues {\n when\n value\n }\n }\n }\n plugins {\n type\n resource\n settings\n }\n style {\n id\n platform\n variables\n mode\n fonts\n cache\n }\n }\n }\n";
3
3
  //#endregion
4
4
  export { e as default };
@@ -7,20 +7,27 @@
7
7
  * The one description the authoring package, the builder's Motion tab, the MCP and the validator all read; the
8
8
  * stylesheet mirrors its presets and frames, and a test in `apps/sdk` holds the two together.
9
9
  */
10
- export declare const MOTION_ENTERS: readonly ["fade", "fade-up", "fade-down", "slide-left", "slide-right", "scale"];
10
+ export declare const MOTION_ENTERS: readonly ["fade", "fade-up", "fade-down", "slide-left", "slide-right", "slide-up", "scale", "zoom-in", "zoom-out", "pop", "bounce-in", "tilt", "spin-in"];
11
11
  export type MotionEnter = (typeof MOTION_ENTERS)[number];
12
- /** As the page loads, or as the element scrolls into view — tied to the scroll, so it plays at the reader's pace. */
13
- export declare const MOTION_TRIGGERS: readonly ["load", "view"];
12
+ /**
13
+ * When an arrival plays: as the page loads (`load`); once, as the element first comes into view, and then it stays
14
+ * (`view`); or with the scroll itself, at the reader's pace — played backwards when the reader scrolls back up past it
15
+ * (`scroll`).
16
+ */
17
+ export declare const MOTION_TRIGGERS: readonly ["load", "view", "scroll"];
14
18
  export type MotionTrigger = (typeof MOTION_TRIGGERS)[number];
15
- /** A motion that repeats: a gentle rise and fall, a breath, a turn, a sway. Held until the page is live. */
16
- export declare const MOTION_LOOPS: readonly ["float", "pulse", "spin", "sway"];
19
+ /**
20
+ * A motion that repeats: a gentle rise and fall, a breath, a turn, a sway — a bounce, a wobble, a small orbit, a
21
+ * heartbeat, a drift. Held until the page is live.
22
+ */
23
+ export declare const MOTION_LOOPS: readonly ["float", "pulse", "spin", "sway", "bounce", "wobble", "orbit", "heartbeat", "drift"];
17
24
  export type MotionLoop = (typeof MOTION_LOOPS)[number];
18
25
  export interface ElementMotion {
19
26
  /** How it arrives. */
20
27
  enter?: MotionEnter;
21
- /** When it arrives: `load` (the default) or `view`. */
28
+ /** When it arrives: `load` (the default), `view` (once, as it comes into view) or `scroll` (with the scroll). */
22
29
  on?: MotionTrigger;
23
- /** How long it takes to arrive, in ms (600 by default). Ignored under `view`, which follows the scroll. */
30
+ /** How long it takes to arrive, in ms (600 by default). Ignored under `scroll`, which follows the scroll. */
24
31
  duration?: number;
25
32
  /** How long it waits before it does, in ms. */
26
33
  delay?: number;
@@ -35,19 +42,35 @@ export interface ElementMotion {
35
42
  /** How long an arrival takes when it does not say, and the curve every arrival follows: quick out, gentle in. */
36
43
  export declare const MOTION_DEFAULT_DURATION = 600;
37
44
  export declare const MOTION_ENTER_EASING = "cubic-bezier(0.2, 0.7, 0.2, 1)";
38
- /** Where each arrival starts from; it ends where the element is. */
39
- export declare const MOTION_ENTER_FROM: Record<MotionEnter, {
40
- opacity: number;
45
+ /**
46
+ * One frame of an arrival, `at` a percentage of its duration. It moves the individual `translate`, `scale` and `rotate`
47
+ * properties — never `transform` — so it composes with a `transform` the element has of its own and with a loop.
48
+ */
49
+ export interface MotionEnterFrame {
50
+ at: number;
51
+ opacity?: number;
41
52
  translate?: string;
42
53
  scale?: string;
43
- }>;
54
+ rotate?: string;
55
+ }
44
56
  /**
45
- * Each loop's one moving frame — its `transform` halfway through the period and back (`middle`), or at the end of
46
- * one that keeps turning (`end`) — and its period and curve.
57
+ * Each arrival's frames, from where it starts (`at: 0`) through any it passes on the way — an overshoot, a bounce. It
58
+ * always ends where the element is, which is why no frame says so.
47
59
  */
48
- export declare const MOTION_LOOP_FRAMES: Record<MotionLoop, {
60
+ export declare const MOTION_ENTER_FRAMES: Record<MotionEnter, MotionEnterFrame[]>;
61
+ /** Where each arrival starts from — its first frame. */
62
+ export declare const MOTION_ENTER_FROM: Record<MotionEnter, Omit<MotionEnterFrame, "at">>;
63
+ /** One frame of a loop: its `transform` at a percentage of its period. A frame no loop names is the element at rest. */
64
+ export interface MotionLoopFrame {
65
+ at: number;
49
66
  transform: string;
50
- at: 'middle' | 'end';
67
+ }
68
+ /**
69
+ * Each loop's frames, its period and its curve. A loop that swings starts and ends at rest; one that keeps turning
70
+ * (`spin`) ends a full turn on, which is the same place.
71
+ */
72
+ export declare const MOTION_LOOP_FRAMES: Record<MotionLoop, {
73
+ frames: MotionLoopFrame[];
51
74
  periodMs: number;
52
75
  easing: string;
53
76
  }>;
@@ -72,6 +95,15 @@ export declare const MOVING_SELECTOR = "[data-motion-enter], [data-motion-stagge
72
95
  * never is.
73
96
  */
74
97
  export declare const MOTION_STILL_CSS = "[data-motion-enter], [data-motion-stagger] > *, [data-motion-loop] { animation: none !important; }";
98
+ /** The attribute an arrival waiting to be seen (`on: 'view'`) gets once it has been, and then keeps (`revealOnView`). */
99
+ export declare const MOTION_SEEN_ATTRIBUTE = "data-motion-seen";
100
+ /** Every element whose arrival waits to be seen: what `revealOnView` watches. */
101
+ export declare const MOTION_VIEW_SELECTOR = "[data-motion-on=\"view\"]";
102
+ /**
103
+ * Every arrival waiting to be seen, played as if it had been: a surface with nobody scrolling it and no SDK root to
104
+ * watch it — a preview of an element, a thumbnail — would hold it at its start, unseen.
105
+ */
106
+ export declare const MOTION_SEEN_CSS = "[data-motion-on=\"view\"][data-motion-enter], [data-motion-on=\"view\"][data-motion-stagger] > * { animation-play-state: running, running !important; }";
75
107
  export declare const MOTION_PLAY_CSS: string;
76
108
  /** Whether an animation is one of the declared motion's — what replaying the canvas restarts, and nothing else. */
77
109
  export declare const isMotionAnimation: (animation: object) => boolean;
@@ -6,81 +6,253 @@ var t = [
6
6
  "fade-down",
7
7
  "slide-left",
8
8
  "slide-right",
9
- "scale"
10
- ], n = ["load", "view"], r = [
9
+ "slide-up",
10
+ "scale",
11
+ "zoom-in",
12
+ "zoom-out",
13
+ "pop",
14
+ "bounce-in",
15
+ "tilt",
16
+ "spin-in"
17
+ ], n = [
18
+ "load",
19
+ "view",
20
+ "scroll"
21
+ ], r = [
11
22
  "float",
12
23
  "pulse",
13
24
  "spin",
14
- "sway"
25
+ "sway",
26
+ "bounce",
27
+ "wobble",
28
+ "orbit",
29
+ "heartbeat",
30
+ "drift"
15
31
  ], i = 600, a = "cubic-bezier(0.2, 0.7, 0.2, 1)", o = {
16
- fade: { opacity: 0 },
17
- "fade-up": {
32
+ fade: [{
33
+ at: 0,
34
+ opacity: 0
35
+ }],
36
+ "fade-up": [{
37
+ at: 0,
18
38
  opacity: 0,
19
39
  translate: "0 24px"
20
- },
21
- "fade-down": {
40
+ }],
41
+ "fade-down": [{
42
+ at: 0,
22
43
  opacity: 0,
23
44
  translate: "0 -24px"
24
- },
25
- "slide-left": {
45
+ }],
46
+ "slide-left": [{
47
+ at: 0,
26
48
  opacity: 0,
27
49
  translate: "32px 0"
28
- },
29
- "slide-right": {
50
+ }],
51
+ "slide-right": [{
52
+ at: 0,
30
53
  opacity: 0,
31
54
  translate: "-32px 0"
32
- },
33
- scale: {
55
+ }],
56
+ "slide-up": [{
57
+ at: 0,
58
+ opacity: 0,
59
+ translate: "0 72px"
60
+ }],
61
+ scale: [{
62
+ at: 0,
34
63
  opacity: 0,
35
64
  scale: "0.94"
36
- }
37
- }, s = {
65
+ }],
66
+ "zoom-in": [{
67
+ at: 0,
68
+ opacity: 0,
69
+ scale: "0.6"
70
+ }],
71
+ "zoom-out": [{
72
+ at: 0,
73
+ opacity: 0,
74
+ scale: "1.25"
75
+ }],
76
+ pop: [
77
+ {
78
+ at: 0,
79
+ opacity: 0,
80
+ scale: "0.5"
81
+ },
82
+ {
83
+ at: 55,
84
+ opacity: 1,
85
+ scale: "1.08"
86
+ },
87
+ {
88
+ at: 78,
89
+ scale: "0.97"
90
+ }
91
+ ],
92
+ "bounce-in": [
93
+ {
94
+ at: 0,
95
+ opacity: 0,
96
+ translate: "0 -64px"
97
+ },
98
+ {
99
+ at: 55,
100
+ opacity: 1,
101
+ translate: "0 10px"
102
+ },
103
+ {
104
+ at: 75,
105
+ translate: "0 -5px"
106
+ },
107
+ {
108
+ at: 90,
109
+ translate: "0 2px"
110
+ }
111
+ ],
112
+ tilt: [{
113
+ at: 0,
114
+ opacity: 0,
115
+ translate: "0 32px",
116
+ rotate: "-6deg"
117
+ }],
118
+ "spin-in": [{
119
+ at: 0,
120
+ opacity: 0,
121
+ scale: "0.4",
122
+ rotate: "-180deg"
123
+ }]
124
+ }, s = Object.fromEntries(t.map((e) => {
125
+ let [{ at: t, ...n }] = o[e];
126
+ return [e, n];
127
+ })), c = (e, t) => {
128
+ let n = t * 2 * Math.PI, r = Math.round(Math.sin(n) * e * 10) / 10, i = Math.round(-Math.cos(n) * e * 10) / 10;
129
+ return `translate(${String(r)}px, ${String(i)}px)`;
130
+ }, l = {
38
131
  float: {
39
- transform: "translateY(-8px)",
40
- at: "middle",
132
+ frames: [{
133
+ at: 50,
134
+ transform: "translateY(-8px)"
135
+ }],
41
136
  periodMs: 6e3,
42
137
  easing: "ease-in-out"
43
138
  },
44
139
  pulse: {
45
- transform: "scale(1.04)",
46
- at: "middle",
140
+ frames: [{
141
+ at: 50,
142
+ transform: "scale(1.04)"
143
+ }],
47
144
  periodMs: 3e3,
48
145
  easing: "ease-in-out"
49
146
  },
50
147
  spin: {
51
- transform: "rotate(360deg)",
52
- at: "end",
148
+ frames: [{
149
+ at: 100,
150
+ transform: "rotate(360deg)"
151
+ }],
53
152
  periodMs: 12e3,
54
153
  easing: "linear"
55
154
  },
56
155
  sway: {
57
- transform: "rotate(2deg)",
58
- at: "middle",
156
+ frames: [{
157
+ at: 50,
158
+ transform: "rotate(2deg)"
159
+ }],
59
160
  periodMs: 5e3,
60
161
  easing: "ease-in-out"
162
+ },
163
+ bounce: {
164
+ frames: [
165
+ {
166
+ at: 0,
167
+ transform: "translateY(0) scale(1.03, 0.97)"
168
+ },
169
+ {
170
+ at: 45,
171
+ transform: "translateY(-14px) scale(0.98, 1.02)"
172
+ },
173
+ {
174
+ at: 55,
175
+ transform: "translateY(-14px) scale(0.98, 1.02)"
176
+ },
177
+ {
178
+ at: 100,
179
+ transform: "translateY(0) scale(1.03, 0.97)"
180
+ }
181
+ ],
182
+ periodMs: 1400,
183
+ easing: "ease-in-out"
184
+ },
185
+ wobble: {
186
+ frames: [{
187
+ at: 25,
188
+ transform: "rotate(-5deg)"
189
+ }, {
190
+ at: 75,
191
+ transform: "rotate(5deg)"
192
+ }],
193
+ periodMs: 2400,
194
+ easing: "ease-in-out"
195
+ },
196
+ orbit: {
197
+ frames: Array.from({ length: 9 }, (e, t) => ({
198
+ at: t * 100 / 8,
199
+ transform: c(6, t / 8)
200
+ })),
201
+ periodMs: 8e3,
202
+ easing: "linear"
203
+ },
204
+ heartbeat: {
205
+ frames: [
206
+ {
207
+ at: 14,
208
+ transform: "scale(1.1)"
209
+ },
210
+ {
211
+ at: 28,
212
+ transform: "scale(1)"
213
+ },
214
+ {
215
+ at: 42,
216
+ transform: "scale(1.07)"
217
+ },
218
+ {
219
+ at: 70,
220
+ transform: "scale(1)"
221
+ }
222
+ ],
223
+ periodMs: 1600,
224
+ easing: "ease-in-out"
225
+ },
226
+ drift: {
227
+ frames: [{
228
+ at: 50,
229
+ transform: "translateX(12px)"
230
+ }],
231
+ periodMs: 7e3,
232
+ easing: "ease-in-out"
61
233
  }
62
- }, c = 1e4, l = (e, t) => typeof t == "string" && e.includes(t), u = /* @__PURE__ */ new Set([
234
+ }, u = 1e4, d = (e, t) => typeof t == "string" && e.includes(t), f = /* @__PURE__ */ new Set([
63
235
  "enter",
64
236
  "on",
65
237
  "duration",
66
238
  "delay",
67
239
  "stagger",
68
240
  "loop"
69
- ]), d = (i) => {
241
+ ]), p = (i) => {
70
242
  if (!e(i)) return ["motion is an object: `{ enter: 'fade-up', on: 'view' }`"];
71
243
  let a = [];
72
- for (let e of Object.keys(i)) u.has(e) || a.push(`motion has no "${e}" — it takes enter, on, duration, delay, stagger and loop`);
73
- i.enter !== void 0 && !l(t, i.enter) && a.push(`motion.enter is one of ${t.join(", ")}`), i.on !== void 0 && !l(n, i.on) && a.push(`motion.on is ${n.join(" or ")}`), i.loop !== void 0 && !l(r, i.loop) && a.push(`motion.loop is one of ${r.join(", ")}`);
244
+ for (let e of Object.keys(i)) f.has(e) || a.push(`motion has no "${e}" — it takes enter, on, duration, delay, stagger and loop`);
245
+ i.enter !== void 0 && !d(t, i.enter) && a.push(`motion.enter is one of ${t.join(", ")}`), i.on !== void 0 && !d(n, i.on) && a.push(`motion.on is ${n.slice(0, -1).join(", ")} or ${String(n.at(-1))}`), i.loop !== void 0 && !d(r, i.loop) && a.push(`motion.loop is one of ${r.join(", ")}`);
74
246
  for (let e of [
75
247
  "duration",
76
248
  "delay",
77
249
  "stagger"
78
250
  ]) {
79
251
  let t = i[e];
80
- t !== void 0 && (typeof t != "number" || !Number.isFinite(t) || t < 0 || t > 1e4) && a.push(`motion.${e} is a number of ms from 0 to ${String(c)}`);
252
+ t !== void 0 && (typeof t != "number" || !Number.isFinite(t) || t < 0 || t > 1e4) && a.push(`motion.${e} is a number of ms from 0 to ${String(u)}`);
81
253
  }
82
254
  return i.enter === void 0 && i.loop === void 0 && a.push("motion says nothing to play: give it an `enter`, a `loop`, or both"), i.stagger !== void 0 && i.enter === void 0 && a.push("motion.stagger staggers the children’s `enter`: give it one"), a;
83
- }, f = (e) => d(e).length === 0, p = (e) => {
255
+ }, m = (e) => p(e).length === 0, h = (e) => {
84
256
  if (!e) return {
85
257
  attributes: {},
86
258
  style: {}
@@ -90,6 +262,10 @@ var t = [
90
262
  attributes: t,
91
263
  style: n
92
264
  };
93
- }, m = "[data-motion-enter], [data-motion-stagger] > *, [data-motion-loop]", h = `${m} { animation: none !important; }`, g = ["[data-motion-loop] { animation-play-state: running, running !important; }", "[data-motion-on=\"view\"][data-motion-enter], [data-motion-on=\"view\"][data-motion-stagger] > * { animation-timeline: auto, auto !important; }"].join("\n"), _ = (e) => "animationName" in e && typeof e.animationName == "string" && e.animationName.startsWith("plitzi-motion-");
265
+ }, g = "[data-motion-enter], [data-motion-stagger] > *, [data-motion-loop]", _ = `${g} { animation: none !important; }`, v = "data-motion-seen", y = "[data-motion-on=\"view\"]", b = "[data-motion-on=\"view\"][data-motion-enter], [data-motion-on=\"view\"][data-motion-stagger] > * { animation-play-state: running, running !important; }", x = [
266
+ "[data-motion-loop] { animation-play-state: running, running !important; }",
267
+ b,
268
+ "[data-motion-on=\"scroll\"][data-motion-enter], [data-motion-on=\"scroll\"][data-motion-stagger] > * { animation-timeline: auto, auto !important; }"
269
+ ].join("\n"), S = (e) => "animationName" in e && typeof e.animationName == "string" && e.animationName.startsWith("plitzi-motion-");
94
270
  //#endregion
95
- export { i as MOTION_DEFAULT_DURATION, t as MOTION_ENTERS, a as MOTION_ENTER_EASING, o as MOTION_ENTER_FROM, r as MOTION_LOOPS, s as MOTION_LOOP_FRAMES, c as MOTION_MAX_MS, g as MOTION_PLAY_CSS, h as MOTION_STILL_CSS, n as MOTION_TRIGGERS, m as MOVING_SELECTOR, f as isMotion, _ as isMotionAnimation, p as motionAttributes, d as motionProblems };
271
+ export { i as MOTION_DEFAULT_DURATION, t as MOTION_ENTERS, a as MOTION_ENTER_EASING, o as MOTION_ENTER_FRAMES, s as MOTION_ENTER_FROM, r as MOTION_LOOPS, l as MOTION_LOOP_FRAMES, u as MOTION_MAX_MS, x as MOTION_PLAY_CSS, v as MOTION_SEEN_ATTRIBUTE, b as MOTION_SEEN_CSS, _ as MOTION_STILL_CSS, n as MOTION_TRIGGERS, y as MOTION_VIEW_SELECTOR, g as MOVING_SELECTOR, m as isMotion, S as isMotionAnimation, h as motionAttributes, p as motionProblems };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Plays every arrival under `root` that waits to be seen (`motion: { on: 'view' }`) the first time it comes into view,
3
+ * and never again: the stylesheet holds it at its start until the element carries `data-motion-seen`, which this sets
4
+ * and nothing takes off. Elements added later — a page navigated to, a list's new rows — are watched as they arrive.
5
+ * Answers the function that stops watching.
6
+ *
7
+ * One observer for the whole tree rather than one per element: a page of cards is hundreds of them. A browser without
8
+ * `IntersectionObserver` shows each arrival at once, as one that cannot know what is on screen.
9
+ */
10
+ export declare const revealOnView: (root: Element) => (() => void);
@@ -0,0 +1,23 @@
1
+ import { MOTION_SEEN_ATTRIBUTE as e, MOTION_VIEW_SELECTOR as t } from "./motion.mjs";
2
+ //#region src/schema/motionReveal.ts
3
+ var n = `${t}:not([${e}])`, r = (t) => {
4
+ let r = (t) => t.setAttribute(e, ""), i = (e) => [...e.matches(n) ? [e] : [], ...Array.from(e.querySelectorAll(n))];
5
+ if (typeof Reflect.get(globalThis, "IntersectionObserver") != "function") return i(t).forEach(r), () => void 0;
6
+ let a = new IntersectionObserver((e) => {
7
+ for (let t of e) t.isIntersecting && (r(t.target), a.unobserve(t.target));
8
+ }), o = (e) => i(e).forEach((e) => a.observe(e)), s = new MutationObserver((e) => {
9
+ for (let t of e) t.type === "attributes" && t.target instanceof Element && o(t.target), t.addedNodes.forEach((e) => {
10
+ e instanceof Element && o(e);
11
+ });
12
+ });
13
+ return o(t), s.observe(t, {
14
+ childList: !0,
15
+ subtree: !0,
16
+ attributes: !0,
17
+ attributeFilter: ["data-motion-on"]
18
+ }), () => {
19
+ a.disconnect(), s.disconnect();
20
+ };
21
+ };
22
+ //#endregion
23
+ export { r as revealOnView };
@@ -10,11 +10,11 @@ var e = (e) => ({
10
10
  ...typeof e.stagger == "number" ? { stagger: e.stagger } : {},
11
11
  ...e.loop ? { loop: e.loop } : {}
12
12
  }), n = ({ definition: e, ...n }) => {
13
- let { parentId: r, items: i, bindings: a, interactions: o, initialState: s, runtime: c, loadStrategy: l, flag: u, anchor: d, motion: f, ...p } = e;
13
+ let { parentId: r, items: i, bindings: a, interactions: o, initialState: s, runtime: c, loadStrategy: l, flag: u, anchor: d, motion: f, quiet: p, ...m } = e;
14
14
  return {
15
15
  ...n,
16
16
  definition: {
17
- ...p,
17
+ ...m,
18
18
  ...r == null ? {} : { parentId: r },
19
19
  ...i == null ? {} : { items: i },
20
20
  ...a == null ? {} : { bindings: a },
@@ -24,7 +24,8 @@ var e = (e) => ({
24
24
  ...l == null ? {} : { loadStrategy: l },
25
25
  ...u == null ? {} : { flag: u },
26
26
  ...d == null ? {} : { anchor: d },
27
- ...f == null ? {} : { motion: t(f) }
27
+ ...f == null ? {} : { motion: t(f) },
28
+ ...p == null ? {} : { quiet: p }
28
29
  }
29
30
  };
30
31
  }, r = (e) => ({
@@ -28,6 +28,11 @@ export type SpaceExport = {
28
28
  };
29
29
  /** The version taken out: the draft (`main`, revision 0), or a snapshot an environment holds. */
30
30
  version: Pick<SpaceVersionContents, 'environment' | 'revision' | 'snapshot'>;
31
+ /**
32
+ * Which state of the draft's documents this is — its schema, style, actions and connectors — what `plitzi push`
33
+ * checks the space's draft has not moved on from. `null` for a snapshot, which no push writes.
34
+ */
35
+ draft: string | null;
31
36
  /** The space as authoring code, by path (`index.ts`, a file per page): none for a project that reads it from Plitzi. */
32
37
  authoring: {
33
38
  exportName: string;
@@ -0,0 +1,55 @@
1
+ import { Schema, Style } from '../types';
2
+ /**
3
+ * A project's space put back on Plitzi as the space's draft (docs/en/projects-from-spaces.md): what `plitzi push` sends
4
+ * to `PUT /spaces/:spaceId/import`, and what it is answered. The way back of `SpaceExport` — one shape for both ends.
5
+ */
6
+ export declare const SPACE_IMPORT_FORMAT = 1;
7
+ export type SpaceImport = {
8
+ format: typeof SPACE_IMPORT_FORMAT;
9
+ /** The space as the project authors it: the two documents the draft is made of, replaced whole. */
10
+ documents: {
11
+ schema: Schema;
12
+ style: Style;
13
+ };
14
+ /**
15
+ * Every server action the project keeps, and every connector: the space's become exactly these. Left out, the project
16
+ * keeps none of its own, and the space's are left as they are.
17
+ */
18
+ actions?: {
19
+ identifier: string;
20
+ name: string;
21
+ document: unknown;
22
+ }[];
23
+ connectors?: {
24
+ identifier: string;
25
+ name: string;
26
+ manifest: unknown;
27
+ }[];
28
+ /**
29
+ * The draft the project was last given or last pushed (`SpaceExport.draft`): the push is refused when the space's has
30
+ * moved on since. `null` for a project that never had one — refused unless the space is still as it was created.
31
+ */
32
+ base: string | null;
33
+ /** Replace the draft whatever it holds now. */
34
+ force: boolean;
35
+ };
36
+ /** Why a push was not taken, before anything was checked: the draft is not the one the project knows. */
37
+ export type SpaceImportRefusalCode = 'DRAFT_MOVED' | 'DRAFT_NOT_EMPTY';
38
+ export type SpaceImportResult =
39
+ /** Taken: `draft` is what the project knows from now on; `changed` false when it already was the space's draft. */
40
+ {
41
+ ok: true;
42
+ changed: boolean;
43
+ draft: string;
44
+ } | {
45
+ ok: false;
46
+ refusal: {
47
+ code: SpaceImportRefusalCode;
48
+ error: string;
49
+ };
50
+ }
51
+ /** Not taken: what is wrong with what was sent, each problem where it is. */
52
+ | {
53
+ ok: false;
54
+ problems: string[];
55
+ };
@@ -0,0 +1,4 @@
1
+ //#region src/source/import.ts
2
+ var e = 1;
3
+ //#endregion
4
+ export { e as SPACE_IMPORT_FORMAT };
@@ -1,4 +1,6 @@
1
1
  export { readSourceSnapshot, secretIn, sourcePathProblem, SOURCE_SNAPSHOT_FORMAT, SOURCE_SNAPSHOT_LIMITS } from './snapshot';
2
2
  export { SPACE_EXPORT_FORMAT } from './export';
3
+ export { SPACE_IMPORT_FORMAT } from './import';
3
4
  export type { SourceSnapshot, SourceSnapshotKind, SourceSnapshotReading } from './snapshot';
4
5
  export type { SpaceExport, SpaceExportConflict, SpaceExportFile } from './export';
6
+ export type { SpaceImport, SpaceImportRefusalCode, SpaceImportResult } from './import';
@@ -1,3 +1,4 @@
1
1
  import { SPACE_EXPORT_FORMAT as e } from "./export.mjs";
2
- import { SOURCE_SNAPSHOT_FORMAT as t, SOURCE_SNAPSHOT_LIMITS as n, readSourceSnapshot as r, secretIn as i, sourcePathProblem as a } from "./snapshot.mjs";
3
- export { t as SOURCE_SNAPSHOT_FORMAT, n as SOURCE_SNAPSHOT_LIMITS, e as SPACE_EXPORT_FORMAT, r as readSourceSnapshot, i as secretIn, a as sourcePathProblem };
2
+ import { SPACE_IMPORT_FORMAT as t } from "./import.mjs";
3
+ import { SOURCE_SNAPSHOT_FORMAT as n, SOURCE_SNAPSHOT_LIMITS as r, readSourceSnapshot as i, secretIn as a, sourcePathProblem as o } from "./snapshot.mjs";
4
+ export { n as SOURCE_SNAPSHOT_FORMAT, r as SOURCE_SNAPSHOT_LIMITS, e as SPACE_EXPORT_FORMAT, t as SPACE_IMPORT_FORMAT, i as readSourceSnapshot, a as secretIn, o as sourcePathProblem };
@@ -94,7 +94,13 @@ declare const styleConstants: {
94
94
  readonly CLIP_PATH: "clip-path";
95
95
  readonly TRANSFORM: "transform";
96
96
  readonly TRANSFORM_ORIGIN: "transform-origin";
97
+ readonly TRANSLATE: "translate";
98
+ readonly ROTATE: "rotate";
99
+ readonly SCALE: "scale";
100
+ readonly TRANSFORM_STYLE: "transform-style";
97
101
  readonly PERSPECTIVE: "perspective";
102
+ readonly PERSPECTIVE_ORIGIN: "perspective-origin";
103
+ readonly BACKFACE_VISIBILITY: "backface-visibility";
98
104
  readonly WILL_CHANGE: "will-change";
99
105
  readonly OUTLINE_WIDTH: "outline-width";
100
106
  readonly OUTLINE_STYLE: "outline-style";
@@ -136,6 +142,8 @@ declare const styleConstants: {
136
142
  readonly OVERFLOW_Y: "overflow-y";
137
143
  readonly SCROLLBAR_WIDTH: "scrollbar-width";
138
144
  readonly SCROLLBAR_COLOR: "scrollbar-color";
145
+ readonly CONTAINER_TYPE: "container-type";
146
+ readonly CONTAINER_NAME: "container-name";
139
147
  readonly OBJECT_FIT: "object-fit";
140
148
  readonly OBJECT_POSITION: "object-position";
141
149
  readonly COLUMN_WIDTH: "column-width";
@@ -190,8 +198,8 @@ declare const styleConstants: {
190
198
  };
191
199
  export declare const inheritableAttributesBase: StyleCategory[];
192
200
  export declare const StyleBindingsAllowed: {
193
- path: "color" | "cursor" | "filter" | "fill" | "display" | "flex-wrap" | "flex-direction" | "align-items" | "justify-items" | "justify-content" | "align-content" | "row-gap" | "column-gap" | "grid-row-gap" | "grid-column-gap" | "grid-template-areas" | "grid-template-columns" | "grid-template-rows" | "grid-auto-flow" | "grid-auto-rows" | "grid-auto-columns" | "grid-row-start" | "grid-column-start" | "grid-row-end" | "grid-column-end" | "align-self" | "justify-self" | "order" | "flex-grow" | "flex-shrink" | "flex-basis" | "list-style" | "list-style-type" | "list-style-position" | "list-style-image" | "background-color" | "background-image" | "background-position" | "background-size" | "background-repeat" | "background-origin" | "background-clip" | "background-attachment" | "background-blend-mode" | "mask-image" | "mask-size" | "mask-position" | "mask-repeat" | "mask-composite" | "-webkit-mask-image" | "border-top-style" | "border-top-width" | "border-top-color" | "border-bottom-style" | "border-bottom-width" | "border-bottom-color" | "border-left-style" | "border-left-width" | "border-left-color" | "border-right-style" | "border-right-width" | "border-right-color" | "border-top-left-radius" | "border-top-right-radius" | "border-bottom-left-radius" | "border-bottom-right-radius" | "border-collapse" | "border-spacing" | "table-layout" | "opacity" | "visibility" | "transition" | "transition-property" | "transition-duration" | "transition-timing-function" | "transition-delay" | "transition-behavior" | "animation" | "animation-name" | "animation-duration" | "animation-timing-function" | "animation-delay" | "animation-iteration-count" | "animation-direction" | "animation-fill-mode" | "animation-play-state" | "animation-timeline" | "animation-range" | "box-shadow" | "backdrop-filter" | "mix-blend-mode" | "isolation" | "clip-path" | "transform" | "transform-origin" | "perspective" | "will-change" | "outline-width" | "outline-style" | "outline-color" | "outline-offset" | "pointer-events" | "user-select" | "touch-action" | "resize" | "appearance" | "scroll-behavior" | "overscroll-behavior" | "scroll-snap-type" | "scroll-snap-align" | "scroll-snap-stop" | "scroll-padding-top" | "scroll-margin-top" | "accent-color" | "caret-color" | "color-scheme" | "position" | "float" | "clear" | "z-index" | "top" | "bottom" | "left" | "right" | "box-sizing" | "aspect-ratio" | "width" | "height" | "min-width" | "min-height" | "max-width" | "max-height" | "overflow" | "overflow-x" | "overflow-y" | "scrollbar-width" | "scrollbar-color" | "object-fit" | "object-position" | "column-width" | "column-count" | "margin-top" | "margin-bottom" | "margin-left" | "margin-right" | "padding-top" | "padding-bottom" | "padding-left" | "padding-right" | "font-family" | "font-weight" | "font-size" | "line-height" | "text-align" | "font-style" | "font-variant" | "font-variant-numeric" | "font-feature-settings" | "text-decoration" | "text-decoration-line" | "text-decoration-color" | "text-decoration-style" | "text-decoration-thickness" | "text-underline-offset" | "letter-spacing" | "word-spacing" | "text-indent" | "text-transform" | "direction" | "white-space" | "text-wrap" | "word-break" | "overflow-wrap" | "hyphens" | "vertical-align" | "text-overflow" | "text-shadow" | "line-clamp" | "-webkit-line-clamp" | "-webkit-box-orient" | "-webkit-text-fill-color" | "-webkit-background-clip" | "box-decoration-break" | "-webkit-box-decoration-break" | "stroke" | "stroke-width";
194
- label: "color" | "cursor" | "filter" | "fill" | "display" | "flex-wrap" | "flex-direction" | "align-items" | "justify-items" | "justify-content" | "align-content" | "row-gap" | "column-gap" | "grid-row-gap" | "grid-column-gap" | "grid-template-areas" | "grid-template-columns" | "grid-template-rows" | "grid-auto-flow" | "grid-auto-rows" | "grid-auto-columns" | "grid-row-start" | "grid-column-start" | "grid-row-end" | "grid-column-end" | "align-self" | "justify-self" | "order" | "flex-grow" | "flex-shrink" | "flex-basis" | "list-style" | "list-style-type" | "list-style-position" | "list-style-image" | "background-color" | "background-image" | "background-position" | "background-size" | "background-repeat" | "background-origin" | "background-clip" | "background-attachment" | "background-blend-mode" | "mask-image" | "mask-size" | "mask-position" | "mask-repeat" | "mask-composite" | "-webkit-mask-image" | "border-top-style" | "border-top-width" | "border-top-color" | "border-bottom-style" | "border-bottom-width" | "border-bottom-color" | "border-left-style" | "border-left-width" | "border-left-color" | "border-right-style" | "border-right-width" | "border-right-color" | "border-top-left-radius" | "border-top-right-radius" | "border-bottom-left-radius" | "border-bottom-right-radius" | "border-collapse" | "border-spacing" | "table-layout" | "opacity" | "visibility" | "transition" | "transition-property" | "transition-duration" | "transition-timing-function" | "transition-delay" | "transition-behavior" | "animation" | "animation-name" | "animation-duration" | "animation-timing-function" | "animation-delay" | "animation-iteration-count" | "animation-direction" | "animation-fill-mode" | "animation-play-state" | "animation-timeline" | "animation-range" | "box-shadow" | "backdrop-filter" | "mix-blend-mode" | "isolation" | "clip-path" | "transform" | "transform-origin" | "perspective" | "will-change" | "outline-width" | "outline-style" | "outline-color" | "outline-offset" | "pointer-events" | "user-select" | "touch-action" | "resize" | "appearance" | "scroll-behavior" | "overscroll-behavior" | "scroll-snap-type" | "scroll-snap-align" | "scroll-snap-stop" | "scroll-padding-top" | "scroll-margin-top" | "accent-color" | "caret-color" | "color-scheme" | "position" | "float" | "clear" | "z-index" | "top" | "bottom" | "left" | "right" | "box-sizing" | "aspect-ratio" | "width" | "height" | "min-width" | "min-height" | "max-width" | "max-height" | "overflow" | "overflow-x" | "overflow-y" | "scrollbar-width" | "scrollbar-color" | "object-fit" | "object-position" | "column-width" | "column-count" | "margin-top" | "margin-bottom" | "margin-left" | "margin-right" | "padding-top" | "padding-bottom" | "padding-left" | "padding-right" | "font-family" | "font-weight" | "font-size" | "line-height" | "text-align" | "font-style" | "font-variant" | "font-variant-numeric" | "font-feature-settings" | "text-decoration" | "text-decoration-line" | "text-decoration-color" | "text-decoration-style" | "text-decoration-thickness" | "text-underline-offset" | "letter-spacing" | "word-spacing" | "text-indent" | "text-transform" | "direction" | "white-space" | "text-wrap" | "word-break" | "overflow-wrap" | "hyphens" | "vertical-align" | "text-overflow" | "text-shadow" | "line-clamp" | "-webkit-line-clamp" | "-webkit-box-orient" | "-webkit-text-fill-color" | "-webkit-background-clip" | "box-decoration-break" | "-webkit-box-decoration-break" | "stroke" | "stroke-width";
201
+ path: "color" | "cursor" | "filter" | "fill" | "display" | "flex-wrap" | "flex-direction" | "align-items" | "justify-items" | "justify-content" | "align-content" | "row-gap" | "column-gap" | "grid-row-gap" | "grid-column-gap" | "grid-template-areas" | "grid-template-columns" | "grid-template-rows" | "grid-auto-flow" | "grid-auto-rows" | "grid-auto-columns" | "grid-row-start" | "grid-column-start" | "grid-row-end" | "grid-column-end" | "align-self" | "justify-self" | "order" | "flex-grow" | "flex-shrink" | "flex-basis" | "list-style" | "list-style-type" | "list-style-position" | "list-style-image" | "background-color" | "background-image" | "background-position" | "background-size" | "background-repeat" | "background-origin" | "background-clip" | "background-attachment" | "background-blend-mode" | "mask-image" | "mask-size" | "mask-position" | "mask-repeat" | "mask-composite" | "-webkit-mask-image" | "border-top-style" | "border-top-width" | "border-top-color" | "border-bottom-style" | "border-bottom-width" | "border-bottom-color" | "border-left-style" | "border-left-width" | "border-left-color" | "border-right-style" | "border-right-width" | "border-right-color" | "border-top-left-radius" | "border-top-right-radius" | "border-bottom-left-radius" | "border-bottom-right-radius" | "border-collapse" | "border-spacing" | "table-layout" | "opacity" | "visibility" | "transition" | "transition-property" | "transition-duration" | "transition-timing-function" | "transition-delay" | "transition-behavior" | "animation" | "animation-name" | "animation-duration" | "animation-timing-function" | "animation-delay" | "animation-iteration-count" | "animation-direction" | "animation-fill-mode" | "animation-play-state" | "animation-timeline" | "animation-range" | "box-shadow" | "backdrop-filter" | "mix-blend-mode" | "isolation" | "clip-path" | "transform" | "transform-origin" | "translate" | "rotate" | "scale" | "transform-style" | "perspective" | "perspective-origin" | "backface-visibility" | "will-change" | "outline-width" | "outline-style" | "outline-color" | "outline-offset" | "pointer-events" | "user-select" | "touch-action" | "resize" | "appearance" | "scroll-behavior" | "overscroll-behavior" | "scroll-snap-type" | "scroll-snap-align" | "scroll-snap-stop" | "scroll-padding-top" | "scroll-margin-top" | "accent-color" | "caret-color" | "color-scheme" | "position" | "float" | "clear" | "z-index" | "top" | "bottom" | "left" | "right" | "box-sizing" | "aspect-ratio" | "width" | "height" | "min-width" | "min-height" | "max-width" | "max-height" | "overflow" | "overflow-x" | "overflow-y" | "scrollbar-width" | "scrollbar-color" | "container-type" | "container-name" | "object-fit" | "object-position" | "column-width" | "column-count" | "margin-top" | "margin-bottom" | "margin-left" | "margin-right" | "padding-top" | "padding-bottom" | "padding-left" | "padding-right" | "font-family" | "font-weight" | "font-size" | "line-height" | "text-align" | "font-style" | "font-variant" | "font-variant-numeric" | "font-feature-settings" | "text-decoration" | "text-decoration-line" | "text-decoration-color" | "text-decoration-style" | "text-decoration-thickness" | "text-underline-offset" | "letter-spacing" | "word-spacing" | "text-indent" | "text-transform" | "direction" | "white-space" | "text-wrap" | "word-break" | "overflow-wrap" | "hyphens" | "vertical-align" | "text-overflow" | "text-shadow" | "line-clamp" | "-webkit-line-clamp" | "-webkit-box-orient" | "-webkit-text-fill-color" | "-webkit-background-clip" | "box-decoration-break" | "-webkit-box-decoration-break" | "stroke" | "stroke-width";
202
+ label: "color" | "cursor" | "filter" | "fill" | "display" | "flex-wrap" | "flex-direction" | "align-items" | "justify-items" | "justify-content" | "align-content" | "row-gap" | "column-gap" | "grid-row-gap" | "grid-column-gap" | "grid-template-areas" | "grid-template-columns" | "grid-template-rows" | "grid-auto-flow" | "grid-auto-rows" | "grid-auto-columns" | "grid-row-start" | "grid-column-start" | "grid-row-end" | "grid-column-end" | "align-self" | "justify-self" | "order" | "flex-grow" | "flex-shrink" | "flex-basis" | "list-style" | "list-style-type" | "list-style-position" | "list-style-image" | "background-color" | "background-image" | "background-position" | "background-size" | "background-repeat" | "background-origin" | "background-clip" | "background-attachment" | "background-blend-mode" | "mask-image" | "mask-size" | "mask-position" | "mask-repeat" | "mask-composite" | "-webkit-mask-image" | "border-top-style" | "border-top-width" | "border-top-color" | "border-bottom-style" | "border-bottom-width" | "border-bottom-color" | "border-left-style" | "border-left-width" | "border-left-color" | "border-right-style" | "border-right-width" | "border-right-color" | "border-top-left-radius" | "border-top-right-radius" | "border-bottom-left-radius" | "border-bottom-right-radius" | "border-collapse" | "border-spacing" | "table-layout" | "opacity" | "visibility" | "transition" | "transition-property" | "transition-duration" | "transition-timing-function" | "transition-delay" | "transition-behavior" | "animation" | "animation-name" | "animation-duration" | "animation-timing-function" | "animation-delay" | "animation-iteration-count" | "animation-direction" | "animation-fill-mode" | "animation-play-state" | "animation-timeline" | "animation-range" | "box-shadow" | "backdrop-filter" | "mix-blend-mode" | "isolation" | "clip-path" | "transform" | "transform-origin" | "translate" | "rotate" | "scale" | "transform-style" | "perspective" | "perspective-origin" | "backface-visibility" | "will-change" | "outline-width" | "outline-style" | "outline-color" | "outline-offset" | "pointer-events" | "user-select" | "touch-action" | "resize" | "appearance" | "scroll-behavior" | "overscroll-behavior" | "scroll-snap-type" | "scroll-snap-align" | "scroll-snap-stop" | "scroll-padding-top" | "scroll-margin-top" | "accent-color" | "caret-color" | "color-scheme" | "position" | "float" | "clear" | "z-index" | "top" | "bottom" | "left" | "right" | "box-sizing" | "aspect-ratio" | "width" | "height" | "min-width" | "min-height" | "max-width" | "max-height" | "overflow" | "overflow-x" | "overflow-y" | "scrollbar-width" | "scrollbar-color" | "container-type" | "container-name" | "object-fit" | "object-position" | "column-width" | "column-count" | "margin-top" | "margin-bottom" | "margin-left" | "margin-right" | "padding-top" | "padding-bottom" | "padding-left" | "padding-right" | "font-family" | "font-weight" | "font-size" | "line-height" | "text-align" | "font-style" | "font-variant" | "font-variant-numeric" | "font-feature-settings" | "text-decoration" | "text-decoration-line" | "text-decoration-color" | "text-decoration-style" | "text-decoration-thickness" | "text-underline-offset" | "letter-spacing" | "word-spacing" | "text-indent" | "text-transform" | "direction" | "white-space" | "text-wrap" | "word-break" | "overflow-wrap" | "hyphens" | "vertical-align" | "text-overflow" | "text-shadow" | "line-clamp" | "-webkit-line-clamp" | "-webkit-box-orient" | "-webkit-text-fill-color" | "-webkit-background-clip" | "box-decoration-break" | "-webkit-box-decoration-break" | "stroke" | "stroke-width";
195
203
  }[];
196
204
  export declare const baseDefaultValue: Record<StyleCategory, StyleValue>;
197
205
  export default styleConstants;
@@ -107,7 +107,13 @@ var e = {
107
107
  CLIP_PATH: "clip-path",
108
108
  TRANSFORM: "transform",
109
109
  TRANSFORM_ORIGIN: "transform-origin",
110
+ TRANSLATE: "translate",
111
+ ROTATE: "rotate",
112
+ SCALE: "scale",
113
+ TRANSFORM_STYLE: "transform-style",
110
114
  PERSPECTIVE: "perspective",
115
+ PERSPECTIVE_ORIGIN: "perspective-origin",
116
+ BACKFACE_VISIBILITY: "backface-visibility",
111
117
  WILL_CHANGE: "will-change",
112
118
  OUTLINE_WIDTH: "outline-width",
113
119
  OUTLINE_STYLE: "outline-style",
@@ -149,6 +155,8 @@ var e = {
149
155
  OVERFLOW_Y: "overflow-y",
150
156
  SCROLLBAR_WIDTH: "scrollbar-width",
151
157
  SCROLLBAR_COLOR: "scrollbar-color",
158
+ CONTAINER_TYPE: "container-type",
159
+ CONTAINER_NAME: "container-name",
152
160
  OBJECT_FIT: "object-fit",
153
161
  OBJECT_POSITION: "object-position",
154
162
  COLUMN_WIDTH: "column-width",
@@ -320,7 +328,13 @@ var e = {
320
328
  [t.CLIP_PATH]: "none",
321
329
  [t.TRANSFORM]: "translate3d(0px, 0px, 0px)",
322
330
  [t.TRANSFORM_ORIGIN]: "50% 50%",
331
+ [t.TRANSLATE]: "none",
332
+ [t.ROTATE]: "none",
333
+ [t.SCALE]: "none",
334
+ [t.TRANSFORM_STYLE]: "flat",
323
335
  [t.PERSPECTIVE]: "none",
336
+ [t.PERSPECTIVE_ORIGIN]: "50% 50%",
337
+ [t.BACKFACE_VISIBILITY]: "visible",
324
338
  [t.WILL_CHANGE]: "auto",
325
339
  [t.OUTLINE_WIDTH]: "medium",
326
340
  [t.OUTLINE_STYLE]: "none",
@@ -362,6 +376,8 @@ var e = {
362
376
  [t.OVERFLOW_Y]: "visible",
363
377
  [t.SCROLLBAR_WIDTH]: "auto",
364
378
  [t.SCROLLBAR_COLOR]: "auto",
379
+ [t.CONTAINER_TYPE]: "normal",
380
+ [t.CONTAINER_NAME]: "none",
365
381
  [t.OBJECT_FIT]: "fill",
366
382
  [t.OBJECT_POSITION]: "50% 50%",
367
383
  [t.COLUMN_WIDTH]: "auto",
@@ -117,6 +117,12 @@ export type ElementDefinition = {
117
117
  anchor?: string;
118
118
  /** How it arrives and whether it keeps moving, played by the SDK's stylesheet. See {@link ElementMotion}. */
119
119
  motion?: ElementMotion;
120
+ /**
121
+ * The codes of the suggestions this element is not offered, because it is written this way on purpose —
122
+ * `['repeated-shape']`. Read by the one place suggestions are made (`suggestSpace`), so authoring, the builder and
123
+ * the MCP leave out the same ones. Never a problem's code.
124
+ */
125
+ quiet?: string[];
120
126
  };
121
127
  /**
122
128
  * An element, keyed by the one name it answers to.
@@ -340,7 +346,7 @@ export type SchemaContextValue = {
340
346
  schemaUpdateSettings?: (value: string | number | boolean, path?: string, fromSubscriptions?: boolean) => void;
341
347
  };
342
348
  /** The fields of a definition an element may go without — absent in a document, `null` from GraphQL. */
343
- type OptionalDefinitionKey = 'parentId' | 'items' | 'bindings' | 'interactions' | 'initialState' | 'runtime' | 'loadStrategy' | 'flag' | 'anchor' | 'motion';
349
+ type OptionalDefinitionKey = 'parentId' | 'items' | 'bindings' | 'interactions' | 'initialState' | 'runtime' | 'loadStrategy' | 'flag' | 'anchor' | 'motion' | 'quiet';
344
350
  /**
345
351
  * An element as it arrives on the wire. GraphQL answers every field a query names, so one the element does not have
346
352
  * comes back `null` — where the element itself has nothing. `schemaFromWire` drops them on arrival.
@@ -171,7 +171,7 @@ export type SSRImagesConfig = {
171
171
  * to the rule every outbound request is (no private network, every redirect judged).
172
172
  */
173
173
  domains: readonly string[];
174
- /** Where the resized files are kept. Default: `.plitzi/images` under the working directory. */
174
+ /** Where the resized files are kept. Default: `tmp/images` under the working directory. */
175
175
  cacheDir?: string;
176
176
  };
177
177
  /**
@@ -945,6 +945,7 @@ export type SSRServerConfig = {
945
945
  authCookie?: SSRAuthCookie;
946
946
  templateFn?: SSRTemplateFn;
947
947
  plugins?: Record<string, PluginSource>;
948
+ /** Where the plugins it builds are kept. Default: `tmp/.sdk-plugins` under the working directory. */
948
949
  pluginsCacheDir?: string;
949
950
  pluginsTtlMs?: number;
950
951
  /** Auto-download and cache plugins declared in the schema's offlineData.plugins list. Default: true. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plitzi/sdk-shared",
3
- "version": "0.38.3",
3
+ "version": "0.38.4",
4
4
  "license": "AGPL-3.0",
5
5
  "files": [
6
6
  "dist",
@@ -254,6 +254,10 @@
254
254
  "types": "./dist/devTools/DevToolsContext.d.ts",
255
255
  "import": "./dist/devTools/DevToolsContext.mjs"
256
256
  },
257
+ "./devTools/chrome": {
258
+ "types": "./dist/devTools/chrome.d.ts",
259
+ "import": "./dist/devTools/chrome.mjs"
260
+ },
257
261
  "./devTools/debugCookie": {
258
262
  "types": "./dist/devTools/debugCookie.d.ts",
259
263
  "import": "./dist/devTools/debugCookie.mjs"
@@ -1139,6 +1143,10 @@
1139
1143
  "types": "./dist/schema/motion.d.ts",
1140
1144
  "import": "./dist/schema/motion.mjs"
1141
1145
  },
1146
+ "./schema/motionReveal": {
1147
+ "types": "./dist/schema/motionReveal.d.ts",
1148
+ "import": "./dist/schema/motionReveal.mjs"
1149
+ },
1142
1150
  "./schema/schemaConstants": {
1143
1151
  "types": "./dist/schema/schemaConstants.d.ts",
1144
1152
  "import": "./dist/schema/schemaConstants.mjs"
@@ -1195,6 +1203,10 @@
1195
1203
  "types": "./dist/source/export.d.ts",
1196
1204
  "import": "./dist/source/export.mjs"
1197
1205
  },
1206
+ "./source/import": {
1207
+ "types": "./dist/source/import.d.ts",
1208
+ "import": "./dist/source/import.mjs"
1209
+ },
1198
1210
  "./source/index": {
1199
1211
  "types": "./dist/source/index.d.ts",
1200
1212
  "import": "./dist/source/index.mjs"