@ternent/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +17 -0
- package/.github/workflows/deploy-armour.yml +42 -0
- package/.github/workflows/deploy-identity.yml +42 -0
- package/.github/workflows/deploy-seal.yml +42 -0
- package/.github/workflows/deploy-ui.yml +42 -0
- package/.github/workflows/deploy-utils.yml +42 -0
- package/.github/workflows/release-create.yml +59 -0
- package/.github/workflows/release-publish.yml +54 -0
- package/.nvmrc +1 -0
- package/.ops/publish.mjs +31 -0
- package/package.json +16 -0
- package/packages/README.md +0 -0
- package/packages/armour/CHANGELOG.md +66 -0
- package/packages/armour/CLAUDE.md +8 -0
- package/packages/armour/README.md +103 -0
- package/packages/armour/SPEC.md +92 -0
- package/packages/armour/package.json +45 -0
- package/packages/armour/src/constants.ts +5 -0
- package/packages/armour/src/deps.d.ts +56 -0
- package/packages/armour/src/errors.ts +172 -0
- package/packages/armour/src/files.ts +73 -0
- package/packages/armour/src/identity.ts +72 -0
- package/packages/armour/src/index.ts +56 -0
- package/packages/armour/src/init.ts +10 -0
- package/packages/armour/src/passphrase.ts +33 -0
- package/packages/armour/src/recipients.ts +73 -0
- package/packages/armour/src/text.ts +68 -0
- package/packages/armour/src/types.ts +93 -0
- package/packages/armour/test/armour.test.ts +270 -0
- package/packages/armour/tsconfig.build.json +12 -0
- package/packages/armour/tsconfig.json +12 -0
- package/packages/armour/vite.config.ts +29 -0
- package/packages/concord/CHANGELOG.md +83 -0
- package/packages/concord/CLAUDE.md +9 -0
- package/packages/concord/README.md +146 -0
- package/packages/concord/SPEC.md +287 -0
- package/packages/concord/package.json +51 -0
- package/packages/concord/src/app.ts +717 -0
- package/packages/concord/src/errors.ts +9 -0
- package/packages/concord/src/index.ts +20 -0
- package/packages/concord/src/types.ts +127 -0
- package/packages/concord/test/concord.test.ts +978 -0
- package/packages/concord/tsconfig.json +12 -0
- package/packages/concord/vite.browser.config.ts +27 -0
- package/packages/concord/vite.config.ts +35 -0
- package/packages/concord/vite.config.ts.timestamp-1774262297922-ffd76e35ea668.mjs +83 -0
- package/packages/identity/CHANGELOG.md +47 -0
- package/packages/identity/README.md +236 -0
- package/packages/identity/package.json +41 -0
- package/packages/identity/src/index.ts +538 -0
- package/packages/identity/test/identity.test.ts +172 -0
- package/packages/identity/tsconfig.build.json +12 -0
- package/packages/identity/vite.config.ts +17 -0
- package/packages/ledger/CHANGELOG.md +69 -0
- package/packages/ledger/CLAUDE.md +9 -0
- package/packages/ledger/SPEC.md +304 -0
- package/packages/ledger/package.json +48 -0
- package/packages/ledger/src/index.ts +2 -0
- package/packages/ledger/src/ledger.ts +1286 -0
- package/packages/ledger/src/seal-cli.d.ts +25 -0
- package/packages/ledger/src/types.ts +294 -0
- package/packages/ledger/test/ledger.test.ts +838 -0
- package/packages/ledger/tsconfig.json +12 -0
- package/packages/ledger/vite.browser.config.ts +27 -0
- package/packages/ledger/vite.config.ts +39 -0
- package/packages/seal/CHANGELOG.md +137 -0
- package/packages/seal/CLAUDE.md +8 -0
- package/packages/seal/README.md +258 -0
- package/packages/seal/bin/seal +6 -0
- package/packages/seal/package.json +59 -0
- package/packages/seal/src/artifact.ts +380 -0
- package/packages/seal/src/cli.ts +372 -0
- package/packages/seal/src/commands/identity.ts +52 -0
- package/packages/seal/src/commands/manifest.ts +71 -0
- package/packages/seal/src/commands/publicKey.ts +7 -0
- package/packages/seal/src/commands/sign.ts +56 -0
- package/packages/seal/src/commands/verify.ts +54 -0
- package/packages/seal/src/crypto.ts +85 -0
- package/packages/seal/src/errors.ts +88 -0
- package/packages/seal/src/index.ts +5 -0
- package/packages/seal/src/manifest.ts +114 -0
- package/packages/seal/src/node.ts +18 -0
- package/packages/seal/src/proof.ts +344 -0
- package/packages/seal/test/artifact.test.ts +86 -0
- package/packages/seal/test/cli.test.ts +208 -0
- package/packages/seal/test/crypto.test.ts +21 -0
- package/packages/seal/test/manifest.test.ts +32 -0
- package/packages/seal/test/proof.test.ts +60 -0
- package/packages/seal/tsconfig.json +12 -0
- package/packages/seal/vite.config.ts +54 -0
- package/packages/ui/CHANGELOG.md +393 -0
- package/packages/ui/README.md +57 -0
- package/packages/ui/jsconfig.json +19 -0
- package/packages/ui/package.json +64 -0
- package/packages/ui/scripts/check-tokens.js +56 -0
- package/packages/ui/scripts/generate-theme-css.mjs +85 -0
- package/packages/ui/src/design-system/base.css +8 -0
- package/packages/ui/src/design-system/docs/ACCESSIBILITY_RULES.md +186 -0
- package/packages/ui/src/design-system/docs/AI_SYSTEM.md +281 -0
- package/packages/ui/src/design-system/docs/PATTERN_RULES.md +83 -0
- package/packages/ui/src/design-system/docs/PRIMITIVE_RULES.md +258 -0
- package/packages/ui/src/design-system/docs/TOKEN_RULES.md +235 -0
- package/packages/ui/src/design-system/docs/VISUAL_DIRECTION.md +68 -0
- package/packages/ui/src/design-system/foundation.js +420 -0
- package/packages/ui/src/design-system/tokens.css +140 -0
- package/packages/ui/src/design-system/tokens.js +327 -0
- package/packages/ui/src/design-system/utils.js +246 -0
- package/packages/ui/src/main.js +4 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.spec.md +24 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.types.ts +8 -0
- package/packages/ui/src/patterns/FeatureCard/FeatureCard.vue +175 -0
- package/packages/ui/src/patterns/FormField/FormField.spec.md +65 -0
- package/packages/ui/src/patterns/FormField/FormField.types.ts +11 -0
- package/packages/ui/src/patterns/FormField/FormField.vue +87 -0
- package/packages/ui/src/patterns/IdentityGlyph/IdentityGlyph.vue +61 -0
- package/packages/ui/src/patterns/IdentityGlyph/IdentityHandle.vue +58 -0
- package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.types.ts +36 -0
- package/packages/ui/src/patterns/IdentityGlyph/identityGlyph.utils.ts +585 -0
- package/packages/ui/src/patterns/IdentityGlyph/index.ts +5 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.spec.md +28 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.types.ts +16 -0
- package/packages/ui/src/patterns/KeyValueList/KeyValueList.vue +50 -0
- package/packages/ui/src/patterns/LandingPage/LandingIcon.vue +90 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.spec.md +24 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.types.ts +212 -0
- package/packages/ui/src/patterns/LandingPage/LandingPage.vue +599 -0
- package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.test.ts +33 -0
- package/packages/ui/src/patterns/ListWorkspaceLayout/ListWorkspaceLayout.vue +44 -0
- package/packages/ui/src/patterns/Logo/Logo.spec.md +22 -0
- package/packages/ui/src/patterns/Logo/Logo.vue +160 -0
- package/packages/ui/src/patterns/PageSurface/PageSurface.spec.md +15 -0
- package/packages/ui/src/patterns/PageSurface/PageSurface.vue +85 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.spec.md +39 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.types.ts +1 -0
- package/packages/ui/src/patterns/PanelChrome/PanelChrome.vue +187 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.spec.md +31 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.types.ts +23 -0
- package/packages/ui/src/patterns/PreviewPanel/PreviewPanel.vue +354 -0
- package/packages/ui/src/patterns/RecordList/RecordList.spec.md +35 -0
- package/packages/ui/src/patterns/RecordList/RecordList.test.ts +42 -0
- package/packages/ui/src/patterns/RecordList/RecordList.types.ts +9 -0
- package/packages/ui/src/patterns/RecordList/RecordList.utils.ts +5 -0
- package/packages/ui/src/patterns/RecordList/RecordList.vue +134 -0
- package/packages/ui/src/patterns/SectionClarifier/SectionClarifier.vue +85 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.spec.md +25 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.types.ts +7 -0
- package/packages/ui/src/patterns/SectionIntro/SectionIntro.vue +141 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.spec.md +34 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.types.ts +17 -0
- package/packages/ui/src/patterns/SidebarNav/SidebarNav.vue +110 -0
- package/packages/ui/src/patterns/SplitView/SplitView.spec.md +28 -0
- package/packages/ui/src/patterns/SplitView/SplitView.test.ts +22 -0
- package/packages/ui/src/patterns/SplitView/SplitView.types.ts +3 -0
- package/packages/ui/src/patterns/SplitView/SplitView.utils.ts +13 -0
- package/packages/ui/src/patterns/SplitView/SplitView.vue +39 -0
- package/packages/ui/src/patterns/StepList/StepList.spec.md +15 -0
- package/packages/ui/src/patterns/StepList/StepList.types.ts +4 -0
- package/packages/ui/src/patterns/StepList/StepList.vue +91 -0
- package/packages/ui/src/patterns/Verification/VerificationBadge.vue +97 -0
- package/packages/ui/src/patterns/Verification/VerificationComponents.test.ts +153 -0
- package/packages/ui/src/patterns/Verification/VerificationDetailsPanel.vue +270 -0
- package/packages/ui/src/patterns/Verification/VerificationSummary.vue +171 -0
- package/packages/ui/src/patterns/Verification/index.ts +6 -0
- package/packages/ui/src/patterns/Verification/verification.types.ts +8 -0
- package/packages/ui/src/patterns/Verification/verification.utils.test.ts +37 -0
- package/packages/ui/src/patterns/Verification/verification.utils.ts +75 -0
- package/packages/ui/src/patterns/index.ts +25 -0
- package/packages/ui/src/primitives/Accordian/Accordian.vue +11 -0
- package/packages/ui/src/primitives/Accordian/AccordianItem.vue +14 -0
- package/packages/ui/src/primitives/Accordion/Accordion.props.ts +21 -0
- package/packages/ui/src/primitives/Accordion/Accordion.spec.md +50 -0
- package/packages/ui/src/primitives/Accordion/Accordion.types.ts +4 -0
- package/packages/ui/src/primitives/Accordion/Accordion.variants.ts +12 -0
- package/packages/ui/src/primitives/Accordion/Accordion.vue +71 -0
- package/packages/ui/src/primitives/Accordion/AccordionItem.props.ts +14 -0
- package/packages/ui/src/primitives/Accordion/AccordionItem.vue +40 -0
- package/packages/ui/src/primitives/Badge/Badge.props.ts +17 -0
- package/packages/ui/src/primitives/Badge/Badge.spec.md +17 -0
- package/packages/ui/src/primitives/Badge/Badge.types.ts +15 -0
- package/packages/ui/src/primitives/Badge/Badge.variants.ts +48 -0
- package/packages/ui/src/primitives/Badge/Badge.vue +31 -0
- package/packages/ui/src/primitives/Button/Button.props.ts +29 -0
- package/packages/ui/src/primitives/Button/Button.spec.md +139 -0
- package/packages/ui/src/primitives/Button/Button.types.ts +19 -0
- package/packages/ui/src/primitives/Button/Button.variants.ts +72 -0
- package/packages/ui/src/primitives/Button/Button.vue +90 -0
- package/packages/ui/src/primitives/Card/Card.props.ts +17 -0
- package/packages/ui/src/primitives/Card/Card.spec.md +29 -0
- package/packages/ui/src/primitives/Card/Card.types.ts +12 -0
- package/packages/ui/src/primitives/Card/Card.variants.ts +27 -0
- package/packages/ui/src/primitives/Card/Card.vue +37 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.props.ts +21 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.spec.md +51 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.types.ts +4 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.variants.ts +34 -0
- package/packages/ui/src/primitives/Checkbox/Checkbox.vue +92 -0
- package/packages/ui/src/primitives/Dialog/Dialog.props.ts +29 -0
- package/packages/ui/src/primitives/Dialog/Dialog.spec.md +52 -0
- package/packages/ui/src/primitives/Dialog/Dialog.types.ts +3 -0
- package/packages/ui/src/primitives/Dialog/Dialog.variants.ts +27 -0
- package/packages/ui/src/primitives/Dialog/Dialog.vue +78 -0
- package/packages/ui/src/primitives/Drawer/Drawer.props.ts +33 -0
- package/packages/ui/src/primitives/Drawer/Drawer.spec.md +50 -0
- package/packages/ui/src/primitives/Drawer/Drawer.types.ts +5 -0
- package/packages/ui/src/primitives/Drawer/Drawer.variants.ts +35 -0
- package/packages/ui/src/primitives/Drawer/Drawer.vue +88 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.props.ts +17 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.spec.md +35 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.types.ts +5 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.variants.ts +14 -0
- package/packages/ui/src/primitives/FieldMessage/FieldMessage.vue +40 -0
- package/packages/ui/src/primitives/FileInput/FileInput.props.ts +41 -0
- package/packages/ui/src/primitives/FileInput/FileInput.types.ts +6 -0
- package/packages/ui/src/primitives/FileInput/FileInput.variants.ts +46 -0
- package/packages/ui/src/primitives/FileInput/FileInput.vue +163 -0
- package/packages/ui/src/primitives/Input/Input.props.ts +29 -0
- package/packages/ui/src/primitives/Input/Input.spec.md +79 -0
- package/packages/ui/src/primitives/Input/Input.types.ts +13 -0
- package/packages/ui/src/primitives/Input/Input.variants.ts +54 -0
- package/packages/ui/src/primitives/Input/Input.vue +99 -0
- package/packages/ui/src/primitives/Label/Label.props.ts +25 -0
- package/packages/ui/src/primitives/Label/Label.spec.md +31 -0
- package/packages/ui/src/primitives/Label/Label.types.ts +3 -0
- package/packages/ui/src/primitives/Label/Label.variants.ts +17 -0
- package/packages/ui/src/primitives/Label/Label.vue +38 -0
- package/packages/ui/src/primitives/Menu/Menu.props.ts +17 -0
- package/packages/ui/src/primitives/Menu/Menu.spec.md +38 -0
- package/packages/ui/src/primitives/Menu/Menu.types.ts +10 -0
- package/packages/ui/src/primitives/Menu/Menu.variants.ts +10 -0
- package/packages/ui/src/primitives/Menu/Menu.vue +57 -0
- package/packages/ui/src/primitives/Popover/Popover.props.ts +25 -0
- package/packages/ui/src/primitives/Popover/Popover.spec.md +49 -0
- package/packages/ui/src/primitives/Popover/Popover.types.ts +3 -0
- package/packages/ui/src/primitives/Popover/Popover.variants.ts +18 -0
- package/packages/ui/src/primitives/Popover/Popover.vue +74 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.props.ts +29 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.spec.md +50 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.types.ts +12 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.variants.ts +48 -0
- package/packages/ui/src/primitives/RadioGroup/RadioGroup.vue +87 -0
- package/packages/ui/src/primitives/Separator/Separator.props.ts +9 -0
- package/packages/ui/src/primitives/Separator/Separator.spec.md +15 -0
- package/packages/ui/src/primitives/Separator/Separator.types.ts +3 -0
- package/packages/ui/src/primitives/Separator/Separator.variants.ts +8 -0
- package/packages/ui/src/primitives/Separator/Separator.vue +23 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.props.ts +21 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.spec.md +18 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.types.ts +5 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.variants.ts +18 -0
- package/packages/ui/src/primitives/Skeleton/Skeleton.vue +37 -0
- package/packages/ui/src/primitives/Spinner/Spinner.props.ts +13 -0
- package/packages/ui/src/primitives/Spinner/Spinner.spec.md +16 -0
- package/packages/ui/src/primitives/Spinner/Spinner.types.ts +5 -0
- package/packages/ui/src/primitives/Spinner/Spinner.variants.ts +15 -0
- package/packages/ui/src/primitives/Spinner/Spinner.vue +33 -0
- package/packages/ui/src/primitives/SplitButton/SplitButton.vue +108 -0
- package/packages/ui/src/primitives/Switch/Switch.props.ts +21 -0
- package/packages/ui/src/primitives/Switch/Switch.spec.md +49 -0
- package/packages/ui/src/primitives/Switch/Switch.types.ts +3 -0
- package/packages/ui/src/primitives/Switch/Switch.variants.ts +34 -0
- package/packages/ui/src/primitives/Switch/Switch.vue +71 -0
- package/packages/ui/src/primitives/Tabs/Tabs.props.ts +25 -0
- package/packages/ui/src/primitives/Tabs/Tabs.spec.md +48 -0
- package/packages/ui/src/primitives/Tabs/Tabs.types.ts +11 -0
- package/packages/ui/src/primitives/Tabs/Tabs.variants.ts +28 -0
- package/packages/ui/src/primitives/Tabs/Tabs.vue +59 -0
- package/packages/ui/src/primitives/Textarea/Textarea.props.ts +33 -0
- package/packages/ui/src/primitives/Textarea/Textarea.spec.md +59 -0
- package/packages/ui/src/primitives/Textarea/Textarea.types.ts +5 -0
- package/packages/ui/src/primitives/Textarea/Textarea.variants.ts +27 -0
- package/packages/ui/src/primitives/Textarea/Textarea.vue +74 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.props.ts +21 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.spec.md +45 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.types.ts +3 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.variants.ts +4 -0
- package/packages/ui/src/primitives/Tooltip/Tooltip.vue +31 -0
- package/packages/ui/src/primitives/TreeView/TreeView.types.ts +10 -0
- package/packages/ui/src/primitives/TreeView/TreeView.vue +113 -0
- package/packages/ui/src/primitives/TreeView/TreeViewNode.vue +190 -0
- package/packages/ui/src/primitives/index.ts +29 -0
- package/packages/ui/src/style.css +7 -0
- package/packages/ui/src/style.js +1 -0
- package/packages/ui/src/themes/armour.css +147 -0
- package/packages/ui/src/themes/aurora.css +147 -0
- package/packages/ui/src/themes/citrine-ash.css +147 -0
- package/packages/ui/src/themes/concord.css +147 -0
- package/packages/ui/src/themes/garnet-honey.css +147 -0
- package/packages/ui/src/themes/harbor-rose.css +147 -0
- package/packages/ui/src/themes/ledger.css +147 -0
- package/packages/ui/src/themes/neon-noir.css +74 -0
- package/packages/ui/src/themes/obsidian-iris.css +147 -0
- package/packages/ui/src/themes/pixpax.css +147 -0
- package/packages/ui/src/themes/print.css +147 -0
- package/packages/ui/src/themes/prism.css +147 -0
- package/packages/ui/src/themes/proof.css +145 -0
- package/packages/ui/src/themes/semanticThemeContract.js +2256 -0
- package/packages/ui/src/themes/spruce-ink.css +147 -0
- package/packages/ui/src/themes/sunset.css +147 -0
- package/packages/ui/tailwind.config.js +64 -0
- package/packages/ui/vite.config.js +35 -0
- package/packages/ui/vite.config.js.timestamp-1780697224943-89fbc929987bc.mjs +38 -0
- package/packages/utils/CHANGELOG.md +111 -0
- package/packages/utils/README.md +3 -0
- package/packages/utils/package.json +46 -0
- package/packages/utils/src/index.test.js +39 -0
- package/packages/utils/src/index.ts +289 -0
- package/packages/utils/tsconfig.build.json +12 -0
- package/packages/utils/vite.config.js +28 -0
- package/pnpm-workspace.yaml +8 -0
- package/scripts/vite/package-lib-config.ts +59 -0
- package/tsconfig.json +24 -0
- package/tsconfig.node.json +9 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Logo
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Shared Ternent brand mark for product chrome, headers, and navigation.
|
|
6
|
+
|
|
7
|
+
## Category
|
|
8
|
+
|
|
9
|
+
Pattern
|
|
10
|
+
|
|
11
|
+
## Public API
|
|
12
|
+
|
|
13
|
+
Props:
|
|
14
|
+
|
|
15
|
+
- `decorative`
|
|
16
|
+
- `title`
|
|
17
|
+
|
|
18
|
+
Behavior:
|
|
19
|
+
|
|
20
|
+
- merges consumer classes so callers control rendered size
|
|
21
|
+
- uses per-instance SVG ids to avoid collisions when multiple logos render on one page
|
|
22
|
+
- uses `--ui-logo-start`, `--ui-logo-end`, and `--ui-logo-cutout` so the mark follows the active theme without overloading generic component colors
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, normalizeClass, useAttrs, useId } from "vue";
|
|
3
|
+
import { twMerge } from "tailwind-merge";
|
|
4
|
+
|
|
5
|
+
defineOptions({ inheritAttrs: false });
|
|
6
|
+
|
|
7
|
+
const props = withDefaults(
|
|
8
|
+
defineProps<{
|
|
9
|
+
decorative?: boolean;
|
|
10
|
+
title?: string;
|
|
11
|
+
}>(),
|
|
12
|
+
{
|
|
13
|
+
decorative: true,
|
|
14
|
+
title: "Ternent logo",
|
|
15
|
+
},
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const attrs = useAttrs();
|
|
19
|
+
const instanceId = useId().replace(/:/g, "");
|
|
20
|
+
|
|
21
|
+
const classes = computed(() => twMerge("block h-auto w-12 shrink-0", normalizeClass(attrs.class)));
|
|
22
|
+
|
|
23
|
+
const forwardedAttrs = computed(() => {
|
|
24
|
+
const { class: _class, ...rest } = attrs;
|
|
25
|
+
return rest;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const ids = {
|
|
29
|
+
title: `ternent-logo-title-${instanceId}`,
|
|
30
|
+
topClip: `ternent-logo-top-clip-${instanceId}`,
|
|
31
|
+
topGradient: `ternent-logo-top-gradient-${instanceId}`,
|
|
32
|
+
rightClip: `ternent-logo-right-clip-${instanceId}`,
|
|
33
|
+
rightGradient: `ternent-logo-right-gradient-${instanceId}`,
|
|
34
|
+
frameClip: `ternent-logo-frame-clip-${instanceId}`,
|
|
35
|
+
innerFrameClip: `ternent-logo-inner-frame-clip-${instanceId}`,
|
|
36
|
+
frameGradient: `ternent-logo-frame-gradient-${instanceId}`,
|
|
37
|
+
bodyClip: `ternent-logo-body-clip-${instanceId}`,
|
|
38
|
+
} as const;
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<template>
|
|
42
|
+
<svg
|
|
43
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
44
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
45
|
+
viewBox="0 0 375 374.999991"
|
|
46
|
+
preserveAspectRatio="xMidYMid meet"
|
|
47
|
+
version="1.0"
|
|
48
|
+
:class="classes"
|
|
49
|
+
:role="props.decorative ? undefined : 'img'"
|
|
50
|
+
:aria-hidden="props.decorative ? 'true' : undefined"
|
|
51
|
+
:aria-labelledby="props.decorative ? undefined : ids.title"
|
|
52
|
+
focusable="false"
|
|
53
|
+
v-bind="forwardedAttrs"
|
|
54
|
+
>
|
|
55
|
+
<title v-if="!props.decorative" :id="ids.title">{{ props.title }}</title>
|
|
56
|
+
<defs>
|
|
57
|
+
<clipPath :id="ids.topClip">
|
|
58
|
+
<path
|
|
59
|
+
d="M 88.570312 12.242188 L 360.371094 12.242188 L 360.371094 281.835938 L 88.570312 281.835938 Z M 88.570312 12.242188 "
|
|
60
|
+
clip-rule="nonzero"
|
|
61
|
+
/>
|
|
62
|
+
</clipPath>
|
|
63
|
+
<linearGradient
|
|
64
|
+
:id="ids.topGradient"
|
|
65
|
+
x1="-0.0000042293"
|
|
66
|
+
y1="0"
|
|
67
|
+
x2="255.999987"
|
|
68
|
+
y2="0"
|
|
69
|
+
gradientUnits="userSpaceOnUse"
|
|
70
|
+
gradientTransform="matrix(1.061725, 0, 0, 1.05311, 88.568506, 12.24124)"
|
|
71
|
+
>
|
|
72
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
|
|
73
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
|
|
74
|
+
</linearGradient>
|
|
75
|
+
|
|
76
|
+
<clipPath :id="ids.rightClip">
|
|
77
|
+
<path
|
|
78
|
+
d="M 12.242188 90.773438 L 284.042969 90.773438 L 284.042969 360.371094 L 12.242188 360.371094 Z M 12.242188 90.773438 "
|
|
79
|
+
clip-rule="nonzero"
|
|
80
|
+
/>
|
|
81
|
+
</clipPath>
|
|
82
|
+
<linearGradient
|
|
83
|
+
:id="ids.rightGradient"
|
|
84
|
+
x1="-0.000000461562"
|
|
85
|
+
y1="0"
|
|
86
|
+
x2="255.999991"
|
|
87
|
+
y2="0"
|
|
88
|
+
gradientUnits="userSpaceOnUse"
|
|
89
|
+
gradientTransform="matrix(1.061725, 0, 0, 1.05311, 12.241246, 90.774018)"
|
|
90
|
+
>
|
|
91
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
|
|
92
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
|
|
93
|
+
</linearGradient>
|
|
94
|
+
|
|
95
|
+
<clipPath :id="ids.frameClip">
|
|
96
|
+
<path
|
|
97
|
+
d="M 12.242188 12.242188 L 360.371094 12.242188 L 360.371094 360.371094 L 12.242188 360.371094 Z M 12.242188 12.242188 "
|
|
98
|
+
clip-rule="nonzero"
|
|
99
|
+
/>
|
|
100
|
+
</clipPath>
|
|
101
|
+
<clipPath :id="ids.innerFrameClip">
|
|
102
|
+
<path
|
|
103
|
+
d="M 66.636719 12.242188 L 305.976562 12.242188 C 336.015625 12.242188 360.371094 36.59375 360.371094 66.636719 L 360.371094 305.976562 C 360.371094 336.015625 336.015625 360.371094 305.976562 360.371094 L 66.636719 360.371094 C 36.59375 360.371094 12.242188 336.015625 12.242188 305.976562 L 12.242188 66.636719 C 12.242188 36.59375 36.59375 12.242188 66.636719 12.242188 Z M 66.636719 12.242188 "
|
|
104
|
+
clip-rule="nonzero"
|
|
105
|
+
/>
|
|
106
|
+
</clipPath>
|
|
107
|
+
<linearGradient
|
|
108
|
+
:id="ids.frameGradient"
|
|
109
|
+
x1="-0.000000360364"
|
|
110
|
+
y1="0"
|
|
111
|
+
x2="255.999979"
|
|
112
|
+
y2="0"
|
|
113
|
+
gradientUnits="userSpaceOnUse"
|
|
114
|
+
gradientTransform="matrix(1.359879, 0, 0, 1.359879, 12.241246, 12.24124)"
|
|
115
|
+
>
|
|
116
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-start)" offset="0" />
|
|
117
|
+
<stop stop-opacity="1" stop-color="var(--ui-logo-end)" offset="1" />
|
|
118
|
+
</linearGradient>
|
|
119
|
+
|
|
120
|
+
<clipPath :id="ids.bodyClip">
|
|
121
|
+
<path
|
|
122
|
+
d="M 44.277344 44.277344 L 325 44.277344 L 325 325 L 44.277344 325 Z M 44.277344 44.277344 "
|
|
123
|
+
clip-rule="nonzero"
|
|
124
|
+
/>
|
|
125
|
+
</clipPath>
|
|
126
|
+
</defs>
|
|
127
|
+
|
|
128
|
+
<g :clip-path="`url(#${ids.topClip})`">
|
|
129
|
+
<path
|
|
130
|
+
:fill="`url(#${ids.topGradient})`"
|
|
131
|
+
d="M 88.570312 12.242188 L 88.570312 281.835938 L 360.371094 281.835938 L 360.371094 12.242188 Z M 88.570312 12.242188 "
|
|
132
|
+
fill-rule="nonzero"
|
|
133
|
+
/>
|
|
134
|
+
</g>
|
|
135
|
+
<g :clip-path="`url(#${ids.rightClip})`">
|
|
136
|
+
<path
|
|
137
|
+
:fill="`url(#${ids.rightGradient})`"
|
|
138
|
+
d="M 12.242188 90.773438 L 12.242188 360.371094 L 284.042969 360.371094 L 284.042969 90.773438 Z M 12.242188 90.773438 "
|
|
139
|
+
fill-rule="nonzero"
|
|
140
|
+
/>
|
|
141
|
+
</g>
|
|
142
|
+
<g :clip-path="`url(#${ids.frameClip})`">
|
|
143
|
+
<g :clip-path="`url(#${ids.innerFrameClip})`">
|
|
144
|
+
<path
|
|
145
|
+
:fill="`url(#${ids.frameGradient})`"
|
|
146
|
+
d="M 12.242188 12.242188 L 12.242188 360.371094 L 360.371094 360.371094 L 360.371094 12.242188 Z M 12.242188 12.242188 "
|
|
147
|
+
fill-rule="nonzero"
|
|
148
|
+
/>
|
|
149
|
+
</g>
|
|
150
|
+
</g>
|
|
151
|
+
<g :clip-path="`url(#${ids.bodyClip})`">
|
|
152
|
+
<path
|
|
153
|
+
fill="var(--ui-logo-cutout)"
|
|
154
|
+
d="M 81.441406 44.277344 C 46.167969 44.277344 44.277344 77.660156 44.277344 79.550781 L 44.277344 324.582031 C 169.625 324.582031 266 324.582031 287.417969 324.582031 C 322.691406 324.582031 324.582031 291.195312 324.582031 289.308594 L 324.582031 44.277344 Z M 89 129.941406 C 89 129.941406 100.96875 143.171875 129.3125 143.171875 C 157.660156 143.171875 168.996094 129.941406 168.996094 129.941406 C 168.996094 147.582031 151.359375 162.066406 129.3125 162.066406 C 107.265625 162.066406 89 147.582031 89 129.941406 Z M 248.992188 237.027344 C 239.546875 242.695312 228.835938 246.472656 216.867188 249.625 C 206.789062 252.144531 196.710938 253.402344 186.003906 253.402344 C 173.40625 253.402344 161.4375 251.511719 149.46875 248.363281 C 138.761719 245.214844 128.683594 240.804688 119.863281 235.765625 C 114.195312 231.988281 112.9375 225.058594 116.085938 219.386719 C 119.863281 213.71875 126.792969 212.460938 132.460938 215.609375 C 139.390625 220.019531 146.949219 223.167969 155.769531 225.6875 C 173.40625 230.726562 193.5625 230.726562 211.828125 226.945312 C 221.277344 224.425781 230.097656 221.277344 237.027344 216.867188 C 242.695312 213.71875 249.625 215.609375 253.402344 220.648438 C 256.550781 226.316406 254.664062 233.875 248.992188 237.027344 Z M 245.214844 162.066406 C 223.167969 162.066406 205.53125 147.582031 205.53125 129.941406 C 205.53125 129.941406 217.5 143.171875 245.84375 143.171875 C 274.1875 143.171875 285.527344 129.941406 285.527344 129.941406 C 284.898438 147.582031 266.628906 162.066406 245.214844 162.066406 Z M 245.214844 162.066406 "
|
|
155
|
+
fill-opacity="1"
|
|
156
|
+
fill-rule="nonzero"
|
|
157
|
+
/>
|
|
158
|
+
</g>
|
|
159
|
+
</svg>
|
|
160
|
+
</template>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# PageSurface
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Token-driven full-page canvas for marketing and product landing layouts.
|
|
6
|
+
|
|
7
|
+
## Category
|
|
8
|
+
|
|
9
|
+
Pattern
|
|
10
|
+
|
|
11
|
+
## Behavior
|
|
12
|
+
|
|
13
|
+
- provides a quiet atmospheric background
|
|
14
|
+
- keeps all decoration inside the pattern rather than route-local styling
|
|
15
|
+
- preserves app content structure through the default slot
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="ui-page-surface">
|
|
3
|
+
<div class="ui-page-surface__mesh" aria-hidden="true"></div>
|
|
4
|
+
<div class="ui-page-surface__glow ui-page-surface__glow--primary" aria-hidden="true"></div>
|
|
5
|
+
<div class="ui-page-surface__glow ui-page-surface__glow--accent" aria-hidden="true"></div>
|
|
6
|
+
<div class="ui-page-surface__content">
|
|
7
|
+
<slot />
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<style scoped>
|
|
13
|
+
.ui-page-surface {
|
|
14
|
+
position: relative;
|
|
15
|
+
min-height: 100vh;
|
|
16
|
+
overflow-x: clip;
|
|
17
|
+
overflow-y: visible;
|
|
18
|
+
background:
|
|
19
|
+
radial-gradient(
|
|
20
|
+
circle at top center,
|
|
21
|
+
color-mix(in srgb, var(--ui-primary-muted) 70%, transparent),
|
|
22
|
+
transparent 42%
|
|
23
|
+
),
|
|
24
|
+
linear-gradient(
|
|
25
|
+
180deg,
|
|
26
|
+
color-mix(in srgb, var(--ui-tonal-tertiary) 72%, transparent),
|
|
27
|
+
transparent 34%
|
|
28
|
+
),
|
|
29
|
+
var(--ui-bg);
|
|
30
|
+
color: var(--ui-fg);
|
|
31
|
+
isolation: isolate;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.ui-page-surface__content {
|
|
35
|
+
position: relative;
|
|
36
|
+
z-index: 1;
|
|
37
|
+
background: color-mix(in srgb, var(--ui-bg) 35%, transparent);
|
|
38
|
+
box-shadow:
|
|
39
|
+
0 20px 50px rgba(8, 10, 24, 0.14),
|
|
40
|
+
inset 0 24px 48px color-mix(in srgb, var(--ui-bg) 26%, transparent),
|
|
41
|
+
inset 0 -24px 48px color-mix(in srgb, var(--ui-bg) 22%, transparent);
|
|
42
|
+
backdrop-filter: blur(16px) saturate(120%);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.ui-page-surface__mesh,
|
|
46
|
+
.ui-page-surface__glow {
|
|
47
|
+
pointer-events: none;
|
|
48
|
+
position: absolute;
|
|
49
|
+
inset: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.ui-page-surface__mesh {
|
|
53
|
+
opacity: 0.3;
|
|
54
|
+
background-image:
|
|
55
|
+
linear-gradient(color-mix(in srgb, var(--ui-border) 72%, transparent) 1px, transparent 1px),
|
|
56
|
+
linear-gradient(
|
|
57
|
+
90deg,
|
|
58
|
+
color-mix(in srgb, var(--ui-border) 72%, transparent) 1px,
|
|
59
|
+
transparent 1px
|
|
60
|
+
);
|
|
61
|
+
background-size: 2rem 2rem;
|
|
62
|
+
mask-image: radial-gradient(circle at center, black, transparent 72%);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.ui-page-surface__glow {
|
|
66
|
+
filter: blur(64px);
|
|
67
|
+
opacity: 0.5;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.ui-page-surface__glow--primary {
|
|
71
|
+
top: 12%;
|
|
72
|
+
left: 58%;
|
|
73
|
+
width: 22rem;
|
|
74
|
+
height: 22rem;
|
|
75
|
+
background: color-mix(in srgb, var(--ui-primary) 22%, transparent);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.ui-page-surface__glow--accent {
|
|
79
|
+
top: 48%;
|
|
80
|
+
left: 8%;
|
|
81
|
+
width: 18rem;
|
|
82
|
+
height: 18rem;
|
|
83
|
+
background: color-mix(in srgb, var(--ui-info) 16%, transparent);
|
|
84
|
+
}
|
|
85
|
+
</style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# PanelChrome
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Reusable bottom/side panel shell with collapsible chrome and token-driven resize behavior.
|
|
6
|
+
|
|
7
|
+
## Category
|
|
8
|
+
|
|
9
|
+
Pattern
|
|
10
|
+
|
|
11
|
+
## Public API
|
|
12
|
+
|
|
13
|
+
Models:
|
|
14
|
+
|
|
15
|
+
- `v-model:open` (`boolean`)
|
|
16
|
+
- `v-model:height` (`number`)
|
|
17
|
+
- `v-model:dragging` (`boolean`)
|
|
18
|
+
|
|
19
|
+
Props:
|
|
20
|
+
|
|
21
|
+
- `container`: optional resize bounds container
|
|
22
|
+
- `minHeight`: minimum expanded panel height
|
|
23
|
+
- `maxHeight`: optional maximum expanded panel height
|
|
24
|
+
- `collapsedHeight`: panel height when closed
|
|
25
|
+
- `resizable`: enables drag handle
|
|
26
|
+
- `title`: fallback header text
|
|
27
|
+
|
|
28
|
+
Slots:
|
|
29
|
+
|
|
30
|
+
- `header`
|
|
31
|
+
- `actions`
|
|
32
|
+
- default body slot
|
|
33
|
+
|
|
34
|
+
## Behavior
|
|
35
|
+
|
|
36
|
+
- composes primitive `Button` and `Separator`
|
|
37
|
+
- uses pointer drag on a dedicated resize handle
|
|
38
|
+
- clamps height to min/max bounds
|
|
39
|
+
- keeps collapse toggle behavior consistent across panel consumers
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type PanelChromeContainer = HTMLElement | null;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, onBeforeUnmount, ref, watch } from "vue";
|
|
3
|
+
import Button from "../../primitives/Button/Button.vue";
|
|
4
|
+
import Separator from "../../primitives/Separator/Separator.vue";
|
|
5
|
+
import type { PanelChromeContainer } from "./PanelChrome.types";
|
|
6
|
+
|
|
7
|
+
const props = withDefaults(
|
|
8
|
+
defineProps<{
|
|
9
|
+
collapsedHeight?: number;
|
|
10
|
+
container?: PanelChromeContainer;
|
|
11
|
+
maxHeight?: number;
|
|
12
|
+
minHeight?: number;
|
|
13
|
+
resizable?: boolean;
|
|
14
|
+
title?: string;
|
|
15
|
+
}>(),
|
|
16
|
+
{
|
|
17
|
+
collapsedHeight: 32,
|
|
18
|
+
container: null,
|
|
19
|
+
maxHeight: undefined,
|
|
20
|
+
minHeight: 200,
|
|
21
|
+
resizable: true,
|
|
22
|
+
title: undefined,
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const open = defineModel<boolean>("open", { default: false });
|
|
27
|
+
const height = defineModel<number>("height", { default: 320 });
|
|
28
|
+
const dragging = defineModel<boolean>("dragging", { default: false });
|
|
29
|
+
|
|
30
|
+
const draggingPointerId = ref<number | null>(null);
|
|
31
|
+
|
|
32
|
+
const clampedHeight = computed(() => clamp(height.value, props.minHeight, resolveMaxHeight()));
|
|
33
|
+
|
|
34
|
+
watch(clampedHeight, (nextHeight) => {
|
|
35
|
+
if (nextHeight !== height.value) {
|
|
36
|
+
height.value = nextHeight;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
function clamp(value: number, min: number, max: number): number {
|
|
41
|
+
return Math.max(min, Math.min(max, value));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function resolveContainerBottom(): number {
|
|
45
|
+
if (props.container) {
|
|
46
|
+
return props.container.getBoundingClientRect().bottom;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (typeof window !== "undefined") {
|
|
50
|
+
return window.innerHeight;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return clampedHeight.value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function resolveMaxHeight(): number {
|
|
57
|
+
if (typeof props.maxHeight === "number") {
|
|
58
|
+
return Math.max(props.maxHeight, props.minHeight);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const containerBottom = resolveContainerBottom();
|
|
62
|
+
return Math.max(props.minHeight, containerBottom - props.collapsedHeight);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function computeHeightFromPointer(clientY: number): number {
|
|
66
|
+
const nextHeight = resolveContainerBottom() - clientY;
|
|
67
|
+
return clamp(nextHeight, props.minHeight, resolveMaxHeight());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function stopDragging(): void {
|
|
71
|
+
if (!dragging.value) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
dragging.value = false;
|
|
76
|
+
draggingPointerId.value = null;
|
|
77
|
+
|
|
78
|
+
if (typeof window !== "undefined") {
|
|
79
|
+
window.removeEventListener("pointermove", handlePointerMove);
|
|
80
|
+
window.removeEventListener("pointerup", handlePointerUp);
|
|
81
|
+
window.removeEventListener("pointercancel", handlePointerUp);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function handlePointerMove(event: PointerEvent): void {
|
|
86
|
+
if (!dragging.value) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
height.value = computeHeightFromPointer(event.clientY);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function handlePointerUp(): void {
|
|
94
|
+
stopDragging();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function startResize(event: PointerEvent): void {
|
|
98
|
+
if (!open.value || !props.resizable) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
dragging.value = true;
|
|
104
|
+
draggingPointerId.value = event.pointerId;
|
|
105
|
+
|
|
106
|
+
if (typeof window !== "undefined") {
|
|
107
|
+
window.addEventListener("pointermove", handlePointerMove);
|
|
108
|
+
window.addEventListener("pointerup", handlePointerUp);
|
|
109
|
+
window.addEventListener("pointercancel", handlePointerUp);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function toggleOpen(): void {
|
|
114
|
+
open.value = !open.value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
onBeforeUnmount(() => {
|
|
118
|
+
stopDragging();
|
|
119
|
+
});
|
|
120
|
+
</script>
|
|
121
|
+
|
|
122
|
+
<template>
|
|
123
|
+
<section
|
|
124
|
+
class="relative z-40 flex min-h-0 flex-col"
|
|
125
|
+
:class="{
|
|
126
|
+
'h-9': !open,
|
|
127
|
+
'transition-[height] duration-[var(--ui-duration-normal)] ease-[var(--ui-ease-out)]':
|
|
128
|
+
!dragging,
|
|
129
|
+
}"
|
|
130
|
+
:style="open ? { height: `${clampedHeight}px` } : undefined"
|
|
131
|
+
>
|
|
132
|
+
<div
|
|
133
|
+
v-if="open && props.resizable"
|
|
134
|
+
role="separator"
|
|
135
|
+
aria-orientation="horizontal"
|
|
136
|
+
class="cursor-row-resize px-2 py-1"
|
|
137
|
+
@pointerdown="startResize"
|
|
138
|
+
>
|
|
139
|
+
<Separator orientation="horizontal" />
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div
|
|
143
|
+
class="relative z-10 flex items-center justify-between border-t border-[var(--ui-border)] bg-[var(--ui-surface)] px-3 py-1"
|
|
144
|
+
>
|
|
145
|
+
<div class="flex min-w-0 flex-1 items-center gap-2">
|
|
146
|
+
<slot name="header">
|
|
147
|
+
<p v-if="props.title" class="m-0 text-xs text-[var(--ui-fg-muted)]">
|
|
148
|
+
{{ props.title }}
|
|
149
|
+
</p>
|
|
150
|
+
</slot>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<div class="flex items-center gap-2">
|
|
154
|
+
<slot name="actions" />
|
|
155
|
+
<Button
|
|
156
|
+
aria-label="Toggle panel"
|
|
157
|
+
:aria-pressed="open"
|
|
158
|
+
variant="plain-secondary"
|
|
159
|
+
size="xs"
|
|
160
|
+
class="ml-1 h-7 w-7 !px-0"
|
|
161
|
+
@click="toggleOpen"
|
|
162
|
+
>
|
|
163
|
+
<svg
|
|
164
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
165
|
+
class="h-5 w-5 transition-transform duration-[var(--ui-duration-normal)]"
|
|
166
|
+
:class="open ? 'rotate-0' : 'rotate-180'"
|
|
167
|
+
fill="none"
|
|
168
|
+
viewBox="0 0 24 24"
|
|
169
|
+
stroke="currentColor"
|
|
170
|
+
aria-hidden="true"
|
|
171
|
+
>
|
|
172
|
+
<path
|
|
173
|
+
stroke-linecap="round"
|
|
174
|
+
stroke-linejoin="round"
|
|
175
|
+
stroke-width="2"
|
|
176
|
+
d="M19 9l-7 7-7-7"
|
|
177
|
+
/>
|
|
178
|
+
</svg>
|
|
179
|
+
</Button>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<div v-show="open" class="flex min-h-0 flex-1 overflow-auto bg-[var(--ui-surface)]">
|
|
184
|
+
<slot />
|
|
185
|
+
</div>
|
|
186
|
+
</section>
|
|
187
|
+
</template>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# PreviewPanel
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Reusable technical preview surface for code, structured rows, and status-heavy callouts.
|
|
6
|
+
|
|
7
|
+
## Category
|
|
8
|
+
|
|
9
|
+
Pattern
|
|
10
|
+
|
|
11
|
+
## Public API
|
|
12
|
+
|
|
13
|
+
Props:
|
|
14
|
+
|
|
15
|
+
- `title`
|
|
16
|
+
- `meta`
|
|
17
|
+
- `tabs`
|
|
18
|
+
- `activeTab`
|
|
19
|
+
- `rows`
|
|
20
|
+
- `code`
|
|
21
|
+
- `statusLabel`
|
|
22
|
+
- `statusTone`
|
|
23
|
+
- `emphasis`: `subtle | default | strong`
|
|
24
|
+
- `badgeMode`: `default | quiet`
|
|
25
|
+
- `footerLabel`
|
|
26
|
+
- `footerTone`
|
|
27
|
+
- `footerText`
|
|
28
|
+
|
|
29
|
+
Slots:
|
|
30
|
+
|
|
31
|
+
- default: custom panel body when `rows` and `code` are not enough
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const previewPanelToneValues = [
|
|
2
|
+
"neutral",
|
|
3
|
+
"primary",
|
|
4
|
+
"secondary",
|
|
5
|
+
"accent",
|
|
6
|
+
"success",
|
|
7
|
+
"warning",
|
|
8
|
+
"critical",
|
|
9
|
+
"info",
|
|
10
|
+
] as const;
|
|
11
|
+
|
|
12
|
+
export const previewPanelEmphasisValues = ["subtle", "default", "strong"] as const;
|
|
13
|
+
export const previewPanelBadgeModeValues = ["default", "quiet"] as const;
|
|
14
|
+
|
|
15
|
+
export type PreviewPanelTone = (typeof previewPanelToneValues)[number];
|
|
16
|
+
export type PreviewPanelEmphasis = (typeof previewPanelEmphasisValues)[number];
|
|
17
|
+
export type PreviewPanelBadgeMode = (typeof previewPanelBadgeModeValues)[number];
|
|
18
|
+
|
|
19
|
+
export type PreviewPanelRow = {
|
|
20
|
+
label: string;
|
|
21
|
+
value: string;
|
|
22
|
+
valueTone?: PreviewPanelTone;
|
|
23
|
+
};
|