@storyshelf/app 0.7.0 → 0.9.0-next-d2cc082
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.
- package/dist/app-types.d.mts +1 -3
- package/dist/asset-manifest.mjs +1 -2
- package/dist/assets/htmx.mjs +1 -2
- package/dist/assets/mark.mjs +1 -2
- package/dist/boot-tasks.mjs +1 -2
- package/dist/build-state-flags.mjs +1 -2
- package/dist/build-state-setup.mjs +1 -2
- package/dist/capture-alerts.mjs +1 -2
- package/dist/capture-process.mjs +1 -2
- package/dist/capture-setup.mjs +1 -2
- package/dist/connections.mjs +1 -2
- package/dist/consumer-setup.mjs +1 -2
- package/dist/credential-keys.mjs +1 -2
- package/dist/credentials.mjs +1 -2
- package/dist/design-events.mjs +71 -0
- package/dist/design-events.mjs.map +1 -0
- package/dist/git-status.mjs +1 -2
- package/dist/hidden-data.mjs +1 -2
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +2 -3
- package/dist/insights/budget.mjs +1 -2
- package/dist/insights/deps.mjs +1 -2
- package/dist/insights/errors.mjs +1 -2
- package/dist/insights/health-panel.mjs +0 -1
- package/dist/insights/job.mjs +1 -2
- package/dist/insights/load-health.mjs +1 -2
- package/dist/insights/load-triage.mjs +1 -2
- package/dist/insights/panel.mjs +1 -2
- package/dist/insights/request.mjs +1 -2
- package/dist/insights/stale.mjs +1 -2
- package/dist/insights/usage-report.mjs +1 -2
- package/dist/insights/view.mjs +1 -2
- package/dist/job-canceller.mjs +1 -2
- package/dist/job-queue.mjs +1 -2
- package/dist/jobs-setup.mjs +1 -2
- package/dist/lifecycle.mjs +2 -3
- package/dist/lifecycle.mjs.map +1 -1
- package/dist/middleware/auth-gate.mjs +1 -2
- package/dist/middleware/csrf.mjs +1 -2
- package/dist/middleware/rate-limit.mjs +1 -2
- package/dist/middleware/request-log.mjs +1 -2
- package/dist/middleware/require-review.mjs +1 -2
- package/dist/middleware/require-testing.mjs +1 -2
- package/dist/middleware/server-timing.mjs +1 -2
- package/dist/middleware/setup-gate.mjs +1 -2
- package/dist/middleware/store-scope.mjs +1 -2
- package/dist/notifications-pause.mjs +1 -2
- package/dist/notify.d.mts +1 -3
- package/dist/notify.mjs +5 -3
- package/dist/notify.mjs.map +1 -1
- package/dist/pages/a11y-violations.mjs +1 -2
- package/dist/pages/admin-ai.mjs +1 -2
- package/dist/pages/admin-system-origin.mjs +19 -10
- package/dist/pages/admin-system-origin.mjs.map +1 -1
- package/dist/pages/admin-system-targets.mjs +1 -2
- package/dist/pages/admin-system.mjs +1 -2
- package/dist/pages/build-detail.mjs +1 -2
- package/dist/pages/build-diff-actions.mjs +1 -2
- package/dist/pages/build-diff-comments.mjs +1 -2
- package/dist/pages/build-diff-default.mjs +53 -0
- package/dist/pages/build-diff-default.mjs.map +1 -0
- package/dist/pages/build-diff-environment.mjs +34 -5
- package/dist/pages/build-diff-environment.mjs.map +1 -1
- package/dist/pages/build-diff-header.mjs +1 -2
- package/dist/pages/build-diff-insight.mjs +1 -2
- package/dist/pages/build-diff-model.mjs +20 -3
- package/dist/pages/build-diff-model.mjs.map +1 -1
- package/dist/pages/build-diff-nav.mjs +1 -2
- package/dist/pages/build-diff-reference.mjs +84 -0
- package/dist/pages/build-diff-reference.mjs.map +1 -0
- package/dist/pages/build-diff-shortcuts.mjs +1 -2
- package/dist/pages/build-diff-stale.mjs +1 -2
- package/dist/pages/build-diff-usage.mjs +1 -2
- package/dist/pages/build-diff-viewer.mjs +38 -12
- package/dist/pages/build-diff-viewer.mjs.map +1 -1
- package/dist/pages/build-diff.mjs +6 -12
- package/dist/pages/build-diff.mjs.map +1 -1
- package/dist/pages/build-tests.mjs +1 -2
- package/dist/pages/component-detail.mjs +1 -2
- package/dist/pages/component-stories.mjs +1 -2
- package/dist/pages/compute-jobs.mjs +1 -2
- package/dist/pages/design-links.mjs +1 -2
- package/dist/pages/environment-change.mjs +16 -4
- package/dist/pages/environment-change.mjs.map +1 -1
- package/dist/pages/health-panel.mjs +1 -2
- package/dist/pages/invite.mjs +1 -2
- package/dist/pages/label-detail.mjs +1 -2
- package/dist/pages/library-grid.mjs +1 -2
- package/dist/pages/library-model.mjs +1 -2
- package/dist/pages/library-snapshots.mjs +1 -2
- package/dist/pages/library.mjs +1 -2
- package/dist/pages/login.mjs +1 -2
- package/dist/pages/notifications-paused.mjs +1 -2
- package/dist/pages/passkey-ceremony.mjs +1 -2
- package/dist/pages/profile.mjs +1 -2
- package/dist/pages/project-builds-table.mjs +1 -2
- package/dist/pages/project-builds.mjs +1 -2
- package/dist/pages/project-create.mjs +1 -2
- package/dist/pages/project-settings.mjs +1 -2
- package/dist/pages/projects-card.mjs +1 -2
- package/dist/pages/projects.mjs +1 -2
- package/dist/pages/review-changeset.mjs +1 -2
- package/dist/pages/review-comments.mjs +1 -2
- package/dist/pages/review-verdict.mjs +1 -2
- package/dist/pages/root.mjs +1 -2
- package/dist/pages/settings-ai.mjs +1 -2
- package/dist/pages/settings-capture.mjs +1 -2
- package/dist/pages/settings-design-credential.mjs +1 -2
- package/dist/pages/settings-design-links.mjs +1 -2
- package/dist/pages/settings-design.mjs +1 -2
- package/dist/pages/settings-general.mjs +1 -2
- package/dist/pages/settings-labels.mjs +1 -2
- package/dist/pages/settings-links.mjs +1 -2
- package/dist/pages/settings-members.mjs +1 -2
- package/dist/pages/settings-notifications-git.mjs +1 -2
- package/dist/pages/settings-notifications.mjs +1 -2
- package/dist/pages/settings-tests.mjs +1 -2
- package/dist/pages/settings-tokens.mjs +1 -2
- package/dist/pages/settings-webhooks.mjs +1 -2
- package/dist/pages/storybook.mjs +1 -2
- package/dist/pages/target-choices.mjs +1 -2
- package/dist/publish-setup.mjs +1 -2
- package/dist/retention-timer.mjs +10 -11
- package/dist/retention-timer.mjs.map +1 -1
- package/dist/review-events.mjs +1 -2
- package/dist/routers/admin-pages.mjs +1 -2
- package/dist/routers/admin-public-origin.mjs +10 -3
- package/dist/routers/admin-public-origin.mjs.map +1 -1
- package/dist/routers/admin.mjs +8 -4
- package/dist/routers/admin.mjs.map +1 -1
- package/dist/routers/assets.mjs +1 -2
- package/dist/routers/attempts.mjs +1 -2
- package/dist/routers/auth-sync.mjs +1 -2
- package/dist/routers/auth.mjs +1 -2
- package/dist/routers/baseline-guard.mjs +2 -3
- package/dist/routers/baseline-guard.mjs.map +1 -1
- package/dist/routers/baseline-reference.mjs +72 -0
- package/dist/routers/baseline-reference.mjs.map +1 -0
- package/dist/routers/baselines.handlers.mjs +1 -2
- package/dist/routers/baselines.mjs +1 -2
- package/dist/routers/build-cancel.mjs +1 -2
- package/dist/routers/build-changeset.mjs +1 -2
- package/dist/routers/build-reviews.handlers.mjs +1 -2
- package/dist/routers/build-reviews.mjs +1 -2
- package/dist/routers/builds.handlers.mjs +23 -9
- package/dist/routers/builds.handlers.mjs.map +1 -1
- package/dist/routers/builds.mjs +7 -3
- package/dist/routers/builds.mjs.map +1 -1
- package/dist/routers/capture-cache.mjs +29 -0
- package/dist/routers/capture-cache.mjs.map +1 -0
- package/dist/routers/capture-config.mjs +1 -2
- package/dist/routers/comments.mjs +1 -2
- package/dist/routers/comparison-image.mjs +29 -0
- package/dist/routers/comparison-image.mjs.map +1 -0
- package/dist/routers/component-catalog.handlers.mjs +1 -2
- package/dist/routers/component.handlers.mjs +1 -2
- package/dist/routers/connections.mjs +1 -2
- package/dist/routers/design-connect.handlers.mjs +1 -2
- package/dist/routers/design.handlers.mjs +8 -2
- package/dist/routers/design.handlers.mjs.map +1 -1
- package/dist/routers/flash.mjs +1 -2
- package/dist/routers/health-report.mjs +1 -2
- package/dist/routers/health.mjs +1 -2
- package/dist/routers/helpers.mjs +1 -2
- package/dist/routers/htmx.mjs +1 -2
- package/dist/routers/insights-ui.mjs +1 -2
- package/dist/routers/insights.handlers.mjs +1 -2
- package/dist/routers/insights.mjs +1 -2
- package/dist/routers/labels.mjs +1 -2
- package/dist/routers/links.handlers.mjs +1 -2
- package/dist/routers/links.mjs +1 -2
- package/dist/routers/media.mjs +14 -5
- package/dist/routers/media.mjs.map +1 -1
- package/dist/routers/members.mjs +1 -2
- package/dist/routers/notification-channels.mjs +1 -2
- package/dist/routers/notification-subscriptions.mjs +1 -2
- package/dist/routers/oauth-state.mjs +1 -2
- package/dist/routers/preview-base.mjs +1 -2
- package/dist/routers/preview-token.mjs +1 -2
- package/dist/routers/profile.mjs +1 -2
- package/dist/routers/projects.mjs +1 -2
- package/dist/routers/publish-upload.mjs +19 -12
- package/dist/routers/publish-upload.mjs.map +1 -1
- package/dist/routers/published-access.mjs +1 -2
- package/dist/routers/published-compression.mjs +109 -0
- package/dist/routers/published-compression.mjs.map +1 -0
- package/dist/routers/published-files.mjs +26 -9
- package/dist/routers/published-files.mjs.map +1 -1
- package/dist/routers/review-forms.mjs +1 -2
- package/dist/routers/review-next.mjs +1 -2
- package/dist/routers/review-section.handlers.mjs +1 -2
- package/dist/routers/review-switch-off.mjs +1 -2
- package/dist/routers/schemas.mjs +1 -2
- package/dist/routers/scoped-models.mjs +1 -2
- package/dist/routers/settings-ai.mjs +1 -2
- package/dist/routers/settings-capture.mjs +1 -2
- package/dist/routers/settings-design.mjs +1 -2
- package/dist/routers/settings-general.mjs +1 -2
- package/dist/routers/settings-git-channel.mjs +1 -2
- package/dist/routers/settings-labels.mjs +1 -2
- package/dist/routers/settings-links.mjs +1 -2
- package/dist/routers/settings-members.mjs +1 -2
- package/dist/routers/settings-notifications.mjs +1 -2
- package/dist/routers/settings-tokens.mjs +1 -2
- package/dist/routers/settings-webhooks.mjs +1 -2
- package/dist/routers/settings.handlers.mjs +1 -2
- package/dist/routers/settings.mjs +1 -2
- package/dist/routers/signed-storybook.mjs +5 -3
- package/dist/routers/signed-storybook.mjs.map +1 -1
- package/dist/routers/snapshot-groups.mjs +1 -2
- package/dist/routers/snapshots.mjs +1 -2
- package/dist/routers/storybook.mjs +21 -17
- package/dist/routers/storybook.mjs.map +1 -1
- package/dist/routers/tokens.mjs +1 -2
- package/dist/routers/ui.mjs +4 -2
- package/dist/routers/ui.mjs.map +1 -1
- package/dist/routers/webhooks.mjs +1 -2
- package/dist/routers/well-known.mjs +1 -2
- package/dist/routes/api-routes.mjs +1 -2
- package/dist/routes/classification.mjs +1 -2
- package/dist/routes/openapi-classes.mjs +1 -2
- package/dist/routes/page-routes.mjs +2 -3
- package/dist/routes/page-routes.mjs.map +1 -1
- package/dist/runtime.mjs +1 -2
- package/dist/serverless.mjs +1 -2
- package/dist/store.mjs +1 -2
- package/dist/targets.mjs +1 -2
- package/dist/ui/avatar.mjs +1 -2
- package/dist/ui/buttons.mjs +1 -2
- package/dist/ui/code-block.mjs +1 -2
- package/dist/ui/compare-stage.mjs +86 -54
- package/dist/ui/compare-stage.mjs.map +1 -1
- package/dist/ui/csrf-field.mjs +1 -2
- package/dist/ui/css.mjs +1 -2
- package/dist/ui/design-reference.mjs +1 -2
- package/dist/ui/document.mjs +1 -2
- package/dist/ui/dropdown.mjs +1 -2
- package/dist/ui/feedback.mjs +1 -2
- package/dist/ui/filter-input.mjs +1 -2
- package/dist/ui/forms.mjs +1 -2
- package/dist/ui/icons/icon.mjs +1 -2
- package/dist/ui/icons/paths.mjs +1 -2
- package/dist/ui/icons/sprite.mjs +1 -2
- package/dist/ui/kbd.mjs +1 -2
- package/dist/ui/layout.mjs +1 -2
- package/dist/ui/preview-embed.mjs +1 -2
- package/dist/ui/progress.mjs +1 -2
- package/dist/ui/segmented.mjs +1 -2
- package/dist/ui/shell/account.mjs +1 -2
- package/dist/ui/shell/bare.mjs +1 -2
- package/dist/ui/shell/boot-script.mjs +1 -2
- package/dist/ui/shell/client-script.mjs +1 -2
- package/dist/ui/shell/nav.mjs +1 -2
- package/dist/ui/shell/review-script.mjs +17 -3
- package/dist/ui/shell/review-script.mjs.map +1 -1
- package/dist/ui/shell/sidebar.mjs +1 -2
- package/dist/ui/shell/topbar.mjs +1 -2
- package/dist/ui/stacks.mjs +1 -2
- package/dist/ui/styles/base.mjs +1 -2
- package/dist/ui/styles/behavior.mjs +1 -2
- package/dist/ui/styles/review-layout.mjs +1 -2
- package/dist/ui/styles/review.mjs +1 -2
- package/dist/ui/styles/tokens.mjs +1 -2
- package/dist/ui/styles.mjs +1 -2
- package/dist/ui/subnav.mjs +1 -2
- package/dist/ui/table.mjs +1 -2
- package/dist/ui/theme.mjs +1 -2
- package/dist/ui/thumbnail.mjs +1 -2
- package/dist/ui/time.mjs +1 -2
- package/package.json +9 -18
package/dist/ui/filter-input.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { Icon } from "./icons/icon.mjs";
|
|
6
6
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/ui/filter-input.tsx
|
|
8
8
|
const filterWrap = css`
|
|
9
9
|
/* filter-input */
|
|
10
10
|
position: relative;
|
|
@@ -52,7 +52,6 @@ const FilterInput = ({ label, placeholder = "Filter…" }) => {
|
|
|
52
52
|
})]
|
|
53
53
|
});
|
|
54
54
|
};
|
|
55
|
-
//#endregion
|
|
56
55
|
export { FilterInput };
|
|
57
56
|
|
|
58
57
|
//# sourceMappingURL=filter-input.mjs.map
|
package/dist/ui/forms.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { Icon } from "./icons/icon.mjs";
|
|
6
6
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/ui/forms.tsx
|
|
8
8
|
const fieldWrap = css`
|
|
9
9
|
/* field */
|
|
10
10
|
display: grid;
|
|
@@ -286,7 +286,6 @@ const SelectField = ({ label, name, value, options, hint, disabled, required, la
|
|
|
286
286
|
]
|
|
287
287
|
});
|
|
288
288
|
};
|
|
289
|
-
//#endregion
|
|
290
289
|
export { CheckField, Field, FormActions, SelectField, TextareaField };
|
|
291
290
|
|
|
292
291
|
//# sourceMappingURL=forms.mjs.map
|
package/dist/ui/icons/icon.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { css } from "../css.mjs";
|
|
5
5
|
import { iconHref } from "./sprite.mjs";
|
|
6
6
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/ui/icons/icon.tsx
|
|
8
8
|
const iconBase = css`
|
|
9
9
|
/* icon */
|
|
10
10
|
flex: none;
|
|
@@ -47,7 +47,6 @@ const Icon = ({ name, size = "md", label }) => {
|
|
|
47
47
|
children: /* @__PURE__ */ jsx("use", { href: iconHref(name) })
|
|
48
48
|
});
|
|
49
49
|
};
|
|
50
|
-
//#endregion
|
|
51
50
|
export { Icon };
|
|
52
51
|
|
|
53
52
|
//# sourceMappingURL=icon.mjs.map
|
package/dist/ui/icons/paths.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/icons/paths.ts
|
|
5
5
|
/**
|
|
6
6
|
* Icon set: inner SVG markup per icon on a 24x24 grid, stroke-based
|
|
7
7
|
* (Lucide-style, ISC). Add an icon here and it is in the sprite and the
|
|
@@ -56,7 +56,6 @@ const ICON_PATHS = {
|
|
|
56
56
|
book: "<path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\"/>",
|
|
57
57
|
server: "<rect width=\"20\" height=\"8\" x=\"2\" y=\"2\" rx=\"2\"/><rect width=\"20\" height=\"8\" x=\"2\" y=\"14\" rx=\"2\"/><path d=\"M6 6h.01M6 18h.01\"/>"
|
|
58
58
|
};
|
|
59
|
-
//#endregion
|
|
60
59
|
export { ICON_PATHS };
|
|
61
60
|
|
|
62
61
|
//# sourceMappingURL=paths.mjs.map
|
package/dist/ui/icons/sprite.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { ICON_PATHS } from "./paths.mjs";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
|
-
|
|
6
|
+
// src/ui/icons/sprite.ts
|
|
7
7
|
/** Assembled `<svg>` sprite of `<symbol id="i-<name>">` entries. */
|
|
8
8
|
function buildSprite(paths = ICON_PATHS) {
|
|
9
9
|
return `<svg xmlns="http://www.w3.org/2000/svg">${Object.entries(paths).toSorted(([a], [b]) => a.localeCompare(b)).map(([name, body]) => `<symbol id="i-${name}" viewBox="0 0 24 24">${body}</symbol>`).join("")}</svg>`;
|
|
@@ -20,7 +20,6 @@ const iconSpriteHref = `/assets/icons-${iconSpriteHash}.svg`;
|
|
|
20
20
|
function iconHref(name) {
|
|
21
21
|
return `${iconSpriteHref}#i-${name}`;
|
|
22
22
|
}
|
|
23
|
-
//#endregion
|
|
24
23
|
export { buildSprite, contentHash, iconHref, iconSprite, iconSpriteHash, iconSpriteHref };
|
|
25
24
|
|
|
26
25
|
//# sourceMappingURL=sprite.mjs.map
|
package/dist/ui/kbd.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { Fragment, jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/kbd.tsx
|
|
7
7
|
const kbdKey = css`
|
|
8
8
|
/* kbd */
|
|
9
9
|
display: inline-flex;
|
|
@@ -27,7 +27,6 @@ const Kbd = ({ keys }) => {
|
|
|
27
27
|
children: key
|
|
28
28
|
}, String(index))) });
|
|
29
29
|
};
|
|
30
|
-
//#endregion
|
|
31
30
|
export { Kbd };
|
|
32
31
|
|
|
33
32
|
//# sourceMappingURL=kbd.mjs.map
|
package/dist/ui/layout.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/layout.tsx
|
|
7
7
|
const cardBase = css`
|
|
8
8
|
/* card */
|
|
9
9
|
background: var(--surface-card);
|
|
@@ -167,7 +167,6 @@ const SectionTitle = ({ level = 2, tone = "neutral", children }) => {
|
|
|
167
167
|
children
|
|
168
168
|
});
|
|
169
169
|
};
|
|
170
|
-
//#endregion
|
|
171
170
|
export { Card, CardSection, PageHeader, SectionTitle };
|
|
172
171
|
|
|
173
172
|
//# sourceMappingURL=layout.mjs.map
|
|
@@ -5,7 +5,7 @@ import { css } from "./css.mjs";
|
|
|
5
5
|
import { Button } from "./buttons.mjs";
|
|
6
6
|
import { Meta } from "./feedback.mjs";
|
|
7
7
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
8
|
-
|
|
8
|
+
// src/ui/preview-embed.tsx
|
|
9
9
|
/**
|
|
10
10
|
* Sandbox of the embedded story frame (ADR 0006, decision 9). Scripts only: no `allow-same-origin`,
|
|
11
11
|
* so a customer's Storybook never runs with the app's origin and its cookies, and no top navigation,
|
|
@@ -76,7 +76,6 @@ const PreviewEmbed = ({ src, title, refresh }) => /* @__PURE__ */ jsxs("div", {
|
|
|
76
76
|
})
|
|
77
77
|
})]
|
|
78
78
|
});
|
|
79
|
-
//#endregion
|
|
80
79
|
export { PREVIEW_SANDBOX, PreviewEmbed };
|
|
81
80
|
|
|
82
81
|
//# sourceMappingURL=preview-embed.mjs.map
|
package/dist/ui/progress.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/progress.tsx
|
|
7
7
|
const track = css`
|
|
8
8
|
/* progress */
|
|
9
9
|
height: 6px;
|
|
@@ -38,7 +38,6 @@ const Progress = ({ value, max, label }) => {
|
|
|
38
38
|
children: /* @__PURE__ */ jsx("span", { style: `width:${percent}%` })
|
|
39
39
|
});
|
|
40
40
|
};
|
|
41
|
-
//#endregion
|
|
42
41
|
export { Progress };
|
|
43
42
|
|
|
44
43
|
//# sourceMappingURL=progress.mjs.map
|
package/dist/ui/segmented.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/segmented.tsx
|
|
7
7
|
const segmentedRoot = css`
|
|
8
8
|
/* segmented */
|
|
9
9
|
display: inline-flex;
|
|
@@ -71,7 +71,6 @@ const Segmented = ({ items, label, ...rest }) => {
|
|
|
71
71
|
}, item.value))
|
|
72
72
|
});
|
|
73
73
|
};
|
|
74
|
-
//#endregion
|
|
75
74
|
export { Segmented };
|
|
76
75
|
|
|
77
76
|
//# sourceMappingURL=segmented.mjs.map
|
|
@@ -10,7 +10,7 @@ import { Dropdown, DropdownDivider, DropdownItem } from "../dropdown.mjs";
|
|
|
10
10
|
import { csrfField } from "../csrf-field.mjs";
|
|
11
11
|
import { Fragment, jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
12
12
|
import { safeImageUrl } from "@storyshelf/core/urls";
|
|
13
|
-
|
|
13
|
+
// src/ui/shell/account.tsx
|
|
14
14
|
/** Styles for the account widgets that live in the sidebar footer. */
|
|
15
15
|
const accountRoot = css`
|
|
16
16
|
/* account */
|
|
@@ -155,7 +155,6 @@ const UserMenu = () => {
|
|
|
155
155
|
})
|
|
156
156
|
});
|
|
157
157
|
};
|
|
158
|
-
//#endregion
|
|
159
158
|
export { ThemeMenu, UserMenu };
|
|
160
159
|
|
|
161
160
|
//# sourceMappingURL=account.mjs.map
|
package/dist/ui/shell/bare.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { css } from "../css.mjs";
|
|
|
5
5
|
import { Icon } from "../icons/icon.mjs";
|
|
6
6
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
7
7
|
import { safeImageUrl } from "@storyshelf/core/urls";
|
|
8
|
-
|
|
8
|
+
// src/ui/shell/bare.tsx
|
|
9
9
|
/** Chrome-free page for signed-out flows: brand over a centered column. */
|
|
10
10
|
const bareRoot = css`
|
|
11
11
|
/* bare */
|
|
@@ -63,7 +63,6 @@ const BareShell = ({ name, logo, children }) => {
|
|
|
63
63
|
})]
|
|
64
64
|
});
|
|
65
65
|
};
|
|
66
|
-
//#endregion
|
|
67
66
|
export { BareShell };
|
|
68
67
|
|
|
69
68
|
//# sourceMappingURL=bare.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/shell/boot-script.ts
|
|
5
5
|
/**
|
|
6
6
|
* Runs in `<head>` before first paint so the saved theme and sidebar state
|
|
7
7
|
* apply without a flash. Exposes cookie helpers to the client script.
|
|
@@ -40,7 +40,6 @@ function bootScript() {
|
|
|
40
40
|
})();
|
|
41
41
|
`.trim();
|
|
42
42
|
}
|
|
43
|
-
//#endregion
|
|
44
43
|
export { bootScript };
|
|
45
44
|
|
|
46
45
|
//# sourceMappingURL=boot-script.mjs.map
|
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { iconSpriteHref } from "../icons/sprite.mjs";
|
|
5
5
|
import { reviewScript } from "./review-script.mjs";
|
|
6
|
-
|
|
6
|
+
// src/ui/shell/client-script.ts
|
|
7
7
|
/** Attach the CSRF token to every HTMX request. */
|
|
8
8
|
function csrfPart() {
|
|
9
9
|
return `
|
|
@@ -338,7 +338,6 @@ function clientScript() {
|
|
|
338
338
|
})();
|
|
339
339
|
`.trim();
|
|
340
340
|
}
|
|
341
|
-
//#endregion
|
|
342
341
|
export { clientScript };
|
|
343
342
|
|
|
344
343
|
//# sourceMappingURL=client-script.mjs.map
|
package/dist/ui/shell/nav.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/shell/nav.ts
|
|
5
5
|
/**
|
|
6
6
|
* Entries shown for the current project. Entries for `testing` routes (Jobs) drop out on a
|
|
7
7
|
* hosting-only instance, where those routes answer 404.
|
|
@@ -109,7 +109,6 @@ function sectionCrumb(nav, urls) {
|
|
|
109
109
|
}
|
|
110
110
|
}[nav?.active ?? ""] ?? null;
|
|
111
111
|
}
|
|
112
|
-
//#endregion
|
|
113
112
|
export { adminNavItems, breadcrumbs, developerNavItems, projectNavItems };
|
|
114
113
|
|
|
115
114
|
//# sourceMappingURL=nav.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/shell/review-script.ts
|
|
5
5
|
/**
|
|
6
6
|
* Review workspace behavior: comparison modes, zoom, synchronized scrolling,
|
|
7
7
|
* list filters, keyboard review, and the shortcuts dialog. Runs inside the
|
|
@@ -29,12 +29,18 @@ function stateHelpers() {
|
|
|
29
29
|
b.setAttribute('aria-pressed', b.getAttribute('data-view-value')===value ? 'true' : 'false');
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
+
function allows(stage,attr,value){
|
|
33
|
+
var list=stage.getAttribute(attr);
|
|
34
|
+
return !list || list.split(',').indexOf(value)>-1;
|
|
35
|
+
}
|
|
32
36
|
function setMode(stage,mode,persist){
|
|
37
|
+
if(!allows(stage,'data-modes',mode)) return;
|
|
33
38
|
stage.setAttribute('data-view',mode);
|
|
34
39
|
press(stage.querySelector('[data-compare-mode]'),mode);
|
|
35
40
|
if(persist) remember('ss_compare_mode',mode);
|
|
36
41
|
}
|
|
37
42
|
function setZoom(stage,zoom,persist){
|
|
43
|
+
if(!allows(stage,'data-zooms',zoom)) return;
|
|
38
44
|
stage.setAttribute('data-zoom',zoom);
|
|
39
45
|
press(stage.querySelector('[data-compare-zoom]'),zoom);
|
|
40
46
|
if(persist) remember('ss_compare_zoom',zoom);
|
|
@@ -135,11 +141,20 @@ function clickControls() {
|
|
|
135
141
|
var dialog=document.querySelector('dialog[data-shortcuts]');
|
|
136
142
|
if(dialog&&typeof dialog.showModal==='function'&&!dialog.open){ dialog.showModal(); }
|
|
137
143
|
}
|
|
144
|
+
function chooseSource(btn,value){
|
|
145
|
+
var root=btn.closest('[data-compare-sources]');
|
|
146
|
+
if(!root) return;
|
|
147
|
+
root.querySelectorAll('[data-compare-source]').forEach(function(pane){
|
|
148
|
+
pane.hidden = pane.getAttribute('data-compare-source')!==value;
|
|
149
|
+
});
|
|
150
|
+
press(btn.closest('[data-compare-source-switch]'),value);
|
|
151
|
+
}
|
|
138
152
|
function chooseSegment(btn){
|
|
139
153
|
var value=btn.getAttribute('data-view-value');
|
|
140
154
|
var stage=btn.closest('[data-compare]');
|
|
141
155
|
if(stage&&btn.closest('[data-compare-mode]')){ setMode(stage,value,true); }
|
|
142
156
|
else if(stage&&btn.closest('[data-compare-zoom]')){ setZoom(stage,value,true); }
|
|
157
|
+
else if(btn.closest('[data-compare-source-switch]')){ chooseSource(btn,value); }
|
|
143
158
|
else if(btn.closest('[data-filter-switch]')){
|
|
144
159
|
var list=document.querySelector('[data-diff-nav]');
|
|
145
160
|
if(list){ list.setAttribute('data-filter',value); }
|
|
@@ -192,12 +207,11 @@ function keyboardShortcuts() {
|
|
|
192
207
|
}
|
|
193
208
|
document.addEventListener('keydown',function(e){
|
|
194
209
|
if(e.metaKey||e.ctrlKey||e.altKey||typing(e.target)) return;
|
|
195
|
-
var stage=document.querySelector('[data-compare]');
|
|
210
|
+
var stage=document.querySelector('[data-compare-source]:not([hidden]) [data-compare]')||document.querySelector('[data-compare]');
|
|
196
211
|
if(!stage||document.querySelector('dialog[open]')) return;
|
|
197
212
|
if(handleKey(e.key,stage)){ e.preventDefault(); }
|
|
198
213
|
});`;
|
|
199
214
|
}
|
|
200
|
-
//#endregion
|
|
201
215
|
export { reviewScript };
|
|
202
216
|
|
|
203
217
|
//# sourceMappingURL=review-script.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-script.mjs","names":[],"sources":["../../../src/ui/shell/review-script.ts"],"sourcesContent":["/**\n * Review workspace behavior: comparison modes, zoom, synchronized scrolling,\n * list filters, keyboard review, and the shortcuts dialog. Runs inside the\n * shell's once-only closure (`inits`, `shell` are in scope).\n */\nexport function reviewScript(): string {\n return [stateHelpers(), stageSetup(), wipeDrag(), clickControls(), keyboardShortcuts()].join(\n \"\\n\",\n );\n}\n\n/** Mode/zoom state on the stage root, remembered across snapshots. */\nfunction stateHelpers(): string {\n return `\n var MODES=['split','swipe','onion','diff','flip'];\n var ZOOMS=['fit','100','200','400'];\n function remember(key,value){ try{ localStorage.setItem(key,value); }catch(_){} }\n function recall(key){ try{ return localStorage.getItem(key); }catch(_){ return null; } }\n function press(group,value){\n if(!group) return;\n group.querySelectorAll('[data-view-value]').forEach(function(b){\n b.setAttribute('aria-pressed', b.getAttribute('data-view-value')===value ? 'true' : 'false');\n });\n }\n function setMode(stage,mode,persist){\n stage.setAttribute('data-view',mode);\n press(stage.querySelector('[data-compare-mode]'),mode);\n if(persist) remember('ss_compare_mode',mode);\n }\n function setZoom(stage,zoom,persist){\n stage.setAttribute('data-zoom',zoom);\n press(stage.querySelector('[data-compare-zoom]'),zoom);\n if(persist) remember('ss_compare_zoom',zoom);\n }\n function flip(stage){\n stage.setAttribute('data-flip', stage.getAttribute('data-flip')==='baseline' ? 'current' : 'baseline');\n }\n function nextZoom(stage){\n var cur=stage.getAttribute('data-zoom')||'fit';\n setZoom(stage,ZOOMS[(ZOOMS.indexOf(cur)+1)%ZOOMS.length],true);\n }\n function stepZoom(stage,delta){\n var cur=ZOOMS.indexOf(stage.getAttribute('data-zoom')||'fit');\n var next=Math.max(0,Math.min(ZOOMS.length-1,cur+delta));\n setZoom(stage,ZOOMS[next],true);\n }`;\n}\n\n/** Per-render wiring of a freshly swapped-in comparison stage. */\nfunction stageSetup(): string {\n return `\n function syncScroll(stage){\n var panes=Array.from(stage.querySelectorAll('.stage__pane'));\n var lock=false;\n panes.forEach(function(pane){\n pane.addEventListener('scroll',function(){\n if(lock) return;\n lock=true;\n panes.forEach(function(other){\n if(other!==pane){ other.scrollTop=pane.scrollTop; other.scrollLeft=pane.scrollLeft; }\n });\n requestAnimationFrame(function(){ lock=false; });\n });\n });\n }\n function bindRange(stage,selector,prop,scale){\n var input=stage.querySelector(selector);\n if(!input) return;\n input.addEventListener('input',function(){ stage.style.setProperty(prop,String(input.value*scale)+(scale===1?'%':'')); });\n }\n function initStage(stage){\n if(stage.getAttribute('data-ready')) return;\n stage.setAttribute('data-ready','1');\n var mode=recall('ss_compare_mode');\n if(MODES.indexOf(mode)>-1) setMode(stage,mode,false);\n var zoom=recall('ss_compare_zoom');\n if(ZOOMS.indexOf(zoom)>-1) setZoom(stage,zoom,false);\n bindRange(stage,'[data-compare-swipe]','--swipe',1);\n bindRange(stage,'[data-compare-onion]','--onion',0.01);\n var grid=stage.querySelector('.stage__grid');\n if(grid){ grid.addEventListener('click',function(){ if(stage.getAttribute('data-view')==='flip'){ flip(stage); } }); }\n syncScroll(stage);\n }\n inits.push(function(){ document.querySelectorAll('[data-compare]').forEach(initStage); });`;\n}\n\n/**\n * Drag the wipe handle to move the swipe divider. Uses pointer capture so the\n * drag keeps working when the pointer leaves the handle, and mirrors the value\n * into the (accessible) range slider.\n */\nfunction wipeDrag(): string {\n return `\n function wipePercent(stage,clientX){\n var pane=stage.querySelector('.stage__pane[data-pane=\"current\"]');\n if(!pane) return 50;\n var rect=pane.getBoundingClientRect();\n return Math.max(0,Math.min(100,(clientX-rect.left)/rect.width*100));\n }\n function setWipe(stage,percent){\n stage.style.setProperty('--swipe',percent+'%');\n var range=stage.querySelector('[data-compare-swipe]');\n if(range){ range.value=String(Math.round(percent)); }\n }\n function bindKnob(stage){\n var knob=stage.querySelector('[data-compare-knob]');\n if(!knob||knob.getAttribute('data-bound')) return;\n knob.setAttribute('data-bound','1');\n knob.addEventListener('pointerdown',function(e){\n e.preventDefault();\n knob.setPointerCapture(e.pointerId);\n setWipe(stage,wipePercent(stage,e.clientX));\n function move(ev){ setWipe(stage,wipePercent(stage,ev.clientX)); }\n function stop(){\n knob.removeEventListener('pointermove',move);\n knob.removeEventListener('pointerup',stop);\n knob.removeEventListener('pointercancel',stop);\n }\n knob.addEventListener('pointermove',move);\n knob.addEventListener('pointerup',stop);\n knob.addEventListener('pointercancel',stop);\n });\n }\n inits.push(function(){ document.querySelectorAll('[data-compare]').forEach(bindKnob); });`;\n}\n\n/** Delegated clicks: mode/zoom/filter segments and the shortcuts button. */\nfunction clickControls(): string {\n return `\n function openShortcuts(){\n var dialog=document.querySelector('dialog[data-shortcuts]');\n if(dialog&&typeof dialog.showModal==='function'&&!dialog.open){ dialog.showModal(); }\n }\n function chooseSegment(btn){\n var value=btn.getAttribute('data-view-value');\n var stage=btn.closest('[data-compare]');\n if(stage&&btn.closest('[data-compare-mode]')){ setMode(stage,value,true); }\n else if(stage&&btn.closest('[data-compare-zoom]')){ setZoom(stage,value,true); }\n else if(btn.closest('[data-filter-switch]')){\n var list=document.querySelector('[data-diff-nav]');\n if(list){ list.setAttribute('data-filter',value); }\n press(btn.closest('[data-filter-switch]'),value);\n }\n }\n document.addEventListener('click',function(e){\n var t=e.target instanceof Element ? e.target : null;\n if(!t) return;\n var btn=t.closest('[data-view-value]');\n if(btn){ chooseSegment(btn); }\n if(t.closest('[data-shortcuts-open]')){ openShortcuts(); }\n });`;\n}\n\n/** Global review shortcuts; ignored while typing or with modifier keys held. */\nfunction keyboardShortcuts(): string {\n return `\n function typing(target){\n return target instanceof HTMLElement &&\n (target.tagName==='INPUT'||target.tagName==='TEXTAREA'||target.tagName==='SELECT'||target.isContentEditable);\n }\n function press1(selector){\n var el=document.querySelector(selector);\n if(el&&!el.disabled){ el.click(); return true; }\n return false;\n }\n function stepBrowser(dir){\n var tabs=[].slice.call(document.querySelectorAll('[data-browser-tabs] a'));\n var at=tabs.findIndex(function(a){ return a.getAttribute('aria-current')==='page'; });\n var target=at===-1?null:tabs[at+dir];\n if(target){ target.click(); return true; }\n return false;\n }\n function handleKey(key,stage){\n if(key==='['||key===']') return stepBrowser(key===']'?1:-1);\n if(key==='j'||key==='ArrowRight') return press1('[data-snap-next]');\n if(key==='k'||key==='ArrowLeft') return press1('[data-snap-prev]');\n if(key==='a'||key==='A') return press1('[data-approve]');\n if(key==='r'||key==='R') return press1('[data-reject]');\n if(key>='1'&&key<='5'){ setMode(stage,MODES[Number(key)-1],true); return true; }\n if(key==='f'){ nextZoom(stage); return true; }\n if(key==='+'||key==='='){ stepZoom(stage,1); return true; }\n if(key==='-'||key==='_'){ stepZoom(stage,-1); return true; }\n if(key==='t'){\n if(stage.getAttribute('data-view')==='flip'){ flip(stage); } else { setMode(stage,'flip',true); }\n return true;\n }\n if(key==='?'){ openShortcuts(); return true; }\n return false;\n }\n document.addEventListener('keydown',function(e){\n if(e.metaKey||e.ctrlKey||e.altKey||typing(e.target)) return;\n var stage=document.querySelector('[data-compare]');\n if(!stage||document.querySelector('dialog[open]')) return;\n if(handleKey(e.key,stage)){ e.preventDefault(); }\n });`;\n}\n"],"mappings":";;;;;;;;;AAKA,SAAgB,eAAuB;CACrC,OAAO;EAAC,aAAa;EAAG,WAAW;EAAG,SAAS;EAAG,cAAc;EAAG,kBAAkB;CAAC,CAAC,CAAC,KACtF,IACF;AACF;;AAGA,SAAS,eAAuB;CAC9B,OAAO
|
|
1
|
+
{"version":3,"file":"review-script.mjs","names":[],"sources":["../../../src/ui/shell/review-script.ts"],"sourcesContent":["/**\n * Review workspace behavior: comparison modes, zoom, synchronized scrolling,\n * list filters, keyboard review, and the shortcuts dialog. Runs inside the\n * shell's once-only closure (`inits`, `shell` are in scope).\n */\nexport function reviewScript(): string {\n return [stateHelpers(), stageSetup(), wipeDrag(), clickControls(), keyboardShortcuts()].join(\n \"\\n\",\n );\n}\n\n/** Mode/zoom state on the stage root, remembered across snapshots. */\nfunction stateHelpers(): string {\n return `\n var MODES=['split','swipe','onion','diff','flip'];\n var ZOOMS=['fit','100','200','400'];\n function remember(key,value){ try{ localStorage.setItem(key,value); }catch(_){} }\n function recall(key){ try{ return localStorage.getItem(key); }catch(_){ return null; } }\n function press(group,value){\n if(!group) return;\n group.querySelectorAll('[data-view-value]').forEach(function(b){\n b.setAttribute('aria-pressed', b.getAttribute('data-view-value')===value ? 'true' : 'false');\n });\n }\n function allows(stage,attr,value){\n var list=stage.getAttribute(attr);\n return !list || list.split(',').indexOf(value)>-1;\n }\n function setMode(stage,mode,persist){\n if(!allows(stage,'data-modes',mode)) return;\n stage.setAttribute('data-view',mode);\n press(stage.querySelector('[data-compare-mode]'),mode);\n if(persist) remember('ss_compare_mode',mode);\n }\n function setZoom(stage,zoom,persist){\n if(!allows(stage,'data-zooms',zoom)) return;\n stage.setAttribute('data-zoom',zoom);\n press(stage.querySelector('[data-compare-zoom]'),zoom);\n if(persist) remember('ss_compare_zoom',zoom);\n }\n function flip(stage){\n stage.setAttribute('data-flip', stage.getAttribute('data-flip')==='baseline' ? 'current' : 'baseline');\n }\n function nextZoom(stage){\n var cur=stage.getAttribute('data-zoom')||'fit';\n setZoom(stage,ZOOMS[(ZOOMS.indexOf(cur)+1)%ZOOMS.length],true);\n }\n function stepZoom(stage,delta){\n var cur=ZOOMS.indexOf(stage.getAttribute('data-zoom')||'fit');\n var next=Math.max(0,Math.min(ZOOMS.length-1,cur+delta));\n setZoom(stage,ZOOMS[next],true);\n }`;\n}\n\n/** Per-render wiring of a freshly swapped-in comparison stage. */\nfunction stageSetup(): string {\n return `\n function syncScroll(stage){\n var panes=Array.from(stage.querySelectorAll('.stage__pane'));\n var lock=false;\n panes.forEach(function(pane){\n pane.addEventListener('scroll',function(){\n if(lock) return;\n lock=true;\n panes.forEach(function(other){\n if(other!==pane){ other.scrollTop=pane.scrollTop; other.scrollLeft=pane.scrollLeft; }\n });\n requestAnimationFrame(function(){ lock=false; });\n });\n });\n }\n function bindRange(stage,selector,prop,scale){\n var input=stage.querySelector(selector);\n if(!input) return;\n input.addEventListener('input',function(){ stage.style.setProperty(prop,String(input.value*scale)+(scale===1?'%':'')); });\n }\n function initStage(stage){\n if(stage.getAttribute('data-ready')) return;\n stage.setAttribute('data-ready','1');\n var mode=recall('ss_compare_mode');\n if(MODES.indexOf(mode)>-1) setMode(stage,mode,false);\n var zoom=recall('ss_compare_zoom');\n if(ZOOMS.indexOf(zoom)>-1) setZoom(stage,zoom,false);\n bindRange(stage,'[data-compare-swipe]','--swipe',1);\n bindRange(stage,'[data-compare-onion]','--onion',0.01);\n var grid=stage.querySelector('.stage__grid');\n if(grid){ grid.addEventListener('click',function(){ if(stage.getAttribute('data-view')==='flip'){ flip(stage); } }); }\n syncScroll(stage);\n }\n inits.push(function(){ document.querySelectorAll('[data-compare]').forEach(initStage); });`;\n}\n\n/**\n * Drag the wipe handle to move the swipe divider. Uses pointer capture so the\n * drag keeps working when the pointer leaves the handle, and mirrors the value\n * into the (accessible) range slider.\n */\nfunction wipeDrag(): string {\n return `\n function wipePercent(stage,clientX){\n var pane=stage.querySelector('.stage__pane[data-pane=\"current\"]');\n if(!pane) return 50;\n var rect=pane.getBoundingClientRect();\n return Math.max(0,Math.min(100,(clientX-rect.left)/rect.width*100));\n }\n function setWipe(stage,percent){\n stage.style.setProperty('--swipe',percent+'%');\n var range=stage.querySelector('[data-compare-swipe]');\n if(range){ range.value=String(Math.round(percent)); }\n }\n function bindKnob(stage){\n var knob=stage.querySelector('[data-compare-knob]');\n if(!knob||knob.getAttribute('data-bound')) return;\n knob.setAttribute('data-bound','1');\n knob.addEventListener('pointerdown',function(e){\n e.preventDefault();\n knob.setPointerCapture(e.pointerId);\n setWipe(stage,wipePercent(stage,e.clientX));\n function move(ev){ setWipe(stage,wipePercent(stage,ev.clientX)); }\n function stop(){\n knob.removeEventListener('pointermove',move);\n knob.removeEventListener('pointerup',stop);\n knob.removeEventListener('pointercancel',stop);\n }\n knob.addEventListener('pointermove',move);\n knob.addEventListener('pointerup',stop);\n knob.addEventListener('pointercancel',stop);\n });\n }\n inits.push(function(){ document.querySelectorAll('[data-compare]').forEach(bindKnob); });`;\n}\n\n/** Delegated clicks: mode/zoom/filter segments and the shortcuts button. */\nfunction clickControls(): string {\n return `\n function openShortcuts(){\n var dialog=document.querySelector('dialog[data-shortcuts]');\n if(dialog&&typeof dialog.showModal==='function'&&!dialog.open){ dialog.showModal(); }\n }\n function chooseSource(btn,value){\n var root=btn.closest('[data-compare-sources]');\n if(!root) return;\n root.querySelectorAll('[data-compare-source]').forEach(function(pane){\n pane.hidden = pane.getAttribute('data-compare-source')!==value;\n });\n press(btn.closest('[data-compare-source-switch]'),value);\n }\n function chooseSegment(btn){\n var value=btn.getAttribute('data-view-value');\n var stage=btn.closest('[data-compare]');\n if(stage&&btn.closest('[data-compare-mode]')){ setMode(stage,value,true); }\n else if(stage&&btn.closest('[data-compare-zoom]')){ setZoom(stage,value,true); }\n else if(btn.closest('[data-compare-source-switch]')){ chooseSource(btn,value); }\n else if(btn.closest('[data-filter-switch]')){\n var list=document.querySelector('[data-diff-nav]');\n if(list){ list.setAttribute('data-filter',value); }\n press(btn.closest('[data-filter-switch]'),value);\n }\n }\n document.addEventListener('click',function(e){\n var t=e.target instanceof Element ? e.target : null;\n if(!t) return;\n var btn=t.closest('[data-view-value]');\n if(btn){ chooseSegment(btn); }\n if(t.closest('[data-shortcuts-open]')){ openShortcuts(); }\n });`;\n}\n\n/** Global review shortcuts; ignored while typing or with modifier keys held. */\nfunction keyboardShortcuts(): string {\n return `\n function typing(target){\n return target instanceof HTMLElement &&\n (target.tagName==='INPUT'||target.tagName==='TEXTAREA'||target.tagName==='SELECT'||target.isContentEditable);\n }\n function press1(selector){\n var el=document.querySelector(selector);\n if(el&&!el.disabled){ el.click(); return true; }\n return false;\n }\n function stepBrowser(dir){\n var tabs=[].slice.call(document.querySelectorAll('[data-browser-tabs] a'));\n var at=tabs.findIndex(function(a){ return a.getAttribute('aria-current')==='page'; });\n var target=at===-1?null:tabs[at+dir];\n if(target){ target.click(); return true; }\n return false;\n }\n function handleKey(key,stage){\n if(key==='['||key===']') return stepBrowser(key===']'?1:-1);\n if(key==='j'||key==='ArrowRight') return press1('[data-snap-next]');\n if(key==='k'||key==='ArrowLeft') return press1('[data-snap-prev]');\n if(key==='a'||key==='A') return press1('[data-approve]');\n if(key==='r'||key==='R') return press1('[data-reject]');\n if(key>='1'&&key<='5'){ setMode(stage,MODES[Number(key)-1],true); return true; }\n if(key==='f'){ nextZoom(stage); return true; }\n if(key==='+'||key==='='){ stepZoom(stage,1); return true; }\n if(key==='-'||key==='_'){ stepZoom(stage,-1); return true; }\n if(key==='t'){\n if(stage.getAttribute('data-view')==='flip'){ flip(stage); } else { setMode(stage,'flip',true); }\n return true;\n }\n if(key==='?'){ openShortcuts(); return true; }\n return false;\n }\n document.addEventListener('keydown',function(e){\n if(e.metaKey||e.ctrlKey||e.altKey||typing(e.target)) return;\n var stage=document.querySelector('[data-compare-source]:not([hidden]) [data-compare]')||document.querySelector('[data-compare]');\n if(!stage||document.querySelector('dialog[open]')) return;\n if(handleKey(e.key,stage)){ e.preventDefault(); }\n });`;\n}\n"],"mappings":";;;;;;;;;AAKA,SAAgB,eAAuB;CACrC,OAAO;EAAC,aAAa;EAAG,WAAW;EAAG,SAAS;EAAG,cAAc;EAAG,kBAAkB;CAAC,CAAC,CAAC,KACtF,IACF;AACF;;AAGA,SAAS,eAAuB;CAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCT;;AAGA,SAAS,aAAqB;CAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT;;;;;;AAOA,SAAS,WAAmB;CAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT;;AAGA,SAAS,gBAAwB;CAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT;;AAGA,SAAS,oBAA4B;CACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCT"}
|
|
@@ -8,7 +8,7 @@ import { ThemeMenu, UserMenu } from "./account.mjs";
|
|
|
8
8
|
import { adminNavItems, developerNavItems, projectNavItems } from "./nav.mjs";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
10
10
|
import { createUrlBuilder, safeImageUrl } from "@storyshelf/core/urls";
|
|
11
|
-
|
|
11
|
+
// src/ui/shell/sidebar.tsx
|
|
12
12
|
/**
|
|
13
13
|
* Left rail. Collapses to icons only on desktop (`html[data-sidebar="rail"]`)
|
|
14
14
|
* and becomes an off-canvas drawer on small screens.
|
|
@@ -317,7 +317,6 @@ const Sidebar = ({ nav, name, logo }) => {
|
|
|
317
317
|
]
|
|
318
318
|
});
|
|
319
319
|
};
|
|
320
|
-
//#endregion
|
|
321
320
|
export { Sidebar };
|
|
322
321
|
|
|
323
322
|
//# sourceMappingURL=sidebar.mjs.map
|
package/dist/ui/shell/topbar.mjs
CHANGED
|
@@ -10,7 +10,7 @@ import { breadcrumbs } from "./nav.mjs";
|
|
|
10
10
|
import { ProjectModel } from "@storyshelf/core/models";
|
|
11
11
|
import { Fragment, jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
12
12
|
import { createUrlBuilder } from "@storyshelf/core/urls";
|
|
13
|
-
|
|
13
|
+
// src/ui/shell/topbar.tsx
|
|
14
14
|
/** Slim, translucent bar: project picker plus breadcrumbs (account lives in the sidebar). */
|
|
15
15
|
const shellTopbar = css`
|
|
16
16
|
/* shell-topbar */
|
|
@@ -262,7 +262,6 @@ const ToastRegion = () => {
|
|
|
262
262
|
"aria-atomic": "false"
|
|
263
263
|
});
|
|
264
264
|
};
|
|
265
|
-
//#endregion
|
|
266
265
|
export { ToastRegion, TopBar };
|
|
267
266
|
|
|
268
267
|
//# sourceMappingURL=topbar.mjs.map
|
package/dist/ui/stacks.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/stacks.tsx
|
|
7
7
|
const hGaps = {
|
|
8
8
|
sm: "0.5rem",
|
|
9
9
|
md: "0.75rem",
|
|
@@ -76,7 +76,6 @@ const VStack = ({ gap = "md", align = "stretch", children }) => {
|
|
|
76
76
|
children
|
|
77
77
|
});
|
|
78
78
|
};
|
|
79
|
-
//#endregion
|
|
80
79
|
export { HStack, VStack };
|
|
81
80
|
|
|
82
81
|
//# sourceMappingURL=stacks.mjs.map
|
package/dist/ui/styles/base.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/styles/base.ts
|
|
5
5
|
/** Base reset, typography, focus ring, and shared utilities. */
|
|
6
6
|
function baseCss() {
|
|
7
7
|
return `${resetCss()}\n${utilityCss()}`;
|
|
@@ -35,7 +35,6 @@ function utilityCss() {
|
|
|
35
35
|
.mb-1 { margin-bottom: 1rem; }
|
|
36
36
|
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }`;
|
|
37
37
|
}
|
|
38
|
-
//#endregion
|
|
39
38
|
export { baseCss };
|
|
40
39
|
|
|
41
40
|
//# sourceMappingURL=base.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/styles/behavior.ts
|
|
5
5
|
/** Behavioral CSS: HTMX indicators, skeletons, tables, stats. */
|
|
6
6
|
function behaviorCss() {
|
|
7
7
|
return `${htmxCss()}\n${dataCss()}\n${chromeCss()}`;
|
|
@@ -37,7 +37,6 @@ function chromeCss() {
|
|
|
37
37
|
[data-theme-icon] { display: none; }
|
|
38
38
|
[data-theme="light"] [data-theme-icon="light"], [data-theme="dark"] [data-theme-icon="dark"], [data-theme="system"] [data-theme-icon="system"] { display: inline-flex; }`;
|
|
39
39
|
}
|
|
40
|
-
//#endregion
|
|
41
40
|
export { behaviorCss };
|
|
42
41
|
|
|
43
42
|
//# sourceMappingURL=behavior.mjs.map
|
|
@@ -2,7 +2,7 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "../css.mjs";
|
|
5
|
-
|
|
5
|
+
// src/ui/styles/review-layout.ts
|
|
6
6
|
/**
|
|
7
7
|
* Review workspace layout styles: header, filmstrip, canvas column, action
|
|
8
8
|
* bar, and shortcuts dialog. Shared by the `build-diff-*` page sections, so
|
|
@@ -341,7 +341,6 @@ const shortcutsDialog = css`
|
|
|
341
341
|
color: var(--text-secondary);
|
|
342
342
|
}
|
|
343
343
|
`;
|
|
344
|
-
//#endregion
|
|
345
344
|
export { actionBar, actionGroup, actionHints, actionPosition, canvasColumn, filmBody, filmItem, filmItemActive, filmStatus, filmSub, filmTitle, filmstrip, filmstripHead, filmstripList, headerActions, headerMain, headerMeta, headerProgress, headerSide, headerTitle, reviewHeader, shortcutsDialog, statusDots, viewerHead, viewerMeta, viewerTitle, workspace };
|
|
346
345
|
|
|
347
346
|
//# sourceMappingURL=review-layout.mjs.map
|
|
@@ -2,7 +2,7 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "../css.mjs";
|
|
5
|
-
|
|
5
|
+
// src/ui/styles/review.ts
|
|
6
6
|
/**
|
|
7
7
|
* Snapshot-card and comment styles shared by the build detail, library, and
|
|
8
8
|
* review pages (the review workspace layout lives in `review-layout.ts`).
|
|
@@ -80,7 +80,6 @@ const reviewCommentActions = css`
|
|
|
80
80
|
/* review-comment-actions */
|
|
81
81
|
margin-top: 0.5rem;
|
|
82
82
|
`;
|
|
83
|
-
//#endregion
|
|
84
83
|
export { diffPaneImg, reviewComment, reviewCommentActions, reviewCommentBody, reviewCommentHead, snapshotCard, snapshotCardBody, snapshotCardHead, snapshotCardMeta, snapshotGrid };
|
|
85
84
|
|
|
86
85
|
//# sourceMappingURL=review.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/styles/tokens.ts
|
|
5
5
|
/**
|
|
6
6
|
* CSS variable tokens: brand-driven colors (per theme), theme-independent
|
|
7
7
|
* scales (type, space, radius, motion), and tokens derived from the brand
|
|
@@ -126,7 +126,6 @@ function derivedVars(fb) {
|
|
|
126
126
|
--status-rejected-border: ${mix("--status-rejected", "32%", "--border")};
|
|
127
127
|
--status-info-border: ${mix("--status-info", "32%", "--border")};`;
|
|
128
128
|
}
|
|
129
|
-
//#endregion
|
|
130
129
|
export { tokenCss };
|
|
131
130
|
|
|
132
131
|
//# sourceMappingURL=tokens.mjs.map
|
package/dist/ui/styles.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { baseCss } from "./styles/base.mjs";
|
|
5
5
|
import { behaviorCss } from "./styles/behavior.mjs";
|
|
6
6
|
import { tokenCss } from "./styles/tokens.mjs";
|
|
7
|
-
|
|
7
|
+
// src/ui/styles.ts
|
|
8
8
|
/** Build the global CSS stylesheet from the light and dark brand themes. */
|
|
9
9
|
function baseStyle(light, dark) {
|
|
10
10
|
return [
|
|
@@ -13,7 +13,6 @@ function baseStyle(light, dark) {
|
|
|
13
13
|
behaviorCss()
|
|
14
14
|
].join("\n");
|
|
15
15
|
}
|
|
16
|
-
//#endregion
|
|
17
16
|
export { baseStyle };
|
|
18
17
|
|
|
19
18
|
//# sourceMappingURL=styles.mjs.map
|
package/dist/ui/subnav.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { Icon } from "./icons/icon.mjs";
|
|
6
6
|
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/ui/subnav.tsx
|
|
8
8
|
const layout = css`
|
|
9
9
|
/* subnav-layout */
|
|
10
10
|
display: grid;
|
|
@@ -85,7 +85,6 @@ const SubNavLayout = ({ items, label, children }) => {
|
|
|
85
85
|
}), /* @__PURE__ */ jsx("div", { children })]
|
|
86
86
|
});
|
|
87
87
|
};
|
|
88
|
-
//#endregion
|
|
89
88
|
export { SubNavLayout };
|
|
90
89
|
|
|
91
90
|
//# sourceMappingURL=subnav.mjs.map
|
package/dist/ui/table.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/table.tsx
|
|
7
7
|
const tableWrap = css`
|
|
8
8
|
/* table */
|
|
9
9
|
overflow: auto;
|
|
@@ -67,7 +67,6 @@ const Table = ({ dense = false, children }) => {
|
|
|
67
67
|
children
|
|
68
68
|
});
|
|
69
69
|
};
|
|
70
|
-
//#endregion
|
|
71
70
|
export { Table };
|
|
72
71
|
|
|
73
72
|
//# sourceMappingURL=table.mjs.map
|
package/dist/ui/theme.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/ui/theme.ts
|
|
5
5
|
/** Default light brand theme (shadcn-like zinc, content-first). */
|
|
6
6
|
const LIGHT_THEME = {
|
|
7
7
|
accent: "#1d5fcf",
|
|
@@ -58,7 +58,6 @@ const DARK_THEME = {
|
|
|
58
58
|
radiusSm: "0.375rem",
|
|
59
59
|
shadow: "0 1px 2px rgba(0,0,0,.3)"
|
|
60
60
|
};
|
|
61
|
-
//#endregion
|
|
62
61
|
export { DARK_THEME, LIGHT_THEME };
|
|
63
62
|
|
|
64
63
|
//# sourceMappingURL=theme.mjs.map
|
package/dist/ui/thumbnail.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { css } from "./css.mjs";
|
|
5
5
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/ui/thumbnail.tsx
|
|
7
7
|
const thumbFrame = css`
|
|
8
8
|
/* thumbnail */
|
|
9
9
|
position: relative;
|
|
@@ -45,7 +45,6 @@ const Thumbnail = ({ src, alt, placeholder = "No preview" }) => {
|
|
|
45
45
|
})
|
|
46
46
|
});
|
|
47
47
|
};
|
|
48
|
-
//#endregion
|
|
49
48
|
export { Thumbnail };
|
|
50
49
|
|
|
51
50
|
//# sourceMappingURL=thumbnail.mjs.map
|
package/dist/ui/time.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { jsx } from "hono/jsx/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/ui/time.tsx
|
|
6
6
|
const MINUTE = 60;
|
|
7
7
|
const HOUR = 3600;
|
|
8
8
|
const DAY = 86400;
|
|
@@ -44,7 +44,6 @@ const RelativeTime = ({ value }) => {
|
|
|
44
44
|
children: formatRelative(value)
|
|
45
45
|
});
|
|
46
46
|
};
|
|
47
|
-
//#endregion
|
|
48
47
|
export { RelativeTime, formatRelative };
|
|
49
48
|
|
|
50
49
|
//# sourceMappingURL=time.mjs.map
|