@heyramzi/ui 2.11.1 → 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 (266) 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/editor/markdown.ts +30 -35
@@ -1,109 +1,113 @@
1
+ // Fractional indexing, so a move writes one row instead of renumbering a column; it's the
2
+ // CC0 algorithm from https://observablehq.com/@dgreensp/implementing-fractional-indexing.
1
3
  const DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
2
4
  const INT_DIGITS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
3
5
  const ZERO = DIGITS.charAt(0);
4
6
  function integerLength(head) {
5
- const i = INT_DIGITS.indexOf(head);
6
- if (i === -1) throw new Error("invalid order key head: " + head);
7
- const half = INT_DIGITS.length / 2;
8
- return i < half ? half - i + 1 : i - half + 2;
7
+ const i = INT_DIGITS.indexOf(head);
8
+ if (i === -1) throw new Error("invalid order key head: " + head);
9
+ const half = INT_DIGITS.length / 2;
10
+ return i < half ? half - i + 1 : i - half + 2;
9
11
  }
10
12
  function integerPart(key) {
11
- const length = integerLength(key.charAt(0));
12
- if (length > key.length) throw new Error("invalid order key: " + key);
13
- return key.slice(0, length);
13
+ const length = integerLength(key.charAt(0));
14
+ if (length > key.length) throw new Error("invalid order key: " + key);
15
+ return key.slice(0, length);
14
16
  }
15
17
  function smallestInteger() {
16
- return INT_DIGITS.charAt(0) + ZERO.repeat(INT_DIGITS.length / 2);
18
+ return INT_DIGITS.charAt(0) + ZERO.repeat(INT_DIGITS.length / 2);
17
19
  }
18
20
  function midpoint(a, b) {
19
- if (b != null && a >= b) throw new Error(a + " >= " + b);
20
- if (a.slice(-1) === ZERO || b && b.slice(-1) === ZERO) throw new Error("trailing zero");
21
- if (b) {
22
- let n = 0;
23
- while((a[n] ?? ZERO) === b[n])n++;
24
- if (n > 0) return b.slice(0, n) + midpoint(a.slice(n), b.slice(n));
25
- }
26
- const digitA = a ? DIGITS.indexOf(a.charAt(0)) : 0;
27
- const digitB = b != null ? DIGITS.indexOf(b.charAt(0)) : DIGITS.length;
28
- if (digitB - digitA > 1) {
29
- return DIGITS.charAt(Math.round(0.5 * (digitA + digitB)));
30
- }
31
- if (b && b.length > 1) return b.slice(0, 1);
32
- return DIGITS.charAt(digitA) + midpoint(a.slice(1), null);
21
+ if (b != null && a >= b) throw new Error(a + " >= " + b);
22
+ if (a.slice(-1) === ZERO || b && b.slice(-1) === ZERO) throw new Error("trailing zero");
23
+ if (b) {
24
+ let n = 0;
25
+ while ((a[n] ?? ZERO) === b[n]) n++;
26
+ if (n > 0) return b.slice(0, n) + midpoint(a.slice(n), b.slice(n));
27
+ }
28
+ const digitA = a ? DIGITS.indexOf(a.charAt(0)) : 0;
29
+ const digitB = b != null ? DIGITS.indexOf(b.charAt(0)) : DIGITS.length;
30
+ if (digitB - digitA > 1) {
31
+ return DIGITS.charAt(Math.round(.5 * (digitA + digitB)));
32
+ }
33
+ if (b && b.length > 1) return b.slice(0, 1);
34
+ return DIGITS.charAt(digitA) + midpoint(a.slice(1), null);
33
35
  }
