@proyecto-viviana/ui 0.4.0 → 0.4.1

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 (63) hide show
  1. package/dist/CalendarCard.js +2 -3
  2. package/dist/CalendarCard.js.map +1 -1
  3. package/dist/CalendarCard.jsx +7 -8
  4. package/dist/CalendarCard.jsx.map +1 -1
  5. package/dist/Conversation.js +44 -45
  6. package/dist/Conversation.js.map +1 -1
  7. package/dist/Conversation.jsx +49 -50
  8. package/dist/Conversation.jsx.map +1 -1
  9. package/dist/EventCard.js +3 -5
  10. package/dist/EventCard.js.map +1 -1
  11. package/dist/EventCard.jsx +17 -19
  12. package/dist/EventCard.jsx.map +1 -1
  13. package/dist/Logo.js +64 -64
  14. package/dist/Logo.js.map +1 -1
  15. package/dist/Logo.jsx +64 -64
  16. package/dist/Logo.jsx.map +1 -1
  17. package/dist/PageLayout.js +7 -7
  18. package/dist/PageLayout.jsx +7 -7
  19. package/dist/PageLayout.jsx.map +1 -1
  20. package/dist/ProfileCard.js +2 -3
  21. package/dist/ProfileCard.js.map +1 -1
  22. package/dist/ProfileCard.jsx +8 -9
  23. package/dist/ProfileCard.jsx.map +1 -1
  24. package/dist/ProjectCard.js +86 -88
  25. package/dist/ProjectCard.js.map +1 -1
  26. package/dist/ProjectCard.jsx +86 -88
  27. package/dist/ProjectCard.jsx.map +1 -1
  28. package/dist/TimelineItem.js +2 -2
  29. package/dist/TimelineItem.js.map +1 -1
  30. package/dist/TimelineItem.jsx +4 -4
  31. package/dist/TimelineItem.jsx.map +1 -1
  32. package/dist/chip2.js +43 -43
  33. package/dist/chip2.js.map +1 -1
  34. package/dist/chip2.jsx +43 -43
  35. package/dist/chip2.jsx.map +1 -1
  36. package/dist/custom/calendar-card/index.d.ts.map +1 -1
  37. package/dist/custom/chip/index.d.ts.map +1 -1
  38. package/dist/custom/conversation/index.d.ts.map +1 -1
  39. package/dist/custom/event-card/index.d.ts.map +1 -1
  40. package/dist/custom/lateral-nav/index.d.ts.map +1 -1
  41. package/dist/custom/logo/index.d.ts.map +1 -1
  42. package/dist/custom/nav-header/index.d.ts.map +1 -1
  43. package/dist/custom/profile-card/index.d.ts.map +1 -1
  44. package/dist/custom/timeline-item/index.d.ts.map +1 -1
  45. package/dist/styles.css +1 -1
  46. package/dist/vite.d.ts +1 -0
  47. package/dist/vite.d.ts.map +1 -1
  48. package/dist/vite.js +9 -1
  49. package/dist/vite.js.map +1 -1
  50. package/dist/vite.jsx +9 -1
  51. package/dist/vite.jsx.map +1 -1
  52. package/package.json +3 -3
  53. package/src/custom/calendar-card/index.tsx +10 -1
  54. package/src/custom/chip/index.tsx +5 -1
  55. package/src/custom/conversation/index.tsx +23 -6
  56. package/src/custom/event-card/index.tsx +25 -4
  57. package/src/custom/lateral-nav/index.tsx +10 -1
  58. package/src/custom/logo/index.tsx +8 -1
  59. package/src/custom/nav-header/index.tsx +9 -1
  60. package/src/custom/profile-card/index.tsx +11 -2
  61. package/src/custom/project-card/index.tsx +1 -1
  62. package/src/custom/timeline-item/index.tsx +10 -2
  63. package/src/vite.ts +13 -1
@@ -1,22 +1,20 @@
1
1
  /* empty css */
2
- /* empty css */
3
- /* empty css */
4
2
  import { Avatar } from "@proyecto-viviana/solid-spectrum";
5
3
  import { For, Show } from "solid-js";
6
4
  import { Button } from "@proyecto-viviana/solidaria-components";
7
5
  //#region src/custom/event-card/index.tsx
