@purpurds/countdown 8.8.0 → 8.9.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.
@@ -1 +1 @@
1
- {"version":3,"file":"countdown.es.js","sources":["../../paragraph/dist/paragraph.es.js","../../visually-hidden/dist/visually-hidden.es.js","../../../common/temp/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/bind.js","../src/utils.ts","../src/counter.tsx","../src/countdown.tsx"],"sourcesContent":["import { jsx as l } from \"react/jsx-runtime\";\nfunction g(p) {\n return p && p.__esModule && Object.prototype.hasOwnProperty.call(p, \"default\") ? p.default : p;\n}\nvar o = { exports: {} };\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\nvar s;\nfunction _() {\n return s || (s = 1, (function(p) {\n (function() {\n var n = {}.hasOwnProperty;\n function u() {\n for (var r = \"\", a = 0; a < arguments.length; a++) {\n var e = arguments[a];\n e && (r = h(r, i.call(this, e)));\n }\n return r;\n }\n function i(r) {\n if (typeof r == \"string\" || typeof r == \"number\")\n return this && this[r] || r;\n if (typeof r != \"object\")\n return \"\";\n if (Array.isArray(r))\n return u.apply(this, r);\n if (r.toString !== Object.prototype.toString && !r.toString.toString().includes(\"[native code]\"))\n return r.toString();\n var a = \"\";\n for (var e in r)\n n.call(r, e) && r[e] && (a = h(a, this && this[e] || e));\n return a;\n }\n function h(r, a) {\n return a ? r ? r + \" \" + a : r + a : r;\n }\n p.exports ? (u.default = u, p.exports = u) : window.classNames = u;\n })();\n })(o)), o.exports;\n}\nvar d = _();\nconst c = /* @__PURE__ */ g(d), f = {\n \"purpur-paragraph\": \"_purpur-paragraph_1rh57_1\",\n \"purpur-paragraph--disabled\": \"_purpur-paragraph--disabled_1rh57_7\",\n \"purpur-paragraph--hyphens\": \"_purpur-paragraph--hyphens_1rh57_10\",\n \"purpur-paragraph--negative\": \"_purpur-paragraph--negative_1rh57_13\",\n \"purpur-paragraph--paragraph-100\": \"_purpur-paragraph--paragraph-100_1rh57_16\",\n \"purpur-paragraph--paragraph-100-medium\": \"_purpur-paragraph--paragraph-100-medium_1rh57_22\",\n \"purpur-paragraph--paragraph-100-bold\": \"_purpur-paragraph--paragraph-100-bold_1rh57_29\",\n \"purpur-paragraph--paragraph-200\": \"_purpur-paragraph--paragraph-200_1rh57_36\",\n \"purpur-paragraph--preamble-100\": \"_purpur-paragraph--preamble-100_1rh57_42\",\n \"purpur-paragraph--preamble-200\": \"_purpur-paragraph--preamble-200_1rh57_48\",\n \"purpur-paragraph--additional-100\": \"_purpur-paragraph--additional-100_1rh57_54\",\n \"purpur-paragraph--additional-100-medium\": \"_purpur-paragraph--additional-100-medium_1rh57_60\",\n \"purpur-paragraph--overline-100\": \"_purpur-paragraph--overline-100_1rh57_67\",\n \"purpur-paragraph--overline-200\": \"_purpur-paragraph--overline-200_1rh57_75\"\n}, m = c.bind(f), A = {\n PARAGRAPH100: \"paragraph-100\",\n PARAGRAPH100MEDIUM: \"paragraph-100-medium\",\n PARAGRAPH100BOLD: \"paragraph-100-bold\",\n PARAGRAPH200: \"paragraph-200\",\n PREAMBLE100: \"preamble-100\",\n PREAMBLE200: \"preamble-200\",\n ADDITIONAL100: \"additional-100\",\n ADDITIONAL100MEDIUM: \"additional-100-medium\",\n OVERLINE100: \"overline-100\",\n OVERLINE200: \"overline-200\"\n}, t = \"purpur-paragraph\", b = ({\n children: p,\n className: n,\n disabled: u,\n enableHyphenation: i = !1,\n negative: h = !1,\n variant: r = A.PARAGRAPH100,\n ...a\n}) => {\n const e = m(n, t, `${t}--${r}`, {\n [`${t}--hyphens`]: i,\n [`${t}--disabled`]: u,\n [`${t}--negative`]: h\n });\n return /* @__PURE__ */ l(\"p\", { ...a, className: e, children: p });\n};\nb.displayName = \"Paragraph\";\nexport {\n b as Paragraph,\n A as ParagraphVariant\n};\n//# sourceMappingURL=paragraph.es.js.map\n","import { jsx as u } from \"react/jsx-runtime\";\nimport * as l from \"react\";\nimport \"react-dom\";\nfunction d(e, n) {\n if (typeof e == \"function\")\n return e(n);\n e != null && (e.current = n);\n}\nfunction h(...e) {\n return (n) => {\n let i = !1;\n const r = e.map((t) => {\n const o = d(t, n);\n return !i && typeof o == \"function\" && (i = !0), o;\n });\n if (i)\n return () => {\n for (let t = 0; t < r.length; t++) {\n const o = r[t];\n typeof o == \"function\" ? o() : d(e[t], null);\n }\n };\n };\n}\n// @__NO_SIDE_EFFECTS__\nfunction g(e) {\n const n = /* @__PURE__ */ v(e), i = l.forwardRef((r, t) => {\n const { children: o, ...a } = r, s = l.Children.toArray(o), c = s.find(S);\n if (c) {\n const f = c.props.children, y = s.map((p) => p === c ? l.Children.count(f) > 1 ? l.Children.only(null) : l.isValidElement(f) ? f.props.children : null : p);\n return /* @__PURE__ */ u(n, { ...a, ref: t, children: l.isValidElement(f) ? l.cloneElement(f, void 0, y) : null });\n }\n return /* @__PURE__ */ u(n, { ...a, ref: t, children: o });\n });\n return i.displayName = `${e}.Slot`, i;\n}\n// @__NO_SIDE_EFFECTS__\nfunction v(e) {\n const n = l.forwardRef((i, r) => {\n const { children: t, ...o } = i;\n if (l.isValidElement(t)) {\n const a = E(t), s = C(o, t.props);\n return t.type !== l.Fragment && (s.ref = r ? h(r, a) : a), l.cloneElement(t, s);\n }\n return l.Children.count(t) > 1 ? l.Children.only(null) : null;\n });\n return n.displayName = `${e}.SlotClone`, n;\n}\nvar w = Symbol(\"radix.slottable\");\nfunction S(e) {\n return l.isValidElement(e) && typeof e.type == \"function\" && \"__radixId\" in e.type && e.type.__radixId === w;\n}\nfunction C(e, n) {\n const i = { ...n };\n for (const r in n) {\n const t = e[r], o = n[r];\n /^on[A-Z]/.test(r) ? t && o ? i[r] = (...s) => {\n o(...s), t(...s);\n } : t && (i[r] = t) : r === \"style\" ? i[r] = { ...t, ...o } : r === \"className\" && (i[r] = [t, o].filter(Boolean).join(\" \"));\n }\n return { ...e, ...i };\n}\nfunction E(e) {\n var r, t;\n let n = (r = Object.getOwnPropertyDescriptor(e.props, \"ref\")) == null ? void 0 : r.get, i = n && \"isReactWarning\" in n && n.isReactWarning;\n return i ? e.ref : (n = (t = Object.getOwnPropertyDescriptor(e, \"ref\")) == null ? void 0 : t.get, i = n && \"isReactWarning\" in n && n.isReactWarning, i ? e.props.ref : e.props.ref || e.ref);\n}\nvar R = [\n \"a\",\n \"button\",\n \"div\",\n \"form\",\n \"h2\",\n \"h3\",\n \"img\",\n \"input\",\n \"label\",\n \"li\",\n \"nav\",\n \"ol\",\n \"p\",\n \"span\",\n \"svg\",\n \"ul\"\n], b = R.reduce((e, n) => {\n const i = /* @__PURE__ */ g(`Primitive.${n}`), r = l.forwardRef((t, o) => {\n const { asChild: a, ...s } = t, c = a ? i : n;\n return typeof window < \"u\" && (window[Symbol.for(\"radix-ui\")] = !0), /* @__PURE__ */ u(c, { ...s, ref: o });\n });\n return r.displayName = `Primitive.${n}`, { ...e, [n]: r };\n}, {}), N = \"VisuallyHidden\", m = l.forwardRef(\n (e, n) => /* @__PURE__ */ u(\n b.span,\n {\n ...e,\n ref: n,\n style: {\n // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss\n position: \"absolute\",\n border: 0,\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n wordWrap: \"normal\",\n ...e.style\n }\n }\n )\n);\nm.displayName = N;\nvar P = m;\nconst O = ({ asChild: e, children: n, ...i }) => /* @__PURE__ */ u(P, { asChild: e, ...i, children: n });\nexport {\n O as VisuallyHidden\n};\n//# sourceMappingURL=visually-hidden.es.js.map\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue.call(this, arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn this && this[arg] || arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(this, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, this && this[key] || key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","export function getDiffs(endtime: number) {\n const now = new Date().getTime();\n const diffInMs = Math.abs(endtime - now);\n\n let seconds = 0,\n minutes = 0,\n hours = 0,\n days = 0;\n\n if (diffInMs >= inMs.day) {\n days = Math.floor(diffInMs / inMs.day);\n }\n if (diffInMs >= inMs.hour) {\n hours = Math.floor((diffInMs % inMs.day) / inMs.hour);\n }\n if (diffInMs >= inMs.minute) {\n minutes = Math.floor((diffInMs % inMs.hour) / inMs.minute);\n }\n if (diffInMs >= inMs.second) {\n seconds = Math.floor((diffInMs % inMs.minute) / inMs.second);\n }\n\n return {\n seconds,\n minutes,\n hours,\n days,\n };\n}\n\nexport function getNext(time: number, tag: string) {\n let r = 0;\n if (tag === \"seconds\") r = time - 1 >= 0 ? time - 1 : 59;\n if (tag === \"minutes\") r = time - 1 >= 0 ? time - 1 : 59;\n if (tag === \"hours\") r = time - 1 >= 0 ? time - 1 : 23;\n if (tag === \"days\") r = time - 1 >= 0 ? time - 1 : 0;\n return r;\n}\n\nexport const inMs = {\n day: 24 * 60 * 60 * 1000,\n hour: 60 * 60 * 1000,\n minute: 60 * 1000,\n second: 1000,\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Paragraph } from \"@purpurds/paragraph\";\nimport c from \"classnames/bind\";\n\nimport { type CounterLabels } from \"./countdown.types\";\nimport styles from \"./counter.module.scss\";\nimport { getDiffs, getNext, inMs } from \"./utils\";\n\nconst cx = c.bind(styles);\n\nconst rootClassName = \"purpur-countdown-counter\";\n\ninterface CounterProps {\n end: number;\n size: \"md\" | \"lg\";\n tag: \"days\" | \"hours\" | \"minutes\" | \"seconds\";\n counterLabels: CounterLabels;\n}\n\nconst intervals: Map<string, ReturnType<typeof setInterval>> = new Map();\n\nexport const Counter = ({ tag, size, end, counterLabels }: CounterProps) => {\n const ref = useRef<HTMLHeadingElement>(null);\n const id = `${tag}-interval`;\n\n const [currentTime, setCurrentTime] = useState(getDiffs(end)[tag]);\n const [nextTime, setNextTime] = useState(getNext(currentTime, tag));\n const [animationKey, setAnimationKey] = useState(0);\n\n const checktime = useCallback(() => {\n const diffs = getDiffs(end);\n const next = getNext(diffs[tag], tag);\n\n setNextTime(next);\n setCurrentTime(diffs[tag]);\n }, [end, tag]);\n\n useEffect(() => {\n intervals.set(id, setInterval(checktime, inMs.second));\n return () => clearInterval(intervals.get(id)!);\n }, [checktime, id]);\n\n useEffect(() => {\n setAnimationKey((prev) => prev + 1);\n }, [currentTime]);\n\n const counterTag = counterLabels[tag];\n\n return (\n <div\n className={cx(rootClassName)}\n role=\"group\"\n aria-hidden=\"true\"\n data-testid={`counter-${tag}`}\n >\n <Paragraph\n className={cx(`${rootClassName}__number`, `${rootClassName}--size-${size}`)}\n ref={ref}\n data-tick={nextTime}\n key={animationKey}\n >\n {currentTime}\n </Paragraph>\n <Paragraph className={cx(`${rootClassName}__label`)}>{counterTag}</Paragraph>\n </div>\n );\n};\n","import React, { type ForwardedRef, forwardRef, useId } from \"react\";\nimport { Paragraph } from \"@purpurds/paragraph\";\nimport { VisuallyHidden } from \"@purpurds/visually-hidden\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./countdown.module.scss\";\nimport { type CountdownProps } from \"./countdown.types\";\nimport { Counter } from \"./counter\";\nimport { getDiffs } from \"./utils\";\n\nconst cx = c.bind(styles);\n\nconst rootClassName = \"purpur-countdown\";\n\nconst now = new Date();\n\n/**\n * Countdown component to display a countdown timer.\n * @param props - CountdownProps\n * @returns A React component that displays a countdown timer.\n */\n\nexport const Countdown = forwardRef(\n (\n { renderAfterEnd, renderBeforeStart, ...props }: CountdownProps,\n ref: ForwardedRef<HTMLButtonElement>\n ) => {\n const id = useId();\n\n const {\n size = \"lg\",\n fullWidth = false,\n negative = false,\n showDays = true,\n variant = \"primary\",\n className,\n counterLabels,\n } = props;\n\n const start = new Date(props.starttime).getTime();\n const end = new Date(props.endtime).getTime();\n\n const hasNotStarted = start > now.getTime();\n const hasEnded = end < now.getTime();\n\n if (hasNotStarted) return renderBeforeStart ? renderBeforeStart(props) : null;\n if (hasEnded) return renderAfterEnd ? renderAfterEnd(props) : null;\n\n const getCounters = () => {\n const counterProps = { size, end, counterLabels };\n\n return (\n <>\n {showDays && <Counter tag=\"days\" {...counterProps} />}\n <Counter tag=\"hours\" {...counterProps} />\n <Counter tag=\"minutes\" {...counterProps} />\n <Counter tag=\"seconds\" {...counterProps} />\n </>\n );\n };\n\n // Create a single announcement of the current time (only once)\n\n const renderAnnouncer = () => {\n const getTimeAnnouncement = () => {\n const { days, hours, minutes, seconds } = getDiffs(end);\n\n const parts = [];\n\n if (showDays) parts.push(`${days} ${counterLabels.days}`);\n parts.push(`${hours} ${counterLabels.hours}`);\n parts.push(`${minutes} ${counterLabels.minutes}`);\n parts.push(`${seconds} ${counterLabels.seconds}`);\n\n return parts.join(\", \");\n };\n\n return (\n <VisuallyHidden\n data-testid=\"live-region\"\n aria-live=\"polite\"\n aria-label={props[\"aria-label\"]}\n >\n {getTimeAnnouncement()}\n </VisuallyHidden>\n );\n };\n\n const counters = getCounters();\n\n const classes = cx([\n rootClassName,\n `${rootClassName}--size-${size}`,\n `${rootClassName}--variant-${variant}`,\n {\n [`${rootClassName}--fullwidth`]: fullWidth,\n [`${rootClassName}--negative`]: negative,\n [`${rootClassName}--showdays`]: showDays,\n },\n className,\n ]);\n\n return (\n <section\n id={id}\n className={classes}\n ref={ref}\n role=\"timer\"\n data-testid={props[\"data-testid\"]}\n >\n {/* Visually hidden live region that announces time only once */}\n {renderAnnouncer()}\n {props.label && (\n <Paragraph className={cx(`${rootClassName}__label`)} variant=\"paragraph-100-medium\">\n {props.label}\n </Paragraph>\n )}\n <div className={cx(`${rootClassName}__counter-container`)}>{counters}</div>\n </section>\n );\n }\n);\n\nCountdown.displayName = \"Countdown\";\n"],"names":["g","p","o","s","_","n","u","r","a","e","h","i","d","c","f","m","A","t","b","l","v","S","y","E","C","w","R","N","P","O","hasOwn","classNames","classes","arg","appendClass","parseValue","key","value","newClass","module","getDiffs","endtime","now","diffInMs","seconds","minutes","hours","days","inMs","getNext","time","tag","cx","styles","rootClassName","intervals","Counter","size","end","counterLabels","ref","useRef","id","currentTime","setCurrentTime","useState","nextTime","setNextTime","animationKey","setAnimationKey","checktime","useCallback","diffs","next","useEffect","prev","counterTag","jsxs","jsx","Paragraph","Countdown","forwardRef","renderAfterEnd","renderBeforeStart","props","useId","fullWidth","negative","showDays","variant","className","start","hasNotStarted","hasEnded","getCounters","counterProps","Fragment","renderAnnouncer","getTimeAnnouncement","parts","VisuallyHidden","counters"],"mappings":"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","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"countdown.es.js","sources":["../../paragraph/dist/paragraph.es.js","../../visually-hidden/dist/visually-hidden.es.js","../../../common/temp/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/bind.js","../src/utils.ts","../src/counter.tsx","../src/countdown.tsx"],"sourcesContent":["import { jsx as l } from \"react/jsx-runtime\";\nfunction g(p) {\n return p && p.__esModule && Object.prototype.hasOwnProperty.call(p, \"default\") ? p.default : p;\n}\nvar o = { exports: {} };\nvar s;\nfunction _() {\n return s || (s = 1, (function(p) {\n (function() {\n var n = {}.hasOwnProperty;\n function u() {\n for (var r = \"\", a = 0; a < arguments.length; a++) {\n var e = arguments[a];\n e && (r = h(r, i.call(this, e)));\n }\n return r;\n }\n function i(r) {\n if (typeof r == \"string\" || typeof r == \"number\")\n return this && this[r] || r;\n if (typeof r != \"object\")\n return \"\";\n if (Array.isArray(r))\n return u.apply(this, r);\n if (r.toString !== Object.prototype.toString && !r.toString.toString().includes(\"[native code]\"))\n return r.toString();\n var a = \"\";\n for (var e in r)\n n.call(r, e) && r[e] && (a = h(a, this && this[e] || e));\n return a;\n }\n function h(r, a) {\n return a ? r ? r + \" \" + a : r + a : r;\n }\n p.exports ? (u.default = u, p.exports = u) : window.classNames = u;\n })();\n })(o)), o.exports;\n}\nvar d = _();\nconst c = /* @__PURE__ */ g(d), f = {\n \"purpur-paragraph\": \"_purpur-paragraph_1rh57_1\",\n \"purpur-paragraph--disabled\": \"_purpur-paragraph--disabled_1rh57_7\",\n \"purpur-paragraph--hyphens\": \"_purpur-paragraph--hyphens_1rh57_10\",\n \"purpur-paragraph--negative\": \"_purpur-paragraph--negative_1rh57_13\",\n \"purpur-paragraph--paragraph-100\": \"_purpur-paragraph--paragraph-100_1rh57_16\",\n \"purpur-paragraph--paragraph-100-medium\": \"_purpur-paragraph--paragraph-100-medium_1rh57_22\",\n \"purpur-paragraph--paragraph-100-bold\": \"_purpur-paragraph--paragraph-100-bold_1rh57_29\",\n \"purpur-paragraph--paragraph-200\": \"_purpur-paragraph--paragraph-200_1rh57_36\",\n \"purpur-paragraph--preamble-100\": \"_purpur-paragraph--preamble-100_1rh57_42\",\n \"purpur-paragraph--preamble-200\": \"_purpur-paragraph--preamble-200_1rh57_48\",\n \"purpur-paragraph--additional-100\": \"_purpur-paragraph--additional-100_1rh57_54\",\n \"purpur-paragraph--additional-100-medium\": \"_purpur-paragraph--additional-100-medium_1rh57_60\",\n \"purpur-paragraph--overline-100\": \"_purpur-paragraph--overline-100_1rh57_67\",\n \"purpur-paragraph--overline-200\": \"_purpur-paragraph--overline-200_1rh57_75\"\n}, m = c.bind(f), A = {\n PARAGRAPH100: \"paragraph-100\",\n PARAGRAPH100MEDIUM: \"paragraph-100-medium\",\n PARAGRAPH100BOLD: \"paragraph-100-bold\",\n PARAGRAPH200: \"paragraph-200\",\n PREAMBLE100: \"preamble-100\",\n PREAMBLE200: \"preamble-200\",\n ADDITIONAL100: \"additional-100\",\n ADDITIONAL100MEDIUM: \"additional-100-medium\",\n OVERLINE100: \"overline-100\",\n OVERLINE200: \"overline-200\"\n}, t = \"purpur-paragraph\", b = ({\n children: p,\n className: n,\n disabled: u,\n enableHyphenation: i = !1,\n negative: h = !1,\n variant: r = A.PARAGRAPH100,\n ...a\n}) => {\n const e = m(n, t, `${t}--${r}`, {\n [`${t}--hyphens`]: i,\n [`${t}--disabled`]: u,\n [`${t}--negative`]: h\n });\n return /* @__PURE__ */ l(\"p\", { ...a, className: e, children: p });\n};\nb.displayName = \"Paragraph\";\nexport {\n b as Paragraph,\n A as ParagraphVariant\n};\n//# sourceMappingURL=paragraph.es.js.map\n","import { jsx as u } from \"react/jsx-runtime\";\nimport * as l from \"react\";\nimport \"react-dom\";\nfunction d(e, n) {\n if (typeof e == \"function\")\n return e(n);\n e != null && (e.current = n);\n}\nfunction h(...e) {\n return (n) => {\n let r = !1;\n const i = e.map((t) => {\n const o = d(t, n);\n return !r && typeof o == \"function\" && (r = !0), o;\n });\n if (r)\n return () => {\n for (let t = 0; t < i.length; t++) {\n const o = i[t];\n typeof o == \"function\" ? o() : d(e[t], null);\n }\n };\n };\n}\n// @__NO_SIDE_EFFECTS__\nfunction g(e) {\n const n = /* @__PURE__ */ v(e), r = l.forwardRef((i, t) => {\n const { children: o, ...a } = i, s = l.Children.toArray(o), c = s.find(S);\n if (c) {\n const f = c.props.children, y = s.map((p) => p === c ? l.Children.count(f) > 1 ? l.Children.only(null) : l.isValidElement(f) ? f.props.children : null : p);\n return /* @__PURE__ */ u(n, { ...a, ref: t, children: l.isValidElement(f) ? l.cloneElement(f, void 0, y) : null });\n }\n return /* @__PURE__ */ u(n, { ...a, ref: t, children: o });\n });\n return r.displayName = `${e}.Slot`, r;\n}\n// @__NO_SIDE_EFFECTS__\nfunction v(e) {\n const n = l.forwardRef((r, i) => {\n const { children: t, ...o } = r;\n if (l.isValidElement(t)) {\n const a = E(t), s = C(o, t.props);\n return t.type !== l.Fragment && (s.ref = i ? h(i, a) : a), l.cloneElement(t, s);\n }\n return l.Children.count(t) > 1 ? l.Children.only(null) : null;\n });\n return n.displayName = `${e}.SlotClone`, n;\n}\nvar w = Symbol(\"radix.slottable\");\nfunction S(e) {\n return l.isValidElement(e) && typeof e.type == \"function\" && \"__radixId\" in e.type && e.type.__radixId === w;\n}\nfunction C(e, n) {\n const r = { ...n };\n for (const i in n) {\n const t = e[i], o = n[i];\n /^on[A-Z]/.test(i) ? t && o ? r[i] = (...s) => {\n o(...s), t(...s);\n } : t && (r[i] = t) : i === \"style\" ? r[i] = { ...t, ...o } : i === \"className\" && (r[i] = [t, o].filter(Boolean).join(\" \"));\n }\n return { ...e, ...r };\n}\nfunction E(e) {\n let n = Object.getOwnPropertyDescriptor(e.props, \"ref\")?.get, r = n && \"isReactWarning\" in n && n.isReactWarning;\n return r ? e.ref : (n = Object.getOwnPropertyDescriptor(e, \"ref\")?.get, r = n && \"isReactWarning\" in n && n.isReactWarning, r ? e.props.ref : e.props.ref || e.ref);\n}\nvar R = [\n \"a\",\n \"button\",\n \"div\",\n \"form\",\n \"h2\",\n \"h3\",\n \"img\",\n \"input\",\n \"label\",\n \"li\",\n \"nav\",\n \"ol\",\n \"p\",\n \"span\",\n \"svg\",\n \"ul\"\n], b = R.reduce((e, n) => {\n const r = /* @__PURE__ */ g(`Primitive.${n}`), i = l.forwardRef((t, o) => {\n const { asChild: a, ...s } = t, c = a ? r : n;\n return typeof window < \"u\" && (window[Symbol.for(\"radix-ui\")] = !0), /* @__PURE__ */ u(c, { ...s, ref: o });\n });\n return i.displayName = `Primitive.${n}`, { ...e, [n]: i };\n}, {}), N = \"VisuallyHidden\", m = l.forwardRef(\n (e, n) => /* @__PURE__ */ u(\n b.span,\n {\n ...e,\n ref: n,\n style: {\n // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss\n position: \"absolute\",\n border: 0,\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n wordWrap: \"normal\",\n ...e.style\n }\n }\n )\n);\nm.displayName = N;\nvar P = m;\nconst O = ({ asChild: e, children: n, ...r }) => /* @__PURE__ */ u(P, { asChild: e, ...r, children: n });\nexport {\n O as VisuallyHidden\n};\n//# sourceMappingURL=visually-hidden.es.js.map\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue.call(this, arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn this && this[arg] || arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(this, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, this && this[key] || key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","export function getDiffs(endtime: number) {\n const now = new Date().getTime();\n const diffInMs = Math.abs(endtime - now);\n\n let seconds = 0,\n minutes = 0,\n hours = 0,\n days = 0;\n\n if (diffInMs >= inMs.day) {\n days = Math.floor(diffInMs / inMs.day);\n }\n if (diffInMs >= inMs.hour) {\n hours = Math.floor((diffInMs % inMs.day) / inMs.hour);\n }\n if (diffInMs >= inMs.minute) {\n minutes = Math.floor((diffInMs % inMs.hour) / inMs.minute);\n }\n if (diffInMs >= inMs.second) {\n seconds = Math.floor((diffInMs % inMs.minute) / inMs.second);\n }\n\n return {\n seconds,\n minutes,\n hours,\n days,\n };\n}\n\nexport function getNext(time: number, tag: string) {\n let r = 0;\n if (tag === \"seconds\") r = time - 1 >= 0 ? time - 1 : 59;\n if (tag === \"minutes\") r = time - 1 >= 0 ? time - 1 : 59;\n if (tag === \"hours\") r = time - 1 >= 0 ? time - 1 : 23;\n if (tag === \"days\") r = time - 1 >= 0 ? time - 1 : 0;\n return r;\n}\n\nexport const inMs = {\n day: 24 * 60 * 60 * 1000,\n hour: 60 * 60 * 1000,\n minute: 60 * 1000,\n second: 1000,\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Paragraph } from \"@purpurds/paragraph\";\nimport c from \"classnames/bind\";\n\nimport { type CounterLabels } from \"./countdown.types\";\nimport styles from \"./counter.module.scss\";\nimport { getDiffs, getNext, inMs } from \"./utils\";\n\nconst cx = c.bind(styles);\n\nconst rootClassName = \"purpur-countdown-counter\";\n\ninterface CounterProps {\n end: number;\n size: \"md\" | \"lg\";\n tag: \"days\" | \"hours\" | \"minutes\" | \"seconds\";\n counterLabels: CounterLabels;\n}\n\nconst intervals: Map<string, ReturnType<typeof setInterval>> = new Map();\n\nexport const Counter = ({ tag, size, end, counterLabels }: CounterProps) => {\n const ref = useRef<HTMLHeadingElement>(null);\n const id = `${tag}-interval`;\n\n const [currentTime, setCurrentTime] = useState(0);\n const [nextTime, setNextTime] = useState(0);\n const [animationKey, setAnimationKey] = useState(0);\n\n const checktime = useCallback(() => {\n const diffs = getDiffs(end);\n const next = getNext(diffs[tag], tag);\n\n setNextTime(next);\n setCurrentTime(diffs[tag]);\n }, [end, tag]);\n\n useEffect(() => {\n checktime();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n intervals.set(id, setInterval(checktime, inMs.second));\n return () => clearInterval(intervals.get(id)!);\n }, [checktime, id]);\n\n useEffect(() => {\n setAnimationKey((prev) => prev + 1);\n }, [currentTime]);\n\n const counterTag = counterLabels[tag];\n const counterTagAbbr = counterLabels[`${tag}Abbr`];\n\n return (\n <div\n className={cx(rootClassName)}\n role=\"group\"\n aria-hidden=\"true\"\n data-testid={`counter-${tag}`}\n >\n <Paragraph\n className={cx(`${rootClassName}__number`, `${rootClassName}__number--size-${size}`)}\n ref={ref}\n data-tick={nextTime}\n key={animationKey}\n >\n {currentTime}\n </Paragraph>\n {counterTagAbbr && (\n <Paragraph className={cx(`${rootClassName}__label`, `${rootClassName}__label--abbr`)}>\n <abbr title={counterTag}>{counterTagAbbr}</abbr>\n </Paragraph>\n )}\n <Paragraph\n className={cx(`${rootClassName}__label`, {\n [`${rootClassName}__label--full`]: !!counterTagAbbr,\n })}\n >\n {counterTag}\n </Paragraph>\n </div>\n );\n};\n","import React, { type ForwardedRef, forwardRef, useId } from \"react\";\nimport { Paragraph } from \"@purpurds/paragraph\";\nimport { VisuallyHidden } from \"@purpurds/visually-hidden\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./countdown.module.scss\";\nimport { type CountdownProps } from \"./countdown.types\";\nimport { Counter } from \"./counter\";\nimport { getDiffs } from \"./utils\";\n\nconst cx = c.bind(styles);\n\nconst rootClassName = \"purpur-countdown\";\n\nconst now = new Date();\n\n/**\n * Countdown component to display a countdown timer.\n * @param props - CountdownProps\n * @returns A React component that displays a countdown timer.\n */\n\nexport const Countdown = forwardRef(\n (\n { renderAfterEnd, renderBeforeStart, ...props }: CountdownProps,\n ref: ForwardedRef<HTMLButtonElement>\n ) => {\n const id = useId();\n\n const {\n size = \"lg\",\n fullWidth = false,\n negative = false,\n showDays = true,\n variant = \"primary\",\n className,\n counterLabels,\n useMediaQueries = false,\n } = props;\n\n const start = new Date(props.starttime).getTime();\n const end = new Date(props.endtime).getTime();\n\n const hasNotStarted = start > now.getTime();\n const hasEnded = end < now.getTime();\n\n if (hasNotStarted) return renderBeforeStart ? renderBeforeStart(props) : null;\n if (hasEnded) return renderAfterEnd ? renderAfterEnd(props) : null;\n\n const getCounters = () => {\n const counterProps = { size, end, counterLabels };\n\n return (\n <>\n {showDays && <Counter tag=\"days\" {...counterProps} />}\n <Counter tag=\"hours\" {...counterProps} />\n <Counter tag=\"minutes\" {...counterProps} />\n <Counter tag=\"seconds\" {...counterProps} />\n </>\n );\n };\n\n // Create a single announcement of the current time (only once)\n\n const renderAnnouncer = () => {\n const getTimeAnnouncement = () => {\n const { days, hours, minutes, seconds } = getDiffs(end);\n\n const parts = [];\n\n if (showDays) parts.push(`${days} ${counterLabels.days}`);\n parts.push(`${hours} ${counterLabels.hours}`);\n parts.push(`${minutes} ${counterLabels.minutes}`);\n parts.push(`${seconds} ${counterLabels.seconds}`);\n\n return parts.join(\", \");\n };\n\n return (\n <VisuallyHidden\n data-testid=\"live-region\"\n aria-live=\"polite\"\n aria-label={props[\"aria-label\"]}\n >\n {getTimeAnnouncement()}\n </VisuallyHidden>\n );\n };\n\n const counters = getCounters();\n\n const classes = cx(\n rootClassName,\n `${rootClassName}--size-${size}`,\n `${rootClassName}--variant-${variant}`,\n {\n [`${rootClassName}--full-width`]: fullWidth,\n [`${rootClassName}--negative`]: negative,\n [`${rootClassName}--show-days`]: showDays,\n [`${rootClassName}--use-media-queries`]: useMediaQueries,\n [`${rootClassName}--use-container-queries`]: !useMediaQueries,\n },\n className\n );\n\n return (\n <section\n id={id}\n className={classes}\n ref={ref}\n role=\"timer\"\n data-testid={props[\"data-testid\"]}\n >\n {/* Visually hidden live region that announces time only once */}\n {renderAnnouncer()}\n {props.label && (\n <Paragraph className={cx(`${rootClassName}__label`)} variant=\"paragraph-100-medium\">\n {props.label}\n </Paragraph>\n )}\n <div className={cx(`${rootClassName}__counter-container`)}>{counters}</div>\n </section>\n );\n }\n);\n\nCountdown.displayName = \"Countdown\";\n"],"names":["g","p","o","s","_","n","u","r","e","h","i","d","c","f","m","A","t","b","l","v","S","y","E","C","w","R","N","P","O","hasOwn","classNames","classes","arg","appendClass","parseValue","key","value","newClass","module","getDiffs","endtime","now","diffInMs","seconds","minutes","hours","days","inMs","getNext","time","tag","cx","styles","rootClassName","intervals","Counter","size","end","counterLabels","ref","useRef","id","currentTime","setCurrentTime","useState","nextTime","setNextTime","animationKey","setAnimationKey","checktime","useCallback","diffs","next","useEffect","prev","counterTag","counterTagAbbr","jsxs","jsx","Paragraph","Countdown","forwardRef","renderAfterEnd","renderBeforeStart","props","useId","fullWidth","negative","showDays","variant","className","useMediaQueries","start","hasNotStarted","hasEnded","getCounters","counterProps","Fragment","renderAnnouncer","getTimeAnnouncement","parts","VisuallyHidden","counters"],"mappings":"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","x_google_ignoreList":[2]}
@@ -10,6 +10,7 @@ export type CountdownProps = {
10
10
  fullWidth?: boolean;
11
11
  showDays?: boolean;
12
12
  negative?: boolean;
13
+ useMediaQueries?: boolean;
13
14
  /**
14
15
  * Start time of the countdown. Can be a Date object or a timestamp in milliseconds.
15
16
  */
@@ -29,6 +30,7 @@ export type CountdownProps = {
29
30
  /**
30
31
  * Copy for the countdown labels.
31
32
  * Used to customize the text displayed for each time unit.
33
+ * Optional abbreviated versions (e.g., `minutesAbbr`, `secondsAbbr`) can be provided and will fall back to their full versions if not specified.
32
34
  */
33
35
  counterLabels: CounterLabels;
34
36
  };
@@ -37,5 +39,9 @@ export type CounterLabels = {
37
39
  hours: string;
38
40
  minutes: string;
39
41
  seconds: string;
42
+ daysAbbr?: string;
43
+ hoursAbbr?: string;
44
+ minutesAbbr?: string;
45
+ secondsAbbr?: string;
40
46
  };
41
47
  //# sourceMappingURL=countdown.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"countdown.types.d.ts","sourceRoot":"","sources":["../src/countdown.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;IAEjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAClB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,KAChE,SAAS,CAAC;IACf;;OAEG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,KAChE,SAAS,CAAC;IAEf;;;OAGG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"countdown.types.d.ts","sourceRoot":"","sources":["../src/countdown.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAClB,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,KAChE,SAAS,CAAC;IACf;;OAEG;IACH,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,KAChE,SAAS,CAAC;IACf;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../src/counter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQvD,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAID,eAAO,MAAM,OAAO,GAAI,mCAAmC,YAAY,sBA6CtE,CAAC"}
1
+ {"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../src/counter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAIxE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQvD,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAID,eAAO,MAAM,OAAO,GAAI,mCAAmC,YAAY,sBA8DtE,CAAC"}
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- ._purpur-countdown--size-md_1ljp4_1{--counter-height: calc(56 * var(--purpur-spacing-10));--counter-width: calc(56 * var(--purpur-spacing-10))}._purpur-countdown--size-lg_1ljp4_5{--counter-height: calc(72 * var(--purpur-spacing-10));--counter-width: calc(80 * var(--purpur-spacing-10))}._purpur-countdown_1ljp4_1{--text-color: var(--purpur-color-text-default)}._purpur-countdown--variant-primary_1ljp4_12{--bg-color: var(--purpur-color-background-primary)}._purpur-countdown--variant-secondary_1ljp4_15{--bg-color: var(--purpur-color-background-secondary)}._purpur-countdown--negative_1ljp4_18{--text-color: var(--purpur-color-text-default-negative);--bg-color: var(--purpur-color-background-interactive-read-only-negative)}._purpur-countdown--fullwidth_1ljp4_22{--counter-width: 1fr}._purpur-countdown_1ljp4_1{--counter-count: 3}._purpur-countdown--showdays_1ljp4_28{--counter-count: 4}._purpur-countdown_1ljp4_1{display:grid;gap:var(--purpur-spacing-150);color:var(--text-color)}._purpur-countdown_1ljp4_1>._purpur-countdown__counter-container_1ljp4_36{display:grid;grid:var(--counter-height)/repeat(var(--counter-count),var(--counter-width));gap:var(--purpur-spacing-200)}._purpur-countdown_1ljp4_1>._purpur-countdown__label_1ljp4_41{color:inherit}._purpur-countdown-counter--size-lg_vx98f_1{font-family:var(--purpur-typography-family-display);font-weight:var(--purpur-typography-weight-normal);font-size:clamp(var(--purpur-typography-scale-400),3cqw,var(--purpur-typography-scale-600));line-height:var(--purpur-typography-line-height-snug)}._purpur-countdown-counter--size-md_vx98f_7{font-family:var(--purpur-typography-family-display);font-weight:var(--purpur-typography-weight-normal);font-size:clamp(var(--purpur-typography-scale-150),3cqw,var(--purpur-typography-scale-200));line-height:var(--purpur-typography-line-height-snug)}._purpur-countdown-counter_vx98f_1{display:grid;justify-items:center;align-items:center;padding:var(--purpur-spacing-100);border-radius:var(--purpur-border-radius-md);background-color:var(--bg-color);color:var(--text-color);overflow:hidden}._purpur-countdown-counter_vx98f_1>._purpur-countdown-counter__number_vx98f_23{position:relative;width:100%;color:inherit;text-align:center}@media (prefers-reduced-motion: no-preference){._purpur-countdown-counter_vx98f_1>._purpur-countdown-counter__number_vx98f_23[data-tick]{text-align:center;animation:_tick-animation_vx98f_1 .15s ease-out forwards}._purpur-countdown-counter_vx98f_1>._purpur-countdown-counter__number_vx98f_23[data-tick]:after{content:attr(data-tick);position:absolute;bottom:100%;inset-inline:0;color:inherit;animation:_tick-animation-pseudo_vx98f_1 .25s forwards}}._purpur-countdown-counter_vx98f_1>._purpur-countdown-counter__label_vx98f_44{font-family:var(--purpur-typography-family-default);font-weight:var(--purpur-typography-weight-normal);font-size:var(--purpur-typography-scale-75);line-height:var(--purpur-typography-line-height-loose);color:inherit}@keyframes _tick-animation_vx98f_1{0%{transform:translateY(100%);color:transparent}to{transform:translateY(0);color:var(--text-color)}}@keyframes _tick-animation-pseudo_vx98f_1{0%{color:var(--text-color)}to{color:transparent}}
1
+ ._purpur-countdown--size-md_1kmr5_1{--counter-height: calc(56 * var(--purpur-spacing-10));--counter-width: calc(56 * var(--purpur-spacing-10))}._purpur-countdown--size-lg_1kmr5_5{--counter-height: calc(72 * var(--purpur-spacing-10));--counter-width: calc(72 * var(--purpur-spacing-10))}@container countdown (min-width: 600px){._purpur-countdown--size-lg_1kmr5_5._purpur-countdown--use-container-queries_1kmr5_10 ._purpur-countdown__counter-container_1kmr5_10{gap:var(--purpur-spacing-200)}}@container countdown (min-width: 600px){._purpur-countdown--size-lg_1kmr5_5._purpur-countdown--use-container-queries_1kmr5_10:not(._purpur-countdown--full-width_1kmr5_15) ._purpur-countdown__counter-container_1kmr5_10{--counter-width: calc(80 * var(--purpur-spacing-10))}}@media(min-width:600px){._purpur-countdown--size-lg_1kmr5_5._purpur-countdown--use-media-queries_1kmr5_20:not(._purpur-countdown--full-width_1kmr5_15){--counter-width: calc(80 * var(--purpur-spacing-10))}._purpur-countdown--size-lg_1kmr5_5._purpur-countdown--use-media-queries_1kmr5_20 ._purpur-countdown__counter-container_1kmr5_10{gap:var(--purpur-spacing-200)}}._purpur-countdown_1kmr5_1{--text-color: var(--purpur-color-text-default)}._purpur-countdown--variant-primary_1kmr5_30{--bg-color: var(--purpur-color-background-primary)}._purpur-countdown--variant-secondary_1kmr5_33{--bg-color: var(--purpur-color-background-secondary)}._purpur-countdown--negative_1kmr5_36{--text-color: var(--purpur-color-text-default-negative);--bg-color: var(--purpur-color-background-interactive-read-only-negative)}._purpur-countdown--full-width_1kmr5_15{--counter-width: 1fr}._purpur-countdown_1kmr5_1{--counter-count: 3}._purpur-countdown--show-days_1kmr5_46{--counter-count: 4}._purpur-countdown_1kmr5_1{display:grid;gap:var(--purpur-spacing-150);color:var(--text-color)}._purpur-countdown--use-container-queries_1kmr5_10{container:countdown/inline-size}._purpur-countdown__counter-container_1kmr5_10{display:grid;grid:var(--counter-height)/repeat(var(--counter-count),var(--counter-width));gap:var(--purpur-spacing-100)}._purpur-countdown__label_1kmr5_62{color:inherit}._purpur-countdown-counter_1h7qy_1{display:grid;justify-items:center;align-items:center;padding:var(--purpur-spacing-100);border-radius:var(--purpur-border-radius-md);background-color:var(--bg-color);color:var(--text-color);overflow:hidden}._purpur-countdown-counter__number--size-lg_1h7qy_11{font-family:var(--purpur-typography-family-display);font-weight:var(--purpur-typography-weight-normal);font-size:clamp(var(--purpur-typography-scale-400),3cqw,var(--purpur-typography-scale-600));line-height:var(--purpur-typography-line-height-snug)}._purpur-countdown-counter__number--size-md_1h7qy_17{font-family:var(--purpur-typography-family-display);font-weight:var(--purpur-typography-weight-normal);font-size:clamp(var(--purpur-typography-scale-150),3cqw,var(--purpur-typography-scale-200));line-height:var(--purpur-typography-line-height-snug)}._purpur-countdown-counter__number_1h7qy_11{position:relative;width:100%;color:inherit;text-align:center}@media(prefers-reduced-motion:no-preference){._purpur-countdown-counter__number_1h7qy_11[data-tick]{text-align:center;animation:_tick-animation_1h7qy_1 .15s ease-out forwards}._purpur-countdown-counter__number_1h7qy_11[data-tick]:after{content:attr(data-tick);position:absolute;bottom:100%;inset-inline:0;color:inherit;animation:_tick-animation-pseudo_1h7qy_1 .25s forwards}}._purpur-countdown-counter__label_1h7qy_44{font-family:var(--purpur-typography-family-default);font-weight:var(--purpur-typography-weight-normal);font-size:var(--purpur-typography-scale-75);line-height:var(--purpur-typography-line-height-loose);color:inherit}._purpur-countdown-counter__label--abbr_1h7qy_51 abbr{text-decoration:none}._purpur-countdown-counter__label--full_1h7qy_54{display:none}@container countdown (min-width: 600px){[class*=purpur-countdown--use-container-queries] ._purpur-countdown-counter__label--abbr_1h7qy_51{display:none}[class*=purpur-countdown--use-container-queries] ._purpur-countdown-counter__label--full_1h7qy_54{display:block}}@media(min-width:600px){[class*=purpur-countdown--use-media-queries] ._purpur-countdown-counter__label--abbr_1h7qy_51{display:none}[class*=purpur-countdown--use-media-queries] ._purpur-countdown-counter__label--full_1h7qy_54{display:block}}@keyframes _tick-animation_1h7qy_1{0%{transform:translateY(100%);color:transparent}to{transform:translateY(0);color:var(--text-color)}}@keyframes _tick-animation-pseudo_1h7qy_1{0%{color:var(--text-color)}to{color:transparent}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpurds/countdown",
3
- "version": "8.8.0",
3
+ "version": "8.9.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "main": "./dist/countdown.cjs.js",
6
6
  "types": "./dist/countdown.d.ts",
@@ -15,32 +15,32 @@
15
15
  },
16
16
  "source": "src/countdown.tsx",
17
17
  "dependencies": {
18
- "classnames": "~2.5.0",
19
- "@purpurds/heading": "8.8.0",
20
- "@purpurds/paragraph": "8.8.0",
21
- "@purpurds/visually-hidden": "8.8.0",
22
- "@purpurds/tokens": "8.8.0"
18
+ "classnames": "~2.5.1",
19
+ "@purpurds/heading": "8.9.0",
20
+ "@purpurds/paragraph": "8.9.0",
21
+ "@purpurds/visually-hidden": "8.9.0",
22
+ "@purpurds/tokens": "8.9.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@rushstack/eslint-patch": "~1.10.0",
26
- "@storybook/react": "^9.0.18",
26
+ "@storybook/react": "^10.0.8",
27
27
  "@telia/react-rig": "*",
28
- "@testing-library/dom": "~10.4.0",
29
- "@testing-library/jest-dom": "~6.4.0",
30
- "@testing-library/react": "~16.2.0",
28
+ "@testing-library/dom": "~10.4.1",
29
+ "@testing-library/jest-dom": "~6.9.1",
30
+ "@testing-library/react": "~16.3.0",
31
31
  "@types/node": "22.17",
32
- "@types/react-dom": "^19.0.4",
33
- "@types/react": "^19.0.10",
34
- "eslint": "9.24.0",
35
- "jsdom": "~22.1.0",
36
- "lint-staged": "15.5.0",
32
+ "@types/react-dom": "^19.2.3",
33
+ "@types/react": "^19.2.6",
34
+ "eslint": "9.39.1",
35
+ "jsdom": "~27.2.0",
36
+ "lint-staged": "16.2.6",
37
37
  "prettier": "~2.8.8",
38
- "react": "^19.0.0",
39
- "react-dom": "^19.0.0",
40
- "storybook": "^9.0.18",
41
- "typescript": "^5.6.3",
42
- "vite": "^6.2.1",
43
- "vitest": "^3.1.2",
38
+ "react": "^19.2.0",
39
+ "react-dom": "^19.2.0",
40
+ "storybook": "^10.0.8",
41
+ "typescript": "^5.9.3",
42
+ "vite": "^7.2.2",
43
+ "vitest": "^4.0.10",
44
44
  "@purpurds/component-rig": "1.0.0"
45
45
  },
46
46
  "peerDependencies": {
@@ -1,3 +1,5 @@
1
+ @use "@purpurds/tokens/breakpoint/variables" as *;
2
+
1
3
  $root: ".purpur-countdown";
2
4
 
3
5
  @mixin size {
@@ -5,17 +7,48 @@ $root: ".purpur-countdown";
5
7
  --counter-height: calc(56 * var(--purpur-spacing-10));
6
8
  --counter-width: calc(56 * var(--purpur-spacing-10));
7
9
  }
10
+
8
11
  &--size-lg {
9
12
  --counter-height: calc(72 * var(--purpur-spacing-10));
10
- --counter-width: calc(80 * var(--purpur-spacing-10));
13
+ --counter-width: calc(72 * var(--purpur-spacing-10));
14
+
15
+ &#{$root}--use-container-queries {
16
+ #{$root}__counter-container {
17
+ @container countdown (min-width: #{$purpur-breakpoint-md}) {
18
+ gap: var(--purpur-spacing-200);
19
+ }
20
+ }
21
+
22
+ &:not(#{$root}--full-width) {
23
+ #{$root}__counter-container {
24
+ @container countdown (min-width: #{$purpur-breakpoint-md}) {
25
+ --counter-width: calc(80 * var(--purpur-spacing-10));
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ &#{$root}--use-media-queries {
32
+ @media (min-width: $purpur-breakpoint-md) {
33
+ &:not(#{$root}--full-width) {
34
+ --counter-width: calc(80 * var(--purpur-spacing-10));
35
+ }
36
+
37
+ #{$root}__counter-container {
38
+ gap: var(--purpur-spacing-200);
39
+ }
40
+ }
41
+ }
11
42
  }
12
43
  }