34
36
  function incrementInteger(x) {
35
- const head = x.charAt(0);
36
- let trailing = "";
37
- for(let i = x.length - 1; i >= 1; i--){
38
- const d = DIGITS.indexOf(x.charAt(i)) + 1;
39
- if (d === DIGITS.length) trailing = ZERO + trailing;
40
- else return head + x.slice(1, i) + DIGITS.charAt(d) + trailing;
41
- }
42
- const headIndex = INT_DIGITS.indexOf(head);
43
- if (headIndex === INT_DIGITS.length - 1) return null;
44
- const h = INT_DIGITS.charAt(headIndex + 1);
45
- const delta = integerLength(h) - integerLength(head);
46
- return h + (delta > 0 ? trailing + ZERO : delta < 0 ? trailing.slice(1) : trailing);
37
+ const head = x.charAt(0);
38
+ let trailing = "";
39
+ for (let i = x.length - 1; i >= 1; i--) {
40
+ const d = DIGITS.indexOf(x.charAt(i)) + 1;
41
+ if (d === DIGITS.length) trailing = ZERO + trailing;
42
+ else return head + x.slice(1, i) + DIGITS.charAt(d) + trailing;
43
+ }
44
+ const headIndex = INT_DIGITS.indexOf(head);
45
+ if (headIndex === INT_DIGITS.length - 1) return null;
46
+ const h = INT_DIGITS.charAt(headIndex + 1);
47
+ const delta = integerLength(h) - integerLength(head);
48
+ return h + (delta > 0 ? trailing + ZERO : delta < 0 ? trailing.slice(1) : trailing);
47
49
  }
48
50
  function decrementInteger(x) {
49
- const head = x.charAt(0);
50
- const last = DIGITS.charAt(DIGITS.length - 1);
51
- let trailing = "";
52
- for(let i = x.length - 1; i >= 1; i--){
53
- const d = DIGITS.indexOf(x.charAt(i)) - 1;
54
- if (d === -1) trailing = last + trailing;
55
- else return head + x.slice(1, i) + DIGITS.charAt(d) + trailing;
56
- }
57
- const headIndex = INT_DIGITS.indexOf(head);
58
- if (headIndex === 0) return null;
59
- const h = INT_DIGITS.charAt(headIndex - 1);
60
- const delta = integerLength(h) - integerLength(head);
61
- return h + (delta > 0 ? trailing + last : delta < 0 ? trailing.slice(1) : trailing);
51
+ const head = x.charAt(0);
52
+ const last = DIGITS.charAt(DIGITS.length - 1);
53
+ let trailing = "";
54
+ for (let i = x.length - 1; i >= 1; i--) {
55
+ const d = DIGITS.indexOf(x.charAt(i)) - 1;
56
+ if (d === -1) trailing = last + trailing;
57
+ else return head + x.slice(1, i) + DIGITS.charAt(d) + trailing;
58
+ }
59
+ const headIndex = INT_DIGITS.indexOf(head);
60
+ if (headIndex === 0) return null;
61
+ const h = INT_DIGITS.charAt(headIndex - 1);
62
+ const delta = integerLength(h) - integerLength(head);
63
+ return h + (delta > 0 ? trailing + last : delta < 0 ? trailing.slice(1) : trailing);
62
64
  }
65
+ /** An order key that sorts strictly between `a` and `b`. Null means an open end. */
63
66
  export function keyBetween(a, b) {
64
- if (a != null && b != null && a > b) [a, b] = [
65
- b,
66
- a
67
- ];
68
- if (a == null) {
69
- if (b == null) return INT_DIGITS.charAt(INT_DIGITS.length / 2) + ZERO;
70
- const ib = integerPart(b);
71
- const fb = b.slice(ib.length);
72
- if (ib === smallestInteger()) return ib + midpoint("", fb);
73
- if (ib < b) return ib;
74
- const res = decrementInteger(ib);
75
- if (res == null) throw new Error("cannot decrement any more");
76
- return res;
77
- }
78
- if (b == null) {
79
- const ia = integerPart(a);
80
- const fa = a.slice(ia.length);
81
- const i = incrementInteger(ia);
82
- return i == null ? ia + midpoint(fa, null) : i;
83
- }
84
- const ia = integerPart(a);
85
- const fa = a.slice(ia.length);
86
- const ib = integerPart(b);
87
- const fb = b.slice(ib.length);
88
- if (ia === ib) return ia + midpoint(fa, fb);
89
- const i = incrementInteger(ia);
90
- if (i == null) throw new Error("cannot increment any more");
91
- if (i < b) return i;
92
- return ia + midpoint(fa, null);
67
+ if (a != null && b != null && a > b) [a, b] = [b, a];
68
+ if (a == null) {
69
+ if (b == null) return INT_DIGITS.charAt(INT_DIGITS.length / 2) + ZERO;
70
+ const ib = integerPart(b);
71
+ const fb = b.slice(ib.length);
72
+ if (ib === smallestInteger()) return ib + midpoint("", fb);
73
+ if (ib < b) return ib;
74
+ const res = decrementInteger(ib);
75
+ if (res == null) throw new Error("cannot decrement any more");
76
+ return res;
77
+ }
78
+ if (b == null) {
79
+ const ia = integerPart(a);
80
+ const fa = a.slice(ia.length);
81
+ const i = incrementInteger(ia);
82
+ return i == null ? ia + midpoint(fa, null) : i;
83
+ }
84
+ const ia = integerPart(a);
85
+ const fa = a.slice(ia.length);
86
+ const ib = integerPart(b);
87
+ const fb = b.slice(ib.length);
88
+ if (ia === ib) return ia + midpoint(fa, fb);
89
+ const i = incrementInteger(ia);
90
+ if (i == null) throw new Error("cannot increment any more");
91
+ if (i < b) return i;
92
+ return ia + midpoint(fa, null);
93
93
  }
