{"version":3,"names":["createContext","createMemo","useContext","formatNumberValue","readOption","mergeRootProps","SNAPSHOT_KEYS","snapshotKeys","MeterContext","useMeter","ctx","Error","createMeter","options","value","name","min","max","formattedValue","locale","format","ariaValueText","fn","getAriaValueText","rootInternal","role","aria-valuemin","aria-valuemax","aria-valuenow","aria-valuetext","root","userProps","api","Provider","props","children","METER_SNAPSHOT_KEYS"],"sources":["create-meter.tsx"],"sourcesContent":["import type { JSX } from \"@solidjs/web\";\nimport { type Accessor, createContext, createMemo, useContext } from \"solid-js\";\nimport { formatNumberValue } from \"../internals/format-number\";\nimport { type MaybeAccessor, readOption } from \"../internals/maybe-accessor\";\nimport { mergeRootProps } from \"../internals/merge-root-props\";\nimport {\n\tSNAPSHOT_KEYS,\n\ttype Snapshottable,\n\tsnapshotKeys,\n} from \"../internals/observability/snapshot\";\n\n/**\n * Options for {@link createMeter}. Every reactive input is `MaybeAccessor<T>`.\n *\n * Headless primitive — `<Meter.Root>` layers the label-id registry and the\n * NVDA-pump span on top.\n */\nexport interface CreateMeterOptions {\n\t/** Current value. */\n\tvalue: MaybeAccessor<number>;\n\t/** Minimum value. @default 0 */\n\tmin?: MaybeAccessor<number | undefined>;\n\t/** Maximum value. @default 100 */\n\tmax?: MaybeAccessor<number | undefined>;\n\t/** `Intl.NumberFormat` options forwarded to {@link formatNumberValue}. */\n\tformat?: MaybeAccessor<Intl.NumberFormatOptions | undefined>;\n\t/** Locale for {@link Intl.NumberFormat}. */\n\tlocale?: MaybeAccessor<Intl.LocalesArgument | undefined>;\n\t/**\n\t * Compute `aria-valuetext`. Receives the formatted value and the raw\n\t * value. Default returns the formatted string when `format` is provided,\n\t * otherwise `\"<value>%\"`.\n\t */\n\tgetAriaValueText?: (formattedValue: string, value: number) => string;\n}\n\n/** Slot bag for the `<div role=\"meter\">` element. */\nexport interface MeterRootSlotProps {\n\trole: \"meter\";\n\t\"aria-valuemin\": number;\n\t\"aria-valuemax\": number;\n\t\"aria-valuenow\": number;\n\t\"aria-valuetext\": string;\n}\n\n/** Public api returned by {@link createMeter}. */\nexport interface MeterApi {\n\t/** Current value. */\n\tvalue: Accessor<number>;\n\t/** Minimum (defaults to 0). */\n\tmin: Accessor<number>;\n\t/** Maximum (defaults to 100). */\n\tmax: Accessor<number>;\n\t/** Formatted value string. */\n\tformattedValue: Accessor<string>;\n\t/** Resolved `aria-valuetext`. */\n\tariaValueText: Accessor<string>;\n\n\t/** Slot bag for the root element. */\n\troot: <U extends object | undefined = undefined>(\n\t\tuserProps?: U,\n\t) => MeterRootSlotProps & (U extends object ? U : object);\n\n\t/** Context provider — pair with {@link useMeter}. */\n\tProvider: (props: { children: JSX.Element }) => JSX.Element;\n}\n\nconst MeterContext = createContext<MeterApi | null>(null);\n\n/**\n * Read the nearest {@link MeterApi} provided by `c.Provider`. Throws if\n * called outside a Provider.\n */\nexport function useMeter(): MeterApi {\n\tconst ctx = useContext(MeterContext);\n\tif (ctx == null) {\n\t\tthrow new Error(\n\t\t\t\"Base UI: useMeter() must be called inside a <c.Provider>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n/**\n * Solid-native headless meter primitive — pure derivations from\n * value/min/max + format options. No internal state.\n */\nexport function createMeter(options: CreateMeterOptions): MeterApi {\n\tconst value = createMemo<number>(() => readOption(options.value), {\n\t\tname: \"meter.value\",\n\t});\n\tconst min = createMemo<number>(() => readOption(options.min) ?? 0, {\n\t\tname: \"meter.min\",\n\t});\n\tconst max = createMemo<number>(() => readOption(options.max) ?? 100, {\n\t\tname: \"meter.max\",\n\t});\n\n\tconst formattedValue = createMemo<string>(\n\t\t() =>\n\t\t\tformatNumberValue(\n\t\t\t\tvalue(),\n\t\t\t\treadOption(options.locale),\n\t\t\t\treadOption(options.format),\n\t\t\t),\n\t\t{ name: \"meter.formattedValue\" },\n\t);\n\n\tconst ariaValueText = createMemo<string>(\n\t\t() => {\n\t\t\tconst fn = options.getAriaValueText;\n\t\t\tif (fn) return fn(formattedValue(), value());\n\t\t\tif (readOption(options.format)) return formattedValue();\n\t\t\treturn `${value()}%`;\n\t\t},\n\t\t{ name: \"meter.ariaValueText\" },\n\t);\n\n\tconst rootInternal = {\n\t\trole: \"meter\" as const,\n\t\tget \"aria-valuemin\"() {\n\t\t\treturn min();\n\t\t},\n\t\tget \"aria-valuemax\"() {\n\t\t\treturn max();\n\t\t},\n\t\tget \"aria-valuenow\"() {\n\t\t\treturn value();\n\t\t},\n\t\tget \"aria-valuetext\"() {\n\t\t\treturn ariaValueText();\n\t\t},\n\t};\n\n\tconst root = <U extends object | undefined>(userProps?: U) =>\n\t\tmergeRootProps(rootInternal, userProps) as MeterRootSlotProps &\n\t\t\t(U extends object ? U : object);\n\n\tconst api: MeterApi = {\n\t\tvalue,\n\t\tmin,\n\t\tmax,\n\t\tformattedValue,\n\t\tariaValueText,\n\t\troot,\n\t\tProvider: (props) => (\n\t\t\t<MeterContext value={api}>{props.children}</MeterContext>\n\t\t),\n\t};\n\t(api as MeterApi & Snapshottable)[SNAPSHOT_KEYS] = METER_SNAPSHOT_KEYS;\n\treturn api;\n}\n\nconst METER_SNAPSHOT_KEYS = snapshotKeys<MeterApi>(\n\t\"value\",\n\t\"min\",\n\t\"max\",\n\t\"formattedValue\",\n\t\"ariaValueText\",\n);\n"],"mappings":"AACA,SAAwBA,aAAa,EAAEC,UAAU,EAAEC,UAAU,QAAQ,UAAU;AAC/E,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAA6BC,UAAU,QAAQ,6BAA6B;AAC5E,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SACCC,aAAa,EAEbC,YAAY,QACN,qCAAqC;;AAE5C;AACA;AACA;AACA;AACA;AACA;;AAoBA;;AASA;;AAsBA,MAAMC,YAAY,GAAGR,aAAa,CAAkB,IAAI,CAAC;;AAEzD;AACA;AACA;AACA;AACA,OAAO,SAASS,QAAQA,CAAA,EAAa;EACpC,MAAMC,GAAG,GAAGR,UAAU,CAACM,YAAY,CAAC;EACpC,IAAIE,GAAG,IAAI,IAAI,EAAE;IAChB,MAAM,IAAIC,KAAK,CACd,2DACD,CAAC;EACF;EACA,OAAOD,GAAG;AACX;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,WAAWA,CAACC,OAA2B,EAAY;EAClE,MAAMC,KAAK,GAAGb,UAAU,CAAS,MAAMG,UAAU,CAACS,OAAO,CAACC,KAAK,CAAC,EAAE;IACjEC,IAAI,EAAE;EACP,CAAC,CAAC;EACF,MAAMC,GAAG,GAAGf,UAAU,CAAS,MAAMG,UAAU,CAACS,OAAO,CAACG,GAAG,CAAC,IAAI,CAAC,EAAE;IAClED,IAAI,EAAE;EACP,CAAC,CAAC;EACF,MAAME,GAAG,GAAGhB,UAAU,CAAS,MAAMG,UAAU,CAACS,OAAO,CAACI,GAAG,CAAC,IAAI,GAAG,EAAE;IACpEF,IAAI,EAAE;EACP,CAAC,CAAC;EAEF,MAAMG,cAAc,GAAGjB,UAAU,CAChC,MACCE,iBAAiB,CAChBW,KAAK,CAAC,CAAC,EACPV,UAAU,CAACS,OAAO,CAACM,MAAM,CAAC,EAC1Bf,UAAU,CAACS,OAAO,CAACO,MAAM,CAC1B,CAAC,EACF;IAAEL,IAAI,EAAE;EAAuB,CAChC,CAAC;EAED,MAAMM,aAAa,GAAGpB,UAAU,CAC/B,MAAM;IACL,MAAMqB,EAAE,GAAGT,OAAO,CAACU,gBAAgB;IACnC,IAAID,EAAE,EAAE,OAAOA,EAAE,CAACJ,cAAc,CAAC,CAAC,EAAEJ,KAAK,CAAC,CAAC,CAAC;IAC5C,IAAIV,UAAU,CAACS,OAAO,CAACO,MAAM,CAAC,EAAE,OAAOF,cAAc,CAAC,CAAC;IACvD,OAAO,GAAGJ,KAAK,CAAC,CAAC,GAAG;EACrB,CAAC,EACD;IAAEC,IAAI,EAAE;EAAsB,CAC/B,CAAC;EAED,MAAMS,YAAY,GAAG;IACpBC,IAAI,EAAE,OAAgB;IACtB,IAAI,eAAeC,CAAA,EAAG;MACrB,OAAOV,GAAG,CAAC,CAAC;IACb,CAAC;IACD,IAAI,eAAeW,CAAA,EAAG;MACrB,OAAOV,GAAG,CAAC,CAAC;IACb,CAAC;IACD,IAAI,eAAeW,CAAA,EAAG;MACrB,OAAOd,KAAK,CAAC,CAAC;IACf,CAAC;IACD,IAAI,gBAAgBe,CAAA,EAAG;MACtB,OAAOR,aAAa,CAAC,CAAC;IACvB;EACD,CAAC;EAED,MAAMS,IAAI,GAAkCC,SAAa,IACxD1B,cAAc,CAACmB,YAAY,EAAEO,SAAS,CACN;EAEjC,MAAMC,GAAa,GAAG;IACrBlB,KAAK;IACLE,GAAG;IACHC,GAAG;IACHC,cAAc;IACdG,aAAa;IACbS,IAAI;IACJG,QAAQ,EAAGC,KAAK,IACf,CAAC,YAAY,CAAC,KAAK,CAAC,CAACF,GAAG,CAAC,CAAC,CAACE,KAAK,CAACC,QAAQ,CAAC,EAAE,YAAY;EAE1D,CAAC;EACAH,GAAG,CAA8B1B,aAAa,CAAC,GAAG8B,mBAAmB;EACtE,OAAOJ,GAAG;AACX;AAEA,MAAMI,mBAAmB,GAAG7B,YAAY,CACvC,OAAO,EACP,KAAK,EACL,KAAK,EACL,gBAAgB,EAChB,eACD,CAAC","ignoreList":[]}