Presence
Declare which energy levels a UI element belongs to - defineEnergyPresence, presenceAtOrAbove, presenceAtOrBelow, createPresenceStrategy
Presence annotation maps every EnergyLevel to an EnergyPresence ('visible' | 'muted' | 'hidden'). The React counterpart is EnergyGate / useEnergyPresence; the CSS-only counterpart is the data-energy-min / data-energy-max attributes.
EnergyPresenceSpec
type EnergyPresenceSpec = Partial<Record<EnergyLevel, EnergyPresence>> & {
default?: EnergyPresence
}Per-level presence spec. Unlisted levels fall back to default ('visible' when omitted).
defineEnergyPresence
function defineEnergyPresence(spec?: EnergyPresenceSpec): EnergyPresenceMapBuild a complete, frozen presence map from a partial spec. Throws for invalid presence values (in default or any level entry).
import { defineEnergyPresence } from '@kumbatio/energy-system'
// Hide the AI chat at 50 and below, keep it muted at 75:
const aiChatPresence = defineEnergyPresence({
default: 'visible',
75: 'muted',
50: 'hidden',
25: 'hidden',
0: 'hidden',
})presenceAtOrAbove
function presenceAtOrAbove(min: EnergyLevel, below?: EnergyPresence): EnergyPresenceMapPresence map for elements that need at least min energy. At min and above the element is visible; below min it is below (default 'hidden'). Throws for an invalid level or presence.
const composerToolbar = presenceAtOrAbove(50) // hidden at 25 and 0
const aiSidebar = presenceAtOrAbove(75, 'muted') // muted below 75presenceAtOrBelow
function presenceAtOrBelow(max: EnergyLevel, above?: EnergyPresence): EnergyPresenceMapPresence map for elements that only belong at low energy - recovery hints, "one thing at a time" affordances. At max and below the element is visible; above max it is above (default 'hidden'). Throws for an invalid level or presence.
resolveEnergyPresence
function resolveEnergyPresence(presence: EnergyPresenceMap, level: EnergyLevel): EnergyPresenceResolve the presence of an element for a given energy level. Throws for an invalid level, or when the map has no valid entry for it.
isPresenceVisible
function isPresenceVisible(presence: EnergyPresence): booleanReturns true unless the presence is 'hidden' (i.e. 'muted' counts as visible).
isEnergyPresence
function isEnergyPresence(value: unknown): value is EnergyPresenceValidate that an unknown value is a valid EnergyPresence.
createPresenceStrategy
function createPresenceStrategy(
name: string,
presence: EnergyPresenceMap,
): AdaptationStrategy<EnergyPresence>Lift a presence map into an AdaptationStrategy so it can be resolved through the engine like any built-in strategy. The full map is validated once at creation, so the returned resolve() can never fail. Throws for an empty/non-string name or an incomplete map.
import { createEnergyEngine, createPresenceStrategy, presenceAtOrAbove } from '@kumbatio/energy-system'
const engine = createEnergyEngine()
const aiChat = createPresenceStrategy('ai-chat', presenceAtOrAbove(75))
engine.resolve(aiChat) // 'visible' | 'muted' | 'hidden'