94
+ /**
95
+ * The key a card should take when dropped at `index`. Rows may share a key or
96
+ * have none, so the bounds skip both and only compare against real keys.
97
+ */
94
98
  export function boardOrderAt(column, index, order) {
95
- let lower = null;
96
- for (const item of column.slice(0, index)){
97
- const key = order(item);
98
- if (key != null && (lower === null || key > lower)) lower = key;
99
- }
100
- let upper = null;
101
- for (const item of column.slice(index)){
102
- const key = order(item);
103
- if (key != null && (lower === null || key > lower)) {
104
- upper = key;
105
- break;
106
- }
107
- }
108
- return keyBetween(lower, upper);
99
+ let lower = null;
100
+ for (const item of column.slice(0, index)) {
101
+ const key = order(item);
102
+ if (key != null && (lower === null || key > lower)) lower = key;
103
+ }
104
+ let upper = null;
105
+ for (const item of column.slice(index)) {
106
+ const key = order(item);
107
+ if (key != null && (lower === null || key > lower)) {
108
+ upper = key;
109
+ break;
110
+ }
111
+ }
112
+ return keyBetween(lower, upper);
109
113
  }
@@ -1,19 +1,26 @@
1
- const DAY_MS = 86_400_000;
1
+ // Dates are plain "YYYY-MM-DD" strings, counted as whole UTC days. A timeline
2
+ // only needs days, and day numbers dodge every timezone and DST edge.
3
+ const DAY_MS = 864e5;
4
+ /** Days since 1970-01-01 for an ISO date. Anything after the date part is ignored. */
2
5
  export function dayNumber(iso) {
3
- const [y = 1970, m = 1, d = 1] = iso.slice(0, 10).split("-").map(Number);
4
- return Math.round(Date.UTC(y, m - 1, d) / DAY_MS);
6
+ const [y = 1970, m = 1, d = 1] = iso.slice(0, 10).split("-").map(Number);
7
+ return Math.round(Date.UTC(y, m - 1, d) / DAY_MS);
5
8
  }
9
+ /** The ISO date for a day number. */
6
10
  export function isoFromDay(day) {
7
- return new Date(day * DAY_MS).toISOString().slice(0, 10);
11
+ return new Date(day * DAY_MS).toISOString().slice(0, 10);
8
12
  }
13
+ /** Shift an ISO date by whole days. */
9
14
  export function addDays(iso, days) {
10
- return isoFromDay(dayNumber(iso) + days);
15
+ return isoFromDay(dayNumber(iso) + days);
11
16
  }
17
+ /** Today in the viewer's own timezone, as an ISO date. */
12
18
  export function todayIso() {
13
- const now = new Date();
14
- const local = new Date(now.getTime() - now.getTimezoneOffset() * 60_000);
15
- return local.toISOString().slice(0, 10);
19
+ const now = new Date();
20
+ const local = new Date(now.getTime() - now.getTimezoneOffset() * 6e4);
21
+ return local.toISOString().slice(0, 10);
16
22
  }
