@santi020k/lumen-core 4.0.0 → 4.1.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 CHANGED
@@ -73,6 +73,13 @@ It also publishes shared web behavior contracts such as `LumenTabsChangeDetail`
73
73
  `LumenTabsChangeEvent`. Import them from the root or `@santi020k/lumen-core/tabs` when application
74
74
  code listens for `ui:tabs-change`.
75
75
 
76
+ Loading helpers are available from the root export for custom web adapters:
77
+ `normalizeLumenProgress(max, value)` produces finite, clamped progress values;
78
+ `resolveLumenSkeletonShape`, `resolveLumenSkeletonAnimation`, and `resolveLumenSkeletonSize`
79
+ normalize placeholder options. Numeric sizes become pixels, and bounded CSS size expressions retain
80
+ custom-property casing. `resolveLumenLoadingSemantics` supplies decorative or named status defaults;
81
+ adapters must preserve explicit consumer ARIA attributes when applying those defaults.
82
+
76
83
  Cross-platform foundations originate in `tokens/lumen.tokens.json` and are published as
77
84
  `@santi020k/lumen-tokens`. Core also exports generated hexadecimal light/dark palettes and native
78
85
  numeric spacing, radius, typography, duration, easing, and elevation values. The legacy
@@ -347,6 +354,20 @@ same-origin iframe documents.
347
354
  Data-mode collections preserve iframe keyboard focus across distant scrolling and keyed updates,
348
355
  and return focus to the list when the focused record is removed.
349
356
 
357
+ ## Floating panel placement
358
+
359
+ `connectLumenFloatingPanel(panel, trigger, { onDismiss })` shows a panel anchored to its trigger. When the
360
+ Popover API exists the panel enters the top layer, so scrolling or transformed dialogs cannot clip it;
361
+ older browsers keep fixed placement. The panel flips above or below to stay in the visual viewport,
362
+ aligns to the trigger's logical start or end in RTL, and follows scroll, resize, and enclosing transform
363
+ transitions or animations once they settle. `onDismiss` runs when focus moves outside the panel and
364
+ trigger, when the trigger's containing dialog closes, or when the trigger or panel leaves the document.
365
+ Pass `placement`, `offset`, `collisionPadding`, or an `initialFocus` selector when needed. Connecting
366
+ makes the panel visible, and the caller owns hiding it again: on dismissal, set your closed state and hide the
367
+ panel, then call the returned cleanup. Cleanup leaves the top layer, returns owned focus to the trigger
368
+ without stealing focus handed elsewhere, restores the panel's inline styles and popover attributes, and
369
+ removes every listener and observer. React, Astro, and Elements date pickers and React menus share this helper.
370
+
350
371
  ## Virtual collections and direction
351
372
 
352
373
  `createLumenVirtualCollectionController(root, { items, getKey, renderItem, itemSize, overscan })`
@@ -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
@@ -19,12 +19,14 @@ export { getLumenDirectionalKey } from './direction.js';
19
19
  export { type LumenErrorStateAnnouncement, lumenErrorStateAnnouncements, type LumenErrorStateContent, type LumenErrorStateKind, lumenErrorStateKinds, type LumenErrorStateLayout, lumenErrorStateLayouts } from './error-state.js';
20
20
  export * from './extended-charts.js';
21
21
  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';
22
+ export { connectLumenFloatingPanel, type LumenFloatingPanelOptions, type LumenFloatingPanelPlacement } from './floating-panel.js';
22
23
  export { createLumenFormFailure, createLumenFormSuccess, getLumenFieldErrors, type LumenFieldError, type LumenFormErrorInput, type LumenFormErrors, type LumenFormFailure, type LumenFormResult, type LumenFormStatus, lumenFormStatuses, type LumenFormSuccess, normalizeLumenFormErrors } from './forms.js';
23
24
  export { getLumenIcon, getLumenIconPack, getRegisteredLumenIconNames, type LumenIconData, type LumenIconName, lumenIconNames, type LumenIconNode, type LumenIconPack, lumenIcons, type LumenIconStyle, registerLumenIconPack, renderLumenIconSvg, resolveLumenIconName } from './icons.js';
24
25
  export { type LumenIllustrationElement, type LumenIllustrationName, lumenIllustrationNames, lumenIllustrations, type LumenIllustrationToneRole, renderLumenIllustrationSvg } from './illustrations.generated.js';
25
26
  export { formatLumenImageComparisonValue, type LumenImageComparisonChangeDetail, type LumenImageComparisonChangeEvent, type LumenImageComparisonMode, normalizeLumenImageComparisonMode, normalizeLumenImageComparisonRatio, normalizeLumenImageComparisonValue, syncLumenImageComparisonMode } from './image-comparison.js';
26
27
  export { createLumenKanbanMoveDetail, getAdjacentKanbanColumn, type LumenKanbanMoveDetail, type LumenKanbanMoveInput } from './kanban.js';
27
28
  export { formatLumenLanguageLabel, getLumenLocalePair, lumenDefaultLocales, type LumenLocaleOption, normalizeLumenLocales } from './language.js';
29
+ export { type LumenLoadingSemantics, type LumenLoadingSemanticsInput, type LumenProgressState, type LumenSkeletonAnimation, lumenSkeletonAnimations, type LumenSkeletonShape, lumenSkeletonShapes, type LumenSkeletonSize, normalizeLumenProgress, resolveLumenLoadingSemantics, resolveLumenSkeletonAnimation, resolveLumenSkeletonShape, resolveLumenSkeletonSize } from './loading.js';
28
30
  export { bindLumenMediaViewport, formatLumenMediaZoom, isLumenMediaViewportAction, lumenMediaViewportActions, type LumenMediaViewportLabels, lumenMediaViewportLabels, syncLumenMediaViewport } from './media-viewport.js';
