@azurioh/discord-kernel 0.1.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/LICENSE +21 -0
- package/README.md +77 -0
- package/dist/authz/authorizer.d.ts +45 -0
- package/dist/authz/authorizer.d.ts.map +1 -0
- package/dist/authz/authorizer.js +31 -0
- package/dist/authz/authorizer.js.map +1 -0
- package/dist/authz/require-level-guard.d.ts +23 -0
- package/dist/authz/require-level-guard.d.ts.map +1 -0
- package/dist/authz/require-level-guard.js +37 -0
- package/dist/authz/require-level-guard.js.map +1 -0
- package/dist/clock.d.ts +13 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +13 -0
- package/dist/clock.js.map +1 -0
- package/dist/concurrency/keyed-queue.d.ts +18 -0
- package/dist/concurrency/keyed-queue.d.ts.map +1 -0
- package/dist/concurrency/keyed-queue.js +37 -0
- package/dist/concurrency/keyed-queue.js.map +1 -0
- package/dist/concurrency/run-with-concurrency.d.ts +15 -0
- package/dist/concurrency/run-with-concurrency.d.ts.map +1 -0
- package/dist/concurrency/run-with-concurrency.js +40 -0
- package/dist/concurrency/run-with-concurrency.js.map +1 -0
- package/dist/config/env.d.ts +17 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +49 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/errors.d.ts +14 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +25 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/datetime.d.ts +34 -0
- package/dist/datetime.d.ts.map +1 -0
- package/dist/datetime.js +188 -0
- package/dist/datetime.js.map +1 -0
- package/dist/discord/api-errors.d.ts +20 -0
- package/dist/discord/api-errors.d.ts.map +1 -0
- package/dist/discord/api-errors.js +90 -0
- package/dist/discord/api-errors.js.map +1 -0
- package/dist/discord/channel-exporter.d.ts +42 -0
- package/dist/discord/channel-exporter.d.ts.map +1 -0
- package/dist/discord/channel-exporter.js +3 -0
- package/dist/discord/channel-exporter.js.map +1 -0
- package/dist/discord/command/autocomplete-dispatcher.d.ts +26 -0
- package/dist/discord/command/autocomplete-dispatcher.d.ts.map +1 -0
- package/dist/discord/command/autocomplete-dispatcher.js +41 -0
- package/dist/discord/command/autocomplete-dispatcher.js.map +1 -0
- package/dist/discord/command/autocomplete.d.ts +18 -0
- package/dist/discord/command/autocomplete.d.ts.map +1 -0
- package/dist/discord/command/autocomplete.js +65 -0
- package/dist/discord/command/autocomplete.js.map +1 -0
- package/dist/discord/command/context.d.ts +33 -0
- package/dist/discord/command/context.d.ts.map +1 -0
- package/dist/discord/command/context.js +48 -0
- package/dist/discord/command/context.js.map +1 -0
- package/dist/discord/command/cooldown-guard.d.ts +25 -0
- package/dist/discord/command/cooldown-guard.d.ts.map +1 -0
- package/dist/discord/command/cooldown-guard.js +60 -0
- package/dist/discord/command/cooldown-guard.js.map +1 -0
- package/dist/discord/command/create-command.d.ts +100 -0
- package/dist/discord/command/create-command.d.ts.map +1 -0
- package/dist/discord/command/create-command.js +245 -0
- package/dist/discord/command/create-command.js.map +1 -0
- package/dist/discord/command/create-context-menu-command.d.ts +51 -0
- package/dist/discord/command/create-context-menu-command.d.ts.map +1 -0
- package/dist/discord/command/create-context-menu-command.js +128 -0
- package/dist/discord/command/create-context-menu-command.js.map +1 -0
- package/dist/discord/command/errors.d.ts +19 -0
- package/dist/discord/command/errors.d.ts.map +1 -0
- package/dist/discord/command/errors.js +27 -0
- package/dist/discord/command/errors.js.map +1 -0
- package/dist/discord/command/guard.d.ts +30 -0
- package/dist/discord/command/guard.d.ts.map +1 -0
- package/dist/discord/command/guard.js +34 -0
- package/dist/discord/command/guard.js.map +1 -0
- package/dist/discord/command/localization.d.ts +9 -0
- package/dist/discord/command/localization.d.ts.map +1 -0
- package/dist/discord/command/localization.js +13 -0
- package/dist/discord/command/localization.js.map +1 -0
- package/dist/discord/command/options.d.ts +113 -0
- package/dist/discord/command/options.d.ts.map +1 -0
- package/dist/discord/command/options.js +509 -0
- package/dist/discord/command/options.js.map +1 -0
- package/dist/discord/command/permission-guard.d.ts +21 -0
- package/dist/discord/command/permission-guard.d.ts.map +1 -0
- package/dist/discord/command/permission-guard.js +69 -0
- package/dist/discord/command/permission-guard.js.map +1 -0
- package/dist/discord/command/router.d.ts +48 -0
- package/dist/discord/command/router.d.ts.map +1 -0
- package/dist/discord/command/router.js +118 -0
- package/dist/discord/command/router.js.map +1 -0
- package/dist/discord/command/types.d.ts +51 -0
- package/dist/discord/command/types.d.ts.map +1 -0
- package/dist/discord/command/types.js +3 -0
- package/dist/discord/command/types.js.map +1 -0
- package/dist/discord/components/component-router.d.ts +116 -0
- package/dist/discord/components/component-router.d.ts.map +1 -0
- package/dist/discord/components/component-router.js +123 -0
- package/dist/discord/components/component-router.js.map +1 -0
- package/dist/discord/components/interactive-message/index.d.ts +3 -0
- package/dist/discord/components/interactive-message/index.d.ts.map +1 -0
- package/dist/discord/components/interactive-message/index.js +11 -0
- package/dist/discord/components/interactive-message/index.js.map +1 -0
- package/dist/discord/components/interactive-message/interactive-message-collector.d.ts +195 -0
- package/dist/discord/components/interactive-message/interactive-message-collector.d.ts.map +1 -0
- package/dist/discord/components/interactive-message/interactive-message-collector.js +151 -0
- package/dist/discord/components/interactive-message/interactive-message-collector.js.map +1 -0
- package/dist/discord/components/interactive-message/mount-interactive-message.d.ts +30 -0
- package/dist/discord/components/interactive-message/mount-interactive-message.d.ts.map +1 -0
- package/dist/discord/components/interactive-message/mount-interactive-message.js +44 -0
- package/dist/discord/components/interactive-message/mount-interactive-message.js.map +1 -0
- package/dist/discord/components/paginator/index.d.ts +5 -0
- package/dist/discord/components/paginator/index.d.ts.map +1 -0
- package/dist/discord/components/paginator/index.js +15 -0
- package/dist/discord/components/paginator/index.js.map +1 -0
- package/dist/discord/components/paginator/mount-paginator.d.ts +25 -0
- package/dist/discord/components/paginator/mount-paginator.d.ts.map +1 -0
- package/dist/discord/components/paginator/mount-paginator.js +41 -0
- package/dist/discord/components/paginator/mount-paginator.js.map +1 -0
- package/dist/discord/components/paginator/page-state.d.ts +21 -0
- package/dist/discord/components/paginator/page-state.d.ts.map +1 -0
- package/dist/discord/components/paginator/page-state.js +44 -0
- package/dist/discord/components/paginator/page-state.js.map +1 -0
- package/dist/discord/components/paginator/paginator-buttons.d.ts +17 -0
- package/dist/discord/components/paginator/paginator-buttons.d.ts.map +1 -0
- package/dist/discord/components/paginator/paginator-buttons.js +45 -0
- package/dist/discord/components/paginator/paginator-buttons.js.map +1 -0
- package/dist/discord/components/paginator/paginator-view.d.ts +26 -0
- package/dist/discord/components/paginator/paginator-view.d.ts.map +1 -0
- package/dist/discord/components/paginator/paginator-view.js +28 -0
- package/dist/discord/components/paginator/paginator-view.js.map +1 -0
- package/dist/discord/components/persistent-paginator.d.ts +47 -0
- package/dist/discord/components/persistent-paginator.d.ts.map +1 -0
- package/dist/discord/components/persistent-paginator.js +137 -0
- package/dist/discord/components/persistent-paginator.js.map +1 -0
- package/dist/discord/components/settings-editor/index.d.ts +7 -0
- package/dist/discord/components/settings-editor/index.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/index.js +22 -0
- package/dist/discord/components/settings-editor/index.js.map +1 -0
- package/dist/discord/components/settings-editor/mount-settings-editor.d.ts +140 -0
- package/dist/discord/components/settings-editor/mount-settings-editor.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/mount-settings-editor.js +344 -0
- package/dist/discord/components/settings-editor/mount-settings-editor.js.map +1 -0
- package/dist/discord/components/settings-editor/navigation.d.ts +49 -0
- package/dist/discord/components/settings-editor/navigation.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/navigation.js +39 -0
- package/dist/discord/components/settings-editor/navigation.js.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts +56 -0
- package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-card.view.js +284 -0
- package/dist/discord/components/settings-editor/settings-editor-card.view.js.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts +69 -0
- package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-field-modal.js +353 -0
- package/dist/discord/components/settings-editor/settings-editor-field-modal.js.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-fields.d.ts +216 -0
- package/dist/discord/components/settings-editor/settings-editor-fields.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-fields.js +66 -0
- package/dist/discord/components/settings-editor/settings-editor-fields.js.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor.view.d.ts +303 -0
- package/dist/discord/components/settings-editor/settings-editor.view.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor.view.js +316 -0
- package/dist/discord/components/settings-editor/settings-editor.view.js.map +1 -0
- package/dist/discord/events/create-event.d.ts +5 -0
- package/dist/discord/events/create-event.d.ts.map +1 -0
- package/dist/discord/events/create-event.js +8 -0
- package/dist/discord/events/create-event.js.map +1 -0
- package/dist/discord/events/event-router.d.ts +16 -0
- package/dist/discord/events/event-router.d.ts.map +1 -0
- package/dist/discord/events/event-router.js +51 -0
- package/dist/discord/events/event-router.js.map +1 -0
- package/dist/discord/events/types.d.ts +16 -0
- package/dist/discord/events/types.d.ts.map +1 -0
- package/dist/discord/events/types.js +3 -0
- package/dist/discord/events/types.js.map +1 -0
- package/dist/discord/i18n.d.ts +58 -0
- package/dist/discord/i18n.d.ts.map +1 -0
- package/dist/discord/i18n.js +173 -0
- package/dist/discord/i18n.js.map +1 -0
- package/dist/discord/interaction/button.d.ts +39 -0
- package/dist/discord/interaction/button.d.ts.map +1 -0
- package/dist/discord/interaction/button.js +36 -0
- package/dist/discord/interaction/button.js.map +1 -0
- package/dist/discord/interaction/interaction-router.d.ts +21 -0
- package/dist/discord/interaction/interaction-router.d.ts.map +1 -0
- package/dist/discord/interaction/interaction-router.js +24 -0
- package/dist/discord/interaction/interaction-router.js.map +1 -0
- package/dist/discord/interaction/modal.d.ts +171 -0
- package/dist/discord/interaction/modal.d.ts.map +1 -0
- package/dist/discord/interaction/modal.js +264 -0
- package/dist/discord/interaction/modal.js.map +1 -0
- package/dist/discord/interaction/select-menu.d.ts +104 -0
- package/dist/discord/interaction/select-menu.d.ts.map +1 -0
- package/dist/discord/interaction/select-menu.js +126 -0
- package/dist/discord/interaction/select-menu.js.map +1 -0
- package/dist/discord/permissions.d.ts +32 -0
- package/dist/discord/permissions.d.ts.map +1 -0
- package/dist/discord/permissions.js +40 -0
- package/dist/discord/permissions.js.map +1 -0
- package/dist/discord/placeholder-registry-errors.d.ts +10 -0
- package/dist/discord/placeholder-registry-errors.d.ts.map +1 -0
- package/dist/discord/placeholder-registry-errors.js +18 -0
- package/dist/discord/placeholder-registry-errors.js.map +1 -0
- package/dist/discord/placeholder-registry.d.ts +53 -0
- package/dist/discord/placeholder-registry.d.ts.map +1 -0
- package/dist/discord/placeholder-registry.js +52 -0
- package/dist/discord/placeholder-registry.js.map +1 -0
- package/dist/discord/presenter.d.ts +26 -0
- package/dist/discord/presenter.d.ts.map +1 -0
- package/dist/discord/presenter.js +3 -0
- package/dist/discord/presenter.js.map +1 -0
- package/dist/discord/ui/card.d.ts +114 -0
- package/dist/discord/ui/card.d.ts.map +1 -0
- package/dist/discord/ui/card.js +162 -0
- package/dist/discord/ui/card.js.map +1 -0
- package/dist/discord/ui/color-input-errors.d.ts +12 -0
- package/dist/discord/ui/color-input-errors.d.ts.map +1 -0
- package/dist/discord/ui/color-input-errors.js +21 -0
- package/dist/discord/ui/color-input-errors.js.map +1 -0
- package/dist/discord/ui/color-input.d.ts +37 -0
- package/dist/discord/ui/color-input.d.ts.map +1 -0
- package/dist/discord/ui/color-input.js +166 -0
- package/dist/discord/ui/color-input.js.map +1 -0
- package/dist/discord/ui/colors.d.ts +44 -0
- package/dist/discord/ui/colors.d.ts.map +1 -0
- package/dist/discord/ui/colors.js +45 -0
- package/dist/discord/ui/colors.js.map +1 -0
- package/dist/discord/ui/embed.d.ts +16 -0
- package/dist/discord/ui/embed.d.ts.map +1 -0
- package/dist/discord/ui/embed.js +53 -0
- package/dist/discord/ui/embed.js.map +1 -0
- package/dist/discord/ui/message-attachments.d.ts +40 -0
- package/dist/discord/ui/message-attachments.d.ts.map +1 -0
- package/dist/discord/ui/message-attachments.js +27 -0
- package/dist/discord/ui/message-attachments.js.map +1 -0
- package/dist/errors/business-error.d.ts +41 -0
- package/dist/errors/business-error.d.ts.map +1 -0
- package/dist/errors/business-error.js +39 -0
- package/dist/errors/business-error.js.map +1 -0
- package/dist/errors/describe-error.d.ts +29 -0
- package/dist/errors/describe-error.d.ts.map +1 -0
- package/dist/errors/describe-error.js +49 -0
- package/dist/errors/describe-error.js.map +1 -0
- package/dist/errors/incident-ref.d.ts +7 -0
- package/dist/errors/incident-ref.d.ts.map +1 -0
- package/dist/errors/incident-ref.js +13 -0
- package/dist/errors/incident-ref.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +15 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/i18n/business-message.d.ts +14 -0
- package/dist/i18n/business-message.d.ts.map +1 -0
- package/dist/i18n/business-message.js +19 -0
- package/dist/i18n/business-message.js.map +1 -0
- package/dist/i18n/catalog.d.ts +27 -0
- package/dist/i18n/catalog.d.ts.map +1 -0
- package/dist/i18n/catalog.js +25 -0
- package/dist/i18n/catalog.js.map +1 -0
- package/dist/i18n/errors.d.ts +10 -0
- package/dist/i18n/errors.d.ts.map +1 -0
- package/dist/i18n/errors.js +18 -0
- package/dist/i18n/errors.js.map +1 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +16 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locale.d.ts +22 -0
- package/dist/i18n/locale.d.ts.map +1 -0
- package/dist/i18n/locale.js +40 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/translator.d.ts +35 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/i18n/translator.js +40 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/logger.d.ts +28 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +3 -0
- package/dist/logger.js.map +1 -0
- package/dist/module/module.d.ts +42 -0
- package/dist/module/module.d.ts.map +1 -0
- package/dist/module/module.js +3 -0
- package/dist/module/module.js.map +1 -0
- package/dist/persistence/database.d.ts +24 -0
- package/dist/persistence/database.d.ts.map +1 -0
- package/dist/persistence/database.js +3 -0
- package/dist/persistence/database.js.map +1 -0
- package/dist/resilience/retry.d.ts +36 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +78 -0
- package/dist/resilience/retry.js.map +1 -0
- package/dist/scheduler/errors.d.ts +25 -0
- package/dist/scheduler/errors.d.ts.map +1 -0
- package/dist/scheduler/errors.js +45 -0
- package/dist/scheduler/errors.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +68 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +162 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/package.json +89 -0
- package/src/authz/authorizer.ts +76 -0
- package/src/authz/require-level-guard.ts +42 -0
- package/src/clock.ts +18 -0
- package/src/concurrency/keyed-queue.ts +50 -0
- package/src/concurrency/run-with-concurrency.ts +44 -0
- package/src/config/env.ts +58 -0
- package/src/config/errors.ts +21 -0
- package/src/datetime.ts +221 -0
- package/src/discord/api-errors.ts +91 -0
- package/src/discord/channel-exporter.ts +48 -0
- package/src/discord/command/autocomplete-dispatcher.ts +54 -0
- package/src/discord/command/autocomplete.ts +76 -0
- package/src/discord/command/context.ts +85 -0
- package/src/discord/command/cooldown-guard.ts +81 -0
- package/src/discord/command/create-command.ts +431 -0
- package/src/discord/command/create-context-menu-command.ts +227 -0
- package/src/discord/command/errors.ts +22 -0
- package/src/discord/command/guard.ts +54 -0
- package/src/discord/command/localization.ts +11 -0
- package/src/discord/command/options.ts +847 -0
- package/src/discord/command/permission-guard.ts +74 -0
- package/src/discord/command/router.ts +142 -0
- package/src/discord/command/types.ts +52 -0
- package/src/discord/components/component-router.ts +213 -0
- package/src/discord/components/interactive-message/index.ts +18 -0
- package/src/discord/components/interactive-message/interactive-message-collector.ts +374 -0
- package/src/discord/components/interactive-message/mount-interactive-message.ts +71 -0
- package/src/discord/components/paginator/index.ts +17 -0
- package/src/discord/components/paginator/mount-paginator.ts +69 -0
- package/src/discord/components/paginator/page-state.ts +45 -0
- package/src/discord/components/paginator/paginator-buttons.ts +60 -0
- package/src/discord/components/paginator/paginator-view.ts +61 -0
- package/src/discord/components/persistent-paginator.ts +197 -0
- package/src/discord/components/settings-editor/index.ts +41 -0
- package/src/discord/components/settings-editor/mount-settings-editor.ts +646 -0
- package/src/discord/components/settings-editor/navigation.ts +67 -0
- package/src/discord/components/settings-editor/settings-editor-card.view.ts +344 -0
- package/src/discord/components/settings-editor/settings-editor-field-modal.ts +538 -0
- package/src/discord/components/settings-editor/settings-editor-fields.ts +290 -0
- package/src/discord/components/settings-editor/settings-editor.view.ts +654 -0
- package/src/discord/events/create-event.ts +7 -0
- package/src/discord/events/event-router.ts +53 -0
- package/src/discord/events/types.ts +17 -0
- package/src/discord/i18n.ts +173 -0
- package/src/discord/interaction/button.ts +75 -0
- package/src/discord/interaction/interaction-router.ts +28 -0
- package/src/discord/interaction/modal.ts +505 -0
- package/src/discord/interaction/select-menu.ts +246 -0
- package/src/discord/permissions.ts +57 -0
- package/src/discord/placeholder-registry-errors.ts +11 -0
- package/src/discord/placeholder-registry.ts +77 -0
- package/src/discord/presenter.ts +26 -0
- package/src/discord/ui/card.ts +303 -0
- package/src/discord/ui/color-input-errors.ts +17 -0
- package/src/discord/ui/color-input.ts +179 -0
- package/src/discord/ui/colors.ts +58 -0
- package/src/discord/ui/embed.ts +64 -0
- package/src/discord/ui/message-attachments.ts +57 -0
- package/src/errors/business-error.ts +49 -0
- package/src/errors/describe-error.ts +73 -0
- package/src/errors/incident-ref.ts +10 -0
- package/src/errors/index.ts +12 -0
- package/src/i18n/business-message.ts +23 -0
- package/src/i18n/catalog.ts +41 -0
- package/src/i18n/errors.ts +11 -0
- package/src/i18n/index.ts +11 -0
- package/src/i18n/locale.ts +41 -0
- package/src/i18n/translator.ts +78 -0
- package/src/logger.ts +28 -0
- package/src/module/module.ts +42 -0
- package/src/persistence/database.ts +23 -0
- package/src/resilience/retry.ts +102 -0
- package/src/scheduler/errors.ts +40 -0
- package/src/scheduler/scheduler.ts +248 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_CARD_BUTTON_LEVEL_ENTRIES = exports.MAX_CARD_LEVEL_ENTRIES = void 0;
|
|
4
|
+
exports.fieldButtonId = fieldButtonId;
|
|
5
|
+
exports.createCardEditorView = createCardEditorView;
|
|
6
|
+
const navigation_1 = require("../../../discord/components/settings-editor/navigation");
|
|
7
|
+
const settings_editor_view_1 = require("../../../discord/components/settings-editor/settings-editor.view");
|
|
8
|
+
const i18n_1 = require("../../../discord/i18n");
|
|
9
|
+
const button_1 = require("../../../discord/interaction/button");
|
|
10
|
+
const card_1 = require("../../../discord/ui/card");
|
|
11
|
+
const colors_1 = require("../../../discord/ui/colors");
|
|
12
|
+
/**
|
|
13
|
+
* Discord refuses a card carrying more than {@link import("../../../discord/ui/card").MAX_CARD_COMPONENTS}
|
|
14
|
+
* components; every menu entry a level declares becomes a `Section` — its
|
|
15
|
+
* text plus a button accessory, three components — so this is what a level's
|
|
16
|
+
* own field list may not exceed *before* the chrome fixed around it
|
|
17
|
+
* (breadcrumb, preview, extra blocks, separators, the bottom controls, the
|
|
18
|
+
* signature) is even counted. Generous rather than exact: the fixed chrome
|
|
19
|
+
* costs roughly a dozen components on its own, and no level this repository
|
|
20
|
+
* declares comes within three of this cap.
|
|
21
|
+
*/
|
|
22
|
+
exports.MAX_CARD_LEVEL_ENTRIES = 10;
|
|
23
|
+
/**
|
|
24
|
+
* Discord refuses an `ActionRow` carrying more than five buttons, so a level
|
|
25
|
+
* declaring `entryLayout: "buttons"` folds its entries into as many rows of
|
|
26
|
+
* this size as it needs, rather than the single row it used to require.
|
|
27
|
+
*/
|
|
28
|
+
const BUTTONS_PER_ROW = 5;
|
|
29
|
+
/**
|
|
30
|
+
* How many entries a level declaring `entryLayout: "buttons"` may carry
|
|
31
|
+
* before the rows they compile to — one `ActionRow` per five, however many
|
|
32
|
+
* that takes — would overrun what a container can actually hold.
|
|
33
|
+
*
|
|
34
|
+
* Sits higher than {@link MAX_CARD_LEVEL_ENTRIES} on purpose: a `"buttons"`
|
|
35
|
+
* row costs its `ActionRow` plus the buttons in it, cheaper per entry than a
|
|
36
|
+
* `"sections"` level's `Section` (text, accessory, the `Section` itself —
|
|
37
|
+
* three components apiece). Generous rather than exact, for the same reason
|
|
38
|
+
* {@link MAX_CARD_LEVEL_ENTRIES} is: the fixed chrome (breadcrumb, preview,
|
|
39
|
+
* separators, the bottom controls, the signature) costs roughly a dozen
|
|
40
|
+
* components on its own, and no level this repository declares comes within
|
|
41
|
+
* half of this cap.
|
|
42
|
+
*/
|
|
43
|
+
exports.MAX_CARD_BUTTON_LEVEL_ENTRIES = 20;
|
|
44
|
+
/**
|
|
45
|
+
* The most buttons {@link SettingsEditorCardChrome.entryActions} ever adds to
|
|
46
|
+
* one render of a level's own row: the confirm/cancel pair a screen's own
|
|
47
|
+
* removal swaps to once armed — the single ask button it swaps *from* costs
|
|
48
|
+
* less. Reserved against every `"buttons"` level's own cap whenever the
|
|
49
|
+
* chrome declares the hook at all: the guard below runs once at construction,
|
|
50
|
+
* before any state — and so before `entryActions` has anything to measure —
|
|
51
|
+
* exists.
|
|
52
|
+
*/
|
|
53
|
+
const ENTRY_ACTIONS_RESERVE = 2;
|
|
54
|
+
/**
|
|
55
|
+
* The button a menu entry's own `Section` carries, derived from the field's
|
|
56
|
+
* key rather than declared alongside it — the same relationship `ids.field`
|
|
57
|
+
* already has to the select it used to name, one level of indirection lower.
|
|
58
|
+
*/
|
|
59
|
+
function fieldButtonId(ids, key) {
|
|
60
|
+
return `${ids.field}:${key}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The card editor screen: one Components V2 card carrying the breadcrumb, the
|
|
64
|
+
* last notice, whatever the screen adds above the preview, the preview
|
|
65
|
+
* itself, a `Section` per entry of the current level — each with the button
|
|
66
|
+
* `fieldButtonId` names — and the bottom controls, closing with the bot's own
|
|
67
|
+
* signature.
|
|
68
|
+
*
|
|
69
|
+
* The counterpart of `createEditorView` for a screen declaring
|
|
70
|
+
* `chrome.layout === "card"`; the two never mix; {@link mountSettingsEditor}
|
|
71
|
+
* picks whichever this screen's chrome names.
|
|
72
|
+
*
|
|
73
|
+
* Takes no `SettingsEditorIds` of its own, unlike `createEditorView`: every
|
|
74
|
+
* button it renders — reset, back, and one per menu entry — already exists,
|
|
75
|
+
* built by `mountSettingsEditor` against those very ids, so nothing here has
|
|
76
|
+
* to name them again.
|
|
77
|
+
*/
|
|
78
|
+
function createCardEditorView(fields, levels, buttons, fieldButtons, chrome, translator, locale, dressing) {
|
|
79
|
+
const screenTitle = translator.translate(locale, chrome.titleKey);
|
|
80
|
+
// Separates the levels in the breadcrumb trail.
|
|
81
|
+
const BREADCRUMB_SEPARATOR = " › ";
|
|
82
|
+
// The root is a level like any other, named after the screen itself, so
|
|
83
|
+
// rendering never special-cases "no depth declared" — the same bargain
|
|
84
|
+
// `createEditorView` strikes for the embeds layout. Its own `entryLayout`
|
|
85
|
+
// is the chrome's, mirroring `SettingsEditorLevel.entryLayout` for the one
|
|
86
|
+
// level that is never itself a `SettingsEditorLevel`.
|
|
87
|
+
const root = {
|
|
88
|
+
key: navigation_1.ROOT_LEVEL_KEY,
|
|
89
|
+
titleKey: chrome.titleKey,
|
|
90
|
+
fields,
|
|
91
|
+
entryLayout: chrome.entryLayout,
|
|
92
|
+
};
|
|
93
|
+
const allLevels = [root, ...(levels ?? [])];
|
|
94
|
+
// A level's fields are authored, not accumulated: passing more entries than a
|
|
95
|
+
// card can carry is a mistake in the declaration, and Discord would reject
|
|
96
|
+
// the whole message rather than show the first ones that fit. Failing here
|
|
97
|
+
// names the level; failing at render time would only say the message was
|
|
98
|
+
// invalid.
|
|
99
|
+
for (const level of allLevels) {
|
|
100
|
+
// A `"buttons"` level spends its budget on rows of `ActionRow`s rather
|
|
101
|
+
// than `Section`s, so it is checked against its own, higher cap instead
|
|
102
|
+
// of the `"sections"` one — failing here names the level rather than the
|
|
103
|
+
// invalid message Discord would otherwise reject. The chrome's own
|
|
104
|
+
// `entryActions`, when declared, reserves its worst case on top of the
|
|
105
|
+
// level's declared fields: those buttons exist only once a state renders
|
|
106
|
+
// them, which this construction-time guard has none of to count instead.
|
|
107
|
+
if (level.entryLayout === "buttons") {
|
|
108
|
+
const reserve = chrome.entryActions === undefined ? 0 : ENTRY_ACTIONS_RESERVE;
|
|
109
|
+
if (level.fields.length + reserve > exports.MAX_CARD_BUTTON_LEVEL_ENTRIES) {
|
|
110
|
+
throw new Error(`Settings editor level "${level.key}" declares ${level.fields.length} entries${reserve === 0 ? "" : ` (+${reserve} reserved for the chrome's own entryActions)`} with entryLayout "buttons"; a card holds ${exports.MAX_CARD_BUTTON_LEVEL_ENTRIES} before its own controls. Split it into a deeper level.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (level.fields.length > exports.MAX_CARD_LEVEL_ENTRIES) {
|
|
114
|
+
throw new Error(`Settings editor level "${level.key}" declares ${level.fields.length} entries; a card section holds ${exports.MAX_CARD_LEVEL_ENTRIES} before its own controls. Split it into a deeper level.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function levelAt(key) {
|
|
118
|
+
return allLevels.find((level) => level.key === key) ?? root;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Where the reader is, as a trail rather than only the current name: a level
|
|
122
|
+
* called "Roles" says nothing on its own about which type it belongs to.
|
|
123
|
+
*/
|
|
124
|
+
function heading(state) {
|
|
125
|
+
return state.path
|
|
126
|
+
.map((key) => translator.translate(locale, levelAt(key).titleKey))
|
|
127
|
+
.join(BREADCRUMB_SEPARATOR);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The bot's own signature, once at the bottom of the card rather than on
|
|
131
|
+
* every embed the way two embeds each carried their own footer. Discord's
|
|
132
|
+
* own timestamp markdown, so it reads in the viewer's own locale exactly as
|
|
133
|
+
* an embed's timestamp already did.
|
|
134
|
+
*/
|
|
135
|
+
function signature() {
|
|
136
|
+
const unixSeconds = Math.floor(dressing.clock.now().getTime() / 1000);
|
|
137
|
+
return `-# ${screenTitle} • <t:${unixSeconds}:t>`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* One menu entry, as the `Section` that replaces it: its label as the title,
|
|
141
|
+
* its hint as the line under it, and the button `mountSettingsEditor`
|
|
142
|
+
* registered for it as the accessory — the very button that opens its modal
|
|
143
|
+
* or descends into it, reached by a click instead of a pick.
|
|
144
|
+
*/
|
|
145
|
+
function entrySection(field) {
|
|
146
|
+
const title = translator.translate(locale, field.labelKey);
|
|
147
|
+
const lines = [translator.translate(locale, field.hintKey)];
|
|
148
|
+
const action = fieldButtons.get(field.key);
|
|
149
|
+
return action === undefined
|
|
150
|
+
? { kind: "entry", title, lines }
|
|
151
|
+
: { kind: "entry", title, lines, action };
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* A `"buttons"` level's entries, as the rows that replace their `Section`s:
|
|
155
|
+
* each field's own button — labelled with the entry's own name, not the
|
|
156
|
+
* generic "Open"/"Edit" a `"sections"` level wears, which is the whole
|
|
157
|
+
* point of folding them into rows of buttons instead of stacking them.
|
|
158
|
+
* `mountSettingsEditor` is what actually words the button that way — see
|
|
159
|
+
* its own `buildFieldButton` — this only collects the ones this level owns.
|
|
160
|
+
*/
|
|
161
|
+
function entryButtons(level) {
|
|
162
|
+
return level.fields.map((field) => {
|
|
163
|
+
const button = fieldButtons.get(field.key);
|
|
164
|
+
if (button === undefined) {
|
|
165
|
+
// `fieldButtons` is built by `mountSettingsEditor` over every field of
|
|
166
|
+
// every level up front, this level's included — unreachable outside a
|
|
167
|
+
// wiring mistake in that map, not something an administrator can cause.
|
|
168
|
+
throw new Error(`Settings editor level "${level.key}" has no button registered for field "${field.key}".`);
|
|
169
|
+
}
|
|
170
|
+
return button;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* A `"buttons"` level's entries row for one render: its own field buttons,
|
|
175
|
+
* plus whatever {@link SettingsEditorCardChrome.entryActions} adds — the
|
|
176
|
+
* create/edit/remove row a module's own removal control now lives in,
|
|
177
|
+
* rather than floating beside a picker or hiding at the bottom of the card.
|
|
178
|
+
*
|
|
179
|
+
* A screen's own action waiting on its second click takes the row over
|
|
180
|
+
* entirely: while `state.confirming` names anything, the level's own
|
|
181
|
+
* buttons step aside and the row is exactly what `entryActions` returns —
|
|
182
|
+
* the confirm/cancel pair, once it recognises its own key in `confirming`.
|
|
183
|
+
* The same "the pending question replaces what is here" rule the editor's
|
|
184
|
+
* own reset already follows for the row below the card, transposed to a
|
|
185
|
+
* level's own entries instead of the screen's outer one.
|
|
186
|
+
*/
|
|
187
|
+
function levelButtons(level, state) {
|
|
188
|
+
const actions = chrome.entryActions?.(state) ?? [];
|
|
189
|
+
return state.confirming === null ? [...entryButtons(level), ...actions] : actions;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Split a `"buttons"` level's entries into as many rows of
|
|
193
|
+
* {@link BUTTONS_PER_ROW} as they need — Discord's own cap on one
|
|
194
|
+
* `ActionRow`, not a limit on how many entries the level may declare in
|
|
195
|
+
* total (that is {@link MAX_CARD_BUTTON_LEVEL_ENTRIES}, checked above).
|
|
196
|
+
*/
|
|
197
|
+
function buttonRows(buttons) {
|
|
198
|
+
const rows = [];
|
|
199
|
+
for (let start = 0; start < buttons.length; start += BUTTONS_PER_ROW) {
|
|
200
|
+
rows.push({ kind: "controls", buttons: buttons.slice(start, start + BUTTONS_PER_ROW) });
|
|
201
|
+
}
|
|
202
|
+
return rows;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The screen's own controls for the current state, outside the card
|
|
206
|
+
* entirely — see the module-level note on {@link SettingsEditorRow}. Empty
|
|
207
|
+
* for a screen with nothing to offer here at all — a flat screen with
|
|
208
|
+
* nothing to reset, with dismissing the message the only way out.
|
|
209
|
+
*/
|
|
210
|
+
function outerButtons(state) {
|
|
211
|
+
if (state.confirming === settings_editor_view_1.SETTINGS_EDITOR_RESET_CONFIRMING) {
|
|
212
|
+
return buttons.confirming;
|
|
213
|
+
}
|
|
214
|
+
// Reset, then the return control — the order the outer row reads left to
|
|
215
|
+
// right. Each is absent rather than disabled wherever there is nothing for
|
|
216
|
+
// it to do, same principle both already followed on their own.
|
|
217
|
+
return [
|
|
218
|
+
...(0, settings_editor_view_1.resetButtons)(buttons, chrome, state),
|
|
219
|
+
...((0, navigation_1.canReturn)(state.path) ? buttons.returning : []),
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
/** {@link outerButtons}, compiled into the one row it renders as — or none at all. */
|
|
223
|
+
function outerRow(state, forceDisabled) {
|
|
224
|
+
const row = outerButtons(state);
|
|
225
|
+
return row.length === 0 ? [] : [(0, button_1.createActionRow)(row, state, { disableAll: forceDisabled })];
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* The card's blocks, top to bottom — but for the screen's own controls,
|
|
229
|
+
* which render beside the card rather than inside it — see {@link outerRow}.
|
|
230
|
+
* `disabled` here means only "the editor's own reset is waiting for its
|
|
231
|
+
* second click", not the outer neutralising pass: that one is `Card.apply`'s
|
|
232
|
+
* own `forceDisabled`, applied uniformly across every block a second time —
|
|
233
|
+
* see {@link import("../../../discord/ui/card").Card}.
|
|
234
|
+
*/
|
|
235
|
+
function openBlocks(state) {
|
|
236
|
+
const confirmingReset = state.confirming === settings_editor_view_1.SETTINGS_EDITOR_RESET_CONFIRMING;
|
|
237
|
+
const level = levelAt((0, navigation_1.currentLevelKey)(state.path));
|
|
238
|
+
const notice = confirmingReset
|
|
239
|
+
? {
|
|
240
|
+
kind: "entry",
|
|
241
|
+
title: translator.translate(locale, i18n_1.SETTINGS_EDITOR_MESSAGES.resetConfirmTitle),
|
|
242
|
+
lines: [translator.translate(locale, i18n_1.SETTINGS_EDITOR_MESSAGES.resetConfirmDescription)],
|
|
243
|
+
}
|
|
244
|
+
: state.notice === null
|
|
245
|
+
? null
|
|
246
|
+
: { kind: "text", content: state.notice.text };
|
|
247
|
+
const entries = level.entryLayout === "buttons"
|
|
248
|
+
? buttonRows(levelButtons(level, state))
|
|
249
|
+
: level.fields.map((field) => entrySection(field));
|
|
250
|
+
return [
|
|
251
|
+
{ kind: "text", content: `-# ${heading(state)}` },
|
|
252
|
+
notice,
|
|
253
|
+
...(chrome.extraBlocks?.(state, confirmingReset) ?? []),
|
|
254
|
+
{ kind: "separator" },
|
|
255
|
+
...chrome.preview(state),
|
|
256
|
+
{ kind: "separator" },
|
|
257
|
+
...entries,
|
|
258
|
+
{ kind: "text", content: signature() },
|
|
259
|
+
];
|
|
260
|
+
}
|
|
261
|
+
function cardDef(state) {
|
|
262
|
+
return { accent: colors_1.EMBED_COLORS.brand, blocks: openBlocks(state) };
|
|
263
|
+
}
|
|
264
|
+
const mentions = chrome.allowedMentions === undefined ? {} : { allowedMentions: chrome.allowedMentions };
|
|
265
|
+
return {
|
|
266
|
+
render: (state) => ({
|
|
267
|
+
layout: "card",
|
|
268
|
+
card: (0, card_1.createCard)(cardDef(state)),
|
|
269
|
+
// The screen's own controls, beside the card rather than inside it —
|
|
270
|
+
// empty for a screen with nothing to offer here, which is what
|
|
271
|
+
// `outerRow` already returns.
|
|
272
|
+
controls: outerRow(state, false),
|
|
273
|
+
// Always stated, empty included: this is the screen's whole set of
|
|
274
|
+
// attachments, and an update that said nothing would leave the image of
|
|
275
|
+
// an override that has just been cleared sitting on the message.
|
|
276
|
+
files: [...chrome.filesOf(state)],
|
|
277
|
+
...mentions,
|
|
278
|
+
}),
|
|
279
|
+
disabledControls: (state) => ({
|
|
280
|
+
components: [(0, card_1.createCard)(cardDef(state)).apply(state, true), ...outerRow(state, true)],
|
|
281
|
+
}),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=settings-editor-card.view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-editor-card.view.js","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/settings-editor-card.view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type Attachment, type MessageComponentInteraction, type ModalMessageModalSubmitInteraction } from "discord.js";
|
|
2
|
+
import { type SettingsEditorFieldValue, type SettingsEditorGroupField, type SettingsEditorPickerField, type SettingsEditorValueField } from "../../../discord/components/settings-editor/settings-editor-fields";
|
|
3
|
+
import type { Locale, Translator } from "../../../i18n";
|
|
4
|
+
export interface SettingsEditorSubmission {
|
|
5
|
+
/** The modal's own submit interaction — the only one still usable to answer. */
|
|
6
|
+
readonly interaction: ModalMessageModalSubmitInteraction;
|
|
7
|
+
/** `null` when the field came back empty, which is how an override is cleared. */
|
|
8
|
+
readonly value: string | null;
|
|
9
|
+
/**
|
|
10
|
+
* The uploaded image, on the fields that offer one. Always `null` elsewhere,
|
|
11
|
+
* and `null` on those when nothing was uploaded.
|
|
12
|
+
*/
|
|
13
|
+
readonly upload: Attachment | null;
|
|
14
|
+
/**
|
|
15
|
+
* What a picker field reported. `null` when the selection was emptied — that
|
|
16
|
+
* is how such a setting is cleared. Always `null` on a value field.
|
|
17
|
+
*/
|
|
18
|
+
readonly ids: readonly string[] | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ask for one field's new value, prefilled with the current one, and wait for
|
|
22
|
+
* the answer. Returns `null` on timeout or on any failure to show/collect it
|
|
23
|
+
* (the administrator dismissed the modal, say) — the caller treats that as
|
|
24
|
+
* "nothing happened", never as an error, and the screen stays as it was.
|
|
25
|
+
*
|
|
26
|
+
* `showModal` finally acknowledges `interaction`: nothing can `.update()` on it
|
|
27
|
+
* again, which is why the submission carries its own interaction to answer
|
|
28
|
+
* through.
|
|
29
|
+
*
|
|
30
|
+
* `MessageComponentInteraction` rather than `AnySelectMenuInteraction`: a menu
|
|
31
|
+
* entry opens the very same modal whether it is reached by picking it from a
|
|
32
|
+
* select (the embeds layout) or by clicking the button its own `Section`
|
|
33
|
+
* carries (the card layout), and both interaction kinds carry `showModal` and
|
|
34
|
+
* `awaitModalSubmit` from that shared base.
|
|
35
|
+
*/
|
|
36
|
+
export declare function promptEditorFieldValue<F extends string>(interaction: MessageComponentInteraction, field: SettingsEditorValueField<F> | SettingsEditorPickerField<F>, current: SettingsEditorFieldValue, translator: Translator, locale: Locale): Promise<SettingsEditorSubmission | null>;
|
|
37
|
+
/** What one member field of a group came back with — the group's own per-member slice. */
|
|
38
|
+
export interface SettingsEditorGroupMemberSubmission {
|
|
39
|
+
readonly value: string | null;
|
|
40
|
+
readonly upload: Attachment | null;
|
|
41
|
+
readonly ids: readonly string[] | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* What a group's modal came back with, one entry per member field it declared.
|
|
45
|
+
* A member absent from a submission cannot happen — every member the group
|
|
46
|
+
* declares is a component of the very modal that produced this — but the type
|
|
47
|
+
* stays a partial record rather than asserting it, since nothing here proves it
|
|
48
|
+
* to the compiler.
|
|
49
|
+
*/
|
|
50
|
+
export type SettingsEditorGroupSubmission<F extends string> = Readonly<Partial<Record<F, SettingsEditorGroupMemberSubmission>>>;
|
|
51
|
+
/** What opening a group's modal resolves to: the submitted values, and the one interaction left to answer through. */
|
|
52
|
+
export interface SettingsEditorGroupPrompt<F extends string> {
|
|
53
|
+
readonly interaction: ModalMessageModalSubmitInteraction;
|
|
54
|
+
readonly values: SettingsEditorGroupSubmission<F>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Ask for every setting a group declares at once, in a single modal — the
|
|
58
|
+
* group's counterpart of {@link promptEditorFieldValue}. Each member is laid
|
|
59
|
+
* out in the geometry its own `kind` imposes, exactly as it would if it were
|
|
60
|
+
* prompted on its own, and prefilled the same way: from `currentValue`, asked
|
|
61
|
+
* once per member.
|
|
62
|
+
*
|
|
63
|
+
* `legend` is extra text shown above the fields — a token list a message field
|
|
64
|
+
* reads against, say — already counted against the modal's own five-component
|
|
65
|
+
* budget by the caller that built it; `null` when the group has nothing to say
|
|
66
|
+
* there.
|
|
67
|
+
*/
|
|
68
|
+
export declare function promptEditorGroupValue<F extends string>(interaction: MessageComponentInteraction, group: SettingsEditorGroupField<F>, currentValue: (memberKey: F) => SettingsEditorFieldValue, legend: string | null, translator: Translator, locale: Locale): Promise<SettingsEditorGroupPrompt<F> | null>;
|
|
69
|
+
//# sourceMappingURL=settings-editor-field-modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-editor-field-modal.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/settings-editor-field-modal.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,UAAU,EAEf,KAAK,2BAA2B,EAEhC,KAAK,kCAAkC,EACvC,MAAM,YAAY,CAAC;AACpB,OAAO,EAEN,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,MAAM,6DAA6D,CAAC;AAWrE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAyDjD,MAAM,WAAW,wBAAwB;IACxC,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,kCAAkC,CAAC;IACzD,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAC5D,WAAW,EAAE,2BAA2B,EACxC,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC,EACjE,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CA2B1C;AAED,0FAA0F;AAC1F,MAAM,WAAW,mCAAmC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,MAAM,IAAI,QAAQ,CACrE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,mCAAmC,CAAC,CAAC,CACvD,CAAC;AAEF,sHAAsH;AACtH,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,MAAM;IAC1D,QAAQ,CAAC,WAAW,EAAE,kCAAkC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAC5D,WAAW,EAAE,2BAA2B,EACxC,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAClC,YAAY,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,wBAAwB,EACxD,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAkB9C"}
|