@logicplanes/kaeso-ui 0.2.1 → 0.2.2
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/ai/component-guides.md +27 -1
- package/ai/component-registry.json +91 -1
- package/ai/component-registry.md +23 -1
- package/ai/icons.md +1 -1
- package/ai/tokens.md +1 -1
- package/dist/chunks/release-art-DEc9HNa6.js +555 -0
- package/dist/chunks/release-art-DEc9HNa6.js.map +1 -0
- package/dist/chunks/status-dot-BzMlYuMe.js +29 -0
- package/dist/chunks/status-dot-BzMlYuMe.js.map +1 -0
- package/dist/components/charts/timeseries.js +72 -69
- package/dist/components/charts/timeseries.js.map +1 -1
- package/dist/components/data-table.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/release-art.js +2 -0
- package/dist/components/status-dot.js +1 -1
- package/dist/format.js +84 -68
- package/dist/format.js.map +1 -1
- package/dist/index.js +27 -26
- package/dist/kaeso.css +23 -1
- package/dist/styles.css +1 -1
- package/dist/types/components/release-art/docs.d.ts +13 -0
- package/dist/types/components/release-art/drawing.d.ts +48 -0
- package/dist/types/components/release-art/index.d.ts +1 -0
- package/dist/types/components/release-art/release-art.d.ts +37 -0
- package/dist/types/components/status-dot/docs.d.ts +2 -0
- package/dist/types/components/status-dot/status-dot.d.ts +2 -0
- package/dist/types/format/index.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/foundations/accessibility.md +1 -0
- package/package.json +2 -2
- package/dist/chunks/status-dot-CBoQpyL4.js +0 -25
- package/dist/chunks/status-dot-CBoQpyL4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.js","names":["__icon_Calendar03Icon","__icon_Clock01Icon","cn","useUiText","englishText","Icon","preload","lazyModule","useField","useFieldControl","withField","KAESO_INPUT_GROUP_VARIANTS","InputGroup","PopoverRoot","PopoverTrigger","whenIdle","KAESO_DATE_PICKER_VARIANTS","KAESO_DATE_PICKER_DEFAULT_VARIANTS","datePopup","rangePopup","preloadDatePopup","preloadRangePopup","useLoadedOpen","wanted","setWanted","useState","arrived","useReducer","n","loaded","popup","pending","live","setOpen","useCallback","next","was","TriggerButton","rest","valueId","useId","self","useRef","setRef","el","ref","useEffect","doc","onKeyDown","onCancel","onPointerDown","control","controlProps","describedBy","named","id","invalid","force","size","className","Calendar03Icon","placeholder","DatePicker","ariaLabel","ariaLabelledBy","props","field","fc","t","naming","label","date","setDate","useControllable","value","defaultValue","onValueChange","cancel","DatePopup","description","error","formatDate","day","startOfDay","d","rangePresets","DEFAULT_RANGE_PRESETS","presetId","p","presetIdOf","rangeDays","r","DateRangePicker","presetsProp","presetProp","defaults","useMemo","presets","inner","setInner","range","picked","setPicked","days","preset","opening","setOpening","openRange","open","RangePopup","display","formatDateRange","from","KAESO_TIME_INPUT_VARIANTS","KAESO_TIME_INPUT_DEFAULT_VARIANTS","pad","TimeInput","labelId","time","setTime","draft","setDraftState","setDraft","h","m","minutes","shown","part","set","hh","mm","commit","v","seg","e","Clock01Icon","utc"],"sources":["../../src/components/date-picker/date-picker.tsx","../../src/components/date-picker/time-input.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useId, useMemo, useReducer, useRef, useState, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport type { CalendarProps } from \"../calendar/calendar.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useField, useFieldControl, withField, type FieldWrapProps } from \"../field/field.js\";\nimport { Icon } from \"../icon/icon.js\";\nimport { Calendar03Icon as __icon_Calendar03Icon } from \"@hugeicons/core-free-icons\";\nimport { PopoverRoot, PopoverTrigger } from \"../popover/popover-root.js\";\nimport { formatDate, formatDateRange } from \"../../format/index.js\";\nimport { lazyModule, preload, type LazyModule } from \"../../utils/lazy-module.js\";\nimport { whenIdle } from \"../../utils/when-idle.js\";\nimport { englishText, useUiText, type UiText } from \"../../i18n/context.js\";\n\nexport const KAESO_DATE_PICKER_VARIANTS = {\n size: {\n sm: { classes: \"h-32 pl-10 pr-12 gap-6 text-body\" },\n md: { classes: \"h-36 pl-14 pr-16 gap-8 text-body\" },\n lg: { classes: \"h-40 pl-16 pr-18 gap-8 text-body\" },\n },\n} as const;\nexport const KAESO_DATE_PICKER_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nconst datePopup = /* @__PURE__ */ lazyModule(() => import(\"./date-popup.js\"), { base: () => import.meta.url });\nconst rangePopup = /* @__PURE__ */ lazyModule(() => import(\"./range-popup.js\"), { base: () => import.meta.url });\nconst preloadDatePopup = () => preload(datePopup);\nconst preloadRangePopup = () => preload(rangePopup);\n\ninterface LoadedOpen {\n open: boolean;\n pending: boolean;\n setOpen: (open: boolean) => void;\n}\n\nfunction useLoadedOpen(popup: LazyModule<unknown>): LoadedOpen {\n const [wanted, setWanted] = useState(false);\n const [, arrived] = useReducer((n: number) => n + 1, 0);\n const loaded = !!popup.current();\n const pending = wanted && !loaded;\n useEffect(() => {\n if (!pending) return;\n let live = true;\n popup.load().then(\n () => live && arrived(),\n () => live && setWanted(false),\n );\n return () => {\n live = false;\n };\n }, [pending, popup]);\n const setOpen = useCallback((next: boolean) => setWanted((was) => (next && was && !popup.current() ? false : next)), [popup]);\n return { open: wanted && loaded, pending, setOpen };\n}\n\ninterface TriggerButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n size: keyof typeof KAESO_DATE_PICKER_VARIANTS.size;\n children: ReactNode;\n placeholder: boolean;\n invalid?: boolean | undefined;\n controlProps?: object | undefined;\n force?: string | undefined;\n preload: () => void;\n pending: boolean;\n onCancel: () => void;\n named: boolean;\n}\n\nconst TriggerButton = /* @__PURE__ */ forwardRef<HTMLButtonElement, TriggerButtonProps>(function TriggerButton(\n { size, children, placeholder, invalid, disabled, id, controlProps, force, preload, pending, onCancel, named, className, ...rest },\n ref,\n) {\n const valueId = useId();\n const self = useRef<HTMLButtonElement | null>(null);\n const setRef = useCallback(\n (el: HTMLButtonElement | null) => {\n self.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref],\n );\n useEffect(() => whenIdle(preload), [preload]);\n useEffect(() => {\n if (!pending) return;\n const doc = self.current?.ownerDocument ?? document;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopPropagation();\n onCancel();\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!self.current?.contains(e.target as Node)) onCancel();\n };\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }, [pending, onCancel]);\n const control = (controlProps ?? {}) as { \"aria-describedby\"?: string | undefined };\n const describedBy = [named ? valueId : \"\", control[\"aria-describedby\"] ?? \"\"].filter(Boolean).join(\" \");\n return (\n <button\n ref={setRef}\n type=\"button\"\n {...rest}\n {...(pending ? { \"aria-expanded\": true, \"data-popup-open\": \"\" } : {})}\n onPointerEnter={(e) => {\n preload();\n rest.onPointerEnter?.(e);\n }}\n onFocus={(e) => {\n preload();\n rest.onFocus?.(e);\n }}\n onBlur={(e) => {\n if (pending && e.relatedTarget && !e.currentTarget.contains(e.relatedTarget)) onCancel();\n rest.onBlur?.(e);\n }}\n disabled={disabled}\n {...control}\n {...(describedBy ? { \"aria-describedby\": describedBy } : {})}\n {...(id ? { id } : {})}\n {...(invalid ? { \"aria-invalid\": true } : {})}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"inline-flex min-w-0 cursor-pointer items-center rounded-pill font-medium whitespace-nowrap material-secondary transition-control focus-ring disabled:cursor-not-allowed\",\n KAESO_DATE_PICKER_VARIANTS.size[size].classes,\n invalid && \"ring-invalid\",\n className,\n )}\n >\n <Icon icon={__icon_Calendar03Icon} size=\"sm\" className=\"text-fg-secondary\" />\n <span id={valueId} className={cn(\"truncate tabular\", placeholder && \"font-regular text-fg-tertiary\")}>\n {children}\n </span>\n </button>\n );\n});\n\nexport interface DatePickerProps extends FieldWrapProps {\n value?: Date | null | undefined;\n defaultValue?: Date | null | undefined;\n onValueChange?: ((value: Date | null) => void) | undefined;\n placeholder?: string | undefined;\n size?: keyof typeof KAESO_DATE_PICKER_VARIANTS.size | undefined;\n weekStartsOn?: CalendarProps[\"weekStartsOn\"] | undefined;\n disabledDays?: ((date: Date) => boolean) | undefined;\n disabled?: boolean | undefined;\n id?: string | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n \"aria-labelledby\"?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const DatePicker = /* @__PURE__ */ forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(props, ref) {\n const {\n value,\n defaultValue = null,\n onValueChange,\n placeholder,\n size = \"md\",\n weekStartsOn = 1,\n disabledDays,\n disabled,\n id,\n className,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const naming = { ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}), ...(ariaLabelledBy ? { \"aria-labelledby\": ariaLabelledBy } : {}) };\n const named = !!(ariaLabel || ariaLabelledBy || label || field);\n const [date, setDate] = useControllable<Date | null>(value, defaultValue, onValueChange);\n const { open, pending, setOpen } = useLoadedOpen(datePopup);\n const cancel = useCallback(() => setOpen(false), [setOpen]);\n const DatePopup = datePopup.current()?.DatePopup;\n const control = (\n <div ref={ref} className={cn(\"inline-flex\", !(label || description || error) && className)}>\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger>\n <TriggerButton\n size={size}\n placeholder={!date}\n invalid={!!error}\n disabled={disabled}\n id={id}\n controlProps={fc.controlProps}\n force={force}\n preload={preloadDatePopup}\n pending={pending}\n onCancel={cancel}\n named={named}\n {...naming}\n >\n {date ? formatDate(date) : (placeholder ?? t(\"datePicker.pickDate\", \"Pick a date\"))}\n </TriggerButton>\n </PopoverTrigger>\n {DatePopup && <DatePopup date={date} onDateChange={setDate} onClose={() => setOpen(false)} weekStartsOn={weekStartsOn} disabledDays={disabledDays} />}\n </PopoverRoot>\n </div>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") DatePicker.displayName = \"DatePicker\";\n\nexport interface DateRangePreset {\n id?: string | undefined;\n label: string;\n range: () => DateRange;\n}\n\nconst day = 86_400_000;\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nfunction rangePresets(t: UiText): DateRangePreset[] {\n return [\n { id: \"Last 24 hours\", label: t(\"datePicker.last24Hours\", \"Last 24 hours\"), range: () => ({ from: new Date(Date.now() - day), to: new Date() }) },\n { id: \"Last 7 days\", label: t(\"datePicker.last7Days\", \"Last 7 days\"), range: () => ({ from: startOfDay(new Date(Date.now() - 6 * day)), to: new Date() }) },\n {\n id: \"Last 30 days\",\n label: t(\"datePicker.last30Days\", \"Last 30 days\"),\n range: () => ({ from: startOfDay(new Date(Date.now() - 29 * day)), to: new Date() }),\n },\n {\n id: \"This month\",\n label: t(\"datePicker.thisMonth\", \"This month\"),\n range: () => ({ from: new Date(new Date().getFullYear(), new Date().getMonth(), 1), to: new Date() }),\n },\n {\n id: \"Last month\",\n label: t(\"datePicker.lastMonth\", \"Last month\"),\n range: () => {\n const n = new Date();\n return { from: new Date(n.getFullYear(), n.getMonth() - 1, 1), to: new Date(n.getFullYear(), n.getMonth(), 0) };\n },\n },\n ];\n}\nexport const DEFAULT_RANGE_PRESETS: DateRangePreset[] = /* @__PURE__ */ rangePresets(englishText);\nconst presetId = (p: DateRangePreset) => p.id ?? p.label;\nconst presetIdOf = (p: DateRangePreset | undefined) => (p ? presetId(p) : null);\n\nexport interface DateRangePickerProps extends Omit<DatePickerProps, \"value\" | \"defaultValue\" | \"onValueChange\"> {\n value?: DateRange | null | undefined;\n defaultValue?: DateRange | null | undefined;\n onValueChange?: ((value: DateRange | null, details: { preset: string | null }) => void) | undefined;\n presets?: DateRangePreset[] | undefined;\n preset?: string | null | undefined;\n}\n\nconst rangeDays = (r: DateRange | null | undefined) => `${r?.from?.toDateString()}/${r?.to?.toDateString()}`;\n\nexport const DateRangePicker = /* @__PURE__ */ forwardRef<HTMLDivElement, DateRangePickerProps>(function DateRangePicker(props, ref) {\n const {\n value,\n defaultValue = null,\n onValueChange,\n placeholder,\n size = \"md\",\n weekStartsOn = 1,\n disabledDays,\n disabled,\n id,\n className,\n presets: presetsProp,\n preset: presetProp,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const defaults = useMemo(() => rangePresets(t), [t]);\n const presets = presetsProp ?? defaults;\n const naming = { ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}), ...(ariaLabelledBy ? { \"aria-labelledby\": ariaLabelledBy } : {}) };\n const named = !!(ariaLabel || ariaLabelledBy || label || field);\n const [inner, setInner] = useState<DateRange | null>(defaultValue);\n const range = value !== undefined ? value : inner;\n const [picked, setPicked] = useState<string | null>(null);\n const days = rangeDays(range);\n const preset = presetProp !== undefined ? presetProp : presetIdOf(presets.find((p) => presetId(p) === picked && rangeDays(p.range()) === days));\n const { open, pending, setOpen } = useLoadedOpen(rangePopup);\n const cancel = useCallback(() => setOpen(false), [setOpen]);\n const [opening, setOpening] = useState(0);\n const openRange = useCallback(\n (next: boolean) => {\n if (next && !open) setOpening((n) => n + 1);\n setOpen(next);\n },\n [open, setOpen],\n );\n const RangePopup = rangePopup.current()?.RangePopup;\n const presetName = preset === null ? null : (presets.find((p) => presetId(p) === preset)?.label ?? preset);\n const display =\n presetName ??\n (range?.from && range.to\n ? formatDateRange(range.from, range.to)\n : range?.from\n ? formatDate(range.from)\n : (placeholder ?? t(\"datePicker.pickRange\", \"Pick a range\")));\n const control = (\n <div ref={ref} className={cn(\"inline-flex\", !(label || description || error) && className)}>\n <PopoverRoot open={open} onOpenChange={openRange}>\n <PopoverTrigger>\n <TriggerButton\n size={size}\n placeholder={!range?.from && !preset}\n invalid={!!error}\n disabled={disabled}\n id={id}\n controlProps={fc.controlProps}\n force={force}\n preload={preloadRangePopup}\n pending={pending}\n onCancel={cancel}\n named={named}\n {...naming}\n >\n {display}\n </TriggerButton>\n </PopoverTrigger>\n {RangePopup && (\n <RangePopup\n key={opening}\n range={range}\n preset={preset}\n presets={presets}\n onPick={(next, from) => {\n if (value === undefined) setInner(next);\n setPicked(from);\n onValueChange?.(next, { preset: from });\n setOpen(false);\n }}\n onClose={() => setOpen(false)}\n weekStartsOn={weekStartsOn}\n disabledDays={disabledDays}\n />\n )}\n </PopoverRoot>\n </div>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") DateRangePicker.displayName = \"DateRangePicker\";\n\nexport type { DateRange };\n","import type * as React from \"react\";\nimport { forwardRef, useRef, useState, type KeyboardEvent } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useField, useFieldControl, withField, type FieldWrapProps } from \"../field/field.js\";\nimport { InputGroup, KAESO_INPUT_GROUP_VARIANTS, type InputSize } from \"../input/input-group.js\";\nimport { Icon } from \"../icon/icon.js\";\nimport { Clock01Icon as __icon_Clock01Icon } from \"@hugeicons/core-free-icons\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nexport const KAESO_TIME_INPUT_VARIANTS = {\n size: KAESO_INPUT_GROUP_VARIANTS.size,\n} as const;\nexport const KAESO_TIME_INPUT_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nexport interface TimeInputProps extends FieldWrapProps {\n value?: string | undefined;\n defaultValue?: string | undefined;\n onValueChange?: ((value: string) => void) | undefined;\n size?: InputSize | undefined;\n disabled?: boolean | undefined;\n utc?: boolean | undefined;\n id?: string | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nexport const TimeInput = /* @__PURE__ */ forwardRef<HTMLDivElement, TimeInputProps>(function TimeInput(props, ref) {\n const {\n value,\n defaultValue = \"09:00\",\n onValueChange,\n size = \"md\",\n disabled,\n utc,\n id,\n className,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const labelId = field ? field.labelId : label && fc.wrapId ? `${fc.wrapId}-label` : undefined;\n const [time, setTime] = useControllable(value, defaultValue, onValueChange);\n const [draft, setDraftState] = useState<{ h?: string | undefined; m?: string | undefined }>({});\n const pending = useRef(draft);\n const setDraft = (next: { h?: string | undefined; m?: string | undefined }) => {\n pending.current = next;\n setDraftState(next);\n };\n const [h = \"00\", m = \"00\"] = time.split(\":\");\n const minutes = useRef<HTMLInputElement>(null);\n const shown = (part: \"h\" | \"m\") => pending.current[part] ?? (part === \"h\" ? h : m);\n const set = (hh: number, mm: number) => {\n setDraft({});\n const next = `${pad(((hh % 24) + 24) % 24)}:${pad(((mm % 60) + 60) % 60)}`;\n if (next !== time) setTime(next);\n };\n const commit = (part: \"h\" | \"m\", v: string) => {\n const n = Number(v || 0);\n if (part === \"h\") set(Math.min(23, n), Number(shown(\"m\") || 0));\n else set(Number(shown(\"h\") || 0), Math.min(59, n));\n };\n const seg = (part: \"h\" | \"m\") => ({\n inputMode: \"numeric\" as const,\n maxLength: 2,\n disabled,\n value: draft[part] ?? (part === \"h\" ? h : m),\n onFocus: (e: React.FocusEvent<HTMLInputElement>) => e.target.select(),\n onKeyDown: (e: KeyboardEvent<HTMLInputElement>) => {\n const d = e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0;\n if (d) {\n e.preventDefault();\n const hh = Number(shown(\"h\") || 0);\n const mm = Number(shown(\"m\") || 0);\n if (part === \"h\") set(hh + d, mm);\n else set(hh, mm + d);\n }\n },\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value.replace(/\\D/g, \"\").slice(0, 2);\n if (v.length < 2) return setDraft({ ...pending.current, [part]: v });\n commit(part, v);\n if (part === \"h\") minutes.current?.focus();\n },\n onBlur: () => {\n const v = pending.current[part];\n if (v !== undefined) commit(part, v);\n },\n className: \"w-20 flex-none bg-transparent text-center tabular text-fg outline-none\",\n });\n const control = (\n <InputGroup\n ref={ref}\n size={size}\n leadingIcon\n disabled={disabled}\n invalid={!!error}\n className={cn(\"w-auto\", !(label || description || error) && className)}\n {...(force ? { \"data-force\": force } : {})}\n role=\"group\"\n {...(labelId && !ariaLabel ? { \"aria-labelledby\": labelId } : { \"aria-label\": ariaLabel ?? t(\"timeInput.time\", \"Time\") })}\n >\n <Icon icon={__icon_Clock01Icon} size=\"sm\" className=\"text-fg-tertiary\" />\n <span className=\"flex items-center gap-2\">\n <input {...seg(\"h\")} aria-label={t(\"timeInput.hours\", \"Hours\")} {...(id ? { id } : {})} {...fc.controlProps} />\n <span className=\"text-fg-tertiary\">:</span>\n <input ref={minutes} {...seg(\"m\")} aria-label={t(\"timeInput.minutes\", \"Minutes\")} />\n </span>\n {utc && <InputGroup.Addon>UTC</InputGroup.Addon>}\n </InputGroup>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") TimeInput.displayName = \"TimeInput\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-picker.js","names":["__icon_Calendar03Icon","__icon_Clock01Icon","cn","useUiText","englishText","Icon","preload","lazyModule","useField","useFieldControl","withField","KAESO_INPUT_GROUP_VARIANTS","InputGroup","PopoverRoot","PopoverTrigger","whenIdle","KAESO_DATE_PICKER_VARIANTS","KAESO_DATE_PICKER_DEFAULT_VARIANTS","datePopup","rangePopup","preloadDatePopup","preloadRangePopup","useLoadedOpen","wanted","setWanted","useState","arrived","useReducer","n","loaded","popup","pending","live","setOpen","useCallback","next","was","TriggerButton","rest","valueId","useId","self","useRef","setRef","el","ref","useEffect","doc","onKeyDown","onCancel","onPointerDown","control","controlProps","describedBy","named","id","invalid","force","size","className","Calendar03Icon","placeholder","DatePicker","ariaLabel","ariaLabelledBy","props","field","fc","t","naming","label","date","setDate","useControllable","value","defaultValue","onValueChange","cancel","DatePopup","description","error","formatDate","day","startOfDay","d","rangePresets","DEFAULT_RANGE_PRESETS","presetId","p","presetIdOf","rangeDays","r","DateRangePicker","presetsProp","presetProp","defaults","useMemo","presets","inner","setInner","range","picked","setPicked","days","preset","opening","setOpening","openRange","open","RangePopup","display","formatDateRange","from","KAESO_TIME_INPUT_VARIANTS","KAESO_TIME_INPUT_DEFAULT_VARIANTS","pad","TimeInput","labelId","time","setTime","draft","setDraftState","setDraft","h","m","minutes","shown","part","set","hh","mm","commit","v","seg","e","Clock01Icon","utc"],"sources":["../../src/components/date-picker/date-picker.tsx","../../src/components/date-picker/time-input.tsx"],"sourcesContent":["import { forwardRef, useCallback, useEffect, useId, useMemo, useReducer, useRef, useState, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport type { DateRange } from \"react-day-picker\";\nimport type { CalendarProps } from \"../calendar/calendar.js\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useField, useFieldControl, withField, type FieldWrapProps } from \"../field/field.js\";\nimport { Icon } from \"../icon/icon.js\";\nimport { Calendar03Icon as __icon_Calendar03Icon } from \"@hugeicons/core-free-icons\";\nimport { PopoverRoot, PopoverTrigger } from \"../popover/popover-root.js\";\nimport { formatDate, formatDateRange } from \"../../format/index.js\";\nimport { lazyModule, preload, type LazyModule } from \"../../utils/lazy-module.js\";\nimport { whenIdle } from \"../../utils/when-idle.js\";\nimport { englishText, useUiText, type UiText } from \"../../i18n/context.js\";\n\nexport const KAESO_DATE_PICKER_VARIANTS = {\n size: {\n sm: { classes: \"h-32 pl-10 pr-12 gap-6 text-body\" },\n md: { classes: \"h-36 pl-14 pr-16 gap-8 text-body\" },\n lg: { classes: \"h-40 pl-16 pr-18 gap-8 text-body\" },\n },\n} as const;\nexport const KAESO_DATE_PICKER_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nconst datePopup = /* @__PURE__ */ lazyModule(() => import(\"./date-popup.js\"), { base: () => import.meta.url });\nconst rangePopup = /* @__PURE__ */ lazyModule(() => import(\"./range-popup.js\"), { base: () => import.meta.url });\nconst preloadDatePopup = () => preload(datePopup);\nconst preloadRangePopup = () => preload(rangePopup);\n\ninterface LoadedOpen {\n open: boolean;\n pending: boolean;\n setOpen: (open: boolean) => void;\n}\n\nfunction useLoadedOpen(popup: LazyModule<unknown>): LoadedOpen {\n const [wanted, setWanted] = useState(false);\n const [, arrived] = useReducer((n: number) => n + 1, 0);\n const loaded = !!popup.current();\n const pending = wanted && !loaded;\n useEffect(() => {\n if (!pending) return;\n let live = true;\n popup.load().then(\n () => live && arrived(),\n () => live && setWanted(false),\n );\n return () => {\n live = false;\n };\n }, [pending, popup]);\n const setOpen = useCallback((next: boolean) => setWanted((was) => (next && was && !popup.current() ? false : next)), [popup]);\n return { open: wanted && loaded, pending, setOpen };\n}\n\ninterface TriggerButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n size: keyof typeof KAESO_DATE_PICKER_VARIANTS.size;\n children: ReactNode;\n placeholder: boolean;\n invalid?: boolean | undefined;\n controlProps?: object | undefined;\n force?: string | undefined;\n preload: () => void;\n pending: boolean;\n onCancel: () => void;\n named: boolean;\n}\n\nconst TriggerButton = /* @__PURE__ */ forwardRef<HTMLButtonElement, TriggerButtonProps>(function TriggerButton(\n { size, children, placeholder, invalid, disabled, id, controlProps, force, preload, pending, onCancel, named, className, ...rest },\n ref,\n) {\n const valueId = useId();\n const self = useRef<HTMLButtonElement | null>(null);\n const setRef = useCallback(\n (el: HTMLButtonElement | null) => {\n self.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref],\n );\n useEffect(() => whenIdle(preload), [preload]);\n useEffect(() => {\n if (!pending) return;\n const doc = self.current?.ownerDocument ?? document;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopPropagation();\n onCancel();\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!self.current?.contains(e.target as Node)) onCancel();\n };\n doc.addEventListener(\"keydown\", onKeyDown, true);\n doc.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n doc.removeEventListener(\"keydown\", onKeyDown, true);\n doc.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }, [pending, onCancel]);\n const control = (controlProps ?? {}) as { \"aria-describedby\"?: string | undefined };\n const describedBy = [named ? valueId : \"\", control[\"aria-describedby\"] ?? \"\"].filter(Boolean).join(\" \");\n return (\n <button\n ref={setRef}\n type=\"button\"\n {...rest}\n {...(pending ? { \"aria-expanded\": true, \"data-popup-open\": \"\" } : {})}\n onPointerEnter={(e) => {\n preload();\n rest.onPointerEnter?.(e);\n }}\n onFocus={(e) => {\n preload();\n rest.onFocus?.(e);\n }}\n onBlur={(e) => {\n if (pending && e.relatedTarget && !e.currentTarget.contains(e.relatedTarget)) onCancel();\n rest.onBlur?.(e);\n }}\n disabled={disabled}\n {...control}\n {...(describedBy ? { \"aria-describedby\": describedBy } : {})}\n {...(id ? { id } : {})}\n {...(invalid ? { \"aria-invalid\": true } : {})}\n {...(force ? { \"data-force\": force } : {})}\n className={cn(\n \"inline-flex min-w-0 cursor-pointer items-center rounded-pill font-medium whitespace-nowrap material-secondary transition-control focus-ring disabled:cursor-not-allowed\",\n KAESO_DATE_PICKER_VARIANTS.size[size].classes,\n invalid && \"ring-invalid\",\n className,\n )}\n >\n <Icon icon={__icon_Calendar03Icon} size=\"sm\" className=\"text-fg-secondary\" />\n <span id={valueId} className={cn(\"truncate tabular\", placeholder && \"font-regular text-fg-tertiary\")}>\n {children}\n </span>\n </button>\n );\n});\n\nexport interface DatePickerProps extends FieldWrapProps {\n value?: Date | null | undefined;\n defaultValue?: Date | null | undefined;\n onValueChange?: ((value: Date | null) => void) | undefined;\n placeholder?: string | undefined;\n size?: keyof typeof KAESO_DATE_PICKER_VARIANTS.size | undefined;\n weekStartsOn?: CalendarProps[\"weekStartsOn\"] | undefined;\n disabledDays?: ((date: Date) => boolean) | undefined;\n disabled?: boolean | undefined;\n id?: string | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n \"aria-labelledby\"?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nexport const DatePicker = /* @__PURE__ */ forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(props, ref) {\n const {\n value,\n defaultValue = null,\n onValueChange,\n placeholder,\n size = \"md\",\n weekStartsOn = 1,\n disabledDays,\n disabled,\n id,\n className,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const naming = { ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}), ...(ariaLabelledBy ? { \"aria-labelledby\": ariaLabelledBy } : {}) };\n const named = !!(ariaLabel || ariaLabelledBy || label || field);\n const [date, setDate] = useControllable<Date | null>(value, defaultValue, onValueChange);\n const { open, pending, setOpen } = useLoadedOpen(datePopup);\n const cancel = useCallback(() => setOpen(false), [setOpen]);\n const DatePopup = datePopup.current()?.DatePopup;\n const control = (\n <div ref={ref} className={cn(\"inline-flex\", !(label || description || error) && className)}>\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger>\n <TriggerButton\n size={size}\n placeholder={!date}\n invalid={!!error}\n disabled={disabled}\n id={id}\n controlProps={fc.controlProps}\n force={force}\n preload={preloadDatePopup}\n pending={pending}\n onCancel={cancel}\n named={named}\n {...naming}\n >\n {date ? formatDate(date) : (placeholder ?? t(\"datePicker.pickDate\", \"Pick a date\"))}\n </TriggerButton>\n </PopoverTrigger>\n {DatePopup && <DatePopup date={date} onDateChange={setDate} onClose={() => setOpen(false)} weekStartsOn={weekStartsOn} disabledDays={disabledDays} />}\n </PopoverRoot>\n </div>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") DatePicker.displayName = \"DatePicker\";\n\nexport interface DateRangePreset {\n id?: string | undefined;\n label: string;\n range: () => DateRange;\n}\n\nconst day = 86_400_000;\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nfunction rangePresets(t: UiText): DateRangePreset[] {\n return [\n { id: \"Last 24 hours\", label: t(\"datePicker.last24Hours\", \"Last 24 hours\"), range: () => ({ from: new Date(Date.now() - day), to: new Date() }) },\n { id: \"Last 7 days\", label: t(\"datePicker.last7Days\", \"Last 7 days\"), range: () => ({ from: startOfDay(new Date(Date.now() - 6 * day)), to: new Date() }) },\n {\n id: \"Last 30 days\",\n label: t(\"datePicker.last30Days\", \"Last 30 days\"),\n range: () => ({ from: startOfDay(new Date(Date.now() - 29 * day)), to: new Date() }),\n },\n {\n id: \"This month\",\n label: t(\"datePicker.thisMonth\", \"This month\"),\n range: () => ({ from: new Date(new Date().getFullYear(), new Date().getMonth(), 1), to: new Date() }),\n },\n {\n id: \"Last month\",\n label: t(\"datePicker.lastMonth\", \"Last month\"),\n range: () => {\n const n = new Date();\n return { from: new Date(n.getFullYear(), n.getMonth() - 1, 1), to: new Date(n.getFullYear(), n.getMonth(), 0) };\n },\n },\n ];\n}\nexport const DEFAULT_RANGE_PRESETS: DateRangePreset[] = /* @__PURE__ */ rangePresets(englishText);\nconst presetId = (p: DateRangePreset) => p.id ?? p.label;\nconst presetIdOf = (p: DateRangePreset | undefined) => (p ? presetId(p) : null);\n\nexport interface DateRangePickerProps extends Omit<DatePickerProps, \"value\" | \"defaultValue\" | \"onValueChange\"> {\n value?: DateRange | null | undefined;\n defaultValue?: DateRange | null | undefined;\n onValueChange?: ((value: DateRange | null, details: { preset: string | null }) => void) | undefined;\n presets?: DateRangePreset[] | undefined;\n preset?: string | null | undefined;\n}\n\nconst rangeDays = (r: DateRange | null | undefined) => `${r?.from?.toDateString()}/${r?.to?.toDateString()}`;\n\nexport const DateRangePicker = /* @__PURE__ */ forwardRef<HTMLDivElement, DateRangePickerProps>(function DateRangePicker(props, ref) {\n const {\n value,\n defaultValue = null,\n onValueChange,\n placeholder,\n size = \"md\",\n weekStartsOn = 1,\n disabledDays,\n disabled,\n id,\n className,\n presets: presetsProp,\n preset: presetProp,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const defaults = useMemo(() => rangePresets(t), [t]);\n const presets = presetsProp ?? defaults;\n const naming = { ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}), ...(ariaLabelledBy ? { \"aria-labelledby\": ariaLabelledBy } : {}) };\n const named = !!(ariaLabel || ariaLabelledBy || label || field);\n const [inner, setInner] = useState<DateRange | null>(defaultValue);\n const range = value !== undefined ? value : inner;\n const [picked, setPicked] = useState<string | null>(null);\n const days = rangeDays(range);\n const preset = presetProp !== undefined ? presetProp : presetIdOf(presets.find((p) => presetId(p) === picked && rangeDays(p.range()) === days));\n const { open, pending, setOpen } = useLoadedOpen(rangePopup);\n const cancel = useCallback(() => setOpen(false), [setOpen]);\n const [opening, setOpening] = useState(0);\n const openRange = useCallback(\n (next: boolean) => {\n if (next && !open) setOpening((n) => n + 1);\n setOpen(next);\n },\n [open, setOpen],\n );\n const RangePopup = rangePopup.current()?.RangePopup;\n const presetName = preset === null ? null : (presets.find((p) => presetId(p) === preset)?.label ?? preset);\n const display =\n presetName ??\n (range?.from && range.to\n ? formatDateRange(range.from, range.to)\n : range?.from\n ? formatDate(range.from)\n : (placeholder ?? t(\"datePicker.pickRange\", \"Pick a range\")));\n const control = (\n <div ref={ref} className={cn(\"inline-flex\", !(label || description || error) && className)}>\n <PopoverRoot open={open} onOpenChange={openRange}>\n <PopoverTrigger>\n <TriggerButton\n size={size}\n placeholder={!range?.from && !preset}\n invalid={!!error}\n disabled={disabled}\n id={id}\n controlProps={fc.controlProps}\n force={force}\n preload={preloadRangePopup}\n pending={pending}\n onCancel={cancel}\n named={named}\n {...naming}\n >\n {display}\n </TriggerButton>\n </PopoverTrigger>\n {RangePopup && (\n <RangePopup\n key={opening}\n range={range}\n preset={preset}\n presets={presets}\n onPick={(next, from) => {\n if (value === undefined) setInner(next);\n setPicked(from);\n onValueChange?.(next, { preset: from });\n setOpen(false);\n }}\n onClose={() => setOpen(false)}\n weekStartsOn={weekStartsOn}\n disabledDays={disabledDays}\n />\n )}\n </PopoverRoot>\n </div>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") DateRangePicker.displayName = \"DateRangePicker\";\n\nexport type { DateRange };\n","import type * as React from \"react\";\nimport { forwardRef, useRef, useState, type KeyboardEvent } from \"react\";\nimport { cn } from \"../../utils/cn.js\";\nimport { useControllable } from \"../../utils/use-controllable.js\";\nimport { useField, useFieldControl, withField, type FieldWrapProps } from \"../field/field.js\";\nimport { InputGroup, KAESO_INPUT_GROUP_VARIANTS, type InputSize } from \"../input/input-group.js\";\nimport { Icon } from \"../icon/icon.js\";\nimport { Clock01Icon as __icon_Clock01Icon } from \"@hugeicons/core-free-icons\";\nimport { useUiText } from \"../../i18n/context.js\";\n\nexport const KAESO_TIME_INPUT_VARIANTS = {\n size: KAESO_INPUT_GROUP_VARIANTS.size,\n} as const;\nexport const KAESO_TIME_INPUT_DEFAULT_VARIANTS = { size: \"md\" } as const;\n\nexport interface TimeInputProps extends FieldWrapProps {\n value?: string | undefined;\n defaultValue?: string | undefined;\n onValueChange?: ((value: string) => void) | undefined;\n size?: InputSize | undefined;\n disabled?: boolean | undefined;\n utc?: boolean | undefined;\n id?: string | undefined;\n className?: string | undefined;\n \"aria-label\"?: string | undefined;\n \"data-force\"?: string | undefined;\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nexport const TimeInput = /* @__PURE__ */ forwardRef<HTMLDivElement, TimeInputProps>(function TimeInput(props, ref) {\n const {\n value,\n defaultValue = \"09:00\",\n onValueChange,\n size = \"md\",\n disabled,\n utc,\n id,\n className,\n label,\n description,\n error,\n optional,\n required,\n layout,\n \"aria-label\": ariaLabel,\n \"data-force\": force,\n } = props;\n const field = useField();\n const fc = useFieldControl(props);\n const t = useUiText();\n const labelId = field ? field.labelId : label && fc.wrapId ? `${fc.wrapId}-label` : undefined;\n const [time, setTime] = useControllable(value, defaultValue, onValueChange);\n const [draft, setDraftState] = useState<{ h?: string | undefined; m?: string | undefined }>({});\n const pending = useRef(draft);\n const setDraft = (next: { h?: string | undefined; m?: string | undefined }) => {\n pending.current = next;\n setDraftState(next);\n };\n const [h = \"00\", m = \"00\"] = time.split(\":\");\n const minutes = useRef<HTMLInputElement>(null);\n const shown = (part: \"h\" | \"m\") => pending.current[part] ?? (part === \"h\" ? h : m);\n const set = (hh: number, mm: number) => {\n setDraft({});\n const next = `${pad(((hh % 24) + 24) % 24)}:${pad(((mm % 60) + 60) % 60)}`;\n if (next !== time) setTime(next);\n };\n const commit = (part: \"h\" | \"m\", v: string) => {\n const n = Number(v || 0);\n if (part === \"h\") set(Math.min(23, n), Number(shown(\"m\") || 0));\n else set(Number(shown(\"h\") || 0), Math.min(59, n));\n };\n const seg = (part: \"h\" | \"m\") => ({\n inputMode: \"numeric\" as const,\n maxLength: 2,\n disabled,\n value: draft[part] ?? (part === \"h\" ? h : m),\n onFocus: (e: React.FocusEvent<HTMLInputElement>) => e.target.select(),\n onKeyDown: (e: KeyboardEvent<HTMLInputElement>) => {\n const d = e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0;\n if (d) {\n e.preventDefault();\n const hh = Number(shown(\"h\") || 0);\n const mm = Number(shown(\"m\") || 0);\n if (part === \"h\") set(hh + d, mm);\n else set(hh, mm + d);\n }\n },\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value.replace(/\\D/g, \"\").slice(0, 2);\n if (v.length < 2) return setDraft({ ...pending.current, [part]: v });\n commit(part, v);\n if (part === \"h\") minutes.current?.focus();\n },\n onBlur: () => {\n const v = pending.current[part];\n if (v !== undefined) commit(part, v);\n },\n className: \"w-20 flex-none bg-transparent text-center tabular text-fg outline-none coarse:w-24\",\n });\n const control = (\n <InputGroup\n ref={ref}\n size={size}\n leadingIcon\n disabled={disabled}\n invalid={!!error}\n className={cn(\"w-auto\", !(label || description || error) && className)}\n {...(force ? { \"data-force\": force } : {})}\n role=\"group\"\n {...(labelId && !ariaLabel ? { \"aria-labelledby\": labelId } : { \"aria-label\": ariaLabel ?? t(\"timeInput.time\", \"Time\") })}\n >\n <Icon icon={__icon_Clock01Icon} size=\"sm\" className=\"text-fg-tertiary\" />\n <span className=\"flex items-center gap-2\">\n <input {...seg(\"h\")} aria-label={t(\"timeInput.hours\", \"Hours\")} {...(id ? { id } : {})} {...fc.controlProps} />\n <span className=\"text-fg-tertiary\">:</span>\n <input ref={minutes} {...seg(\"m\")} aria-label={t(\"timeInput.minutes\", \"Minutes\")} />\n </span>\n {utc && <InputGroup.Addon>UTC</InputGroup.Addon>}\n </InputGroup>\n );\n if (field) return control;\n return withField({ label, description, error, optional, required, layout, id: fc.wrapId ?? id, disabled, className }, control);\n});\nif (process.env.NODE_ENV !== \"production\") TimeInput.displayName = \"TimeInput\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export { t as KAESO_RELEASE_ART_DEFAULT_VARIANTS, n as KAESO_RELEASE_ART_VARIANTS, a as RELEASE_ART_STYLES, r as ReleaseArt, o as isReleaseArtSpec, s as nextReleaseArt, c as randomReleaseArt, l as releaseArtFor, i as releaseArtSvg } from "../chunks/release-art-DEc9HNa6.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { t as KAESO_STATUS_DOT_DEFAULT_VARIANTS, n as KAESO_STATUS_DOT_VARIANTS, r as Status, i as StatusDot } from "../chunks/status-dot-
|
|
2
|
+
export { t as KAESO_STATUS_DOT_DEFAULT_VARIANTS, n as KAESO_STATUS_DOT_VARIANTS, r as Status, i as StatusDot } from "../chunks/status-dot-BzMlYuMe.js";
|
package/dist/format.js
CHANGED
|
@@ -1,29 +1,40 @@
|
|
|
1
1
|
import { t as e } from "./chunks/message-BxTkh1oA.js";
|
|
2
2
|
//#region src/format/index.ts
|
|
3
|
-
var t = "en", n = {};
|
|
4
|
-
function
|
|
3
|
+
var t = "en", n = {}, r;
|
|
4
|
+
function i(e, r = {}) {
|
|
5
5
|
t = e, n = r;
|
|
6
6
|
}
|
|
7
|
-
var
|
|
8
|
-
function
|
|
7
|
+
var a = (r, i, a) => e(n[r] ?? i, a, t);
|
|
8
|
+
function o() {
|
|
9
9
|
return t;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
function s(e) {
|
|
12
|
+
if (!e) r = void 0;
|
|
13
|
+
else try {
|
|
14
|
+
new Intl.DateTimeFormat("en", { timeZone: e }), r = e;
|
|
15
|
+
} catch {
|
|
16
|
+
r = void 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function c() {
|
|
20
|
+
return r;
|
|
21
|
+
}
|
|
22
|
+
var l = () => r ? { timeZone: r } : {}, u = () => t === "en" ? "en-US" : t, d = () => t === "en" ? "en-GB" : t;
|
|
23
|
+
function f(e, t = {}) {
|
|
24
|
+
return new Intl.NumberFormat(u(), {
|
|
14
25
|
maximumFractionDigits: 2,
|
|
15
26
|
...t
|
|
16
27
|
}).format(e);
|
|
17
28
|
}
|
|
18
|
-
function
|
|
19
|
-
return Math.abs(e) < 1e3 ?
|
|
29
|
+
function p(e) {
|
|
30
|
+
return Math.abs(e) < 1e3 ? f(e, { maximumFractionDigits: 0 }) : new Intl.NumberFormat(u(), {
|
|
20
31
|
notation: "compact",
|
|
21
32
|
maximumFractionDigits: 1,
|
|
22
33
|
maximumSignificantDigits: 3,
|
|
23
34
|
roundingPriority: "morePrecision"
|
|
24
35
|
}).format(e);
|
|
25
36
|
}
|
|
26
|
-
function
|
|
37
|
+
function m(e) {
|
|
27
38
|
let t = [
|
|
28
39
|
"B",
|
|
29
40
|
"KB",
|
|
@@ -34,37 +45,37 @@ function u(e) {
|
|
|
34
45
|
], n = e, r = 0;
|
|
35
46
|
for (; Math.abs(n) >= 1024 && r < t.length - 1;) n /= 1024, r++;
|
|
36
47
|
let i = r === 0 || n >= 100 ? 0 : 1;
|
|
37
|
-
return `${
|
|
48
|
+
return `${f(n, {
|
|
38
49
|
minimumFractionDigits: i,
|
|
39
50
|
maximumFractionDigits: i,
|
|
40
51
|
useGrouping: !1
|
|
41
52
|
})} ${t[r]}`;
|
|
42
53
|
}
|
|
43
|
-
function
|
|
44
|
-
return new Intl.NumberFormat(
|
|
54
|
+
function h(e, t = 1) {
|
|
55
|
+
return new Intl.NumberFormat(u(), {
|
|
45
56
|
style: "percent",
|
|
46
57
|
maximumFractionDigits: t
|
|
47
58
|
}).format(e);
|
|
48
59
|
}
|
|
49
|
-
function
|
|
60
|
+
function g(e) {
|
|
50
61
|
return e.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
51
62
|
}
|
|
52
|
-
function
|
|
53
|
-
let n =
|
|
54
|
-
if (t.decimals === void 0 || !/^\s*-?\d*\.?\d*[1-9]/.test(e) || /[1-9]/.test(n)) return
|
|
55
|
-
let r =
|
|
63
|
+
function _(e, t = {}) {
|
|
64
|
+
let n = y(e, t);
|
|
65
|
+
if (t.decimals === void 0 || !/^\s*-?\d*\.?\d*[1-9]/.test(e) || /[1-9]/.test(n)) return v(n);
|
|
66
|
+
let r = v(`$${t.decimals ? `0.${"1".padStart(t.decimals, "0")}` : "1"}`);
|
|
56
67
|
return /^\s*-/.test(e) ? `>\u00a0−${r}` : `<\u00a0${r}`;
|
|
57
68
|
}
|
|
58
|
-
function
|
|
69
|
+
function v(e) {
|
|
59
70
|
let n = /^(−?)\$([\d,]+)(?:\.(\d+))?$/.exec(e);
|
|
60
71
|
if (t === "en" || t.startsWith("zh") || !n) return e;
|
|
61
|
-
let r = new Intl.NumberFormat(
|
|
72
|
+
let r = new Intl.NumberFormat(u(), {
|
|
62
73
|
style: "currency",
|
|
63
74
|
currency: "USD"
|
|
64
|
-
}).formatToParts(1000.5), i = (e) => r.find((t) => t.type === e)?.value, a = r.findIndex((e) => e.type === "currency"),
|
|
65
|
-
return
|
|
75
|
+
}).formatToParts(1000.5), i = (e) => r.find((t) => t.type === e)?.value, a = r.findIndex((e) => e.type === "currency"), o = a < r.findIndex((e) => e.type === "integer"), s = r[o ? a + 1 : a - 1], c = s?.type === "literal" ? s.value : "", l = (n[2] ?? "").replace(/,/g, i("group") ?? ",") + (n[3] ? `${i("decimal") ?? "."}${n[3]}` : ""), d = i("currency") ?? "$";
|
|
76
|
+
return o ? `${n[1]}${d}${c}${l}` : `${n[1]}${l}${c}${d}`;
|
|
66
77
|
}
|
|
67
|
-
function
|
|
78
|
+
function y(e, t) {
|
|
68
79
|
let n = t.significant ?? 3, r = /^\s*(-)?(\d*)(?:\.(\d*))?\s*$/.exec(e);
|
|
69
80
|
if (!r) return e;
|
|
70
81
|
let i = r[1] === "-", a = (r[2] ?? "").replace(/^0+(?=\d)/, "") || "0", o = r[3] ?? "", s = i ? "−" : "";
|
|
@@ -72,7 +83,7 @@ function h(e, t) {
|
|
|
72
83
|
let e = t.decimals, n = (a + o.padEnd(e + 1, "0").slice(0, e + 1)).replace(/^0+(?=\d)/, ""), r = BigInt(n.slice(0, -1) || "0");
|
|
73
84
|
Number(n.slice(-1)) >= 5 && (r += 1n);
|
|
74
85
|
let c = r.toString().padStart(e + 1, "0"), l = c.slice(0, c.length - e) || "0";
|
|
75
|
-
return `${i && r !== 0n ? s : ""}$${
|
|
86
|
+
return `${i && r !== 0n ? s : ""}$${g(l)}${e ? `.${c.slice(-e)}` : ""}`;
|
|
76
87
|
}
|
|
77
88
|
if (a === "0" && /^0{2}/.test(o.padEnd(2, "0")) && /[1-9]/.test(o)) {
|
|
78
89
|
let e = o.match(/^0*/)?.[0].length ?? 0, t = o.slice(e, e + n + 1).padEnd(n + 1, "0"), r = BigInt(t.slice(0, n));
|
|
@@ -81,35 +92,35 @@ function h(e, t) {
|
|
|
81
92
|
return i.length > n && (--e, i = i.slice(0, n)), e < 2 ? `${s}$0.${"0".repeat(Math.max(0, e))}${i}`.replace(/^(−?\$0\.\d{2})\d*$/, "$1") : `${s}$0.${"0".repeat(e)}${i}`;
|
|
82
93
|
}
|
|
83
94
|
let c = o.padEnd(3, "0"), l = BigInt(a), u = Number(c.slice(0, 2));
|
|
84
|
-
return Number(c[2]) >= 5 && (u += 1), u === 100 && (u = 0, l += 1n), `${i && (l !== 0n || u !== 0) ? s : ""}$${
|
|
95
|
+
return Number(c[2]) >= 5 && (u += 1), u === 100 && (u = 0, l += 1n), `${i && (l !== 0n || u !== 0) ? s : ""}$${g(l.toString())}.${String(u).padStart(2, "0")}`;
|
|
85
96
|
}
|
|
86
|
-
function
|
|
97
|
+
function b(e, t = {}) {
|
|
87
98
|
let n = Math.round(e);
|
|
88
|
-
if (n < 1e3) return
|
|
89
|
-
let r = t.precise ? 2 : 1,
|
|
99
|
+
if (n < 1e3) return a("format.milliseconds", "{ms} ms", { ms: String(n) });
|
|
100
|
+
let r = t.precise ? 2 : 1, i = (t) => Math.round(e / 10 ** (3 - t)) / 10 ** t, o = (e) => a("format.seconds", "{s} s", { s: f(i(e), {
|
|
90
101
|
minimumFractionDigits: t.precise ? e : 0,
|
|
91
102
|
maximumFractionDigits: e
|
|
92
103
|
}) });
|
|
93
|
-
if (
|
|
94
|
-
if (
|
|
95
|
-
let s =
|
|
104
|
+
if (i(r) < 10) return o(r);
|
|
105
|
+
if (i(r - 1) < 60) return o(r - 1);
|
|
106
|
+
let s = i(0);
|
|
96
107
|
if (s < 3600) {
|
|
97
108
|
let e = Math.floor(s / 60), t = s % 60;
|
|
98
|
-
return t ?
|
|
109
|
+
return t ? a("format.minutesSeconds", "{min} min {s} s", {
|
|
99
110
|
min: String(e),
|
|
100
111
|
s: String(t)
|
|
101
|
-
}) :
|
|
112
|
+
}) : a("format.minutes", "{min} min", { min: String(e) });
|
|
102
113
|
}
|
|
103
|
-
let
|
|
104
|
-
return
|
|
105
|
-
h: String(Math.floor(
|
|
106
|
-
min: String(
|
|
114
|
+
let c = Math.round(e / 6e4);
|
|
115
|
+
return a("format.hoursMinutes", "{h} h {min} min", {
|
|
116
|
+
h: String(Math.floor(c / 60)),
|
|
117
|
+
min: String(c % 60)
|
|
107
118
|
});
|
|
108
119
|
}
|
|
109
|
-
var
|
|
110
|
-
function
|
|
111
|
-
let n =
|
|
112
|
-
return `${new Intl.DateTimeFormat(
|
|
120
|
+
var x = (e) => e instanceof Date ? e : new Date(e);
|
|
121
|
+
function S(e, t = {}) {
|
|
122
|
+
let n = x(e);
|
|
123
|
+
return `${new Intl.DateTimeFormat(d(), {
|
|
113
124
|
day: "numeric",
|
|
114
125
|
month: "short",
|
|
115
126
|
year: "numeric",
|
|
@@ -119,28 +130,28 @@ function v(e, t = {}) {
|
|
|
119
130
|
...t.seconds ? { second: "2-digit" } : {},
|
|
120
131
|
hourCycle: "h23"
|
|
121
132
|
} : {},
|
|
122
|
-
...t.utc ? { timeZone: "UTC" } :
|
|
133
|
+
...t.utc ? { timeZone: "UTC" } : l()
|
|
123
134
|
}).format(n)}${t.utc ? " UTC" : ""}`;
|
|
124
135
|
}
|
|
125
|
-
function
|
|
126
|
-
let n =
|
|
136
|
+
function C(e, t) {
|
|
137
|
+
let n = x(e), r = x(t), i = new Intl.DateTimeFormat(u(), {
|
|
127
138
|
month: "short",
|
|
128
139
|
day: "numeric"
|
|
129
|
-
}), a = new Intl.DateTimeFormat(
|
|
140
|
+
}), a = new Intl.DateTimeFormat(u(), {
|
|
130
141
|
month: "short",
|
|
131
142
|
day: "numeric",
|
|
132
143
|
year: "numeric"
|
|
133
144
|
});
|
|
134
145
|
if (n.getFullYear() !== r.getFullYear()) return `${a.format(n)} – ${a.format(r)}`;
|
|
135
|
-
let
|
|
136
|
-
return n.toDateString() === r.toDateString() ?
|
|
146
|
+
let o = i.format(n);
|
|
147
|
+
return n.toDateString() === r.toDateString() ? o : `${o} – ${i.format(r)}`;
|
|
137
148
|
}
|
|
138
|
-
var
|
|
139
|
-
function
|
|
140
|
-
let n =
|
|
141
|
-
return t.utc ? n.toISOString().slice(0, 10) : `${String(n.getFullYear()).padStart(4, "0")}-${
|
|
149
|
+
var w = (e) => String(e).padStart(2, "0");
|
|
150
|
+
function T(e, t = {}) {
|
|
151
|
+
let n = x(e);
|
|
152
|
+
return t.utc ? n.toISOString().slice(0, 10) : `${String(n.getFullYear()).padStart(4, "0")}-${w(n.getMonth() + 1)}-${w(n.getDate())}`;
|
|
142
153
|
}
|
|
143
|
-
function
|
|
154
|
+
function E(e) {
|
|
144
155
|
let t = /^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());
|
|
145
156
|
if (!t) return null;
|
|
146
157
|
let [n, r, i] = [
|
|
@@ -150,29 +161,34 @@ function S(e) {
|
|
|
150
161
|
], a = new Date(2e3, 0, 1);
|
|
151
162
|
return a.setFullYear(n, r, i), a.getFullYear() === n && a.getMonth() === r && a.getDate() === i ? a : null;
|
|
152
163
|
}
|
|
153
|
-
function
|
|
154
|
-
let n =
|
|
155
|
-
if (
|
|
156
|
-
if (
|
|
157
|
-
let e = Math.round(
|
|
158
|
-
return o ?
|
|
164
|
+
function D(e, t = Date.now()) {
|
|
165
|
+
let n = x(e), r = x(t).getTime() - n.getTime(), i = Math.abs(r), o = r < 0;
|
|
166
|
+
if (i < 45e3) return a("format.justNow", "just now");
|
|
167
|
+
if (i < 36e5) {
|
|
168
|
+
let e = Math.round(i / 6e4);
|
|
169
|
+
return o ? a("format.inMinutes", "in {count} min", { count: e }) : a("format.minutesAgo", "{count} min ago", { count: e });
|
|
159
170
|
}
|
|
160
|
-
if (
|
|
161
|
-
let e = Math.round(
|
|
162
|
-
return o ?
|
|
171
|
+
if (i < 864e5) {
|
|
172
|
+
let e = Math.round(i / 36e5);
|
|
173
|
+
return o ? a("format.inHours", "in {count} h", { count: e }) : a("format.hoursAgo", "{count} h ago", { count: e });
|
|
163
174
|
}
|
|
164
|
-
if (
|
|
165
|
-
if (
|
|
166
|
-
let e = Math.round(
|
|
167
|
-
return o ?
|
|
175
|
+
if (i < 1728e5 && !o) return a("format.yesterday", "yesterday");
|
|
176
|
+
if (i < 6048e5) {
|
|
177
|
+
let e = Math.round(i / 864e5);
|
|
178
|
+
return o ? a("format.inDays", "{count, plural, one {in # day} other {in # days}}", { count: e }) : a("format.daysAgo", "{count, plural, one {# day ago} other {# days ago}}", { count: e });
|
|
168
179
|
}
|
|
169
|
-
|
|
180
|
+
let s = new Intl.DateTimeFormat("en", {
|
|
181
|
+
year: "numeric",
|
|
182
|
+
...l()
|
|
183
|
+
});
|
|
184
|
+
return new Intl.DateTimeFormat(d(), {
|
|
170
185
|
day: "numeric",
|
|
171
186
|
month: "short",
|
|
172
|
-
...
|
|
187
|
+
...l(),
|
|
188
|
+
...s.format(n) === s.format(x(t)) ? {} : { year: "numeric" }
|
|
173
189
|
}).format(n);
|
|
174
190
|
}
|
|
175
191
|
//#endregion
|
|
176
|
-
export {
|
|
192
|
+
export { m as formatBytes, S as formatDate, C as formatDateRange, b as formatDuration, T as formatISODate, o as formatLocale, f as formatNumber, h as formatPercent, D as formatRelative, c as formatTimeZone, p as formatTokens, _ as formatUSD, E as parseISODate, i as setFormatLocale, s as setFormatTimeZone };
|
|
177
193
|
|
|
178
194
|
//# sourceMappingURL=format.js.map
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","names":["formatMessage","current","words","setFormatLocale","locale","messages","t","key","english","values","formatLocale","numberLocale","dateLocale","formatNumber","options","value","formatTokens","formatBytes","units","v","bytes","i","digits","formatPercent","ratio","groupThousands","int","formatUSD","text","writeUSD","amount","localUSD","smallest","m","parts","part","p","type","at","before","gap","space","number","symbol","significant","match","negative","intPart","frac","sign","n","scaled","str","whole","lead","take","kept","cents","two","formatDuration","ms","places","secondsTo","seconds","total","min","s","minutes","toDate","d","formatDate","formatDateRange","a","from","b","to","f","withYear","start","pad2","formatISODate","parseISODate","y","mo","day","formatRelative","diff","now","abs","future","count"],"sources":["../src/format/index.ts"],"sourcesContent":["import { formatMessage, type MessageValues } from \"../i18n/message.js\";\n\nlet current = \"en\";\nlet words: Readonly<Record<string, string>> = {};\n\nexport function setFormatLocale(locale: string, messages: Readonly<Record<string, string>> = {}): void {\n current = locale;\n words = messages;\n}\n\nconst t = (key: string, english: string, values?: MessageValues) => formatMessage(words[key] ?? english, values, current);\n\nexport function formatLocale(): string {\n return current;\n}\n\nconst numberLocale = () => (current === \"en\" ? \"en-US\" : current);\nconst dateLocale = () => (current === \"en\" ? \"en-GB\" : current);\n\nexport function formatNumber(value: number, options: Intl.NumberFormatOptions = {}): string {\n return new Intl.NumberFormat(numberLocale(), { maximumFractionDigits: 2, ...options }).format(value);\n}\n\nexport function formatTokens(value: number): string {\n if (Math.abs(value) < 1000) return formatNumber(value, { maximumFractionDigits: 0 });\n return new Intl.NumberFormat(numberLocale(), {\n notation: \"compact\",\n maximumFractionDigits: 1,\n maximumSignificantDigits: 3,\n roundingPriority: \"morePrecision\",\n }).format(value);\n}\n\nexport function formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n let v = bytes;\n let i = 0;\n while (Math.abs(v) >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n const digits = i === 0 || v >= 100 ? 0 : 1;\n return `${formatNumber(v, { minimumFractionDigits: digits, maximumFractionDigits: digits, useGrouping: false })} ${units[i]}`;\n}\n\nexport function formatPercent(ratio: number, digits = 1): string {\n return new Intl.NumberFormat(numberLocale(), { style: \"percent\", maximumFractionDigits: digits }).format(ratio);\n}\n\nfunction groupThousands(int: string): string {\n return int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\nexport function formatUSD(amount: string, options: { significant?: number; decimals?: number } = {}): string {\n const text = writeUSD(amount, options);\n if (options.decimals === undefined || !/^\\s*-?\\d*\\.?\\d*[1-9]/.test(amount) || /[1-9]/.test(text)) return localUSD(text);\n const smallest = localUSD(`$${options.decimals ? `0.${\"1\".padStart(options.decimals, \"0\")}` : \"1\"}`);\n return /^\\s*-/.test(amount) ? `>\\u00a0−${smallest}` : `<\\u00a0${smallest}`;\n}\n\nfunction localUSD(text: string): string {\n const m = /^(−?)\\$([\\d,]+)(?:\\.(\\d+))?$/.exec(text);\n if (current === \"en\" || current.startsWith(\"zh\") || !m) return text;\n const parts = new Intl.NumberFormat(numberLocale(), { style: \"currency\", currency: \"USD\" }).formatToParts(1000.5);\n const part = (type: string) => parts.find((p) => p.type === type)?.value;\n const at = parts.findIndex((p) => p.type === \"currency\");\n const before = at < parts.findIndex((p) => p.type === \"integer\");\n const gap = parts[before ? at + 1 : at - 1];\n const space = gap?.type === \"literal\" ? gap.value : \"\";\n const number = (m[2] ?? \"\").replace(/,/g, part(\"group\") ?? \",\") + (m[3] ? `${part(\"decimal\") ?? \".\"}${m[3]}` : \"\");\n const symbol = part(\"currency\") ?? \"$\";\n return before ? `${m[1]}${symbol}${space}${number}` : `${m[1]}${number}${space}${symbol}`;\n}\n\nfunction writeUSD(amount: string, options: { significant?: number; decimals?: number }): string {\n const significant = options.significant ?? 3;\n const match = /^\\s*(-)?(\\d*)(?:\\.(\\d*))?\\s*$/.exec(amount);\n if (!match) return amount;\n const negative = match[1] === \"-\";\n const intPart = (match[2] ?? \"\").replace(/^0+(?=\\d)/, \"\") || \"0\";\n const frac = match[3] ?? \"\";\n const sign = negative ? \"−\" : \"\";\n if (options.decimals !== undefined) {\n const n = options.decimals;\n const digits = (intPart + frac.padEnd(n + 1, \"0\").slice(0, n + 1)).replace(/^0+(?=\\d)/, \"\");\n let scaled = BigInt(digits.slice(0, -1) || \"0\");\n if (Number(digits.slice(-1)) >= 5) scaled += 1n;\n const str = scaled.toString().padStart(n + 1, \"0\");\n const whole = str.slice(0, str.length - n) || \"0\";\n const isZero = scaled === 0n;\n return `${negative && !isZero ? sign : \"\"}$${groupThousands(whole)}${n ? `.${str.slice(-n)}` : \"\"}`;\n }\n if (intPart === \"0\" && /^0{2}/.test(frac.padEnd(2, \"0\")) && /[1-9]/.test(frac)) {\n let lead = frac.match(/^0*/)?.[0].length ?? 0;\n const take = frac.slice(lead, lead + significant + 1).padEnd(significant + 1, \"0\");\n let kept = BigInt(take.slice(0, significant));\n if (Number(take[significant]) >= 5) kept += 1n;\n let digits = kept.toString().padStart(significant, \"0\");\n if (digits.length > significant) {\n lead -= 1;\n digits = digits.slice(0, significant);\n }\n if (lead < 2) return `${sign}$0.${\"0\".repeat(Math.max(0, lead))}${digits}`.replace(/^(−?\\$0\\.\\d{2})\\d*$/, \"$1\");\n return `${sign}$0.${\"0\".repeat(lead)}${digits}`;\n }\n const cents = frac.padEnd(3, \"0\");\n let whole = BigInt(intPart);\n let two = Number(cents.slice(0, 2));\n if (Number(cents[2]) >= 5) two += 1;\n if (two === 100) {\n two = 0;\n whole += 1n;\n }\n const isZero = whole === 0n && two === 0;\n return `${negative && !isZero ? sign : \"\"}$${groupThousands(whole.toString())}.${String(two).padStart(2, \"0\")}`;\n}\n\nexport function formatDuration(ms: number, options: { precise?: boolean | undefined } = {}): string {\n const whole = Math.round(ms);\n if (whole < 1000) return t(\"format.milliseconds\", \"{ms} ms\", { ms: String(whole) });\n const places = options.precise ? 2 : 1;\n const secondsTo = (digits: number) => Math.round(ms / 10 ** (3 - digits)) / 10 ** digits;\n const seconds = (digits: number) =>\n t(\"format.seconds\", \"{s} s\", {\n s: formatNumber(secondsTo(digits), { minimumFractionDigits: options.precise ? digits : 0, maximumFractionDigits: digits }),\n });\n if (secondsTo(places) < 10) return seconds(places);\n if (secondsTo(places - 1) < 60) return seconds(places - 1);\n const total = secondsTo(0);\n if (total < 3600) {\n const min = Math.floor(total / 60);\n const s = total % 60;\n return s ? t(\"format.minutesSeconds\", \"{min} min {s} s\", { min: String(min), s: String(s) }) : t(\"format.minutes\", \"{min} min\", { min: String(min) });\n }\n const minutes = Math.round(ms / 60_000);\n return t(\"format.hoursMinutes\", \"{h} h {min} min\", { h: String(Math.floor(minutes / 60)), min: String(minutes % 60) });\n}\n\ntype DateInput = Date | string | number;\nconst toDate = (d: DateInput) => (d instanceof Date ? d : new Date(d));\n\nexport function formatDate(value: DateInput, options: { time?: boolean; utc?: boolean; seconds?: boolean } = {}): string {\n const d = toDate(value);\n const f = new Intl.DateTimeFormat(dateLocale(), {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n ...(options.time ? { hour: \"2-digit\", minute: \"2-digit\", ...(options.seconds ? { second: \"2-digit\" } : {}), hourCycle: \"h23\" } : {}),\n ...(options.utc ? { timeZone: \"UTC\" } : {}),\n });\n return `${f.format(d)}${options.utc ? \" UTC\" : \"\"}`;\n}\n\nexport function formatDateRange(from: DateInput, to: DateInput): string {\n const a = toDate(from);\n const b = toDate(to);\n const f = new Intl.DateTimeFormat(numberLocale(), { month: \"short\", day: \"numeric\" });\n const withYear = new Intl.DateTimeFormat(numberLocale(), { month: \"short\", day: \"numeric\", year: \"numeric\" });\n if (a.getFullYear() !== b.getFullYear()) return `${withYear.format(a)} – ${withYear.format(b)}`;\n const start = f.format(a);\n return a.toDateString() === b.toDateString() ? start : `${start} – ${f.format(b)}`;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n\nexport function formatISODate(value: DateInput, options: { utc?: boolean | undefined } = {}): string {\n const d = toDate(value);\n if (options.utc) return d.toISOString().slice(0, 10);\n return `${String(d.getFullYear()).padStart(4, \"0\")}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nexport function parseISODate(text: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text.trim());\n if (!m) return null;\n const [y, mo, day] = [Number(m[1]), Number(m[2]) - 1, Number(m[3])];\n const d = new Date(2000, 0, 1);\n d.setFullYear(y, mo, day);\n return d.getFullYear() === y && d.getMonth() === mo && d.getDate() === day ? d : null;\n}\n\nexport function formatRelative(value: DateInput, now: DateInput = Date.now()): string {\n const d = toDate(value);\n const diff = toDate(now).getTime() - d.getTime();\n const abs = Math.abs(diff);\n const future = diff < 0;\n if (abs < 45_000) return t(\"format.justNow\", \"just now\");\n if (abs < 3_600_000) {\n const count = Math.round(abs / 60_000);\n return future ? t(\"format.inMinutes\", \"in {count} min\", { count }) : t(\"format.minutesAgo\", \"{count} min ago\", { count });\n }\n if (abs < 86_400_000) {\n const count = Math.round(abs / 3_600_000);\n return future ? t(\"format.inHours\", \"in {count} h\", { count }) : t(\"format.hoursAgo\", \"{count} h ago\", { count });\n }\n if (abs < 172_800_000 && !future) return t(\"format.yesterday\", \"yesterday\");\n if (abs < 7 * 86_400_000) {\n const count = Math.round(abs / 86_400_000);\n return future\n ? t(\"format.inDays\", \"{count, plural, one {in # day} other {in # days}}\", { count })\n : t(\"format.daysAgo\", \"{count, plural, one {# day ago} other {# days ago}}\", { count });\n }\n return new Intl.DateTimeFormat(dateLocale(), {\n day: \"numeric\",\n month: \"short\",\n ...(d.getFullYear() !== toDate(now).getFullYear() ? { year: \"numeric\" } : {}),\n }).format(d);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.js","names":["formatMessage","current","words","zone","setFormatLocale","locale","messages","t","key","english","values","formatLocale","setFormatTimeZone","timeZone","formatTimeZone","inZone","numberLocale","dateLocale","formatNumber","options","value","formatTokens","formatBytes","units","v","bytes","i","digits","formatPercent","ratio","groupThousands","int","formatUSD","text","writeUSD","amount","localUSD","smallest","m","parts","part","p","type","at","before","gap","space","number","symbol","significant","match","negative","intPart","frac","sign","n","scaled","str","whole","lead","take","kept","cents","two","formatDuration","ms","places","secondsTo","seconds","total","min","s","minutes","toDate","d","formatDate","formatDateRange","a","from","b","to","f","withYear","start","pad2","formatISODate","parseISODate","y","mo","day","formatRelative","diff","now","abs","future","count","year"],"sources":["../src/format/index.ts"],"sourcesContent":["import { formatMessage, type MessageValues } from \"../i18n/message.js\";\n\nlet current = \"en\";\nlet words: Readonly<Record<string, string>> = {};\nlet zone: string | undefined;\n\nexport function setFormatLocale(locale: string, messages: Readonly<Record<string, string>> = {}): void {\n current = locale;\n words = messages;\n}\n\nconst t = (key: string, english: string, values?: MessageValues) => formatMessage(words[key] ?? english, values, current);\n\nexport function formatLocale(): string {\n return current;\n}\n\nexport function setFormatTimeZone(timeZone: string | undefined): void {\n if (!timeZone) {\n zone = undefined;\n return;\n }\n try {\n new Intl.DateTimeFormat(\"en\", { timeZone });\n zone = timeZone;\n } catch {\n zone = undefined;\n }\n}\n\nexport function formatTimeZone(): string | undefined {\n return zone;\n}\n\nconst inZone = (): { timeZone?: string } => (zone ? { timeZone: zone } : {});\n\nconst numberLocale = () => (current === \"en\" ? \"en-US\" : current);\nconst dateLocale = () => (current === \"en\" ? \"en-GB\" : current);\n\nexport function formatNumber(value: number, options: Intl.NumberFormatOptions = {}): string {\n return new Intl.NumberFormat(numberLocale(), { maximumFractionDigits: 2, ...options }).format(value);\n}\n\nexport function formatTokens(value: number): string {\n if (Math.abs(value) < 1000) return formatNumber(value, { maximumFractionDigits: 0 });\n return new Intl.NumberFormat(numberLocale(), {\n notation: \"compact\",\n maximumFractionDigits: 1,\n maximumSignificantDigits: 3,\n roundingPriority: \"morePrecision\",\n }).format(value);\n}\n\nexport function formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n let v = bytes;\n let i = 0;\n while (Math.abs(v) >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n const digits = i === 0 || v >= 100 ? 0 : 1;\n return `${formatNumber(v, { minimumFractionDigits: digits, maximumFractionDigits: digits, useGrouping: false })} ${units[i]}`;\n}\n\nexport function formatPercent(ratio: number, digits = 1): string {\n return new Intl.NumberFormat(numberLocale(), { style: \"percent\", maximumFractionDigits: digits }).format(ratio);\n}\n\nfunction groupThousands(int: string): string {\n return int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\nexport function formatUSD(amount: string, options: { significant?: number; decimals?: number } = {}): string {\n const text = writeUSD(amount, options);\n if (options.decimals === undefined || !/^\\s*-?\\d*\\.?\\d*[1-9]/.test(amount) || /[1-9]/.test(text)) return localUSD(text);\n const smallest = localUSD(`$${options.decimals ? `0.${\"1\".padStart(options.decimals, \"0\")}` : \"1\"}`);\n return /^\\s*-/.test(amount) ? `>\\u00a0−${smallest}` : `<\\u00a0${smallest}`;\n}\n\nfunction localUSD(text: string): string {\n const m = /^(−?)\\$([\\d,]+)(?:\\.(\\d+))?$/.exec(text);\n if (current === \"en\" || current.startsWith(\"zh\") || !m) return text;\n const parts = new Intl.NumberFormat(numberLocale(), { style: \"currency\", currency: \"USD\" }).formatToParts(1000.5);\n const part = (type: string) => parts.find((p) => p.type === type)?.value;\n const at = parts.findIndex((p) => p.type === \"currency\");\n const before = at < parts.findIndex((p) => p.type === \"integer\");\n const gap = parts[before ? at + 1 : at - 1];\n const space = gap?.type === \"literal\" ? gap.value : \"\";\n const number = (m[2] ?? \"\").replace(/,/g, part(\"group\") ?? \",\") + (m[3] ? `${part(\"decimal\") ?? \".\"}${m[3]}` : \"\");\n const symbol = part(\"currency\") ?? \"$\";\n return before ? `${m[1]}${symbol}${space}${number}` : `${m[1]}${number}${space}${symbol}`;\n}\n\nfunction writeUSD(amount: string, options: { significant?: number; decimals?: number }): string {\n const significant = options.significant ?? 3;\n const match = /^\\s*(-)?(\\d*)(?:\\.(\\d*))?\\s*$/.exec(amount);\n if (!match) return amount;\n const negative = match[1] === \"-\";\n const intPart = (match[2] ?? \"\").replace(/^0+(?=\\d)/, \"\") || \"0\";\n const frac = match[3] ?? \"\";\n const sign = negative ? \"−\" : \"\";\n if (options.decimals !== undefined) {\n const n = options.decimals;\n const digits = (intPart + frac.padEnd(n + 1, \"0\").slice(0, n + 1)).replace(/^0+(?=\\d)/, \"\");\n let scaled = BigInt(digits.slice(0, -1) || \"0\");\n if (Number(digits.slice(-1)) >= 5) scaled += 1n;\n const str = scaled.toString().padStart(n + 1, \"0\");\n const whole = str.slice(0, str.length - n) || \"0\";\n const isZero = scaled === 0n;\n return `${negative && !isZero ? sign : \"\"}$${groupThousands(whole)}${n ? `.${str.slice(-n)}` : \"\"}`;\n }\n if (intPart === \"0\" && /^0{2}/.test(frac.padEnd(2, \"0\")) && /[1-9]/.test(frac)) {\n let lead = frac.match(/^0*/)?.[0].length ?? 0;\n const take = frac.slice(lead, lead + significant + 1).padEnd(significant + 1, \"0\");\n let kept = BigInt(take.slice(0, significant));\n if (Number(take[significant]) >= 5) kept += 1n;\n let digits = kept.toString().padStart(significant, \"0\");\n if (digits.length > significant) {\n lead -= 1;\n digits = digits.slice(0, significant);\n }\n if (lead < 2) return `${sign}$0.${\"0\".repeat(Math.max(0, lead))}${digits}`.replace(/^(−?\\$0\\.\\d{2})\\d*$/, \"$1\");\n return `${sign}$0.${\"0\".repeat(lead)}${digits}`;\n }\n const cents = frac.padEnd(3, \"0\");\n let whole = BigInt(intPart);\n let two = Number(cents.slice(0, 2));\n if (Number(cents[2]) >= 5) two += 1;\n if (two === 100) {\n two = 0;\n whole += 1n;\n }\n const isZero = whole === 0n && two === 0;\n return `${negative && !isZero ? sign : \"\"}$${groupThousands(whole.toString())}.${String(two).padStart(2, \"0\")}`;\n}\n\nexport function formatDuration(ms: number, options: { precise?: boolean | undefined } = {}): string {\n const whole = Math.round(ms);\n if (whole < 1000) return t(\"format.milliseconds\", \"{ms} ms\", { ms: String(whole) });\n const places = options.precise ? 2 : 1;\n const secondsTo = (digits: number) => Math.round(ms / 10 ** (3 - digits)) / 10 ** digits;\n const seconds = (digits: number) =>\n t(\"format.seconds\", \"{s} s\", {\n s: formatNumber(secondsTo(digits), { minimumFractionDigits: options.precise ? digits : 0, maximumFractionDigits: digits }),\n });\n if (secondsTo(places) < 10) return seconds(places);\n if (secondsTo(places - 1) < 60) return seconds(places - 1);\n const total = secondsTo(0);\n if (total < 3600) {\n const min = Math.floor(total / 60);\n const s = total % 60;\n return s ? t(\"format.minutesSeconds\", \"{min} min {s} s\", { min: String(min), s: String(s) }) : t(\"format.minutes\", \"{min} min\", { min: String(min) });\n }\n const minutes = Math.round(ms / 60_000);\n return t(\"format.hoursMinutes\", \"{h} h {min} min\", { h: String(Math.floor(minutes / 60)), min: String(minutes % 60) });\n}\n\ntype DateInput = Date | string | number;\nconst toDate = (d: DateInput) => (d instanceof Date ? d : new Date(d));\n\nexport function formatDate(value: DateInput, options: { time?: boolean; utc?: boolean; seconds?: boolean } = {}): string {\n const d = toDate(value);\n const f = new Intl.DateTimeFormat(dateLocale(), {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n ...(options.time ? { hour: \"2-digit\", minute: \"2-digit\", ...(options.seconds ? { second: \"2-digit\" } : {}), hourCycle: \"h23\" } : {}),\n ...(options.utc ? { timeZone: \"UTC\" } : inZone()),\n });\n return `${f.format(d)}${options.utc ? \" UTC\" : \"\"}`;\n}\n\nexport function formatDateRange(from: DateInput, to: DateInput): string {\n const a = toDate(from);\n const b = toDate(to);\n const f = new Intl.DateTimeFormat(numberLocale(), { month: \"short\", day: \"numeric\" });\n const withYear = new Intl.DateTimeFormat(numberLocale(), { month: \"short\", day: \"numeric\", year: \"numeric\" });\n if (a.getFullYear() !== b.getFullYear()) return `${withYear.format(a)} – ${withYear.format(b)}`;\n const start = f.format(a);\n return a.toDateString() === b.toDateString() ? start : `${start} – ${f.format(b)}`;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n\nexport function formatISODate(value: DateInput, options: { utc?: boolean | undefined } = {}): string {\n const d = toDate(value);\n if (options.utc) return d.toISOString().slice(0, 10);\n return `${String(d.getFullYear()).padStart(4, \"0\")}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nexport function parseISODate(text: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text.trim());\n if (!m) return null;\n const [y, mo, day] = [Number(m[1]), Number(m[2]) - 1, Number(m[3])];\n const d = new Date(2000, 0, 1);\n d.setFullYear(y, mo, day);\n return d.getFullYear() === y && d.getMonth() === mo && d.getDate() === day ? d : null;\n}\n\nexport function formatRelative(value: DateInput, now: DateInput = Date.now()): string {\n const d = toDate(value);\n const diff = toDate(now).getTime() - d.getTime();\n const abs = Math.abs(diff);\n const future = diff < 0;\n if (abs < 45_000) return t(\"format.justNow\", \"just now\");\n if (abs < 3_600_000) {\n const count = Math.round(abs / 60_000);\n return future ? t(\"format.inMinutes\", \"in {count} min\", { count }) : t(\"format.minutesAgo\", \"{count} min ago\", { count });\n }\n if (abs < 86_400_000) {\n const count = Math.round(abs / 3_600_000);\n return future ? t(\"format.inHours\", \"in {count} h\", { count }) : t(\"format.hoursAgo\", \"{count} h ago\", { count });\n }\n if (abs < 172_800_000 && !future) return t(\"format.yesterday\", \"yesterday\");\n if (abs < 7 * 86_400_000) {\n const count = Math.round(abs / 86_400_000);\n return future\n ? t(\"format.inDays\", \"{count, plural, one {in # day} other {in # days}}\", { count })\n : t(\"format.daysAgo\", \"{count, plural, one {# day ago} other {# days ago}}\", { count });\n }\n const year = new Intl.DateTimeFormat(\"en\", { year: \"numeric\", ...inZone() });\n return new Intl.DateTimeFormat(dateLocale(), {\n day: \"numeric\",\n month: \"short\",\n ...inZone(),\n ...(year.format(d) !== year.format(toDate(now)) ? { year: \"numeric\" } : {}),\n }).format(d);\n}\n"],"mappings":"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"}
|