@synopackageland/ui 0.20.6 → 0.20.8

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 (43) hide show
  1. package/CHANGELOG.md +19 -4
  2. package/LICENSES/source-notices.md +110 -0
  3. package/README.md +1 -1
  4. package/dist/components/composite/form/FormItem.vue.d.ts +1 -1
  5. package/dist/components/composite/record-panel/recordPanelWidth.d.ts +4 -25
  6. package/dist/components/primitives/context-menu/ContextMenu.vue.d.ts +2 -2
  7. package/dist/composables/collisionBoundary.d.ts +7 -1
  8. package/dist/composables/elementWidth.d.ts +8 -2
  9. package/dist/dnd/autoScroll.d.ts +3 -22
  10. package/dist/dnd/dragKit.d.ts +1 -1
  11. package/dist/grid/cells/number.d.ts +1 -1
  12. package/dist/grid/cells/types.d.ts +1 -1
  13. package/dist/grid/clipboard/tsv.d.ts +1 -2
  14. package/dist/grid/contracts.d.ts +1 -1
  15. package/dist/grid/focus/editor-style.d.ts +1 -1
  16. package/dist/grid/host/controller.d.ts +11 -11
  17. package/dist/grid/range/block.d.ts +1 -1
  18. package/dist/grid-core/auto-scroll.d.ts +7 -7
  19. package/dist/grid-core/column-resize.d.ts +1 -1
  20. package/dist/grid-core/config.d.ts +1 -1
  21. package/dist/grid-core/keys.d.ts +2 -2
  22. package/dist/grid-core/renderer/layout.d.ts +1 -1
  23. package/dist/grid-core/selection-controller.d.ts +2 -2
  24. package/dist/grid-core/theme.d.ts +5 -5
  25. package/dist/grid.js +13 -13
  26. package/dist/index.js +10053 -10034
  27. package/dist/interaction/ime.d.ts +3 -22
  28. package/dist/json-preview/preview.js +8206 -8192
  29. package/dist/lib/adaptiveLayout.d.ts +7 -0
  30. package/dist/lib/fieldWidth.d.ts +2 -2
  31. package/dist/reka-runtime.json +1 -1
  32. package/dist/theme.css +1 -1
  33. package/dist/themes/dsm7-embedded-theme.css +1 -1
  34. package/dist/themes/dsm7-embedded.css +1 -1
  35. package/dist/themes/dsm7.css +1 -1
  36. package/docs/layout-rules.md +1 -1
  37. package/docs/mobile-native.md +2 -2
  38. package/docs/ux-grid.md +6 -8
  39. package/package.json +2 -3
  40. package/LICENSES/ux-foundation.md +0 -83
  41. package/LICENSES/ux-grid-baserow.md +0 -35
  42. package/LICENSES/ux-grid-teable.md +0 -48
  43. package/docs/ux-foundation.md +0 -133
package/CHANGELOG.md CHANGED
@@ -1,6 +1,21 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.20.8 (2026-11-05)
4
+
5
+ - A Card (and anything else built on MotionCollapse) takes its container's width: a one-line name inside cuts with its ellipsis instead of widening the card and making it scroll sideways (`check:truncation` adds a narrow card)
6
+ - A SegmentControl or Tabs strip that fits no longer scrolls a few pixels and clips its first or last item and its own border: the last row of a list keeps its hover slop inside the list (`check:tabs` now measures SegmentControls that fit)
7
+
8
+ ## 0.20.7 (2026-11-05)
9
+
10
+ - An `AppLayout` inside another one takes its first width measurement only after the containing layout has drawn its own measured layout, still before the first paint. Children mount before their parents, so a page's layout measured the shell's guessed layout and its aside slid once the shell settled
11
+ - Reduced motion and `data-ui-motion="off"` only shorten transitions a rule declares. An element no rule gives a `transition-property` now has none, instead of a 0.01ms transition of `all` that made a change such as a layout's padding land a frame late
12
+ - ContextMenu is placed at the pointer from its first position. Reka moved its anchor from the trigger to the pointer only after the menu mounted, so near an edge the first position beside the trigger left a few px of room, the menu shrank to it and then stayed narrow at the pointer (16px wide at the right edge of a 768px window)
13
+ - A stacked `FormItem` or `SettingsRow` (label over the control in a narrow row) lets an `md` or `lg` control fill the column instead of stopping at 320/480px; `xs`, `sm` and CSS lengths keep their cap, so a field in a phone bottom sheet has the same space on both sides
14
+ - In the mobile layout the `AppLayout` page scroller no longer reserves a scrollbar gutter, which pushed content off centre where scrollbars overlay
15
+ - A Tooltip or Popover whose trigger is a component no longer throws when it reads the floating padding from Reka's virtual anchor
16
+ - The DataGrid and DataTable phone list joins its two subtitle columns with a gap instead of a middle dot, and the sort summary reads "Name, ascending"
17
+ - The pressed tint follows the text colour under a dark app root instead of keeping the light step
18
+ - The DatePicker and Select phone sheets take their field size from `--ui-font-size-field`
4
19
 
