@santi020k/lumen-core 4.0.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/dist/anchor.d.ts +5 -0
- package/dist/anchor.d.ts.map +1 -0
- package/dist/anchor.js +68 -0
- package/dist/floating-panel.d.ts +24 -0
- package/dist/floating-panel.d.ts.map +1 -0
- package/dist/floating-panel.js +203 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/loading.d.ts +34 -0
- package/dist/loading.d.ts.map +1 -0
- package/dist/loading.js +70 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -64,6 +64,16 @@
|
|
|
64
64
|
|
|
65
65
|
Shared metadata, token constants, and tiny utilities used by the Lumen package family.
|
|
66
66
|
|
|
67
|
+
`getLumenActiveAnchorIndex(targets, activationOffset)` selects an index from document headings in
|
|
68
|
+
reading order, or returns `-1` for an empty list. It accounts for live root scroll padding (including
|
|
69
|
+
percentages), each target's scroll margin, an explicit minimum offset, and native rounding. The last
|
|
70
|
+
heading wins at the bottom of a scrollable document; non-scrolling pages use heading positions.
|
|
71
|
+
The framework adapters share this helper while retaining their event and lifecycle ownership.
|
|
72
|
+
`decodeLumenAnchorFragment(fragment)` also decodes links safely, preserving literal percent signs
|
|
73
|
+
when a fragment is not valid URI encoding. Mixed percentage/length scroll padding is resolved by
|
|
74
|
+
the browser once per computed value and viewport size; ordinary pixel and percentage values need
|
|
75
|
+
no measurement node.
|
|
76
|
+
|
|
67
77
|
Most consumers should install a framework package such as `@santi020k/lumen-astro`, `@santi020k/lumen-react`, or `@santi020k/lumen-elements`.
|
|
68
78
|
|
|
69
79
|
The package exports `lumenColors` and `lumenGlass` for consumers that need to mirror Lumen theme
|
|
@@ -73,6 +83,13 @@ It also publishes shared web behavior contracts such as `LumenTabsChangeDetail`
|
|
|
73
83
|
`LumenTabsChangeEvent`. Import them from the root or `@santi020k/lumen-core/tabs` when application
|
|
74
84
|
code listens for `ui:tabs-change`.
|
|
75
85
|
|
|
86
|
+
Loading helpers are available from the root export for custom web adapters:
|
|
87
|
+
`normalizeLumenProgress(max, value)` produces finite, clamped progress values;
|
|
88
|
+
`resolveLumenSkeletonShape`, `resolveLumenSkeletonAnimation`, and `resolveLumenSkeletonSize`
|
|
89
|
+
normalize placeholder options. Numeric sizes become pixels, and bounded CSS size expressions retain
|
|
90
|
+
custom-property casing. `resolveLumenLoadingSemantics` supplies decorative or named status defaults;
|
|
91
|
+
adapters must preserve explicit consumer ARIA attributes when applying those defaults.
|
|
92
|
+
|
|
76
93
|
Cross-platform foundations originate in `tokens/lumen.tokens.json` and are published as
|
|
77
94
|
`@santi020k/lumen-tokens`. Core also exports generated hexadecimal light/dark palettes and native
|
|
78
95
|
numeric spacing, radius, typography, duration, easing, and elevation values. The legacy
|
|
@@ -347,6 +364,20 @@ same-origin iframe documents.
|
|
|
347
364
|
Data-mode collections preserve iframe keyboard focus across distant scrolling and keyed updates,
|
|
348
365
|
and return focus to the list when the focused record is removed.
|
|
349
366
|
|
|
367
|
+
## Floating panel placement
|
|
368
|
+
|
|
369
|
+
`connectLumenFloatingPanel(panel, trigger, { onDismiss })` shows a panel anchored to its trigger. When the
|
|
370
|
+
Popover API exists the panel enters the top layer, so scrolling or transformed dialogs cannot clip it;
|
|
371
|
+
older browsers keep fixed placement. The panel flips above or below to stay in the visual viewport,
|
|
372
|
+
aligns to the trigger's logical start or end in RTL, and follows scroll, resize, and enclosing transform
|
|
373
|
+
transitions or animations once they settle. `onDismiss` runs when focus moves outside the panel and
|
|
374
|
+
trigger, when the trigger's containing dialog closes, or when the trigger or panel leaves the document.
|
|
375
|
+
Pass `placement`, `offset`, `collisionPadding`, or an `initialFocus` selector when needed. Connecting
|
|
376
|
+
makes the panel visible, and the caller owns hiding it again: on dismissal, set your closed state and hide the
|
|
377
|
+
panel, then call the returned cleanup. Cleanup leaves the top layer, returns owned focus to the trigger
|
|
378
|
+
without stealing focus handed elsewhere, restores the panel's inline styles and popover attributes, and
|
|
379
|
+
removes every listener and observer. React, Astro, and Elements date pickers and React menus share this helper.
|
|
380
|
+
|
|
350
381
|
## Virtual collections and direction
|
|
351
382
|
|
|
352
383
|
`createLumenVirtualCollectionController(root, { items, getKey, renderItem, itemSize, overscan })`
|
package/dist/anchor.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Keep literal percent signs usable while decoding ordinary URL fragments. */
|
|
2
|
+
export declare const decodeLumenAnchorFragment: (fragment: string) => string;
|
|
3
|
+
/** Selects a document heading using its native fragment landing line. Returns -1 for no targets. */
|
|
4
|
+
export declare const getLumenActiveAnchorIndex: (targets: readonly HTMLElement[], activationOffset?: number) => number;
|
|
5
|
+
//# sourceMappingURL=anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../src/anchor.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,GAAI,UAAU,MAAM,KAAG,MAM5D,CAAA;AAwDD,oGAAoG;AACpG,eAAO,MAAM,yBAAyB,GACpC,SAAS,SAAS,WAAW,EAAE,EAC/B,yBAAoB,KACnB,MA0BF,CAAA"}
|
package/dist/anchor.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Keep literal percent signs usable while decoding ordinary URL fragments. */
|
|
2
|
+
export const decodeLumenAnchorFragment = (fragment) => {
|
|
3
|
+
try {
|
|
4
|
+
return decodeURIComponent(fragment);
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return fragment;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const measuredPadding = new WeakMap();
|
|
11
|
+
const scrollLength = (value, basis) => {
|
|
12
|
+
const amount = Number.parseFloat(value ?? '');
|
|
13
|
+
if (!Number.isFinite(amount))
|
|
14
|
+
return 0;
|
|
15
|
+
return value?.trim().endsWith('%') ? amount * basis / 100 : amount;
|
|
16
|
+
};
|
|
17
|
+
const getScrollPadding = (owner, scrollingElement) => {
|
|
18
|
+
const view = owner.defaultView;
|
|
19
|
+
if (!view)
|
|
20
|
+
return 0;
|
|
21
|
+
const value = view.getComputedStyle(scrollingElement).scrollPaddingTop;
|
|
22
|
+
const basis = scrollingElement.clientHeight;
|
|
23
|
+
if (!value || value === 'auto' || Number.isFinite(Number.parseFloat(value)))
|
|
24
|
+
return scrollLength(value, basis);
|
|
25
|
+
// Let the CSS engine resolve mixed percentage/length math instead of maintaining a CSS parser.
|
|
26
|
+
const key = `${value}:${basis}:${view.innerWidth}`;
|
|
27
|
+
const cached = measuredPadding.get(owner);
|
|
28
|
+
if (cached?.key === key)
|
|
29
|
+
return cached.value;
|
|
30
|
+
const container = owner.createElement('div');
|
|
31
|
+
const probe = owner.createElement('div');
|
|
32
|
+
container.style.cssText = `all:initial;position:fixed;top:0;left:0;width:0;height:${basis}px;contain:strict;visibility:hidden;pointer-events:none`;
|
|
33
|
+
probe.style.cssText = 'all:initial;display:block;width:0;min-height:0;max-height:none;padding:0;border:0;margin:0';
|
|
34
|
+
probe.style.height = value;
|
|
35
|
+
container.append(probe);
|
|
36
|
+
owner.documentElement.append(container);
|
|
37
|
+
const resolved = scrollLength(view.getComputedStyle(probe).height, basis);
|
|
38
|
+
container.remove();
|
|
39
|
+
measuredPadding.set(owner, { key, value: resolved });
|
|
40
|
+
return resolved;
|
|
41
|
+
};
|
|
42
|
+
const atDocumentEnd = (scrollingElement) => {
|
|
43
|
+
const maximum = scrollingElement.scrollHeight - scrollingElement.clientHeight;
|
|
44
|
+
return maximum > 0 && scrollingElement.scrollTop > 0 && scrollingElement.scrollTop >= maximum - 1;
|
|
45
|
+
};
|
|
46
|
+
/** Selects a document heading using its native fragment landing line. Returns -1 for no targets. */
|
|
47
|
+
export const getLumenActiveAnchorIndex = (targets, activationOffset = 0) => {
|
|
48
|
+
const owner = targets[0]?.ownerDocument;
|
|
49
|
+
if (!owner)
|
|
50
|
+
return -1;
|
|
51
|
+
const scrollingElement = owner.scrollingElement ?? owner.documentElement;
|
|
52
|
+
if (atDocumentEnd(scrollingElement))
|
|
53
|
+
return targets.length - 1;
|
|
54
|
+
const view = owner.defaultView;
|
|
55
|
+
const minimum = Number.isFinite(activationOffset) ? Math.max(0, activationOffset) : 0;
|
|
56
|
+
const padding = getScrollPadding(owner, scrollingElement);
|
|
57
|
+
let active = 0;
|
|
58
|
+
for (const [index, target] of targets.entries()) {
|
|
59
|
+
// Read live styles: text resizing, responsive headers, and target classes can change the landing line.
|
|
60
|
+
const margin = scrollLength(view?.getComputedStyle(target).scrollMarginTop, 0);
|
|
61
|
+
const landingLine = Math.max(minimum, padding + margin);
|
|
62
|
+
// Native fragment scrolling can round a fractional landing position to the next CSS pixel.
|
|
63
|
+
if (target.getBoundingClientRect().top > landingLine + 1)
|
|
64
|
+
break;
|
|
65
|
+
active = index;
|
|
66
|
+
}
|
|
67
|
+
return active;
|
|
68
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type LumenFloatingPanelPlacement = 'bottom-end' | 'bottom-start' | 'top-end' | 'top-start';
|
|
2
|
+
export interface LumenFloatingPanelOptions {
|
|
3
|
+
/** Logical alignment follows the trigger's inherited text direction. */
|
|
4
|
+
placement?: LumenFloatingPanelPlacement | undefined;
|
|
5
|
+
offset?: number | undefined;
|
|
6
|
+
collisionPadding?: number | undefined;
|
|
7
|
+
/** Focus the first matching element inside the panel after it opens. A malformed selector skips focus. */
|
|
8
|
+
initialFocus?: string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Called when the panel should close: focus moves outside, its containing dialog closes, or the trigger
|
|
11
|
+
* or panel leaves the document. The caller hides the panel and calls the cleanup.
|
|
12
|
+
*/
|
|
13
|
+
onDismiss: () => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Shows `panel` anchored to `trigger`: in the top layer when the Popover API exists, otherwise fixed. The
|
|
17
|
+
* panel follows scroll, resize, visual viewport, and enclosing animation changes, flips to stay visible,
|
|
18
|
+
* honors RTL, and calls `onDismiss` on outside focus, when its containing dialog closes, or when the trigger
|
|
19
|
+
* or panel leaves the document. Connecting makes the panel visible; the caller owns hiding it again. The returned
|
|
20
|
+
* cleanup leaves the top layer, returns owned focus to the trigger, restores the panel's previous inline
|
|
21
|
+
* styles and popover attributes, and removes every listener and observer.
|
|
22
|
+
*/
|
|
23
|
+
export declare const connectLumenFloatingPanel: (panel: HTMLElement, trigger: HTMLElement, { placement, offset, collisionPadding, initialFocus, onDismiss }: LumenFloatingPanelOptions) => (() => void);
|
|
24
|
+
//# sourceMappingURL=floating-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../src/floating-panel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,GAAG,WAAW,CAAA;AAEjG,MAAM,WAAW,yBAAyB;IACxC,wEAAwE;IACxE,SAAS,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAA;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,0GAA0G;IAC1G,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AA4MD;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,WAAW,EAClB,SAAS,WAAW,EACpB,kEAAmF,yBAAyB,KAC3G,CAAC,MAAM,IAAI,CA8Db,CAAA"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
const finiteDistance = (value, fallback) => {
|
|
2
|
+
if (value === undefined || !Number.isFinite(value))
|
|
3
|
+
return fallback;
|
|
4
|
+
return Math.max(0, value);
|
|
5
|
+
};
|
|
6
|
+
const clamp = (value, minimum, maximum) => {
|
|
7
|
+
const upperBound = Math.max(minimum, maximum);
|
|
8
|
+
return Math.max(minimum, Math.min(value, upperBound));
|
|
9
|
+
};
|
|
10
|
+
const styleKeys = [
|
|
11
|
+
'box-sizing',
|
|
12
|
+
'position',
|
|
13
|
+
'inset',
|
|
14
|
+
'left',
|
|
15
|
+
'top',
|
|
16
|
+
'right',
|
|
17
|
+
'bottom',
|
|
18
|
+
'margin',
|
|
19
|
+
'max-width',
|
|
20
|
+
'max-height',
|
|
21
|
+
'overflow-y'
|
|
22
|
+
];
|
|
23
|
+
const viewportBounds = ({ view, padding }) => {
|
|
24
|
+
const viewport = view.visualViewport;
|
|
25
|
+
const left = (viewport?.offsetLeft ?? 0) + padding;
|
|
26
|
+
const top = (viewport?.offsetTop ?? 0) + padding;
|
|
27
|
+
const width = Math.max(0, (viewport?.width ?? view.innerWidth) - padding * 2);
|
|
28
|
+
const height = Math.max(0, (viewport?.height ?? view.innerHeight) - padding * 2);
|
|
29
|
+
return { left, top, width, height, right: left + width, bottom: top + height };
|
|
30
|
+
};
|
|
31
|
+
const shouldPlaceBelow = (placement, above, below, height) => placement.startsWith('bottom') ? below >= height || below >= above : !(above >= height || above >= below);
|
|
32
|
+
const positionPanel = (context) => {
|
|
33
|
+
const { panel, trigger, view, placement, gap } = context;
|
|
34
|
+
const viewport = viewportBounds(context);
|
|
35
|
+
const anchor = trigger.getBoundingClientRect();
|
|
36
|
+
panel.style.boxSizing = 'border-box';
|
|
37
|
+
panel.style.position = 'fixed';
|
|
38
|
+
panel.style.inset = 'auto';
|
|
39
|
+
panel.style.margin = '0';
|
|
40
|
+
panel.style.maxWidth = `${viewport.width}px`;
|
|
41
|
+
panel.style.maxHeight = `${viewport.height}px`;
|
|
42
|
+
panel.style.overflowY = 'auto';
|
|
43
|
+
const below = Math.max(0, viewport.bottom - anchor.bottom - gap);
|
|
44
|
+
const above = Math.max(0, anchor.top - viewport.top - gap);
|
|
45
|
+
const placeBelow = shouldPlaceBelow(placement, above, below, panel.getBoundingClientRect().height);
|
|
46
|
+
const availableHeight = placeBelow ? below : above;
|
|
47
|
+
panel.style.maxHeight = `${Math.min(viewport.height, availableHeight || viewport.height)}px`;
|
|
48
|
+
const bounds = panel.getBoundingClientRect();
|
|
49
|
+
const rtl = view.getComputedStyle(trigger).direction === 'rtl';
|
|
50
|
+
const alignRight = placement.endsWith('end') !== rtl;
|
|
51
|
+
const x = alignRight ? anchor.right - bounds.width : anchor.left;
|
|
52
|
+
const y = placeBelow ? anchor.bottom + gap : anchor.top - bounds.height - gap;
|
|
53
|
+
const alignment = placement.endsWith('end') ? 'end' : 'start';
|
|
54
|
+
panel.style.left = `${clamp(x, viewport.left, viewport.right - bounds.width)}px`;
|
|
55
|
+
panel.style.top = `${clamp(y, viewport.top, viewport.bottom - bounds.height)}px`;
|
|
56
|
+
panel.dataset.placement = `${placeBelow ? 'bottom' : 'top'}-${alignment}`;
|
|
57
|
+
};
|
|
58
|
+
// Transform transitions and animations move the trigger without resizing it, so ResizeObserver stays quiet.
|
|
59
|
+
const settleEvents = ['animationend', 'animationcancel', 'transitionend', 'transitioncancel'];
|
|
60
|
+
const observePosition = (context, dismiss) => {
|
|
61
|
+
const { panel, trigger, view } = context;
|
|
62
|
+
const document = panel.ownerDocument;
|
|
63
|
+
const NodeType = view.Node;
|
|
64
|
+
const dialog = trigger.closest('dialog');
|
|
65
|
+
const position = () => {
|
|
66
|
+
positionPanel(context);
|
|
67
|
+
};
|
|
68
|
+
const focusOutside = (event) => {
|
|
69
|
+
if (event.target instanceof NodeType &&
|
|
70
|
+
!panel.contains(event.target) && !trigger.contains(event.target))
|
|
71
|
+
dismiss();
|
|
72
|
+
};
|
|
73
|
+
const scroll = (event) => {
|
|
74
|
+
if (!(event.target instanceof NodeType) || !panel.contains(event.target))
|
|
75
|
+
position();
|
|
76
|
+
};
|
|
77
|
+
const observer = typeof view.ResizeObserver === 'function' ? new view.ResizeObserver(position) : undefined;
|
|
78
|
+
// Removing an open panel's owner must not leave document listeners or an expanded trigger behind.
|
|
79
|
+
const removal = typeof view.MutationObserver === 'function' ?
|
|
80
|
+
new view.MutationObserver(() => {
|
|
81
|
+
if (!trigger.isConnected || !panel.isConnected ||
|
|
82
|
+
trigger.ownerDocument !== document || panel.ownerDocument !== document)
|
|
83
|
+
dismiss();
|
|
84
|
+
}) :
|
|
85
|
+
undefined;
|
|
86
|
+
removal?.observe(document, { childList: true, subtree: true });
|
|
87
|
+
observer?.observe(trigger);
|
|
88
|
+
observer?.observe(panel);
|
|
89
|
+
document.addEventListener('focusin', focusOutside);
|
|
90
|
+
document.addEventListener('scroll', scroll, true);
|
|
91
|
+
for (const type of settleEvents)
|
|
92
|
+
document.addEventListener(type, position, true);
|
|
93
|
+
// Some engines move focus to the body without a focusin when a containing dialog closes.
|
|
94
|
+
dialog?.addEventListener('close', dismiss);
|
|
95
|
+
view.addEventListener('resize', position);
|
|
96
|
+
view.visualViewport?.addEventListener('resize', position);
|
|
97
|
+
view.visualViewport?.addEventListener('scroll', position);
|
|
98
|
+
return () => {
|
|
99
|
+
observer?.disconnect();
|
|
100
|
+
removal?.disconnect();
|
|
101
|
+
document.removeEventListener('focusin', focusOutside);
|
|
102
|
+
document.removeEventListener('scroll', scroll, true);
|
|
103
|
+
for (const type of settleEvents)
|
|
104
|
+
document.removeEventListener(type, position, true);
|
|
105
|
+
dialog?.removeEventListener('close', dismiss);
|
|
106
|
+
view.removeEventListener('resize', position);
|
|
107
|
+
view.visualViewport?.removeEventListener('resize', position);
|
|
108
|
+
view.visualViewport?.removeEventListener('scroll', position);
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
const restoreExternalFocus = (owner, focused) => {
|
|
112
|
+
const ElementType = owner.defaultView?.HTMLElement;
|
|
113
|
+
if (ElementType && focused instanceof ElementType && focused.isConnected && owner.activeElement !== focused) {
|
|
114
|
+
focused.focus({ preventScroll: true });
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const restoreFocus = (panel, trigger, topLayer) => {
|
|
118
|
+
const document = panel.ownerDocument;
|
|
119
|
+
const focused = document.activeElement;
|
|
120
|
+
const ownedFocus = focused !== null && panel.contains(focused);
|
|
121
|
+
if (topLayer && panel.matches(':popover-open'))
|
|
122
|
+
panel.hidePopover();
|
|
123
|
+
if (ownedFocus && trigger.isConnected)
|
|
124
|
+
trigger.focus({ preventScroll: true });
|
|
125
|
+
// Closing a panel must not steal focus from a dialog opened by its action.
|
|
126
|
+
if (!ownedFocus)
|
|
127
|
+
restoreExternalFocus(document, focused);
|
|
128
|
+
};
|
|
129
|
+
const restoreAttribute = (panel, name, value) => {
|
|
130
|
+
if (value === null)
|
|
131
|
+
panel.removeAttribute(name);
|
|
132
|
+
else
|
|
133
|
+
panel.setAttribute(name, value);
|
|
134
|
+
};
|
|
135
|
+
// A malformed selector must not abort after the panel is shown, so it is resolved first and only skips focus.
|
|
136
|
+
const findInitialFocus = (panel, view, selector) => {
|
|
137
|
+
if (!selector)
|
|
138
|
+
return null;
|
|
139
|
+
try {
|
|
140
|
+
return panel.querySelector(selector);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof view.DOMException && error.name === 'SyntaxError')
|
|
144
|
+
return null;
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Shows `panel` anchored to `trigger`: in the top layer when the Popover API exists, otherwise fixed. The
|
|
150
|
+
* panel follows scroll, resize, visual viewport, and enclosing animation changes, flips to stay visible,
|
|
151
|
+
* honors RTL, and calls `onDismiss` on outside focus, when its containing dialog closes, or when the trigger
|
|
152
|
+
* or panel leaves the document. Connecting makes the panel visible; the caller owns hiding it again. The returned
|
|
153
|
+
* cleanup leaves the top layer, returns owned focus to the trigger, restores the panel's previous inline
|
|
154
|
+
* styles and popover attributes, and removes every listener and observer.
|
|
155
|
+
*/
|
|
156
|
+
export const connectLumenFloatingPanel = (panel, trigger, { placement = 'bottom-start', offset, collisionPadding, initialFocus, onDismiss }) => {
|
|
157
|
+
const view = panel.ownerDocument.defaultView;
|
|
158
|
+
if (!view)
|
|
159
|
+
return () => undefined;
|
|
160
|
+
const context = {
|
|
161
|
+
panel,
|
|
162
|
+
trigger,
|
|
163
|
+
view,
|
|
164
|
+
placement,
|
|
165
|
+
gap: finiteDistance(offset, 6),
|
|
166
|
+
padding: finiteDistance(collisionPadding, 8)
|
|
167
|
+
};
|
|
168
|
+
const focusTarget = findInitialFocus(panel, view, initialFocus);
|
|
169
|
+
const previousPopover = panel.getAttribute('popover');
|
|
170
|
+
const previousPlacement = panel.getAttribute('data-placement');
|
|
171
|
+
const previousStyles = styleKeys.map(key => [
|
|
172
|
+
key, panel.style.getPropertyValue(key), panel.style.getPropertyPriority(key)
|
|
173
|
+
]);
|
|
174
|
+
const topLayer = typeof panel.showPopover === 'function';
|
|
175
|
+
panel.hidden = false;
|
|
176
|
+
if (topLayer) {
|
|
177
|
+
panel.setAttribute('popover', 'manual');
|
|
178
|
+
panel.showPopover();
|
|
179
|
+
}
|
|
180
|
+
positionPanel(context);
|
|
181
|
+
focusTarget?.focus({ preventScroll: true });
|
|
182
|
+
let connected = true;
|
|
183
|
+
const dismiss = () => {
|
|
184
|
+
if (connected)
|
|
185
|
+
onDismiss();
|
|
186
|
+
};
|
|
187
|
+
const stopObserving = observePosition(context, dismiss);
|
|
188
|
+
return () => {
|
|
189
|
+
if (!connected)
|
|
190
|
+
return;
|
|
191
|
+
connected = false;
|
|
192
|
+
stopObserving();
|
|
193
|
+
restoreFocus(panel, trigger, topLayer);
|
|
194
|
+
restoreAttribute(panel, 'popover', previousPopover);
|
|
195
|
+
restoreAttribute(panel, 'data-placement', previousPlacement);
|
|
196
|
+
for (const [key, value, priority] of previousStyles) {
|
|
197
|
+
if (value)
|
|
198
|
+
panel.style.setProperty(key, value, priority);
|
|
199
|
+
else
|
|
200
|
+
panel.style.removeProperty(key);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './ai-surfaces.js';
|
|
2
2
|
export { createLumenAmountFieldController, formatLumenAmountDraft, getLumenAmountValue, type LumenAmountChangeDetail, type LumenAmountFieldController, type LumenAmountOptions, parseLumenAmountDraft } from './amount-field.js';
|
|
3
|
+
export { decodeLumenAnchorFragment, getLumenActiveAnchorIndex } from './anchor.js';
|
|
3
4
|
export { createLumenAttachmentPreviewController, type LumenAttachmentPreviewController, type LumenAttachmentPreviewLabels, lumenAttachmentPreviewLabels, type LumenAttachmentPreviewState, resolveLumenAttachmentPreviewState } from './attachments.js';
|
|
4
5
|
export { createLumenBulletGeometry, type LumenBulletOptions, type LumenBulletRange } from './bullet-chart.js';
|
|
5
6
|
export * from './chart-interaction.js';
|
|
@@ -19,12 +20,14 @@ export { getLumenDirectionalKey } from './direction.js';
|
|
|
19
20
|
export { type LumenErrorStateAnnouncement, lumenErrorStateAnnouncements, type LumenErrorStateContent, type LumenErrorStateKind, lumenErrorStateKinds, type LumenErrorStateLayout, lumenErrorStateLayouts } from './error-state.js';
|
|
20
21
|
export * from './extended-charts.js';
|
|
21
22
|
export { createFigmaVariableName, exportThemeDesignTokens, exportThemeFigmaVariables, hslTokenToFigmaColor, hslTokenToHexColor, type LumenDesignToken, type LumenDesignTokenExport, type LumenDesignTokenType, type LumenEffectDesignToken, type LumenFigmaColorValue, type LumenFigmaVariable, type LumenFigmaVariableCollection, type LumenFigmaVariableExportOptions, type LumenFigmaVariableMode, type LumenStructureDesignToken } from './figma.js';
|
|
23
|
+
export { connectLumenFloatingPanel, type LumenFloatingPanelOptions, type LumenFloatingPanelPlacement } from './floating-panel.js';
|
|
22
24
|
export { createLumenFormFailure, createLumenFormSuccess, getLumenFieldErrors, type LumenFieldError, type LumenFormErrorInput, type LumenFormErrors, type LumenFormFailure, type LumenFormResult, type LumenFormStatus, lumenFormStatuses, type LumenFormSuccess, normalizeLumenFormErrors } from './forms.js';
|
|
23
25
|
export { getLumenIcon, getLumenIconPack, getRegisteredLumenIconNames, type LumenIconData, type LumenIconName, lumenIconNames, type LumenIconNode, type LumenIconPack, lumenIcons, type LumenIconStyle, registerLumenIconPack, renderLumenIconSvg, resolveLumenIconName } from './icons.js';
|
|
24
26
|
export { type LumenIllustrationElement, type LumenIllustrationName, lumenIllustrationNames, lumenIllustrations, type LumenIllustrationToneRole, renderLumenIllustrationSvg } from './illustrations.generated.js';
|
|
25
27
|
export { formatLumenImageComparisonValue, type LumenImageComparisonChangeDetail, type LumenImageComparisonChangeEvent, type LumenImageComparisonMode, normalizeLumenImageComparisonMode, normalizeLumenImageComparisonRatio, normalizeLumenImageComparisonValue, syncLumenImageComparisonMode } from './image-comparison.js';
|
|
26
28
|
export { createLumenKanbanMoveDetail, getAdjacentKanbanColumn, type LumenKanbanMoveDetail, type LumenKanbanMoveInput } from './kanban.js';
|
|
27
29
|
export { formatLumenLanguageLabel, getLumenLocalePair, lumenDefaultLocales, type LumenLocaleOption, normalizeLumenLocales } from './language.js';
|
|
30
|
+
export { type LumenLoadingSemantics, type LumenLoadingSemanticsInput, type LumenProgressState, type LumenSkeletonAnimation, lumenSkeletonAnimations, type LumenSkeletonShape, lumenSkeletonShapes, type LumenSkeletonSize, normalizeLumenProgress, resolveLumenLoadingSemantics, resolveLumenSkeletonAnimation, resolveLumenSkeletonShape, resolveLumenSkeletonSize } from './loading.js';
|
|
28
31
|
export { bindLumenMediaViewport, formatLumenMediaZoom, isLumenMediaViewportAction, lumenMediaViewportActions, type LumenMediaViewportLabels, lumenMediaViewportLabels, syncLumenMediaViewport } from './media-viewport.js';
|
|
29
32
|
export { applyLumenMediaViewportAction, type LumenMediaIdentity, type LumenMediaViewportAction, type LumenMediaViewportValue, moveLumenMediaItem, normalizeLumenMediaViewport, panLumenMediaViewport, resolveLumenMediaMaxZoom, resolveLumenMediaSelection, toggleLumenMediaSelection } from './media-workspace.js';
|
|
30
33
|
export { createLumenMessageScrollerController, type LumenMessageScrollerController, type LumenMessageScrollerOptions, type LumenMessageScrollState } from './message-scroller.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './ai-surfaces.js';
|
|
2
2
|
export { createLumenAmountFieldController, formatLumenAmountDraft, getLumenAmountValue, parseLumenAmountDraft } from './amount-field.js';
|
|
3
|
+
export { decodeLumenAnchorFragment, getLumenActiveAnchorIndex } from './anchor.js';
|
|
3
4
|
export { createLumenAttachmentPreviewController, lumenAttachmentPreviewLabels, resolveLumenAttachmentPreviewState } from './attachments.js';
|
|
4
5
|
export { createLumenBulletGeometry } from './bullet-chart.js';
|
|
5
6
|
export * from './chart-interaction.js';
|
|
@@ -19,12 +20,14 @@ export { getLumenDirectionalKey } from './direction.js';
|
|
|
19
20
|
export { lumenErrorStateAnnouncements, lumenErrorStateKinds, lumenErrorStateLayouts } from './error-state.js';
|
|
20
21
|
export * from './extended-charts.js';
|
|
21
22
|
export { createFigmaVariableName, exportThemeDesignTokens, exportThemeFigmaVariables, hslTokenToFigmaColor, hslTokenToHexColor } from './figma.js';
|
|
23
|
+
export { connectLumenFloatingPanel } from './floating-panel.js';
|
|
22
24
|
export { createLumenFormFailure, createLumenFormSuccess, getLumenFieldErrors, lumenFormStatuses, normalizeLumenFormErrors } from './forms.js';
|
|
23
25
|
export { getLumenIcon, getLumenIconPack, getRegisteredLumenIconNames, lumenIconNames, lumenIcons, registerLumenIconPack, renderLumenIconSvg, resolveLumenIconName } from './icons.js';
|
|
24
26
|
export { lumenIllustrationNames, lumenIllustrations, renderLumenIllustrationSvg } from './illustrations.generated.js';
|
|
25
27
|
export { formatLumenImageComparisonValue, normalizeLumenImageComparisonMode, normalizeLumenImageComparisonRatio, normalizeLumenImageComparisonValue, syncLumenImageComparisonMode } from './image-comparison.js';
|
|
26
28
|
export { createLumenKanbanMoveDetail, getAdjacentKanbanColumn } from './kanban.js';
|
|
27
29
|
export { formatLumenLanguageLabel, getLumenLocalePair, lumenDefaultLocales, normalizeLumenLocales } from './language.js';
|
|
30
|
+
export { lumenSkeletonAnimations, lumenSkeletonShapes, normalizeLumenProgress, resolveLumenLoadingSemantics, resolveLumenSkeletonAnimation, resolveLumenSkeletonShape, resolveLumenSkeletonSize } from './loading.js';
|
|
28
31
|
export { bindLumenMediaViewport, formatLumenMediaZoom, isLumenMediaViewportAction, lumenMediaViewportActions, lumenMediaViewportLabels, syncLumenMediaViewport } from './media-viewport.js';
|
|
29
32
|
export { applyLumenMediaViewportAction, moveLumenMediaItem, normalizeLumenMediaViewport, panLumenMediaViewport, resolveLumenMediaMaxZoom, resolveLumenMediaSelection, toggleLumenMediaSelection } from './media-workspace.js';
|
|
30
33
|
export { createLumenMessageScrollerController } from './message-scroller.js';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const lumenSkeletonShapes: readonly ["rectangle", "text", "circle"];
|
|
2
|
+
export type LumenSkeletonShape = (typeof lumenSkeletonShapes)[number];
|
|
3
|
+
export declare const lumenSkeletonAnimations: readonly ["shimmer", "pulse", "none"];
|
|
4
|
+
export type LumenSkeletonAnimation = (typeof lumenSkeletonAnimations)[number];
|
|
5
|
+
export type LumenSkeletonSize = number | string;
|
|
6
|
+
export interface LumenProgressState {
|
|
7
|
+
max: number;
|
|
8
|
+
percentage: number;
|
|
9
|
+
value: number;
|
|
10
|
+
}
|
|
11
|
+
export interface LumenLoadingSemanticsInput {
|
|
12
|
+
ariaHidden?: boolean | string | null | undefined;
|
|
13
|
+
ariaLabel?: string | null | undefined;
|
|
14
|
+
ariaLabelledby?: string | null | undefined;
|
|
15
|
+
role?: string | null | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface LumenLoadingSemantics {
|
|
18
|
+
ariaHidden: 'true' | undefined;
|
|
19
|
+
role: 'status' | undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Normalizes progress input to finite ARIA values. Non-finite or non-positive maxima fall back to
|
|
23
|
+
* 100, and missing or non-finite values fall back to 0 before clamping.
|
|
24
|
+
*/
|
|
25
|
+
export declare const normalizeLumenProgress: (max?: unknown, value?: unknown) => LumenProgressState;
|
|
26
|
+
export declare const resolveLumenSkeletonShape: (value: unknown) => LumenSkeletonShape;
|
|
27
|
+
export declare const resolveLumenSkeletonAnimation: (value: unknown) => LumenSkeletonAnimation;
|
|
28
|
+
export declare const resolveLumenSkeletonSize: (value: unknown) => string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Loading indicators are decorative unless named. A named indicator becomes a status region, and
|
|
31
|
+
* explicit `aria-hidden` or `role` values always win.
|
|
32
|
+
*/
|
|
33
|
+
export declare const resolveLumenLoadingSemantics: ({ ariaHidden, ariaLabel, ariaLabelledby, role }: LumenLoadingSemanticsInput) => LumenLoadingSemantics;
|
|
34
|
+
//# sourceMappingURL=loading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../src/loading.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,0CAA2C,CAAA;AAE3E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,eAAO,MAAM,uBAAuB,uCAAwC,CAAA;AAE5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7E,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAA;AAE/C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACrC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC3B;AAeD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,OAAO,EAAE,QAAQ,OAAO,KAAG,kBAMvE,CAAA;AAED,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,KAAG,kBAE1D,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,sBAE9D,CAAA;AA6BD,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAYlE,CAAA;AAKD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GAAI,iDAK1C,0BAA0B,KAAG,qBAS/B,CAAA"}
|
package/dist/loading.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export const lumenSkeletonShapes = ['rectangle', 'text', 'circle'];
|
|
2
|
+
export const lumenSkeletonAnimations = ['shimmer', 'pulse', 'none'];
|
|
3
|
+
const defaultProgressMax = 100;
|
|
4
|
+
const maxSizeLength = 64;
|
|
5
|
+
const toFiniteNumber = (value) => {
|
|
6
|
+
if (typeof value === 'number')
|
|
7
|
+
return Number.isFinite(value) ? value : undefined;
|
|
8
|
+
if (typeof value !== 'string' || !value.trim())
|
|
9
|
+
return undefined;
|
|
10
|
+
const parsed = Number(value);
|
|
11
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Normalizes progress input to finite ARIA values. Non-finite or non-positive maxima fall back to
|
|
15
|
+
* 100, and missing or non-finite values fall back to 0 before clamping.
|
|
16
|
+
*/
|
|
17
|
+
export const normalizeLumenProgress = (max, value) => {
|
|
18
|
+
const finiteMax = toFiniteNumber(max);
|
|
19
|
+
const safeMax = finiteMax !== undefined && finiteMax > 0 ? finiteMax : defaultProgressMax;
|
|
20
|
+
const safeValue = Math.min(safeMax, Math.max(0, toFiniteNumber(value) ?? 0));
|
|
21
|
+
return { max: safeMax, percentage: (safeValue / safeMax) * 100, value: safeValue };
|
|
22
|
+
};
|
|
23
|
+
export const resolveLumenSkeletonShape = (value) => (lumenSkeletonShapes.find(shape => shape === value) ?? 'rectangle');
|
|
24
|
+
export const resolveLumenSkeletonAnimation = (value) => (lumenSkeletonAnimations.find(animation => animation === value) ?? 'shimmer');
|
|
25
|
+
// Letters keep their case because custom property names in var() are case-sensitive.
|
|
26
|
+
const isSafeSizeCharacter = (character) => ((character >= 'a' && character <= 'z') ||
|
|
27
|
+
(character >= 'A' && character <= 'Z') ||
|
|
28
|
+
(character >= '0' && character <= '9') ||
|
|
29
|
+
'%.+-*/(), _'.includes(character));
|
|
30
|
+
/**
|
|
31
|
+
* Resolves a Skeleton width or height to a CSS length. Finite non-negative numbers become pixels;
|
|
32
|
+
* strings may be lengths, percentages, or math and `var()` expressions, limited to ASCII letters,
|
|
33
|
+
* digits, and math characters so they cannot add declarations.
|
|
34
|
+
*/
|
|
35
|
+
const toPixelSize = (value) => (Number.isFinite(value) && value >= 0 ? `${value}px` : undefined);
|
|
36
|
+
const isSafeSizeExpression = (size) => {
|
|
37
|
+
if (!size || size.length > maxSizeLength)
|
|
38
|
+
return false;
|
|
39
|
+
for (const character of size) {
|
|
40
|
+
if (!isSafeSizeCharacter(character))
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
};
|
|
45
|
+
export const resolveLumenSkeletonSize = (value) => {
|
|
46
|
+
if (typeof value === 'number')
|
|
47
|
+
return toPixelSize(value);
|
|
48
|
+
if (typeof value !== 'string')
|
|
49
|
+
return undefined;
|
|
50
|
+
const size = value.trim();
|
|
51
|
+
if (!isSafeSizeExpression(size))
|
|
52
|
+
return undefined;
|
|
53
|
+
const pixels = toFiniteNumber(size);
|
|
54
|
+
return pixels === undefined ? size : toPixelSize(pixels);
|
|
55
|
+
};
|
|
56
|
+
// Names come from untyped markup and props at runtime, so only non-blank strings count.
|
|
57
|
+
const hasAccessibleNameText = (value) => typeof value === 'string' && value.trim() !== '';
|
|
58
|
+
/**
|
|
59
|
+
* Loading indicators are decorative unless named. A named indicator becomes a status region, and
|
|
60
|
+
* explicit `aria-hidden` or `role` values always win.
|
|
61
|
+
*/
|
|
62
|
+
export const resolveLumenLoadingSemantics = ({ ariaHidden, ariaLabel, ariaLabelledby, role }) => {
|
|
63
|
+
const isNamed = hasAccessibleNameText(ariaLabel) || hasAccessibleNameText(ariaLabelledby);
|
|
64
|
+
const hasExplicitHidden = ariaHidden !== undefined && ariaHidden !== null;
|
|
65
|
+
const hasExplicitRole = role !== undefined && role !== null;
|
|
66
|
+
return {
|
|
67
|
+
ariaHidden: hasExplicitHidden || isNamed ? undefined : 'true',
|
|
68
|
+
role: hasExplicitRole || !isNamed ? undefined : 'status'
|
|
69
|
+
};
|
|
70
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@santi020k/lumen-core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"libphonenumber-js": "^1.13.14"
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
|
-
"@rive-app/canvas": "2.
|
|
120
|
+
"@rive-app/canvas": "2.45.0",
|
|
121
121
|
"@vitest/coverage-v8": "^5.0.3",
|
|
122
122
|
"jsdom": "^30.1.1",
|
|
123
123
|
"typescript": "~6.0.3",
|