29
31
  export { applyLumenMediaViewportAction, type LumenMediaIdentity, type LumenMediaViewportAction, type LumenMediaViewportValue, moveLumenMediaItem, normalizeLumenMediaViewport, panLumenMediaViewport, resolveLumenMediaMaxZoom, resolveLumenMediaSelection, toggleLumenMediaSelection } from './media-workspace.js';
30
32
  export { createLumenMessageScrollerController, type LumenMessageScrollerController, type LumenMessageScrollerOptions, type LumenMessageScrollState } from './message-scroller.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,KAAK,0BAA0B,EAAE,KAAK,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAChO,OAAO,EACL,sCAAsC,EACtC,KAAK,gCAAgC,EACrC,KAAK,4BAA4B,EACjC,4BAA4B,EAC5B,KAAK,2BAA2B,EAChC,kCAAkC,EACnC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,yBAAyB,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAC7G,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,oCAAoC,EACpC,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,EACjB,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,eAAe,EACpB,KAAK,+BAA+B,EACpC,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,eAAe,EACf,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAI,KAAK,qBAAqB,EAAE,KAAK,6BAA6B,EAAE,KAAK,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACnM,OAAO,EACL,KAAK,cAAc,EACnB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,6BAA6B,EAAE,KAAK,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC3F,OAAO,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACrJ,OAAO,EACL,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,qBAAqB,EACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,eAAe,EACpB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAC/P,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EACL,KAAK,2BAA2B,EAChC,4BAA4B,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,sBAAsB,EACvB,MAAM,kBAAkB,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC/B,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,wBAAwB,EACzB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,UAAU,EACV,KAAK,cAAc,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,0BAA0B,EAC3B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,+BAA+B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,iCAAiC,EACjC,kCAAkC,EAClC,kCAAkC,EAClC,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,qBAAqB,EACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,oCAAoC,EAAE,KAAK,8BAA8B,EAAE,KAAK,2BAA2B,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACjL,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvJ,cAAc,uBAAuB,CAAA;AACrC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,2BAA2B,EAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAChD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,sBAAsB,EACvB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,4BAA4B,EAC5B,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,2BAA2B,EAAE,KAAK,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAC3J,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACxH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,EACZ,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,UAAU,EACV,WAAW,EACX,KAAK,kBAAkB,EACvB,WAAW,EACX,YAAY,EACZ,mBAAmB,EACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,sCAAsC,EAAE,KAAK,gCAAgC,EAAE,KAAK,6BAA6B,EAAE,MAAM,yBAAyB,CAAA;AAC3J,OAAO,EAAE,gCAAgC,EAAE,KAAK,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AACrG,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/I,cAAc,qBAAqB,CAAA;AACnC,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,+BAA+B,EAC/B,0CAA0C,EAC1C,6BAA6B,EAC7B,8BAA8B,EAC9B,gCAAgC,EACjC,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -19,12 +19,14 @@ export { getLumenDirectionalKey } from './direction.js';
19
19
  export { lumenErrorStateAnnouncements, lumenErrorStateKinds, lumenErrorStateLayouts } from './error-state.js';
20
20
  export * from './extended-charts.js';
21
21
  export { createFigmaVariableName, exportThemeDesignTokens, exportThemeFigmaVariables, hslTokenToFigmaColor, hslTokenToHexColor } from './figma.js';
22
+ export { connectLumenFloatingPanel } from './floating-panel.js';
22
23
  export { createLumenFormFailure, createLumenFormSuccess, getLumenFieldErrors, lumenFormStatuses, normalizeLumenFormErrors } from './forms.js';
23
24
  export { getLumenIcon, getLumenIconPack, getRegisteredLumenIconNames, lumenIconNames, lumenIcons, registerLumenIconPack, renderLumenIconSvg, resolveLumenIconName } from './icons.js';
24
25
  export { lumenIllustrationNames, lumenIllustrations, renderLumenIllustrationSvg } from './illustrations.generated.js';
25
26
  export { formatLumenImageComparisonValue, normalizeLumenImageComparisonMode, normalizeLumenImageComparisonRatio, normalizeLumenImageComparisonValue, syncLumenImageComparisonMode } from './image-comparison.js';
26
27
  export { createLumenKanbanMoveDetail, getAdjacentKanbanColumn } from './kanban.js';
27
28
  export { formatLumenLanguageLabel, getLumenLocalePair, lumenDefaultLocales, normalizeLumenLocales } from './language.js';
29
+ export { lumenSkeletonAnimations, lumenSkeletonShapes, normalizeLumenProgress, resolveLumenLoadingSemantics, resolveLumenSkeletonAnimation, resolveLumenSkeletonShape, resolveLumenSkeletonSize } from './loading.js';
28
30
  export { bindLumenMediaViewport, formatLumenMediaZoom, isLumenMediaViewportAction, lumenMediaViewportActions, lumenMediaViewportLabels, syncLumenMediaViewport } from './media-viewport.js';
29
31
  export { applyLumenMediaViewportAction, moveLumenMediaItem, normalizeLumenMediaViewport, panLumenMediaViewport, resolveLumenMediaMaxZoom, resolveLumenMediaSelection, toggleLumenMediaSelection } from './media-workspace.js';
30
32
  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"}
@@ -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.0.0",
3
+ "version": "4.1.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },