@eifi1/ui-kit 0.30.0 → 0.31.0
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/README.md +42 -5
- package/dist/account/data-export-setting.js +3 -2
- package/dist/account/data-export-setting.js.map +1 -1
- package/dist/account/delete-account-setting.d.ts +5 -1
- package/dist/account/delete-account-setting.js +3 -2
- package/dist/account/delete-account-setting.js.map +1 -1
- package/dist/account/email-change-setting.js +4 -3
- package/dist/account/email-change-setting.js.map +1 -1
- package/dist/account/sessions-setting.js +3 -2
- package/dist/account/sessions-setting.js.map +1 -1
- package/dist/admin/admin-action-confirm.d.ts +5 -1
- package/dist/admin/invitations-panel.d.ts +5 -1
- package/dist/admin/invitations-panel.js +3 -2
- package/dist/admin/invitations-panel.js.map +1 -1
- package/dist/admin/reviewer-scope-editor.d.ts +5 -1
- package/dist/admin/role-select.d.ts +5 -1
- package/dist/admin/transfer-ownership-dialog.d.ts +5 -1
- package/dist/admin/user-roster.d.ts +5 -1
- package/dist/auth/auth-errors.d.ts +24 -6
- package/dist/auth/auth-errors.js +7 -1
- package/dist/auth/auth-errors.js.map +1 -1
- package/dist/auth/register-form.d.ts +5 -1
- package/dist/auth/sign-in-form.d.ts +15 -1
- package/dist/auth/sign-in-form.js +12 -3
- package/dist/auth/sign-in-form.js.map +1 -1
- package/dist/chart.d.ts +5 -1
- package/dist/components/account-settings-labels.d.ts +12 -0
- package/dist/components/account-settings-labels.js +2 -1
- package/dist/components/account-settings-labels.js.map +1 -1
- package/dist/components/account-settings.d.ts +8 -2
- package/dist/components/account-settings.js +19 -11
- package/dist/components/account-settings.js.map +1 -1
- package/dist/components/amount-input.d.ts +5 -1
- package/dist/components/button-group.d.ts +5 -1
- package/dist/components/calculator.d.ts +5 -1
- package/dist/components/confirm-dialog.d.ts +5 -1
- package/dist/components/copy-button.d.ts +5 -1
- package/dist/components/danger-confirm.d.ts +5 -1
- package/dist/components/data-table.js +8 -1
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +9 -4
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/facing-pair.d.ts +5 -1
- package/dist/components/file-button.d.ts +5 -1
- package/dist/components/file-dropzone.d.ts +5 -1
- package/dist/components/form-actions.d.ts +5 -1
- package/dist/components/iban-input.d.ts +5 -1
- package/dist/components/language-select.d.ts +5 -1
- package/dist/components/legal-page.d.ts +5 -1
- package/dist/components/legal.d.ts +5 -1
- package/dist/components/money-field.d.ts +5 -1
- package/dist/components/number-field.d.ts +5 -1
- package/dist/components/number-input.d.ts +5 -1
- package/dist/components/numpad-sheet.d.ts +5 -1
- package/dist/components/passkeys-setting.js +2 -1
- package/dist/components/passkeys-setting.js.map +1 -1
- package/dist/components/phone-input.d.ts +5 -1
- package/dist/components/series-chart.d.ts +5 -1
- package/dist/components/settings-fields.d.ts +40 -3
- package/dist/components/settings-fields.js +20 -1
- package/dist/components/settings-fields.js.map +1 -1
- package/dist/components/share-card.d.ts +5 -1
- package/dist/components/text-link.d.ts +5 -1
- package/dist/components/time-input.d.ts +5 -1
- package/dist/components/ui.d.ts +5 -1
- package/dist/{delete-account-setting-CGVMckMw.d.ts → delete-account-setting-DCFS5Vof.d.ts} +52 -23
- package/dist/demo/demo-banner.d.ts +51 -0
- package/dist/demo/demo-banner.js +97 -0
- package/dist/demo/demo-banner.js.map +1 -0
- package/dist/demo/demo-countdown.d.ts +58 -0
- package/dist/demo/demo-countdown.js +79 -0
- package/dist/demo/demo-countdown.js.map +1 -0
- package/dist/demo/demo-ended.d.ts +45 -0
- package/dist/demo/demo-ended.js +42 -0
- package/dist/demo/demo-ended.js.map +1 -0
- package/dist/demo/demo-labels.d.ts +53 -0
- package/dist/demo/demo-labels.js +29 -0
- package/dist/demo/demo-labels.js.map +1 -0
- package/dist/demo/demo-session.d.ts +30 -0
- package/dist/demo/demo-session.js +8 -0
- package/dist/demo/demo-session.js.map +1 -0
- package/dist/demo/demo-start.d.ts +54 -0
- package/dist/demo/demo-start.js +68 -0
- package/dist/demo/demo-start.js.map +1 -0
- package/dist/feedback/feedback-attachment.d.ts +5 -1
- package/dist/feedback/feedback-context.d.ts +5 -1
- package/dist/feedback/feedback-crash.d.ts +5 -1
- package/dist/feedback/feedback-dialog.d.ts +5 -1
- package/dist/feedback/feedback-inbox.d.ts +5 -1
- package/dist/feedback/feedback-inbox.js +12 -2
- package/dist/feedback/feedback-inbox.js.map +1 -1
- package/dist/feedback/feedback-labels.d.ts +5 -1
- package/dist/feedback/feedback-labels.js +1 -0
- package/dist/feedback/feedback-labels.js.map +1 -1
- package/dist/feedback/feedback-menu.d.ts +5 -1
- package/dist/feedback/feedback-record.d.ts +5 -1
- package/dist/feedback/feedback-record.js +2 -0
- package/dist/feedback/feedback-record.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +5 -1
- package/dist/feedback/feedback-row-detail.js +7 -0
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +5 -1
- package/dist/feedback/feedback-submit.d.ts +5 -1
- package/dist/feedback/feedback-swipe.d.ts +6 -2
- package/dist/feedback/feedback-swipe.js.map +1 -1
- package/dist/feedback/feedback-table.d.ts +5 -1
- package/dist/feedback/feedback-thread.d.ts +5 -1
- package/dist/feedback.d.ts +5 -1
- package/dist/hooks/use-file-drop.d.ts +5 -1
- package/dist/i18n/defaults.d.ts +5 -1
- package/dist/i18n/defaults.js +6 -0
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.d.ts +5 -1
- package/dist/i18n/german.js +84 -2
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +5 -1
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/languages.d.ts +5 -1
- package/dist/i18n/locales/de-CH.d.ts +5 -1
- package/dist/i18n/locales/en.d.ts +5 -1
- package/dist/i18n/locales/es.d.ts +5 -1
- package/dist/i18n/locales/es.js +81 -2
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +5 -1
- package/dist/i18n/locales/fr.js +82 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +5 -1
- package/dist/i18n/locales/hu.js +82 -2
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +5 -1
- package/dist/i18n/locales/it.js +81 -2
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +5 -1
- package/dist/i18n/locales/zh.js +80 -2
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.d.ts +5 -1
- package/dist/i18n/review.js +14 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +25 -3
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -1
- package/dist/landing/access.d.ts +48 -0
- package/dist/landing/access.js +38 -0
- package/dist/landing/access.js.map +1 -0
- package/dist/landing/landing-actions.d.ts +138 -0
- package/dist/landing/landing-actions.js +39 -0
- package/dist/landing/landing-actions.js.map +1 -0
- package/dist/landing/landing-labels.d.ts +43 -0
- package/dist/landing/landing-labels.js +23 -0
- package/dist/landing/landing-labels.js.map +1 -0
- package/dist/landing/landing-sections.d.ts +218 -0
- package/dist/landing/landing-sections.js +167 -0
- package/dist/landing/landing-sections.js.map +1 -0
- package/dist/landing/page-seo.d.ts +99 -0
- package/dist/landing/page-seo.js +121 -0
- package/dist/landing/page-seo.js.map +1 -0
- package/dist/landing/public-header.d.ts +148 -0
- package/dist/landing/public-header.js +49 -0
- package/dist/landing/public-header.js.map +1 -0
- package/dist/landing/routing.d.ts +218 -0
- package/dist/landing/routing.js +81 -0
- package/dist/landing/routing.js.map +1 -0
- package/dist/rhf/fields.d.ts +5 -1
- package/dist/rhf/form.d.ts +5 -1
- package/dist/rhf.d.ts +5 -1
- package/dist/settings/settings-catalogue.d.ts +84 -0
- package/dist/settings/settings-catalogue.js +47 -0
- package/dist/settings/settings-catalogue.js.map +1 -0
- package/dist/settings/settings-context.d.ts +31 -0
- package/dist/settings/settings-context.js +11 -0
- package/dist/settings/settings-context.js.map +1 -0
- package/dist/settings/settings-heading.d.ts +50 -0
- package/dist/settings/settings-heading.js +27 -0
- package/dist/settings/settings-heading.js.map +1 -0
- package/dist/settings/settings-labels.d.ts +41 -0
- package/dist/settings/settings-labels.js +38 -0
- package/dist/settings/settings-labels.js.map +1 -0
- package/dist/settings/settings-layout.d.ts +77 -0
- package/dist/settings/settings-layout.js +242 -0
- package/dist/settings/settings-layout.js.map +1 -0
- package/dist/settings/settings-section.d.ts +133 -0
- package/dist/settings/settings-section.js +63 -0
- package/dist/settings/settings-section.js.map +1 -0
- package/dist/settings/use-account-language.d.ts +83 -0
- package/dist/settings/use-account-language.js +62 -0
- package/dist/settings/use-account-language.js.map +1 -0
- package/dist/settings/use-settings-focus.d.ts +34 -0
- package/dist/settings/use-settings-focus.js +77 -0
- package/dist/settings/use-settings-focus.js.map +1 -0
- package/dist/settings/use-settings-route.d.ts +118 -0
- package/dist/settings/use-settings-route.js +120 -0
- package/dist/settings/use-settings-route.js.map +1 -0
- package/dist/shell/app-shell.d.ts +11 -1
- package/dist/shell/app-shell.js +3 -2
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/top-bar-brand.d.ts +5 -1
- package/dist/shell.d.ts +15 -1
- package/dist/shell.js +56 -0
- package/dist/shell.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +5 -1
- package/dist/wizard.d.ts +5 -1
- package/package.json +2 -1
- package/src/account/data-export-setting.tsx +3 -2
- package/src/account/delete-account-setting.tsx +3 -2
- package/src/account/email-change-setting.tsx +4 -7
- package/src/account/sessions-setting.tsx +3 -2
- package/src/admin/invitations-panel.tsx +11 -4
- package/src/auth/auth-errors.ts +36 -5
- package/src/auth/sign-in-form.tsx +34 -3
- package/src/components/account-settings-labels.ts +13 -0
- package/src/components/account-settings.tsx +33 -12
- package/src/components/data-table.tsx +8 -0
- package/src/components/date-picker.tsx +9 -4
- package/src/components/passkeys-setting.tsx +2 -1
- package/src/components/settings-fields.tsx +50 -1
- package/src/demo/demo-banner.tsx +159 -0
- package/src/demo/demo-countdown.ts +141 -0
- package/src/demo/demo-ended.tsx +89 -0
- package/src/demo/demo-labels.ts +78 -0
- package/src/demo/demo-session.ts +32 -0
- package/src/demo/demo-start.tsx +150 -0
- package/src/feedback/feedback-inbox.tsx +21 -8
- package/src/feedback/feedback-labels.ts +2 -1
- package/src/feedback/feedback-record.ts +10 -7
- package/src/feedback/feedback-row-detail.tsx +28 -4
- package/src/feedback/feedback-swipe.tsx +1 -1
- package/src/i18n/defaults.ts +6 -0
- package/src/i18n/german.ts +86 -0
- package/src/i18n/kit-labels.tsx +9 -0
- package/src/i18n/locales/es.ts +83 -0
- package/src/i18n/locales/fr.ts +84 -0
- package/src/i18n/locales/hu.ts +84 -0
- package/src/i18n/locales/it.ts +83 -0
- package/src/i18n/locales/zh.ts +81 -0
- package/src/i18n/review.ts +13 -0
- package/src/index.ts +92 -1
- package/src/landing/access.ts +97 -0
- package/src/landing/landing-actions.tsx +92 -0
- package/src/landing/landing-labels.ts +59 -0
- package/src/landing/landing-sections.tsx +337 -0
- package/src/landing/page-seo.ts +251 -0
- package/src/landing/public-header.tsx +120 -0
- package/src/landing/routing.tsx +209 -0
- package/src/settings/settings-catalogue.ts +132 -0
- package/src/settings/settings-context.ts +33 -0
- package/src/settings/settings-heading.tsx +65 -0
- package/src/settings/settings-labels.ts +75 -0
- package/src/settings/settings-layout.tsx +379 -0
- package/src/settings/settings-section.tsx +108 -0
- package/src/settings/use-account-language.ts +146 -0
- package/src/settings/use-settings-focus.ts +120 -0
- package/src/settings/use-settings-route.ts +258 -0
- package/src/shell/app-shell.tsx +10 -2
- package/src/shell.ts +45 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The demo's words (docs/landing-demo-harmonization.md §5) — the `demo` namespace of
|
|
3
|
+
* `<UiKitProvider labels>`: `DemoStart`'s progress and refusals, `DemoBanner`'s
|
|
4
|
+
* countdown and model line, `DemoEnded`, and the reason of the read-only lock.
|
|
5
|
+
*
|
|
6
|
+
* "Demo" means the demo session and the shared demo data it shows (§2.10) — never
|
|
7
|
+
* keksdose's blur toggle, which is "Presentation mode" now. "Request access" and "Sign
|
|
8
|
+
* in" are the `landing` namespace's, so they read the same on every public page.
|
|
9
|
+
*/
|
|
10
|
+
interface DemoLabels {
|
|
11
|
+
/** `DemoStart` while the demo is being created. */
|
|
12
|
+
starting: string;
|
|
13
|
+
/** `demo_rate_limited`: too many demos from one network, given the wait in whole
|
|
14
|
+
* minutes from `Retry-After` — or `undefined` without one. */
|
|
15
|
+
rateLimited: (minutes?: number) => string;
|
|
16
|
+
/** `demo_capacity`: the live cap is reached. */
|
|
17
|
+
capacity: string;
|
|
18
|
+
/** `demo_disabled` and `demo_not_ready`: the demo is off, or its data isn't there. */
|
|
19
|
+
unavailable: string;
|
|
20
|
+
/** Any other failure — the network, a 500. */
|
|
21
|
+
failed: string;
|
|
22
|
+
/** `DemoStart`'s way out after a refusal, to the landing. */
|
|
23
|
+
backToStart: string;
|
|
24
|
+
/** The banner's countdown with an hour or more left: "Demo · 23 h 12 min left". */
|
|
25
|
+
hoursLeft: (hours: number, minutes: number) => string;
|
|
26
|
+
/** …and in the last hour, minutes only: "Demo · 50 min left". */
|
|
27
|
+
minutesLeft: (minutes: number) => string;
|
|
28
|
+
/** The banner's word when the end is unknown (no readable `expiresAt`). */
|
|
29
|
+
badge: string;
|
|
30
|
+
/** The banner's line for model R, shared read-only data. */
|
|
31
|
+
readOnly: string;
|
|
32
|
+
/** The banner's line for model S, a sandbox of one's own. */
|
|
33
|
+
sandbox: string;
|
|
34
|
+
/** The name of the banner's show/hide toggle (`aria-expanded` says which). */
|
|
35
|
+
details: string;
|
|
36
|
+
/** The reason a locked commit shows in a read-only demo (model R) — for the app's
|
|
37
|
+
* `<WriteLockProvider locked reason={…}>` (§5.4). */
|
|
38
|
+
writeLocked: string;
|
|
39
|
+
/** `DemoEnded`'s heading; also the banner's text at zero. */
|
|
40
|
+
endedTitle: string;
|
|
41
|
+
/** `DemoEnded`'s line for model R. */
|
|
42
|
+
endedReadOnly: string;
|
|
43
|
+
/** `DemoEnded`'s line for model S. */
|
|
44
|
+
endedSandbox: string;
|
|
45
|
+
/** `DemoEnded`'s first action, to `/demo`. */
|
|
46
|
+
restart: string;
|
|
47
|
+
}
|
|
48
|
+
declare const DEFAULT_DEMO_LABELS: DemoLabels;
|
|
49
|
+
/** The `demo` namespace, resolved: English, then the provider, then `labels`. The app
|
|
50
|
+
* reads `writeLocked` from here for its `WriteLockProvider`. */
|
|
51
|
+
declare function useDemoLabels(labels?: Partial<DemoLabels>): DemoLabels;
|
|
52
|
+
|
|
53
|
+
export { DEFAULT_DEMO_LABELS, type DemoLabels, useDemoLabels };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useKitLabels } from "../i18n/kit-labels.js";
|
|
3
|
+
const DEFAULT_DEMO_LABELS = {
|
|
4
|
+
starting: "Starting the demo\u2026",
|
|
5
|
+
rateLimited: (minutes) => minutes ? `Too many demos from this network. Try again in ${minutes} min.` : "Too many demos from this network. Try again later.",
|
|
6
|
+
capacity: "The demo is full right now. Try again later.",
|
|
7
|
+
unavailable: "The demo isn\u2019t available right now.",
|
|
8
|
+
failed: "The demo could not be started. Please try again.",
|
|
9
|
+
backToStart: "Back to the start page",
|
|
10
|
+
hoursLeft: (hours, minutes) => `Demo \xB7 ${hours} h ${minutes} min left`,
|
|
11
|
+
minutesLeft: (minutes) => `Demo \xB7 ${minutes} min left`,
|
|
12
|
+
badge: "Demo",
|
|
13
|
+
readOnly: "You\u2019re looking at sample data. Changes aren\u2019t possible.",
|
|
14
|
+
sandbox: "Your own work is deleted when the demo ends.",
|
|
15
|
+
details: "Demo details",
|
|
16
|
+
writeLocked: "Not possible in the demo.",
|
|
17
|
+
endedTitle: "The demo has ended",
|
|
18
|
+
endedReadOnly: "Sample data is reset regularly.",
|
|
19
|
+
endedSandbox: "Sample data is reset regularly; your own work from the demo is deleted.",
|
|
20
|
+
restart: "Start a new demo"
|
|
21
|
+
};
|
|
22
|
+
function useDemoLabels(labels) {
|
|
23
|
+
return useKitLabels("demo", DEFAULT_DEMO_LABELS, labels);
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
DEFAULT_DEMO_LABELS,
|
|
27
|
+
useDemoLabels
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=demo-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/demo/demo-labels.ts"],"sourcesContent":["import { useKitLabels } from \"../i18n/kit-labels\";\n\n/**\n * The demo's words (docs/landing-demo-harmonization.md §5) — the `demo` namespace of\n * `<UiKitProvider labels>`: `DemoStart`'s progress and refusals, `DemoBanner`'s\n * countdown and model line, `DemoEnded`, and the reason of the read-only lock.\n *\n * \"Demo\" means the demo session and the shared demo data it shows (§2.10) — never\n * keksdose's blur toggle, which is \"Presentation mode\" now. \"Request access\" and \"Sign\n * in\" are the `landing` namespace's, so they read the same on every public page.\n */\nexport interface DemoLabels {\n /** `DemoStart` while the demo is being created. */\n starting: string;\n /** `demo_rate_limited`: too many demos from one network, given the wait in whole\n * minutes from `Retry-After` — or `undefined` without one. */\n rateLimited: (minutes?: number) => string;\n /** `demo_capacity`: the live cap is reached. */\n capacity: string;\n /** `demo_disabled` and `demo_not_ready`: the demo is off, or its data isn't there. */\n unavailable: string;\n /** Any other failure — the network, a 500. */\n failed: string;\n /** `DemoStart`'s way out after a refusal, to the landing. */\n backToStart: string;\n /** The banner's countdown with an hour or more left: \"Demo · 23 h 12 min left\". */\n hoursLeft: (hours: number, minutes: number) => string;\n /** …and in the last hour, minutes only: \"Demo · 50 min left\". */\n minutesLeft: (minutes: number) => string;\n /** The banner's word when the end is unknown (no readable `expiresAt`). */\n badge: string;\n /** The banner's line for model R, shared read-only data. */\n readOnly: string;\n /** The banner's line for model S, a sandbox of one's own. */\n sandbox: string;\n /** The name of the banner's show/hide toggle (`aria-expanded` says which). */\n details: string;\n /** The reason a locked commit shows in a read-only demo (model R) — for the app's\n * `<WriteLockProvider locked reason={…}>` (§5.4). */\n writeLocked: string;\n /** `DemoEnded`'s heading; also the banner's text at zero. */\n endedTitle: string;\n /** `DemoEnded`'s line for model R. */\n endedReadOnly: string;\n /** `DemoEnded`'s line for model S. */\n endedSandbox: string;\n /** `DemoEnded`'s first action, to `/demo`. */\n restart: string;\n}\n\nexport const DEFAULT_DEMO_LABELS: DemoLabels = {\n starting: \"Starting the demo…\",\n rateLimited: (minutes) =>\n minutes\n ? `Too many demos from this network. Try again in ${minutes} min.`\n : \"Too many demos from this network. Try again later.\",\n capacity: \"The demo is full right now. Try again later.\",\n unavailable: \"The demo isn’t available right now.\",\n failed: \"The demo could not be started. Please try again.\",\n backToStart: \"Back to the start page\",\n hoursLeft: (hours, minutes) => `Demo · ${hours} h ${minutes} min left`,\n minutesLeft: (minutes) => `Demo · ${minutes} min left`,\n badge: \"Demo\",\n readOnly: \"You’re looking at sample data. Changes aren’t possible.\",\n sandbox: \"Your own work is deleted when the demo ends.\",\n details: \"Demo details\",\n writeLocked: \"Not possible in the demo.\",\n endedTitle: \"The demo has ended\",\n endedReadOnly: \"Sample data is reset regularly.\",\n endedSandbox: \"Sample data is reset regularly; your own work from the demo is deleted.\",\n restart: \"Start a new demo\",\n};\n\n/** The `demo` namespace, resolved: English, then the provider, then `labels`. The app\n * reads `writeLocked` from here for its `WriteLockProvider`. */\nexport function useDemoLabels(labels?: Partial<DemoLabels>): DemoLabels {\n return useKitLabels(\"demo\", DEFAULT_DEMO_LABELS, labels);\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAkDtB,MAAM,sBAAkC;AAAA,EAC7C,UAAU;AAAA,EACV,aAAa,CAAC,YACZ,UACI,kDAAkD,OAAO,UACzD;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW,CAAC,OAAO,YAAY,aAAU,KAAK,MAAM,OAAO;AAAA,EAC3D,aAAa,CAAC,YAAY,aAAU,OAAO;AAAA,EAC3C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AACX;AAIO,SAAS,cAAc,QAA0C;AACtE,SAAO,aAAa,QAAQ,qBAAqB,MAAM;AACzD;","names":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two demo models (docs/landing-demo-harmonization.md §2.3):
|
|
3
|
+
*
|
|
4
|
+
* - `read-only` (R) — keksdose and kastlan: one pre-filled shared dataset a throwaway
|
|
5
|
+
* demo user may look at but not change;
|
|
6
|
+
* - `sandbox` (S) — Kurvenschmiede: the demo user reads system-owned worked examples and
|
|
7
|
+
* may create or copy work of its own, deleted with the demo account.
|
|
8
|
+
*/
|
|
9
|
+
type DemoModel = "read-only" | "sandbox";
|
|
10
|
+
/** The fields of an `/auth/me` answer {@link isDemoSession} reads — server-kit's
|
|
11
|
+
* `UserResponse.is_demo` (0.5: and `demo_expires_at`), or a client's camel-cased copy. */
|
|
12
|
+
interface DemoSessionUser {
|
|
13
|
+
is_demo?: boolean | null;
|
|
14
|
+
isDemo?: boolean | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Whether the signed-in user is a demo (§5, §6.5): server-kit's `is_demo` on
|
|
18
|
+
* `/auth/me`, or a client's `isDemo`. `false` for no user at all.
|
|
19
|
+
*
|
|
20
|
+
* What the client branches on: the demo banner instead of keksdose's preview banner, the
|
|
21
|
+
* header's "Continue the demo", a 401 that ends at `/demo/ended` instead of `/login`, and
|
|
22
|
+
* the crash reporter, which files nothing for a demo:
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* createCrashReporter({ …, suppress: () => isDemoSession(useAuth.getState().user) });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare function isDemoSession(me: DemoSessionUser | null | undefined): boolean;
|
|
29
|
+
|
|
30
|
+
export { type DemoModel, type DemoSessionUser, isDemoSession };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/demo/demo-session.ts"],"sourcesContent":["/**\n * The two demo models (docs/landing-demo-harmonization.md §2.3):\n *\n * - `read-only` (R) — keksdose and kastlan: one pre-filled shared dataset a throwaway\n * demo user may look at but not change;\n * - `sandbox` (S) — Kurvenschmiede: the demo user reads system-owned worked examples and\n * may create or copy work of its own, deleted with the demo account.\n */\nexport type DemoModel = \"read-only\" | \"sandbox\";\n\n/** The fields of an `/auth/me` answer {@link isDemoSession} reads — server-kit's\n * `UserResponse.is_demo` (0.5: and `demo_expires_at`), or a client's camel-cased copy. */\nexport interface DemoSessionUser {\n is_demo?: boolean | null;\n isDemo?: boolean | null;\n}\n\n/**\n * Whether the signed-in user is a demo (§5, §6.5): server-kit's `is_demo` on\n * `/auth/me`, or a client's `isDemo`. `false` for no user at all.\n *\n * What the client branches on: the demo banner instead of keksdose's preview banner, the\n * header's \"Continue the demo\", a 401 that ends at `/demo/ended` instead of `/login`, and\n * the crash reporter, which files nothing for a demo:\n *\n * ```ts\n * createCrashReporter({ …, suppress: () => isDemoSession(useAuth.getState().user) });\n * ```\n */\nexport function isDemoSession(me: DemoSessionUser | null | undefined): boolean {\n return me?.is_demo === true || me?.isDemo === true;\n}\n"],"mappings":";AA6BO,SAAS,cAAc,IAAiD;AAC7E,SAAO,IAAI,YAAY,QAAQ,IAAI,WAAW;AAChD;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
import { AccessChoice } from '../landing/access.js';
|
|
4
|
+
import { LandingLabels } from '../landing/landing-labels.js';
|
|
5
|
+
import { DemoLabels } from './demo-labels.js';
|
|
6
|
+
|
|
7
|
+
interface DemoStartProps<T> extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
|
|
8
|
+
/**
|
|
9
|
+
* Create the demo: the app's `POST /auth/demo-session {locale}`. Resolve with what it
|
|
10
|
+
* answered (the `TokenResponse`, `refresh_token: null`, `expires_at`); reject with the
|
|
11
|
+
* client's error — the codes are read out of it. Called once per mount.
|
|
12
|
+
*/
|
|
13
|
+
start: () => Promise<T>;
|
|
14
|
+
/** The demo exists: store the session (and, for kastlan, `kastlan.demoSession`) and
|
|
15
|
+
* replace to the app's home. The page keeps saying "Starting the demo…" meanwhile. */
|
|
16
|
+
onStarted: (session: T) => void;
|
|
17
|
+
/** "Request access" beside a refusal. */
|
|
18
|
+
access: AccessChoice;
|
|
19
|
+
/** "Back to the start page". Default `/`. */
|
|
20
|
+
backHref?: string;
|
|
21
|
+
/** `false` adds no `noindex` — for a preview. Default `true`: `/demo` is never indexed
|
|
22
|
+
* (§4.3). */
|
|
23
|
+
noIndex?: boolean;
|
|
24
|
+
labels?: Partial<DemoLabels>;
|
|
25
|
+
/** The access words (`landing` namespace) for this instance. */
|
|
26
|
+
landingLabels?: Partial<LandingLabels>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The `/demo` page's content (docs/landing-demo-harmonization.md §5.2): it starts the
|
|
30
|
+
* demo ONCE — StrictMode's double mount included, keksdose's ref guard — and says
|
|
31
|
+
* "Starting the demo…" until the app has the session and has moved on.
|
|
32
|
+
*
|
|
33
|
+
* A refusal says why, in the visitor's words, and offers "Request access" and "Back to
|
|
34
|
+
* the start page":
|
|
35
|
+
*
|
|
36
|
+
* | code | says |
|
|
37
|
+
* |---|---|
|
|
38
|
+
* | `demo_rate_limited` (429) | "Too many demos from this network. Try again in N min." — N from `Retry-After` |
|
|
39
|
+
* | `demo_capacity` (429) | "The demo is full right now. Try again later." |
|
|
40
|
+
* | `demo_disabled` (404), `demo_not_ready` (503) | "The demo isn't available right now." |
|
|
41
|
+
* | anything else | "The demo could not be started. Please try again." |
|
|
42
|
+
*
|
|
43
|
+
* keksdose fell back to `/register` with a toast; registration is invitation-only now,
|
|
44
|
+
* so the way on is the access mail.
|
|
45
|
+
*
|
|
46
|
+
* Put it in the app's `AuthLayout`. A live demo session never reaches it: the `/demo`
|
|
47
|
+
* route sits in `RedirectIfAuthed` WITHOUT `allowDemo`, which continues the live demo at
|
|
48
|
+
* its resume target instead of starting a second one. A cold start is the kit's
|
|
49
|
+
* `ServerWakeNotice`'s, once the app's watcher counts this POST
|
|
50
|
+
* (`watchReadsAnd(/\/auth\/demo-session\b/)`).
|
|
51
|
+
*/
|
|
52
|
+
declare function DemoStart<T>({ start, onStarted, access, backHref, noIndex, labels: labelsProp, landingLabels, className, ...rest }: DemoStartProps<T>): react.JSX.Element;
|
|
53
|
+
|
|
54
|
+
export { DemoStart, type DemoStartProps };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { AlertBanner } from "../components/alert-banner.js";
|
|
6
|
+
import { Button, Spinner } from "../components/ui.js";
|
|
7
|
+
import { useNoIndex } from "../hooks/use-noindex.js";
|
|
8
|
+
import { authErrorCode, isRateLimited, retryAfterSeconds } from "../auth/auth-errors.js";
|
|
9
|
+
import { useOncePerKey } from "../auth/status-parts.js";
|
|
10
|
+
import { useAccessAction } from "../landing/access.js";
|
|
11
|
+
import { useDemoLabels } from "./demo-labels.js";
|
|
12
|
+
function refusalOf(error) {
|
|
13
|
+
const code = authErrorCode(error);
|
|
14
|
+
if (code === "demo_capacity") return { reason: "capacity" };
|
|
15
|
+
if (code === "demo_disabled" || code === "demo_not_ready") return { reason: "unavailable" };
|
|
16
|
+
if (code === "demo_rate_limited" || code === void 0 && isRateLimited(error)) {
|
|
17
|
+
const seconds = retryAfterSeconds(error);
|
|
18
|
+
return { reason: "rateLimited", minutes: seconds ? Math.ceil(seconds / 60) : void 0 };
|
|
19
|
+
}
|
|
20
|
+
return { reason: "failed" };
|
|
21
|
+
}
|
|
22
|
+
function messageOf(refusal, labels) {
|
|
23
|
+
switch (refusal.reason) {
|
|
24
|
+
case "rateLimited":
|
|
25
|
+
return labels.rateLimited(refusal.minutes);
|
|
26
|
+
case "capacity":
|
|
27
|
+
return labels.capacity;
|
|
28
|
+
case "unavailable":
|
|
29
|
+
return labels.unavailable;
|
|
30
|
+
case "failed":
|
|
31
|
+
return labels.failed;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const ONCE = "demo";
|
|
35
|
+
function DemoStart({
|
|
36
|
+
start,
|
|
37
|
+
onStarted,
|
|
38
|
+
access,
|
|
39
|
+
backHref = "/",
|
|
40
|
+
noIndex = true,
|
|
41
|
+
labels: labelsProp,
|
|
42
|
+
landingLabels,
|
|
43
|
+
className,
|
|
44
|
+
...rest
|
|
45
|
+
}) {
|
|
46
|
+
const labels = useDemoLabels(labelsProp);
|
|
47
|
+
const accessLink = useAccessAction(access, landingLabels);
|
|
48
|
+
const [refusal, setRefusal] = useState(null);
|
|
49
|
+
useNoIndex(noIndex);
|
|
50
|
+
useOncePerKey(ONCE, () => start(), (_key, result) => {
|
|
51
|
+
if (result.ok) onStarted(result.value);
|
|
52
|
+
else setRefusal(refusalOf(result.error));
|
|
53
|
+
});
|
|
54
|
+
return /* @__PURE__ */ jsxs("div", { ...rest, className: cn("flex flex-col items-center gap-4 py-4 text-center", className), children: [
|
|
55
|
+
/* @__PURE__ */ jsx("div", { role: "status", "aria-live": "polite", className: "w-full", children: refusal === null ? /* @__PURE__ */ jsxs("p", { className: "flex items-center justify-center gap-2 text-sm text-[var(--text-secondary)]", children: [
|
|
56
|
+
/* @__PURE__ */ jsx(Spinner, { label: null, className: "size-5" }),
|
|
57
|
+
labels.starting
|
|
58
|
+
] }) : /* @__PURE__ */ jsx(AlertBanner, { tone: refusal.reason === "failed" ? "danger" : "warning", className: "text-start", children: messageOf(refusal, labels) }) }),
|
|
59
|
+
refusal !== null && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap justify-center gap-3", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(Button, { href: accessLink.href, variant: "brand", children: accessLink.label }),
|
|
61
|
+
/* @__PURE__ */ jsx(Button, { href: backHref, variant: "secondary", children: labels.backToStart })
|
|
62
|
+
] })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
DemoStart
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=demo-start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/demo/demo-start.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { AlertBanner } from \"../components/alert-banner\";\nimport { Button, Spinner } from \"../components/ui\";\nimport { useNoIndex } from \"../hooks/use-noindex\";\nimport { authErrorCode, isRateLimited, retryAfterSeconds } from \"../auth/auth-errors\";\nimport { useOncePerKey } from \"../auth/status-parts\";\nimport { useAccessAction } from \"../landing/access\";\nimport type { AccessChoice } from \"../landing/access\";\nimport type { LandingLabels } from \"../landing/landing-labels\";\nimport { useDemoLabels } from \"./demo-labels\";\nimport type { DemoLabels } from \"./demo-labels\";\n\n/** Why a start was refused, in the page's terms (§5.2). */\ntype Refusal =\n | { reason: \"rateLimited\"; minutes?: number }\n | { reason: \"capacity\" }\n | { reason: \"unavailable\" }\n | { reason: \"failed\" };\n\n/**\n * The server's answer to `POST /auth/demo-session`, read as a refusal (§5.1, §6.2):\n * `demo_rate_limited` (429, with `Retry-After`), `demo_capacity` (429, without),\n * `demo_disabled` (404) and `demo_not_ready` (503) by their codes; a bare 429 as the\n * per-IP window too; anything else is a plain failure.\n */\nfunction refusalOf(error: unknown): Refusal {\n const code = authErrorCode(error);\n if (code === \"demo_capacity\") return { reason: \"capacity\" };\n if (code === \"demo_disabled\" || code === \"demo_not_ready\") return { reason: \"unavailable\" };\n if (code === \"demo_rate_limited\" || (code === undefined && isRateLimited(error))) {\n const seconds = retryAfterSeconds(error);\n return { reason: \"rateLimited\", minutes: seconds ? Math.ceil(seconds / 60) : undefined };\n }\n return { reason: \"failed\" };\n}\n\nfunction messageOf(refusal: Refusal, labels: DemoLabels): string {\n switch (refusal.reason) {\n case \"rateLimited\":\n return labels.rateLimited(refusal.minutes);\n case \"capacity\":\n return labels.capacity;\n case \"unavailable\":\n return labels.unavailable;\n case \"failed\":\n return labels.failed;\n }\n}\n\n/** The one start a mount makes. */\nconst ONCE = \"demo\";\n\nexport interface DemoStartProps<T> extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /**\n * Create the demo: the app's `POST /auth/demo-session {locale}`. Resolve with what it\n * answered (the `TokenResponse`, `refresh_token: null`, `expires_at`); reject with the\n * client's error — the codes are read out of it. Called once per mount.\n */\n start: () => Promise<T>;\n /** The demo exists: store the session (and, for kastlan, `kastlan.demoSession`) and\n * replace to the app's home. The page keeps saying \"Starting the demo…\" meanwhile. */\n onStarted: (session: T) => void;\n /** \"Request access\" beside a refusal. */\n access: AccessChoice;\n /** \"Back to the start page\". Default `/`. */\n backHref?: string;\n /** `false` adds no `noindex` — for a preview. Default `true`: `/demo` is never indexed\n * (§4.3). */\n noIndex?: boolean;\n labels?: Partial<DemoLabels>;\n /** The access words (`landing` namespace) for this instance. */\n landingLabels?: Partial<LandingLabels>;\n}\n\n/**\n * The `/demo` page's content (docs/landing-demo-harmonization.md §5.2): it starts the\n * demo ONCE — StrictMode's double mount included, keksdose's ref guard — and says\n * \"Starting the demo…\" until the app has the session and has moved on.\n *\n * A refusal says why, in the visitor's words, and offers \"Request access\" and \"Back to\n * the start page\":\n *\n * | code | says |\n * |---|---|\n * | `demo_rate_limited` (429) | \"Too many demos from this network. Try again in N min.\" — N from `Retry-After` |\n * | `demo_capacity` (429) | \"The demo is full right now. Try again later.\" |\n * | `demo_disabled` (404), `demo_not_ready` (503) | \"The demo isn't available right now.\" |\n * | anything else | \"The demo could not be started. Please try again.\" |\n *\n * keksdose fell back to `/register` with a toast; registration is invitation-only now,\n * so the way on is the access mail.\n *\n * Put it in the app's `AuthLayout`. A live demo session never reaches it: the `/demo`\n * route sits in `RedirectIfAuthed` WITHOUT `allowDemo`, which continues the live demo at\n * its resume target instead of starting a second one. A cold start is the kit's\n * `ServerWakeNotice`'s, once the app's watcher counts this POST\n * (`watchReadsAnd(/\\/auth\\/demo-session\\b/)`).\n */\nexport function DemoStart<T>({\n start,\n onStarted,\n access,\n backHref = \"/\",\n noIndex = true,\n labels: labelsProp,\n landingLabels,\n className,\n ...rest\n}: DemoStartProps<T>) {\n const labels = useDemoLabels(labelsProp);\n const accessLink = useAccessAction(access, landingLabels);\n const [refusal, setRefusal] = useState<Refusal | null>(null);\n useNoIndex(noIndex);\n useOncePerKey<T>(ONCE, () => start(), (_key, result) => {\n if (result.ok) onStarted(result.value);\n else setRefusal(refusalOf(result.error));\n });\n\n return (\n <div {...rest} className={cn(\"flex flex-col items-center gap-4 py-4 text-center\", className)}>\n {/* One live region, there from the start, so the refusal that replaces the\n progress line is announced (a region inserted with its text often is not). */}\n <div role=\"status\" aria-live=\"polite\" className=\"w-full\">\n {refusal === null ? (\n <p className=\"flex items-center justify-center gap-2 text-sm text-[var(--text-secondary)]\">\n <Spinner label={null} className=\"size-5\" />\n {labels.starting}\n </p>\n ) : (\n <AlertBanner tone={refusal.reason === \"failed\" ? \"danger\" : \"warning\"} className=\"text-start\">\n {messageOf(refusal, labels)}\n </AlertBanner>\n )}\n </div>\n {refusal !== null && (\n <div className=\"flex flex-wrap justify-center gap-3\">\n <Button href={accessLink.href} variant=\"brand\">\n {accessLink.label}\n </Button>\n <Button href={backHref} variant=\"secondary\">\n {labels.backToStart}\n </Button>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AA+HU,SACE,KADF;AA/HV,SAAS,gBAAgB;AAGzB,SAAS,UAAU;AACnB,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,eAAe;AAChC,SAAS,kBAAkB;AAC3B,SAAS,eAAe,eAAe,yBAAyB;AAChE,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAGhC,SAAS,qBAAqB;AAgB9B,SAAS,UAAU,OAAyB;AAC1C,QAAM,OAAO,cAAc,KAAK;AAChC,MAAI,SAAS,gBAAiB,QAAO,EAAE,QAAQ,WAAW;AAC1D,MAAI,SAAS,mBAAmB,SAAS,iBAAkB,QAAO,EAAE,QAAQ,cAAc;AAC1F,MAAI,SAAS,uBAAwB,SAAS,UAAa,cAAc,KAAK,GAAI;AAChF,UAAM,UAAU,kBAAkB,KAAK;AACvC,WAAO,EAAE,QAAQ,eAAe,SAAS,UAAU,KAAK,KAAK,UAAU,EAAE,IAAI,OAAU;AAAA,EACzF;AACA,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEA,SAAS,UAAU,SAAkB,QAA4B;AAC/D,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,aAAO,OAAO,YAAY,QAAQ,OAAO;AAAA,IAC3C,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,EAClB;AACF;AAGA,MAAM,OAAO;AAgDN,SAAS,UAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,SAAS,cAAc,UAAU;AACvC,QAAM,aAAa,gBAAgB,QAAQ,aAAa;AACxD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAyB,IAAI;AAC3D,aAAW,OAAO;AAClB,gBAAiB,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW;AACtD,QAAI,OAAO,GAAI,WAAU,OAAO,KAAK;AAAA,QAChC,YAAW,UAAU,OAAO,KAAK,CAAC;AAAA,EACzC,CAAC;AAED,SACE,qBAAC,SAAK,GAAG,MAAM,WAAW,GAAG,qDAAqD,SAAS,GAGzF;AAAA,wBAAC,SAAI,MAAK,UAAS,aAAU,UAAS,WAAU,UAC7C,sBAAY,OACX,qBAAC,OAAE,WAAU,+EACX;AAAA,0BAAC,WAAQ,OAAO,MAAM,WAAU,UAAS;AAAA,MACxC,OAAO;AAAA,OACV,IAEA,oBAAC,eAAY,MAAM,QAAQ,WAAW,WAAW,WAAW,WAAW,WAAU,cAC9E,oBAAU,SAAS,MAAM,GAC5B,GAEJ;AAAA,IACC,YAAY,QACX,qBAAC,SAAI,WAAU,uCACb;AAAA,0BAAC,UAAO,MAAM,WAAW,MAAM,SAAQ,SACpC,qBAAW,OACd;AAAA,MACA,oBAAC,UAAO,MAAM,UAAU,SAAQ,aAC7B,iBAAO,aACV;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { D as DEFAULT_ATTACHMENT_ACCEPT, e as DEFAULT_FEEDBACK_ATTACHMENT_LABELS, p as DEFAULT_MAX_ATTACHMENTS, q as DEFAULT_MAX_ATTACHMENT_BYTES, A as FeedbackAttachmentError, B as FeedbackAttachmentErrorInfo, E as FeedbackAttachmentField, G as FeedbackAttachmentFieldLabels, H as FeedbackAttachmentFieldMultipleProps, I as FeedbackAttachmentFieldProps, J as FeedbackAttachmentFieldRefsProps, K as FeedbackAttachmentFieldSingleProps, M as FeedbackAttachmentRef, N as FeedbackAttachmentRefsError, be as pastedName } from '../delete-account-setting-
|
|
2
|
+
export { D as DEFAULT_ATTACHMENT_ACCEPT, e as DEFAULT_FEEDBACK_ATTACHMENT_LABELS, p as DEFAULT_MAX_ATTACHMENTS, q as DEFAULT_MAX_ATTACHMENT_BYTES, A as FeedbackAttachmentError, B as FeedbackAttachmentErrorInfo, E as FeedbackAttachmentField, G as FeedbackAttachmentFieldLabels, H as FeedbackAttachmentFieldMultipleProps, I as FeedbackAttachmentFieldProps, J as FeedbackAttachmentFieldRefsProps, K as FeedbackAttachmentFieldSingleProps, M as FeedbackAttachmentRef, N as FeedbackAttachmentRefsError, be as pastedName } from '../delete-account-setting-DCFS5Vof.js';
|
|
3
3
|
import '../components/tooltip.js';
|
|
4
4
|
import '../hooks/use-anchored-rect.js';
|
|
5
5
|
import '../lib/clipping.js';
|
|
@@ -54,6 +54,8 @@ import '../components/image-grid.js';
|
|
|
54
54
|
import '../components/lightbox.js';
|
|
55
55
|
import '../components/write-lock.js';
|
|
56
56
|
import '../auth/sign-in-form.js';
|
|
57
|
+
import '../landing/access.js';
|
|
58
|
+
import '../landing/landing-labels.js';
|
|
57
59
|
import '../shell/topbar-controls.js';
|
|
58
60
|
import '../theme/palette-presets.js';
|
|
59
61
|
import '../theme/chart-palette.js';
|
|
@@ -75,6 +77,8 @@ import '../account/data-export-setting.js';
|
|
|
75
77
|
import '../components/account-chips.js';
|
|
76
78
|
import '../admin/admin-parts.js';
|
|
77
79
|
import '../admin/admin-action-log.js';
|
|
80
|
+
import '../settings/settings-labels.js';
|
|
81
|
+
import '../demo/demo-labels.js';
|
|
78
82
|
import '../components/reauth-dialog.js';
|
|
79
83
|
import '../components/server-wake.js';
|
|
80
84
|
import '../lib/server-wake.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { h as DEFAULT_FEEDBACK_CONTEXT_LABELS, a0 as FeedbackContextBox, a1 as FeedbackContextBoxProps, a2 as FeedbackContextInput, a3 as FeedbackContextLabels, aM as FeedbackSubmitter, b2 as feedbackContext } from '../delete-account-setting-
|
|
2
|
+
export { h as DEFAULT_FEEDBACK_CONTEXT_LABELS, a0 as FeedbackContextBox, a1 as FeedbackContextBoxProps, a2 as FeedbackContextInput, a3 as FeedbackContextLabels, aM as FeedbackSubmitter, b2 as feedbackContext } from '../delete-account-setting-DCFS5Vof.js';
|
|
3
3
|
import '../components/tooltip.js';
|
|
4
4
|
import '../hooks/use-anchored-rect.js';
|
|
5
5
|
import '../lib/clipping.js';
|
|
@@ -54,6 +54,8 @@ import '../components/image-grid.js';
|
|
|
54
54
|
import '../components/lightbox.js';
|
|
55
55
|
import '../components/write-lock.js';
|
|
56
56
|
import '../auth/sign-in-form.js';
|
|
57
|
+
import '../landing/access.js';
|
|
58
|
+
import '../landing/landing-labels.js';
|
|
57
59
|
import '../shell/topbar-controls.js';
|
|
58
60
|
import '../theme/palette-presets.js';
|
|
59
61
|
import '../theme/chart-palette.js';
|
|
@@ -75,6 +77,8 @@ import '../account/data-export-setting.js';
|
|
|
75
77
|
import '../components/account-chips.js';
|
|
76
78
|
import '../admin/admin-parts.js';
|
|
77
79
|
import '../admin/admin-action-log.js';
|
|
80
|
+
import '../settings/settings-labels.js';
|
|
81
|
+
import '../demo/demo-labels.js';
|
|
78
82
|
import '../components/reauth-dialog.js';
|
|
79
83
|
import '../components/server-wake.js';
|
|
80
84
|
import '../lib/server-wake.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CrashReport } from '../components/error-boundary.js';
|
|
2
|
-
import { ah as FeedbackEnvironment } from '../delete-account-setting-
|
|
2
|
+
import { ah as FeedbackEnvironment } from '../delete-account-setting-DCFS5Vof.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import '../components/tooltip.js';
|
|
5
5
|
import '../hooks/use-anchored-rect.js';
|
|
@@ -54,6 +54,8 @@ import '../components/image-grid.js';
|
|
|
54
54
|
import '../components/lightbox.js';
|
|
55
55
|
import '../components/write-lock.js';
|
|
56
56
|
import '../auth/sign-in-form.js';
|
|
57
|
+
import '../landing/access.js';
|
|
58
|
+
import '../landing/landing-labels.js';
|
|
57
59
|
import '../shell/topbar-controls.js';
|
|
58
60
|
import '../theme/palette-presets.js';
|
|
59
61
|
import '../theme/chart-palette.js';
|
|
@@ -75,6 +77,8 @@ import '../account/data-export-setting.js';
|
|
|
75
77
|
import '../components/account-chips.js';
|
|
76
78
|
import '../admin/admin-parts.js';
|
|
77
79
|
import '../admin/admin-action-log.js';
|
|
80
|
+
import '../settings/settings-labels.js';
|
|
81
|
+
import '../demo/demo-labels.js';
|
|
78
82
|
import '../components/reauth-dialog.js';
|
|
79
83
|
import '../components/server-wake.js';
|
|
80
84
|
import '../lib/server-wake.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { j as DEFAULT_FEEDBACK_DIALOG_LABELS, L as FeedbackAttachmentLabels, T as FeedbackCategoryOption, a9 as FeedbackDialog, aa as FeedbackDialogLabels, ab as FeedbackDialogMultipleProps, ac as FeedbackDialogProps, ad as FeedbackDialogSingleProps, ae as FeedbackDialogTextLabels, an as FeedbackMultipleSubmission, aK as FeedbackSubmission, aL as FeedbackSubmitHint } from '../delete-account-setting-
|
|
2
|
+
export { j as DEFAULT_FEEDBACK_DIALOG_LABELS, L as FeedbackAttachmentLabels, T as FeedbackCategoryOption, a9 as FeedbackDialog, aa as FeedbackDialogLabels, ab as FeedbackDialogMultipleProps, ac as FeedbackDialogProps, ad as FeedbackDialogSingleProps, ae as FeedbackDialogTextLabels, an as FeedbackMultipleSubmission, aK as FeedbackSubmission, aL as FeedbackSubmitHint } from '../delete-account-setting-DCFS5Vof.js';
|
|
3
3
|
import '../components/tooltip.js';
|
|
4
4
|
import '../hooks/use-anchored-rect.js';
|
|
5
5
|
import '../lib/clipping.js';
|
|
@@ -54,6 +54,8 @@ import '../components/image-grid.js';
|
|
|
54
54
|
import '../components/lightbox.js';
|
|
55
55
|
import '../components/write-lock.js';
|
|
56
56
|
import '../auth/sign-in-form.js';
|
|
57
|
+
import '../landing/access.js';
|
|
58
|
+
import '../landing/landing-labels.js';
|
|
57
59
|
import '../shell/topbar-controls.js';
|
|
58
60
|
import '../theme/palette-presets.js';
|
|
59
61
|
import '../theme/chart-palette.js';
|
|
@@ -75,6 +77,8 @@ import '../account/data-export-setting.js';
|
|
|
75
77
|
import '../components/account-chips.js';
|
|
76
78
|
import '../admin/admin-parts.js';
|
|
77
79
|
import '../admin/admin-action-log.js';
|
|
80
|
+
import '../settings/settings-labels.js';
|
|
81
|
+
import '../demo/demo-labels.js';
|
|
78
82
|
import '../components/reauth-dialog.js';
|
|
79
83
|
import '../components/server-wake.js';
|
|
80
84
|
import '../lib/server-wake.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import 'react';
|
|
2
2
|
import 'lucide-react';
|
|
3
|
-
export { t as FEEDBACK_CATEGORY_META, u as FEEDBACK_CATEGORY_ORDER, x as FEEDBACK_STATUS_META, y as FEEDBACK_STATUS_ORDER, Q as FeedbackCategory, R as FeedbackCategoryBadge, a4 as FeedbackDetail, a7 as FeedbackDetailSection, ao as FeedbackNoteAttachment, ap as FeedbackNoteEditor, ar as FeedbackProse, az as FeedbackStatus, aA as FeedbackStatusBadge, aG as FeedbackStatusTransitions, b0 as feedbackCategoryRank, bd as nextFeedbackStatus, bh as selectableFeedbackStatuses, bs as visibleFeedbackStatuses } from '../delete-account-setting-
|
|
3
|
+
export { t as FEEDBACK_CATEGORY_META, u as FEEDBACK_CATEGORY_ORDER, x as FEEDBACK_STATUS_META, y as FEEDBACK_STATUS_ORDER, Q as FeedbackCategory, R as FeedbackCategoryBadge, a4 as FeedbackDetail, a7 as FeedbackDetailSection, ao as FeedbackNoteAttachment, ap as FeedbackNoteEditor, ar as FeedbackProse, az as FeedbackStatus, aA as FeedbackStatusBadge, aG as FeedbackStatusTransitions, b0 as feedbackCategoryRank, bd as nextFeedbackStatus, bh as selectableFeedbackStatuses, bs as visibleFeedbackStatuses } from '../delete-account-setting-DCFS5Vof.js';
|
|
4
4
|
import '../components/tooltip.js';
|
|
5
5
|
import '../hooks/use-anchored-rect.js';
|
|
6
6
|
import '../lib/clipping.js';
|
|
@@ -54,6 +54,8 @@ import '../components/image-grid.js';
|
|
|
54
54
|
import '../components/lightbox.js';
|
|
55
55
|
import '../components/write-lock.js';
|
|
56
56
|
import '../auth/sign-in-form.js';
|
|
57
|
+
import '../landing/access.js';
|
|
58
|
+
import '../landing/landing-labels.js';
|
|
57
59
|
import '../shell/topbar-controls.js';
|
|
58
60
|
import '../theme/palette-presets.js';
|
|
59
61
|
import '../theme/chart-palette.js';
|
|
@@ -75,6 +77,8 @@ import '../account/data-export-setting.js';
|
|
|
75
77
|
import '../components/account-chips.js';
|
|
76
78
|
import '../admin/admin-parts.js';
|
|
77
79
|
import '../admin/admin-action-log.js';
|
|
80
|
+
import '../settings/settings-labels.js';
|
|
81
|
+
import '../demo/demo-labels.js';
|
|
78
82
|
import '../components/reauth-dialog.js';
|
|
79
83
|
import '../components/server-wake.js';
|
|
80
84
|
import '../lib/server-wake.js';
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
Ban,
|
|
6
6
|
Bug,
|
|
7
7
|
CheckCircle2,
|
|
8
|
+
ClipboardCheck,
|
|
8
9
|
CloudUpload,
|
|
9
10
|
Eye,
|
|
10
11
|
HelpCircle,
|
|
@@ -27,6 +28,15 @@ const FEEDBACK_STATUS_META = {
|
|
|
27
28
|
activeBg: "bg-[var(--bg-active)]",
|
|
28
29
|
activeText: "text-[var(--text-primary)]"
|
|
29
30
|
},
|
|
31
|
+
// Triaged and released for implementation (feedback contract §8.2, keksdose live
|
|
32
|
+
// #396): OPEN is "filed, nobody has looked yet", READY is "go". The brand tint at full
|
|
33
|
+
// strength, so it reads as the go-ahead beside OPEN's neutral fill and
|
|
34
|
+
// NEEDS_LIVE_TEST's muted brand.
|
|
35
|
+
READY: {
|
|
36
|
+
icon: ClipboardCheck,
|
|
37
|
+
activeBg: "bg-[var(--brand-bg)]",
|
|
38
|
+
activeText: "text-[var(--brand)]"
|
|
39
|
+
},
|
|
30
40
|
IN_PROGRESS: {
|
|
31
41
|
icon: Wrench,
|
|
32
42
|
activeBg: "bg-[var(--warning-bg)]",
|
|
@@ -74,7 +84,7 @@ const FEEDBACK_STATUS_META = {
|
|
|
74
84
|
};
|
|
75
85
|
const FEEDBACK_STATUS_ORDER = Object.keys(FEEDBACK_STATUS_META);
|
|
76
86
|
const OFF_CHAIN = ["NEEDS_LIVE_TEST", "POSTPONED", "WONT_DO"];
|
|
77
|
-
const FORWARD_CHAIN = ["OPEN", "IN_PROGRESS", "IN_EVALUATION", "DONE"];
|
|
87
|
+
const FORWARD_CHAIN = ["OPEN", "READY", "IN_PROGRESS", "IN_EVALUATION", "DONE"];
|
|
78
88
|
function nextFeedbackStatus(current) {
|
|
79
89
|
const at = FORWARD_CHAIN.indexOf(current);
|
|
80
90
|
return at !== -1 && at < FORWARD_CHAIN.length - 1 ? FORWARD_CHAIN[at + 1] : null;
|
|
@@ -237,7 +247,7 @@ function FeedbackStatusTransitions({
|
|
|
237
247
|
),
|
|
238
248
|
// Both stay unclickable, but only the read-only case is DIMMED: the
|
|
239
249
|
// current status is the one thing in the row that has to be legible
|
|
240
|
-
// at a glance, and among
|
|
250
|
+
// at a glance, and among eight pills a faded active one reads as
|
|
241
251
|
// "unavailable" rather than as "this is where the row stands".
|
|
242
252
|
(!canEdit || active) && "cursor-default",
|
|
243
253
|
!canEdit && "opacity-60",
|