5
20
  ## 0.20.6 (2026-11-05)
6
21
 
@@ -41,12 +56,12 @@
41
56
  - Popover, DropdownMenu, Select and the combobox selects share one layer stack: Escape closes only the topmost surface, and an Escape that ends an IME composition closes nothing. `provideOverlayMotion('none')` makes popups inside a grid editor appear at once
42
57
  - Skeletons take the final geometry (`SectionSkeleton variant="grid" | "cards" | "fields"`); shapes show after 300ms. Toasts: success 3s, info and warning 5s, danger stays; `pending()` turns into its result in place. New `StatusSlot` and `useShowAfter`. `ToastProvider` drops its `duration` prop
43
58
  - New `VirtualCardGrid`, `CardCover` and `CardField`: a virtual card gallery whose card height comes from `cardHeight()`, whose column count is known before the first card renders, and which holds its columns while a side region moves
44
- - The interaction core (outside layers, IME guard, focus, pointer gesture, edit session), the drag kit (`createDragKit`, `useDragKit`, auto-scroll) and the motion helpers are exported from the package entry ([UX foundation](docs/ux-foundation.md))
45
- - New `@synopackageland/ui/grid` entry: `GridHost`, a canvas grid ported from Teable's MIT grid, with cell renderers for every field kind, editing with IME-safe first keys, and a save-status store. Load it lazily
59
+ - The interaction core (outside layers, IME guard, focus, pointer gesture, edit session), the drag kit (`createDragKit`, `useDragKit`, auto-scroll) and the motion helpers are exported from the package entry
60
+ - New `@synopackageland/ui/grid` entry: `GridHost`, a canvas grid with cell renderers for every field kind, editing with IME-safe first keys, and a save-status store. Load it lazily
46
61
  - Five new accessible labels (Checked, Not checked, Rating, Saving, Not saved) and `Restore {name}`, in all nine locales
47
62
  - Phone viewport and keyboard layer: `AppRoot full-page` makes the root a `100dvh` page whose document never scrolls (no overscroll reload) and calls `ensureDeviceViewport()`, which now adds `viewport-fit=cover, interactive-widget=resizes-content` (zoom stays on). Every `AppRoot` publishes `--ui-vvh`, `--ui-vv-top`, `--ui-kb-inset` and `data-ui-keyboard="open"` from the visual viewport (60px threshold, one read per frame) and keeps the focused field visible inside its own scroller. New `useVisualViewport`, `focusWithoutScroll` and `useBackDismiss` (Back closes the top sheet, drawer or pushed page only); `useSoftKeyboard` is exported and confirms the keyboard with the viewport
48
63
  - Phone and touch: the touch rules now apply in every app (they were keyed on a theme name nobody set). On a coarse pointer every field, select and editable text is 16px, and small controls get a 44px tap box. A phone (640px and narrower) reads 15px body, 13px secondary text, 44px fields and form buttons, 48px list and menu rows and one 48px header; long words break instead of widening a row; hover styles apply only where hover exists ([Mobile-native UI](docs/mobile-native.md))
49
- - Third-party notices for the ported Teable and Baserow code are in `LICENSES/ux-foundation.md` and `LICENSES/ux-grid-teable.md`
64
+ - Third-party notices are in `LICENSES/source-notices.md`
50
65
  - Popover and Tooltip use one floating preset (`floating.ts`): 8px plus safe area and soft keyboard from the edge, `sticky: 'partial'`, `hideWhenDetached`, sizes from Reka's available room instead of `100vw`. The AppRoot portal layer clips so a popup never grows the page. Tooltip `openOnTap` is on by default on coarse pointers, and a real tap (with its click) no longer closes it at once
51
66
 
52
67
  ## 0.20.3 (2026-11-04)
