@slyxup/ui 0.2.7 → 0.2.8

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 (34) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/README.md +4 -1
  3. package/dist/components/SignIn/SignIn.d.ts.map +1 -1
  4. package/dist/components/SignIn/SignIn.js +2 -1
  5. package/dist/components/SignIn/SignIn.js.map +1 -1
  6. package/dist/components/SignUp/SignUp.d.ts.map +1 -1
  7. package/dist/components/SignUp/SignUp.js +2 -1
  8. package/dist/components/SignUp/SignUp.js.map +1 -1
  9. package/dist/components/SocialButtons/SocialButtons.d.ts.map +1 -1
  10. package/dist/components/SocialButtons/SocialButtons.js +2 -1
  11. package/dist/components/SocialButtons/SocialButtons.js.map +1 -1
  12. package/dist/components/UserButton/UserButton.d.ts +5 -1
  13. package/dist/components/UserButton/UserButton.d.ts.map +1 -1
  14. package/dist/components/UserButton/UserButton.js +6 -2
  15. package/dist/components/UserButton/UserButton.js.map +1 -1
  16. package/dist/components/UserProfile/UserProfile.d.ts.map +1 -1
  17. package/dist/components/UserProfile/UserProfile.js +80 -18
  18. package/dist/components/UserProfile/UserProfile.js.map +1 -1
  19. package/dist/index.d.ts +3 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +3 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/styles.d.ts +1 -1
  24. package/dist/styles.d.ts.map +1 -1
  25. package/dist/styles.js +163 -0
  26. package/dist/styles.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/components/SignIn/SignIn.tsx +2 -1
  29. package/src/components/SignUp/SignUp.tsx +2 -1
  30. package/src/components/SocialButtons/SocialButtons.tsx +2 -1
  31. package/src/components/UserButton/UserButton.tsx +12 -2
  32. package/src/components/UserProfile/UserProfile.tsx +204 -13
  33. package/src/index.ts +12 -1
  34. package/src/styles.ts +163 -0
package/dist/styles.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * CSS variables on :root or .slyxup-scope.
5
5
  */
6
6
  export declare const FONT_LINK = "<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\"><link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin><link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Space+Grotesk:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">";
