@plitzi/sdk-shared 0.38.8 → 0.38.9

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,67 @@
1
1
  # @plitzi/sdk-shared
2
2
 
3
+ ## 0.38.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 64f4cd6: - **`unusedPort()`** (`@plitzi/sdk-server`): a port the system has just handed out, for a test to listen on. The
8
+ package's own tests and `@plitzi/sdk-mcp`'s listened on fixed ports in the ephemeral range (393xx), which any
9
+ outgoing connection of a test running beside them could take: CI failed with `EADDRINUSE` on runs with nothing
10
+ wrong. Every one now listens on a port the system gives it.
11
+ - **Brotli at quality 5** (`@plitzi/sdk-server`): `compression.brotliQuality`, for a page rendered for one request, is
12
+ 5 (was 2). At 2 a 220 KB page came out larger than gzip — 36 KB against 31 — and at 5 it is 29 KB, for the CPU gzip
13
+ spends; on half a core ~0.1 ms a page.
14
+ - **`verify` checks the pages for signed-in visitors** (`@plitzi/cli`): a page that sends the browser to sign in is
15
+ checked again signed in as the account `.env` names — `PLITZI_CHECK_USER`, `PLITZI_CHECK_PASSWORD` (the environment
16
+ wins over `.env`). With none named, `verify` says how. `page check --as` reads the password from `.env` too, and
17
+ `page check` takes several pages, in one browser.
18
+ - **An address that shows nothing answers 404** (`@plitzi/sdk-shared`, `@plitzi/plitzi-sdk`, `@plitzi/sdk-server`):
19
+ one no page answers was sent to the home page with a 302 — every typo read as the home page. A page whose slug is
20
+ `'*'` is now the space's page for it, sent with status 404 (a folder may have its own; the deepest wins), and a page
21
+ gated off by a flag shows it too. Never kept in the page cache: an address asked for at random filled it. Only a slug
22
+ that IS `'*'`: a page answering a subtree by its own (`spaces/:spaceId/update/*`) stays a page like any other.
23
+ - **`authorSpace` gives a space with no `'*'` page a plain one** (`@plitzi/sdk-authoring`), in the home page's layout,
24
+ and says so: suggestion `not-found-page`. The project templates carry their own.
25
+ - **`notFound` on a server provider** (`@plitzi/sdk-elements`, `@plitzi/sdk-server`): an expression against its answer
26
+ (`{{ source.found == false }}`); when it is true the page is sent with status 404, rendered as written. Refused on a
27
+ browser provider (`not-found-in-browser`) and when it is not one expression (`not-found-not-a-template`).
28
+ - **`page check` and `verify` know a page sent with 404** (`@plitzi/cli`): it is said, not failed; the space's `'*'`
29
+ page is checked at an address no page has, and fails if it is not sent with 404.
30
+ - **A form field draws no background of its own** (`@plitzi/sdk-elements`): the `<input>` inside a form control's box
31
+ (`field`) took `background-color: inherit`, and painted a translucent box colour a second time — a darker box inside
32
+ the padding (Tremor's search). It is `transparent`: the box shows through it.
33
+ - **`space lint` offers `quiet` only where there is an element to put it on** (`@plitzi/cli`): a suggestion about what
34
+ the space lacks — `not-found-page` — is answered by writing it.
35
+ - **`feedback --previous`** (`@plitzi/cli`): the brief says what to do when an earlier report's link no longer opens —
36
+ say so, and ask the person for the highest id it had.
37
+ - **`start:prod` runs in production by itself** (`@plitzi/cli`): `NODE_ENV=production node …`. Without the variable a
38
+ deployed project was a development server — dev tools on, and every public action answering its `steps` and `trace`
39
+ (each step's result, what the `output` was meant to leave out). `doctor` says a `start:prod` that does not
40
+ (`start-prod-not-production`); `plitzi upgrade --write` rewrites the script.
41
+ - **A project's `ActionRefusal` reaches the flow** (`@plitzi/sdk-server`): a functions bundle carries its own copy of the
42
+ class, so `instanceof` never knew it and the run lost its reason (`{{ x.error }}` empty). Told apart by name now.
43
+ - **Plugins are not remounted after hydration** (`@plitzi/sdk-elements`): the registry wrapped each plugin again when
44
+ the host handed it over again, a new component type every time — the server's HTML thrown away, entrances replayed,
45
+ effects run twice. Each plugin component is wrapped once.
46
+ - **`start:dev` survives a space that does not author** (`@plitzi/sdk-server`): a restart while the space had an error
47
+ died, and fixing the space woke nothing. It comes up answering every page with what is wrong (503), and loads the
48
+ space the first time a save authors.
49
+ - **`page check` sees what is cut off at the screen's edge** (`@plitzi/sdk-authoring`, `@plitzi/cli`): a link or words an
50
+ ancestor hides past the viewport, which no sideways scroll shows (`cut-off`).
51
+ - **`page shot --click <element...> --sheet`** (`@plitzi/cli`): elements clicked in order — a name or a CSS selector,
52
+ inside a plugin too — pictured after each (`--frames`/`--every`), with how much changed, and every picture on one
53
+ contact sheet. The dev tools' badge is no longer in a picture: its shadow root is marked (`@plitzi/sdk-dev-tools`).
54
+ - **`formControl` is optional unless it says `required: true`** (`@plitzi/sdk-elements`), as an HTML field is. A field
55
+ left without `required` in an older space was required, and is not now.
56
+ - **`text({ decorative })`, `list({ label })`** (`@plitzi/sdk-elements`); **`writing-mode`, `text-orientation`** in the
57
+ CSS vocabulary (`@plitzi/sdk-shared`).
58
+ - **`unused-token` reads the plugins' stylesheets** (`@plitzi/sdk-authoring`): `authorSpace`'s `stylesheets`, which
59
+ `projectAuthoring` fills with every `.css` under `src/plugins/` — a token only a plugin used was said to be unused.
60
+ - **`id-taken` on a provider placed on two pages points at the layout they share** (`@plitzi/sdk-authoring`), not at
61
+ `scope()`, which renamed its source and every template reading it.
62
+ - **The welcome template's tokens keep their names** (`@plitzi/sdk-authoring`): `satisfies`, not an annotation, so
63
+ `tokens(variables).card` typechecks as the cheatsheet teaches.
64
+
3
65
  ## 0.38.8
4
66
 
5
67
  ### Patch Changes
package/dist/index.mjs CHANGED
@@ -70,27 +70,27 @@ import jn from "./schema/SchemaContext.mjs";
70
70
  import { ANCHOR_PATTERN as Mn, anchorOf as Nn, isAnchor as Pn, uniqueAnchor as Fn } from "./schema/anchor.mjs";
71
71
  import { COMPONENT_PROPS_SOURCE as In, EMPTY_SCHEMA as Ln, VARIABLE_REGEX as Rn } from "./schema/schemaConstants.mjs";
72
72
  import { findLayoutCycle as zn, resolveLayoutChain as Bn } from "./schema/layoutChain.mjs";
73
- import { collectServerElements as Vn, hasServerElements as Hn } from "./schema/serverElements.mjs";
74
- import { isSnippet as Un } from "./schema/snippet.mjs";
75
- import Wn from "./network/NetworkContext.mjs";
76
- import Gn from "./network/NetworkInternalContext.mjs";
77
- import { elementFromWire as Kn, schemaFromWire as qn, schemaToWire as Jn } from "./schema/wire.mjs";
78
- import { SpaceEvents as Yn, spaceEventSchemas as Xn, validateSpaceEvent as Zn } from "./network/spaceEvents.mjs";
79
- import Qn from "./network/graphql/builder/Mutations/index.mjs";
80
- import $n from "./network/graphql/builder/Queries/index.mjs";
81
- import er from "./network/graphql/builder/Subscriptions/index.mjs";
82
- import tr from "./network/graphql/sdk/Mutations/index.mjs";
83
- import nr from "./network/graphql/sdk/Queries/index.mjs";
84
- import rr, { RTEvent as ir, RTEventCloseCode as ar, getInstance as or, isRTEvent as sr, isRTEventCloseCode as cr, setInstance as lr } from "./websockets/RTCodec.mjs";
85
- import { THEME_CLASSES as ur, THEME_COOKIE_NAME as dr, applyThemeClass as fr, isTheme as pr, readThemeCookie as mr, themeFromCookies as hr, writeThemeCookie as gr } from "./theme/themeCookie.mjs";
86
- import _r, { createThemeState as vr, createThemeStore as yr, resolveScheme as br, setAreaTheme as xr, setMachineScheme as Sr, setThemeMode as Cr, themeFor as wr } from "./theme/themeStore.mjs";
87
- import { useThemeStore as Tr } from "./theme/ThemeScope.mjs";
88
- import Er from "./theme/ThemeProvider.mjs";
89
- import Dr, { SPACE_THEME_AREA as Or } from "./theme/useTheme.mjs";
90
- import kr from "./server/actions/useActionsSync.mjs";
91
- import Ar, { cancelRsc as jr, currentRscLocation as Mr, releaseRscRequests as Nr, rscDataPath as Pr } from "./server/rsc/refreshRsc.mjs";
92
- import Fr from "./server/rsc/useRscRefresh.mjs";
93
- import Ir from "./server/rsc/useRscSync.mjs";
94
- import { PAINTED_STATE_BUDGET as Lr, clearPaintedEntry as Rr, paintedEntryFromCookies as zr, paintedKeys as Br, paintedStateCookieName as Vr, paintedStateFor as Hr, pickPainted as Ur, readPaintedEntry as Wr, writePaintedEntry as Gr } from "./state/paintedState.mjs";
95
- import { runtimeStatePersist as Kr, stateOwner as qr } from "./state/runtimeStatePersist.mjs";
96
- export { Mn as ANCHOR_PATTERN, x as BODYLESS_METHODS, y as BuilderContext, Qn as BuilderMutations, $n as BuilderQueries, In as COMPONENT_PROPS_SOURCE, N as COMPUTED_GLOBALS, S as CONNECTOR_HTTP_METHODS, an as CONTENT_PSEUDOS, mn as CURRENT_SELECTOR, Me as ComponentContext, C as DEFAULT_READ_ENDPOINT, Te as DEV_TOOLS_ATTRIBUTE, St as DISPLAY_MODES, gt as DISPLAY_MODE_MIN_WIDTH, we as DevToolsContext, w as EMPTY_RESPONSE_METHODS, Ln as EMPTY_SCHEMA, ft as EMPTY_STYLE_SCHEMA, hn as EXPANDED_SELECTOR, Ne as FLAG_GATE_PATTERN, Ue as FLAG_LAYERS, Pe as FLAG_NAME_PATTERN, Ft as FontValidationError, on as GENERATED_PSEUDOS, P as GLOBAL_SOURCES, gn as HIDDEN_CLASS, Ee as HIDE_DEV_TOOLS_CSS, ee as INTERVAL_TRIGGER, zt as LAYOUT_GRIDS, m as MAX_PARAM_PASSES, te as MIN_INTERVAL_MS, Yt as MOTION_CONDITIONS, Wn as NetworkContext, Gn as NetworkInternalContext, Lr as PAINTED_STATE_BUDGET, _n as PARENT_ANCESTOR, yt as PLUGIN_CSS_LAYER, sn as PSEUDO_PROPERTIES, oe as ParamsFromURL, ke as PlitziConsole, ot as PlitziServiceContext, st as PlitziServiceProvider, T as READ_ENDPOINT_NAMES, rr as RTCodec, ir as RTEvent, ar as RTEventCloseCode, bt as RUNTIME_CSS_LAYER, Ht as RUNTIME_STYLE_ID, Or as SPACE_THEME_AREA, Xt as STYLE_CONDITION_LABELS, Zt as STYLE_MOTION_CONDITIONS, cn as STYLE_PSEUDOS, ln as STYLE_PSEUDO_LABELS, vn as STYLE_STATES, yn as STYLE_STATE_LABELS, Tt as SYSTEM_FONTS, jn as SchemaContext, tr as SdkMutations, nr as SdkQueries, er as SpaceEventSubscription, Yn as SpaceEvents, pt as StyleBindingsAllowed, lt as StyleVariableCategory, ur as THEME_CLASSES, dr as THEME_COOKIE_NAME, Er as ThemeProvider, Rn as VARIABLE_REGEX, a as VISITOR_NAME, ct as WHILE_RUNNING_MODES, E as WRITE_ENDPOINT_NAMES, Nn as anchorOf, fr as applyThemeClass, t as authFailureFromResponse, Et as availableFonts, mt as baseDefaultValue, jr as cancelRsc, Qt as canonicalCondition, o as checkVisitorRoles, Rr as clearPaintedEntry, Vn as collectServerElements, $t as conditionAtRule, en as conditionLabel, tn as conditionOfAtRule, k as connectorPresets, D as connectorTokens, b as contexts, B as cookieFromHeader, Ae as createStoreDevToolsLogger, vr as createThemeState, yr as createThemeStore, Mr as currentRscLocation, De as debugCookieName, se as delay, Xe as describeChange, $e as diffSchema, et as diffStyle, he as disableReactDevTools, _t as displayModeAt, vt as displayModeWidthRem, V as documentCookies, Kn as elementFromWire, H as elementOf, A as emptyManifest, ce as emptyObject, F as evaluateComputed, ae as evaluateRuleGroup, Lt as fallbackForFamily, Dt as familiesInCss, L as fetchManifest, Ze as fieldChanges, c as filters, zn as findLayoutCycle, We as flagUserFromSSR, Ge as flagValues, Le as flagsCookieName, Ot as fontFamilyStack, wt as fontLinkAssets, kt as fontUrlResolver, Rt as fontsFromCss, At as fontsToHead, Re 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, or as getInstance, ue as getKeyDecoded, de as getPathsFromObeject, ye as getSourceName, jt as googleCss2Url, Mt as googleTextSubsetUrl, Ke as hasConditions, Hn as hasServerElements, f as hasTemplateSyntax, p as hasValidToken, fe as hexToRGB, bn as inCascadeOrder, xt as inPluginLayer, ht as inheritableAttributesBase, g as inspectTemplate, ne as intervalOf, Pn as isAnchor, j as isConnectorManifestDraft, un as isContentValue, re as isDate, Ct as isDisplayMode, U as isElementTarget, Fe as isFlagName, pe as isInViewport, Oe as isInteractionFlow, xn as isKnownState, W as isNodeTarget, Sn as isParentAncestor, sr as isRTEvent, cr as isRTEventCloseCode, e as isRecord, Nt as isSafeFontUrl, Ie as isSchemaFlag, Un as isSnippet, Cn as isStartingState, nn as isStyleCondition, dn as isStylePseudo, Tn as isStyleRules, ut as isStyleVariableCategory, pr as isTheme, ie as isUserEdit, Z as isValidFormat, tt as jsonCopy, Bt as layoutGridCss, Vt as layoutGridLook, I as liveSources, me as makeId, Ut as markStyleCache, Kt as mergeSnippetStyle, G as nodeOf, n as onAuthFailure, je as pConsole, zr as paintedEntryFromCookies, Br as paintedKeys, Vr as paintedStateCookieName, Hr as paintedStateFor, rn as parseContainerCondition, Q as parseDate, ze as parseFlagList, It as parseSpaceFont, qe as passesFlagGate, Ur as pickPainted, Pt as primaryFamily, l as processTwig, u as processTwigParam, d as processTwigValue, fn as pseudoHonours, pn as pseudoSuffix, Wr as readPaintedEntry, mr as readThemeCookie, Ar as refreshRsc, Nr as releaseRscRequests, r as reportAuthFailure, Je as resolveFlags, Bn as resolveLayoutChain, br as resolveScheme, h as resolveStepParam, Se as resolveVariables, Pr as rscDataPath, Kr as runtimeStatePersist, i as sameRegistrableDomain, qt as sameSelector, nt as sameValue, qn as schemaFromWire, Jn as schemaToWire, Jt as selectorsOf, Be as serializeFlagList, xr as setAreaTheme, En as setAtKeys, lr as setInstance, Sr as setMachineScheme, Cr as setThemeMode, Xn as spaceEventSchemas, qr as stateOwner, wn as stateSuffix, Wt as styleCacheFromDocument, Gt as styleCacheTravelsInDocument, dt as styleConstants, Dn as styleTargetKeys, On as styleTargetProblem, kn as styleTargetRules, z as syntaxHighlight, _ as templatePaths, v as templateRootNames, wr as themeFor, hr as themeFromCookies, _r as themeStore, $ as toUnixSeconds, Ye as undeclaredFlagOverrides, Fn as uniqueAnchor, Qe as uniqueLines, kr as useActionsSync, rt as useFontHead, it as useNetwork, at as usePlitziServiceContext, be as useRegisterSource, Ce as useResolvedVariables, Fr as useRscRefresh, Ir as useRscSync, xe as useStableValue, Dr as useTheme, Tr as useThemeStore, ge as utility, _e as utilityOptions, M as validateConnectorManifest, Zn as validateSpaceEvent, An as valueAtKeys, s as visitorAccess, Ve as withForcedFlag, He as writeForcedFlags, Gr as writePaintedEntry, gr as writeThemeCookie };
73
+ import { collectServerElements as Vn, hasServerElements as Hn, notFoundProvider as Un } from "./schema/serverElements.mjs";
74
+ import { isSnippet as Wn } from "./schema/snippet.mjs";
75
+ import Gn from "./network/NetworkContext.mjs";
76
+ import Kn from "./network/NetworkInternalContext.mjs";
77
+ import { elementFromWire as qn, schemaFromWire as Jn, schemaToWire as Yn } from "./schema/wire.mjs";
78
+ import { SpaceEvents as Xn, spaceEventSchemas as Zn, validateSpaceEvent as Qn } from "./network/spaceEvents.mjs";
79
+ import $n from "./network/graphql/builder/Mutations/index.mjs";
80
+ import er from "./network/graphql/builder/Queries/index.mjs";
81
+ import tr from "./network/graphql/builder/Subscriptions/index.mjs";
82
+ import nr from "./network/graphql/sdk/Mutations/index.mjs";
83
+ import rr from "./network/graphql/sdk/Queries/index.mjs";
84
+ import ir, { RTEvent as ar, RTEventCloseCode as or, getInstance as sr, isRTEvent as cr, isRTEventCloseCode as lr, setInstance as ur } from "./websockets/RTCodec.mjs";
85
+ import { THEME_CLASSES as dr, THEME_COOKIE_NAME as fr, applyThemeClass as pr, isTheme as mr, readThemeCookie as hr, themeFromCookies as gr, writeThemeCookie as _r } from "./theme/themeCookie.mjs";
86
+ import vr, { createThemeState as yr, createThemeStore as br, resolveScheme as xr, setAreaTheme as Sr, setMachineScheme as Cr, setThemeMode as wr, themeFor as Tr } from "./theme/themeStore.mjs";
87
+ import { useThemeStore as Er } from "./theme/ThemeScope.mjs";
88
+ import Dr from "./theme/ThemeProvider.mjs";
89
+ import Or, { SPACE_THEME_AREA as kr } from "./theme/useTheme.mjs";
90
+ import Ar from "./server/actions/useActionsSync.mjs";
91
+ import jr, { cancelRsc as Mr, currentRscLocation as Nr, releaseRscRequests as Pr, rscDataPath as Fr } from "./server/rsc/refreshRsc.mjs";
92
+ import Ir from "./server/rsc/useRscRefresh.mjs";
93
+ import Lr from "./server/rsc/useRscSync.mjs";
94
+ import { PAINTED_STATE_BUDGET as Rr, clearPaintedEntry as zr, paintedEntryFromCookies as Br, paintedKeys as Vr, paintedStateCookieName as Hr, paintedStateFor as Ur, pickPainted as Wr, readPaintedEntry as Gr, writePaintedEntry as Kr } from "./state/paintedState.mjs";
95
+ import { runtimeStatePersist as qr, stateOwner as Jr } from "./state/runtimeStatePersist.mjs";
96
+ export { Mn as ANCHOR_PATTERN, x as BODYLESS_METHODS, y as BuilderContext, $n as BuilderMutations, er as BuilderQueries, In as COMPONENT_PROPS_SOURCE, N as COMPUTED_GLOBALS, S as CONNECTOR_HTTP_METHODS, an as CONTENT_PSEUDOS, mn as CURRENT_SELECTOR, Me as ComponentContext, C as DEFAULT_READ_ENDPOINT, Te as DEV_TOOLS_ATTRIBUTE, St as DISPLAY_MODES, gt as DISPLAY_MODE_MIN_WIDTH, we as DevToolsContext, w as EMPTY_RESPONSE_METHODS, Ln as EMPTY_SCHEMA, ft as EMPTY_STYLE_SCHEMA, hn as EXPANDED_SELECTOR, Ne as FLAG_GATE_PATTERN, Ue as FLAG_LAYERS, Pe as FLAG_NAME_PATTERN, Ft as FontValidationError, on as GENERATED_PSEUDOS, P as GLOBAL_SOURCES, gn as HIDDEN_CLASS, Ee as HIDE_DEV_TOOLS_CSS, ee as INTERVAL_TRIGGER, zt as LAYOUT_GRIDS, m as MAX_PARAM_PASSES, te as MIN_INTERVAL_MS, Yt as MOTION_CONDITIONS, Gn as NetworkContext, Kn as NetworkInternalContext, Rr as PAINTED_STATE_BUDGET, _n as PARENT_ANCESTOR, yt as PLUGIN_CSS_LAYER, sn as PSEUDO_PROPERTIES, oe as ParamsFromURL, ke as PlitziConsole, ot as PlitziServiceContext, st as PlitziServiceProvider, T as READ_ENDPOINT_NAMES, ir as RTCodec, ar as RTEvent, or as RTEventCloseCode, bt as RUNTIME_CSS_LAYER, Ht as RUNTIME_STYLE_ID, kr as SPACE_THEME_AREA, Xt as STYLE_CONDITION_LABELS, Zt as STYLE_MOTION_CONDITIONS, cn as STYLE_PSEUDOS, ln as STYLE_PSEUDO_LABELS, vn as STYLE_STATES, yn as STYLE_STATE_LABELS, Tt as SYSTEM_FONTS, jn as SchemaContext, nr as SdkMutations, rr as SdkQueries, tr as SpaceEventSubscription, Xn as SpaceEvents, pt as StyleBindingsAllowed, lt as StyleVariableCategory, dr as THEME_CLASSES, fr as THEME_COOKIE_NAME, Dr as ThemeProvider, Rn as VARIABLE_REGEX, a as VISITOR_NAME, ct as WHILE_RUNNING_MODES, E as WRITE_ENDPOINT_NAMES, Nn as anchorOf, pr as applyThemeClass, t as authFailureFromResponse, Et as availableFonts, mt as baseDefaultValue, Mr as cancelRsc, Qt as canonicalCondition, o as checkVisitorRoles, zr as clearPaintedEntry, Vn as collectServerElements, $t as conditionAtRule, en as conditionLabel, tn as conditionOfAtRule, k as connectorPresets, D as connectorTokens, b as contexts, B as cookieFromHeader, Ae as createStoreDevToolsLogger, yr as createThemeState, br as createThemeStore, Nr as currentRscLocation, De as debugCookieName, se as delay, Xe as describeChange, $e as diffSchema, et as diffStyle, he as disableReactDevTools, _t as displayModeAt, vt as displayModeWidthRem, V as documentCookies, qn as elementFromWire, H as elementOf, A as emptyManifest, ce as emptyObject, F as evaluateComputed, ae as evaluateRuleGroup, Lt as fallbackForFamily, Dt as familiesInCss, L as fetchManifest, Ze as fieldChanges, c as filters, zn as findLayoutCycle, We as flagUserFromSSR, Ge as flagValues, Le as flagsCookieName, Ot as fontFamilyStack, wt as fontLinkAssets, kt as fontUrlResolver, Rt as fontsFromCss, At as fontsToHead, Re 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, sr as getInstance, ue as getKeyDecoded, de as getPathsFromObeject, ye as getSourceName, jt as googleCss2Url, Mt as googleTextSubsetUrl, Ke as hasConditions, Hn as hasServerElements, f as hasTemplateSyntax, p as hasValidToken, fe as hexToRGB, bn as inCascadeOrder, xt as inPluginLayer, ht as inheritableAttributesBase, g as inspectTemplate, ne as intervalOf, Pn as isAnchor, j as isConnectorManifestDraft, un as isContentValue, re as isDate, Ct as isDisplayMode, U as isElementTarget, Fe as isFlagName, pe as isInViewport, Oe as isInteractionFlow, xn as isKnownState, W as isNodeTarget, Sn as isParentAncestor, cr as isRTEvent, lr as isRTEventCloseCode, e as isRecord, Nt as isSafeFontUrl, Ie as isSchemaFlag, Wn as isSnippet, Cn as isStartingState, nn as isStyleCondition, dn as isStylePseudo, Tn as isStyleRules, ut as isStyleVariableCategory, mr as isTheme, ie as isUserEdit, Z as isValidFormat, tt as jsonCopy, Bt as layoutGridCss, Vt as layoutGridLook, I as liveSources, me as makeId, Ut as markStyleCache, Kt as mergeSnippetStyle, G as nodeOf, Un as notFoundProvider, n as onAuthFailure, je as pConsole, Br as paintedEntryFromCookies, Vr as paintedKeys, Hr as paintedStateCookieName, Ur as paintedStateFor, rn as parseContainerCondition, Q as parseDate, ze as parseFlagList, It as parseSpaceFont, qe as passesFlagGate, Wr as pickPainted, Pt as primaryFamily, l as processTwig, u as processTwigParam, d as processTwigValue, fn as pseudoHonours, pn as pseudoSuffix, Gr as readPaintedEntry, hr as readThemeCookie, jr as refreshRsc, Pr as releaseRscRequests, r as reportAuthFailure, Je as resolveFlags, Bn as resolveLayoutChain, xr as resolveScheme, h as resolveStepParam, Se as resolveVariables, Fr as rscDataPath, qr as runtimeStatePersist, i as sameRegistrableDomain, qt as sameSelector, nt as sameValue, Jn as schemaFromWire, Yn as schemaToWire, Jt as selectorsOf, Be as serializeFlagList, Sr as setAreaTheme, En as setAtKeys, ur as setInstance, Cr as setMachineScheme, wr as setThemeMode, Zn as spaceEventSchemas, Jr as stateOwner, wn as stateSuffix, Wt as styleCacheFromDocument, Gt as styleCacheTravelsInDocument, dt as styleConstants, Dn as styleTargetKeys, On as styleTargetProblem, kn as styleTargetRules, z as syntaxHighlight, _ as templatePaths, v as templateRootNames, Tr as themeFor, gr as themeFromCookies, vr as themeStore, $ as toUnixSeconds, Ye as undeclaredFlagOverrides, Fn as uniqueAnchor, Qe as uniqueLines, Ar as useActionsSync, rt as useFontHead, it as useNetwork, at as usePlitziServiceContext, be as useRegisterSource, Ce as useResolvedVariables, Ir as useRscRefresh, Lr as useRscSync, xe as useStableValue, Or as useTheme, Er as useThemeStore, ge as utility, _e as utilityOptions, M as validateConnectorManifest, Qn as validateSpaceEvent, An as valueAtKeys, s as visitorAccess, Ve as withForcedFlag, He as writeForcedFlags, Kr as writePaintedEntry, _r as writeThemeCookie };
@@ -1,4 +1,4 @@
1
1
  export { matchPath } from './matchPath';
2
- export { getPageFullPath, getPaths, isAbsoluteUrl, isPageAuthored, matchRoutePath, getRouteParams, getSlugParams, navigationTarget } from './routes';
2
+ export { getPageFullPath, getPaths, isAbsoluteUrl, isPageAuthored, matchRoutePath, notFoundPageFor, getRouteParams, getSlugParams, navigationTarget, NOT_FOUND_SLUG } from './routes';
3
3
  export type { PathMatch, PathPattern } from './matchPath';
4
4
  export type { NavigationAccessLevel, NavigationAction, Path } from './routes';
@@ -1,3 +1,3 @@
1
1
  import { matchPath as e } from "./matchPath.mjs";
2
- import { getPageFullPath as t, getPaths as n, getRouteParams as r, getSlugParams as i, isAbsoluteUrl as a, isPageAuthored as o, matchRoutePath as s, navigationTarget as c } from "./routes.mjs";
3
- export { t as getPageFullPath, n as getPaths, r as getRouteParams, i as getSlugParams, a as isAbsoluteUrl, o as isPageAuthored, e as matchPath, s as matchRoutePath, c as navigationTarget };
2
+ import { NOT_FOUND_SLUG as t, getPageFullPath as n, getPaths as r, getRouteParams as i, getSlugParams as a, isAbsoluteUrl as o, isPageAuthored as s, matchRoutePath as c, navigationTarget as l, notFoundPageFor as u } from "./routes.mjs";
3
+ export { t as NOT_FOUND_SLUG, n as getPageFullPath, r as getPaths, i as getRouteParams, a as getSlugParams, o as isAbsoluteUrl, s as isPageAuthored, e as matchPath, c as matchRoutePath, l as navigationTarget, u as notFoundPageFor };
@@ -11,6 +11,12 @@ export type Path = {
11
11
  path: string;
12
12
  unauthorizedBehaviour?: NavigationAction;
13
13
  unauthorizedPageRedirect?: string;
14
+ /**
15
+ * A path of the space's "not found" page — a page whose slug is `*`, the page of every address under its folder that
16
+ * no other page answers — sent with status 404. Not every path ending in `*`: `update/*` is a page of its own that
17
+ * answers a whole subtree.
18
+ */
19
+ notFound?: true;
14
20
  };
15
21
  /**
16
22
  * Does this name another origin, rather than somewhere in this space?
@@ -20,6 +26,8 @@ export type Path = {
20
26
  * external would turn a typo into an off-site redirect.
21
27
  */
22
28
  export declare const isAbsoluteUrl: (url: string) => boolean;
29
+ /** The slug of the space's "not found" page: the page of every address under its folder that no other page answers. */
30
+ export declare const NOT_FOUND_SLUG = "*";
23
31
  declare function getPageFullPath(pages: Record<string, Element>, pageFolders: PageFolder[], pageId: string, asString: true): string;
24
32
  declare function getPageFullPath(pages: Record<string, Element>, pageFolders: PageFolder[], pageId: string, asString?: false): Record<string, string>;
25
33
  /**
@@ -31,7 +39,7 @@ declare function getPageFullPath(pages: Record<string, Element>, pageFolders: Pa
31
39
  */
32
40
  declare const navigationTarget: (pages: Record<string, Element>, pageFolders: PageFolder[], target: string) => string;
33
41
  declare const isPageAuthored: (accessLevel?: NavigationAccessLevel, authenticated?: boolean, previewMode?: boolean) => boolean;
34
- declare const getPaths: (pages?: Record<string, Element>, pageFolders?: PageFolder[], authenticated?: boolean, basePath?: string, previewMode?: boolean, strictMode?: boolean) => Path[];
42
+ declare const getPaths: (pages?: Record<string, Element>, pageFolders?: PageFolder[], authenticated?: boolean, basePath?: string, previewMode?: boolean) => Path[];
35
43
  declare const matchRoutePath: (paths: Path[], pathName: string, authenticated: boolean) => {
36
44
  action: {
37
45
  type: "authenticated" | "accessDenied" | "redirect" | "notFound" | "normal";
@@ -40,7 +48,9 @@ declare const matchRoutePath: (paths: Path[], pathName: string, authenticated: b
40
48
  pathMatch?: PathMatch;
41
49
  pageId?: string;
42
50
  };
51
+ /** The space's "not found" page for an address — its deepest folder's, or the space's — when it declares one. */
52
+ declare const notFoundPageFor: (paths: Path[], pathName: string) => string | undefined;
43
53
  declare const getRouteParams: (path: string) => string[];
44
54
  /** The params a page's slug declares, in either spelling a slug accepts: `post/{{slug}}` and `:spaceId/update`. */
45
55
  declare const getSlugParams: (slug: string) => string[];
46
- export { getPageFullPath, getPaths, matchRoutePath, isPageAuthored, getRouteParams, getSlugParams, navigationTarget };
56
+ export { getPageFullPath, getPaths, matchRoutePath, notFoundPageFor, isPageAuthored, getRouteParams, getSlugParams, navigationTarget };
@@ -1,76 +1,63 @@
1
1
  import { matchPath as e } from "./matchPath.mjs";
2
2
  //#region src/navigation/routes.ts
3
- var t = (e) => /^https?:\/\//i.test(e), n = (e) => t(e) || e.includes("{{"), r = (e) => e.replaceAll(/\/+/g, "/"), i = (e) => r(e.replace(/{{([a-zA-Z0-9-_:*/]+)}}/gi, ":$1")), a = (e, t) => {
3
+ var t = (e) => /^https?:\/\//i.test(e), n = "*", r = (e) => t(e) || e.includes("{{"), i = (e) => e.replaceAll(/\/+/g, "/"), a = (e) => i(e.replace(/{{([a-zA-Z0-9-_:*/]+)}}/gi, ":$1")), o = (e, t) => {
4
4
  if (!t || !e[t]) return "";
5
5
  let { slug: n, parentId: r } = e[t];
6
- return r ? `${a(e, r)}/${n}` : n;
6
+ return r ? `${o(e, r)}/${n}` : n;
7
7
  };
8
- function o(e, t, n, o = !1) {
8
+ function s(e, t, n, r = !1) {
9
9
  let s = n.replace(/^\/+/, ""), { slug: c = "", folder: l, default: u } = e[s]?.attributes ?? {
10
10
  slug: s,
11
11
  folder: "",
12
12
  default: !1
13
13
  };
14
- if (u && !o) return {
14
+ if (u && !r) return {
15
15
  "/": n,
16
16
  [`/${n}`]: n
17
17
  };
18
- if (u && o) return "/";
19
- if (!l && !o) return {
20
- [i(`/${c}`)]: n,
21
- [i(`/${n}`)]: n
18
+ if (u && r) return "/";
19
+ if (!l && !r) return {
20
+ [a(`/${c}`)]: n,
21
+ [a(`/${n}`)]: n
22
22
  };
23
- if (!l && o) return r(`/${c}`);
24
- if (!t.find((e) => e.id === l)) return o ? r(`/${c}`) : {
25
- [i(`/${c}`)]: n,
26
- [i(`/${n}`)]: n
23
+ if (!l && r) return i(`/${c}`);
24
+ if (!t.find((e) => e.id === l)) return r ? i(`/${c}`) : {
25
+ [a(`/${c}`)]: n,
26
+ [a(`/${n}`)]: n
27
27
  };
28
- let d = [a(t.reduce((e, t) => ({
28
+ let d = [o(t.reduce((e, t) => ({
29
29
  ...e,
30
30
  [t.id]: t
31
31
  }), {}), l), c].filter(Boolean).join("/");
32
- return o ? r(`/${d}`) : {
33
- [i(`/${d}`)]: n,
34
- [i(`/${n}`)]: n
32
+ return r ? i(`/${d}`) : {
33
+ [a(`/${d}`)]: n,
34
+ [a(`/${n}`)]: n
35
35
  };
36
36
  }
37
- var s = (e, t, n) => {
37
+ var c = (e, t, n) => {
38
38
  let r = n.indexOf("#");
39
- if (r > 0) return `${s(e, t, n.slice(0, r))}${n.slice(r)}`;
39
+ if (r > 0) return `${c(e, t, n.slice(0, r))}${n.slice(r)}`;
40
40
  let i = e[n];
41
41
  if (!i) return n;
42
- let { slug: a, default: c } = i.attributes;
43
- return typeof a == "string" ? o(e, t, n, !0) : c ? "/" : `/${n}`;
44
- }, c = (e, t, n = !0) => !e || !n || t === void 0 || t && e === "authenticated" || !t && e === "public" ? !0 : t && e === "public" ? !1 : !e, l = (e = {}, t = [], r, i = "", a = !0, s = !0) => {
45
- let l = Object.keys(e).reduce((s, l) => {
46
- let { attributes: { accessLevel: u, enabled: d = !0, unauthorizedBehaviour: f } } = e[l], p = e[l].attributes.unauthorizedPageRedirect;
47
- if (!d && a) return s;
48
- p &&= n(p) ? p : o(e, t, p, !0);
49
- let m = o(e, t, l), h = Object.keys(m).map((e) => ({
50
- pageId: l,
51
- path: `${i}${e}`.replaceAll("//", "/"),
52
- accessLevel: u,
53
- enabled: d,
54
- isRaw: `/${l}` === e,
55
- unauthorizedBehaviour: f,
56
- unauthorizedPageRedirect: p,
57
- hasAccess: c(u, r, a)
58
- }));
59
- return [...s, ...h];
60
- }, []).filter((e) => e.path !== "*" || e.hasAccess).sort((e, t) => e.path === t.path ? e.accessLevel === "authenticated" ? -1 : 1 : e.path > t.path ? -1 : 1);
61
- if (!l.find((e) => e.path === "*") && !s) {
62
- let e = l.find((e) => e.path === "/" && e.hasAccess);
63
- e && e.unauthorizedBehaviour === "redirect" && e.unauthorizedPageRedirect && l.push({
64
- ...e,
65
- path: "*",
66
- hasAccess: !1,
67
- isRaw: !0,
68
- unauthorizedBehaviour: "redirect",
69
- unauthorizedPageRedirect: "/"
70
- });
71
- }
72
- return l;
73
- }, u = (t, n, r) => {
42
+ let { slug: a, default: o } = i.attributes;
43
+ return typeof a == "string" ? s(e, t, n, !0) : o ? "/" : `/${n}`;
44
+ }, l = (e, t, n = !0) => !e || !n || t === void 0 || t && e === "authenticated" || !t && e === "public" ? !0 : t && e === "public" ? !1 : !e, u = (e = {}, t = [], n, i = "", a = !0) => Object.keys(e).reduce((o, c) => {
45
+ let { attributes: { accessLevel: u, enabled: d = !0, unauthorizedBehaviour: f } } = e[c], p = e[c].attributes.unauthorizedPageRedirect;
46
+ if (!d && a) return o;
47
+ p &&= r(p) ? p : s(e, t, p, !0);
48
+ let m = s(e, t, c), h = e[c].attributes.slug === "*", g = Object.keys(m).map((e) => ({
49
+ pageId: c,
50
+ path: `${i}${e}`.replaceAll("//", "/"),
51
+ accessLevel: u,
52
+ enabled: d,
53
+ isRaw: `/${c}` === e,
54
+ unauthorizedBehaviour: f,
55
+ unauthorizedPageRedirect: p,
56
+ hasAccess: l(u, n, a),
57
+ ...h ? { notFound: !0 } : {}
58
+ }));
59
+ return [...o, ...g];
60
+ }, []).sort((e, t) => !!e.notFound == !!t.notFound ? e.path === t.path ? e.accessLevel === "authenticated" ? -1 : 1 : e.path > t.path ? -1 : 1 : e.notFound ? 1 : -1), d = (t, n, r) => {
74
61
  if (!n) return {
75
62
  action: {
76
63
  type: "accessDenied",
@@ -90,35 +77,28 @@ var s = (e, t, n) => {
90
77
  pageId: t.pageId
91
78
  });
92
79
  });
93
- let a = i.find(({ path: { accessLevel: e } }) => e === "authenticated" && r || e === "public" && !r || !e);
94
- if (a ||= i.find(({ path: { accessLevel: e } }) => e === "authenticated" && !r || e === "public" && r), !a && t.find((e) => e.path === "/" && e.hasAccess)) return {
95
- action: {
96
- type: "redirect",
97
- path: "/"
98
- },
99
- pathMatch: void 0
100
- };
101
- if (!a) return {
80
+ let a = (e) => e.find(({ path: { accessLevel: e } }) => e === "authenticated" && r || e === "public" && !r || !e) ?? e.find(({ path: { accessLevel: e } }) => e === "authenticated" && !r || e === "public" && r), o = a(i.filter(({ path: e }) => !e.notFound)) ?? a(i.filter(({ path: e }) => e.notFound));
81
+ if (!o) return {
102
82
  action: {
103
83
  type: "notFound",
104
84
  path: void 0
105
85
  },
106
86
  pathMatch: void 0
107
87
  };
108
- let { pageId: o, matchResult: s, path: { hasAccess: c, unauthorizedBehaviour: l, unauthorizedPageRedirect: u } } = a;
109
- return !c && l === "redirect" && u ? {
88
+ let { pageId: s, matchResult: c, path: { hasAccess: l, unauthorizedBehaviour: u, unauthorizedPageRedirect: d, notFound: f } } = o;
89
+ return !l && u === "redirect" && d ? {
110
90
  action: {
111
91
  type: "redirect",
112
- path: u
92
+ path: d
113
93
  },
114
94
  pathMatch: void 0
115
- } : c ? {
95
+ } : l ? {
116
96
  action: {
117
- type: "normal",
97
+ type: f ? "notFound" : "normal",
118
98
  path: void 0
119
99
  },
120
- pathMatch: s,
121
- pageId: o
100
+ pathMatch: c,
101
+ pageId: s
122
102
  } : {
123
103
  action: {
124
104
  type: "accessDenied",
@@ -126,6 +106,9 @@ var s = (e, t, n) => {
126
106
  },
127
107
  pathMatch: void 0
128
108
  };
129
- }, d = (e) => !e || typeof e != "string" ? [] : (e.match(/:[a-zA-Z0-9-_:*]+/gim) || []).map((e) => e.replace(":", "")), f = (e) => d(i(e));
109
+ }, f = (t, n) => t.find((t) => t.hasAccess && t.notFound && e({
110
+ path: t.path,
111
+ end: !0
112
+ }, n))?.pageId, p = (e) => !e || typeof e != "string" ? [] : (e.match(/:[a-zA-Z0-9-_:*]+/gim) || []).map((e) => e.replace(":", "")), m = (e) => p(a(e));
130
113
  //#endregion
131
- export { o as getPageFullPath, l as getPaths, d as getRouteParams, f as getSlugParams, t as isAbsoluteUrl, c as isPageAuthored, u as matchRoutePath, s as navigationTarget };
114
+ export { n as NOT_FOUND_SLUG, s as getPageFullPath, u as getPaths, p as getRouteParams, m as getSlugParams, t as isAbsoluteUrl, l as isPageAuthored, d as matchRoutePath, c as navigationTarget, f as notFoundPageFor };
@@ -2,6 +2,6 @@ import e from "./SchemaContext.mjs";
2
2
  import { ANCHOR_PATTERN as t, anchorOf as n, isAnchor as r, uniqueAnchor as i } from "./anchor.mjs";
3
3
  import { COMPONENT_PROPS_SOURCE as a, EMPTY_SCHEMA as o, VARIABLE_REGEX as s } from "./schemaConstants.mjs";
4
4
  import { findLayoutCycle as c, resolveLayoutChain as l } from "./layoutChain.mjs";
5
- import { collectServerElements as u, hasServerElements as d } from "./serverElements.mjs";
6
- import { isSnippet as f } from "./snippet.mjs";
7
- export { t as ANCHOR_PATTERN, a as COMPONENT_PROPS_SOURCE, o as EMPTY_SCHEMA, e as SchemaContext, s as VARIABLE_REGEX, n as anchorOf, u as collectServerElements, c as findLayoutCycle, d as hasServerElements, r as isAnchor, f as isSnippet, l as resolveLayoutChain, i as uniqueAnchor };
5
+ import { collectServerElements as u, hasServerElements as d, notFoundProvider as f } from "./serverElements.mjs";
6
+ import { isSnippet as p } from "./snippet.mjs";
7
+ export { t as ANCHOR_PATTERN, a as COMPONENT_PROPS_SOURCE, o as EMPTY_SCHEMA, e as SchemaContext, s as VARIABLE_REGEX, n as anchorOf, u as collectServerElements, c as findLayoutCycle, d as hasServerElements, r as isAnchor, p as isSnippet, f as notFoundProvider, l as resolveLayoutChain, i as uniqueAnchor };
@@ -23,3 +23,14 @@ import { Element, Schema } from '../types';
23
23
  export declare const collectServerElements: (schema: Schema, pageId: string | undefined, ids?: string[], flags?: Record<string, boolean>) => Element[];
24
24
  /** Whether anything on this page consumes server data at all — the question both RSC gates actually ask. */
25
25
  export declare const hasServerElements: (schema: Schema, pageId: string | undefined, flags?: Record<string, boolean>) => boolean;
26
+ /**
27
+ * The server provider of a page whose answer says the address shows nothing — its `notFound`, a template against
28
+ * that answer (`{{ source.found == false }}`) — by id; the page is then sent with status 404, rendered as written.
29
+ *
30
+ * Only `true` counts: a template that does not evaluate comes back as its own text, and a typo must leave the page
31
+ * found rather than turn every visit into a 404.
32
+ */
33
+ export declare const notFoundProvider: (elements: Element[], serverData: Record<string, unknown>, navigation: {
34
+ routeParams: Record<string, unknown>;
35
+ queryParams: Record<string, unknown>;
36
+ }) => string | undefined;
@@ -1,20 +1,27 @@
1
- import { passesFlagGate as e } from "../flags/resolveFlags.mjs";
2
- import { resolveLayoutChain as t } from "./layoutChain.mjs";
1
+ import { processTwigValue as e } from "../helpers/twigWrapper/processTwig/processTwig.mjs";
2
+ import { passesFlagGate as t } from "../flags/resolveFlags.mjs";
3
+ import { resolveLayoutChain as n } from "./layoutChain.mjs";
3
4
  //#region src/schema/serverElements.ts
4
- var n = (n, r, i, a) => {
5
+ var r = (e, r, i, a) => {
5
6
  if (r === void 0) return [];
6
- let o = i ? new Set(i) : void 0, s = [], c = /* @__PURE__ */ new Set(), l = n.flat[r], u = (e) => typeof e == "string" ? e : "", d = [r, ...l ? t((e) => n.flat[e], u(l.attributes.layout), u(l.attributes.layoutContainer)).map((e) => e.layout) : []];
7
+ let o = i ? new Set(i) : void 0, s = [], c = /* @__PURE__ */ new Set(), l = e.flat[r], u = (e) => typeof e == "string" ? e : "", d = [r, ...l ? n((t) => e.flat[t], u(l.attributes.layout), u(l.attributes.layoutContainer)).map((e) => e.layout) : []];
7
8
  for (; d.length > 0;) {
8
- let t = d.pop();
9
- if (t === void 0 || c.has(t)) continue;
10
- c.add(t);
11
- let r = n.flat[t];
12
- if (!r || a && !e(r.definition.flag, a)) continue;
9
+ let n = d.pop();
10
+ if (n === void 0 || c.has(n)) continue;
11
+ c.add(n);
12
+ let r = e.flat[n];
13
+ if (!r || a && !t(r.definition.flag, a)) continue;
13
14
  r.definition.runtime === "server" && (!o || o.has(r.id)) && s.push(r);
14
15
  let { items: i } = r.definition;
15
16
  i && d.push(...i);
16
17
  }
17
18
  return s;
18
- }, r = (e, t, r) => n(e, t, void 0, r).length > 0;
19
+ }, i = (e, t, n) => r(e, t, void 0, n).length > 0, a = (t, n, r) => t.find((t) => {
20
+ let i = t.attributes.notFound;
21
+ return typeof i == "string" && i !== "" && Object.hasOwn(n, t.id) && e(i, {
22
+ source: n[t.id],
23
+ navigation: r
24
+ }) === !0;
25
+ })?.id;
19
26
  //#endregion
20
- export { n as collectServerElements, r as hasServerElements };
27
+ export { r as collectServerElements, i as hasServerElements, a as notFoundProvider };
@@ -178,6 +178,8 @@ declare const styleConstants: {
178
178
  readonly TEXT_INDENT: "text-indent";
179
179
  readonly TEXT_TRANSFORM: "text-transform";
180
180
  readonly DIRECTION: "direction";
181
+ readonly WRITING_MODE: "writing-mode";
182
+ readonly TEXT_ORIENTATION: "text-orientation";
181
183
  readonly WHITE_SPACE: "white-space";
182
184
  readonly TEXT_WRAP: "text-wrap";
183
185
  readonly WORD_BREAK: "word-break";
@@ -199,8 +201,8 @@ declare const styleConstants: {
199
201
  };
200
202
  export declare const inheritableAttributesBase: StyleCategory[];
201
203
  export declare const StyleBindingsAllowed: {
202
- 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" | "content" | "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";
203
- 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" | "content" | "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";
204
+ 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" | "content" | "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" | "writing-mode" | "text-orientation" | "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";
205
+ 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" | "content" | "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" | "writing-mode" | "text-orientation" | "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";
204
206
  }[];
205
207
  export declare const baseDefaultValue: Record<StyleCategory, StyleValue>;
206
208
  export default styleConstants;
@@ -191,6 +191,8 @@ var e = {
191
191
  TEXT_INDENT: "text-indent",
192
192
  TEXT_TRANSFORM: "text-transform",
193
193
  DIRECTION: "direction",
194
+ WRITING_MODE: "writing-mode",
195
+ TEXT_ORIENTATION: "text-orientation",
194
196
  WHITE_SPACE: "white-space",
195
197
  TEXT_WRAP: "text-wrap",
196
198
  WORD_BREAK: "word-break",
@@ -413,6 +415,8 @@ var e = {
413
415
  [t.TEXT_INDENT]: "0px",
414
416
  [t.TEXT_TRANSFORM]: "none",
415
417
  [t.DIRECTION]: "ltr",
418
+ [t.WRITING_MODE]: "horizontal-tb",
419
+ [t.TEXT_ORIENTATION]: "mixed",
416
420
  [t.WHITE_SPACE]: "normal",
417
421
  [t.TEXT_WRAP]: "wrap",
418
422
  [t.WORD_BREAK]: "normal",
@@ -772,8 +772,9 @@ export type SSRCompressionConfig = {
772
772
  /** Responses smaller than this many bytes go out uncompressed. Default 1024. */
773
773
  threshold?: number;
774
774
  /**
775
- * Brotli quality, 0–11, for a body compressed on every request — a page rendered for this request alone. Default 2:
776
- * measured on a quarter core, going to 4 cost a tenth of the pages a second to save half a kilobyte on each.
775
+ * Brotli quality, 0–11, for a body compressed on every request — a page rendered for this request alone. Default 5:
776
+ * the first quality under gzip's size for the CPU gzip spends — 2 came out larger than gzip on a 220 KB page (36 KB
777
+ * against 31; 5: 29). On half a core it costs ~0.1 ms a page, 5–8% of the pages a second of a 6 KB page.
777
778
  */
778
779
  brotliQuality?: number;
779
780
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plitzi/sdk-shared",
3
- "version": "0.38.8",
3
+ "version": "0.38.9",
4
4
  "license": "AGPL-3.0",
5
5
  "files": [
6
6
  "dist",