@yo-yo.art/ui 0.0.0-stage → 0.1.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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -2
  3. package/dist/components/Badge/Badge.cjs +13 -0
  4. package/dist/components/Badge/Badge.cjs.map +1 -0
  5. package/dist/components/Badge/Badge.d.cts +8 -0
  6. package/dist/components/Badge/Badge.d.mts +8 -0
  7. package/dist/components/Badge/Badge.mjs +13 -0
  8. package/dist/components/Badge/Badge.mjs.map +1 -0
  9. package/dist/components/Badge/badge-classes.cjs +12 -0
  10. package/dist/components/Badge/badge-classes.cjs.map +1 -0
  11. package/dist/components/Badge/badge-classes.d.cts +7 -0
  12. package/dist/components/Badge/badge-classes.d.mts +7 -0
  13. package/dist/components/Badge/badge-classes.mjs +12 -0
  14. package/dist/components/Badge/badge-classes.mjs.map +1 -0
  15. package/dist/components/Badge/index.cjs +4 -0
  16. package/dist/components/Badge/index.d.cts +3 -0
  17. package/dist/components/Badge/index.d.mts +3 -0
  18. package/dist/components/Badge/index.mjs +3 -0
  19. package/dist/components/Button/Button.cjs +15 -0
  20. package/dist/components/Button/Button.cjs.map +1 -0
  21. package/dist/components/Button/Button.d.cts +9 -0
  22. package/dist/components/Button/Button.d.mts +9 -0
  23. package/dist/components/Button/Button.mjs +15 -0
  24. package/dist/components/Button/Button.mjs.map +1 -0
  25. package/dist/components/Button/ButtonLink.cjs +15 -0
  26. package/dist/components/Button/ButtonLink.cjs.map +1 -0
  27. package/dist/components/Button/ButtonLink.d.cts +10 -0
  28. package/dist/components/Button/ButtonLink.d.mts +10 -0
  29. package/dist/components/Button/ButtonLink.mjs +15 -0
  30. package/dist/components/Button/ButtonLink.mjs.map +1 -0
  31. package/dist/components/Button/button-classes.cjs +16 -0
  32. package/dist/components/Button/button-classes.cjs.map +1 -0
  33. package/dist/components/Button/button-classes.d.cts +9 -0
  34. package/dist/components/Button/button-classes.d.mts +9 -0
  35. package/dist/components/Button/button-classes.mjs +16 -0
  36. package/dist/components/Button/button-classes.mjs.map +1 -0
  37. package/dist/components/Button/index.cjs +6 -0
  38. package/dist/components/Button/index.d.cts +4 -0
  39. package/dist/components/Button/index.d.mts +4 -0
  40. package/dist/components/Button/index.mjs +4 -0
  41. package/dist/components/Eyebrow/Eyebrow.cjs +10 -0
  42. package/dist/components/Eyebrow/Eyebrow.cjs.map +1 -0
  43. package/dist/components/Eyebrow/Eyebrow.d.cts +5 -0
  44. package/dist/components/Eyebrow/Eyebrow.d.mts +5 -0
  45. package/dist/components/Eyebrow/Eyebrow.mjs +10 -0
  46. package/dist/components/Eyebrow/Eyebrow.mjs.map +1 -0
  47. package/dist/components/Eyebrow/index.cjs +2 -0
  48. package/dist/components/Eyebrow/index.d.cts +2 -0
  49. package/dist/components/Eyebrow/index.d.mts +2 -0
  50. package/dist/components/Eyebrow/index.mjs +1 -0
  51. package/dist/components/IconButton/IconButton.cjs +17 -0
  52. package/dist/components/IconButton/IconButton.cjs.map +1 -0
  53. package/dist/components/IconButton/IconButton.d.cts +11 -0
  54. package/dist/components/IconButton/IconButton.d.mts +11 -0
  55. package/dist/components/IconButton/IconButton.mjs +17 -0
  56. package/dist/components/IconButton/IconButton.mjs.map +1 -0
  57. package/dist/components/IconButton/icon-button-classes.cjs +16 -0
  58. package/dist/components/IconButton/icon-button-classes.cjs.map +1 -0
  59. package/dist/components/IconButton/icon-button-classes.d.cts +9 -0
  60. package/dist/components/IconButton/icon-button-classes.d.mts +9 -0
  61. package/dist/components/IconButton/icon-button-classes.mjs +16 -0
  62. package/dist/components/IconButton/icon-button-classes.mjs.map +1 -0
  63. package/dist/components/IconButton/index.cjs +4 -0
  64. package/dist/components/IconButton/index.d.cts +3 -0
  65. package/dist/components/IconButton/index.d.mts +3 -0
  66. package/dist/components/IconButton/index.mjs +3 -0
  67. package/dist/components/Link/Link.cjs +27 -0
  68. package/dist/components/Link/Link.cjs.map +1 -0
  69. package/dist/components/Link/Link.d.cts +19 -0
  70. package/dist/components/Link/Link.d.mts +19 -0
  71. package/dist/components/Link/Link.mjs +27 -0
  72. package/dist/components/Link/Link.mjs.map +1 -0
  73. package/dist/components/Link/index.cjs +4 -0
  74. package/dist/components/Link/index.d.cts +3 -0
  75. package/dist/components/Link/index.d.mts +3 -0
  76. package/dist/components/Link/index.mjs +3 -0
  77. package/dist/components/Link/link-classes.cjs +11 -0
  78. package/dist/components/Link/link-classes.cjs.map +1 -0
  79. package/dist/components/Link/link-classes.d.cts +7 -0
  80. package/dist/components/Link/link-classes.d.mts +7 -0
  81. package/dist/components/Link/link-classes.mjs +11 -0
  82. package/dist/components/Link/link-classes.mjs.map +1 -0
  83. package/dist/components/Logo/Logo.cjs +25 -0
  84. package/dist/components/Logo/Logo.cjs.map +1 -0
  85. package/dist/components/Logo/Logo.d.cts +12 -0
  86. package/dist/components/Logo/Logo.d.mts +12 -0
  87. package/dist/components/Logo/Logo.mjs +25 -0
  88. package/dist/components/Logo/Logo.mjs.map +1 -0
  89. package/dist/components/Logo/index.cjs +2 -0
  90. package/dist/components/Logo/index.mjs +1 -0
  91. package/dist/components/Panel/Panel.cjs +14 -0
  92. package/dist/components/Panel/Panel.cjs.map +1 -0
  93. package/dist/components/Panel/Panel.d.cts +9 -0
  94. package/dist/components/Panel/Panel.d.mts +9 -0
  95. package/dist/components/Panel/Panel.mjs +14 -0
  96. package/dist/components/Panel/Panel.mjs.map +1 -0
  97. package/dist/components/Panel/index.cjs +4 -0
  98. package/dist/components/Panel/index.d.cts +3 -0
  99. package/dist/components/Panel/index.d.mts +3 -0
  100. package/dist/components/Panel/index.mjs +3 -0
  101. package/dist/components/Panel/panel-classes.cjs +16 -0
  102. package/dist/components/Panel/panel-classes.cjs.map +1 -0
  103. package/dist/components/Panel/panel-classes.d.cts +9 -0
  104. package/dist/components/Panel/panel-classes.d.mts +9 -0
  105. package/dist/components/Panel/panel-classes.mjs +16 -0
  106. package/dist/components/Panel/panel-classes.mjs.map +1 -0
  107. package/dist/components/ThemeToggle/ThemeToggle.cjs +34 -0
  108. package/dist/components/ThemeToggle/ThemeToggle.cjs.map +1 -0
  109. package/dist/components/ThemeToggle/ThemeToggle.d.cts +6 -0
  110. package/dist/components/ThemeToggle/ThemeToggle.d.mts +6 -0
  111. package/dist/components/ThemeToggle/ThemeToggle.mjs +34 -0
  112. package/dist/components/ThemeToggle/ThemeToggle.mjs.map +1 -0
  113. package/dist/components/ThemeToggle/index.cjs +2 -0
  114. package/dist/components/ThemeToggle/index.mjs +1 -0
  115. package/dist/gallery/HomeButton/HomeButton.cjs +20 -0
  116. package/dist/gallery/HomeButton/HomeButton.cjs.map +1 -0
  117. package/dist/gallery/HomeButton/HomeButton.d.cts +8 -0
  118. package/dist/gallery/HomeButton/HomeButton.d.mts +8 -0
  119. package/dist/gallery/HomeButton/HomeButton.mjs +20 -0
  120. package/dist/gallery/HomeButton/HomeButton.mjs.map +1 -0
  121. package/dist/gallery/HomeButton/index.cjs +2 -0
  122. package/dist/gallery/HomeButton/index.mjs +1 -0
  123. package/dist/gallery/LoadingScreen/LoadingScreen.cjs +108 -0
  124. package/dist/gallery/LoadingScreen/LoadingScreen.cjs.map +1 -0
  125. package/dist/gallery/LoadingScreen/LoadingScreen.d.cts +31 -0
  126. package/dist/gallery/LoadingScreen/LoadingScreen.d.mts +31 -0
  127. package/dist/gallery/LoadingScreen/LoadingScreen.mjs +108 -0
  128. package/dist/gallery/LoadingScreen/LoadingScreen.mjs.map +1 -0
  129. package/dist/gallery/LoadingScreen/index.cjs +2 -0
  130. package/dist/gallery/LoadingScreen/index.mjs +1 -0
  131. package/dist/gallery/SetupNotice/SetupNotice.cjs +41 -0
  132. package/dist/gallery/SetupNotice/SetupNotice.cjs.map +1 -0
  133. package/dist/gallery/SetupNotice/SetupNotice.d.cts +9 -0
  134. package/dist/gallery/SetupNotice/SetupNotice.d.mts +9 -0
  135. package/dist/gallery/SetupNotice/SetupNotice.mjs +41 -0
  136. package/dist/gallery/SetupNotice/SetupNotice.mjs.map +1 -0
  137. package/dist/gallery/SetupNotice/index.cjs +2 -0
  138. package/dist/gallery/SetupNotice/index.mjs +1 -0
  139. package/dist/gallery.cjs +10 -0
  140. package/dist/gallery.d.cts +4 -0
  141. package/dist/gallery.d.mts +4 -0
  142. package/dist/gallery.mjs +7 -0
  143. package/dist/index.cjs +37 -0
  144. package/dist/index.d.cts +21 -0
  145. package/dist/index.d.mts +21 -0
  146. package/dist/index.mjs +23 -0
  147. package/dist/lib/cn.cjs +5 -0
  148. package/dist/lib/cn.cjs.map +1 -0
  149. package/dist/lib/cn.mjs +5 -0
  150. package/dist/lib/cn.mjs.map +1 -0
  151. package/dist/scenography.css +332 -0
  152. package/dist/styles.css +76 -0
  153. package/package.json +73 -4