7
- export declare const CSS = "\n@import url('https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Space+Grotesk:wght@400;500;600;700&display=swap');\n\n.slyxup-root {\n /* \u2500\u2500 Tokens \u2500\u2500 */\n --slx-accent: #5b5bd6;\n --slx-accent-hover: #4c4cc4;\n --slx-accent-soft: rgba(91, 91, 214, 0.12);\n --slx-bg: #ffffff;\n --slx-bg-subtle: #f7f7fb;\n --slx-bg-page: #e9eaf6;\n --slx-ink: #16161d;\n --slx-ink-strong: #0c0c12;\n --slx-muted: #6f6f7b;\n --slx-border: #e3e3ee;\n --slx-border-strong: #d3d3e2;\n --slx-danger: #d64550;\n --slx-success: #1f9d55;\n --slx-radius-sm: 8px;\n --slx-radius: 10px;\n --slx-radius-lg: 14px;\n --slx-font: \"DM Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n --slx-display: \"Space Grotesk\", \"DM Sans\", sans-serif;\n --slx-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --slx-shadow-card:\n 0 1px 2px rgba(18,18,28,.05),\n 0 8px 24px -6px rgba(18,18,28,.09),\n 0 24px 64px -16px rgba(18,18,28,.13);\n --slx-shadow-pop:\n 0 2px 6px rgba(18,18,28,.08),\n 0 16px 48px -12px rgba(18,18,28,.18);\n\n font-family: var(--slx-font);\n color: var(--slx-ink);\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n font-feature-settings: \"cv11\", \"ss01\";\n}\n@media (prefers-color-scheme: dark) {\n .slyxup-root:not(.slyxup-light) {\n --slx-accent: #8484f2;\n --slx-accent-hover: #9696f5;\n --slx-accent-soft: rgba(132, 132, 242, 0.16);\n --slx-bg: #17171f;\n --slx-bg-subtle: #1e1e28;\n --slx-bg-page: #101016;\n --slx-ink: #f0f0f4;\n --slx-ink-strong: #ffffff;\n --slx-muted: #9a9aa6;\n --slx-border: #292935;\n --slx-border-strong: #343442;\n --slx-danger: #f0737d;\n --slx-success: #4ade80;\n --slx-shadow-card:\n 0 1px 2px rgba(0,0,0,.25),\n 0 12px 32px -8px rgba(0,0,0,.5),\n 0 32px 72px -20px rgba(0,0,0,.55);\n --slx-shadow-pop:\n 0 4px 12px rgba(0,0,0,.4),\n 0 24px 56px -12px rgba(0,0,0,.6);\n }\n}\n\n@keyframes slx-shake {\n 10%, 90% { transform: translateX(-1px); }\n 20%, 80% { transform: translateX(2px); }\n 30%, 50%, 70% { transform: translateX(-4px); }\n 40%, 60% { transform: translateX(4px); }\n}\n@keyframes slx-spin { to { transform: rotate(360deg); } }\n@keyframes slx-rise {\n from { opacity: 0; transform: translateY(8px) scale(.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n@keyframes slx-pop {\n 0% { transform: scale(.5); opacity: 0; }\n 60% { transform: scale(1.08); opacity: 1; }\n 100% { transform: scale(1); }\n}\n@media (prefers-reduced-motion: reduce) {\n .slyxup-root * { animation: none !important; transition: none !important; }\n}\n\n/* \u2500\u2500 Card \u2500\u2500 */\n.slx-card {\n width: 100%;\n max-width: 400px;\n background: var(--slx-bg);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius-lg);\n padding: 34px 34px 30px;\n box-shadow: var(--slx-shadow-card);\n box-sizing: border-box;\n animation: slx-rise .38s cubic-bezier(.22,.9,.32,1) both;\n}\n.slyxup-root:not(.slyxup-light) .slx-card,\n.slx-card { color: var(--slx-ink); }\n.slx-card-error { animation: slx-shake .45s cubic-bezier(.36,.07,.19,.97) both; }\n\n/* \u2500\u2500 Header / keyhole mark \u2500\u2500 */\n.slx-mark {\n width: 46px; height: 46px; border-radius: 13px;\n display: flex; align-items: center; justify-content: center;\n background: linear-gradient(140deg, var(--slx-accent) 0%, #8b5cf6 100%);\n box-shadow:\n inset 0 1px 0 rgba(255,255,255,.28),\n 0 6px 16px -6px rgba(91,91,214,.55);\n margin-bottom: 20px;\n}\n.slx-mark svg { display: block; filter: drop-shadow(0 1px 1px rgba(0,0,0,.18)); }\n.slx-title {\n font-family: var(--slx-display);\n font-size: 21px; font-weight: 650; letter-spacing: -0.022em;\n color: var(--slx-ink-strong);\n margin: 0 0 6px;\n}\n.slx-subtitle { font-size: 13.5px; color: var(--slx-muted); margin: 0 0 24px; line-height: 1.55; }\n\n/* \u2500\u2500 Fields \u2500\u2500 */\n.slx-field { margin-bottom: 15px; }\n.slx-row {\n display: flex; align-items: baseline; justify-content: space-between;\n margin-bottom: 6px;\n}\n.slx-label {\n display: inline-block;\n font-size: 12.5px; font-weight: 550; letter-spacing: 0.01em;\n color: var(--slx-ink);\n}\n.slx-input {\n width: 100%; box-sizing: border-box;\n font: inherit; font-size: 14px; line-height: 1.4; color: var(--slx-ink);\n background: var(--slx-bg-subtle);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius);\n padding: 10px 13px;\n outline: none;\n transition: border-color .15s, box-shadow .15s, background .15s;\n}\n.slx-input::placeholder { color: var(--slx-muted); opacity: .7; }\n.slx-input:hover { border-color: var(--slx-border-strong); }\n.slx-input:focus-visible {\n background: var(--slx-bg);\n border-color: var(--slx-accent);\n box-shadow: 0 0 0 3.5px var(--slx-accent-soft);\n}\n.slx-hint { font-size: 12px; color: var(--slx-muted); margin-top: 5px; }\n.slx-error-text {\n font-size: 13px; color: var(--slx-danger);\n background: color-mix(in srgb, var(--slx-danger) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--slx-danger) 26%, transparent);\n border-left: 3px solid var(--slx-danger);\n border-radius: var(--slx-radius-sm);\n padding: 10px 12px; margin: 0 0 16px; line-height: 1.45;\n}\n.slx-setup-note {\n font-size: 12px; line-height: 1.45;\n color: #7a5c00;\n background: #fff7dc;\n border: 1px solid #f3e3a0;\n border-radius: var(--slx-radius-sm);\n padding: 9px 11px; margin: 0 0 16px;\n}\n.slyxup-root:not(.slyxup-light) .slx-setup-note {\n color: #f5d878; background: rgba(250,204,21,.07); border-color: rgba(250,204,21,.25);\n}\n.slx-setup-note code {\n font-family: var(--slx-mono); font-size: 11px;\n background: rgba(0,0,0,.05); border-radius: 4px; padding: 1px 4px;\n}\n.slyxup-root:not(.slyxup-light) .slx-setup-note code { background: rgba(255,255,255,.08); }\n\n/* \u2500\u2500 Primary button \u2500\u2500 */\n.slx-btn {\n width: 100%; box-sizing: border-box;\n font-family: var(--slx-font); font-size: 14px; font-weight: 600; letter-spacing: 0.01em;\n color: #fff; background: linear-gradient(180deg, #23232e 0%, #0a0a0f 100%);\n border: 1px solid #0a0a0f; border-radius: var(--slx-radius);\n padding: 11px 14px; cursor: pointer;\n box-shadow: 0 1px 2px rgba(10,10,15,.35), inset 0 1px 0 rgba(255,255,255,.08);\n display: inline-flex; align-items: center; justify-content: center; gap: 8px;\n transition: filter .15s, transform .06s, box-shadow .15s;\n}\n.slx-btn:hover { filter: brightness(1.22); }\n.slx-btn:active { transform: scale(.985); filter: brightness(.92); }\n.slx-btn:focus-visible { outline: none; box-shadow: 0 0 0 3.5px rgba(10,10,15,.16), 0 0 0 1.5px #0a0a0f; }\n.slx-btn[disabled] { opacity: .55; cursor: not-allowed; }\n@media (prefers-color-scheme: dark) {\n .slyxup-root:not(.slyxup-light) .slx-btn {\n background: linear-gradient(180deg, #ffffff 0%, #ececf1 100%);\n color: #0a0a0f; border-color: #ececf1;\n box-shadow: 0 1px 2px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.9);\n }\n .slyxup-root:not(.slyxup-light) .slx-btn:hover { filter: brightness(.94); }\n}\n.slx-spinner {\n width: 15px; height: 15px; flex: none;\n border: 2px solid rgba(255,255,255,.35); border-top-color: #fff;\n border-radius: 50%; animation: slx-spin .7s linear infinite;\n}\n.slyxup-root:not(.slyxup-light) .slx-spinner { border-color: rgba(10,10,15,.25); border-top-color: #0a0a0f; }\n\n/* \u2500\u2500 Social \u2500\u2500 */\n.slx-social { display: grid; gap: 9px; margin-bottom: 4px; }\n.slx-social-btn {\n width: 100%; box-sizing: border-box;\n font: inherit; font-size: 13.5px; font-weight: 550;\n color: var(--slx-ink); background: var(--slx-bg);\n border: 1px solid var(--slx-border-strong); border-radius: var(--slx-radius);\n padding: 10px 14px; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center; gap: 10px;\n transition: background .15s, border-color .15s, transform .06s, box-shadow .15s;\n}\n.slx-social-btn:hover {\n background: var(--slx-bg-subtle);\n border-color: var(--slx-border-strong);\n box-shadow: 0 2px 8px -2px rgba(18,18,28,.12);\n}\n.slx-social-btn:active { transform: scale(.985); }\n.slx-social-btn:focus-visible { outline: none; box-shadow: 0 0 0 3.5px var(--slx-accent-soft); }\n.slx-social-btn svg { flex: none; }\n\n/* \u2500\u2500 Divider & footer \u2500\u2500 */\n.slx-divider {\n display: flex; align-items: center; gap: 14px;\n color: var(--slx-muted); font-size: 11.5px;\n letter-spacing: .04em; text-transform: uppercase;\n margin: 18px 0;\n}\n.slx-divider::before, .slx-divider::after {\n content: \"\"; height: 1px; flex: 1;\n background: linear-gradient(90deg, transparent, var(--slx-border-strong));\n}\n.slx-divider::after { background: linear-gradient(90deg, var(--slx-border-strong), transparent); }\n.slx-footer { font-size: 13px; color: var(--slx-muted); margin-top: 22px; text-align: center; }\n.slx-link {\n color: var(--slx-accent); font-weight: 600; text-decoration: none; cursor: pointer;\n background: none; border: none; font: inherit; font-size: inherit;\n padding: 0; margin: 0;\n}\n.slx-link:hover { text-decoration: underline; color: var(--slx-accent-hover); }\n.slx-link:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--slx-accent-soft); border-radius: 4px; }\n.slx-forgot { font-size: 12px; }\n\n/* \u2500\u2500 Success state \u2500\u2500 */\n.slx-success-icon {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n background: color-mix(in srgb, var(--slx-success) 12%, transparent);\n color: var(--slx-success); margin: 4px auto 18px;\n animation: slx-pop .45s cubic-bezier(.22,.9,.32,1) both;\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--slx-success) 6%, transparent);\n}\n\n/* \u2500\u2500 User button \u2500\u2500 */\n.slx-userbtn-wrap { position: relative; display: inline-block; }\n.slx-userbtn-avatar {\n width: 36px; height: 36px; border-radius: 50%;\n border: 1px solid var(--slx-border); cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 14px; font-weight: 650; color: #fff;\n background: linear-gradient(135deg, var(--slx-accent), #8b5cf6);\n padding: 0; overflow: hidden;\n transition: box-shadow .15s, transform .06s;\n}\n.slx-userbtn-avatar:hover { box-shadow: 0 0 0 3px var(--slx-accent-soft); }\n.slx-userbtn-avatar:active { transform: scale(.96); }\n.slx-userbtn-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.slx-userbtn-avatar:focus-visible { outline: none; box-shadow: 0 0 0 3.5px var(--slx-accent-soft); }\n.slx-menu {\n position: absolute; right: 0; top: calc(100% + 8px);\n min-width: 240px;\n background: var(--slx-bg);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius-lg);\n box-shadow: var(--slx-shadow-pop);\n overflow: hidden; z-index: 1000;\n animation: slx-rise .22s cubic-bezier(.22,.9,.32,1) both;\n}\n.slx-menu-header { padding: 14px 16px; border-bottom: 1px solid var(--slx-border); background: var(--slx-bg-subtle); }\n.slx-menu-name { font-size: 14px; font-weight: 600; margin: 0 0 2px; color: var(--slx-ink-strong); }\n.slx-menu-email { font-size: 12.5px; color: var(--slx-muted); margin: 0; word-break: break-all; }\n.slx-menu-item {\n display: block; width: 100%; text-align: left; box-sizing: border-box;\n font: inherit; font-size: 13.5px; color: var(--slx-ink);\n background: none; border: none; padding: 10px 16px; cursor: pointer;\n transition: background .12s;\n}\n.slx-menu-item:hover { background: color-mix(in srgb, var(--slx-ink) 4%, transparent); }\n.slx-menu-item:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--slx-accent-soft); }\n.slx-menu-item-danger { color: var(--slx-danger); }\n.slx-menu-item-danger:hover { background: color-mix(in srgb, var(--slx-danger) 7%, transparent); }\n\n/* \u2500\u2500 Badge (verified etc.) \u2500\u2500 */\n.slx-badge {\n display: inline-flex; align-items: center; gap: 5px;\n font-size: 11px; font-weight: 600; letter-spacing: .02em;\n padding: 2.5px 9px; border-radius: 999px;\n color: var(--slx-success);\n background: color-mix(in srgb, var(--slx-success) 9%, transparent);\n border: 1px solid color-mix(in srgb, var(--slx-success) 30%, transparent);\n}\n";
7
+ export declare const CSS = "\n@import url('https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Space+Grotesk:wght@400;500;600;700&display=swap');\n\n.slyxup-root {\n /* \u2500\u2500 Tokens \u2500\u2500 */\n --slx-accent: #5b5bd6;\n --slx-accent-hover: #4c4cc4;\n --slx-accent-soft: rgba(91, 91, 214, 0.12);\n --slx-bg: #ffffff;\n --slx-bg-subtle: #f7f7fb;\n --slx-bg-page: #e9eaf6;\n --slx-ink: #16161d;\n --slx-ink-strong: #0c0c12;\n --slx-muted: #6f6f7b;\n --slx-border: #e3e3ee;\n --slx-border-strong: #d3d3e2;\n --slx-danger: #d64550;\n --slx-success: #1f9d55;\n --slx-radius-sm: 8px;\n --slx-radius: 10px;\n --slx-radius-lg: 14px;\n --slx-font: \"DM Sans\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n --slx-display: \"Space Grotesk\", \"DM Sans\", sans-serif;\n --slx-mono: ui-monospace, SFMono-Regular, Menlo, monospace;\n --slx-shadow-card:\n 0 1px 2px rgba(18,18,28,.05),\n 0 8px 24px -6px rgba(18,18,28,.09),\n 0 24px 64px -16px rgba(18,18,28,.13);\n --slx-shadow-pop:\n 0 2px 6px rgba(18,18,28,.08),\n 0 16px 48px -12px rgba(18,18,28,.18);\n\n font-family: var(--slx-font);\n color: var(--slx-ink);\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n font-feature-settings: \"cv11\", \"ss01\";\n}\n@media (prefers-color-scheme: dark) {\n .slyxup-root:not(.slyxup-light) {\n --slx-accent: #8484f2;\n --slx-accent-hover: #9696f5;\n --slx-accent-soft: rgba(132, 132, 242, 0.16);\n --slx-bg: #17171f;\n --slx-bg-subtle: #1e1e28;\n --slx-bg-page: #101016;\n --slx-ink: #f0f0f4;\n --slx-ink-strong: #ffffff;\n --slx-muted: #9a9aa6;\n --slx-border: #292935;\n --slx-border-strong: #343442;\n --slx-danger: #f0737d;\n --slx-success: #4ade80;\n --slx-shadow-card:\n 0 1px 2px rgba(0,0,0,.25),\n 0 12px 32px -8px rgba(0,0,0,.5),\n 0 32px 72px -20px rgba(0,0,0,.55);\n --slx-shadow-pop:\n 0 4px 12px rgba(0,0,0,.4),\n 0 24px 56px -12px rgba(0,0,0,.6);\n }\n}\n\n@keyframes slx-shake {\n 10%, 90% { transform: translateX(-1px); }\n 20%, 80% { transform: translateX(2px); }\n 30%, 50%, 70% { transform: translateX(-4px); }\n 40%, 60% { transform: translateX(4px); }\n}\n@keyframes slx-spin { to { transform: rotate(360deg); } }\n@keyframes slx-rise {\n from { opacity: 0; transform: translateY(8px) scale(.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n@keyframes slx-pop {\n 0% { transform: scale(.5); opacity: 0; }\n 60% { transform: scale(1.08); opacity: 1; }\n 100% { transform: scale(1); }\n}\n@media (prefers-reduced-motion: reduce) {\n .slyxup-root * { animation: none !important; transition: none !important; }\n}\n\n/* \u2500\u2500 Card \u2500\u2500 */\n.slx-card {\n width: 100%;\n max-width: 400px;\n background: var(--slx-bg);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius-lg);\n padding: 34px 34px 30px;\n box-shadow: var(--slx-shadow-card);\n box-sizing: border-box;\n animation: slx-rise .38s cubic-bezier(.22,.9,.32,1) both;\n}\n.slyxup-root:not(.slyxup-light) .slx-card,\n.slx-card { color: var(--slx-ink); }\n.slx-card-error { animation: slx-shake .45s cubic-bezier(.36,.07,.19,.97) both; }\n\n/* \u2500\u2500 Header / keyhole mark \u2500\u2500 */\n.slx-mark {\n width: 46px; height: 46px; border-radius: 13px;\n display: flex; align-items: center; justify-content: center;\n background: linear-gradient(140deg, var(--slx-accent) 0%, #8b5cf6 100%);\n box-shadow:\n inset 0 1px 0 rgba(255,255,255,.28),\n 0 6px 16px -6px rgba(91,91,214,.55);\n margin-bottom: 20px;\n}\n.slx-mark svg { display: block; filter: drop-shadow(0 1px 1px rgba(0,0,0,.18)); }\n.slx-title {\n font-family: var(--slx-display);\n font-size: 21px; font-weight: 650; letter-spacing: -0.022em;\n color: var(--slx-ink-strong);\n margin: 0 0 6px;\n}\n.slx-subtitle { font-size: 13.5px; color: var(--slx-muted); margin: 0 0 24px; line-height: 1.55; }\n\n/* \u2500\u2500 Fields \u2500\u2500 */\n.slx-field { margin-bottom: 15px; }\n.slx-row {\n display: flex; align-items: baseline; justify-content: space-between;\n margin-bottom: 6px;\n}\n.slx-label {\n display: inline-block;\n font-size: 12.5px; font-weight: 550; letter-spacing: 0.01em;\n color: var(--slx-ink);\n}\n.slx-input {\n width: 100%; box-sizing: border-box;\n font: inherit; font-size: 14px; line-height: 1.4; color: var(--slx-ink);\n background: var(--slx-bg-subtle);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius);\n padding: 10px 13px;\n outline: none;\n transition: border-color .15s, box-shadow .15s, background .15s;\n}\n.slx-input::placeholder { color: var(--slx-muted); opacity: .7; }\n.slx-input:hover { border-color: var(--slx-border-strong); }\n.slx-input:focus-visible {\n background: var(--slx-bg);\n border-color: var(--slx-accent);\n box-shadow: 0 0 0 3.5px var(--slx-accent-soft);\n}\n.slx-hint { font-size: 12px; color: var(--slx-muted); margin-top: 5px; }\n.slx-error-text {\n font-size: 13px; color: var(--slx-danger);\n background: color-mix(in srgb, var(--slx-danger) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--slx-danger) 26%, transparent);\n border-left: 3px solid var(--slx-danger);\n border-radius: var(--slx-radius-sm);\n padding: 10px 12px; margin: 0 0 16px; line-height: 1.45;\n}\n.slx-setup-note {\n font-size: 12px; line-height: 1.45;\n color: #7a5c00;\n background: #fff7dc;\n border: 1px solid #f3e3a0;\n border-radius: var(--slx-radius-sm);\n padding: 9px 11px; margin: 0 0 16px;\n}\n.slyxup-root:not(.slyxup-light) .slx-setup-note {\n color: #f5d878; background: rgba(250,204,21,.07); border-color: rgba(250,204,21,.25);\n}\n.slx-setup-note code {\n font-family: var(--slx-mono); font-size: 11px;\n background: rgba(0,0,0,.05); border-radius: 4px; padding: 1px 4px;\n}\n.slyxup-root:not(.slyxup-light) .slx-setup-note code { background: rgba(255,255,255,.08); }\n\n/* \u2500\u2500 Primary button \u2500\u2500 */\n.slx-btn {\n width: 100%; box-sizing: border-box;\n font-family: var(--slx-font); font-size: 14px; font-weight: 600; letter-spacing: 0.01em;\n color: #fff; background: linear-gradient(180deg, #23232e 0%, #0a0a0f 100%);\n border: 1px solid #0a0a0f; border-radius: var(--slx-radius);\n padding: 11px 14px; cursor: pointer;\n box-shadow: 0 1px 2px rgba(10,10,15,.35), inset 0 1px 0 rgba(255,255,255,.08);\n display: inline-flex; align-items: center; justify-content: center; gap: 8px;\n transition: filter .15s, transform .06s, box-shadow .15s;\n}\n.slx-btn:hover { filter: brightness(1.22); }\n.slx-btn:active { transform: scale(.985); filter: brightness(.92); }\n.slx-btn:focus-visible { outline: none; box-shadow: 0 0 0 3.5px rgba(10,10,15,.16), 0 0 0 1.5px #0a0a0f; }\n.slx-btn[disabled] { opacity: .55; cursor: not-allowed; }\n@media (prefers-color-scheme: dark) {\n .slyxup-root:not(.slyxup-light) .slx-btn {\n background: linear-gradient(180deg, #ffffff 0%, #ececf1 100%);\n color: #0a0a0f; border-color: #ececf1;\n box-shadow: 0 1px 2px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.9);\n }\n .slyxup-root:not(.slyxup-light) .slx-btn:hover { filter: brightness(.94); }\n}\n.slx-spinner {\n width: 15px; height: 15px; flex: none;\n border: 2px solid rgba(255,255,255,.35); border-top-color: #fff;\n border-radius: 50%; animation: slx-spin .7s linear infinite;\n}\n.slyxup-root:not(.slyxup-light) .slx-spinner { border-color: rgba(10,10,15,.25); border-top-color: #0a0a0f; }\n\n/* \u2500\u2500 Social \u2500\u2500 */\n.slx-social { display: grid; gap: 9px; margin-bottom: 4px; }\n.slx-social-btn {\n width: 100%; box-sizing: border-box;\n font: inherit; font-size: 13.5px; font-weight: 550;\n color: var(--slx-ink); background: var(--slx-bg);\n border: 1px solid var(--slx-border-strong); border-radius: var(--slx-radius);\n padding: 10px 14px; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center; gap: 10px;\n transition: background .15s, border-color .15s, transform .06s, box-shadow .15s;\n}\n.slx-social-btn:hover {\n background: var(--slx-bg-subtle);\n border-color: var(--slx-border-strong);\n box-shadow: 0 2px 8px -2px rgba(18,18,28,.12);\n}\n.slx-social-btn:active { transform: scale(.985); }\n.slx-social-btn:focus-visible { outline: none; box-shadow: 0 0 0 3.5px var(--slx-accent-soft); }\n.slx-social-btn svg { flex: none; }\n\n/* \u2500\u2500 Divider & footer \u2500\u2500 */\n.slx-divider {\n display: flex; align-items: center; gap: 14px;\n color: var(--slx-muted); font-size: 11.5px;\n letter-spacing: .04em; text-transform: uppercase;\n margin: 18px 0;\n}\n.slx-divider::before, .slx-divider::after {\n content: \"\"; height: 1px; flex: 1;\n background: linear-gradient(90deg, transparent, var(--slx-border-strong));\n}\n.slx-divider::after { background: linear-gradient(90deg, var(--slx-border-strong), transparent); }\n.slx-footer { font-size: 13px; color: var(--slx-muted); margin-top: 22px; text-align: center; }\n.slx-link {\n color: var(--slx-accent); font-weight: 600; text-decoration: none; cursor: pointer;\n background: none; border: none; font: inherit; font-size: inherit;\n padding: 0; margin: 0;\n}\n.slx-link:hover { text-decoration: underline; color: var(--slx-accent-hover); }\n.slx-link:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--slx-accent-soft); border-radius: 4px; }\n.slx-forgot { font-size: 12px; }\n\n/* \u2500\u2500 Success state \u2500\u2500 */\n.slx-success-icon {\n width: 48px; height: 48px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n background: color-mix(in srgb, var(--slx-success) 12%, transparent);\n color: var(--slx-success); margin: 4px auto 18px;\n animation: slx-pop .45s cubic-bezier(.22,.9,.32,1) both;\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--slx-success) 6%, transparent);\n}\n\n/* \u2500\u2500 User button \u2500\u2500 */\n.slx-userbtn-wrap { position: relative; display: inline-block; }\n.slx-userbtn-avatar {\n width: 36px; height: 36px; border-radius: 50%;\n border: 1px solid var(--slx-border); cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n font-size: 14px; font-weight: 650; color: #fff;\n background: linear-gradient(135deg, var(--slx-accent), #8b5cf6);\n padding: 0; overflow: hidden;\n transition: box-shadow .15s, transform .06s;\n}\n.slx-userbtn-avatar:hover { box-shadow: 0 0 0 3px var(--slx-accent-soft); }\n.slx-userbtn-avatar:active { transform: scale(.96); }\n.slx-userbtn-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.slx-userbtn-avatar:focus-visible { outline: none; box-shadow: 0 0 0 3.5px var(--slx-accent-soft); }\n.slx-menu {\n position: absolute; right: 0; top: calc(100% + 8px);\n min-width: 240px;\n background: var(--slx-bg);\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius-lg);\n box-shadow: var(--slx-shadow-pop);\n overflow: hidden; z-index: 1000;\n animation: slx-rise .22s cubic-bezier(.22,.9,.32,1) both;\n}\n.slx-menu-header { padding: 14px 16px; border-bottom: 1px solid var(--slx-border); background: var(--slx-bg-subtle); }\n.slx-menu-name { font-size: 14px; font-weight: 600; margin: 0 0 2px; color: var(--slx-ink-strong); }\n.slx-menu-email { font-size: 12.5px; color: var(--slx-muted); margin: 0; word-break: break-all; }\n.slx-menu-item {\n display: block; width: 100%; text-align: left; box-sizing: border-box;\n font: inherit; font-size: 13.5px; color: var(--slx-ink);\n background: none; border: none; padding: 10px 16px; cursor: pointer;\n transition: background .12s;\n}\n.slx-menu-item:hover { background: color-mix(in srgb, var(--slx-ink) 4%, transparent); }\n.slx-menu-item:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--slx-accent-soft); }\n.slx-menu-item-danger { color: var(--slx-danger); }\n.slx-menu-item-danger:hover { background: color-mix(in srgb, var(--slx-danger) 7%, transparent); }\n\n/* \u2500\u2500 Badge (verified etc.) \u2500\u2500 */\n.slx-badge {\n display: inline-flex; align-items: center; gap: 5px;\n font-size: 11px; font-weight: 600; letter-spacing: .02em;\n padding: 2.5px 9px; border-radius: 999px;\n color: var(--slx-success);\n background: color-mix(in srgb, var(--slx-success) 9%, transparent);\n border: 1px solid color-mix(in srgb, var(--slx-success) 30%, transparent);\n}\n.slx-badge-ok { color: var(--slx-success); background: color-mix(in srgb, var(--slx-success) 9%, transparent); border-color: color-mix(in srgb, var(--slx-success) 30%, transparent); }\n.slx-badge-warn { color: #b45309; background: color-mix(in srgb, #f59e0b 10%, transparent); border-color: color-mix(in srgb, #f59e0b 30%, transparent); }\n.slx-badge-accent { color: var(--slx-accent); background: var(--slx-accent-soft); border-color: color-mix(in srgb, var(--slx-accent) 30%, transparent); }\n.slyxup-root:not(.slyxup-light) .slx-badge-warn { color: #fbbf24; }\n\n/* \u2500\u2500 Modal overlay \u2500\u2500 */\n.slx-overlay {\n position: fixed; inset: 0; z-index: 9999;\n display: flex; align-items: center; justify-content: center;\n background: rgba(12, 12, 18, 0.55);\n backdrop-filter: blur(6px);\n animation: slx-rise .2s cubic-bezier(.22,.9,.32,1) both;\n}\n\n/* \u2500\u2500 UserProfile \u2500\u2500 */\n.slx-profile-head {\n display: flex; align-items: center; justify-content: space-between;\n padding: 22px 28px 18px;\n border-bottom: 1px solid var(--slx-border);\n}\n.slx-profile-title {\n font-family: var(--slx-display);\n font-size: 18px; font-weight: 650; letter-spacing: -0.02em;\n color: var(--slx-ink-strong);\n margin: 0;\n}\n.slx-profile-close {\n width: 32px; height: 32px; border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n background: none; border: 1px solid var(--slx-border);\n color: var(--slx-muted); cursor: pointer; font-size: 16px;\n transition: background .12s, color .12s, border-color .12s;\n}\n.slx-profile-close:hover { background: var(--slx-bg-subtle); color: var(--slx-ink); border-color: var(--slx-border-strong); }\n.slx-profile-close:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--slx-accent-soft); }\n\n.slx-profile-body {\n display: flex; min-height: 480px; max-height: 80vh;\n width: 720px; max-width: calc(100vw - 48px);\n background: var(--slx-bg);\n border-radius: var(--slx-radius-lg);\n box-shadow: var(--slx-shadow-pop);\n overflow: hidden;\n}\n\n/* \u2500\u2500 Left nav \u2500\u2500 */\n.slx-profile-nav {\n width: 200px; flex-shrink: 0;\n display: flex; flex-direction: column; gap: 2px;\n padding: 12px 8px;\n border-right: 1px solid var(--slx-border);\n background: var(--slx-bg-subtle);\n}\n.slx-profile-nav-btn {\n display: flex; align-items: center; gap: 9px;\n font: inherit; font-size: 13.5px; font-weight: 500;\n color: var(--slx-muted); background: none; border: none;\n border-radius: var(--slx-radius-sm);\n padding: 9px 12px; cursor: pointer; text-align: left;\n transition: background .12s, color .12s;\n}\n.slx-profile-nav-btn:hover { background: color-mix(in srgb, var(--slx-ink) 5%, transparent); color: var(--slx-ink); }\n.slx-profile-nav-btn.on { background: var(--slx-bg); color: var(--slx-ink-strong); font-weight: 600; box-shadow: 0 1px 3px rgba(18,18,28,.06); }\n.slx-profile-nav-btn:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--slx-accent-soft); }\n\n/* \u2500\u2500 Content area \u2500\u2500 */\n.slx-profile-content {\n flex: 1; overflow-y: auto; padding: 24px 28px 28px;\n}\n.slx-profile-sec { margin-bottom: 28px; }\n.slx-profile-sec:last-child { margin-bottom: 0; }\n.slx-sec-title {\n font-family: var(--slx-display);\n font-size: 14px; font-weight: 600; letter-spacing: -0.01em;\n color: var(--slx-ink-strong);\n margin: 0 0 14px; padding-bottom: 10px;\n border-bottom: 1px solid var(--slx-border);\n}\n\n/* \u2500\u2500 Avatar \u2500\u2500 */\n.slx-avatar-row {\n display: flex; align-items: center; gap: 16px;\n margin-bottom: 20px;\n}\n.slx-avatar-lg {\n width: 64px; height: 64px; border-radius: 50%;\n flex-shrink: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 24px; font-weight: 700; color: #fff;\n background: linear-gradient(135deg, var(--slx-accent), #8b5cf6);\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(91,91,214,.3);\n}\n.slx-avatar-lg img { width: 100%; height: 100%; object-fit: cover; }\n\n/* \u2500\u2500 Row (email etc.) \u2500\u2500 */\n.slx-row-value { font-size: 14px; font-weight: 500; color: var(--slx-ink-strong); margin: 0; }\n.slx-row-label { font-size: 12px; color: var(--slx-muted); margin: 2px 0 0; }\n\n/* \u2500\u2500 Sessions \u2500\u2500 */\n.slx-session {\n display: flex; align-items: center; justify-content: space-between;\n padding: 12px 14px; border-radius: var(--slx-radius-sm);\n border: 1px solid var(--slx-border);\n background: var(--slx-bg-subtle);\n margin-bottom: 8px;\n transition: border-color .12s;\n}\n.slx-session:hover { border-color: var(--slx-border-strong); }\n.slx-session-meta { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n.slx-session-device { font-size: 13.5px; font-weight: 550; color: var(--slx-ink); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n.slx-session-sub { font-size: 12px; color: var(--slx-muted); margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n\n/* \u2500\u2500 Danger zone \u2500\u2500 */\n.slx-danger-zone {\n border: 1px solid color-mix(in srgb, var(--slx-danger) 30%, transparent);\n border-radius: var(--slx-radius);\n padding: 18px 20px;\n background: color-mix(in srgb, var(--slx-danger) 4%, transparent);\n}\n.slx-danger-title {\n font-size: 14px; font-weight: 650; color: var(--slx-danger);\n margin: 0 0 6px;\n}\n.slx-danger-desc {\n font-size: 13px; color: var(--slx-muted); line-height: 1.5;\n margin: 0 0 16px;\n}\n.slx-btn-danger-outline {\n font: inherit; font-size: 13px; font-weight: 550;\n color: var(--slx-danger); background: none;\n border: 1px solid color-mix(in srgb, var(--slx-danger) 35%, transparent);\n border-radius: var(--slx-radius-sm);\n padding: 7px 14px; cursor: pointer;\n transition: background .12s, border-color .12s;\n}\n.slx-btn-danger-outline:hover { background: color-mix(in srgb, var(--slx-danger) 8%, transparent); border-color: var(--slx-danger); }\n.slx-btn-danger-outline:active { transform: scale(.98); }\n.slx-btn-danger-outline:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--slx-danger) 20%, transparent); }\n.slx-btn-danger-outline[disabled] { opacity: .5; cursor: not-allowed; }\n\n/* \u2500\u2500 Billing (inside UserProfile) \u2500\u2500 */\n.slx-billing-card {\n border: 1px solid var(--slx-border);\n border-radius: var(--slx-radius);\n padding: 18px 20px;\n background: var(--slx-bg-subtle);\n margin-bottom: 16px;\n}\n.slx-billing-plan { font-size: 15px; font-weight: 650; color: var(--slx-ink-strong); margin: 0 0 4px; }\n.slx-billing-detail { font-size: 13px; color: var(--slx-muted); margin: 2px 0; }\n.slx-billing-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; }\n.slx-billing-status-active { color: var(--slx-success); }\n.slx-billing-status-trialing { color: var(--slx-accent); }\n.slx-billing-status-canceled { color: var(--slx-danger); }\n.slx-invoice-row {\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 0; border-bottom: 1px solid var(--slx-border);\n font-size: 13px;\n}\n.slx-invoice-row:last-child { border-bottom: none; }\n.slx-invoice-date { color: var(--slx-muted); }\n.slx-invoice-amount { font-weight: 600; color: var(--slx-ink-strong); }\n";
8
8
  /** Inject the SlyxUp stylesheet + fonts once per document. Idempotent + SSR-safe. */