8
- const card = " _Pc13 sd13 _ta13 _Nc13 Pc13 oe13 ne13 ke13 je13 gDE5VE13 _nLeasBb13";
9
- const decoration = " _Pa13 WJ13 _zI13 ZC13 Fx13 _Ha13";
10
- const preview = " Za13 fu4qurc13 _Hb13";
11
- const body = " sd13 _ta13 Ug13 qg13 Tf13 Qf13 Sf13 Rf13";
12
- const title = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-g13 vx13 xe13 _xa13 xX0cczbd13 _xX0cczba13 xfe13 _xfa13 xfX0cczbd13 _xfX0cczba13 _Fd13 _FnuYUweb13 pj1j4Pd13";
13
- const meta = " sd13 eb13 Ul13 ql13 uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13";
14
- const metaItem = " sd13 eb13 Ub13 qb13";
15
- const metaIcon = " pj1j4Pd13";
16
- const attendeesRow = " sd13 eb13 Ue13 qe13";
17
- const avatars = " sd13 eb13 Ub13 qb13";
18
- const more = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13";
19
- const actionRow = " sd13 Ue13 qe13";
6
+ const card = " _Pc151 sd151 _ta151 _Nc151 Pc151 oe151 ne151 ke151 je151 gDE5VE151 _nLeasBb151";
7
+ const decoration = " _Pa151 WJ151 _zI151 ZC151 Fx151 _Ha151";
8
+ const preview = " Za151 fu4qurc151 _Hb151";
9
+ const body = " sd151 _ta151 Ug151 qg151 Tf151 Qf151 Sf151 Rf151";
10
+ const title = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-g151 vx151 xe151 _xa151 xX0cczbd151 _xX0cczba151 xfe151 _xfa151 xfX0cczbd151 _xfX0cczba151 _Fd151 _FnuYUweb151 pH0v9Fe151";
11
+ const meta = " sd151 eb151 Ul151 ql151 uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151";
12
+ const metaItem = " sd151 eb151 Ub151 qb151";
13
+ const metaIcon = " pO550xe151";
14
+ const attendeesRow = " sd151 eb151 Ue151 qe151";
15
+ const avatars = " sd151 eb151 Ub151 qb151";
16
+ const more = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151";
17
+ const actionRow = " sd151 Ue151 qe151";
20
18
  function EventCard(props) {
21
19
  const displayedAttendees = () => props.attendees?.slice(0, 3) ?? [];
22
20
  const remainingCount = () => {
@@ -72,11 +70,11 @@ function EventCard(props) {
72
70
  </div>
73
71
  </div>;
74
72
  }
75
- const listItem = " sd13 eb13 Ug13 qg13 Za13 Tt13 Qt13 St13 Rt13 oc13 nc13 kc13 jc13 _Wd13 ry13 g913 _je13";
76
- const thumb = " ZF13 Fz13 _va13 ob13 nb13 kb13 jb13 _Hb13";
77
- const listBody = " sd13 _ta13 _ub13 Na13";
78
- const listTitle = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-c13 vx13 xc13 _xa13 _Fd13 _FnuYUweb13 pXDQpyb13 _Nc13 Pc13 _Yb13 _7c13";
79
- const listSubtitle = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13 _Nc13 Pc13 _Yb13 _7c13";
73
+ const listItem = " sd151 eb151 Ug151 qg151 Za151 Tt151 Qt151 St151 Rt151 oc151 nc151 kc151 jc151 _Wd151 ry151 g9151 _je151";
74
+ const thumb = " ZF151 Fz151 _va151 ob151 nb151 kb151 jb151 _Hb151";
75
+ const listBody = " sd151 _ta151 _ub151 Na151";
76
+ const listTitle = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-c151 vx151 xc151 _xa151 _Fd151 _FnuYUweb151 pXDQpyb151 _Nc151 Pc151 _Yb151 _7c151";
77
+ const listSubtitle = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pxeCuqc151 _Nc151 Pc151 _Yb151 _7c151";
80
78
  function EventListItem(props) {
81
79
  return <Button class={`${listItem} ${props.class ?? ""}`} onPress={() => props.onClick?.()}>
82
80
  <Show when={props.image}>
@@ -1 +1 @@
1
- {"version":3,"file":"EventCard.jsx","names":[],"sources":["../src/custom/event-card/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { Show, For } from \"solid-js\";\nimport { Avatar } from \"@proyecto-viviana/solid-spectrum\";\nimport { Button as HeadlessButton } from \"@proyecto-viviana/solidaria-components\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). An event summary card (S2 Card shape: preview + content +\n// footer) plus a compact list-item variant, on the S2 ramps in Silapse colors.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface EventCardProps {\n title: string;\n image?: string;\n date?: string;\n author?: string;\n authorAvatar?: string;\n attendees?: { avatar?: string; name: string }[];\n attendeeCount?: number;\n decorationImage?: string;\n /**\n * Actions to display below the event.\n * Use a function returning JSX for SSR compatibility: `actions={() => <Button>...</Button>}`\n */\n actions?: JSX.Element | (() => JSX.Element);\n class?: string;\n}\n\nconst card = style({\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n borderRadius: \"xl\",\n backgroundColor: \"[var(--color-bg-200)]\",\n boxShadow: \"elevated\",\n});\n\nconst decoration = style({\n position: \"absolute\",\n top: 8,\n insetEnd: 8,\n width: 32,\n height: 32,\n objectFit: \"contain\",\n});\n\nconst preview = style({\n width: \"full\",\n aspectRatio: \"16/9\",\n objectFit: \"cover\",\n});\n\nconst body = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\n});\n\nconst title = style({\n font: \"heading\",\n color: \"[var(--color-accent)]\",\n});\n\nconst meta = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n});\n\nconst metaItem = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n});\n\nconst metaIcon = style({\n color: \"[var(--color-accent)]\",\n});\n\nconst attendeesRow = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n});\n\nconst avatars = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n});\n\nconst more = style({\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n});\n\nconst actionRow = style({\n display: \"flex\",\n gap: 8,\n});\n\nexport function EventCard(props: EventCardProps) {\n const displayedAttendees = () => props.attendees?.slice(0, 3) ?? [];\n const remainingCount = () => {\n const total = props.attendeeCount ?? props.attendees?.length ?? 0;\n const displayed = displayedAttendees().length;\n return total - displayed;\n };\n\n return (\n <div class={`${card} ${props.class ?? \"\"}`}>\n <Show when={props.decorationImage}>\n <img class={decoration} src={props.decorationImage} alt=\"\" />\n </Show>\n\n <Show when={props.image}>\n <img class={preview} src={props.image} alt={props.title} />\n </Show>\n\n <div class={body}>\n <h3 class={title}>{props.title}</h3>\n\n <Show when={props.date || props.author}>\n <div class={meta}>\n <Show when={props.author}>\n <div class={metaItem}>\n <span class={metaIcon}>@</span>\n <span>{props.author}</span>\n </div>\n </Show>\n <Show when={props.date}>\n <div class={metaItem}>\n <span class={metaIcon}>⏱</span>\n <span>{props.date}</span>\n </div>\n </Show>\n </div>\n </Show>\n\n <Show when={displayedAttendees().length > 0}>\n <div class={attendeesRow}>\n <div class={avatars}>\n <For each={displayedAttendees()}>\n {(attendee) => <Avatar src={attendee.avatar} alt={attendee.name} size=\"sm\" />}\n </For>\n </div>\n <Show when={remainingCount() > 0}>\n <span class={more}>+{remainingCount()} más</span>\n </Show>\n </div>\n </Show>\n\n <Show when={props.actions}>\n <div class={actionRow}>\n {typeof props.actions === \"function\" ? props.actions() : props.actions}\n </div>\n </Show>\n </div>\n </div>\n );\n}\n\nexport interface EventListItemProps {\n title: string;\n image?: string;\n subtitle?: string;\n onClick?: () => void;\n class?: string;\n}\n\nconst listItem = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"full\",\n padding: 8,\n borderRadius: \"lg\",\n textAlign: \"start\",\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n borderStyle: \"none\",\n});\n\nconst thumb = style({\n width: 48,\n height: 48,\n flexShrink: 0,\n borderRadius: \"default\",\n objectFit: \"cover\",\n});\n\nconst listBody = style({\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n minWidth: 0,\n});\n\nconst listTitle = style({\n font: \"ui\",\n fontWeight: \"medium\",\n color: \"[var(--color-primary-100)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nconst listSubtitle = style({\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nexport function EventListItem(props: EventListItemProps) {\n return (\n <HeadlessButton class={`${listItem} ${props.class ?? \"\"}`} onPress={() => props.onClick?.()}>\n <Show when={props.image}>\n <img class={thumb} src={props.image} alt={props.title} />\n </Show>\n <div class={listBody}>\n <h4 class={listTitle}>{props.title}</h4>\n <Show when={props.subtitle}>\n <p class={listSubtitle}>{props.subtitle}</p>\n </Show>\n </div>\n </HeadlessButton>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EventCard.jsx","names":[],"sources":["../src/custom/event-card/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { Show, For } from \"solid-js\";\nimport { Avatar } from \"@proyecto-viviana/solid-spectrum\";\nimport { Button as HeadlessButton } from \"@proyecto-viviana/solidaria-components\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). An event summary card (S2 Card shape: preview + content +\n// footer) plus a compact list-item variant, on the S2 ramps in Silapse colors.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface EventCardProps {\n title: string;\n image?: string;\n date?: string;\n author?: string;\n authorAvatar?: string;\n attendees?: { avatar?: string; name: string }[];\n attendeeCount?: number;\n decorationImage?: string;\n /**\n * Actions to display below the event.\n * Use a function returning JSX for SSR compatibility: `actions={() => <Button>...</Button>}`\n */\n actions?: JSX.Element | (() => JSX.Element);\n class?: string;\n}\n\nconst card = style({\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n borderRadius: \"xl\",\n backgroundColor: \"[var(--color-bg-200)]\",\n boxShadow: \"elevated\",\n});\n\nconst decoration = style({\n position: \"absolute\",\n top: 8,\n insetEnd: 8,\n width: 32,\n height: 32,\n objectFit: \"contain\",\n});\n\nconst preview = style({\n width: \"full\",\n aspectRatio: \"16/9\",\n objectFit: \"cover\",\n});\n\nconst body = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\n});\n\nconst title = style({\n font: \"heading\",\n // WCAG AA fix: the title sits on the `--color-bg-200` card. `--color-accent`\n // (#df5c9a) is a fixed pink in BOTH themes, so it does not flip against a card\n // that is dark-grey in dark mode and light-blue in light mode — it read 4.48:1\n // dark / 1.89:1 light. `font: heading` renders 22px / weight 800, which is WCAG\n // large text via the BOLD path (≥18.66px && ≥700), NOT because it is ≥24px — so\n // the 3:1 large-text floor applies. `--color-accent-500` is the smallest ramp\n // step that flips with the theme (bright pink dark / deep magenta light) AND\n // clears 3:1 both ways (3.87:1 dark / 4.91:1 light), keeping the brand accent.\n color: \"[var(--color-accent-500)]\",\n});\n\nconst meta = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n font: \"ui-sm\",\n // WCAG AA fix: the meta text is small (`ui-sm`), so the 4.5:1 normal-text\n // floor applies. `--color-text-secondary` read only 3.84:1 on the light\n // `--color-bg-200` card; `--color-text` flips and clears 4.5:1 both ways\n // (15.33:1 dark / 7.53:1 light). Secondary de-emphasis rides on the smaller\n // `ui-sm` size rather than a sub-AA color.\n color: \"[var(--color-text)]\",\n});\n\nconst metaItem = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n});\n\nconst metaIcon = style({\n // WCAG AA fix: the meta glyphs (@ / ⏱) are small (inherit `ui-sm`), so the\n // 4.5:1 floor applies. `--color-accent` fails on the card (4.48:1 dark /\n // 1.89:1 light) and no pink ramp step clears 4.5:1 on both the dark-grey and\n // light-blue card, so the glyphs take the flipping `--color-text` like the\n // meta text they prefix.\n color: \"[var(--color-text)]\",\n});\n\nconst attendeesRow = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n});\n\nconst avatars = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n});\n\nconst more = style({\n font: \"ui-sm\",\n // WCAG AA fix: the \"+N más\" overflow count is small text on the same\n // `--color-bg-200` card as the meta, so it shares the same 3.84:1-light\n // failure and the same `--color-text` fix.\n color: \"[var(--color-text)]\",\n});\n\nconst actionRow = style({\n display: \"flex\",\n gap: 8,\n});\n\nexport function EventCard(props: EventCardProps) {\n const displayedAttendees = () => props.attendees?.slice(0, 3) ?? [];\n const remainingCount = () => {\n const total = props.attendeeCount ?? props.attendees?.length ?? 0;\n const displayed = displayedAttendees().length;\n return total - displayed;\n };\n\n return (\n <div class={`${card} ${props.class ?? \"\"}`}>\n <Show when={props.decorationImage}>\n <img class={decoration} src={props.decorationImage} alt=\"\" />\n </Show>\n\n <Show when={props.image}>\n <img class={preview} src={props.image} alt={props.title} />\n </Show>\n\n <div class={body}>\n <h3 class={title}>{props.title}</h3>\n\n <Show when={props.date || props.author}>\n <div class={meta}>\n <Show when={props.author}>\n <div class={metaItem}>\n <span class={metaIcon}>@</span>\n <span>{props.author}</span>\n </div>\n </Show>\n <Show when={props.date}>\n <div class={metaItem}>\n <span class={metaIcon}>⏱</span>\n <span>{props.date}</span>\n </div>\n </Show>\n </div>\n </Show>\n\n <Show when={displayedAttendees().length > 0}>\n <div class={attendeesRow}>\n <div class={avatars}>\n <For each={displayedAttendees()}>\n {(attendee) => <Avatar src={attendee.avatar} alt={attendee.name} size=\"sm\" />}\n </For>\n </div>\n <Show when={remainingCount() > 0}>\n <span class={more}>+{remainingCount()} más</span>\n </Show>\n </div>\n </Show>\n\n <Show when={props.actions}>\n <div class={actionRow}>\n {typeof props.actions === \"function\" ? props.actions() : props.actions}\n </div>\n </Show>\n </div>\n </div>\n );\n}\n\nexport interface EventListItemProps {\n title: string;\n image?: string;\n subtitle?: string;\n onClick?: () => void;\n class?: string;\n}\n\nconst listItem = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"full\",\n padding: 8,\n borderRadius: \"lg\",\n textAlign: \"start\",\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n borderStyle: \"none\",\n});\n\nconst thumb = style({\n width: 48,\n height: 48,\n flexShrink: 0,\n borderRadius: \"default\",\n objectFit: \"cover\",\n});\n\nconst listBody = style({\n display: \"flex\",\n flexDirection: \"column\",\n flexGrow: 1,\n minWidth: 0,\n});\n\nconst listTitle = style({\n font: \"ui\",\n fontWeight: \"medium\",\n color: \"[var(--color-primary-100)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nconst listSubtitle = style({\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nexport function EventListItem(props: EventListItemProps) {\n return (\n <HeadlessButton class={`${listItem} ${props.class ?? \"\"}`} onPress={() => props.onClick?.()}>\n <Show when={props.image}>\n <img class={thumb} src={props.image} alt={props.title} />\n </Show>\n <div class={listBody}>\n <h4 class={listTitle}>{props.title}</h4>\n <Show when={props.subtitle}>\n <p class={listSubtitle}>{props.subtitle}</p>\n </Show>\n </div>\n </HeadlessButton>\n );\n}\n"],"mappings":"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"}
package/dist/Logo.js CHANGED
@@ -3,89 +3,89 @@ import { className, effect, getNextElement, insert, template } from "solid-js/we
3
3
  var _tmpl$ = /*#__PURE__*/ template(`<span><span></span><span>`);
4
4
  const wordmark = function anonymous(props) {
5
5
  let rules = " ";
6
- rules += " sh13";
7
- rules += " ea13";
8
- rules += " qe13";
9
- rules += " _7c13";
6
+ rules += " sh151";
7
+ rules += " ea151";
8
+ rules += " qe151";
9
+ rules += " _7c151";
10
10
  if (props.size === "xl") {
11
- rules += " uk13";
12
- rules += " ucJ9TBTb13";
13
- rules += " ud3Euai13";
14
- rules += " uea13";
15
- rules += " ugb13";
16
- rules += " uhd13";
17
- rules += " uje13";
18
- rules += " u2NhKxcl13";
19
- rules += " uic13";
11
+ rules += " uk151";
12
+ rules += " ucJ9TBTb151";
13
+ rules += " ud3Euai151";
14
+ rules += " uea151";
15
+ rules += " ugb151";
16
+ rules += " uhd151";
17
+ rules += " uje151";
18
+ rules += " u2NhKxcl151";
19
+ rules += " uic151";
20
20
  } else if (props.size === "lg") {
21
- rules += " uk13";
22
- rules += " ucJ9TBTb13";
23
- rules += " ud3Euai13";
24
- rules += " uea13";
25
- rules += " ugb13";
26
- rules += " uhd13";
27
- rules += " uje13";
28
- rules += " u2NhKxcl13";
29
- rules += " uic13";
21
+ rules += " uk151";
22
+ rules += " ucJ9TBTb151";
23
+ rules += " ud3Euai151";
24
+ rules += " uea151";
25
+ rules += " ugb151";
26
+ rules += " uhd151";
27
+ rules += " uje151";
28
+ rules += " u2NhKxcl151";
29
+ rules += " uic151";
30
30
  } else if (props.size === "md") {
31
- rules += " uk13";
32
- rules += " ucJ9TBTb13";
33
- rules += " ud3Euai13";
34
- rules += " uea13";
35
- rules += " ugb13";
36
- rules += " uhd13";
37
- rules += " uje13";
38
- rules += " u2NhKxcl13";
39
- rules += " uic13";
31
+ rules += " uk151";
32
+ rules += " ucJ9TBTb151";
33
+ rules += " ud3Euai151";
34
+ rules += " uea151";
35
+ rules += " ugb151";
36
+ rules += " uhd151";
37
+ rules += " uje151";
38
+ rules += " u2NhKxcl151";
39
+ rules += " uic151";
40
40
  } else if (props.size === "sm") {
41
- rules += " uk13";
42
- rules += " ucJ9TBTb13";
43
- rules += " ud3Euai13";
44
- rules += " uea13";
45
- rules += " ugb13";
46
- rules += " uhd13";
47
- rules += " uje13";
48
- rules += " u2NhKxcl13";
49
- rules += " uic13";
41
+ rules += " uk151";
42
+ rules += " ucJ9TBTb151";
43
+ rules += " ud3Euai151";
44
+ rules += " uea151";
45
+ rules += " ugb151";
46
+ rules += " uhd151";
47
+ rules += " uje151";
48
+ rules += " u2NhKxcl151";
49
+ rules += " uic151";
50
50
  }
51
51
  if (props.size === "xl") {
52
- rules += " -_6BNtrc-KaY1Ce13";
53
- rules += " vx13";
52
+ rules += " -_6BNtrc-KaY1Ce151";
53
+ rules += " vx151";
54
54
  } else if (props.size === "lg") {
55
- rules += " -_6BNtrc-f13";
56
- rules += " vx13";
55
+ rules += " -_6BNtrc-f151";
56
+ rules += " vx151";
57
57
  } else if (props.size === "md") {
58
- rules += " -_6BNtrc-d13";
59
- rules += " vx13";
58
+ rules += " -_6BNtrc-d151";
59
+ rules += " vx151";
60
60
  } else if (props.size === "sm") {
61
- rules += " -_6BNtrc-c13";
62
- rules += " vx13";
61
+ rules += " -_6BNtrc-c151";
62
+ rules += " vx151";
63
63
  }
64
- rules += " xf13";
65
- rules += " _xa13";
64
+ rules += " xf151";
65
+ rules += " _xa151";
66
66
  if (props.size === "xl") {
67
- rules += " _Fd13";
68
- rules += " _FnuYUweb13";
67
+ rules += " _Fd151";
68
+ rules += " _FnuYUweb151";
69
69
  } else if (props.size === "lg") {
70
- rules += " _Fd13";
71
- rules += " _FnuYUweb13";
70
+ rules += " _Fd151";
71
+ rules += " _FnuYUweb151";
72
72
  } else if (props.size === "md") {
73
- rules += " _Fd13";
74
- rules += " _FnuYUweb13";
73
+ rules += " _Fd151";
74
+ rules += " _FnuYUweb151";
75
75
  } else if (props.size === "sm") {
76
- rules += " _Fd13";
77
- rules += " _FnuYUweb13";
76
+ rules += " _Fd151";
77
+ rules += " _FnuYUweb151";
78
78
  }
79
- if (props.size === "xl") rules += " po13";
80
- else if (props.size === "lg") rules += " po13";
81
- else if (props.size === "md") rules += " po13";
82
- else if (props.size === "sm") rules += " po13";
79
+ if (props.size === "xl") rules += " po151";
80
+ else if (props.size === "lg") rules += " po151";
81
+ else if (props.size === "md") rules += " po151";
82
+ else if (props.size === "sm") rules += " po151";
83
83
  return rules;
84
84
  };
85
85
  const word = function anonymous(props) {
86
86
  let rules = " ";
87
- if (props.tone === "accent") rules += " pj1j4Pd13";
88
- else if (props.tone === "primary") rules += " pXDQpyb13";
87
+ if (props.tone === "accent") rules += " pH0v9Fe151";
88
+ else if (props.tone === "primary") rules += " pXDQpyb151";
89
89
  return rules;
90
90
  };
91
91
  function Logo(props) {
package/dist/Logo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Logo.js","names":[],"sources":["../src/custom/logo/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A clean two-word wordmark: the S2 title ramp sizes it; Silapse\n// colors paint it (primary + accent). `inverted` swaps which word takes accent.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LogoProps {\n firstWord?: string;\n secondWord?: string;\n size?: LogoSize;\n inverted?: boolean;\n class?: string;\n}\n\nconst wordmark = style<{ size: LogoSize }>({\n display: \"inline-flex\",\n alignItems: \"baseline\",\n columnGap: 8,\n whiteSpace: \"nowrap\",\n font: {\n size: {\n sm: \"title-sm\",\n md: \"title\",\n lg: \"title-xl\",\n xl: \"title-3xl\",\n },\n },\n fontWeight: \"black\",\n});\n\nconst word = style<{ tone: \"primary\" | \"accent\" }>({\n color: {\n tone: {\n primary: \"[var(--color-primary-100)]\",\n accent: \"[var(--color-accent)]\",\n },\n },\n});\n\nexport function Logo(props: LogoProps): JSX.Element {\n const firstWord = () => props.firstWord ?? \"Proyecto\";\n const secondWord = () => props.secondWord ?? \"Viviana\";\n const inverted = () => props.inverted ?? false;\n\n return (\n <span class={`${wordmark({ size: props.size ?? \"md\" })} ${props.class ?? \"\"}`}>\n <span class={word({ tone: inverted() ? \"accent\" : \"primary\" })}>{firstWord()}</span>\n <span class={word({ tone: inverted() ? \"primary\" : \"accent\" })}>{secondWord()}</span>\n </span>\n );\n}\n"],"mappings":";;;AAgBA,MAAM,WAAA,SAAA,UAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBN,MAAM,OAAA,SAAA,UAAA,OAAA;;;;;;AASN,SAAgB,KAAK,OAAuB;CAC1C,MAAM,kBAAkB,MAAM,aAAa;CAC3C,MAAM,mBAAmB,MAAM,cAAc;CAC7C,MAAM,iBAAiB,MAAM,YAAY;CAEzC,cAAA;EAAA,IAAA,OAAA,eAAA,MAAA,GAAA,QAAA,KAAA,YAAA,QAAA,MAAA;EAAA,OAAA,OAEqE,SAAA;EAAA,OAAA,OACA,UAAA;EAAA,QAAA,QAAA;GAAA,IAAA,MAFtD,GAAG,SAAS,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAA,EAAA,GAAM,MAAM,SAAS,MAAI,OAC9D,KAAK,EAAE,MAAM,SAAA,IAAa,WAAW,UAAU,CAAA,GAAA,OAC/C,KAAK,EAAE,MAAM,SAAA,IAAa,YAAY,SAAS,CAAA;GAAA,QAAA,IAAA,KAAA,UAAA,MAAA,IAAA,IAAA,GAAA;GAAA,SAAA,IAAA,KAAA,UAAA,OAAA,IAAA,IAAA,IAAA;GAAA,SAAA,IAAA,KAAA,UAAA,OAAA,IAAA,IAAA,IAAA;GAAA,OAAA;EAAA,GAAA;GAAA,GAAA,KAAA;GAAA,GAAA,KAAA;GAAA,GAAA,KAAA;EAAA,CAAA;EAAA,OAAA;CAAA,GAAA;AAGlE"}
1
+ {"version":3,"file":"Logo.js","names":[],"sources":["../src/custom/logo/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A clean two-word wordmark: the S2 title ramp sizes it; Silapse\n// colors paint it (primary + accent). `inverted` swaps which word takes accent.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LogoProps {\n firstWord?: string;\n secondWord?: string;\n size?: LogoSize;\n inverted?: boolean;\n class?: string;\n}\n\nconst wordmark = style<{ size: LogoSize }>({\n display: \"inline-flex\",\n alignItems: \"baseline\",\n columnGap: 8,\n whiteSpace: \"nowrap\",\n font: {\n size: {\n sm: \"title-sm\",\n md: \"title\",\n lg: \"title-xl\",\n xl: \"title-3xl\",\n },\n },\n fontWeight: \"black\",\n});\n\nconst word = style<{ tone: \"primary\" | \"accent\" }>({\n color: {\n tone: {\n primary: \"[var(--color-primary-100)]\",\n // `--color-accent` (#df5c9a) is the SAME non-flipping pink in both themes;\n // on the light `--color-bg-200` panel the wordmark reads only 1.89:1 (fails\n // even the 3:1 large-text floor the `black`-weight `title-xl` earns). No\n // single non-flipping shade clears a near-white AND a near-black panel, so\n // the accent word takes the *flipping* `--color-accent-500` (dark #d84a8f /\n // light #8a1e4a) → 3.86:1 dark / 4.91:1 light — clearing the large-text\n // floor in both themes while keeping the two-tone wordmark identity.\n accent: \"[var(--color-accent-500)]\",\n },\n },\n});\n\nexport function Logo(props: LogoProps): JSX.Element {\n const firstWord = () => props.firstWord ?? \"Proyecto\";\n const secondWord = () => props.secondWord ?? \"Viviana\";\n const inverted = () => props.inverted ?? false;\n\n return (\n <span class={`${wordmark({ size: props.size ?? \"md\" })} ${props.class ?? \"\"}`}>\n <span class={word({ tone: inverted() ? \"accent\" : \"primary\" })}>{firstWord()}</span>\n <span class={word({ tone: inverted() ? \"primary\" : \"accent\" })}>{secondWord()}</span>\n </span>\n );\n}\n"],"mappings":";;;AAgBA,MAAM,WAAA,SAAA,UAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBN,MAAM,OAAA,SAAA,UAAA,OAAA;;;;;;AAgBN,SAAgB,KAAK,OAAuB;CAC1C,MAAM,kBAAkB,MAAM,aAAa;CAC3C,MAAM,mBAAmB,MAAM,cAAc;CAC7C,MAAM,iBAAiB,MAAM,YAAY;CAEzC,cAAA;EAAA,IAAA,OAAA,eAAA,MAAA,GAAA,QAAA,KAAA,YAAA,QAAA,MAAA;EAAA,OAAA,OAEqE,SAAA;EAAA,OAAA,OACA,UAAA;EAAA,QAAA,QAAA;GAAA,IAAA,MAFtD,GAAG,SAAS,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAA,EAAA,GAAM,MAAM,SAAS,MAAI,OAC9D,KAAK,EAAE,MAAM,SAAA,IAAa,WAAW,UAAU,CAAA,GAAA,OAC/C,KAAK,EAAE,MAAM,SAAA,IAAa,YAAY,SAAS,CAAA;GAAA,QAAA,IAAA,KAAA,UAAA,MAAA,IAAA,IAAA,GAAA;GAAA,SAAA,IAAA,KAAA,UAAA,OAAA,IAAA,IAAA,IAAA;GAAA,SAAA,IAAA,KAAA,UAAA,OAAA,IAAA,IAAA,IAAA;GAAA,OAAA;EAAA,GAAA;GAAA,GAAA,KAAA;GAAA,GAAA,KAAA;GAAA,GAAA,KAAA;EAAA,CAAA;EAAA,OAAA;CAAA,GAAA;AAGlE"}
package/dist/Logo.jsx CHANGED
@@ -1,89 +1,89 @@
1
1
  //#region src/custom/logo/index.tsx
2
2
  const wordmark = function anonymous(props) {
3
3
  let rules = " ";
4
- rules += " sh13";
5
- rules += " ea13";
6
- rules += " qe13";
7
- rules += " _7c13";
4
+ rules += " sh151";
5
+ rules += " ea151";
6
+ rules += " qe151";
7
+ rules += " _7c151";
8
8
  if (props.size === "xl") {
9
- rules += " uk13";
10
- rules += " ucJ9TBTb13";
11
- rules += " ud3Euai13";
12
- rules += " uea13";
13
- rules += " ugb13";
14
- rules += " uhd13";
15
- rules += " uje13";
16
- rules += " u2NhKxcl13";
17
- rules += " uic13";
9
+ rules += " uk151";
10
+ rules += " ucJ9TBTb151";
11
+ rules += " ud3Euai151";
12
+ rules += " uea151";
13
+ rules += " ugb151";
14
+ rules += " uhd151";
15
+ rules += " uje151";
16
+ rules += " u2NhKxcl151";
17
+ rules += " uic151";
18
18
  } else if (props.size === "lg") {
19
- rules += " uk13";
20
- rules += " ucJ9TBTb13";
21
- rules += " ud3Euai13";
22
- rules += " uea13";
23
- rules += " ugb13";
24
- rules += " uhd13";
25
- rules += " uje13";
26
- rules += " u2NhKxcl13";
27
- rules += " uic13";
19
+ rules += " uk151";
20
+ rules += " ucJ9TBTb151";
21
+ rules += " ud3Euai151";
22
+ rules += " uea151";
23
+ rules += " ugb151";
24
+ rules += " uhd151";
25
+ rules += " uje151";
26
+ rules += " u2NhKxcl151";
27
+ rules += " uic151";
28
28
  } else if (props.size === "md") {
29
- rules += " uk13";
30
- rules += " ucJ9TBTb13";
31
- rules += " ud3Euai13";
32
- rules += " uea13";
33
- rules += " ugb13";
34
- rules += " uhd13";
35
- rules += " uje13";
36
- rules += " u2NhKxcl13";
37
- rules += " uic13";
29
+ rules += " uk151";
30
+ rules += " ucJ9TBTb151";
31
+ rules += " ud3Euai151";
32
+ rules += " uea151";
33
+ rules += " ugb151";
34
+ rules += " uhd151";
35
+ rules += " uje151";
36
+ rules += " u2NhKxcl151";
37
+ rules += " uic151";
38
38
  } else if (props.size === "sm") {
39
- rules += " uk13";
40
- rules += " ucJ9TBTb13";
41
- rules += " ud3Euai13";
42
- rules += " uea13";
43
- rules += " ugb13";
44
- rules += " uhd13";
45
- rules += " uje13";
46
- rules += " u2NhKxcl13";
47
- rules += " uic13";
39
+ rules += " uk151";
40
+ rules += " ucJ9TBTb151";
41
+ rules += " ud3Euai151";
42
+ rules += " uea151";
43
+ rules += " ugb151";
44
+ rules += " uhd151";
45
+ rules += " uje151";
46
+ rules += " u2NhKxcl151";
47
+ rules += " uic151";
48
48
  }
49
49
  if (props.size === "xl") {
50
- rules += " -_6BNtrc-KaY1Ce13";
51
- rules += " vx13";
50
+ rules += " -_6BNtrc-KaY1Ce151";
51
+ rules += " vx151";
52
52
  } else if (props.size === "lg") {
53
- rules += " -_6BNtrc-f13";
54
- rules += " vx13";
53
+ rules += " -_6BNtrc-f151";
54
+ rules += " vx151";
55
55
  } else if (props.size === "md") {
56
- rules += " -_6BNtrc-d13";
57
- rules += " vx13";
56
+ rules += " -_6BNtrc-d151";
57
+ rules += " vx151";
58
58
  } else if (props.size === "sm") {
59
- rules += " -_6BNtrc-c13";
60
- rules += " vx13";
59
+ rules += " -_6BNtrc-c151";
60
+ rules += " vx151";
61
61
  }
62
- rules += " xf13";
63
- rules += " _xa13";
62
+ rules += " xf151";
63
+ rules += " _xa151";
64
64
  if (props.size === "xl") {
65
- rules += " _Fd13";
66
- rules += " _FnuYUweb13";
65
+ rules += " _Fd151";
66
+ rules += " _FnuYUweb151";
67
67
  } else if (props.size === "lg") {
68
- rules += " _Fd13";
69
- rules += " _FnuYUweb13";
68
+ rules += " _Fd151";
69
+ rules += " _FnuYUweb151";
70
70
  } else if (props.size === "md") {
71
- rules += " _Fd13";
72
- rules += " _FnuYUweb13";
71
+ rules += " _Fd151";
72
+ rules += " _FnuYUweb151";
73
73
  } else if (props.size === "sm") {
74
- rules += " _Fd13";
75
- rules += " _FnuYUweb13";
74
+ rules += " _Fd151";
75
+ rules += " _FnuYUweb151";
76
76
  }
77
- if (props.size === "xl") rules += " po13";
78
- else if (props.size === "lg") rules += " po13";
79
- else if (props.size === "md") rules += " po13";
80
- else if (props.size === "sm") rules += " po13";
77
+ if (props.size === "xl") rules += " po151";
78
+ else if (props.size === "lg") rules += " po151";
79
+ else if (props.size === "md") rules += " po151";
80
+ else if (props.size === "sm") rules += " po151";
81
81
  return rules;
82
82
  };
83
83
  const word = function anonymous(props) {
84
84
  let rules = " ";
85
- if (props.tone === "accent") rules += " pj1j4Pd13";
86
- else if (props.tone === "primary") rules += " pXDQpyb13";
85
+ if (props.tone === "accent") rules += " pH0v9Fe151";
86
+ else if (props.tone === "primary") rules += " pXDQpyb151";
87
87
  return rules;
88
88
  };
89
89
  function Logo(props) {
package/dist/Logo.jsx.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Logo.jsx","names":[],"sources":["../src/custom/logo/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A clean two-word wordmark: the S2 title ramp sizes it; Silapse\n// colors paint it (primary + accent). `inverted` swaps which word takes accent.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LogoProps {\n firstWord?: string;\n secondWord?: string;\n size?: LogoSize;\n inverted?: boolean;\n class?: string;\n}\n\nconst wordmark = style<{ size: LogoSize }>({\n display: \"inline-flex\",\n alignItems: \"baseline\",\n columnGap: 8,\n whiteSpace: \"nowrap\",\n font: {\n size: {\n sm: \"title-sm\",\n md: \"title\",\n lg: \"title-xl\",\n xl: \"title-3xl\",\n },\n },\n fontWeight: \"black\",\n});\n\nconst word = style<{ tone: \"primary\" | \"accent\" }>({\n color: {\n tone: {\n primary: \"[var(--color-primary-100)]\",\n accent: \"[var(--color-accent)]\",\n },\n },\n});\n\nexport function Logo(props: LogoProps): JSX.Element {\n const firstWord = () => props.firstWord ?? \"Proyecto\";\n const secondWord = () => props.secondWord ?? \"Viviana\";\n const inverted = () => props.inverted ?? false;\n\n return (\n <span class={`${wordmark({ size: props.size ?? \"md\" })} ${props.class ?? \"\"}`}>\n <span class={word({ tone: inverted() ? \"accent\" : \"primary\" })}>{firstWord()}</span>\n <span class={word({ tone: inverted() ? \"primary\" : \"accent\" })}>{secondWord()}</span>\n </span>\n );\n}\n"],"mappings":";AAgBA,MAAM,WAAA,SAAA,UAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBN,MAAM,OAAA,SAAA,UAAA,OAAA;;;;;;AASN,SAAgB,KAAK,OAAuB;CAC1C,MAAM,kBAAkB,MAAM,aAAa;CAC3C,MAAM,mBAAmB,MAAM,cAAc;CAC7C,MAAM,iBAAiB,MAAM,YAAY;CAEzC,OAAO,CACJ,KAAK,OAAO,GAAG,SAAS,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAA,EAAG,GAAG,MAAM,SAAS,MAAM;MAC7E,CAAC,KAAK,OAAO,KAAK,EAAE,MAAM,SAAA,IAAa,WAAW,UAAU,CAAA,IAAK,UAAA,EAAA,EAAc,KAAK;MACpF,CAAC,KAAK,OAAO,KAAK,EAAE,MAAM,SAAA,IAAa,YAAY,SAAS,CAAA,IAAK,WAAA,EAAA,EAAe,KAAK;IACvF,EAAE;AAEN"}
1
+ {"version":3,"file":"Logo.jsx","names":[],"sources":["../src/custom/logo/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A clean two-word wordmark: the S2 title ramp sizes it; Silapse\n// colors paint it (primary + accent). `inverted` swaps which word takes accent.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport type LogoSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LogoProps {\n firstWord?: string;\n secondWord?: string;\n size?: LogoSize;\n inverted?: boolean;\n class?: string;\n}\n\nconst wordmark = style<{ size: LogoSize }>({\n display: \"inline-flex\",\n alignItems: \"baseline\",\n columnGap: 8,\n whiteSpace: \"nowrap\",\n font: {\n size: {\n sm: \"title-sm\",\n md: \"title\",\n lg: \"title-xl\",\n xl: \"title-3xl\",\n },\n },\n fontWeight: \"black\",\n});\n\nconst word = style<{ tone: \"primary\" | \"accent\" }>({\n color: {\n tone: {\n primary: \"[var(--color-primary-100)]\",\n // `--color-accent` (#df5c9a) is the SAME non-flipping pink in both themes;\n // on the light `--color-bg-200` panel the wordmark reads only 1.89:1 (fails\n // even the 3:1 large-text floor the `black`-weight `title-xl` earns). No\n // single non-flipping shade clears a near-white AND a near-black panel, so\n // the accent word takes the *flipping* `--color-accent-500` (dark #d84a8f /\n // light #8a1e4a) → 3.86:1 dark / 4.91:1 light — clearing the large-text\n // floor in both themes while keeping the two-tone wordmark identity.\n accent: \"[var(--color-accent-500)]\",\n },\n },\n});\n\nexport function Logo(props: LogoProps): JSX.Element {\n const firstWord = () => props.firstWord ?? \"Proyecto\";\n const secondWord = () => props.secondWord ?? \"Viviana\";\n const inverted = () => props.inverted ?? false;\n\n return (\n <span class={`${wordmark({ size: props.size ?? \"md\" })} ${props.class ?? \"\"}`}>\n <span class={word({ tone: inverted() ? \"accent\" : \"primary\" })}>{firstWord()}</span>\n <span class={word({ tone: inverted() ? \"primary\" : \"accent\" })}>{secondWord()}</span>\n </span>\n );\n}\n"],"mappings":";AAgBA,MAAM,WAAA,SAAA,UAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBN,MAAM,OAAA,SAAA,UAAA,OAAA;;;;;;AAgBN,SAAgB,KAAK,OAAuB;CAC1C,MAAM,kBAAkB,MAAM,aAAa;CAC3C,MAAM,mBAAmB,MAAM,cAAc;CAC7C,MAAM,iBAAiB,MAAM,YAAY;CAEzC,OAAO,CACJ,KAAK,OAAO,GAAG,SAAS,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAA,EAAG,GAAG,MAAM,SAAS,MAAM;MAC7E,CAAC,KAAK,OAAO,KAAK,EAAE,MAAM,SAAA,IAAa,WAAW,UAAU,CAAA,IAAK,UAAA,EAAA,EAAc,KAAK;MACpF,CAAC,KAAK,OAAO,KAAK,EAAE,MAAM,SAAA,IAAa,YAAY,SAAS,CAAA,IAAK,WAAA,EAAA,EAAe,KAAK;IACvF,EAAE;AAEN"}
@@ -4,13 +4,13 @@ import { splitProps } from "solid-js";
4
4
  var _tmpl$ = /*#__PURE__*/ template(`<div>`);
5
5
  const page = function anonymous(props) {
6
6
  let rules = " ";
7
- rules += " sd13";
8
- rules += " _ta13";
9
- rules += " Mc13";
10
- rules += " Za13";
11
- rules += " g318zje13";
12
- rules += " pO550xe13";
13
- if (props.isWithHeader) rules += " Tr13";
7
+ rules += " sd151";
8
+ rules += " _ta151";
9
+ rules += " Mc151";
10
+ rules += " Za151";
11
+ rules += " g318zje151";
12
+ rules += " pO550xe151";
13
+ if (props.isWithHeader) rules += " Tr151";
14
14
  return rules;
15
15
  };
16
16
  function PageLayout(props) {
@@ -2,13 +2,13 @@ import { splitProps } from "solid-js";
2
2
  //#region src/custom/page-layout/index.tsx
3
3
  const page = function anonymous(props) {
4
4
  let rules = " ";
5
- rules += " sd13";
6
- rules += " _ta13";
7
- rules += " Mc13";
8
- rules += " Za13";
9
- rules += " g318zje13";
10
- rules += " pO550xe13";
11
- if (props.isWithHeader) rules += " Tr13";
5
+ rules += " sd151";
6
+ rules += " _ta151";
7
+ rules += " Mc151";
8
+ rules += " Za151";
9
+ rules += " g318zje151";
10
+ rules += " pO550xe151";
11
+ if (props.isWithHeader) rules += " Tr151";
12
12
  return rules;
13
13
  };
14
14
  function PageLayout(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.jsx","names":[],"sources":["../src/custom/page-layout/index.tsx"],"sourcesContent":["import { type JSX, splitProps } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A full-height page shell painted in Silapse surface/text\n// colors; `withHeader` reserves top space so a fixed header doesn't overlap.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface PageLayoutProps extends JSX.HTMLAttributes<HTMLDivElement> {\n children: JSX.Element;\n withHeader?: boolean;\n}\n\nconst page = style<{ isWithHeader: boolean }>({\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"screen\",\n width: \"full\",\n backgroundColor: \"[var(--color-background)]\",\n color: \"[var(--color-text)]\",\n paddingTop: { isWithHeader: 64 },\n});\n\nexport function PageLayout(props: PageLayoutProps) {\n const [local, rest] = splitProps(props, [\"class\", \"withHeader\"]);\n\n return (\n <div\n class={`${page({ isWithHeader: local.withHeader ?? false })} ${local.class ?? \"\"}`}\n {...rest}\n >\n {props.children}\n </div>\n );\n}\n"],"mappings":";;AAWA,MAAM,OAAA,SAAA,UAAA,OAAA;;;;;;;;;;;AAUN,SAAgB,WAAW,OAAsB;CAC/C,MAAM,CAAC,OAAO,QAAQ,WAAW,OAAO,CAAC,SAAS,YAAA,CAAa;CAE/D,OAAO,CACJ,IACC,OAAO,GAAG,KAAK,EAAE,cAAc,MAAM,cAAc,MAAM,CAAA,EAAG,GAAG,MAAM,SAAS,UAC1E,MACL;OACE,MAAM,SAAS;IAClB,EAAE;AAEN"}
1
+ {"version":3,"file":"PageLayout.jsx","names":[],"sources":["../src/custom/page-layout/index.tsx"],"sourcesContent":["import { type JSX, splitProps } from \"solid-js\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). A full-height page shell painted in Silapse surface/text\n// colors; `withHeader` reserves top space so a fixed header doesn't overlap.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface PageLayoutProps extends JSX.HTMLAttributes<HTMLDivElement> {\n children: JSX.Element;\n withHeader?: boolean;\n}\n\nconst page = style<{ isWithHeader: boolean }>({\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"screen\",\n width: \"full\",\n backgroundColor: \"[var(--color-background)]\",\n color: \"[var(--color-text)]\",\n paddingTop: { isWithHeader: 64 },\n});\n\nexport function PageLayout(props: PageLayoutProps) {\n const [local, rest] = splitProps(props, [\"class\", \"withHeader\"]);\n\n return (\n <div\n class={`${page({ isWithHeader: local.withHeader ?? false })} ${local.class ?? \"\"}`}\n {...rest}\n >\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;CAWA,IAAA,QAAM;;;;;;;;;;;CAUN,MAAA,CAAA,OAAgB,QAAW,WAAsB,OAAA,CAAA,SAAA,YAAA,CAAA;CAC/C,OAAO,CAAA,IAAA,OAAO,GAAQ,KAAA,EAAA,cAAmB,MAAA,cAAsB,MAAA,CAAA,EAAA,GAAA,MAAA,SAAA,UAAA,MAAA;OAE/D,MAEI,SAAO"}
@@ -1,12 +1,11 @@
1
1
  /* empty css */
2
2
  /* empty css */
3
- /* empty css */
4
3
  import { Avatar } from "@proyecto-viviana/solid-spectrum";
5
4
  import { className, createComponent, effect, getNextElement, getNextMarker, insert, memo, template } from "solid-js/web";
6
5
  import { Show } from "solid-js";
7
6
  //#region src/custom/profile-card/index.tsx
8
- var _tmpl$ = /*#__PURE__*/ template(`<p class=" uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13">`), _tmpl$2 = /*#__PURE__*/ template(`<span><span class=" xd13 _xa13 xX0cczbc13 _xX0cczba13 pXDQpyb13"></span> seguidores`), _tmpl$3 = /*#__PURE__*/ template(`<span><span class=" xd13 _xa13 xX0cczbc13 _xX0cczba13 pXDQpyb13"></span> siguiendo`), _tmpl$4 = /*#__PURE__*/ template(`<div class=" sd13 Ue13 qe13">`), _tmpl$5 = /*#__PURE__*/ template(`<div><div class=" sd13 ed13 Ul13 ql13"><!$><!/><div class=" sd13 _ta13 Ub13 qb13 _ub13 Na13"><h3 class=" uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-f13 vx13 xe13 _xa13 xX0cczbd13 _xX0cczba13 xfe13 _xfa13 xfX0cczbd13 _xfX0cczba13 _Fd13 _FnuYUweb13 pXDQpyb13 _Nc13 Pc13 _Yb13 _7c13"></h3><!$><!/><div class=" sd13 Ul13 ql13 uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13"><!$><!/><!$><!/></div></div></div><!$><!/>`);
9
- const card = " sd13 _ta13 Ul13 ql13 Tf13 Qf13 Sf13 Rf13 oc13 nc13 kc13 jc13 gDE5VE13 _nLeasBb13";
7
+ var _tmpl$ = /*#__PURE__*/ template(`<p class=" uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151">`), _tmpl$2 = /*#__PURE__*/ template(`<span><span class=" xd151 _xa151 xX0cczbc151 _xX0cczba151 pXDQpyb151"></span> seguidores`), _tmpl$3 = /*#__PURE__*/ template(`<span><span class=" xd151 _xa151 xX0cczbc151 _xX0cczba151 pXDQpyb151"></span> siguiendo`), _tmpl$4 = /*#__PURE__*/ template(`<div class=" sd151 Ue151 qe151">`), _tmpl$5 = /*#__PURE__*/ template(`<div><div class=" sd151 ed151 Ul151 ql151"><!$><!/><div class=" sd151 _ta151 Ub151 qb151 _ub151 Na151"><h3 class=" uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-f151 vx151 xe151 _xa151 xX0cczbd151 _xX0cczba151 xfe151 _xfa151 xfX0cczbd151 _xfX0cczba151 _Fd151 _FnuYUweb151 pXDQpyb151 _Nc151 Pc151 _Yb151 _7c151"></h3><!$><!/><div class=" sd151 Ul151 ql151 uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151"><!$><!/><!$><!/></div></div></div><!$><!/>`);
8
+ const card = " sd151 _ta151 Ul151 ql151 Tf151 Qf151 Sf151 Rf151 oc151 nc151 kc151 jc151 gDE5VE151 _nLeasBb151";
10
9
  function ProfileCard(props) {
11
10
  const formatNumber = (num) => {
12
11
  if (num >= 1e6) return `${(num / 1e6).toFixed(1)}M`;
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileCard.js","names":[],"sources":["../src/custom/profile-card/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { Show } from \"solid-js\";\nimport { Avatar } from \"@proyecto-viviana/solid-spectrum\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). Mirrors S2's UserCard shape (avatar + title/description +\n// footer actions) on the S2 spacing/radius/elevation ramps, in Silapse colors.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface ProfileCardProps {\n username: string;\n avatar?: string;\n bio?: string;\n followers?: number;\n following?: number;\n /**\n * Actions to display below the profile.\n * Use a function returning JSX for SSR compatibility: `actions={() => <Button>...</Button>}`\n */\n actions?: JSX.Element | (() => JSX.Element);\n class?: string;\n}\n\nconst card = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\n borderRadius: \"lg\",\n backgroundColor: \"[var(--color-bg-200)]\",\n boxShadow: \"elevated\",\n});\n\nconst head = style({\n display: \"flex\",\n alignItems: \"start\",\n gap: 16,\n});\n\nconst info = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n flexGrow: 1,\n minWidth: 0,\n});\n\nconst name = style({\n font: \"heading-sm\",\n color: \"[var(--color-primary-100)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nconst bio = style({\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n});\n\nconst stats = style({\n display: \"flex\",\n gap: 16,\n font: \"ui-sm\",\n color: \"[var(--color-text-secondary)]\",\n});\n\nconst statValue = style({\n fontWeight: \"bold\",\n color: \"[var(--color-primary-100)]\",\n});\n\nconst actionRow = style({\n display: \"flex\",\n gap: 8,\n});\n\nexport function ProfileCard(props: ProfileCardProps) {\n const formatNumber = (num: number) => {\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n return num.toString();\n };\n\n return (\n <div class={`${card} ${props.class ?? \"\"}`}>\n <div class={head}>\n <Avatar src={props.avatar} alt={props.username} size=\"lg\" />\n <div class={info}>\n <h3 class={name}>{props.username}</h3>\n <Show when={props.bio}>\n <p class={bio}>{props.bio}</p>\n </Show>\n <div class={stats}>\n <Show when={props.followers !== undefined}>\n <span>\n <span class={statValue}>{formatNumber(props.followers!)}</span> seguidores\n </span>\n </Show>\n <Show when={props.following !== undefined}>\n <span>\n <span class={statValue}>{formatNumber(props.following!)}</span> siguiendo\n </span>\n </Show>\n </div>\n </div>\n </div>\n <Show when={props.actions}>\n <div class={actionRow}>\n {typeof props.actions === \"function\" ? props.actions() : props.actions}\n </div>\n </Show>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAsBA,MAAM,OAAA;AAsDN,SAAgB,YAAY,OAAuB;CACjD,MAAM,gBAAgB,QAAW;EAC/B,IAAI,OAAO,KAAS,OAAO,IAAI,MAAM,KAAS,QAAQ,CAAA,EAAA;EACtD,IAAI,OAAO,KAAM,OAAO,IAAI,MAAM,KAAM,QAAQ,CAAA,EAAA;EAChD,OAAO,IAAI,SAAQ;CACrB;CAEA,cAAA;EAAA,IAAA,OAAA,eAAA,OAAA,GAAA,QAAA,KAAA,YAAA,SAAA,MAAA,YAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,QAAA,OAAA,aAAA,QAAA,MAAA,YAAA,SAAA,MAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,QAAA,OAAA,aAAA,QAAA,MAAA,YAAA,CAAA,QAAA,QAAA,cAAA,MAAA,WAAA,GAAA,SAAA,OAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,SAAA,MAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA;EAAA,OAAA,OAAA,gBAGO,QAAA;GAAA,IAAO,MAAA;IAAA,OAAK,MAAM;GAAM;GAAA,IAAE,MAAA;IAAA,OAAK,MAAM;GAAQ;GAAE,MAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,aAE5B,MAAM,QAAQ;EAAA,OAAA,OAAA,gBAC/B,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM;GAAG;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,MAAA;IAAA,OAAA,aACH,MAAM,GAAG;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,OAAA,gBAGxB,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM,cAAc,KAAA;GAAA;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,OAAA,GAAA,QAAA,MAAA;IAAA,OAAA,aAEH,aAAa,MAAM,SAAS,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,IAAA;EAAA,OAAA,OAAA,gBAGxD,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM,cAAc,KAAA;GAAA;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,OAAA,GAAA,QAAA,MAAA;IAAA,OAAA,aAEH,aAAa,MAAM,SAAS,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,MAAA,gBAM9D,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM;GAAO;GAAA,IAAA,WAAA;IAAA,IAAA,SAAA,eAAA,OAAA;IAAA,OAAA,eAAA;KAAA,IAAA,MAAA,WAEpB,OAAO,MAAM,YAAY,UAAA;KAAA,aAAzB,IAAA,IAAsC,MAAM,QAAO,IAAK,MAAM;IAAO,GAAA,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,aAAA,UAAA,MAxBhE,GAAG,KAAA,GAAQ,MAAM,SAAS,IAAI,CAAA;EAAA,OAAA;CAAA,GAAA;AA6B9C"}
1
+ {"version":3,"file":"ProfileCard.js","names":[],"sources":["../src/custom/profile-card/index.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { Show } from \"solid-js\";\nimport { Avatar } from \"@proyecto-viviana/solid-spectrum\";\n// Styled via the S2 style() macro through viviana's own seam (../../style →\n// src/style.ts). Mirrors S2's UserCard shape (avatar + title/description +\n// footer actions) on the S2 spacing/radius/elevation ramps, in Silapse colors.\nimport { style } from \"../../style\" with { type: \"macro\" };\n\nexport interface ProfileCardProps {\n username: string;\n avatar?: string;\n bio?: string;\n followers?: number;\n following?: number;\n /**\n * Actions to display below the profile.\n * Use a function returning JSX for SSR compatibility: `actions={() => <Button>...</Button>}`\n */\n actions?: JSX.Element | (() => JSX.Element);\n class?: string;\n}\n\nconst card = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\n borderRadius: \"lg\",\n backgroundColor: \"[var(--color-bg-200)]\",\n boxShadow: \"elevated\",\n});\n\nconst head = style({\n display: \"flex\",\n alignItems: \"start\",\n gap: 16,\n});\n\nconst info = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n flexGrow: 1,\n minWidth: 0,\n});\n\nconst name = style({\n font: \"heading-sm\",\n color: \"[var(--color-primary-100)]\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n});\n\nconst bio = style({\n font: \"ui-sm\",\n // WCAG AA fix: the bio is small text (`ui-sm`) on the `--color-bg-200` card, so\n // the 4.5:1 floor applies. `--color-text-secondary` read only 3.84:1 on the\n // light-blue card (5.86:1 dark); `--color-text` flips and clears 4.5:1 both\n // ways (15.33:1 dark / 7.53:1 light). The bio stays visually secondary to the\n // `heading-sm` name through its smaller size, not a sub-AA color.\n color: \"[var(--color-text)]\",\n});\n\nconst stats = style({\n display: \"flex\",\n gap: 16,\n font: \"ui-sm\",\n // WCAG AA fix: the stat connector words (\"seguidores\" / \"siguiendo\") share the\n // bio's 3.84:1-light failure on the `--color-bg-200` card and take the same\n // flipping `--color-text`. (The stat VALUES are `--color-primary-100`, which\n // already clears AA — 13.47:1 dark / 10.37:1 light.)\n color: \"[var(--color-text)]\",\n});\n\nconst statValue = style({\n fontWeight: \"bold\",\n color: \"[var(--color-primary-100)]\",\n});\n\nconst actionRow = style({\n display: \"flex\",\n gap: 8,\n});\n\nexport function ProfileCard(props: ProfileCardProps) {\n const formatNumber = (num: number) => {\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n return num.toString();\n };\n\n return (\n <div class={`${card} ${props.class ?? \"\"}`}>\n <div class={head}>\n <Avatar src={props.avatar} alt={props.username} size=\"lg\" />\n <div class={info}>\n <h3 class={name}>{props.username}</h3>\n <Show when={props.bio}>\n <p class={bio}>{props.bio}</p>\n </Show>\n <div class={stats}>\n <Show when={props.followers !== undefined}>\n <span>\n <span class={statValue}>{formatNumber(props.followers!)}</span> seguidores\n </span>\n </Show>\n <Show when={props.following !== undefined}>\n <span>\n <span class={statValue}>{formatNumber(props.following!)}</span> siguiendo\n </span>\n </Show>\n </div>\n </div>\n </div>\n <Show when={props.actions}>\n <div class={actionRow}>\n {typeof props.actions === \"function\" ? props.actions() : props.actions}\n </div>\n </Show>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAsBA,MAAM,OAAA;AA+DN,SAAgB,YAAY,OAAuB;CACjD,MAAM,gBAAgB,QAAW;EAC/B,IAAI,OAAO,KAAS,OAAO,IAAI,MAAM,KAAS,QAAQ,CAAA,EAAA;EACtD,IAAI,OAAO,KAAM,OAAO,IAAI,MAAM,KAAM,QAAQ,CAAA,EAAA;EAChD,OAAO,IAAI,SAAQ;CACrB;CAEA,cAAA;EAAA,IAAA,OAAA,eAAA,OAAA,GAAA,QAAA,KAAA,YAAA,SAAA,MAAA,YAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,QAAA,OAAA,aAAA,QAAA,MAAA,YAAA,SAAA,MAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,QAAA,OAAA,aAAA,QAAA,MAAA,YAAA,CAAA,QAAA,QAAA,cAAA,MAAA,WAAA,GAAA,SAAA,OAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA,GAAA,SAAA,MAAA,aAAA,CAAA,QAAA,SAAA,cAAA,OAAA,WAAA;EAAA,OAAA,OAAA,gBAGO,QAAA;GAAA,IAAO,MAAA;IAAA,OAAK,MAAM;GAAM;GAAA,IAAE,MAAA;IAAA,OAAK,MAAM;GAAQ;GAAE,MAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,aAE5B,MAAM,QAAQ;EAAA,OAAA,OAAA,gBAC/B,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM;GAAG;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,MAAA;IAAA,OAAA,aACH,MAAM,GAAG;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,OAAA,gBAGxB,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM,cAAc,KAAA;GAAA;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,OAAA,GAAA,QAAA,MAAA;IAAA,OAAA,aAEH,aAAa,MAAM,SAAS,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,IAAA;EAAA,OAAA,OAAA,gBAGxD,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM,cAAc,KAAA;GAAA;GAAA,IAAA,WAAA;IAAA,IAAA,QAAA,eAAA,OAAA,GAAA,QAAA,MAAA;IAAA,OAAA,aAEH,aAAa,MAAM,SAAS,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,OAAA,MAAA,gBAM9D,MAAA;GAAA,IAAK,OAAA;IAAA,OAAM,MAAM;GAAO;GAAA,IAAA,WAAA;IAAA,IAAA,SAAA,eAAA,OAAA;IAAA,OAAA,eAAA;KAAA,IAAA,MAAA,WAEpB,OAAO,MAAM,YAAY,UAAA;KAAA,aAAzB,IAAA,IAAsC,MAAM,QAAO,IAAK,MAAM;IAAO,GAAA,CAAA;IAAA,OAAA;GAAA;EAAA,CAAA,GAAA,QAAA,KAAA;EAAA,aAAA,UAAA,MAxBhE,GAAG,KAAA,GAAQ,MAAM,SAAS,IAAI,CAAA;EAAA,OAAA;CAAA,GAAA;AA6B9C"}
@@ -1,17 +1,16 @@
1
1
  /* empty css */
2
2
  /* empty css */
3
- /* empty css */
4
3
  import { Avatar } from "@proyecto-viviana/solid-spectrum";
5
4
  import { Show } from "solid-js";
6
5
  //#region src/custom/profile-card/index.tsx
7
- const card = " sd13 _ta13 Ul13 ql13 Tf13 Qf13 Sf13 Rf13 oc13 nc13 kc13 jc13 gDE5VE13 _nLeasBb13";
8
- const head = " sd13 ed13 Ul13 ql13";
9
- const info = " sd13 _ta13 Ub13 qb13 _ub13 Na13";
10
- const name = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-f13 vx13 xe13 _xa13 xX0cczbd13 _xX0cczba13 xfe13 _xfa13 xfX0cczbd13 _xfX0cczba13 _Fd13 _FnuYUweb13 pXDQpyb13 _Nc13 Pc13 _Yb13 _7c13";
11
- const bio = " uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13";
12
- const stats = " sd13 Ul13 ql13 uk13 ucJ9TBTb13 ud3Euai13 uea13 ugb13 uhd13 uje13 u2NhKxcl13 uic13 -_6BNtrc-b13 vx13 xb13 _xa13 _Fd13 _FnuYUweb13 pxeCuqc13";
13
- const statValue = " xd13 _xa13 xX0cczbc13 _xX0cczba13 pXDQpyb13";
14
- const actionRow = " sd13 Ue13 qe13";
6
+ const card = " sd151 _ta151 Ul151 ql151 Tf151 Qf151 Sf151 Rf151 oc151 nc151 kc151 jc151 gDE5VE151 _nLeasBb151";
7
+ const head = " sd151 ed151 Ul151 ql151";
8
+ const info = " sd151 _ta151 Ub151 qb151 _ub151 Na151";
9
+ const name = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-f151 vx151 xe151 _xa151 xX0cczbd151 _xX0cczba151 xfe151 _xfa151 xfX0cczbd151 _xfX0cczba151 _Fd151 _FnuYUweb151 pXDQpyb151 _Nc151 Pc151 _Yb151 _7c151";
10
+ const bio = " uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151";
11
+ const stats = " sd151 Ul151 ql151 uk151 ucJ9TBTb151 ud3Euai151 uea151 ugb151 uhd151 uje151 u2NhKxcl151 uic151 -_6BNtrc-b151 vx151 xb151 _xa151 _Fd151 _FnuYUweb151 pO550xe151";
12
+ const statValue = " xd151 _xa151 xX0cczbc151 _xX0cczba151 pXDQpyb151";
13
+ const actionRow = " sd151 Ue151 qe151";
15
14
  function ProfileCard(props) {
16
15
  const formatNumber = (num) => {
17
16
  if (num >= 1e6) return `${(num / 1e6).toFixed(1)}M`;