@grahlnn/comps 0.1.1 → 0.1.3

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/dist/index.js CHANGED
@@ -2355,7 +2355,13 @@ function hasUnsupportedPretextMorphFeatures(text, layoutContext) {
2355
2355
  return false;
2356
2356
  }
2357
2357
  function shouldProbePretextMorph(text, layoutContext) {
2358
- return PROBE_COMPLEX_WHITESPACE_RE.test(text) || PROBE_SYSTEM_UI_RE.test(layoutContext.font);
2358
+ if (layoutContext.whiteSpace !== "nowrap") {
2359
+ return true;
2360
+ }
2361
+ if (PROBE_COMPLEX_WHITESPACE_RE.test(text)) {
2362
+ return true;
2363
+ }
2364
+ return PROBE_SYSTEM_UI_RE.test(layoutContext.font);
2359
2365
  }
2360
2366
  function getPretextMorphRenderedText(text, layoutContext) {
2361
2367
  if (layoutContext === null) {
@@ -2383,6 +2389,24 @@ function getPretextMorphStyleSignature(layoutContext) {
2383
2389
  engineProfile.preferEarlySoftHyphenBreak ? "1" : "0"
2384
2390
  ].join("\x00");
2385
2391
  }
2392
+ function getPretextMorphTrustSignature({
2393
+ renderText,
2394
+ layoutContext,
2395
+ useContentInlineSize
2396
+ }) {
2397
+ if (layoutContext === null) {
2398
+ return null;
2399
+ }
2400
+ const styleSignature = getPretextMorphStyleSignature(layoutContext);
2401
+ if (styleSignature === null) {
2402
+ return null;
2403
+ }
2404
+ let inlineSizeSignature = layoutContext.width.toFixed(2);
2405
+ if (useContentInlineSize) {
2406
+ inlineSizeSignature = "content";
2407
+ }
2408
+ return [styleSignature, inlineSizeSignature, renderText].join("\x00");
2409
+ }
2386
2410
  function getPretextMorphMeasurementBackend(text, layoutContext) {
2387
2411
  if (layoutContext === null) {
2388
2412
  return "dom";
@@ -2499,6 +2523,7 @@ var MORPH = {
2499
2523
  maxFadeMs: 150,
2500
2524
  ease: "cubic-bezier(0.22, 1, 0.36, 1)",
2501
2525
  geometryEpsilon: 0.5,
2526
+ contentWidthLockEpsilon: 2,
2502
2527
  lineGroupingEpsilon: 1
2503
2528
  };
2504
2529
  var MORPH_SEGMENT_CACHE_LIMIT = 256;
@@ -3043,12 +3068,16 @@ function readRootOrigin(node) {
3043
3068
  const rect = node.getBoundingClientRect();
3044
3069
  return { left: rect.left, top: rect.top };
3045
3070
  }
3046
- function getTrustedPretextMeasurementBackend(text, layoutContext) {
3071
+ function getTrustedPretextMeasurementBackend(text, renderText, layoutContext, useContentInlineSize) {
3047
3072
  const backend = getPretextMorphMeasurementBackend(text, layoutContext);
3048
3073
  if (backend !== "probe") {
3049
3074
  return backend;
3050
3075
  }
3051
- const signature = getPretextMorphStyleSignature(layoutContext);
3076
+ const signature = getPretextMorphTrustSignature({
3077
+ renderText,
3078
+ layoutContext,
3079
+ useContentInlineSize
3080
+ });
3052
3081
  if (signature === null) {
3053
3082
  return "dom";
3054
3083
  }
@@ -3071,7 +3100,7 @@ function shouldMeasureUsingContentInlineSize(layoutContext, layoutHint) {
3071
3100
  if (layoutHint === null || !isSingleLineSnapshot(layoutHint.snapshot)) {
3072
3101
  return false;
3073
3102
  }
3074
- return nearlyEqual(layoutHint.layoutInlineSize, layoutHint.snapshot.width);
3103
+ return nearlyEqual(layoutHint.layoutInlineSize, layoutHint.snapshot.width, MORPH.contentWidthLockEpsilon);
3075
3104
  }
3076
3105
  function createMorphMeasurementRequest({
3077
3106
  text,
@@ -3083,7 +3112,7 @@ function createMorphMeasurementRequest({
3083
3112
  }
3084
3113
  const renderText = getPretextMorphRenderedText(text, layoutContext);
3085
3114
  const useContentInlineSize = shouldMeasureUsingContentInlineSize(layoutContext, layoutHint);
3086
- const measurementBackend = getTrustedPretextMeasurementBackend(text, layoutContext);
3115
+ const measurementBackend = getTrustedPretextMeasurementBackend(text, renderText, layoutContext, useContentInlineSize);
3087
3116
  let segments = readCachedMorphSegments(renderText);
3088
3117
  if (measurementBackend === "pretext") {
3089
3118
  segments = EMPTY_SEGMENTS;
@@ -3101,8 +3130,17 @@ function createMorphMeasurementRequest({
3101
3130
  domMeasurementKey
3102
3131
  };
3103
3132
  }
3104
- function rememberPretextMeasurementTrust(layoutContext, trusted) {
3105
- const signature = getPretextMorphStyleSignature(layoutContext);
3133
+ function rememberPretextMeasurementTrust({
3134
+ renderText,
3135
+ layoutContext,
3136
+ useContentInlineSize,
3137
+ trusted
3138
+ }) {
3139
+ const signature = getPretextMorphTrustSignature({
3140
+ renderText,
3141
+ layoutContext,
3142
+ useContentInlineSize
3143
+ });
3106
3144
  if (signature === null) {
3107
3145
  return;
3108
3146
  }
@@ -3166,7 +3204,12 @@ function measureFromNodes({
3166
3204
  }
3167
3205
  if (measurementBackend === "probe" && pretextSnapshot !== null && domSnapshot !== null) {
3168
3206
  const trusted = areSnapshotsEquivalentForPretextTrust(pretextSnapshot, domSnapshot);
3169
- rememberPretextMeasurementTrust(layoutContext, trusted);
3207
+ rememberPretextMeasurementTrust({
3208
+ renderText,
3209
+ layoutContext,
3210
+ useContentInlineSize,
3211
+ trusted
3212
+ });
3170
3213
  if (trusted) {
3171
3214
  return pretextSnapshot;
3172
3215
  }
@@ -3381,10 +3424,18 @@ function resetMorph(session, timeline, setState) {
3381
3424
  setState(EMPTY_STATE);
3382
3425
  }
3383
3426
  function commitStaticMeasurement(session, measurement, setState) {
3427
+ if (!session.animating && session.target === null && session.committed !== null && sameMeasurement(session.committed, measurement)) {
3428
+ return;
3429
+ }
3384
3430
  session.committed = measurement;
3385
3431
  session.target = null;
3386
3432
  session.animating = false;
3387
- setState(createStaticState(measurement));
3433
+ setState((current) => {
3434
+ if (current.stage === "idle" && current.plan === null && current.measurement !== null && sameMeasurement(current.measurement, measurement)) {
3435
+ return current;
3436
+ }
3437
+ return createStaticState(measurement);
3438
+ });
3388
3439
  }
3389
3440
  function scheduleMorphTimeline({
3390
3441
  session,
@@ -32,6 +32,11 @@ export type PretextMorphSnapshot = {
32
32
  export declare function clearPretextMorphCaches(): void;
33
33
  export declare function getPretextMorphRenderedText(text: string, layoutContext: Pick<PretextMorphLayoutContext, "whiteSpace"> | null): string;
34
34
  export declare function getPretextMorphStyleSignature(layoutContext: PretextMorphLayoutContext | null): string | null;
35
+ export declare function getPretextMorphTrustSignature({ renderText, layoutContext, useContentInlineSize, }: {
36
+ renderText: string;
37
+ layoutContext: PretextMorphLayoutContext | null;
38
+ useContentInlineSize: boolean;
39
+ }): string | null;
35
40
  export declare function getPretextMorphMeasurementBackend(text: string, layoutContext: PretextMorphLayoutContext | null): PretextMorphMeasurementBackend;
36
41
  export declare function canUsePretextMorphFastPath(text: string, layoutContext: PretextMorphLayoutContext | null): boolean;
37
42
  export declare function measureMorphSnapshotWithPretext(text: string, layoutContext: PretextMorphLayoutContext): PretextMorphSnapshot;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grahlnn/comps",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "React components from grahlnn/comps.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",