@heyramzi/ui 2.11.0 → 2.11.2

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.
Files changed (267) hide show
  1. package/dist/agents/helpers.js +38 -38
  2. package/dist/agents/page-state.js +49 -50
  3. package/dist/agents/vendor/color.js +146 -127
  4. package/dist/agents/vendor/draw.js +617 -508
  5. package/dist/agents/vendor/engine.js +698 -599
  6. package/dist/agents/vendor/mesh.js +653 -683
  7. package/dist/agents/vendor/plastic.js +3913 -3112
  8. package/dist/agents/vendor/presets.js +163 -164
  9. package/dist/agents/vendor/shapes.js +21 -20
  10. package/dist/agents/vendor/ticker.js +41 -42
  11. package/dist/agents/vendor/types.js +1 -0
  12. package/dist/agents/vendor/wear.js +1421 -1448
  13. package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
  14. package/dist/ai/confirmation/index.js +3 -1
  15. package/dist/ai/index.js +33 -0
  16. package/dist/ai/prompt-input/index.js +3 -1
  17. package/dist/ai/reasoning/index.js +3 -1
  18. package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
  19. package/dist/ai/suggestion/index.js +3 -1
  20. package/dist/ai/typing-dots/index.js +3 -1
  21. package/dist/animations/text-swap.js +24 -24
  22. package/dist/brand/index.js +54 -48
  23. package/dist/canvas/card/resize.js +5 -3
  24. package/dist/canvas/edges/edge-path.js +255 -242
  25. package/dist/canvas/editor/context-menu.js +39 -36
  26. package/dist/canvas/editor/dispatch.svelte.js +154 -151
  27. package/dist/canvas/editor/editor-context.js +7 -2
  28. package/dist/canvas/editor/editor-mode.js +1 -0
  29. package/dist/canvas/editor/frame.js +73 -76
  30. package/dist/canvas/editor/hand-context.js +5 -2
  31. package/dist/canvas/editor/history-core.js +163 -191
  32. package/dist/canvas/editor/keymap.js +95 -169
  33. package/dist/canvas/editor/layout-actions.js +143 -144
  34. package/dist/canvas/editor/lock.js +52 -51
  35. package/dist/canvas/editor/rebase.js +217 -240
  36. package/dist/canvas/editor/style.js +132 -137
  37. package/dist/canvas/editor/text-field-context.js +7 -2
  38. package/dist/canvas/editor/z-order.js +65 -70
  39. package/dist/canvas/headless/alignment.js +22 -16
  40. package/dist/canvas/headless/break-apart-find.js +286 -279
  41. package/dist/canvas/headless/break-apart-pieces.js +62 -58
  42. package/dist/canvas/headless/break-apart-plan.js +299 -325
  43. package/dist/canvas/headless/break-apart-style.js +75 -70
  44. package/dist/canvas/headless/break-apart.js +188 -181
  45. package/dist/canvas/headless/canvas-cleanup.js +78 -58
  46. package/dist/canvas/headless/edge-anchors.js +115 -116
  47. package/dist/canvas/headless/edge-memo.js +24 -22
  48. package/dist/canvas/headless/edge-serialization.js +17 -27
  49. package/dist/canvas/headless/figure-geometry.js +232 -264
  50. package/dist/canvas/headless/fit-viewport.js +84 -67
  51. package/dist/canvas/headless/grid.js +88 -86
  52. package/dist/canvas/headless/icon-node.js +44 -36
  53. package/dist/canvas/headless/index.js +1 -0
  54. package/dist/canvas/headless/linkify.js +17 -19
  55. package/dist/canvas/headless/pen-marks.js +101 -95
  56. package/dist/canvas/headless/sketch.js +231 -209
  57. package/dist/canvas/headless/snap-guides.js +99 -83
  58. package/dist/canvas/headless/svg-figure.js +133 -117
  59. package/dist/canvas/headless/table-layout.js +146 -107
  60. package/dist/canvas/index.js +2 -0
  61. package/dist/canvas/lod/lod-mode.svelte.js +20 -18
  62. package/dist/canvas/lod/render-all.svelte.js +36 -39
  63. package/dist/canvas/ops/arrange.js +78 -71
  64. package/dist/canvas/ops/ops.js +260 -255
  65. package/dist/canvas/pen/colors.js +37 -35
  66. package/dist/canvas/pen/eraser.js +28 -27
  67. package/dist/canvas/pen/geometry.js +120 -130
  68. package/dist/canvas/pen/index.js +1 -0
  69. package/dist/canvas/pen/ops.js +11 -11
  70. package/dist/canvas/pen/pen-session.js +150 -159
  71. package/dist/canvas/pen/plugin.js +107 -104
  72. package/dist/canvas/pen/shapes.js +73 -68
  73. package/dist/canvas/pen/stroke-path.js +32 -30
  74. package/dist/canvas/pen/types.js +21 -21
  75. package/dist/canvas/pen/ui.js +10 -8
  76. package/dist/canvas/plugin.js +46 -46
  77. package/dist/canvas/screen/glyphs.js +12 -11
  78. package/dist/canvas/screen/labels.js +22 -22
  79. package/dist/canvas/screen/parts.js +98 -111
  80. package/dist/canvas/screen/plugin.js +47 -56
  81. package/dist/canvas/screen/types.js +30 -35
  82. package/dist/canvas/screen/ui.js +7 -7
  83. package/dist/canvas/test-utils.js +14 -14
  84. package/dist/canvas/types.js +1 -0
  85. package/dist/canvas/ui/forward-wheel.js +24 -25
  86. package/dist/canvas/ui/icons.js +64 -131
  87. package/dist/canvas/ui/place-panel.js +58 -49
  88. package/dist/canvas/ui/shortcut-tip.js +14 -12
  89. package/dist/canvas/ui/tools.js +300 -385
  90. package/dist/charts/dashboard/chart.js +4 -0
  91. package/dist/charts/dashboard/data-table.js +11 -0
  92. package/dist/charts/dashboard/windows.js +8 -3
  93. package/dist/charts/edge-fade.js +10 -5
  94. package/dist/charts/hover-band.js +16 -11
  95. package/dist/charts/index.js +0 -1
  96. package/dist/charts/motion.js +11 -7
  97. package/dist/charts/primitives/chart-utils.js +12 -12
  98. package/dist/components/copy/clipboard.js +32 -32
  99. package/dist/components/copy/copied.svelte.js +31 -23
  100. package/dist/components/data-table/data-table.js +39 -39
  101. package/dist/components/docs/index.js +4 -0
  102. package/dist/components/docs/scroll-spy.svelte.js +73 -68
  103. package/dist/components/list-page/filter-section.js +4 -1
  104. package/dist/components/list-page/index.js +2 -0
  105. package/dist/components/list-page/list-table.js +7 -2
  106. package/dist/components/list-page/queue-rail.js +14 -0
  107. package/dist/components/list-page/section-host.js +4 -2
  108. package/dist/components/list-page/step.js +4 -3
  109. package/dist/components/list-page/types.js +1 -0
  110. package/dist/components/picker/trigger.js +48 -30
  111. package/dist/components/picker/types.js +1 -0
  112. package/dist/components/segmented/collapse.js +38 -27
  113. package/dist/components/segmented/index.js +8 -0
  114. package/dist/components/segmented/segmented.js +67 -42
  115. package/dist/components/star-rating-input/index.js +3 -1
  116. package/dist/components/table-view/types.js +1 -0
  117. package/dist/components/tags-input/tags.js +81 -69
  118. package/dist/components/theme/index.js +4 -0
  119. package/dist/components/toolbar/index.js +4 -0
  120. package/dist/components/toolbar/toolbar-trigger.js +14 -1
  121. package/dist/editor/anchors.js +17 -13
  122. package/dist/editor/block-id.js +52 -51
  123. package/dist/editor/block-ops.js +108 -80
  124. package/dist/editor/doc-blocks.js +155 -166
  125. package/dist/editor/extensions.js +139 -180
  126. package/dist/editor/index.js +4 -0
  127. package/dist/editor/markdown-test-helpers.js +4 -2
  128. package/dist/editor/markdown.js +420 -408
  129. package/dist/editor/serializer.js +204 -200
  130. package/dist/editor/slash-items.js +89 -101
  131. package/dist/editor/youtube-url.js +25 -20
  132. package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
  133. package/dist/effects/animated-beam/types.js +1 -0
  134. package/dist/effects/border-beam/css.js +92 -78
  135. package/dist/effects/border-beam/presets.js +1705 -1720
  136. package/dist/effects/border-beam/register-properties.js +43 -33
  137. package/dist/effects/border-beam/types.js +1 -0
  138. package/dist/effects/image-comparison/compare.js +3 -2
  139. package/dist/effects/image-reveal/types.js +1 -0
  140. package/dist/effects/magnetic/magnetic.js +58 -52
  141. package/dist/effects/reveal/observe.js +50 -40
  142. package/dist/effects/reveal/types.js +1 -0
  143. package/dist/effects/shader-gradient/color.js +36 -29
  144. package/dist/effects/shader-gradient/renderer.js +384 -295
  145. package/dist/effects/shader-gradient/shaders.js +31 -0
  146. package/dist/effects/shader-gradient/types.js +1 -0
  147. package/dist/icons/apple-symbol-exports.js +99 -124
  148. package/dist/icons/sf-symbols.js +357 -461
  149. package/dist/icons/trades.js +43 -28
  150. package/dist/inbox/index.js +1 -0
  151. package/dist/inbox/logic.js +126 -122
  152. package/dist/inbox/types.js +43 -43
  153. package/dist/lib/arrive.js +19 -12
  154. package/dist/lib/icon-types.js +1 -0
  155. package/dist/lib/initials.js +16 -10
  156. package/dist/lib/layout.js +5 -0
  157. package/dist/lib/panel.js +13 -0
  158. package/dist/lib/result.js +22 -22
  159. package/dist/lib/sliding-pill.js +59 -44
  160. package/dist/lib/theme-transition.js +43 -43
  161. package/dist/lib/tone.js +31 -24
  162. package/dist/lib/utils.js +3 -1
  163. package/dist/onboarding/define-tours.js +24 -23
  164. package/dist/onboarding/onboarding.svelte.js +16 -12
  165. package/dist/onboarding/pick.js +10 -6
  166. package/dist/onboarding/stores.js +40 -41
  167. package/dist/onboarding/wait.js +24 -23
  168. package/dist/panel/side-panel-types.js +1 -0
  169. package/dist/record/demo-data.js +459 -486
  170. package/dist/record/fields.js +129 -131
  171. package/dist/record/format.js +70 -82
  172. package/dist/record/gutter.js +1 -0
  173. package/dist/record/kinds.js +95 -105
  174. package/dist/record/logic.js +238 -219
  175. package/dist/record/types.js +49 -48
  176. package/dist/shadcn/accordion/index.js +3 -1
  177. package/dist/shadcn/alert/index.js +3 -1
  178. package/dist/shadcn/alert-dialog/index.js +3 -1
  179. package/dist/shadcn/attachment/index.js +3 -1
  180. package/dist/shadcn/avatar/index.js +3 -1
  181. package/dist/shadcn/breadcrumb/index.js +3 -1
  182. package/dist/shadcn/bubble/index.js +3 -1
  183. package/dist/shadcn/button/index.js +3 -1
  184. package/dist/shadcn/calendar/index.js +3 -1
  185. package/dist/shadcn/card/index.js +3 -1
  186. package/dist/shadcn/checkbox/index.js +3 -1
  187. package/dist/shadcn/code-block/index.js +3 -1
  188. package/dist/shadcn/collapsible/index.js +3 -1
  189. package/dist/shadcn/command/index.js +4 -1
  190. package/dist/shadcn/context-menu/index.js +3 -1
  191. package/dist/shadcn/dialog/index.js +3 -1
  192. package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
  193. package/dist/shadcn/empty/index.js +3 -1
  194. package/dist/shadcn/field/index.js +3 -1
  195. package/dist/shadcn/hooks/highlighter.js +77 -75
  196. package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
  197. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
  198. package/dist/shadcn/input/index.js +3 -1
  199. package/dist/shadcn/kbd/index.js +3 -1
  200. package/dist/shadcn/label/index.js +3 -1
  201. package/dist/shadcn/marker/index.js +3 -1
  202. package/dist/shadcn/message/index.js +3 -1
  203. package/dist/shadcn/message-scroller/index.js +3 -1
  204. package/dist/shadcn/popover/index.js +3 -1
  205. package/dist/shadcn/progress/index.js +3 -1
  206. package/dist/shadcn/progress/tone.js +8 -7
  207. package/dist/shadcn/radio-group/index.js +3 -1
  208. package/dist/shadcn/scroll-area/index.js +3 -1
  209. package/dist/shadcn/select/index.js +3 -1
  210. package/dist/shadcn/separator/index.js +3 -1
  211. package/dist/shadcn/sheet/index.js +3 -1
  212. package/dist/shadcn/sidebar/context.svelte.js +42 -28
  213. package/dist/shadcn/sidebar/index.js +3 -1
  214. package/dist/shadcn/skeleton/index.js +3 -1
  215. package/dist/shadcn/slider/index.js +3 -1
  216. package/dist/shadcn/switch/index.js +3 -1
  217. package/dist/shadcn/table/index.js +3 -1
  218. package/dist/shadcn/tabs/index.js +3 -1
  219. package/dist/shadcn/textarea/index.js +3 -1
  220. package/dist/shadcn/toggle/index.js +3 -1
  221. package/dist/shadcn/toggle-group/index.js +3 -1
  222. package/dist/shadcn/tooltip/context.js +7 -2
  223. package/dist/shadcn/tooltip/index.js +3 -1
  224. package/dist/shadcn/trace/index.js +3 -1
  225. package/dist/slides/bridges.js +65 -59
  226. package/dist/slides/deck-controller.svelte.js +210 -207
  227. package/dist/slides/export/capture.js +66 -71
  228. package/dist/slides/export/ffmpeg.js +76 -72
  229. package/dist/slides/export/index.js +3 -0
  230. package/dist/slides/export/launch.js +9 -6
  231. package/dist/slides/export/pdf.js +60 -54
  232. package/dist/slides/export/types.js +1 -0
  233. package/dist/slides/labels.js +24 -24
  234. package/dist/slides/layout.js +39 -41
  235. package/dist/slides/model.js +9 -7
  236. package/dist/slides/navigation.js +78 -73
  237. package/dist/slides/types.js +2 -2
  238. package/dist/status/define-statuses.js +18 -14
  239. package/dist/status/status-types.js +1 -0
  240. package/dist/test-setup.js +24 -20
  241. package/dist/thread/logic.js +73 -77
  242. package/dist/thread/types.js +21 -21
  243. package/dist/work/board-order.js +94 -90
  244. package/dist/work/dates.js +16 -9
  245. package/dist/work/detail/detail-types.js +18 -18
  246. package/dist/work/docs/edited.js +32 -29
  247. package/dist/work/docs/index.js +4 -0
  248. package/dist/work/docs/labels.js +34 -34
  249. package/dist/work/docs/menu.js +113 -106
  250. package/dist/work/docs/outline.js +39 -29
  251. package/dist/work/gantt/logic.js +211 -235
  252. package/dist/work/inbox/inbox-logic.js +71 -75
  253. package/dist/work/inbox/inbox-statuses.js +75 -72
  254. package/dist/work/inbox/inbox-types.js +1 -0
  255. package/dist/work/kanban-drag.js +27 -22
  256. package/dist/work/kanban-types.js +1 -0
  257. package/dist/work/presets/sales.js +36 -32
  258. package/dist/work/reorder.js +9 -8
  259. package/dist/work/task-types.js +1 -0
  260. package/dist/work/time/duration.js +51 -46
  261. package/dist/work/time/time-types.js +23 -23
  262. package/dist/work/use-kanban-dnd.svelte.js +126 -125
  263. package/package.json +3 -1
  264. package/src/components/list-page/master-detail.svelte +3 -1
  265. package/src/components/list-page/rail-row.svelte +4 -4
  266. package/src/components/tags-input/tags-input.svelte +2 -0
  267. package/src/editor/markdown.ts +30 -35
