@clicoh/orion-library 1.2.0-beta.12 → 1.2.0-beta.14

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.
Files changed (219) hide show
  1. package/assets/css/expresivo.css +919 -0
  2. package/assets/mascotas/svg/bugi-mascota-01-alerta.svg +39 -0
  3. package/assets/mascotas/svg/bugi-mascota-02-investigando.svg +36 -0
  4. package/assets/mascotas/svg/bugi-mascota-05-sorprendido.svg +38 -0
  5. package/assets/mascotas/svg/oculus-mascota-01-feliz.svg +52 -0
  6. package/assets/mascotas/svg/oculus-mascota-02-investigando.svg +51 -0
  7. package/assets/mascotas/svg/oculus-mascota-03-dudando.svg +51 -0
  8. package/assets/mascotas/svg/oculus-mascota-04-analizando-documento.svg +53 -0
  9. package/assets/mascotas/svg/oculus-mascota-06-celebrando.svg +54 -0
  10. package/assets/mascotas/svg/oculus-mascota-07-buscando-rapido.svg +57 -0
  11. package/assets/mascotas/svg/oculus-mascota-08-satisfecho.svg +55 -0
  12. package/assets/mascotas/webp/fixi-mascota-01-feliz-sm.webp +0 -0
  13. package/assets/mascotas/webp/fixi-mascota-02-investigando-sm.webp +0 -0
  14. package/assets/mascotas/webp/fixi-mascota-03-dudando-sm.webp +0 -0
  15. package/assets/mascotas/webp/fixi-mascota-04-reparando-sm.webp +0 -0
  16. package/assets/mascotas/webp/fixi-mascota-05-sorprendido-sm.webp +0 -0
  17. package/assets/mascotas/webp/fixi-mascota-06-celebrando-sm.webp +0 -0
  18. package/assets/mascotas/webp/fixi-mascota-07-corriendo-sm.webp +0 -0
  19. package/dist/components/01-atoms/Button/Button.d.ts +18 -1
  20. package/dist/components/01-atoms/Button/Button.d.ts.map +1 -1
  21. package/dist/components/01-atoms/Button/Button.jsx +25 -5
  22. package/dist/components/01-atoms/Button/Button.jsx.map +1 -1
  23. package/dist/components/01-atoms/Heading/Heading.jsx +1 -1
  24. package/dist/components/01-atoms/Heading/Heading.jsx.map +1 -1
  25. package/dist/components/01-atoms/Input/Input.d.ts.map +1 -1
  26. package/dist/components/01-atoms/Input/Input.jsx +9 -7
  27. package/dist/components/01-atoms/Input/Input.jsx.map +1 -1
  28. package/dist/components/01-atoms/Input/utils/RenderErrorOrHelperText.d.ts.map +1 -1
  29. package/dist/components/01-atoms/Input/utils/RenderErrorOrHelperText.jsx +1 -1
  30. package/dist/components/01-atoms/Input/utils/RenderErrorOrHelperText.jsx.map +1 -1
  31. package/dist/components/01-atoms/Select/Select.d.ts.map +1 -1
  32. package/dist/components/01-atoms/Select/Select.jsx +7 -7
  33. package/dist/components/01-atoms/Select/Select.jsx.map +1 -1
  34. package/dist/components/01-atoms/Spinner/Spinner.d.ts +24 -3
  35. package/dist/components/01-atoms/Spinner/Spinner.d.ts.map +1 -1
  36. package/dist/components/01-atoms/Spinner/Spinner.jsx +30 -4
  37. package/dist/components/01-atoms/Spinner/Spinner.jsx.map +1 -1
  38. package/dist/components/01-atoms/Spinner/index.d.ts +1 -0
  39. package/dist/components/01-atoms/Spinner/index.d.ts.map +1 -1
  40. package/dist/components/01-atoms/Stat/Stat.d.ts +4 -1
  41. package/dist/components/01-atoms/Stat/Stat.d.ts.map +1 -1
  42. package/dist/components/01-atoms/Stat/Stat.jsx +6 -2
  43. package/dist/components/01-atoms/Stat/Stat.jsx.map +1 -1
  44. package/dist/components/01-atoms/Textarea/Textarea.d.ts.map +1 -1
  45. package/dist/components/01-atoms/Textarea/Textarea.jsx +3 -3
  46. package/dist/components/01-atoms/Textarea/Textarea.jsx.map +1 -1
  47. package/dist/components/02-molecules/Accordion/AccordionSection.d.ts.map +1 -1
  48. package/dist/components/02-molecules/Accordion/AccordionSection.jsx +26 -3
  49. package/dist/components/02-molecules/Accordion/AccordionSection.jsx.map +1 -1
  50. package/dist/components/02-molecules/Card/Card.d.ts +74 -0
  51. package/dist/components/02-molecules/Card/Card.d.ts.map +1 -0
  52. package/dist/components/02-molecules/Card/Card.jsx +83 -0
  53. package/dist/components/02-molecules/Card/Card.jsx.map +1 -0
  54. package/dist/components/02-molecules/Card/index.d.ts +2 -0
  55. package/dist/components/02-molecules/Card/index.d.ts.map +1 -0
  56. package/dist/components/02-molecules/Card/index.js +2 -0
  57. package/dist/components/02-molecules/Card/index.js.map +1 -0
  58. package/dist/components/02-molecules/DatePicker/DatePicker.d.ts +37 -2
  59. package/dist/components/02-molecules/DatePicker/DatePicker.d.ts.map +1 -1
  60. package/dist/components/02-molecules/DatePicker/DatePicker.jsx +187 -32
  61. package/dist/components/02-molecules/DatePicker/DatePicker.jsx.map +1 -1
  62. package/dist/components/02-molecules/EmptyState/EmptyState.d.ts +52 -0
  63. package/dist/components/02-molecules/EmptyState/EmptyState.d.ts.map +1 -0
  64. package/dist/components/02-molecules/EmptyState/EmptyState.jsx +66 -0
  65. package/dist/components/02-molecules/EmptyState/EmptyState.jsx.map +1 -0
  66. package/dist/components/02-molecules/EmptyState/index.d.ts +2 -0
  67. package/dist/components/02-molecules/EmptyState/index.d.ts.map +1 -0
  68. package/dist/components/02-molecules/EmptyState/index.js +2 -0
  69. package/dist/components/02-molecules/EmptyState/index.js.map +1 -0
  70. package/dist/components/02-molecules/Filter/Filter.d.ts +7 -1
  71. package/dist/components/02-molecules/Filter/Filter.d.ts.map +1 -1
  72. package/dist/components/02-molecules/Filter/Filter.jsx +10 -7
  73. package/dist/components/02-molecules/Filter/Filter.jsx.map +1 -1
  74. package/dist/components/02-molecules/InlineMessage/InlineMessage.d.ts +15 -1
  75. package/dist/components/02-molecules/InlineMessage/InlineMessage.d.ts.map +1 -1
  76. package/dist/components/02-molecules/InlineMessage/InlineMessage.jsx +18 -3
  77. package/dist/components/02-molecules/InlineMessage/InlineMessage.jsx.map +1 -1
  78. package/dist/components/02-molecules/Menu/MenuItem.d.ts.map +1 -1
  79. package/dist/components/02-molecules/Menu/MenuItem.jsx +2 -2
  80. package/dist/components/02-molecules/Menu/MenuItem.jsx.map +1 -1
  81. package/dist/components/02-molecules/Menu/MenuList.d.ts.map +1 -1
  82. package/dist/components/02-molecules/Menu/MenuList.jsx +1 -1
  83. package/dist/components/02-molecules/Menu/MenuList.jsx.map +1 -1
  84. package/dist/components/02-molecules/Table/Table.d.ts +3 -1
  85. package/dist/components/02-molecules/Table/Table.d.ts.map +1 -1
  86. package/dist/components/02-molecules/Table/Table.jsx +6 -5
  87. package/dist/components/02-molecules/Table/Table.jsx.map +1 -1
  88. package/dist/components/02-molecules/index.d.ts +2 -0
  89. package/dist/components/02-molecules/index.d.ts.map +1 -1
  90. package/dist/components/02-molecules/index.js +2 -0
  91. package/dist/components/02-molecules/index.js.map +1 -1
  92. package/dist/components/03-organisms/DataTable/DataTable.d.ts +1 -1
  93. package/dist/components/03-organisms/DataTable/DataTable.d.ts.map +1 -1
  94. package/dist/components/03-organisms/DataTable/DataTable.jsx.map +1 -1
  95. package/dist/components/03-organisms/Header/Header.d.ts +3 -1
  96. package/dist/components/03-organisms/Header/Header.d.ts.map +1 -1
  97. package/dist/components/03-organisms/Header/Header.jsx +4 -5
  98. package/dist/components/03-organisms/Header/Header.jsx.map +1 -1
  99. package/dist/components/04-templates/DashboardTemplate/DashboardTemplate.d.ts +36 -4
  100. package/dist/components/04-templates/DashboardTemplate/DashboardTemplate.d.ts.map +1 -1
  101. package/dist/components/04-templates/DashboardTemplate/DashboardTemplate.jsx +44 -10
  102. package/dist/components/04-templates/DashboardTemplate/DashboardTemplate.jsx.map +1 -1
  103. package/dist/components/04-templates/DashboardTemplate/HeadingWithTitle.d.ts +6 -2
  104. package/dist/components/04-templates/DashboardTemplate/HeadingWithTitle.d.ts.map +1 -1
  105. package/dist/components/04-templates/DashboardTemplate/HeadingWithTitle.jsx +7 -3
  106. package/dist/components/04-templates/DashboardTemplate/HeadingWithTitle.jsx.map +1 -1
  107. package/dist/components/04-templates/LoginTemplate/LoginTemplate.d.ts +2 -0
  108. package/dist/components/04-templates/LoginTemplate/LoginTemplate.d.ts.map +1 -1
  109. package/dist/components/04-templates/LoginTemplate/LoginTemplate.jsx +2 -1
  110. package/dist/components/04-templates/LoginTemplate/LoginTemplate.jsx.map +1 -1
  111. package/expresivo/ExpBubble/ExpBubble.d.ts +51 -0
  112. package/expresivo/ExpBubble/ExpBubble.d.ts.map +1 -0
  113. package/expresivo/ExpBubble/ExpBubble.jsx +74 -0
  114. package/expresivo/ExpBubble/ExpBubble.jsx.map +1 -0
  115. package/expresivo/ExpBubble/index.d.ts +3 -0
  116. package/expresivo/ExpBubble/index.d.ts.map +1 -0
  117. package/expresivo/ExpBubble/index.js +2 -0
  118. package/expresivo/ExpBubble/index.js.map +1 -0
  119. package/expresivo/ExpCollapseToggle/ExpCollapseToggle.d.ts +37 -0
  120. package/expresivo/ExpCollapseToggle/ExpCollapseToggle.d.ts.map +1 -0
  121. package/expresivo/ExpCollapseToggle/ExpCollapseToggle.jsx +43 -0
  122. package/expresivo/ExpCollapseToggle/ExpCollapseToggle.jsx.map +1 -0
  123. package/expresivo/ExpCollapseToggle/index.d.ts +3 -0
  124. package/expresivo/ExpCollapseToggle/index.d.ts.map +1 -0
  125. package/expresivo/ExpCollapseToggle/index.js +2 -0
  126. package/expresivo/ExpCollapseToggle/index.js.map +1 -0
  127. package/expresivo/ExpGrowBar/ExpGrowBar.d.ts +26 -0
  128. package/expresivo/ExpGrowBar/ExpGrowBar.d.ts.map +1 -0
  129. package/expresivo/ExpGrowBar/ExpGrowBar.jsx +39 -0
  130. package/expresivo/ExpGrowBar/ExpGrowBar.jsx.map +1 -0
  131. package/expresivo/ExpGrowBar/index.d.ts +3 -0
  132. package/expresivo/ExpGrowBar/index.d.ts.map +1 -0
  133. package/expresivo/ExpGrowBar/index.js +2 -0
  134. package/expresivo/ExpGrowBar/index.js.map +1 -0
  135. package/expresivo/ExpJourneyTrack/ExpJourneyTrack.d.ts +65 -0
  136. package/expresivo/ExpJourneyTrack/ExpJourneyTrack.d.ts.map +1 -0
  137. package/expresivo/ExpJourneyTrack/ExpJourneyTrack.jsx +156 -0
  138. package/expresivo/ExpJourneyTrack/ExpJourneyTrack.jsx.map +1 -0
  139. package/expresivo/ExpJourneyTrack/index.d.ts +3 -0
  140. package/expresivo/ExpJourneyTrack/index.d.ts.map +1 -0
  141. package/expresivo/ExpJourneyTrack/index.js +2 -0
  142. package/expresivo/ExpJourneyTrack/index.js.map +1 -0
  143. package/expresivo/ExpKeyButton/ExpKeyButton.d.ts +49 -0
  144. package/expresivo/ExpKeyButton/ExpKeyButton.d.ts.map +1 -0
  145. package/expresivo/ExpKeyButton/ExpKeyButton.jsx +60 -0
  146. package/expresivo/ExpKeyButton/ExpKeyButton.jsx.map +1 -0
  147. package/expresivo/ExpKeyButton/index.d.ts +3 -0
  148. package/expresivo/ExpKeyButton/index.d.ts.map +1 -0
  149. package/expresivo/ExpKeyButton/index.js +2 -0
  150. package/expresivo/ExpKeyButton/index.js.map +1 -0
  151. package/expresivo/ExpLensIcon/ExpLensIcon.d.ts +29 -0
  152. package/expresivo/ExpLensIcon/ExpLensIcon.d.ts.map +1 -0
  153. package/expresivo/ExpLensIcon/ExpLensIcon.jsx +29 -0
  154. package/expresivo/ExpLensIcon/ExpLensIcon.jsx.map +1 -0
  155. package/expresivo/ExpLensIcon/index.d.ts +3 -0
  156. package/expresivo/ExpLensIcon/index.d.ts.map +1 -0
  157. package/expresivo/ExpLensIcon/index.js +2 -0
  158. package/expresivo/ExpLensIcon/index.js.map +1 -0
  159. package/expresivo/ExpMascot/ExpMascot.d.ts +41 -0
  160. package/expresivo/ExpMascot/ExpMascot.d.ts.map +1 -0
  161. package/expresivo/ExpMascot/ExpMascot.jsx +45 -0
  162. package/expresivo/ExpMascot/ExpMascot.jsx.map +1 -0
  163. package/expresivo/ExpMascot/catalog.d.ts +12 -0
  164. package/expresivo/ExpMascot/catalog.d.ts.map +1 -0
  165. package/expresivo/ExpMascot/catalog.js +41 -0
  166. package/expresivo/ExpMascot/catalog.js.map +1 -0
  167. package/expresivo/ExpMascot/index.d.ts +4 -0
  168. package/expresivo/ExpMascot/index.d.ts.map +1 -0
  169. package/expresivo/ExpMascot/index.js +2 -0
  170. package/expresivo/ExpMascot/index.js.map +1 -0
  171. package/expresivo/ExpMedalBadge/ExpMedalBadge.d.ts +29 -0
  172. package/expresivo/ExpMedalBadge/ExpMedalBadge.d.ts.map +1 -0
  173. package/expresivo/ExpMedalBadge/ExpMedalBadge.jsx +87 -0
  174. package/expresivo/ExpMedalBadge/ExpMedalBadge.jsx.map +1 -0
  175. package/expresivo/ExpMedalBadge/index.d.ts +3 -0
  176. package/expresivo/ExpMedalBadge/index.d.ts.map +1 -0
  177. package/expresivo/ExpMedalBadge/index.js +2 -0
  178. package/expresivo/ExpMedalBadge/index.js.map +1 -0
  179. package/expresivo/ExpPageHero/ExpPageHero.d.ts +82 -0
  180. package/expresivo/ExpPageHero/ExpPageHero.d.ts.map +1 -0
  181. package/expresivo/ExpPageHero/ExpPageHero.jsx +113 -0
  182. package/expresivo/ExpPageHero/ExpPageHero.jsx.map +1 -0
  183. package/expresivo/ExpPageHero/index.d.ts +3 -0
  184. package/expresivo/ExpPageHero/index.d.ts.map +1 -0
  185. package/expresivo/ExpPageHero/index.js +2 -0
  186. package/expresivo/ExpPageHero/index.js.map +1 -0
  187. package/expresivo/ExpPillButton/ExpPillButton.d.ts +44 -0
  188. package/expresivo/ExpPillButton/ExpPillButton.d.ts.map +1 -0
  189. package/expresivo/ExpPillButton/ExpPillButton.jsx +75 -0
  190. package/expresivo/ExpPillButton/ExpPillButton.jsx.map +1 -0
  191. package/expresivo/ExpPillButton/index.d.ts +3 -0
  192. package/expresivo/ExpPillButton/index.d.ts.map +1 -0
  193. package/expresivo/ExpPillButton/index.js +2 -0
  194. package/expresivo/ExpPillButton/index.js.map +1 -0
  195. package/expresivo/ExpScope/ExpScope.d.ts +63 -0
  196. package/expresivo/ExpScope/ExpScope.d.ts.map +1 -0
  197. package/expresivo/ExpScope/ExpScope.jsx +67 -0
  198. package/expresivo/ExpScope/ExpScope.jsx.map +1 -0
  199. package/expresivo/ExpScope/index.d.ts +3 -0
  200. package/expresivo/ExpScope/index.d.ts.map +1 -0
  201. package/expresivo/ExpScope/index.js +2 -0
  202. package/expresivo/ExpScope/index.js.map +1 -0
  203. package/expresivo/ExpScoreRing/ExpScoreRing.d.ts +35 -0
  204. package/expresivo/ExpScoreRing/ExpScoreRing.d.ts.map +1 -0
  205. package/expresivo/ExpScoreRing/ExpScoreRing.jsx +67 -0
  206. package/expresivo/ExpScoreRing/ExpScoreRing.jsx.map +1 -0
  207. package/expresivo/ExpScoreRing/index.d.ts +3 -0
  208. package/expresivo/ExpScoreRing/index.d.ts.map +1 -0
  209. package/expresivo/ExpScoreRing/index.js +2 -0
  210. package/expresivo/ExpScoreRing/index.js.map +1 -0
  211. package/expresivo/index.d.ts +13 -0
  212. package/expresivo/index.d.ts.map +1 -0
  213. package/expresivo/index.js +13 -0
  214. package/expresivo/index.js.map +1 -0
  215. package/expresivo/shared/glyphs.d.ts +20 -0
  216. package/expresivo/shared/glyphs.d.ts.map +1 -0
  217. package/expresivo/shared/glyphs.jsx +60 -0
  218. package/expresivo/shared/glyphs.jsx.map +1 -0
  219. package/package.json +3 -2
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import clsx from 'clsx';
3
+ import { useEffect, useState, } from 'react';
4
+ import { ProgressBar } from '@clicoh/orion-library';
5
+ import { useExpScope } from '../ExpScope/ExpScope';
6
+ const clamp = (value) => Math.min(100, Math.max(0, value));
7
+ /**
8
+ * Progress bar whose fill grows in the clicOH gradient when it mounts. For
9
+ * scores and shares shown at rest; for an operation that is still running,
10
+ * use the core `ProgressBar`.
11
+ *
12
+ * Outside an `ExpScope` it falls back to the core `ProgressBar`.
13
+ *
14
+ * @component
15
+ * @example
16
+ * <ExpGrowBar value={57} ariaLabel="Share of cases solved" />
17
+ *
18
+ * @param {Object} props - The properties of the ExpGrowBar component.
19
+ * @param {number} props.value - Progress between 0 and 100.
20
+ * @param {string} props.ariaLabel - Accessible name of what the bar measures.
21
+ *
22
+ * @returns {ReactNode} The bar, or a core `ProgressBar` outside an `ExpScope`.
23
+ */
24
+ export function ExpGrowBar({ value, ariaLabel, ...restProps }) {
25
+ const inScope = useExpScope();
26
+ const [shown, setShown] = useState(0);
27
+ const percent = clamp(value);
28
+ useEffect(() => {
29
+ const timer = setTimeout(() => setShown(percent), 60);
30
+ return () => clearTimeout(timer);
31
+ }, [percent]);
32
+ if (!inScope) {
33
+ return <ProgressBar {...restProps} value={percent} ariaLabel={ariaLabel}/>;
34
+ }
35
+ return (<div {...restProps} role="progressbar" aria-label={ariaLabel} aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent} className={clsx('bg-gray-5 dark:bg-gray-dark-1 relative h-2 overflow-hidden rounded-full', restProps.className)}>
36
+ <span className="from-lavender to-violet absolute inset-y-0 left-0 rounded-full bg-linear-90 transition-[width] duration-900 ease-[cubic-bezier(.22,1,.36,1)] motion-reduce:transition-none" style={{ width: `${shown}%` }}/>
37
+ </div>);
38
+ }
39
+ //# sourceMappingURL=ExpGrowBar.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpGrowBar.jsx","sourceRoot":"","sources":["../../src/expresivo/ExpGrowBar/ExpGrowBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAGL,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,EACT,GAAG,SAAS,EACI;IAChB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAG,CAAC;IAC9E,CAAC;IAED,OAAO,CACL,CAAC,GAAG,CACF,IAAI,SAAS,CAAC,CACd,IAAI,CAAC,aAAa,CAClB,UAAU,CAAC,CAAC,SAAS,CAAC,CACtB,aAAa,CAAC,CAAC,CAAC,CAAC,CACjB,aAAa,CAAC,CAAC,GAAG,CAAC,CACnB,aAAa,CAAC,CAAC,OAAO,CAAC,CACvB,SAAS,CAAC,CAAC,IAAI,CACb,yEAAyE,EACzE,SAAS,CAAC,SAAS,CACpB,CAAC,CAEF;MAAA,CAAC,IAAI,CACH,SAAS,CAAC,4KAA4K,CACtL,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC,EAElC;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ExpGrowBar } from './ExpGrowBar';
2
+ export type { ExpGrowBarProps } from './ExpGrowBar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpGrowBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ExpGrowBar } from './ExpGrowBar';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expresivo/ExpGrowBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type StepperProps } from '@clicoh/orion-library';
3
+ import { type ExpMascotName } from '../ExpMascot';
4
+ export type ExpJourneyStage = {
5
+ id: string;
6
+ label: string;
7
+ /** Pose the mascot takes while this stage is current. */
8
+ mascot: ExpMascotName;
9
+ /** Short note shown under the label once the stage is reached. */
10
+ meta?: string;
11
+ /** Makes a reached stage clickable, to go back to it. */
12
+ onSelect?: () => void;
13
+ };
14
+ export type ExpJourneyStateLabels = Pick<StepperProps['stateLabels'], 'done' | 'current' | 'pending'>;
15
+ export type ExpJourneyTrackProps = {
16
+ /** Stages in order. */
17
+ stages: ExpJourneyStage[];
18
+ /** Index of the current stage. */
19
+ current: number;
20
+ /** Accessible name of the list. */
21
+ ariaLabel: string;
22
+ /** Words for each state, read by screen readers after every label. */
23
+ stateLabels: ExpJourneyStateLabels;
24
+ /** Width and height of the mascot, in pixels. */
25
+ mascotSize?: number;
26
+ /** Walks from the first stage to `current` once when it mounts. */
27
+ autoplay?: boolean;
28
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
29
+ /**
30
+ * Progress line with a mascot that travels to the current stage and takes
31
+ * that stage's pose. Reached stages get a check and the travelled part of
32
+ * the line fills with the clicOH gradient. Like the core `Stepper`, it only
33
+ * displays progress: the consumer owns `current`.
34
+ *
35
+ * The line and the mascot are decorative; the stages are an ordered list
36
+ * whose current item carries `aria-current="step"`.
37
+ *
38
+ * Outside an `ExpScope` it falls back to the core `Stepper`. When the scope
39
+ * hides mascots, the line renders without its traveller.
40
+ *
41
+ * @component
42
+ * @example
43
+ * <ExpJourneyTrack
44
+ * ariaLabel="Progress"
45
+ * stateLabels={{ done: 'done', current: 'in progress', pending: 'pending' }}
46
+ * current={1}
47
+ * stages={[
48
+ * { id: 'read', label: 'Read', mascot: 'oculus-04-analizando-documento' },
49
+ * { id: 'search', label: 'Search', mascot: 'oculus-07-buscando-rapido' },
50
+ * { id: 'answer', label: 'Answer', mascot: 'oculus-08-satisfecho' },
51
+ * ]}
52
+ * />
53
+ *
54
+ * @param {Object} props - The properties of the ExpJourneyTrack component.
55
+ * @param {ExpJourneyStage[]} props.stages - Stages in order, each with `id`, `label`, `mascot`, and optional `meta` and `onSelect`.
56
+ * @param {number} props.current - Index of the current stage.
57
+ * @param {string} props.ariaLabel - Accessible name of the list.
58
+ * @param {ExpJourneyStateLabels} props.stateLabels - Words for `done`, `current` and `pending`.
59
+ * @param {number} [props.mascotSize=88] - Width and height of the mascot, in pixels.
60
+ * @param {boolean} [props.autoplay=false] - Walks from the first stage to `current` once when it mounts. Off with reduced motion.
61
+ *
62
+ * @returns {ReactNode} The journey track, a core `Stepper` outside an `ExpScope`, or `null` without stages.
63
+ */
64
+ export declare function ExpJourneyTrack({ stages, current, ariaLabel, stateLabels, mascotSize, autoplay, ...restProps }: ExpJourneyTrackProps): ReactNode;
65
+ //# sourceMappingURL=ExpJourneyTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpJourneyTrack.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpJourneyTrack/ExpJourneyTrack.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,EAAE,aAAa,CAAC;IACtB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,YAAY,CAAC,aAAa,CAAC,EAC3B,MAAM,GAAG,SAAS,GAAG,SAAS,CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,uBAAuB;IACvB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,qBAAqB,CAAC;IACnC,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;AA+BrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAe,EACf,QAAgB,EAChB,GAAG,SAAS,EACb,EAAE,oBAAoB,GAAG,SAAS,CAsLlC"}
@@ -0,0 +1,156 @@
1
+ 'use client';
2
+ import clsx from 'clsx';
3
+ import { useEffect, useState, } from 'react';
4
+ import { FiCheck } from 'react-icons/fi';
5
+ import { Each, Show, Stepper } from '@clicoh/orion-library';
6
+ import { ExpMascot } from '../ExpMascot';
7
+ import { useExpScopeOptions } from '../ExpScope/ExpScope';
8
+ const STEP_MS = 1100;
9
+ const stateOf = (index, current) => {
10
+ if (index < current)
11
+ return 'done';
12
+ if (index === current)
13
+ return 'current';
14
+ return 'pending';
15
+ };
16
+ const dotMap = {
17
+ done: 'size-3.5 border-lavender bg-lavender dark:border-lavender-dark dark:bg-lavender-dark text-white',
18
+ current: 'size-[18px] border-lavender bg-white shadow-[0_0_0_5px_rgba(106,93,249,0.18)] dark:border-lavender-dark dark:bg-black',
19
+ pending: 'size-3.5 border-gray-4 bg-white dark:border-gray-1 dark:bg-black',
20
+ };
21
+ const labelMap = {
22
+ done: 'font-medium text-black dark:text-white',
23
+ current: 'font-semibold text-lavender dark:text-lavender-dark',
24
+ pending: 'font-medium text-gray-1 dark:text-gray-2',
25
+ };
26
+ const alignOf = (index, count) => {
27
+ if (index === 0)
28
+ return 'items-start text-left';
29
+ if (index === count - 1)
30
+ return 'items-end text-right';
31
+ return 'items-center text-center';
32
+ };
33
+ /**
34
+ * Progress line with a mascot that travels to the current stage and takes
35
+ * that stage's pose. Reached stages get a check and the travelled part of
36
+ * the line fills with the clicOH gradient. Like the core `Stepper`, it only
37
+ * displays progress: the consumer owns `current`.
38
+ *
39
+ * The line and the mascot are decorative; the stages are an ordered list
40
+ * whose current item carries `aria-current="step"`.
41
+ *
42
+ * Outside an `ExpScope` it falls back to the core `Stepper`. When the scope
43
+ * hides mascots, the line renders without its traveller.
44
+ *
45
+ * @component
46
+ * @example
47
+ * <ExpJourneyTrack
48
+ * ariaLabel="Progress"
49
+ * stateLabels={{ done: 'done', current: 'in progress', pending: 'pending' }}
50
+ * current={1}
51
+ * stages={[
52
+ * { id: 'read', label: 'Read', mascot: 'oculus-04-analizando-documento' },
53
+ * { id: 'search', label: 'Search', mascot: 'oculus-07-buscando-rapido' },
54
+ * { id: 'answer', label: 'Answer', mascot: 'oculus-08-satisfecho' },
55
+ * ]}
56
+ * />
57
+ *
58
+ * @param {Object} props - The properties of the ExpJourneyTrack component.
59
+ * @param {ExpJourneyStage[]} props.stages - Stages in order, each with `id`, `label`, `mascot`, and optional `meta` and `onSelect`.
60
+ * @param {number} props.current - Index of the current stage.
61
+ * @param {string} props.ariaLabel - Accessible name of the list.
62
+ * @param {ExpJourneyStateLabels} props.stateLabels - Words for `done`, `current` and `pending`.
63
+ * @param {number} [props.mascotSize=88] - Width and height of the mascot, in pixels.
64
+ * @param {boolean} [props.autoplay=false] - Walks from the first stage to `current` once when it mounts. Off with reduced motion.
65
+ *
66
+ * @returns {ReactNode} The journey track, a core `Stepper` outside an `ExpScope`, or `null` without stages.
67
+ */
68
+ export function ExpJourneyTrack({ stages, current, ariaLabel, stateLabels, mascotSize = 88, autoplay = false, ...restProps }) {
69
+ const options = useExpScopeOptions();
70
+ const [step, setStep] = useState(autoplay ? 0 : current);
71
+ useEffect(() => {
72
+ const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
73
+ if (!autoplay || reduceMotion) {
74
+ setStep(current);
75
+ return;
76
+ }
77
+ setStep(0);
78
+ let index = 0;
79
+ const timer = setInterval(() => {
80
+ index += 1;
81
+ setStep(Math.min(index, current));
82
+ if (index >= current)
83
+ clearInterval(timer);
84
+ }, STEP_MS);
85
+ return () => clearInterval(timer);
86
+ }, [autoplay, current, stages.length]);
87
+ if (stages.length === 0)
88
+ return null;
89
+ if (!options) {
90
+ return (<Stepper ariaLabel={ariaLabel} stateLabels={{ ...stateLabels, skipped: stateLabels.pending }} steps={stages.map((stage, index) => ({
91
+ id: stage.id,
92
+ label: stage.label,
93
+ state: stateOf(index, current),
94
+ }))}/>);
95
+ }
96
+ const showMascot = options.mascots === 'shown';
97
+ const lastIndex = Math.max(1, stages.length - 1);
98
+ const percent = (Math.min(step, lastIndex) / lastIndex) * 100;
99
+ const labelColumns = stages.length > 2
100
+ ? `minmax(0, 1fr) repeat(${stages.length - 2}, minmax(0, 2fr)) minmax(0, 1fr)`
101
+ : `repeat(${stages.length}, minmax(0, 1fr))`;
102
+ return (<div {...restProps} className={clsx('relative', restProps.className)}>
103
+ <div aria-hidden="true" className="relative" style={{ paddingTop: showMascot ? mascotSize + 8 : 0 }}>
104
+ {showMascot && (<div className="exp-float absolute top-0 transition-[left] duration-900 ease-[cubic-bezier(.65,0,.35,1)] motion-reduce:transition-none" style={{
105
+ width: mascotSize,
106
+ height: mascotSize,
107
+ left: `clamp(0px, calc(${percent}% - ${mascotSize / 2}px), calc(100% - ${mascotSize}px))`,
108
+ }}>
109
+ <Each of={stages} render={(stage, index) => (<span key={stage.id} className={clsx('absolute inset-0 transition-[opacity,scale] delay-200 duration-300 motion-reduce:transition-none', index === step
110
+ ? 'scale-100 opacity-100'
111
+ : 'scale-85 opacity-0')}>
112
+ <ExpMascot name={stage.mascot} size={mascotSize}/>
113
+ </span>)}/>
114
+ </div>)}
115
+ <div className="bg-gray-5 dark:bg-gray-dark-1 relative mx-1.5 h-1.5 rounded-full">
116
+ <span className="from-lavender to-violet absolute inset-y-0 left-0 rounded-full bg-linear-90 transition-[width] duration-900 ease-[cubic-bezier(.65,0,.35,1)] motion-reduce:transition-none" style={{ width: `${percent}%` }}/>
117
+ <Each of={stages} render={(stage, index) => {
118
+ const state = stateOf(index, step);
119
+ return (<span key={stage.id} className={clsx('absolute top-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border-2 transition-all duration-300', dotMap[state])} style={{ left: `${(index / lastIndex) * 100}%` }}>
120
+ {state === 'done' && (<FiCheck strokeWidth={4} className="size-2"/>)}
121
+ </span>);
122
+ }}/>
123
+ </div>
124
+ </div>
125
+ <ol aria-label={ariaLabel} className="mt-3.5 grid" style={{ gridTemplateColumns: labelColumns }}>
126
+ <Each of={stages} render={(stage, index) => {
127
+ const state = stateOf(index, current);
128
+ const isReached = index <= current;
129
+ const body = (<>
130
+ <span className={clsx('text-xs leading-4 transition-colors duration-300', labelMap[stateOf(index, step)])}>
131
+ {stage.label}
132
+ <span className="sr-only">, {stateLabels[state]}</span>
133
+ </span>
134
+ {!!stage.meta && (<span className={clsx('text-gray-1 dark:text-gray-2 text-[11px] leading-4 transition-opacity duration-300', index <= step ? 'opacity-100' : 'opacity-0')}>
135
+ {stage.meta}
136
+ </span>)}
137
+ </>);
138
+ return (<li key={stage.id} aria-current={state === 'current' ? 'step' : undefined} className="flex min-w-0">
139
+ <Show>
140
+ <Show.When isTrue={Boolean(stage.onSelect) && isReached}>
141
+ <button type="button" onClick={stage.onSelect} className={clsx('focus-visible:ring-lavender -mx-1.5 -my-1 flex w-full flex-col gap-0.5 rounded-lg px-1.5 py-1 focus-visible:ring-2 focus-visible:outline-none', alignOf(index, stages.length))}>
142
+ {body}
143
+ </button>
144
+ </Show.When>
145
+ <Show.Else>
146
+ <span className={clsx('flex w-full flex-col gap-0.5', alignOf(index, stages.length))}>
147
+ {body}
148
+ </span>
149
+ </Show.Else>
150
+ </Show>
151
+ </li>);
152
+ }}/>
153
+ </ol>
154
+ </div>);
155
+ }
156
+ //# sourceMappingURL=ExpJourneyTrack.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpJourneyTrack.jsx","sourceRoot":"","sources":["../../src/expresivo/ExpJourneyTrack/ExpJourneyTrack.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ExpJourneyTrack } from './ExpJourneyTrack';
2
+ export type { ExpJourneyStage, ExpJourneyStateLabels, ExpJourneyTrackProps, } from './ExpJourneyTrack';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpJourneyTrack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ExpJourneyTrack } from './ExpJourneyTrack';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expresivo/ExpJourneyTrack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
+ export type ExpKeyButtonTone = 'brand' | 'white' | 'black';
3
+ export type ExpKeyButtonSize = 'lg' | 'sm';
4
+ export type ExpKeyButtonIcon = 'lens' | 'sync' | 'none';
5
+ export type ExpKeyButtonProps = {
6
+ tone?: ExpKeyButtonTone;
7
+ size?: ExpKeyButtonSize;
8
+ icon?: ExpKeyButtonIcon;
9
+ /** Shows an arrow after the label that steps forward on hover. */
10
+ arrow?: boolean;
11
+ /** Sinks the key and blocks it while the action runs. */
12
+ busy?: boolean;
13
+ /** Label shown while `busy`. Defaults to `children`. */
14
+ busyLabel?: string;
15
+ /** Takes the full width of its container. */
16
+ block?: boolean;
17
+ } & ButtonHTMLAttributes<HTMLButtonElement>;
18
+ /**
19
+ * Call to action shaped like a physical key: a gradient face over a darker
20
+ * edge that gives it depth. It lifts on hover, sinks when pressed and stays
21
+ * sunk while `busy`, with a shine crossing its face. Use one per screen, for
22
+ * the main action.
23
+ *
24
+ * Outside an `ExpScope` it falls back to the core `Button`: `white` maps to
25
+ * `second`, the other tones to `principal`, and `sm` to the `field` size.
26
+ *
27
+ * @component
28
+ * @example
29
+ * <ExpKeyButton onClick={start}>Start</ExpKeyButton>
30
+ *
31
+ * @example
32
+ * // Compact, in a row of form controls, without icon or arrow
33
+ * <ExpKeyButton size="sm" tone="white" icon="none" arrow={false}>Clear</ExpKeyButton>
34
+ *
35
+ * @param {Object} props - The properties of the ExpKeyButton component.
36
+ * @param {'brand' | 'white' | 'black'} [props.tone='brand'] - Color of the key face.
37
+ * @param {'lg' | 'sm'} [props.size='lg'] - `lg` is 52px tall; `sm` is 36px, the height of `Input`, `Select` and `DatePicker`.
38
+ * @param {'lens' | 'sync' | 'none'} [props.icon='lens'] - Glyph before the label.
39
+ * @param {boolean} [props.arrow=true] - Shows an arrow after the label.
40
+ * @param {boolean} [props.busy=false] - Sinks the key and blocks it while the action runs.
41
+ * @param {string} [props.busyLabel] - Label shown while `busy`.
42
+ * @param {boolean} [props.block=false] - Takes the full width of its container.
43
+ * @param {ReactNode} props.children - Label of the action.
44
+ * @param {ButtonHTMLAttributes<HTMLButtonElement>} restProps - Additional properties for the button element.
45
+ *
46
+ * @returns {ReactNode} The rendered key, or a core `Button` outside an `ExpScope`.
47
+ */
48
+ export declare function ExpKeyButton({ tone, size, icon, arrow, busy, busyLabel, block, disabled, children, ...restProps }: ExpKeyButtonProps): ReactNode;
49
+ //# sourceMappingURL=ExpKeyButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpKeyButton.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpKeyButton/ExpKeyButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM7D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAY5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAc,EACd,IAAW,EACX,IAAa,EACb,KAAY,EACZ,IAAY,EACZ,SAAS,EACT,KAAa,EACb,QAAgB,EAChB,QAAQ,EACR,GAAG,SAAS,EACb,EAAE,iBAAiB,GAAG,SAAS,CAmD/B"}
@@ -0,0 +1,60 @@
1
+ 'use client';
2
+ import clsx from 'clsx';
3
+ import { FiArrowRight, FiRefreshCw, FiSearch } from 'react-icons/fi';
4
+ import { Button } from '@clicoh/orion-library';
5
+ import { useExpScope } from '../ExpScope/ExpScope';
6
+ import { ArrowGlyph, LensGlyph, SyncBadgeGlyph } from '../shared/glyphs';
7
+ const fallbackIconMap = {
8
+ lens: <FiSearch />,
9
+ sync: <FiRefreshCw />,
10
+ none: undefined,
11
+ };
12
+ const glyphSizeMap = { lg: 32, sm: 24 };
13
+ const arrowSizeMap = { lg: 20, sm: 16 };
14
+ /**
15
+ * Call to action shaped like a physical key: a gradient face over a darker
16
+ * edge that gives it depth. It lifts on hover, sinks when pressed and stays
17
+ * sunk while `busy`, with a shine crossing its face. Use one per screen, for
18
+ * the main action.
19
+ *
20
+ * Outside an `ExpScope` it falls back to the core `Button`: `white` maps to
21
+ * `second`, the other tones to `principal`, and `sm` to the `field` size.
22
+ *
23
+ * @component
24
+ * @example
25
+ * <ExpKeyButton onClick={start}>Start</ExpKeyButton>
26
+ *
27
+ * @example
28
+ * // Compact, in a row of form controls, without icon or arrow
29
+ * <ExpKeyButton size="sm" tone="white" icon="none" arrow={false}>Clear</ExpKeyButton>
30
+ *
31
+ * @param {Object} props - The properties of the ExpKeyButton component.
32
+ * @param {'brand' | 'white' | 'black'} [props.tone='brand'] - Color of the key face.
33
+ * @param {'lg' | 'sm'} [props.size='lg'] - `lg` is 52px tall; `sm` is 36px, the height of `Input`, `Select` and `DatePicker`.
34
+ * @param {'lens' | 'sync' | 'none'} [props.icon='lens'] - Glyph before the label.
35
+ * @param {boolean} [props.arrow=true] - Shows an arrow after the label.
36
+ * @param {boolean} [props.busy=false] - Sinks the key and blocks it while the action runs.
37
+ * @param {string} [props.busyLabel] - Label shown while `busy`.
38
+ * @param {boolean} [props.block=false] - Takes the full width of its container.
39
+ * @param {ReactNode} props.children - Label of the action.
40
+ * @param {ButtonHTMLAttributes<HTMLButtonElement>} restProps - Additional properties for the button element.
41
+ *
42
+ * @returns {ReactNode} The rendered key, or a core `Button` outside an `ExpScope`.
43
+ */
44
+ export function ExpKeyButton({ tone = 'brand', size = 'lg', icon = 'lens', arrow = true, busy = false, busyLabel, block = false, disabled = false, children, ...restProps }) {
45
+ const inScope = useExpScope();
46
+ const label = busy && busyLabel ? busyLabel : children;
47
+ if (!inScope) {
48
+ return (<Button {...restProps} modifier={tone === 'white' ? 'second' : 'principal'} size={size === 'lg' ? 'md' : 'field'} iconL={fallbackIconMap[icon]} iconR={arrow ? <FiArrowRight /> : undefined} disabled={disabled || busy} aria-busy={busy || undefined} className={clsx(block && 'w-full', restProps.className)}>
49
+ {label}
50
+ </Button>);
51
+ }
52
+ return (<button {...restProps} disabled={disabled || busy} aria-busy={busy || undefined} data-tone={tone} data-size={size} data-icon={icon} data-state={disabled ? 'disabled' : busy ? 'busy' : 'idle'} className={clsx('exp-key', block && 'exp-key--block', restProps.className)}>
53
+ {busy && <span aria-hidden="true" className="exp-key-shine"/>}
54
+ {icon === 'lens' && (<LensGlyph size={glyphSizeMap[size]} busy={busy} disabled={disabled}/>)}
55
+ {icon === 'sync' && (<SyncBadgeGlyph size={glyphSizeMap[size]} busy={busy} disabled={disabled}/>)}
56
+ <span className="exp-key-label">{label}</span>
57
+ {arrow && <ArrowGlyph size={arrowSizeMap[size]}/>}
58
+ </button>);
59
+ }
60
+ //# sourceMappingURL=ExpKeyButton.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpKeyButton.jsx","sourceRoot":"","sources":["../../src/expresivo/ExpKeyButton/ExpKeyButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ExpKeyButton } from './ExpKeyButton';
2
+ export type { ExpKeyButtonIcon, ExpKeyButtonProps, ExpKeyButtonSize, ExpKeyButtonTone, } from './ExpKeyButton';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpKeyButton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ExpKeyButton } from './ExpKeyButton';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expresivo/ExpKeyButton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ReactNode } from 'react';
2
+ export type ExpLensIconProps = {
3
+ /** Width and height in pixels. */
4
+ size?: number;
5
+ /** Scans from side to side while the action runs. */
6
+ busy?: boolean;
7
+ /** Grays out, to match a disabled button. */
8
+ disabled?: boolean;
9
+ };
10
+ /**
11
+ * Magnifier with an eye inside, for the `iconL` of a core `Button` that
12
+ * searches or investigates. It blinks at rest, looks towards the label while
13
+ * the button is hovered, and scans while `busy`. It is decorative.
14
+ *
15
+ * Outside an `ExpScope` it falls back to the plain search icon.
16
+ *
17
+ * @component
18
+ * @example
19
+ * <Button iconL={<ExpLensIcon busy={isSearching} />}>Search</Button>
20
+ *
21
+ * @param {Object} props - The properties of the ExpLensIcon component.
22
+ * @param {number} [props.size=20] - Width and height in pixels.
23
+ * @param {boolean} [props.busy=false] - Scans from side to side while the action runs.
24
+ * @param {boolean} [props.disabled=false] - Grays out, to match a disabled button.
25
+ *
26
+ * @returns {ReactNode} The lens, or `FiSearch` outside an `ExpScope`.
27
+ */
28
+ export declare function ExpLensIcon({ size, busy, disabled, }: ExpLensIconProps): ReactNode;
29
+ //# sourceMappingURL=ExpLensIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpLensIcon.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpLensIcon/ExpLensIcon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAS,EACT,IAAY,EACZ,QAAgB,GACjB,EAAE,gBAAgB,GAAG,SAAS,CAM9B"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { FiSearch } from 'react-icons/fi';
3
+ import { useExpScope } from '../ExpScope/ExpScope';
4
+ import { LensGlyph } from '../shared/glyphs';
5
+ /**
6
+ * Magnifier with an eye inside, for the `iconL` of a core `Button` that
7
+ * searches or investigates. It blinks at rest, looks towards the label while
8
+ * the button is hovered, and scans while `busy`. It is decorative.
9
+ *
10
+ * Outside an `ExpScope` it falls back to the plain search icon.
11
+ *
12
+ * @component
13
+ * @example
14
+ * <Button iconL={<ExpLensIcon busy={isSearching} />}>Search</Button>
15
+ *
16
+ * @param {Object} props - The properties of the ExpLensIcon component.
17
+ * @param {number} [props.size=20] - Width and height in pixels.
18
+ * @param {boolean} [props.busy=false] - Scans from side to side while the action runs.
19
+ * @param {boolean} [props.disabled=false] - Grays out, to match a disabled button.
20
+ *
21
+ * @returns {ReactNode} The lens, or `FiSearch` outside an `ExpScope`.
22
+ */
23
+ export function ExpLensIcon({ size = 20, busy = false, disabled = false, }) {
24
+ const inScope = useExpScope();
25
+ if (!inScope)
26
+ return <FiSearch aria-hidden="true"/>;
27
+ return <LensGlyph size={size} busy={busy} disabled={disabled}/>;
28
+ }
29
+ //# sourceMappingURL=ExpLensIcon.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpLensIcon.jsx","sourceRoot":"","sources":["../../src/expresivo/ExpLensIcon/ExpLensIcon.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAW7C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,KAAK,GACC;IACjB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAG,CAAC;IAErD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAG,CAAC;AACnE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ExpLensIcon } from './ExpLensIcon';
2
+ export type { ExpLensIconProps } from './ExpLensIcon';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpLensIcon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ExpLensIcon } from './ExpLensIcon';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expresivo/ExpLensIcon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import { type ExpMascotName } from './catalog';
3
+ export type ExpMascotMotion = 'still' | 'float' | 'hang';
4
+ export type ExpMascotProps = {
5
+ name: ExpMascotName;
6
+ /** Width and height on screen, in pixels. */
7
+ size?: number;
8
+ motion?: ExpMascotMotion;
9
+ } & Omit<HTMLAttributes<HTMLSpanElement>, 'children'>;
10
+ /**
11
+ * One of the official clicOH mascots, drawn from its file as is: never
12
+ * redrawn, recolored or cropped.
13
+ *
14
+ * Mascots are decorative and hidden from screen readers, so the text next to
15
+ * them must carry the message. Use one per state (empty, loading, error, no
16
+ * permission, success), above the title and the copy, and never on screens
17
+ * full of data. Suggested sizes: 96–128px for desktop empty states, 80px on
18
+ * small screens, 48–64px inside a message or a toast.
19
+ *
20
+ * In dark mode Bugi sits on a light disc so it reads on the dark background;
21
+ * Oculus and Fixi need none.
22
+ *
23
+ * Renders nothing outside an `ExpScope`, or when the scope hides mascots.
24
+ *
25
+ * @component
26
+ * @example
27
+ * <ExpMascot name="oculus-01-feliz" size={112} />
28
+ *
29
+ * @example
30
+ * // Hanging from a thread, swinging gently
31
+ * <ExpMascot name="fixi-06-celebrando" size={56} motion="hang" />
32
+ *
33
+ * @param {Object} props - The properties of the ExpMascot component.
34
+ * @param {ExpMascotName} props.name - Mascot and pose, as in `oculus-01-feliz`.
35
+ * @param {number} [props.size=112] - Width and height on screen, in pixels.
36
+ * @param {'still' | 'float' | 'hang'} [props.motion='still'] - `float` bobs up and down; `hang` hangs it from a thread and swings it. Both stop with reduced motion.
37
+ *
38
+ * @returns {ReactNode} The mascot, or `null` outside an `ExpScope`.
39
+ */
40
+ export declare function ExpMascot({ name, size, motion, ...restProps }: ExpMascotProps): ReactNode;
41
+ //# sourceMappingURL=ExpMascot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpMascot.d.ts","sourceRoot":"","sources":["../../src/expresivo/ExpMascot/ExpMascot.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,WAAW,CAAC;AAE9D,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,IAAU,EACV,MAAgB,EAChB,GAAG,SAAS,EACb,EAAE,cAAc,GAAG,SAAS,CAiC5B"}