9
9
  export declare function injectStyles(): void;
10
10
  /** Test hook — whether styles are present. */
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,SAAS,4VAAgV,CAAC;AAEvW,eAAO,MAAM,GAAG,yqYA8Sf,CAAC;AAIF,qFAAqF;AACrF,wBAAgB,YAAY,IAAI,IAAI,CAqBnC;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,SAAS,4VAAgV,CAAC;AAEvW,eAAO,MAAM,GAAG,01mBAidf,CAAC;AAIF,qFAAqF;AACrF,wBAAgB,YAAY,IAAI,IAAI,CAqBnC;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
package/dist/styles.js CHANGED
@@ -306,6 +306,169 @@ export const CSS = `
306
306
  background: color-mix(in srgb, var(--slx-success) 9%, transparent);
307
307
  border: 1px solid color-mix(in srgb, var(--slx-success) 30%, transparent);
308
308
  }
309
+ .slx-badge-ok { color: var(--slx-success); background: color-mix(in srgb, var(--slx-success) 9%, transparent); border-color: color-mix(in srgb, var(--slx-success) 30%, transparent); }
310
+ .slx-badge-warn { color: #b45309; background: color-mix(in srgb, #f59e0b 10%, transparent); border-color: color-mix(in srgb, #f59e0b 30%, transparent); }
311
+ .slx-badge-accent { color: var(--slx-accent); background: var(--slx-accent-soft); border-color: color-mix(in srgb, var(--slx-accent) 30%, transparent); }
312
+ .slyxup-root:not(.slyxup-light) .slx-badge-warn { color: #fbbf24; }
313
+
314
+ /* ── Modal overlay ── */
315
+ .slx-overlay {
316
+ position: fixed; inset: 0; z-index: 9999;
317
+ display: flex; align-items: center; justify-content: center;
318
+ background: rgba(12, 12, 18, 0.55);
319
+ backdrop-filter: blur(6px);
320
+ animation: slx-rise .2s cubic-bezier(.22,.9,.32,1) both;
321
+ }
322
+
323
+ /* ── UserProfile ── */
324
+ .slx-profile-head {
325
+ display: flex; align-items: center; justify-content: space-between;
326
+ padding: 22px 28px 18px;
327
+ border-bottom: 1px solid var(--slx-border);
328
+ }
329
+ .slx-profile-title {
330
+ font-family: var(--slx-display);
331
+ font-size: 18px; font-weight: 650; letter-spacing: -0.02em;
332
+ color: var(--slx-ink-strong);
333
+ margin: 0;
334
+ }
335
+ .slx-profile-close {
336
+ width: 32px; height: 32px; border-radius: 8px;
337
+ display: flex; align-items: center; justify-content: center;
338
+ background: none; border: 1px solid var(--slx-border);
339
+ color: var(--slx-muted); cursor: pointer; font-size: 16px;
340
+ transition: background .12s, color .12s, border-color .12s;
341
+ }
342
+ .slx-profile-close:hover { background: var(--slx-bg-subtle); color: var(--slx-ink); border-color: var(--slx-border-strong); }
343
+ .slx-profile-close:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--slx-accent-soft); }
344
+
345
+ .slx-profile-body {
346
+ display: flex; min-height: 480px; max-height: 80vh;
347
+ width: 720px; max-width: calc(100vw - 48px);
348
+ background: var(--slx-bg);
349
+ border-radius: var(--slx-radius-lg);
350
+ box-shadow: var(--slx-shadow-pop);
351
+ overflow: hidden;
352
+ }
353
+
354
+ /* ── Left nav ── */
355
+ .slx-profile-nav {
356
+ width: 200px; flex-shrink: 0;
357
+ display: flex; flex-direction: column; gap: 2px;
358
+ padding: 12px 8px;
359
+ border-right: 1px solid var(--slx-border);
360
+ background: var(--slx-bg-subtle);
361
+ }
362
+ .slx-profile-nav-btn {
363
+ display: flex; align-items: center; gap: 9px;
364
+ font: inherit; font-size: 13.5px; font-weight: 500;
365
+ color: var(--slx-muted); background: none; border: none;
366
+ border-radius: var(--slx-radius-sm);
367
+ padding: 9px 12px; cursor: pointer; text-align: left;
368
+ transition: background .12s, color .12s;
369
+ }
370
+ .slx-profile-nav-btn:hover { background: color-mix(in srgb, var(--slx-ink) 5%, transparent); color: var(--slx-ink); }
371
+ .slx-profile-nav-btn.on { background: var(--slx-bg); color: var(--slx-ink-strong); font-weight: 600; box-shadow: 0 1px 3px rgba(18,18,28,.06); }
372
+ .slx-profile-nav-btn:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--slx-accent-soft); }
373
+
374
+ /* ── Content area ── */
375
+ .slx-profile-content {
376
+ flex: 1; overflow-y: auto; padding: 24px 28px 28px;
377
+ }
378
+ .slx-profile-sec { margin-bottom: 28px; }
379
+ .slx-profile-sec:last-child { margin-bottom: 0; }
380
+ .slx-sec-title {
381
+ font-family: var(--slx-display);
382
+ font-size: 14px; font-weight: 600; letter-spacing: -0.01em;
383
+ color: var(--slx-ink-strong);
384
+ margin: 0 0 14px; padding-bottom: 10px;
385
+ border-bottom: 1px solid var(--slx-border);
386
+ }
387
+
388
+ /* ── Avatar ── */
389
+ .slx-avatar-row {
390
+ display: flex; align-items: center; gap: 16px;
391
+ margin-bottom: 20px;
392
+ }
393
+ .slx-avatar-lg {
394
+ width: 64px; height: 64px; border-radius: 50%;
395
+ flex-shrink: 0;
396
+ display: flex; align-items: center; justify-content: center;
397
+ font-size: 24px; font-weight: 700; color: #fff;
398
+ background: linear-gradient(135deg, var(--slx-accent), #8b5cf6);
399
+ overflow: hidden;
400
+ box-shadow: 0 2px 8px rgba(91,91,214,.3);
401
+ }
402
+ .slx-avatar-lg img { width: 100%; height: 100%; object-fit: cover; }
403
+
404
+ /* ── Row (email etc.) ── */
405
+ .slx-row-value { font-size: 14px; font-weight: 500; color: var(--slx-ink-strong); margin: 0; }
406
+ .slx-row-label { font-size: 12px; color: var(--slx-muted); margin: 2px 0 0; }
407
+
408
+ /* ── Sessions ── */
409
+ .slx-session {
410
+ display: flex; align-items: center; justify-content: space-between;
411
+ padding: 12px 14px; border-radius: var(--slx-radius-sm);
412
+ border: 1px solid var(--slx-border);
413
+ background: var(--slx-bg-subtle);
414
+ margin-bottom: 8px;
415
+ transition: border-color .12s;
416
+ }
417
+ .slx-session:hover { border-color: var(--slx-border-strong); }
418
+ .slx-session-meta { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
419
+ .slx-session-device { font-size: 13.5px; font-weight: 550; color: var(--slx-ink); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
420
+ .slx-session-sub { font-size: 12px; color: var(--slx-muted); margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
421
+
422
+ /* ── Danger zone ── */
423
+ .slx-danger-zone {
424
+ border: 1px solid color-mix(in srgb, var(--slx-danger) 30%, transparent);
425
+ border-radius: var(--slx-radius);
426
+ padding: 18px 20px;
427
+ background: color-mix(in srgb, var(--slx-danger) 4%, transparent);
428
+ }
429
+ .slx-danger-title {
430
+ font-size: 14px; font-weight: 650; color: var(--slx-danger);
431
+ margin: 0 0 6px;
432
+ }
433
+ .slx-danger-desc {
434
+ font-size: 13px; color: var(--slx-muted); line-height: 1.5;
435
+ margin: 0 0 16px;
436
+ }
437
+ .slx-btn-danger-outline {
438
+ font: inherit; font-size: 13px; font-weight: 550;
439
+ color: var(--slx-danger); background: none;
440
+ border: 1px solid color-mix(in srgb, var(--slx-danger) 35%, transparent);
441
+ border-radius: var(--slx-radius-sm);
442
+ padding: 7px 14px; cursor: pointer;
443
+ transition: background .12s, border-color .12s;
444
+ }
445
+ .slx-btn-danger-outline:hover { background: color-mix(in srgb, var(--slx-danger) 8%, transparent); border-color: var(--slx-danger); }
446
+ .slx-btn-danger-outline:active { transform: scale(.98); }
447
+ .slx-btn-danger-outline:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--slx-danger) 20%, transparent); }
448
+ .slx-btn-danger-outline[disabled] { opacity: .5; cursor: not-allowed; }
449
+
450
+ /* ── Billing (inside UserProfile) ── */
451
+ .slx-billing-card {
452
+ border: 1px solid var(--slx-border);
453
+ border-radius: var(--slx-radius);
454
+ padding: 18px 20px;
455
+ background: var(--slx-bg-subtle);
456
+ margin-bottom: 16px;
457
+ }
458
+ .slx-billing-plan { font-size: 15px; font-weight: 650; color: var(--slx-ink-strong); margin: 0 0 4px; }
459
+ .slx-billing-detail { font-size: 13px; color: var(--slx-muted); margin: 2px 0; }
460
+ .slx-billing-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; }
461
+ .slx-billing-status-active { color: var(--slx-success); }
462
+ .slx-billing-status-trialing { color: var(--slx-accent); }
463
+ .slx-billing-status-canceled { color: var(--slx-danger); }
464
+ .slx-invoice-row {
465
+ display: flex; align-items: center; justify-content: space-between;
466
+ padding: 10px 0; border-bottom: 1px solid var(--slx-border);
467
+ font-size: 13px;
468
+ }
469
+ .slx-invoice-row:last-child { border-bottom: none; }
470
+ .slx-invoice-date { color: var(--slx-muted); }
471
+ .slx-invoice-amount { font-weight: 600; color: var(--slx-ink-strong); }
309
472
  `;
310
473
  let injected = false;
311
474
  /** Inject the SlyxUp stylesheet + fonts once per document. Idempotent + SSR-safe. */
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,6UAA6U,CAAC;AAEvW,MAAM,CAAC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8SlB,CAAC;AAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,qFAAqF;AACrF,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,oEAAoE;IACpE,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,GAAG,YAAY,CAAC;YAC5B,QAAQ,CAAC,IAAI;gBACX,+KAA+K,CAAC;YAClL,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,6UAA6U,CAAC;AAEvW,MAAM,CAAC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAidlB,CAAC;AAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,qFAAqF;AACrF,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,oEAAoE;IACpE,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,QAAQ,CAAC,GAAG,GAAG,YAAY,CAAC;YAC5B,QAAQ,CAAC,IAAI;gBACX,+KAA+K,CAAC;YAClL,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slyxup/ui",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "@slyxup/ui — SlyxUp SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,8 +23,8 @@
23
23
  "react": "^18 || ^19"
24
24
  },
25
25
  "dependencies": {
26
- "@slyxup/react": "0.2.6",
27
- "@slyxup/core": "0.2.1"
26
+ "@slyxup/core": "0.2.2",
27
+ "@slyxup/react": "0.2.7"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^26.2.0",
@@ -59,7 +59,8 @@ export function SignIn({
59
59
  }
60
60
 
61
61
  function oauth(provider: 'google' | 'github') {
62
- window.location.href = `${client.apiUrl}/v1/oauth/${provider}`;
62
+ const redirect = encodeURIComponent(window.location.href);
63
+ window.location.href = `${client.apiUrl}/v1/oauth/${provider}?redirect_url=${redirect}`;
63
64
  }
64
65
 
65
66
  const missingKey =
@@ -54,7 +54,8 @@ export function SignUp({
54
54
  }
55
55
 
56
56
  function oauth(provider: 'google' | 'github') {
57
- window.location.href = `${client.apiUrl}/v1/oauth/${provider}`;
57
+ const redirect = encodeURIComponent(window.location.href);
58
+ window.location.href = `${client.apiUrl}/v1/oauth/${provider}?redirect_url=${redirect}`;
58
59
  }
59
60
 
60
61
  const missingKey =
@@ -34,7 +34,8 @@ export function SocialButtons({
34
34
  type="button"
35
35
  className="slx-social-btn"
36
36
  onClick={() => {
37
- window.location.href = `${base}/${p}`;
37
+ const redirect = encodeURIComponent(window.location.href);
38
+ window.location.href = `${base}/${p}?redirect_url=${redirect}`;
38
39
  }}
39
40
  >
40
41
  <Icon /> {label}
@@ -7,8 +7,13 @@ function initials(name: string | null | undefined, email: string): string {
7
7
  return email.slice(0, 1).toUpperCase();
8
8
  }
9
9
 
10
+ export interface UserButtonProps {
11
+ /** Called when "Profile settings" is clicked. Use to open <UserProfile />. */
12
+ onProfileClick?: () => void;
13
+ }
14
+
10
15
  /** Avatar + dropdown with profile actions and sign out. */
11
- export function UserButton() {
16
+ export function UserButton({ onProfileClick }: UserButtonProps) {
12
17
  injectStyles();
13
18
  const { isLoaded, user } = useUser();
14
19
  const { signOut } = useAuth();
@@ -36,6 +41,11 @@ export function UserButton() {
36
41
  const email = user?.email ?? '';
37
42
  const name = user?.firstName;
38
43
 
44
+ function handleProfileClick() {
45
+ setOpen(false);
46
+ onProfileClick?.();
47
+ }
48
+
39
49
  async function onSignOut() {
40
50
  await signOut();
41
51
  setOpen(false);
@@ -72,7 +82,7 @@ export function UserButton() {
72
82
  type="button"
73
83
  className="slx-menu-item"
74
84
  role="menuitem"
75
- onClick={() => setOpen(false)}
85
+ onClick={handleProfileClick}
76
86
  >
77
87
  Profile settings
78
88
  </button>