23
+ /** 0 is Sunday, as in `Date.getUTCDay`. */
17
24
  export function weekday(day) {
18
- return new Date(day * DAY_MS).getUTCDay();
25
+ return new Date(day * DAY_MS).getUTCDay();
19
26
  }
@@ -1,20 +1,20 @@
1
1
  export const DEFAULT_TASK_DETAIL_LABELS = {
2
- markComplete: "Mark complete",
3
- markIncomplete: "Mark incomplete",
4
- editTitle: "Edit title",
5
- description: "Description",
6
- addDescription: "Add a description",
7
- editDescription: "Edit description",
8
- save: "Save",
9
- saving: "Saving",
10
- cancel: "Cancel",
11
- comments: "Activity",
12
- commentPlaceholder: "Leave a comment",
13
- commentSend: "Comment",
14
- commentEdit: "Edit comment",
15
- commentDelete: "Delete comment",
16
- commentEdited: "edited",
17
- commentsEmpty: "No comments yet",
18
- ai: "AI",
19
- properties: "Properties"
2
+ markComplete: "Mark complete",
3
+ markIncomplete: "Mark incomplete",
4
+ editTitle: "Edit title",
5
+ description: "Description",
6
+ addDescription: "Add a description",
7
+ editDescription: "Edit description",
8
+ save: "Save",
9
+ saving: "Saving",
10
+ cancel: "Cancel",
11
+ comments: "Activity",
12
+ commentPlaceholder: "Leave a comment",
13
+ commentSend: "Comment",
14
+ commentEdit: "Edit comment",
15
+ commentDelete: "Delete comment",
16
+ commentEdited: "edited",
17
+ commentsEmpty: "No comments yet",
18
+ ai: "AI",
19
+ properties: "Properties"
20
20
  };
@@ -1,39 +1,42 @@
1
1
  export function parseStamp(value) {
2
- if (value === null || value === undefined || value === "") return null;
3
- const date = value instanceof Date ? value : new Date(value);
4
- return Number.isNaN(date.getTime()) ? null : date;
2
+ if (value === null || value === undefined || value === "") return null;
3
+ const date = value instanceof Date ? value : new Date(value);
4
+ return Number.isNaN(date.getTime()) ? null : date;
5
5
  }
6
6
  function yearOf(date, { locale = "en-US", timeZone }) {
7
- return new Intl.DateTimeFormat(locale, {
8
- year: "numeric",
9
- timeZone
10
- }).format(date);
7
+ return new Intl.DateTimeFormat(locale, {
8
+ year: "numeric",
9
+ timeZone
10
+ }).format(date);
11
11
  }
12
+ /** "Oct 23", or "Oct 23, 2025" when it isn't this year. Empty when the date can't be read. */
12
13
  export function shortDate(value, options = {}) {
13
- const date = parseStamp(value);
14
- if (!date) return "";
15
- const { locale = "en-US", timeZone, now = new Date() } = options;
16
- const sameYear = yearOf(date, options) === yearOf(now, options);
17
- return new Intl.DateTimeFormat(locale, {
18
- month: "short",
19
- day: "numeric",
20
- year: sameYear ? undefined : "numeric",
21
- timeZone
22
- }).format(date);
14
+ const date = parseStamp(value);
15
+ if (!date) return "";
16
+ const { locale = "en-US", timeZone, now = new Date() } = options;
17
+ const sameYear = yearOf(date, options) === yearOf(now, options);
18
+ return new Intl.DateTimeFormat(locale, {
19
+ month: "short",
20
+ day: "numeric",
21
+ year: sameYear ? undefined : "numeric",
22
+ timeZone
23
+ }).format(date);
23
24
  }
25
+ /** "Oct 23, 14:44" for the last-edit row. Empty when the date can't be read. */
24
26
  export function editStamp(value, options = {}) {
25
- const date = parseStamp(value);
26
- if (!date) return "";
27
- const { locale = "en-US", timeZone } = options;
28
- const time = new Intl.DateTimeFormat(locale, {
29
- hour: "2-digit",
30
- minute: "2-digit",
31
- hour12: false,
32
- timeZone
33
- }).format(date);
34
- return `${shortDate(date, options)}, ${time}`;
27
+ const date = parseStamp(value);
28
+ if (!date) return "";
29
+ const { locale = "en-US", timeZone } = options;
30
+ const time = new Intl.DateTimeFormat(locale, {
31
+ hour: "2-digit",
32
+ minute: "2-digit",
33
+ hour12: false,
34
+ timeZone
35
+ }).format(date);
36
+ return `${shortDate(date, options)}, ${time}`;
35
37
  }