@@ -0,0 +1,110 @@
1
+ # Source notices
2
+
3
+ A few source files in this package contain code under the MIT licence from
4
+ the projects below. Those files carry a one-line pointer to this page in their
5
+ header, and the built bundles open with a notice that points here as well. The
6
+ full copyright and permission notices are reproduced below.
7
+
8
+ No upstream name, logo or icon asset is shipped.
9
+
10
+ ## Files in the main entry
11
+
12
+ | Source file in this package | Notice |
13
+ | --- | --- |
14
+ | `src/interaction/ime.ts` | Teable |
15
+ | `src/interaction/gesture.ts` | Teable |
16
+ | `src/components/primitives/popover/overlay.ts` | Teable |
17
+ | `src/components/composite/record-panel/recordPanelWidth.ts` | Teable |
18
+ | `src/components/composite/record-panel/RecordPanel.vue` | Teable |
19
+ | `src/interaction/outside.ts` | Baserow |
20
+ | `src/dnd/dragKit.ts` | Baserow |
21
+ | `src/dnd/autoScroll.ts` | Baserow |
22
+ | `src/virtual/cardHeight.ts` | Baserow |
23
+
24
+ Every file under `src/grid-core/` and `src/grid/cells/` carries the same
25
+ notices in its header, and so does the grid bundle.
26
+
27
+ ## Teable notice
28
+
29
+ Teable `packages/*` is MIT licensed.
30
+
31
+ ```text
32
+ MIT License
33
+
34
+ Copyright (c) 2023-2025 Teable, Inc.
35
+
36
+ Permission is hereby granted, free of charge, to any person obtaining a copy
37
+ of this software and associated documentation files (the "Software"), to deal
38
+ in the Software without restriction, including without limitation the rights
39
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40
+ copies of the Software, and to permit persons to whom the Software is
41
+ furnished to do so, subject to the following conditions:
42
+
43
+ The above copyright notice and this permission notice shall be included in all
44
+ copies or substantial portions of the Software.
45
+
46
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
47
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
48
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
49
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52
+ SOFTWARE.
53
+ ```
54
+
55
+ ## Baserow notice
56
+
57
+ Baserow Open Source Edition (outside `premium/` and `enterprise/`) is MIT
58
+ (Expat) licensed.
59
+
60
+ ```text
61
+ MIT License
62
+
63
+ Copyright (c) 2019-present Baserow B.V.
64
+
65
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this
66
+ software and associated documentation files (the "Software"), to deal in the Software
67
+ without restriction, including without limitation the rights to use, copy, modify,
68
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
69
+ permit persons to whom the Software is furnished to do so, subject to the following
70
+ conditions:
71
+
72
+ The above copyright notice and this permission notice shall be included in all copies
73
+ or substantial portions of the Software.
74
+
75
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
76
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
77
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
78
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
79
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
80
+ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
81
+ ```
82
+
83
+ ## Tailwind CSS palette
84
+
85
+ The grid's default colours come from the Tailwind CSS palette, MIT licensed,
86
+ Copyright (c) Tailwind Labs, Inc.
87
+
88
+ ```text
89
+ MIT License
90
+
91
+ Copyright (c) Tailwind Labs, Inc.
92
+
93
+ Permission is hereby granted, free of charge, to any person obtaining a copy
94
+ of this software and associated documentation files (the "Software"), to deal
95
+ in the Software without restriction, including without limitation the rights
96
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
97
+ copies of the Software, and to permit persons to whom the Software is
98
+ furnished to do so, subject to the following conditions:
99
+
100
+ The above copyright notice and this permission notice shall be included in all
101
+ copies or substantial portions of the Software.
102
+
103
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
104
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
105
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
106
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
107
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
108
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
109
+ SOFTWARE.
110
+ ```
package/README.md CHANGED
@@ -549,7 +549,7 @@ DSM-style application building blocks:
549
549
  - ListDetail (a list with the selected item's detail beside it, the pane's width set by dragging and remembered; see [docs/list-detail.md](docs/list-detail.md))
550
550
  - AsidePanel (the right side region: rail, docked, floating, sheet) / RecordPanel (a non-modal record panel docked over the view) / AdaptivePanel (a popover on desktop, a bottom sheet on a phone) / StatusSlot
551
551
  - VirtualCardGrid / CardCover / CardField (a virtual card gallery whose card height is computed, never measured)
552
- - Interaction core, drag kit and motion helpers for app views (see [docs/ux-foundation.md](docs/ux-foundation.md); phone and touch rules in [docs/mobile-native.md](docs/mobile-native.md)); the canvas grid is the separate `@synopackageland/ui/grid` entry
552
+ - Interaction core, drag kit and motion helpers for app views (phone and touch rules in [docs/mobile-native.md](docs/mobile-native.md)); the canvas grid is the separate `@synopackageland/ui/grid` entry
553
553
 
554
554
  `Tabs` and `SectionTabs` move a raised selection notch in 120ms. Selected labels
555
555
  are blue; main labels are bold 14px and section labels bold 13px. `Tabs` fades its