44
+
13
45
  @mixin variant {
14
46
  --text-color: var(--purpur-color-text-default);
15
47
 
16
48
  &--variant-primary {
17
49
  --bg-color: var(--purpur-color-background-primary);
18
50
  }
51
+
19
52
  &--variant-secondary {
20
53
  --bg-color: var(--purpur-color-background-secondary);
21
54
  }
@@ -25,15 +58,17 @@ $root: ".purpur-countdown";
25
58
  --bg-color: var(--purpur-color-background-interactive-read-only-negative);
26
59
  }
27
60
  }
61
+
28
62
  @mixin fullwidth {
29
- &--fullwidth {
63
+ &--full-width {
30
64
  --counter-width: 1fr;
31
65
  }
32
66
  }
67
+
33
68
  @mixin showdays {
34
69
  --counter-count: 3;
35
70
 
36
- &--showdays {
71
+ &--show-days {
37
72
  --counter-count: 4;
38
73
  }
39
74
  }
@@ -48,13 +83,17 @@ $root: ".purpur-countdown";
48
83
  gap: var(--purpur-spacing-150);
49
84
  color: var(--text-color);
50
85
 
51
- & > #{$root}__counter-container {
86
+ &--use-container-queries {
87
+ container: countdown / inline-size;
88
+ }
89
+
90
+ &__counter-container {
52
91
  display: grid;
53
92
  grid: var(--counter-height) / repeat(var(--counter-count), var(--counter-width));
54
- gap: var(--purpur-spacing-200);
93
+ gap: var(--purpur-spacing-100);
55
94
  }
56
95
 
57
- & > #{$root}__label {
96
+ &__label {
58
97
  color: inherit;
59
98
  }
60
99
  }
@@ -46,10 +46,12 @@ export const Showcase: Story = {
46
46
  args={{
47
47
  ...ctx.args,
48
48
  counterLabels: {
49
- days: "Days",
50
- hours: "Hours",
51
- minutes: ctx.args.size === "lg" ? "Minutes" : "Min",
52
- seconds: ctx.args.size === "lg" ? "Seconds" : "Sec",
49
+ days: "days",
50
+ hours: "hours",
51
+ minutes: ctx.args.size === "lg" ? "minutes" : "min",
52
+ seconds: ctx.args.size === "lg" ? "seconds" : "sec",
53
+ secondsAbbr: "sec",
54
+ minutesAbbr: "min",
53
55
  },
54
56
  }}
55
57
  />
@@ -68,6 +70,7 @@ export const Showcase: Story = {
68
70
  showDays: true,
69
71
  size: "lg",
70
72
  label: "Time left until Christmas",
73
+ useMediaQueries: false,
71
74
 
72
75
  starttime: new Date(),
73
76
  get endtime() {
@@ -74,7 +74,7 @@ describe("Countdown", () => {
74
74
  const section = screen.getByRole("timer");
75
75
 
76
76
  expect(section).toHaveClass("purpur-countdown");
77
- expect(section).toHaveClass("purpur-countdown--fullwidth");
77
+ expect(section).toHaveClass("purpur-countdown--full-width");
78
78
  expect(section).not.toHaveClass("purpur-countdown--negative");
79
79
  expect(section).toHaveClass("purpur-countdown--size-lg");
80
80
  expect(section).toHaveClass("purpur-countdown--variant-primary");
@@ -119,4 +119,151 @@ describe("Countdown", () => {
119
119
  render(<Countdown {...props} />);
120
120
  expect(screen.getByText("Countdown ended")).toBeInTheDocument();
121
121
  });
122
+
123
+ // Size variant testing
124
+
125
+ it("applies the correct class for size md", () => {
126
+ const props = { ...defaultProps, size: "md" as const };
127
+ render(<Countdown {...props} />);
128
+
129
+ const section = screen.getByRole("timer");
130
+ expect(section).toHaveClass("purpur-countdown--size-md");
131
+ });
132
+
133
+ // Variant testing
134
+
135
+ it("applies the correct class for secondary variant", () => {
136
+ const props = { ...defaultProps, variant: "secondary" as const };
137
+ render(<Countdown {...props} />);
138
+
139
+ const section = screen.getByRole("timer");
140
+ expect(section).toHaveClass("purpur-countdown--variant-secondary");
141
+ });
142
+
143
+ it("applies negative class when negative prop is true", () => {
144
+ const props = { ...defaultProps, negative: true };
145
+ render(<Countdown {...props} />);
146
+
147
+ const section = screen.getByRole("timer");
148
+ expect(section).toHaveClass("purpur-countdown--negative");
149
+ });
150
+
151
+ // showDays prop testing
152
+
153
+ it("does not render days counter when showDays is false", () => {
154
+ const props = { ...defaultProps, showDays: false };
155
+ render(<Countdown {...props} />);
156
+
157
+ expect(screen.queryByTestId("counter-days")).not.toBeInTheDocument();
158
+ expect(screen.getByTestId("counter-hours")).toBeInTheDocument();
159
+ expect(screen.getByTestId("counter-minutes")).toBeInTheDocument();
160
+ expect(screen.getByTestId("counter-seconds")).toBeInTheDocument();
161
+ });
162
+
163
+ it("applies the correct class when showDays is true", () => {
164
+ render(<Countdown {...defaultProps} />);
165
+
166
+ const section = screen.getByRole("timer");
167
+ expect(section).toHaveClass("purpur-countdown--show-days");
168
+ });
169
+
170
+ it("does not apply show-days class when showDays is false", () => {
171
+ const props = { ...defaultProps, showDays: false };
172
+ render(<Countdown {...props} />);
173
+
174
+ const section = screen.getByRole("timer");
175
+ expect(section).not.toHaveClass("purpur-countdown--show-days");
176
+ });
177
+
178
+ // useMediaQueries prop testing
179
+
180
+ it("applies use-media-queries class when useMediaQueries is true", () => {
181
+ const props = { ...defaultProps, useMediaQueries: true };
182
+ render(<Countdown {...props} />);
183
+
184
+ const section = screen.getByRole("timer");
185
+ expect(section).toHaveClass("purpur-countdown--use-media-queries");
186
+ expect(section).not.toHaveClass("purpur-countdown--use-container-queries");
187
+ });
188
+
189
+ it("applies use-container-queries class when useMediaQueries is false", () => {
190
+ const props = { ...defaultProps, useMediaQueries: false };
191
+ render(<Countdown {...props} />);
192
+
193
+ const section = screen.getByRole("timer");
194
+ expect(section).toHaveClass("purpur-countdown--use-container-queries");
195
+ expect(section).not.toHaveClass("purpur-countdown--use-media-queries");
196
+ });
197
+
198
+ // fullWidth prop testing
199
+
200
+ it("does not apply full-width class when fullWidth is false", () => {
201
+ const props = { ...defaultProps, fullWidth: false };
202
+ render(<Countdown {...props} />);
203
+
204
+ const section = screen.getByRole("timer");
205
+ expect(section).not.toHaveClass("purpur-countdown--full-width");
206
+ });
207
+
208
+ // Abbreviated labels testing
209
+
210
+ it("renders abbreviated labels when provided", () => {
211
+ const props = {
212
+ ...defaultProps,
213
+ counterLabels: {
214
+ days: "days",
215
+ hours: "hours",
216
+ minutes: "minutes",
217
+ seconds: "seconds",
218
+ daysAbbr: "d",
219
+ hoursAbbr: "h",
220
+ minutesAbbr: "m",
221
+ secondsAbbr: "s",
222
+ },
223
+ };
224
+ render(<Countdown {...props} />);
225
+
226
+ expect(screen.getByText("d")).toBeInTheDocument();
227
+ expect(screen.getByText("h")).toBeInTheDocument();
228
+ expect(screen.getByText("m")).toBeInTheDocument();
229
+ expect(screen.getByText("s")).toBeInTheDocument();
230
+ });
231
+
232
+ // Custom className testing
233
+
234
+ it("applies custom className when provided", () => {
235
+ const props = { ...defaultProps, className: "custom-countdown" };
236
+ render(<Countdown {...props} />);
237
+
238
+ const section = screen.getByRole("timer");
239
+ expect(section).toHaveClass("custom-countdown");
240
+ });
241
+
242
+ // data-testid testing
243
+
244
+ it("applies custom data-testid when provided", () => {
245
+ render(<Countdown {...defaultProps} />);
246
+
247
+ expect(screen.getByTestId("countdown")).toBeInTheDocument();
248
+ });
249
+
250
+ // Accessibility testing
251
+
252
+ it("has correct role for timer", () => {
253
+ render(<Countdown {...defaultProps} />);
254
+
255
+ expect(screen.getByRole("timer")).toBeInTheDocument();
256
+ });
257
+
258
+ it("has aria-hidden on counter groups", () => {
259
+ render(<Countdown {...defaultProps} />);
260
+
261
+ const counterElements = tags
262
+ .map((tag) => screen.queryByTestId(`counter-${tag}`))
263
+ .filter(Boolean);
264
+
265
+ counterElements.forEach((counter) => {
266
+ expect(counter).toHaveAttribute("aria-hidden", "true");
267
+ });
268
+ });
122
269
  });
package/src/countdown.tsx CHANGED
@@ -35,6 +35,7 @@ export const Countdown = forwardRef(
35
35
  variant = "primary",
36
36
  className,
37
37
  counterLabels,
38
+ useMediaQueries = false,
38
39
  } = props;
39
40
 
40
41
  const start = new Date(props.starttime).getTime();
@@ -88,17 +89,19 @@ export const Countdown = forwardRef(
88
89
 
89
90
  const counters = getCounters();
90
91
 
91
- const classes = cx([
92
+ const classes = cx(
92
93
  rootClassName,
93
94
  `${rootClassName}--size-${size}`,
94
95
  `${rootClassName}--variant-${variant}`,
95
96
  {
96
- [`${rootClassName}--fullwidth`]: fullWidth,
97
+ [`${rootClassName}--full-width`]: fullWidth,
97
98
  [`${rootClassName}--negative`]: negative,
98
- [`${rootClassName}--showdays`]: showDays,
99
+ [`${rootClassName}--show-days`]: showDays,
100
+ [`${rootClassName}--use-media-queries`]: useMediaQueries,
101
+ [`${rootClassName}--use-container-queries`]: !useMediaQueries,
99
102
  },
100
- className,
101
- ]);
103
+ className
104
+ );
102
105
 
103
106
  return (
104
107
  <section
@@ -5,14 +5,12 @@ export type CountdownProps = {
5
5
  "aria-label": string;
6
6
  className?: string;
7
7
  label?: string;
8
-
9
8
  size: "md" | "lg";
10
9
  variant: "primary" | "secondary";
11
-
12
10
  fullWidth?: boolean;
13
11
  showDays?: boolean;
14
12
  negative?: boolean;
15
-
13
+ useMediaQueries?: boolean;
16
14
  /**
17
15
  * Start time of the countdown. Can be a Date object or a timestamp in milliseconds.
18
16
  */
@@ -21,7 +19,6 @@ export type CountdownProps = {
21
19
  * End time of the countdown. Can be a Date object or a timestamp in milliseconds.
22
20
  */
23
21
  endtime: Date | number;
24
-
25
22
  /**
26
23
  * Render a custom element before the countdown starts.
27
24
  */
@@ -34,10 +31,10 @@ export type CountdownProps = {
34
31
  renderAfterEnd?: (
35
32
  props: Omit<CountdownProps, "renderBeforeStart" | "renderAfterEnd">
36
33
  ) => ReactNode;
37
-
38
34
  /**
39
35
  * Copy for the countdown labels.
40
36
  * Used to customize the text displayed for each time unit.
37
+ * Optional abbreviated versions (e.g., `minutesAbbr`, `secondsAbbr`) can be provided and will fall back to their full versions if not specified.
41
38
  */
42
39
  counterLabels: CounterLabels;
43
40
  };
@@ -47,4 +44,8 @@ export type CounterLabels = {
47
44
  hours: string;
48
45
  minutes: string;
49
46
  seconds: string;
47
+ daysAbbr?: string;
48
+ hoursAbbr?: string;
49
+ minutesAbbr?: string;
50
+ secondsAbbr?: string;
50
51
  };