@@ -0,0 +1,20 @@
1
+ let react_jsx_runtime = require("react/jsx-runtime");
2
+ let lucide_react = require("lucide-react");
3
+ // src/gallery/HomeButton/HomeButton.tsx
4
+ const HomeButton = ({ href, label = "Grupo Yo-Yo" }) => {
5
+ const stop = (event) => event.stopPropagation();
6
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
7
+ href,
8
+ onPointerDown: stop,
9
+ onTouchStart: stop,
10
+ "aria-label": `Volver a ${label}`,
11
+ className: "fixed left-4 top-4 z-[9999] flex items-center gap-2 border border-base-content/12 bg-base-100/85 px-3 py-2 font-mono text-[0.65rem] uppercase tracking-[0.18em] text-base-content/60 backdrop-blur-md transition-colors [touch-action:manipulation] hover:text-base-content",
12
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowLeft, { className: "size-3.5" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13
+ className: "hidden sm:inline",
14
+ children: label
15
+ })]
16
+ });
17
+ };
18
+ exports.HomeButton = HomeButton;
19
+
20
+ //# sourceMappingURL=HomeButton.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomeButton.cjs","names":["ArrowLeft"],"sources":["../../../src/gallery/HomeButton/HomeButton.tsx"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\n\nexport type HomeButtonProps = {\n href: string;\n /** Group name shown next to the arrow. */\n label?: string;\n};\n\nexport const HomeButton = ({ href, label = \"Grupo Yo-Yo\" }: HomeButtonProps) => {\n const stop = (event: SyntheticEvent) => event.stopPropagation();\n\n return (\n <a\n href={href}\n onPointerDown={stop}\n onTouchStart={stop}\n aria-label={`Volver a ${label}`}\n className=\"fixed left-4 top-4 z-[9999] flex items-center gap-2 border border-base-content/12 bg-base-100/85 px-3 py-2 font-mono text-[0.65rem] uppercase tracking-[0.18em] text-base-content/60 backdrop-blur-md transition-colors [touch-action:manipulation] hover:text-base-content\"\n >\n <ArrowLeft className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">{label}</span>\n </a>\n );\n};\n"],"mappings":";;;AASA,MAAa,cAAc,EAAE,MAAM,QAAQ,oBAAqC;CAC9E,MAAM,QAAQ,UAA0B,MAAM,gBAAgB;CAE9D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;EACQ;EACN,eAAe;EACf,cAAc;EACd,cAAY,YAAY;EACxB,WAAU;EALZ,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAACA,aAAAA,WAAD,EAAW,WAAU,WAAY,CAAA,GACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GAAoB,UAAA;EAAY,CAAA,CAC/C;;AAEP"}
@@ -0,0 +1,8 @@
1
+ type HomeButtonProps = {
2
+ href: string;
3
+ /** Group name shown next to the arrow. */
4
+ label?: string;
5
+ };
6
+ declare const HomeButton: ({ href, label }: HomeButtonProps) => import("react").JSX.Element;
7
+ export { HomeButton, HomeButtonProps };
8
+ //# sourceMappingURL=HomeButton.d.cts.map
@@ -0,0 +1,8 @@
1
+ type HomeButtonProps = {
2
+ href: string;
3
+ /** Group name shown next to the arrow. */
4
+ label?: string;
5
+ };
6
+ declare const HomeButton: ({ href, label }: HomeButtonProps) => import("react").JSX.Element;
7
+ export { HomeButton, HomeButtonProps };
8
+ //# sourceMappingURL=HomeButton.d.mts.map
@@ -0,0 +1,20 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { ArrowLeft } from "lucide-react";
3
+ // src/gallery/HomeButton/HomeButton.tsx
4
+ const HomeButton = ({ href, label = "Grupo Yo-Yo" }) => {
5
+ const stop = (event) => event.stopPropagation();
6
+ return /* @__PURE__ */ jsxs("a", {
7
+ href,
8
+ onPointerDown: stop,
9
+ onTouchStart: stop,
10
+ "aria-label": `Volver a ${label}`,
11
+ className: "fixed left-4 top-4 z-[9999] flex items-center gap-2 border border-base-content/12 bg-base-100/85 px-3 py-2 font-mono text-[0.65rem] uppercase tracking-[0.18em] text-base-content/60 backdrop-blur-md transition-colors [touch-action:manipulation] hover:text-base-content",
12
+ children: [/* @__PURE__ */ jsx(ArrowLeft, { className: "size-3.5" }), /* @__PURE__ */ jsx("span", {
13
+ className: "hidden sm:inline",
14
+ children: label
15
+ })]
16
+ });
17
+ };
18
+ export { HomeButton };
19
+
20
+ //# sourceMappingURL=HomeButton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomeButton.mjs","names":[],"sources":["../../../src/gallery/HomeButton/HomeButton.tsx"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\n\nexport type HomeButtonProps = {\n href: string;\n /** Group name shown next to the arrow. */\n label?: string;\n};\n\nexport const HomeButton = ({ href, label = \"Grupo Yo-Yo\" }: HomeButtonProps) => {\n const stop = (event: SyntheticEvent) => event.stopPropagation();\n\n return (\n <a\n href={href}\n onPointerDown={stop}\n onTouchStart={stop}\n aria-label={`Volver a ${label}`}\n className=\"fixed left-4 top-4 z-[9999] flex items-center gap-2 border border-base-content/12 bg-base-100/85 px-3 py-2 font-mono text-[0.65rem] uppercase tracking-[0.18em] text-base-content/60 backdrop-blur-md transition-colors [touch-action:manipulation] hover:text-base-content\"\n >\n <ArrowLeft className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">{label}</span>\n </a>\n );\n};\n"],"mappings":";;;AASA,MAAa,cAAc,EAAE,MAAM,QAAQ,oBAAqC;CAC9E,MAAM,QAAQ,UAA0B,MAAM,gBAAgB;CAE9D,OACE,qBAAC,KAAD;EACQ;EACN,eAAe;EACf,cAAc;EACd,cAAY,YAAY;EACxB,WAAU;EALZ,UAAA,CAOE,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA,GACjC,oBAAC,QAAD;GAAM,WAAU;GAAoB,UAAA;EAAY,CAAA,CAC/C;;AAEP"}
@@ -0,0 +1,2 @@
1
+ const require_HomeButton = require("./HomeButton.cjs");
2
+ exports.HomeButton = require_HomeButton.HomeButton;
@@ -0,0 +1 @@
1
+ export { HomeButton } from "./HomeButton.mjs";
@@ -0,0 +1,108 @@
1
+ const require_Button = require("../../components/Button/Button.cjs");
2
+ require("../../components/Button/index.cjs");
3
+ const require_Eyebrow = require("../../components/Eyebrow/Eyebrow.cjs");
4
+ require("../../components/Eyebrow/index.cjs");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ let lucide_react = require("lucide-react");
7
+ let react = require("react");
8
+ // src/gallery/LoadingScreen/LoadingScreen.tsx
9
+ const EMPTY = {
10
+ loaded: 0,
11
+ total: 0,
12
+ done: false
13
+ };
14
+ const LoadingScreen = ({ gallery, eyebrow = "Sol Úbeda", title, label, enterLabel, hint, onEnter, fadeDuration = 600 }) => {
15
+ const [state, setState] = (0, react.useState)(EMPTY);
16
+ const [entered, setEntered] = (0, react.useState)(false);
17
+ const [gone, setGone] = (0, react.useState)(false);
18
+ const timer = (0, react.useRef)(null);
19
+ (0, react.useEffect)(() => {
20
+ if (!gallery) return;
21
+ return gallery.loading.subscribe(setState);
22
+ }, [gallery]);
23
+ (0, react.useEffect)(() => () => {
24
+ if (timer.current !== null) window.clearTimeout(timer.current);
25
+ }, []);
26
+ const enter = (0, react.useCallback)(() => {
27
+ if (entered) return;
28
+ if (window.matchMedia("(pointer: coarse)").matches) try {
29
+ const fullscreen = document.documentElement.requestFullscreen?.();
30
+ const orientation = screen.orientation;
31
+ if (fullscreen) fullscreen.then(() => orientation?.lock?.("landscape")).catch(() => void 0);
32
+ } catch {}
33
+ onEnter?.();
34
+ setEntered(true);
35
+ timer.current = window.setTimeout(() => setGone(true), fadeDuration);
36
+ }, [
37
+ entered,
38
+ fadeDuration,
39
+ onEnter
40
+ ]);
41
+ if (gone) return null;
42
+ const ready = gallery !== null && state.done;
43
+ const progress = state.total > 0 ? state.loaded / state.total : 0;
44
+ const percent = Math.round(progress * 100);
45
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
46
+ role: "dialog",
47
+ "aria-modal": "true",
48
+ "aria-label": title,
49
+ className: "fixed inset-0 z-[10000] flex flex-col overflow-y-auto bg-base-100 text-base-content",
50
+ style: {
51
+ opacity: entered ? 0 : 1,
52
+ pointerEvents: entered ? "none" : "auto",
53
+ transition: `opacity ${fadeDuration}ms ease`
54
+ },
55
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("main", {
56
+ className: "flex flex-1 flex-col items-center justify-center px-6 py-16",
57
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58
+ className: "w-full max-w-xl text-center",
59
+ children: [
60
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Eyebrow.Eyebrow, { children: eyebrow }),
61
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
62
+ className: "mt-6 text-5xl font-semibold leading-[0.94] tracking-[-0.045em] text-balance sm:text-6xl",
63
+ children: title
64
+ }),
65
+ ready ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Button.Button, {
66
+ onClick: enter,
67
+ onPointerUp: enter,
68
+ className: "group mt-10",
69
+ children: [enterLabel, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowUpRight, { className: "size-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5" })]
70
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
71
+ className: "mx-auto mt-10 w-full max-w-sm",
72
+ children: [
73
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
74
+ className: "text-sm text-base-content/60",
75
+ children: label
76
+ }),
77
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
78
+ role: "progressbar",
79
+ "aria-valuemin": 0,
80
+ "aria-valuemax": 100,
81
+ "aria-valuenow": percent,
82
+ "aria-label": label,
83
+ className: "mt-3 h-0.5 w-full bg-base-content/15",
84
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
85
+ className: "h-full bg-primary transition-[width] duration-200",
86
+ style: { width: `${percent}%` }
87
+ })
88
+ }),
89
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
90
+ className: "mt-2 font-mono text-xs tabular-nums text-base-content/60",
91
+ children: [percent, " %"]
92
+ })
93
+ ]
94
+ })
95
+ ]
96
+ })
97
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("footer", {
98
+ className: "border-t border-base-content/12 px-6 py-4",
99
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
100
+ className: "mx-auto flex max-w-3xl items-center justify-center gap-2 text-center font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content/60",
101
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Maximize, { className: "size-3.5 shrink-0" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: hint })]
102
+ })
103
+ })]
104
+ });
105
+ };
106
+ exports.LoadingScreen = LoadingScreen;
107
+
108
+ //# sourceMappingURL=LoadingScreen.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingScreen.cjs","names":["useState","useRef","useCallback","Eyebrow","Button","ArrowUpRight","Maximize"],"sources":["../../../src/gallery/LoadingScreen/LoadingScreen.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ArrowUpRight, Maximize } from \"lucide-react\";\nimport { Button } from \"../../components/Button\";\nimport { Eyebrow } from \"../../components/Eyebrow\";\n\nexport type LoadingState = {\n loaded: number;\n total: number;\n done: boolean;\n};\n\nexport type LoadingGallery = {\n loading: {\n subscribe: (listener: (state: LoadingState) => void) => () => void;\n };\n};\n\nexport type LoadingScreenProps = {\n /** The live gallery, or null until the gallery is ready. */\n gallery: LoadingGallery | null;\n /** Artist name shown above the title. */\n eyebrow?: string;\n /** Room title. */\n title: string;\n /** Text while the assets load. */\n label: string;\n /** Button label once everything is ready. */\n enterLabel: string;\n /** Hint shown while loading and once ready. */\n hint: string;\n /** Called when the visitor enters, before the fade starts. */\n onEnter?: () => void;\n /** Fade duration in ms. */\n fadeDuration?: number;\n};\n\nconst EMPTY: LoadingState = { loaded: 0, total: 0, done: false };\n\nexport const LoadingScreen = ({\n gallery,\n eyebrow = \"Sol Úbeda\",\n title,\n label,\n enterLabel,\n hint,\n onEnter,\n fadeDuration = 600,\n}: LoadingScreenProps) => {\n const [state, setState] = useState(EMPTY);\n const [entered, setEntered] = useState(false);\n const [gone, setGone] = useState(false);\n const timer = useRef<number | null>(null);\n\n useEffect(() => {\n if (!gallery) return;\n return gallery.loading.subscribe(setState);\n }, [gallery]);\n\n useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n [],\n );\n\n const enter = useCallback(() => {\n if (entered) return;\n if (window.matchMedia(\"(pointer: coarse)\").matches) {\n try {\n const fullscreen = document.documentElement.requestFullscreen?.();\n const orientation = screen.orientation as unknown as {\n lock?: (orientation: string) => Promise<void>;\n };\n if (fullscreen) {\n fullscreen.then(() => orientation?.lock?.(\"landscape\")).catch(() => undefined);\n }\n } catch {\n // Without fullscreen or lock the room still works.\n }\n }\n onEnter?.();\n setEntered(true);\n timer.current = window.setTimeout(() => setGone(true), fadeDuration);\n }, [entered, fadeDuration, onEnter]);\n\n if (gone) return null;\n\n const ready = gallery !== null && state.done;\n const progress = state.total > 0 ? state.loaded / state.total : 0;\n const percent = Math.round(progress * 100);\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n className=\"fixed inset-0 z-[10000] flex flex-col overflow-y-auto bg-base-100 text-base-content\"\n style={{\n opacity: entered ? 0 : 1,\n pointerEvents: entered ? \"none\" : \"auto\",\n transition: `opacity ${fadeDuration}ms ease`,\n }}\n >\n <main className=\"flex flex-1 flex-col items-center justify-center px-6 py-16\">\n <div className=\"w-full max-w-xl text-center\">\n <Eyebrow>{eyebrow}</Eyebrow>\n <h1 className=\"mt-6 text-5xl font-semibold leading-[0.94] tracking-[-0.045em] text-balance sm:text-6xl\">\n {title}\n </h1>\n\n {ready ? (\n <Button onClick={enter} onPointerUp={enter} className=\"group mt-10\">\n {enterLabel}\n <ArrowUpRight className=\"size-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5\" />\n </Button>\n ) : (\n <div className=\"mx-auto mt-10 w-full max-w-sm\">\n <p className=\"text-sm text-base-content/60\">{label}</p>\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label={label}\n className=\"mt-3 h-0.5 w-full bg-base-content/15\"\n >\n <div\n className=\"h-full bg-primary transition-[width] duration-200\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <p className=\"mt-2 font-mono text-xs tabular-nums text-base-content/60\">\n {percent} %\n </p>\n </div>\n )}\n </div>\n </main>\n\n <footer className=\"border-t border-base-content/12 px-6 py-4\">\n <p className=\"mx-auto flex max-w-3xl items-center justify-center gap-2 text-center font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content/60\">\n <Maximize className=\"size-3.5 shrink-0\" />\n <span>{hint}</span>\n </p>\n </footer>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ type LoadingState = {
2
+ loaded: number;
3
+ total: number;
4
+ done: boolean;
5
+ };
6
+ type LoadingGallery = {
7
+ loading: {
8
+ subscribe: (listener: (state: LoadingState) => void) => () => void;
9
+ };
10
+ };
11
+ type LoadingScreenProps = {
12
+ /** The live gallery, or null until the gallery is ready. */
13
+ gallery: LoadingGallery | null;
14
+ /** Artist name shown above the title. */
15
+ eyebrow?: string;
16
+ /** Room title. */
17
+ title: string;
18
+ /** Text while the assets load. */
19
+ label: string;
20
+ /** Button label once everything is ready. */
21
+ enterLabel: string;
22
+ /** Hint shown while loading and once ready. */
23
+ hint: string;
24
+ /** Called when the visitor enters, before the fade starts. */
25
+ onEnter?: () => void;
26
+ /** Fade duration in ms. */
27
+ fadeDuration?: number;
28
+ };
29
+ declare const LoadingScreen: ({ gallery, eyebrow, title, label, enterLabel, hint, onEnter, fadeDuration }: LoadingScreenProps) => import("react").JSX.Element | null;
30
+ export { LoadingGallery, LoadingScreen, LoadingScreenProps, LoadingState };
31
+ //# sourceMappingURL=LoadingScreen.d.cts.map
@@ -0,0 +1,31 @@
1
+ type LoadingState = {
2
+ loaded: number;
3
+ total: number;
4
+ done: boolean;
5
+ };
6
+ type LoadingGallery = {
7
+ loading: {
8
+ subscribe: (listener: (state: LoadingState) => void) => () => void;
9
+ };
10
+ };
11
+ type LoadingScreenProps = {
12
+ /** The live gallery, or null until the gallery is ready. */
13
+ gallery: LoadingGallery | null;
14
+ /** Artist name shown above the title. */
15
+ eyebrow?: string;
16
+ /** Room title. */
17
+ title: string;
18
+ /** Text while the assets load. */
19
+ label: string;
20
+ /** Button label once everything is ready. */
21
+ enterLabel: string;
22
+ /** Hint shown while loading and once ready. */
23
+ hint: string;
24
+ /** Called when the visitor enters, before the fade starts. */
25
+ onEnter?: () => void;
26
+ /** Fade duration in ms. */
27
+ fadeDuration?: number;
28
+ };
29
+ declare const LoadingScreen: ({ gallery, eyebrow, title, label, enterLabel, hint, onEnter, fadeDuration }: LoadingScreenProps) => import("react").JSX.Element | null;
30
+ export { LoadingGallery, LoadingScreen, LoadingScreenProps, LoadingState };
31
+ //# sourceMappingURL=LoadingScreen.d.mts.map
@@ -0,0 +1,108 @@
1
+ import { Button } from "../../components/Button/Button.mjs";
2
+ import "../../components/Button/index.mjs";
3
+ import { Eyebrow } from "../../components/Eyebrow/Eyebrow.mjs";
4
+ import "../../components/Eyebrow/index.mjs";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { ArrowUpRight, Maximize } from "lucide-react";
7
+ import { useCallback, useEffect, useRef, useState } from "react";
8
+ // src/gallery/LoadingScreen/LoadingScreen.tsx
9
+ const EMPTY = {
10
+ loaded: 0,
11
+ total: 0,
12
+ done: false
13
+ };
14
+ const LoadingScreen = ({ gallery, eyebrow = "Sol Úbeda", title, label, enterLabel, hint, onEnter, fadeDuration = 600 }) => {
15
+ const [state, setState] = useState(EMPTY);
16
+ const [entered, setEntered] = useState(false);
17
+ const [gone, setGone] = useState(false);
18
+ const timer = useRef(null);
19
+ useEffect(() => {
20
+ if (!gallery) return;
21
+ return gallery.loading.subscribe(setState);
22
+ }, [gallery]);
23
+ useEffect(() => () => {
24
+ if (timer.current !== null) window.clearTimeout(timer.current);
25
+ }, []);
26
+ const enter = useCallback(() => {
27
+ if (entered) return;
28
+ if (window.matchMedia("(pointer: coarse)").matches) try {
29
+ const fullscreen = document.documentElement.requestFullscreen?.();
30
+ const orientation = screen.orientation;
31
+ if (fullscreen) fullscreen.then(() => orientation?.lock?.("landscape")).catch(() => void 0);
32
+ } catch {}
33
+ onEnter?.();
34
+ setEntered(true);
35
+ timer.current = window.setTimeout(() => setGone(true), fadeDuration);
36
+ }, [
37
+ entered,
38
+ fadeDuration,
39
+ onEnter
40
+ ]);
41
+ if (gone) return null;
42
+ const ready = gallery !== null && state.done;
43
+ const progress = state.total > 0 ? state.loaded / state.total : 0;
44
+ const percent = Math.round(progress * 100);
45
+ return /* @__PURE__ */ jsxs("div", {
46
+ role: "dialog",
47
+ "aria-modal": "true",
48
+ "aria-label": title,
49
+ className: "fixed inset-0 z-[10000] flex flex-col overflow-y-auto bg-base-100 text-base-content",
50
+ style: {
51
+ opacity: entered ? 0 : 1,
52
+ pointerEvents: entered ? "none" : "auto",
53
+ transition: `opacity ${fadeDuration}ms ease`
54
+ },
55
+ children: [/* @__PURE__ */ jsx("main", {
56
+ className: "flex flex-1 flex-col items-center justify-center px-6 py-16",
57
+ children: /* @__PURE__ */ jsxs("div", {
58
+ className: "w-full max-w-xl text-center",
59
+ children: [
60
+ /* @__PURE__ */ jsx(Eyebrow, { children: eyebrow }),
61
+ /* @__PURE__ */ jsx("h1", {
62
+ className: "mt-6 text-5xl font-semibold leading-[0.94] tracking-[-0.045em] text-balance sm:text-6xl",
63
+ children: title
64
+ }),
65
+ ready ? /* @__PURE__ */ jsxs(Button, {
66
+ onClick: enter,
67
+ onPointerUp: enter,
68
+ className: "group mt-10",
69
+ children: [enterLabel, /* @__PURE__ */ jsx(ArrowUpRight, { className: "size-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5" })]
70
+ }) : /* @__PURE__ */ jsxs("div", {
71
+ className: "mx-auto mt-10 w-full max-w-sm",
72
+ children: [
73
+ /* @__PURE__ */ jsx("p", {
74
+ className: "text-sm text-base-content/60",
75
+ children: label
76
+ }),
77
+ /* @__PURE__ */ jsx("div", {
78
+ role: "progressbar",
79
+ "aria-valuemin": 0,
80
+ "aria-valuemax": 100,
81
+ "aria-valuenow": percent,
82
+ "aria-label": label,
83
+ className: "mt-3 h-0.5 w-full bg-base-content/15",
84
+ children: /* @__PURE__ */ jsx("div", {
85
+ className: "h-full bg-primary transition-[width] duration-200",
86
+ style: { width: `${percent}%` }
87
+ })
88
+ }),
89
+ /* @__PURE__ */ jsxs("p", {
90
+ className: "mt-2 font-mono text-xs tabular-nums text-base-content/60",
91
+ children: [percent, " %"]
92
+ })
93
+ ]
94
+ })
95
+ ]
96
+ })
97
+ }), /* @__PURE__ */ jsx("footer", {
98
+ className: "border-t border-base-content/12 px-6 py-4",
99
+ children: /* @__PURE__ */ jsxs("p", {
100
+ className: "mx-auto flex max-w-3xl items-center justify-center gap-2 text-center font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content/60",
101
+ children: [/* @__PURE__ */ jsx(Maximize, { className: "size-3.5 shrink-0" }), /* @__PURE__ */ jsx("span", { children: hint })]
102
+ })
103
+ })]
104
+ });
105
+ };
106
+ export { LoadingScreen };
107
+
108
+ //# sourceMappingURL=LoadingScreen.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingScreen.mjs","names":[],"sources":["../../../src/gallery/LoadingScreen/LoadingScreen.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ArrowUpRight, Maximize } from \"lucide-react\";\nimport { Button } from \"../../components/Button\";\nimport { Eyebrow } from \"../../components/Eyebrow\";\n\nexport type LoadingState = {\n loaded: number;\n total: number;\n done: boolean;\n};\n\nexport type LoadingGallery = {\n loading: {\n subscribe: (listener: (state: LoadingState) => void) => () => void;\n };\n};\n\nexport type LoadingScreenProps = {\n /** The live gallery, or null until the gallery is ready. */\n gallery: LoadingGallery | null;\n /** Artist name shown above the title. */\n eyebrow?: string;\n /** Room title. */\n title: string;\n /** Text while the assets load. */\n label: string;\n /** Button label once everything is ready. */\n enterLabel: string;\n /** Hint shown while loading and once ready. */\n hint: string;\n /** Called when the visitor enters, before the fade starts. */\n onEnter?: () => void;\n /** Fade duration in ms. */\n fadeDuration?: number;\n};\n\nconst EMPTY: LoadingState = { loaded: 0, total: 0, done: false };\n\nexport const LoadingScreen = ({\n gallery,\n eyebrow = \"Sol Úbeda\",\n title,\n label,\n enterLabel,\n hint,\n onEnter,\n fadeDuration = 600,\n}: LoadingScreenProps) => {\n const [state, setState] = useState(EMPTY);\n const [entered, setEntered] = useState(false);\n const [gone, setGone] = useState(false);\n const timer = useRef<number | null>(null);\n\n useEffect(() => {\n if (!gallery) return;\n return gallery.loading.subscribe(setState);\n }, [gallery]);\n\n useEffect(\n () => () => {\n if (timer.current !== null) window.clearTimeout(timer.current);\n },\n [],\n );\n\n const enter = useCallback(() => {\n if (entered) return;\n if (window.matchMedia(\"(pointer: coarse)\").matches) {\n try {\n const fullscreen = document.documentElement.requestFullscreen?.();\n const orientation = screen.orientation as unknown as {\n lock?: (orientation: string) => Promise<void>;\n };\n if (fullscreen) {\n fullscreen.then(() => orientation?.lock?.(\"landscape\")).catch(() => undefined);\n }\n } catch {\n // Without fullscreen or lock the room still works.\n }\n }\n onEnter?.();\n setEntered(true);\n timer.current = window.setTimeout(() => setGone(true), fadeDuration);\n }, [entered, fadeDuration, onEnter]);\n\n if (gone) return null;\n\n const ready = gallery !== null && state.done;\n const progress = state.total > 0 ? state.loaded / state.total : 0;\n const percent = Math.round(progress * 100);\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n className=\"fixed inset-0 z-[10000] flex flex-col overflow-y-auto bg-base-100 text-base-content\"\n style={{\n opacity: entered ? 0 : 1,\n pointerEvents: entered ? \"none\" : \"auto\",\n transition: `opacity ${fadeDuration}ms ease`,\n }}\n >\n <main className=\"flex flex-1 flex-col items-center justify-center px-6 py-16\">\n <div className=\"w-full max-w-xl text-center\">\n <Eyebrow>{eyebrow}</Eyebrow>\n <h1 className=\"mt-6 text-5xl font-semibold leading-[0.94] tracking-[-0.045em] text-balance sm:text-6xl\">\n {title}\n </h1>\n\n {ready ? (\n <Button onClick={enter} onPointerUp={enter} className=\"group mt-10\">\n {enterLabel}\n <ArrowUpRight className=\"size-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5\" />\n </Button>\n ) : (\n <div className=\"mx-auto mt-10 w-full max-w-sm\">\n <p className=\"text-sm text-base-content/60\">{label}</p>\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label={label}\n className=\"mt-3 h-0.5 w-full bg-base-content/15\"\n >\n <div\n className=\"h-full bg-primary transition-[width] duration-200\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <p className=\"mt-2 font-mono text-xs tabular-nums text-base-content/60\">\n {percent} %\n </p>\n </div>\n )}\n </div>\n </main>\n\n <footer className=\"border-t border-base-content/12 px-6 py-4\">\n <p className=\"mx-auto flex max-w-3xl items-center justify-center gap-2 text-center font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content/60\">\n <Maximize className=\"size-3.5 shrink-0\" />\n <span>{hint}</span>\n </p>\n </footer>\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAoCA,MAAM,QAAsB;CAAE,QAAQ;CAAG,OAAO;CAAG,MAAM;AAAM;AAE/D,MAAa,iBAAiB,EAC5B,SACA,UAAU,aACV,OACA,OACA,YACA,MACA,SACA,eAAe,UACS;CACxB,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK;CACxC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,QAAQ,OAAsB,IAAI;CAExC,gBAAgB;EACd,IAAI,CAAC,SAAS;EACd,OAAO,QAAQ,QAAQ,UAAU,QAAQ;CAC3C,GAAG,CAAC,OAAO,CAAC;CAEZ,sBACc;EACV,IAAI,MAAM,YAAY,MAAM,OAAO,aAAa,MAAM,OAAO;CAC/D,GACA,CAAC,CACH;CAEA,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,SAAS;EACb,IAAI,OAAO,WAAW,mBAAmB,CAAC,CAAC,SACzC,IAAI;GACF,MAAM,aAAa,SAAS,gBAAgB,oBAAoB;GAChE,MAAM,cAAc,OAAO;GAG3B,IAAI,YACF,WAAW,WAAW,aAAa,OAAO,WAAW,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;EAEjF,QAAQ,CAER;EAEF,UAAU;EACV,WAAW,IAAI;EACf,MAAM,UAAU,OAAO,iBAAiB,QAAQ,IAAI,GAAG,YAAY;CACrE,GAAG;EAAC;EAAS;EAAc;CAAO,CAAC;CAEnC,IAAI,MAAM,OAAO;CAEjB,MAAM,QAAQ,YAAY,QAAQ,MAAM;CACxC,MAAM,WAAW,MAAM,QAAQ,IAAI,MAAM,SAAS,MAAM,QAAQ;CAChE,MAAM,UAAU,KAAK,MAAM,WAAW,GAAG;CAEzC,OACE,qBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,cAAY;EACZ,WAAU;EACV,OAAO;GACL,SAAS,UAAU,IAAI;GACvB,eAAe,UAAU,SAAS;GAClC,YAAY,WAAW,aAAa;EACtC;EATF,UAAA,CAWE,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,SAAD,EAAA,UAAU,QAAiB,CAAA;KAC3B,oBAAC,MAAD;MAAI,WAAU;MACX,UAAA;KACC,CAAA;KAEH,QACC,qBAAC,QAAD;MAAQ,SAAS;MAAO,aAAa;MAAO,WAAU;MAAtD,UAAA,CACG,YACD,oBAAC,cAAD,EAAc,WAAU,oGAAqG,CAAA,CACvH;KAER,CAAA,IAAA,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,oBAAC,KAAD;QAAG,WAAU;QAAgC,UAAA;OAAS,CAAA;OACtD,oBAAC,OAAD;QACE,MAAK;QACL,iBAAe;QACf,iBAAe;QACf,iBAAe;QACf,cAAY;QACZ,WAAU;QAEV,UAAA,oBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG;QAC/B,CAAA;OACE,CAAA;OACL,qBAAC,KAAD;QAAG,WAAU;QAAb,UAAA,CACG,SAAQ,IACR;;MACA;;IAEJ;;EACD,CAAA,GAEN,oBAAC,UAAD;GAAQ,WAAU;GAChB,UAAA,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA,CACE,oBAAC,UAAD,EAAU,WAAU,oBAAqB,CAAA,GACzC,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,CACjB;;EACG,CAAA,CACL;;AAET"}
@@ -0,0 +1,2 @@
1
+ const require_LoadingScreen = require("./LoadingScreen.cjs");
2
+ exports.LoadingScreen = require_LoadingScreen.LoadingScreen;
@@ -0,0 +1 @@
1
+ export { LoadingScreen } from "./LoadingScreen.mjs";
@@ -0,0 +1,41 @@
1
+ const require_IconButton = require("../../components/IconButton/IconButton.cjs");
2
+ require("../../components/IconButton/index.cjs");
3
+ let react_jsx_runtime = require("react/jsx-runtime");
4
+ let lucide_react = require("lucide-react");
5
+ let react = require("react");
6
+ // src/gallery/SetupNotice/SetupNotice.tsx
7
+ const SetupNotice = ({ message = "Puedes recorrerla mientras la terminamos.", duration = 8e3 }) => {
8
+ const [open, setOpen] = (0, react.useState)(true);
9
+ (0, react.useEffect)(() => {
10
+ const timer = setTimeout(() => setOpen(false), duration);
11
+ return () => clearTimeout(timer);
12
+ }, [duration]);
13
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14
+ className: `pointer-events-none fixed inset-x-0 top-4 z-[9998] flex justify-center px-4 transition-all duration-500 ${open ? "translate-y-0 opacity-100" : "-translate-y-3 opacity-0"}`,
15
+ "aria-hidden": !open,
16
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
17
+ className: "pointer-events-auto flex max-w-[92vw] items-center gap-3 border border-base-content/12 bg-base-100/85 py-2 pl-3 pr-2 text-sm backdrop-blur-md",
18
+ children: [
19
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
20
+ className: "font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content",
21
+ children: "Sala en montaje"
22
+ }),
23
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
24
+ className: "text-base-content/60",
25
+ children: message
26
+ }),
27
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_IconButton.IconButton, {
28
+ label: "Cerrar aviso",
29
+ variant: "ghost",
30
+ size: "xs",
31
+ onClick: () => setOpen(false),
32
+ className: "ml-1",
33
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.X, { className: "size-3.5" })
34
+ })
35
+ ]
36
+ })
37
+ });
38
+ };
39
+ exports.SetupNotice = SetupNotice;
40
+
41
+ //# sourceMappingURL=SetupNotice.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupNotice.cjs","names":["useState","IconButton","X"],"sources":["../../../src/gallery/SetupNotice/SetupNotice.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { X } from \"lucide-react\";\nimport { IconButton } from \"../../components/IconButton\";\n\nexport type SetupNoticeProps = {\n /** Message shown next to the status label. */\n message?: string;\n /** Time in ms before the notice fades on its own. */\n duration?: number;\n};\n\nexport const SetupNotice = ({\n message = \"Puedes recorrerla mientras la terminamos.\",\n duration = 8000,\n}: SetupNoticeProps) => {\n const [open, setOpen] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => setOpen(false), duration);\n return () => clearTimeout(timer);\n }, [duration]);\n\n return (\n <div\n className={`pointer-events-none fixed inset-x-0 top-4 z-[9998] flex justify-center px-4 transition-all duration-500 ${\n open ? \"translate-y-0 opacity-100\" : \"-translate-y-3 opacity-0\"\n }`}\n aria-hidden={!open}\n >\n <div className=\"pointer-events-auto flex max-w-[92vw] items-center gap-3 border border-base-content/12 bg-base-100/85 py-2 pl-3 pr-2 text-sm backdrop-blur-md\">\n <span className=\"font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content\">\n Sala en montaje\n </span>\n <span className=\"text-base-content/60\">{message}</span>\n <IconButton\n label=\"Cerrar aviso\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => setOpen(false)}\n className=\"ml-1\"\n >\n <X className=\"size-3.5\" />\n </IconButton>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,MAAa,eAAe,EAC1B,UAAU,6CACV,WAAW,UACW;CACtB,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,IAAI;CAErC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,QAAQ,iBAAiB,QAAQ,KAAK,GAAG,QAAQ;EACvD,aAAa,aAAa,KAAK;CACjC,GAAG,CAAC,QAAQ,CAAC;CAEb,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAW,2GACT,OAAO,8BAA8B;EAEvC,eAAa,CAAC;EAEd,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;KAAyE,UAAA;IAEnF,CAAA;IACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;KAAwB,UAAA;IAAc,CAAA;IACtD,iBAAA,GAAA,kBAAA,IAAA,CAACC,mBAAAA,YAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAK;KACL,eAAe,QAAQ,KAAK;KAC5B,WAAU;KAEV,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,GAAD,EAAG,WAAU,WAAY,CAAA;IACf,CAAA;GACT;;CACF,CAAA;AAET"}
@@ -0,0 +1,9 @@
1
+ type SetupNoticeProps = {
2
+ /** Message shown next to the status label. */
3
+ message?: string;
4
+ /** Time in ms before the notice fades on its own. */
5
+ duration?: number;
6
+ };
7
+ declare const SetupNotice: ({ message, duration }: SetupNoticeProps) => import("react").JSX.Element;
8
+ export { SetupNotice, SetupNoticeProps };
9
+ //# sourceMappingURL=SetupNotice.d.cts.map
@@ -0,0 +1,9 @@
1
+ type SetupNoticeProps = {
2
+ /** Message shown next to the status label. */
3
+ message?: string;
4
+ /** Time in ms before the notice fades on its own. */
5
+ duration?: number;
6
+ };
7
+ declare const SetupNotice: ({ message, duration }: SetupNoticeProps) => import("react").JSX.Element;
8
+ export { SetupNotice, SetupNoticeProps };
9
+ //# sourceMappingURL=SetupNotice.d.mts.map
@@ -0,0 +1,41 @@
1
+ import { IconButton } from "../../components/IconButton/IconButton.mjs";
2
+ import "../../components/IconButton/index.mjs";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { X } from "lucide-react";
5
+ import { useEffect, useState } from "react";
6
+ // src/gallery/SetupNotice/SetupNotice.tsx
7
+ const SetupNotice = ({ message = "Puedes recorrerla mientras la terminamos.", duration = 8e3 }) => {
8
+ const [open, setOpen] = useState(true);
9
+ useEffect(() => {
10
+ const timer = setTimeout(() => setOpen(false), duration);
11
+ return () => clearTimeout(timer);
12
+ }, [duration]);
13
+ return /* @__PURE__ */ jsx("div", {
14
+ className: `pointer-events-none fixed inset-x-0 top-4 z-[9998] flex justify-center px-4 transition-all duration-500 ${open ? "translate-y-0 opacity-100" : "-translate-y-3 opacity-0"}`,
15
+ "aria-hidden": !open,
16
+ children: /* @__PURE__ */ jsxs("div", {
17
+ className: "pointer-events-auto flex max-w-[92vw] items-center gap-3 border border-base-content/12 bg-base-100/85 py-2 pl-3 pr-2 text-sm backdrop-blur-md",
18
+ children: [
19
+ /* @__PURE__ */ jsx("span", {
20
+ className: "font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content",
21
+ children: "Sala en montaje"
22
+ }),
23
+ /* @__PURE__ */ jsx("span", {
24
+ className: "text-base-content/60",
25
+ children: message
26
+ }),
27
+ /* @__PURE__ */ jsx(IconButton, {
28
+ label: "Cerrar aviso",
29
+ variant: "ghost",
30
+ size: "xs",
31
+ onClick: () => setOpen(false),
32
+ className: "ml-1",
33
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
34
+ })
35
+ ]
36
+ })
37
+ });
38
+ };
39
+ export { SetupNotice };
40
+
41
+ //# sourceMappingURL=SetupNotice.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupNotice.mjs","names":[],"sources":["../../../src/gallery/SetupNotice/SetupNotice.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { X } from \"lucide-react\";\nimport { IconButton } from \"../../components/IconButton\";\n\nexport type SetupNoticeProps = {\n /** Message shown next to the status label. */\n message?: string;\n /** Time in ms before the notice fades on its own. */\n duration?: number;\n};\n\nexport const SetupNotice = ({\n message = \"Puedes recorrerla mientras la terminamos.\",\n duration = 8000,\n}: SetupNoticeProps) => {\n const [open, setOpen] = useState(true);\n\n useEffect(() => {\n const timer = setTimeout(() => setOpen(false), duration);\n return () => clearTimeout(timer);\n }, [duration]);\n\n return (\n <div\n className={`pointer-events-none fixed inset-x-0 top-4 z-[9998] flex justify-center px-4 transition-all duration-500 ${\n open ? \"translate-y-0 opacity-100\" : \"-translate-y-3 opacity-0\"\n }`}\n aria-hidden={!open}\n >\n <div className=\"pointer-events-auto flex max-w-[92vw] items-center gap-3 border border-base-content/12 bg-base-100/85 py-2 pl-3 pr-2 text-sm backdrop-blur-md\">\n <span className=\"font-mono text-[0.65rem] uppercase tracking-[0.16em] text-base-content\">\n Sala en montaje\n </span>\n <span className=\"text-base-content/60\">{message}</span>\n <IconButton\n label=\"Cerrar aviso\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => setOpen(false)}\n className=\"ml-1\"\n >\n <X className=\"size-3.5\" />\n </IconButton>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;AAWA,MAAa,eAAe,EAC1B,UAAU,6CACV,WAAW,UACW;CACtB,MAAM,CAAC,MAAM,WAAW,SAAS,IAAI;CAErC,gBAAgB;EACd,MAAM,QAAQ,iBAAiB,QAAQ,KAAK,GAAG,QAAQ;EACvD,aAAa,aAAa,KAAK;CACjC,GAAG,CAAC,QAAQ,CAAC;CAEb,OACE,oBAAC,OAAD;EACE,WAAW,2GACT,OAAO,8BAA8B;EAEvC,eAAa,CAAC;EAEd,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,QAAD;KAAM,WAAU;KAAyE,UAAA;IAEnF,CAAA;IACN,oBAAC,QAAD;KAAM,WAAU;KAAwB,UAAA;IAAc,CAAA;IACtD,oBAAC,YAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAK;KACL,eAAe,QAAQ,KAAK;KAC5B,WAAU;KAEV,UAAA,oBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;IACf,CAAA;GACT;;CACF,CAAA;AAET"}
@@ -0,0 +1,2 @@
1
+ const require_SetupNotice = require("./SetupNotice.cjs");
2
+ exports.SetupNotice = require_SetupNotice.SetupNotice;
@@ -0,0 +1 @@
1
+ export { SetupNotice } from "./SetupNotice.mjs";
@@ -0,0 +1,10 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_LoadingScreen = require("./gallery/LoadingScreen/LoadingScreen.cjs");
3
+ require("./gallery/LoadingScreen/index.cjs");
4
+ const require_HomeButton = require("./gallery/HomeButton/HomeButton.cjs");
5
+ require("./gallery/HomeButton/index.cjs");
6
+ const require_SetupNotice = require("./gallery/SetupNotice/SetupNotice.cjs");
7
+ require("./gallery/SetupNotice/index.cjs");
8
+ exports.HomeButton = require_HomeButton.HomeButton;
9
+ exports.LoadingScreen = require_LoadingScreen.LoadingScreen;
10
+ exports.SetupNotice = require_SetupNotice.SetupNotice;
@@ -0,0 +1,4 @@
1
+ import { LoadingGallery, LoadingScreen, LoadingScreenProps, LoadingState } from "./gallery/LoadingScreen/LoadingScreen.cjs";
2
+ import { HomeButton, HomeButtonProps } from "./gallery/HomeButton/HomeButton.cjs";
3
+ import { SetupNotice, SetupNoticeProps } from "./gallery/SetupNotice/SetupNotice.cjs";
4
+ export { HomeButton, type HomeButtonProps, type LoadingGallery, LoadingScreen, type LoadingScreenProps, type LoadingState, SetupNotice, type SetupNoticeProps };
@@ -0,0 +1,4 @@
1
+ import { LoadingGallery, LoadingScreen, LoadingScreenProps, LoadingState } from "./gallery/LoadingScreen/LoadingScreen.mjs";
2
+ import { HomeButton, HomeButtonProps } from "./gallery/HomeButton/HomeButton.mjs";
3
+ import { SetupNotice, SetupNoticeProps } from "./gallery/SetupNotice/SetupNotice.mjs";
4
+ export { HomeButton, type HomeButtonProps, type LoadingGallery, LoadingScreen, type LoadingScreenProps, type LoadingState, SetupNotice, type SetupNoticeProps };
@@ -0,0 +1,7 @@
1
+ import { LoadingScreen } from "./gallery/LoadingScreen/LoadingScreen.mjs";
2
+ import "./gallery/LoadingScreen/index.mjs";
3
+ import { HomeButton } from "./gallery/HomeButton/HomeButton.mjs";
4
+ import "./gallery/HomeButton/index.mjs";
5
+ import { SetupNotice } from "./gallery/SetupNotice/SetupNotice.mjs";
6
+ import "./gallery/SetupNotice/index.mjs";
7
+ export { HomeButton, LoadingScreen, SetupNotice };
package/dist/index.cjs ADDED
@@ -0,0 +1,37 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_badge_classes = require("./components/Badge/badge-classes.cjs");
3
+ const require_Badge = require("./components/Badge/Badge.cjs");
4
+ require("./components/Badge/index.cjs");
5
+ const require_button_classes = require("./components/Button/button-classes.cjs");
6
+ const require_Button = require("./components/Button/Button.cjs");
7
+ const require_ButtonLink = require("./components/Button/ButtonLink.cjs");
8
+ require("./components/Button/index.cjs");
9
+ const require_Eyebrow = require("./components/Eyebrow/Eyebrow.cjs");
10
+ require("./components/Eyebrow/index.cjs");
11
+ const require_icon_button_classes = require("./components/IconButton/icon-button-classes.cjs");
12
+ const require_IconButton = require("./components/IconButton/IconButton.cjs");
13
+ require("./components/IconButton/index.cjs");
14
+ const require_link_classes = require("./components/Link/link-classes.cjs");
15
+ const require_Link = require("./components/Link/Link.cjs");
16
+ require("./components/Link/index.cjs");
17
+ const require_Logo = require("./components/Logo/Logo.cjs");
18
+ require("./components/Logo/index.cjs");
19
+ const require_panel_classes = require("./components/Panel/panel-classes.cjs");
20
+ const require_Panel = require("./components/Panel/Panel.cjs");
21
+ require("./components/Panel/index.cjs");
22
+ const require_ThemeToggle = require("./components/ThemeToggle/ThemeToggle.cjs");
23
+ require("./components/ThemeToggle/index.cjs");
24
+ exports.Badge = require_Badge.Badge;
25
+ exports.Button = require_Button.Button;
26
+ exports.ButtonLink = require_ButtonLink.ButtonLink;
27
+ exports.Eyebrow = require_Eyebrow.Eyebrow;
28
+ exports.IconButton = require_IconButton.IconButton;
29
+ exports.Link = require_Link.Link;
30
+ exports.Logo = require_Logo.Logo;
31
+ exports.Panel = require_Panel.Panel;
32
+ exports.ThemeToggle = require_ThemeToggle.ThemeToggle;
33
+ exports.badgeClasses = require_badge_classes.badgeClasses;
34
+ exports.buttonClasses = require_button_classes.buttonClasses;
35
+ exports.iconButtonClasses = require_icon_button_classes.iconButtonClasses;
36
+ exports.linkClasses = require_link_classes.linkClasses;
37
+ exports.panelClasses = require_panel_classes.panelClasses;
@@ -0,0 +1,21 @@
1
+ import { BadgeTone, badgeClasses } from "./components/Badge/badge-classes.cjs";
2
+ import { Badge, BadgeProps } from "./components/Badge/Badge.cjs";
3
+ import "./components/Badge/index.cjs";
4
+ import { ButtonSize, ButtonVariant, buttonClasses } from "./components/Button/button-classes.cjs";
5
+ import { Button, ButtonProps } from "./components/Button/Button.cjs";
6
+ import { ButtonLink, ButtonLinkProps } from "./components/Button/ButtonLink.cjs";
7
+ import "./components/Button/index.cjs";
8
+ import { Eyebrow, EyebrowProps } from "./components/Eyebrow/Eyebrow.cjs";
9
+ import "./components/Eyebrow/index.cjs";
10
+ import { IconButtonSize, IconButtonVariant, iconButtonClasses } from "./components/IconButton/icon-button-classes.cjs";
11
+ import { IconButton, IconButtonProps } from "./components/IconButton/IconButton.cjs";
12
+ import "./components/IconButton/index.cjs";
13
+ import { LinkTone, linkClasses } from "./components/Link/link-classes.cjs";
14
+ import { Link, LinkComponentProps, LinkProps } from "./components/Link/Link.cjs";
15
+ import "./components/Link/index.cjs";
16
+ import { Logo, LogoProps } from "./components/Logo/Logo.cjs";
17
+ import { PanelPadding, PanelTone, panelClasses } from "./components/Panel/panel-classes.cjs";
18
+ import { Panel, PanelProps } from "./components/Panel/Panel.cjs";
19
+ import "./components/Panel/index.cjs";
20
+ import { ThemeToggle, ThemeToggleProps } from "./components/ThemeToggle/ThemeToggle.cjs";
21
+ export { Badge, type BadgeProps, type BadgeTone, Button, ButtonLink, type ButtonLinkProps, type ButtonProps, type ButtonSize, type ButtonVariant, Eyebrow, type EyebrowProps, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, Link, type LinkComponentProps, type LinkProps, type LinkTone, Logo, type LogoProps, Panel, type PanelPadding, type PanelProps, type PanelTone, ThemeToggle, type ThemeToggleProps, badgeClasses, buttonClasses, iconButtonClasses, linkClasses, panelClasses };