38
+ /** The chip's text. `label` is the word ("Edited"); a bad date leaves only the word. */
36
39
  export function editedLabel(value, label = "Edited", options = {}) {
37
- const day = shortDate(value, options);
38
- return day ? `${label} ${day}` : label;
40
+ const day = shortDate(value, options);
41
+ return day ? `${label} ${day}` : label;
39
42
  }
@@ -1,3 +1,7 @@
1
+ /**
2
+ * The document surface: a page to write one, the "Edited" chip, the `…` menu and the outline
3
+ * logic behind the edge ticks. The app supplies the data and every handler.
4
+ */
1
5
  export { default as DocEditorPage } from "../../../src/work/docs/doc-editor-page.svelte";
2
6
  export { default as DocMenu } from "../../../src/work/docs/doc-menu.svelte";
3
7
  export { default as EditedChip } from "../../../src/work/docs/edited-chip.svelte";
@@ -1,38 +1,38 @@
1
1
  export const DEFAULT_DOC_LABELS = {
2
- titlePlaceholder: "New document",
3
- untitled: "Untitled",
4
- edited: "Edited",
5
- showAuthorNames: "Show author names",
6
- ownedBy: "Owned by",
7
- lastEditBy: "Last edit by",
8
- showHistory: "Show document history",
9
- menu: "Document actions",
10
- filter: "Filter…",
11
- noResults: "Nothing matches",
12
- moveTo: "Move to",
13
- duplicate: "Duplicate",
14
- rename: "Rename",
15
- template: "New template from document",
16
- favorite: "Favorite",
17
- unfavorite: "Remove from favorites",
18
- copy: "Copy",
19
- copyUrl: "Copy URL",
20
- copyTitle: "Copy title",
21
- copyTitleAsLink: "Copy title as link",
22
- copyMarkdown: "Copy content as Markdown",
23
- remind: "Remind me",
24
- history: "Show document history",
25
- delete: "Delete",
26
- deleteTitle: (title)=>`Delete "${title}"`,
27
- deleteDetail: "This can't be undone.",
28
- cancel: "Cancel",
29
- back: "Back",
30
- outline: "Outline",
31
- copyLink: "Copy link"
2
+ titlePlaceholder: "New document",
3
+ untitled: "Untitled",
4
+ edited: "Edited",
5
+ showAuthorNames: "Show author names",
6
+ ownedBy: "Owned by",
7
+ lastEditBy: "Last edit by",
8
+ showHistory: "Show document history",
9
+ menu: "Document actions",
10
+ filter: "Filter…",
11
+ noResults: "Nothing matches",
12
+ moveTo: "Move to",
13
+ duplicate: "Duplicate",
14
+ rename: "Rename",
15
+ template: "New template from document",
16
+ favorite: "Favorite",
17
+ unfavorite: "Remove from favorites",
18
+ copy: "Copy",
19
+ copyUrl: "Copy URL",
20
+ copyTitle: "Copy title",
21
+ copyTitleAsLink: "Copy title as link",
22
+ copyMarkdown: "Copy content as Markdown",
23
+ remind: "Remind me",
24
+ history: "Show document history",
25
+ delete: "Delete",
26
+ deleteTitle: (title) => `Delete "${title}"`,
27
+ deleteDetail: "This can't be undone.",
28
+ cancel: "Cancel",
29
+ back: "Back",
30
+ outline: "Outline",
31
+ copyLink: "Copy link"
32
32
  };
33
33
  export function docLabels(partial) {
34
- return {
35
- ...DEFAULT_DOC_LABELS,
36
- ...partial
37
- };
34
+ return {
35
+ ...DEFAULT_DOC_LABELS,
36
+ ...partial
37
+ };
38
38
  }