@@ -1,39 +1,49 @@
1
+ /**
2
+ * WHY this exists at all, when generateCss already emits the same @property rules: Chrome ignores an @property rule that sits inside a shadow root,
3
+ */
4
+ /*
5
+ * so a beam rendered in one has no registration.
6
+ */
7
+ /*
8
+ * Unregistered, the angle cannot be interpolated and, worse, every mask that reads it is invalid at computed-value time, which resolves the mask to none and floods the whole element instead
9
+ */
10
+ /*
11
+ * of drawing a border. This call registers on the document, which is why the ids are unique per instance.
12
+ */
1
13
  export function registerBorderBeamProperties(id, size) {
2
- const registry = globalThis.CSS;
3
- if (typeof registry?.registerProperty !== "function") return;
4
- for (const registration of getBorderBeamPropertyRegistrations(id, size)){
5
- try {
6
- registry.registerProperty?.(registration);
7
- } catch {}
8
- }
14
+ const registry = globalThis.CSS;
15
+ if (typeof registry?.registerProperty !== "function") return;
16
+ for (const registration of getBorderBeamPropertyRegistrations(id, size)) {
17
+ // A second register of the same name throws. The first one already holds, so there is nothing to do.
18
+ try {
19
+ registry.registerProperty?.(registration);
20
+ } catch {}
21
+ }
9
22
  }
10
23
  function getBorderBeamPropertyRegistrations(id, size) {
11
- if (size === "line") {
12
- return [
13
- numberProperty(`--beam-x-${id}`, "0"),
14
- numberProperty(`--beam-w-${id}`, "1"),
15
- numberProperty(`--beam-h-${id}`, "1"),
16
- numberProperty(`--beam-spike-${id}`, "1"),
17
- numberProperty(`--beam-spike2-${id}`, "1"),
18
- numberProperty(`--beam-edge-${id}`, "1"),
19
- numberProperty(`--beam-opacity-${id}`, "0")
20
- ];
21
- }
22
- return [
23
- {
24
- name: `--beam-angle-${id}`,
25
- syntax: "<angle>",
26
- initialValue: "0deg",
27
- inherits: true
28
- },
29
- numberProperty(`--beam-opacity-${id}`, "0")
30
- ];
24
+ if (size === "line") {
25
+ return [
26
+ numberProperty(`--beam-x-${id}`, "0"),
27
+ numberProperty(`--beam-w-${id}`, "1"),
28
+ numberProperty(`--beam-h-${id}`, "1"),
29
+ numberProperty(`--beam-spike-${id}`, "1"),
30
+ numberProperty(`--beam-spike2-${id}`, "1"),
31
+ numberProperty(`--beam-edge-${id}`, "1"),
32
+ numberProperty(`--beam-opacity-${id}`, "0")
33
+ ];
34
+ }
35
+ return [{
36
+ name: `--beam-angle-${id}`,
37
+ syntax: "<angle>",
38
+ initialValue: "0deg",
39
+ inherits: true
40
+ }, numberProperty(`--beam-opacity-${id}`, "0")];
31
41
  }