@@ -50,7 +50,7 @@ type __VLS_Props = {
50
50
  direction?: FormDirection;
51
51
  /** Width of the label column in the horizontal layout. */
52
52
  labelWidth?: string;
53
- /** Maximum control width; inherits the form's `fieldWidth` (`'md'` by default). */
53
+ /** Maximum control width; inherits the form's `fieldWidth` (`'md'` by default). In a narrow row that stacks its label, `'md'` and `'lg'` fill the column. */
54
54
  fieldWidth?: FieldWidth;
55
55
  /** Value restored by `resetFields()`; also the initial dirty baseline. */
56
56
  initialValue?: unknown;
@@ -1,30 +1,9 @@
1
1
  /**
2
2
  * @license MIT
3
- * The width rule (560 default, 320 minimum, 240 of the view kept beside the
4
- * panel, the secondary column added on top and capped at the host) is ported
5
- * from Teable's record side panel
6
- * (packages/sdk/src/components/expand-record/Panel.tsx:20-26, 83-88 at
7
- * f8be01fad).
3
+ * The width rule: 560 default, 320 minimum, 240 of the view kept beside the
4
+ * panel, the secondary column added on top and capped at the host.
8
5
  *
9
- * Copyright (c) 2023-2025 Teable, Inc.
10
- *
11
- * Permission is hereby granted, free of charge, to any person obtaining a copy
12
- * of this software and associated documentation files (the "Software"), to deal
13
- * in the Software without restriction, including without limitation the rights
14
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
- * copies of the Software, and to permit persons to whom the Software is
16
- * furnished to do so, subject to the following conditions:
17
- *
18
- * The above copyright notice and this permission notice shall be included in all
19
- * copies or substantial portions of the Software.
20
- *
21
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
- * SOFTWARE.
6
+ * Licence: LICENSES/source-notices.md
28
7
  */
29
8
  export declare const RECORD_PANEL_DEFAULT_WIDTH = 560;
30
9
  export declare const RECORD_PANEL_MIN_WIDTH = 320;
@@ -32,7 +11,7 @@ export declare const RECORD_PANEL_MIN_WIDTH = 320;
32
11
  export declare const RECORD_PANEL_MIN_MAIN_WIDTH = 240;
33
12
  /** The comments (or other secondary) column, added on the panel's far side. */
34
13
  export declare const RECORD_PANEL_SECONDARY_WIDTH = 320;
35
- /** Body padding switches from 24 to 48 at this body width (Teable `getBodyPadding`). */
14
+ /** Body padding switches from 24 to 48 at this body width. */
36
15
  export declare const RECORD_PANEL_WIDE_BODY = 640;
37
16
  export interface RecordPanelBounds {
38
17
  minWidth: number;
@@ -5,9 +5,9 @@ type __VLS_Props = {
5
5
  /** How long a touch press is held before the menu opens, in ms; Reka's 700 when unset. */
6
6
  pressOpenDelay?: number;
7
7
  };
8
- declare var __VLS_17: {};
8
+ declare var __VLS_20: {};
9
9
  type __VLS_Slots = {} & {
10
- default?: (props: typeof __VLS_17) => any;
10
+ default?: (props: typeof __VLS_20) => any;
11
11
  };
12
12
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
13
13
  select: (key: string) => any;
@@ -1,4 +1,10 @@
1
+ /**
2
+ * The element behind an anchor. Reka hands a virtual element (a bare rect that
3
+ * carries its context element) whenever the trigger is a component rather than
4
+ * a DOM node, so resolve that first and ignore anything without `closest`.
5
+ */
6
+ export declare function anchorElement(anchor: Element | null | undefined): Element | null;
1
7
  /** Where a popup opened from `anchor` must stay: the app window it opens from,
2
8
  * or the whole viewport from a dialog floating over the DSM desktop. Reka flips
3
9
  * and shrinks the popup to fit this boundary while it is open. */
4
- export declare function useCollisionBoundary(anchor: () => HTMLElement | undefined, open: () => boolean): import('vue').ComputedRef<HTMLElement | HTMLElement[]>;
10
+ export declare function useCollisionBoundary(anchor: () => Element | null | undefined, open: () => boolean): import('vue').ComputedRef<HTMLElement | HTMLElement[]>;
@@ -1,4 +1,10 @@
1
1
  import { Ref } from 'vue';
2
2
  /** Observe the component's container, including DSM window resizes that do not
3
- * resize the document viewport. Zero is unknown (e.g. hidden tab or SSR). */
4
- export declare function useElementWidth(element: Readonly<Ref<HTMLElement | null | undefined>>): Ref<number, number>;
3
+ * resize the document viewport. Zero is unknown (e.g. hidden tab or SSR).
4
+ * `after` holds the first measurement until it is true (a containing layout
5
+ * that has not drawn its own measured layout yet); `onMeasured` runs once the
6
+ * first measurement has been drawn. */
7
+ export declare function useElementWidth(element: Readonly<Ref<HTMLElement | null | undefined>>, options?: {
8
+ after?: Readonly<Ref<boolean>>;
9
+ onMeasured?: () => void;
10
+ }): Ref<number, number>;
@@ -1,28 +1,9 @@
1
1
  /**
2
2
  * @license MIT
3
3
  * The edge-zone percentage and the linear speed ramp (full speed at and beyond
4
- * the edge) are ported from Baserow's `v-auto-scroll` directive
5
- * (web-frontend/modules/core/directives/autoScroll.js:30-99 at 98f727dc2),
6
- * rewritten as a requestAnimationFrame loop with a minimum zone and both axes.
4
+ * the edge), as a requestAnimationFrame loop with a minimum zone and both axes.
7
5
  *
8
- * Copyright (c) 2019-present Baserow B.V.
9
- *
10
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this
11
- * software and associated documentation files (the "Software"), to deal in the Software
12
- * without restriction, including without limitation the rights to use, copy, modify,
13
- * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
14
- * permit persons to whom the Software is furnished to do so, subject to the following
15
- * conditions:
16
- *
17
- * The above copyright notice and this permission notice shall be included in all copies
18
- * or substantial portions of the Software.
19
- *
20
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
21
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
22
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
24
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
25
- * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6
+ * Licence: LICENSES/source-notices.md
26
7
  */
27
8
  /** Share of the scroll box, per edge, that scrolls (interaction-spec §5.2). */
28
9
  export declare const AUTO_SCROLL_ZONE_PERCENT = 15;
@@ -47,7 +28,7 @@ export interface AutoScroll {
47
28
  * Speed for a pointer `offset` px from the box start on an axis `size` long:
48
29
  * negative toward the start, positive toward the end, 0 outside both zones.
49
30
  * Linear from 0 at the inner zone border to `max` at the edge; a pointer past
50
- * the edge keeps full speed (Baserow clamps the distance to 0).
31
+ * the edge keeps full speed (the distance is not clamped to 0).
51
32
  */
52
33
  export declare function edgeSpeed(offset: number, size: number, options?: Pick<AutoScrollOptions, 'padding' | 'minZone' | 'maxSpeed'>): number;
53
34
  /**
@@ -5,7 +5,7 @@ export type DragKey = string | number;
5
5
  export declare const TOUCH_HOLD_MS = 250;
6
6
  /** Movement before the hold ends that hands the touch back to native scrolling. */
7
7
  export declare const TOUCH_HOLD_TOLERANCE_PX = 6;
8
- /** After a sibling moves, the target holds still this long (Baserow 100 ms). */
8
+ /** After a sibling moves, the target holds still this long (100 ms). */
9
9
  export declare const SWAP_LOCK_MS = 100;
10
10
  export declare const DND_LANE_ATTR = "data-dnd-lane";
11
11
  export declare const DND_KEY_ATTR = "data-dnd-key";
@@ -1,5 +1,5 @@
1
1
  import { GridNumberFormat } from './types';
2
2
  /** 12.5 → "12.50"; currency "$1,234.50"; percent 0.125 → "12.50%". Empty for null. */
3
3
  export declare const formatGridNumber: (value: number | null | undefined, format?: GridNumberFormat, locale?: string) => string;
4
- /** Teable's lenient parse: keeps digits, `.`, `+`, `-`; "12.5abc" → 12.5, "50%" → 0.5. Null when nothing parses. */
4
+ /** Lenient parse: keeps digits, `.`, `+`, `-`; "12.5abc" → 12.5, "50%" → 0.5. Null when nothing parses. */
5
5
  export declare const parseGridNumber: (value: string | null | undefined, format?: GridNumberFormat) => number | null;
@@ -24,7 +24,7 @@ export interface GridAttachment {
24
24
  /** Image thumbnail; files without one draw an extension badge. */
25
25
  thumbnailUrl?: string;
26
26
  }
27
- /** Teable's number formatting (packages/core, MIT). */
27
+ /** Number formatting (MIT, see LICENSES/source-notices.md). */
28
28
  export type GridNumberFormat = {
29
29
  type: 'decimal';
30
30
  precision?: number;
@@ -8,7 +8,6 @@ export declare const toTsv: (rows: readonly (readonly string[])[]) => string;
8
8
  export declare const parseTsv: (text: string) => string[][];
9
9
  /**
10
10
  * An HTML table for rich targets (Sheets, Excel, Docs), or undefined for a
11
- * single cell, as Baserow does (copyPasteHelper.js `prepareHTMLData`, MIT):
12
- * one cell pastes better as plain text.
11
+ * single cell (MIT): one cell pastes better as plain text.
13
12
  */
14
13
  export declare const toHtmlTable: (rows: readonly (readonly string[])[]) => string | undefined;
@@ -11,7 +11,7 @@ export interface GridColumn {
11
11
  name: string;
12
12
  /** Width in CSS px. Default 150. */
13
13
  width?: number;
14
- /** Smallest width a resize reaches. Default 100 (Teable). */
14
+ /** Smallest width a resize reaches. Default 100. */
15
15
  minWidth?: number;
16
16
  /** No edit requests for this column (the grid can still select and copy it). */
17
17
  readonly?: boolean;
@@ -2,7 +2,7 @@ import { IGridTheme } from '../../grid-core/theme';
2
2
  import { GridEditorKind } from '../contracts';
3
3
  /** Ring width outside the cell box while editing. */
4
4
  export declare const EDITOR_RING_PX = 2;
5
- /** Inner radius; with the 2 px ring the outer corner is Teable's 6 px. */
5
+ /** Inner radius; with the 2 px ring the outer corner is 6 px. */
6
6
  export declare const EDITOR_RADIUS_PX = 4;
7
7
  /** Line height of wrapped text in the long-text editor and the read-only view. */
8
8
  export declare const WRAP_LINE_HEIGHT_PX = 20;
@@ -25,7 +25,7 @@ export interface GridHostConfig {
25
25
  fillable?: boolean;
26
26
  /**
27
27
  * Touch UI (a coarse primary pointer): no fill handle and no column resize
28
- * handle, as in Teable's touch layer. Touch gestures go through `tap` and
28
+ * handle. Touch gestures go through `tap` and
29
29
  * `longPress`, never through the pointer methods. At a grid width of
30
30
  * `PHONE_MAX_WIDTH` or less it is the phone layout (see `isPhone`).
31
31
  */
@@ -64,9 +64,9 @@ export type GridKeyInput = Pick<KeyboardEvent, 'key' | 'keyCode' | 'shiftKey' |
64
64
  export type GridKeyResult = 'prevent' | 'pass' | 'ignore';
65
65
  /** Width of the row header: the row number, plus 24 px per row control beyond the first. */
66
66
  export declare const rowHeaderWidth: (controls: readonly GridRowControl[]) => number;
67
- /** Grid widths up to this are a phone on touch: a tap opens the record (Teable's `(max-width: 640px)`). */
67
+ /** Grid widths up to this are a phone on touch: a tap opens the record. */
68
68
  export declare const PHONE_MAX_WIDTH = 640;
69
- /** The phone's row header: row numbers only, as Teable's touch grid. */
69
+ /** The phone's row header: row numbers only. */
70
70
  export declare const PHONE_ROW_HEADER_WIDTH = 50;
71
71
  export declare class GridHostController {
72
72
  coord: CoordinateManager;
@@ -101,7 +101,7 @@ export declare class GridHostController {
101
101
  /**
102
102
  * Touch on a grid no wider than 640 px. There a tap opens the record (the
103
103
  * cell and its editor cannot fit beside the keyboard), the row header shows
104
- * numbers only and no column is frozen: Teable's phone grid.
104
+ * numbers only and no column is frozen.
105
105
  */
106
106
  get isPhone(): boolean;
107
107
  private visibleRowControls;
@@ -110,7 +110,7 @@ export declare class GridHostController {
110
110
  private applyColumns;
111
111
  /**
112
112
  * Frozen columns that fit: the scrolling part keeps at least 240 px, so on a
113
- * phone a wide first column stops freezing (Teable's getMaxFreezeColumnCount).
113
+ * phone a wide first column stops freezing.
114
114
  */
115
115
  private freezeCount;
116
116
  configure(next: GridHostConfig): void;
@@ -140,11 +140,11 @@ export declare class GridHostController {
140
140
  }): void;
141
141
  private selectCell;
142
142
  getCellRect(cell: GridCell): GridRect | null;
143
- /** Minimal scroll that shows the cell with Teable's 16 px buffer; instant. */
143
+ /** Minimal scroll that shows the cell with a 16 px buffer; instant. */
144
144
  scrollToCell(cell: GridCell): void;
145
145
  private regionContext;
146
146
  private get isFillEnabled();
147
- /** No resize handle on touch: a 5 px edge is no finger target (Teable has none on touch either). */
147
+ /** No resize handle on touch: a 5 px edge is no finger target. */
148
148
  private get isResizeEnabled();
149
149
  /** True while the fill handle is dragged. */
150
150
  get isFilling(): boolean;
@@ -183,11 +183,11 @@ export declare class GridHostController {
183
183
  * The tapped row or header keeps a pressed tint until `clearTapFeedback`.
184
184
  *
185
185
  * - A cell on a phone (`isPhone`): selects it and opens the record
186
- * (`rowExpand` with the column), as Teable's touch grid.
186
+ * (`rowExpand` with the column).
187
187
  * - A cell on a wider touch screen: the first tap selects it, a second tap
188
188
  * on the selected cell asks for an edit (`tap` trigger).
189
- * - A header with a menu opens the menu, as in Teable's touch layer (the
190
- * 16 px chevron is no finger target); without one it selects the column.
189
+ * - A header with a menu opens the menu (the 16 px chevron is no finger
190
+ * target); without one it selects the column.
191
191
  * - The row header is one target: on a phone it opens the record; wider, it
192
192
  * expands the row with the `expand` control, else toggles the checkbox.
193
193
  *
@@ -201,7 +201,7 @@ export declare class GridHostController {
201
201
  private requestEdit;
202
202
  /**
203
203
  * After an edit of `cell` commits: Enter moves down, Tab right, Shift+Tab
204
- * left (Teable's enterCommitSelection / tabSelection), from the edited cell.
204
+ * left, from the edited cell.
205
205
  */
206
206
  moveAfterEdit(cell: GridCell, move: 'down' | 'right' | 'left'): void;
207
207
  /** An input method started composing on the selected cell. */
@@ -10,7 +10,7 @@ export interface GridCellRange {
10
10
  * The cells a selection covers, as ordered row and column indexes. A cell
11
11
  * selection is one rectangle; a row selection covers every column of its
12
12
  * rows; a column selection covers every row of its columns. Several runs
13
- * (Cmd+click on headers) are joined in index order, as Teable copies them.
13
+ * (Cmd+click on headers) are joined in index order.
14
14
  */
15
15
  export interface GridCellBlock {
16
16
  rows: readonly number[];
@@ -19,16 +19,16 @@ export interface IAutoScrollBounds {
19
19
  * Scroll direction for a pointer at `position` (relative to the grid's
20
20
  * top-left). Right/bottom: within 30 px of the edge or beyond it. Left/top:
21
21
  * within 30 px past the frozen columns / header, over the row header or header,
22
- * or beyond the grid. Teable stops when the pointer passes over the header or
23
- * leaves the grid on the left or top; we keep scrolling there.
22
+ * or beyond the grid. It keeps scrolling when the pointer passes over the
23
+ * header or leaves the grid on the left or top.
24
24
  * `dragType` limits a row drag to y and a column drag to x.
25
25
  */
26
26
  export declare const getAutoScrollDirection: (position: IPosition, bounds: IAutoScrollBounds, dragType?: DragRegionType, threshold?: number) => [IScrollDirection, IScrollDirection];
27
27
  /**
28
- * One frame of Teable's ramp: `speed = min(1, speed + dt/1200)`, then
29
- * `px = speed · dt · 2`. Teable floors `px` every frame; with `carry` the
30
- * fractional part moves to the next frame instead, so the distance does not
31
- * depend on the refresh rate.
28
+ * One frame of the ramp: `speed = min(1, speed + dt/1200)`, then
29
+ * `px = speed * dt * 2`. With `carry` the fractional part moves to the next
30
+ * frame instead of being floored, so the distance does not depend on the
31
+ * refresh rate.
32
32
  */
33
33
  export declare const autoScrollStep: (speed: number, dt: number, carry?: number) => {
34
34
  speed: number;
@@ -40,7 +40,7 @@ export interface IAutoScrollerOptions {
40
40
  scrollBy: (deltaX: number, deltaY: number) => void;
41
41
  /** After each scroll; re-derive the selection head from the last pointer here. */
42
42
  onTick?: (deltaX: number, deltaY: number) => void;
43
- /** Default true. False floors each frame exactly as Teable does. */
43
+ /** Default true. False floors each frame, the classic ramp. */
44
44
  carryFraction?: boolean;
45
45
  requestFrame?: (callback: (time: number) => void) => number;
46
46
  cancelFrame?: (id: number) => void;
@@ -8,7 +8,7 @@ export declare const resolveResizeColumnIndex: (coordInstance: CoordinateManager
8
8
  export interface IColumnResizeControllerOptions {
9
9
  coordInstance: () => CoordinateManager;
10
10
  scrollState: () => Pick<IScrollState, 'scrollLeft'>;
11
- /** Minimum width, per column if a function. Default 100 px (Teable). */
11
+ /** Minimum width, per column if a function. Default 100 px. */
12
12
  minWidth?: number | ((columnIndex: number) => number);
13
13
  /** Every width change while dragging, and the restored width on cancel. */
14
14
  onResize?: (width: number, columnIndex: number) => void;
@@ -15,7 +15,7 @@ export declare const GRID_DEFAULT: {
15
15
  readonly columnResizeHandlerPaddingTop: 4;
16
16
  readonly columnFreezeHandlerWidth: 8;
17
17
  readonly columnFreezeHandlerHeight: 30;
18
- /** Teable's hard-coded minimum while resizing. */
18
+ /** The minimum while resizing. */
19
19
  readonly columnMinWidth: 100;
20
20
  readonly cellHorizontalPadding: 8;
21
21
  readonly cellVerticalPaddingXS: 3;
@@ -1,4 +1,4 @@
1
- /** keyCode values (the `ts-keycode-enum` names Teable uses). */
1
+ /** keyCode values, by key name. */
2
2
  export declare const KeyCode: {
3
3
  readonly Space: 32;
4
4
  readonly Digit0: 48;
@@ -20,7 +20,7 @@ export declare const KeyCode: {
20
20
  };
21
21
  /**
22
22
  * The first-key test and the composition guard are shared with editors outside
23
- * the grid, so they live in the interaction core (also ported from Teable).
23
+ * the grid, so they live in the interaction core.
24
24
  * Ask `guard.ownsKey(event)` before handling Enter, Esc or Tab; ask
25
25
  * `isComposingKey(event)` before arrows.
26
26
  */
@@ -92,7 +92,7 @@ export declare const calcCells: (p: IResolvedProps, region: IRenderRegion) => {
92
92
  export declare const drawRowHeader: (ctx: CanvasRenderingContext2D, props: IRowHeaderProps, p: IResolvedProps) => void;
93
93
  /** Backgrounds and grid lines on the main canvas; cell content on the cache canvas when `shouldRerender`. */
94
94
  export declare const drawCells: (mainCtx: CanvasRenderingContext2D, cacheCtx: CanvasRenderingContext2D, p: IResolvedProps) => void;
95
- /** The active cell: cell background, a 1 px neutral ring with radius 2 (Teable style), and its content on top. */
95
+ /** The active cell: cell background, a 1 px neutral ring with radius 2, and its content on top. */
96
96
  export declare const drawActiveCell: (ctx: CanvasRenderingContext2D, p: IResolvedProps) => void;
97
97
  /** While dragging the fill handle: a tinted box over the target rows only, above or below the range. */
98
98
  export declare const drawFillPreview: (ctx: CanvasRenderingContext2D, p: IResolvedProps) => void;
@@ -23,8 +23,8 @@ export interface ISelectionControllerOptions {
23
23
  onRowRangeSelected?: (ranges: IRange[]) => void;
24
24
  }
25
25
  /**
26
- * Pointer rules for the selection, as a plain state holder (Teable's
27
- * `useSelection` without React). Selection starts on pointerdown on a cell;
26
+ * Pointer rules for the selection, as a plain state holder. Selection starts
27
+ * on pointerdown on a cell;
28
28
  * header, checkbox and corner selection happen on click.
29
29
  *
30
30
  * - Shift+click on a cell keeps the anchor and moves the head; Cmd+click is a plain click.
@@ -19,7 +19,7 @@ export interface IGridTheme {
19
19
  cellBgSelected: string;
20
20
  cellBgLoading: string;
21
21
  cellLineColor: string;
22
- /** The active cell's ring: 1 px, neutral (Teable style). */
22
+ /** The active cell's ring: 1 px, neutral. */
23
23
  cellLineColorActived: string;
24
24
  cellTextColor: string;
25
25
  cellTextColorHighlight: string;
@@ -49,12 +49,12 @@ export interface IGridTheme {
49
49
  export type IGridThemeColorKey = {
50
50
  [K in keyof IGridTheme]: IGridTheme[K] extends string ? K : never;
51
51
  }[keyof IGridTheme];
52
- /** Teable's light theme values. */
53
- export declare const teableGridTheme: IGridTheme;
52
+ /** Default light theme values. */
53
+ export declare const defaultGridTheme: IGridTheme;
54
54
  /**
55
55
  * Which UI library token feeds each theme colour. Task 08 owns the token
56
56
  * values; this only names them. The active-cell ring uses the text colour for a
57
- * 1 px neutral ring, as in Teable.
57
+ * 1 px neutral ring.
58
58
  */
59
59
  export declare const GRID_THEME_TOKENS: Record<Exclude<IGridThemeColorKey, 'themeKey' | 'fontFamily'>, string>;
60
60
  export declare const GRID_FONT_TOKENS: {
@@ -66,7 +66,7 @@ export declare const GRID_FONT_TOKENS: {
66
66
  export type IGridTokenSource = (token: string) => string | undefined;
67
67
  /**
68
68
  * Builds the theme from token values. Colours come back as the source resolved
69
- * them; missing tokens keep Teable's value.
69
+ * them; missing tokens keep the default value.
70
70
  */
71
71
  export declare const createGridTheme: (source: IGridTokenSource, overrides?: Partial<IGridTheme>) => IGridTheme;
72
72
  /**