32
42
  function numberProperty(name, initialValue) {
33
- return {
34
- name,
35
- syntax: "<number>",
36
- initialValue,
37
- inherits: true
38
- };
43
+ return {
44
+ name,
45
+ syntax: "<number>",
46
+ initialValue,
47
+ inherits: true
48
+ };
39
49
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,5 @@
1
+ /** Where the handle sits for a pointer at `clientX`, as a 0-100 percentage of the frame. */
1
2
  export function positionAt(clientX, left, width) {
2
- if (width <= 0) return 50;
3
- return Math.min(Math.max((clientX - left) / width * 100, 0), 100);
3
+ if (width <= 0) return 50;
4
+ return Math.min(Math.max((clientX - left) / width * 100, 0), 100);
4
5
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,54 +1,60 @@
1
1
  const EASE = "cubic-bezier(0.22, 1, 0.36, 1)";
2
- export const magnetic = (node, options)=>{
3
- let intensity = options?.intensity ?? 0.6;
4
- let range = options?.range ?? 100;
5
- let from = options?.from ?? "self";
6
- let duration = options?.duration ?? 350;
7
- let armed = false;
8
- const reduced = window.matchMedia("(prefers-reduced-motion: reduce)");
9
- const zone = ()=>from === "parent" ? node.parentElement ?? node : node;
10
- const reset = ()=>{
11
- node.style.transition = `translate ${duration}ms ${EASE}`;
12
- node.style.translate = "0px 0px";
13
- };
14
- const onMove = (event)=>{
15
- if (!armed || reduced.matches) return;
16
- const rect = node.getBoundingClientRect();
17
- const dx = event.clientX - (rect.left + rect.width / 2);
18
- const dy = event.clientY - (rect.top + rect.height / 2);
19
- const distance = Math.hypot(dx, dy);
20
- if (distance > range) return reset();
21
- const falloff = intensity * (1 - distance / range);
22
- node.style.transition = "translate 0ms";
23
- node.style.translate = `${dx * falloff}px ${dy * falloff}px`;
24
- };
25
- const arm = ()=>armed = true;
26
- const disarm = ()=>{
27
- armed = false;
28
- reset();
29
- };
30
- let target = zone();
31
- target.addEventListener("pointerenter", arm);
32
- target.addEventListener("pointerleave", disarm);
33
- document.addEventListener("pointermove", onMove);
34
- return {
35
- update (next) {
36
- intensity = next?.intensity ?? 0.6;
37
- range = next?.range ?? 100;
38
- duration = next?.duration ?? 350;
39
- const nextFrom = next?.from ?? "self";
40
- if (nextFrom === from) return;
41
- target.removeEventListener("pointerenter", arm);
42
- target.removeEventListener("pointerleave", disarm);
43
- from = nextFrom;
44
- target = zone();
45
- target.addEventListener("pointerenter", arm);
46
- target.addEventListener("pointerleave", disarm);
47
- },
48
- destroy () {
49
- target.removeEventListener("pointerenter", arm);
50
- target.removeEventListener("pointerleave", disarm);
51
- document.removeEventListener("pointermove", onMove);
52
- }
53
- };
2
+ /**
3
+ * Pulls an element toward the pointer while it is inside `range`.
4
+ * Port of motion-primitives' `Magnetic` with a CSS transition instead of a spring.
5
+ */
6
+ export const magnetic = (node, options) => {
7
+ let intensity = options?.intensity ?? .6;
8
+ let range = options?.range ?? 100;
9
+ let from = options?.from ?? "self";
10
+ let duration = options?.duration ?? 350;
11
+ let armed = false;
12
+ // WHY: the pull is a hover affordance with no state behind it, so reduced-motion
13
+ // gets a no-op rather than a shorter version of the same movement.
14
+ const reduced = window.matchMedia("(prefers-reduced-motion: reduce)");
15
+ const zone = () => from === "parent" ? node.parentElement ?? node : node;
16
+ const reset = () => {
17
+ node.style.transition = `translate ${duration}ms ${EASE}`;
18
+ node.style.translate = "0px 0px";
19
+ };
20
+ const onMove = (event) => {
21
+ if (!armed || reduced.matches) return;
22
+ const rect = node.getBoundingClientRect();
23
+ const dx = event.clientX - (rect.left + rect.width / 2);
24
+ const dy = event.clientY - (rect.top + rect.height / 2);
25
+ const distance = Math.hypot(dx, dy);
26
+ if (distance > range) return reset();
27
+ const falloff = intensity * (1 - distance / range);
28
+ node.style.transition = "translate 0ms";
29
+ node.style.translate = `${dx * falloff}px ${dy * falloff}px`;
30
+ };
31
+ const arm = () => armed = true;
32
+ const disarm = () => {
33
+ armed = false;
34
+ reset();
35
+ };
36
+ let target = zone();
37
+ target.addEventListener("pointerenter", arm);
38
+ target.addEventListener("pointerleave", disarm);
39
+ document.addEventListener("pointermove", onMove);
40
+ return {
41
+ update(next) {
42
+ intensity = next?.intensity ?? .6;
43
+ range = next?.range ?? 100;
44
+ duration = next?.duration ?? 350;
45
+ const nextFrom = next?.from ?? "self";
46
+ if (nextFrom === from) return;
47
+ target.removeEventListener("pointerenter", arm);
48
+ target.removeEventListener("pointerleave", disarm);
49
+ from = nextFrom;
50
+ target = zone();
51
+ target.addEventListener("pointerenter", arm);
52
+ target.addEventListener("pointerleave", disarm);
53
+ },
54
+ destroy() {
55
+ target.removeEventListener("pointerenter", arm);
56
+ target.removeEventListener("pointerleave", disarm);
57
+ document.removeEventListener("pointermove", onMove);
58
+ }
59
+ };
54
60
  };
@@ -1,43 +1,53 @@
1
+ /**
2
+ * Runs `onChange` when `el` enters or leaves the viewport. Returns the teardown.
3
+ * Shared by InView, AnimatedGroup and TextEffect so there is one observer contract.
4
+ */
1
5
  export function observeInView(el, options, onChange) {
2
- if (typeof IntersectionObserver === "undefined") {
3
- onChange(true);
4
- return ()=>{};
5
- }
6
- const observer = new IntersectionObserver(([entry])=>{
7
- if (entry.isIntersecting) {
8
- onChange(true);
9
- if (options.once !== false) observer.disconnect();
10
- return;
11
- }
12
- if (options.once === false) onChange(false);
13
- }, {
14
- threshold: options.amount ?? 0,
15
- rootMargin: options.margin ?? "0px"
16
- });
17
- observer.observe(el);
18
- return ()=>observer.disconnect();
6
+ // WHY: no IntersectionObserver means SSR or an ancient engine; reveal the
7
+ // content rather than leaving it stuck at the hidden keyframe.
8
+ if (typeof IntersectionObserver === "undefined") {
9
+ onChange(true);
10
+ return () => {};
11
+ }
12
+ const observer = new IntersectionObserver(([entry]) => {
13
+ if (entry.isIntersecting) {
14
+ onChange(true);
15
+ if (options.once !== false) observer.disconnect();
16
+ return;
17
+ }
18
+ if (options.once === false) onChange(false);
19
+ }, {
20
+ threshold: options.amount ?? 0,
21
+ rootMargin: options.margin ?? "0px"
22
+ });
23
+ observer.observe(el);
24
+ return () => observer.disconnect();
19
25
  }
20
- export const onInView = (node, initial)=>{
21
- let options = initial ?? {};
22
- let entered = false;
23
- const { amount = 0.1, margin, once } = options;
24
- const stop = observeInView(node, {
25
- amount,
26
- margin,
27
- once
28
- }, (inView)=>{
29
- if (inView && !entered) {
30
- entered = true;
31
- options.onEnter?.();
32
- } else if (!inView && entered) {
33
- entered = false;
34
- options.onLeave?.();
35
- }
36
- });
37
- return {
38
- update (next) {
39
- options = next ?? {};
40
- },
41
- destroy: stop
42
- };
26
+ /**
27
+ * Svelte action that calls back when the node enters or leaves the viewport.
28
+ * Options are read at call time, so a `use:onInView={...}` update swaps the callbacks.
29
+ */
30
+ export const onInView = (node, initial) => {
31
+ let options = initial ?? {};
32
+ let entered = false;
33
+ const { amount = .1, margin, once } = options;
34
+ const stop = observeInView(node, {
35
+ amount,
36
+ margin,
37
+ once
38
+ }, (inView) => {
39
+ if (inView && !entered) {
40
+ entered = true;
41
+ options.onEnter?.();
42
+ } else if (!inView && entered) {
43
+ entered = false;
44
+ options.onLeave?.();
45
+ }
46
+ });
47
+ return {
48
+ update(next) {
49
+ options = next ?? {};
50
+ },
51
+ destroy: stop
52
+ };
43
53
  };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,34 +1,41 @@
1
1
  let probe;
2
2
  function getProbe() {
3
- if (probe !== undefined) return probe;
4
- probe = document.createElement("canvas").getContext("2d", {
5
- willReadFrequently: true
6
- });
7
- return probe;
3
+ if (probe !== undefined) return probe;
4
+ probe = document.createElement("canvas").getContext("2d", { willReadFrequently: true });
5
+ return probe;
8
6
  }
7
+ /**
8
+ * Any CSS color to a 0..1 RGB triplet, `var(--token)` included.
9
+ */
10
+ /*
11
+ * The values go through a 1x1 canvas rather than a hand-written parser because the brand palette is authored in oklch, and the canvas gives the browser's own conversion for every
12
+ */
13
+ /*
14
+ * color space it supports instead of a second implementation that has to keep up.
15
+ */
9
16
  export function resolveColor(input, scope) {
10
- const fallback = [
11
- 0,
12
- 0,
13
- 0
14
- ];
15
- if (typeof document === "undefined") return fallback;
16
- let value = input.trim();
17
- const token = /^var\(\s*(--[\w-]+)\s*(?:,\s*([\s\S]+))?\)$/.exec(value);
18
- if (token) {
19
- const resolved = getComputedStyle(scope ?? document.documentElement).getPropertyValue(token[1]).trim();
20
- value = resolved || token[2]?.trim() || "";
21
- }
22
- if (!value) return fallback;
23
- const context = getProbe();
24
- if (!context) return fallback;
25
- context.fillStyle = value;
26
- context.clearRect(0, 0, 1, 1);
27
- context.fillRect(0, 0, 1, 1);
28
- const [r, g, b] = context.getImageData(0, 0, 1, 1).data;
29
- return [
30
- r / 255,
31
- g / 255,
32
- b / 255
33
- ];
17
+ const fallback = [
18
+ 0,
19
+ 0,
20
+ 0
21
+ ];
22
+ if (typeof document === "undefined") return fallback;
23
+ let value = input.trim();
24
+ const token = /^var\(\s*(--[\w-]+)\s*(?:,\s*([\s\S]+))?\)$/.exec(value);
25
+ if (token) {
26
+ const resolved = getComputedStyle(scope ?? document.documentElement).getPropertyValue(token[1]).trim();
27
+ value = resolved || token[2]?.trim() || "";
28
+ }
29
+ if (!value) return fallback;
30
+ const context = getProbe();
31
+ if (!context) return fallback;
32
+ context.fillStyle = value;
33
+ context.clearRect(0, 0, 1, 1);
34
+ context.fillRect(0, 0, 1, 1);
35
+ const [r, g, b] = context.getImageData(0, 0, 1, 1).data;
36
+ return [
37
+ r / 255,
38
+ g / 255,
39
+ b / 255
40
+ ];
34
41
  }