@rafael_dias/akoma 0.3.0 → 0.7.6
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 +59 -7
- package/content/README.md +30 -0
- package/content/colors.md +56 -0
- package/content/decisions.md +45 -0
- package/content/icons.md +76 -0
- package/content/implementation.md +33 -0
- package/content/moods.md +43 -0
- package/content/philosophy.md +43 -0
- package/dist/akoma.cjs +1 -1
- package/dist/akoma.css +1 -1
- package/dist/akoma.js +606 -126
- package/dist/index.d.ts +336 -0
- package/package.json +12 -6
- package/src/styles/accent-palettes.css +194 -0
- package/src/styles/index.css +1 -0
- package/src/styles/motion.css +8 -0
- package/src/styles/tokens.css +65 -92
package/README.md
CHANGED
|
@@ -13,9 +13,12 @@ Built with **Vue 3 Composition API + TypeScript**. Styles use CSS variables (no
|
|
|
13
13
|
| **Site** | Composed, precise, trustworthy | Finance, B2B and institutional sites | `<html data-mood="site">` |
|
|
14
14
|
|
|
15
15
|
Both moods share DM Sans, an optional Lora editorial accent, components, spacing,
|
|
16
|
-
and accessible interaction states. Their palettes, radii,
|
|
16
|
+
and accessible interaction states. Their palettes, radii, and surface treatment
|
|
17
17
|
adapt to context. Dark mode works in both via `data-theme="dark"`.
|
|
18
18
|
|
|
19
|
+
Design guides ship as Markdown in the npm package and in the docs under **Guides**
|
|
20
|
+
(`/philosophy`).
|
|
21
|
+
|
|
19
22
|
## Quick start
|
|
20
23
|
|
|
21
24
|
```bash
|
|
@@ -23,12 +26,14 @@ npm install
|
|
|
23
26
|
npm run dev
|
|
24
27
|
```
|
|
25
28
|
|
|
26
|
-
Interactive docs: [http://localhost:5173](http://localhost:5173)
|
|
29
|
+
Interactive docs (local): [http://localhost:5173](http://localhost:5173)
|
|
30
|
+
|
|
31
|
+
Published docs: [https://rafaelgondi.github.io/akoma-vue/](https://rafaelgondi.github.io/akoma-vue/)
|
|
27
32
|
|
|
28
33
|
## Library usage (after publish)
|
|
29
34
|
|
|
30
35
|
```bash
|
|
31
|
-
npm install @rafael_dias/akoma
|
|
36
|
+
npm install @rafael_dias/akoma @sysvale/cuida-icons
|
|
32
37
|
```
|
|
33
38
|
|
|
34
39
|
```ts
|
|
@@ -50,18 +55,46 @@ import { AkButton, AkInput } from '@rafael_dias/akoma'
|
|
|
50
55
|
### Dark mode & mood
|
|
51
56
|
|
|
52
57
|
```ts
|
|
53
|
-
document.documentElement.dataset.theme = 'dark'
|
|
54
|
-
document.documentElement.dataset.mood = 'site'
|
|
58
|
+
document.documentElement.dataset.theme = 'dark'
|
|
59
|
+
document.documentElement.dataset.mood = 'site'
|
|
60
|
+
document.documentElement.dataset.accent = 'teal' // optional brand color
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Accent palettes (v0.5)
|
|
64
|
+
|
|
65
|
+
Eight named palettes — apps are not locked to purple. Mood controls shape; accent controls brand color.
|
|
66
|
+
|
|
67
|
+
| Palette | Use for |
|
|
68
|
+
|---------|---------|
|
|
69
|
+
| `violet` | Default App |
|
|
70
|
+
| `evergreen` | Default Site |
|
|
71
|
+
| `teal` | Productivity, study, wellness |
|
|
72
|
+
| `ocean` | Data, analytics |
|
|
73
|
+
| `amber` | Warm consumer apps |
|
|
74
|
+
| `rose` / `coral` | Lifestyle, creative |
|
|
75
|
+
| `slate` | Neutral B2B |
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { accentPaletteIds, applyAccentPalette } from '@rafael_dias/akoma'
|
|
79
|
+
|
|
80
|
+
applyAccentPalette(document.documentElement, 'teal')
|
|
55
81
|
```
|
|
56
82
|
|
|
57
|
-
## Components (v0.
|
|
83
|
+
## Components (v0.6)
|
|
58
84
|
|
|
59
85
|
| Component | Description |
|
|
60
86
|
|-----------|-------------|
|
|
87
|
+
| `AkIcon` | Cuida Icons wrapper |
|
|
61
88
|
| `AkButton` | Primary / secondary / ghost / danger |
|
|
89
|
+
| `AkIconButton` | Icon-only actions |
|
|
62
90
|
| `AkBadge` | Status pills |
|
|
63
91
|
| `AkChip` | Filter & category chips |
|
|
64
|
-
| `AkCard` |
|
|
92
|
+
| `AkCard` | Flat surface with slots |
|
|
93
|
+
| `AkList` / `AkListRow` | Grouped flat rows |
|
|
94
|
+
| `AkSectionHeader` | Uppercase section labels |
|
|
95
|
+
| `AkProgress` | Progress bars |
|
|
96
|
+
| `AkDivider` | Section separators |
|
|
97
|
+
| `AkSwitch` | Toggle settings |
|
|
65
98
|
| `AkInput` | Labeled text field |
|
|
66
99
|
| `AkTextarea` | Multi-line field |
|
|
67
100
|
| `AkEmptyState` | Empty list placeholder |
|
|
@@ -77,6 +110,24 @@ document.documentElement.dataset.mood = 'site' // sober "Site" mood
|
|
|
77
110
|
| `npm run build:docs` | Build static docs (`dist-docs/`) |
|
|
78
111
|
| `npm run preview` | Preview docs build |
|
|
79
112
|
|
|
113
|
+
## Design guides (Markdown)
|
|
114
|
+
|
|
115
|
+
Guides live in `content/` and ship with the package:
|
|
116
|
+
|
|
117
|
+
| File | Topic |
|
|
118
|
+
|------|-------|
|
|
119
|
+
| `philosophy.md` | North star, pillars, anti-patterns |
|
|
120
|
+
| `moods.md` | App vs Site |
|
|
121
|
+
| `decisions.md` | Design decision log |
|
|
122
|
+
| `implementation.md` | Migration checklist |
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
// Vite
|
|
126
|
+
import philosophy from '@rafael_dias/akoma/content/philosophy.md?raw'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
See [content/README.md](./content/README.md) for Node usage.
|
|
130
|
+
|
|
80
131
|
## Project structure
|
|
81
132
|
|
|
82
133
|
```
|
|
@@ -87,6 +138,7 @@ akoma/
|
|
|
87
138
|
│ ├── plugin.ts
|
|
88
139
|
│ └── index.ts
|
|
89
140
|
├── docs/ # Interactive playground
|
|
141
|
+
├── content/ # Markdown guides (npm + docs)
|
|
90
142
|
├── vite.config.ts # Docs app
|
|
91
143
|
└── vite.lib.config.ts # npm library build
|
|
92
144
|
```
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Akoma guides
|
|
2
|
+
|
|
3
|
+
Design philosophy and implementation guides shipped with the npm package.
|
|
4
|
+
|
|
5
|
+
| File | Description |
|
|
6
|
+
|------|-------------|
|
|
7
|
+
| [philosophy.md](./philosophy.md) | North star, pillars, anti-patterns |
|
|
8
|
+
| [moods.md](./moods.md) | App vs Site — when to use each |
|
|
9
|
+
| [colors.md](./colors.md) | Accent palettes — brand color options |
|
|
10
|
+
| [icons.md](./icons.md) | Cuida Icons usage |
|
|
11
|
+
| [decisions.md](./decisions.md) | Design decision log |
|
|
12
|
+
| [implementation.md](./implementation.md) | Checklist for migrating apps |
|
|
13
|
+
|
|
14
|
+
## Usage in apps
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
// Vite — import as raw text
|
|
18
|
+
import philosophy from '@rafael_dias/akoma/content/philosophy.md?raw'
|
|
19
|
+
|
|
20
|
+
// Node / bundlers without ?raw — read from node_modules
|
|
21
|
+
import { readFileSync } from 'node:fs'
|
|
22
|
+
import { fileURLToPath } from 'node:url'
|
|
23
|
+
|
|
24
|
+
const path = fileURLToPath(
|
|
25
|
+
import.meta.resolve('@rafael_dias/akoma/content/philosophy.md'),
|
|
26
|
+
)
|
|
27
|
+
const text = readFileSync(path, 'utf8')
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Published docs: https://rafaelgondi.github.io/akoma-vue/
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Accent palettes
|
|
2
|
+
|
|
3
|
+
Mood (App / Site) controls shape and surfaces. **Accent** controls brand color independently — so apps are not locked to violet or green.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<html data-mood="app" data-accent="teal">
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { accentPaletteIds, applyAccentPalette } from '@rafael_dias/akoma'
|
|
13
|
+
|
|
14
|
+
document.documentElement.dataset.mood = 'app'
|
|
15
|
+
document.documentElement.dataset.accent = 'teal'
|
|
16
|
+
|
|
17
|
+
// Or use the helper:
|
|
18
|
+
applyAccentPalette(document.documentElement, 'ocean')
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Defaults (no `data-accent`)
|
|
22
|
+
|
|
23
|
+
| Mood | Default accent |
|
|
24
|
+
|------|----------------|
|
|
25
|
+
| App | Violet |
|
|
26
|
+
| Site | Evergreen |
|
|
27
|
+
|
|
28
|
+
## Available palettes
|
|
29
|
+
|
|
30
|
+
| ID | Character | Good for |
|
|
31
|
+
|----|-----------|----------|
|
|
32
|
+
| `violet` | Mineral purple | Personal apps, creative tools |
|
|
33
|
+
| `evergreen` | Confident green | Finance, operations, B2B |
|
|
34
|
+
| `teal` | Calm mineral teal | Productivity, wellness, study apps |
|
|
35
|
+
| `ocean` | Trustworthy blue | Data, analytics, institutional |
|
|
36
|
+
| `amber` | Warm gold | Optimistic consumer products |
|
|
37
|
+
| `rose` | Dusty rose | Lifestyle, journaling |
|
|
38
|
+
| `coral` | Terracotta | Human, warm interfaces |
|
|
39
|
+
| `slate` | Blue-gray | Neutral enterprise UI |
|
|
40
|
+
|
|
41
|
+
All palettes include light and dark variants for `--accent`, `--accent-hover`, `--accent-soft`, `--accent-contrast`, `--bg-tinted`, and ambient orbs.
|
|
42
|
+
|
|
43
|
+
## Custom accent
|
|
44
|
+
|
|
45
|
+
Override tokens in your app — no fork required:
|
|
46
|
+
|
|
47
|
+
```css
|
|
48
|
+
:root {
|
|
49
|
+
--accent: #006d77;
|
|
50
|
+
--accent-hover: #005a62;
|
|
51
|
+
--accent-soft: #e0f2f3;
|
|
52
|
+
--accent-contrast: #ffffff;
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Prefer named palettes when possible — they stay tested across components and dark mode.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Design decisions
|
|
2
|
+
|
|
3
|
+
When in doubt, follow these choices instead of improvising.
|
|
4
|
+
|
|
5
|
+
## Typography
|
|
6
|
+
|
|
7
|
+
- **Choice:** DM Sans primary; Lora optional for editorial (`--font-editorial`)
|
|
8
|
+
- **Why:** Humanist sans, readable, quietly expressive
|
|
9
|
+
- **Rejected:** Display serifs everywhere; cold geometric sans
|
|
10
|
+
|
|
11
|
+
## Color
|
|
12
|
+
|
|
13
|
+
- **Choice:** Mood for shape; `data-accent` for brand color (8 named palettes)
|
|
14
|
+
- **Why:** Apps should not all look violet; finance can stay evergreen, study apps can use teal
|
|
15
|
+
- **Rejected:** One global accent; hardcoded purple in every App product
|
|
16
|
+
|
|
17
|
+
## Surfaces
|
|
18
|
+
|
|
19
|
+
- **Choice:** Flat layers — border + background step; shadows only where needed (nav, modals)
|
|
20
|
+
- **Why:** Asana-like calm; less visual noise in data-heavy screens
|
|
21
|
+
- **Rejected:** Floating cards with heavy blur/shadow stacks
|
|
22
|
+
|
|
23
|
+
## Radius
|
|
24
|
+
|
|
25
|
+
- **Choice:** App generous but not bubbly; Site controlled 8–16px
|
|
26
|
+
- **Why:** Shape signals mood without changing APIs
|
|
27
|
+
- **Rejected:** Identical radius everywhere; sharp 0px enterprise corners
|
|
28
|
+
|
|
29
|
+
## Motion
|
|
30
|
+
|
|
31
|
+
- **Choice:** Short transitions; reveal on entry; subtle tap feedback
|
|
32
|
+
- **Why:** Tactile without theatre; always respect `prefers-reduced-motion`
|
|
33
|
+
- **Rejected:** Bouncy motion on every element
|
|
34
|
+
|
|
35
|
+
## Forms
|
|
36
|
+
|
|
37
|
+
- **Choice:** Sentence-case labels; soft fills in App; bordered fields in Site
|
|
38
|
+
- **Why:** Friendly vs precise contexts
|
|
39
|
+
- **Rejected:** Uppercase micro-labels; inputs without focus rings
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
- **Choice:** Vue 3 + TS; props in English; CSS variables; no Tailwind in the library
|
|
44
|
+
- **Why:** Portable, themeable, npm-friendly
|
|
45
|
+
- **Rejected:** Utility-class coupling in components
|
package/content/icons.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Icons
|
|
2
|
+
|
|
3
|
+
Akoma uses **[Cuida Icons](https://github.com/Sysvale/cuida-icons)** (`@sysvale/cuida-icons`) — the same open-source set from the Cuida design system.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @rafael_dias/akoma @sysvale/cuida-icons
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`@sysvale/cuida-icons` is a **peer dependency** of Akoma.
|
|
12
|
+
|
|
13
|
+
### Vite alias (recommended)
|
|
14
|
+
|
|
15
|
+
The Cuida Icons npm package entry is misconfigured. In your `vite.config.ts`:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import path from 'node:path'
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
resolve: {
|
|
22
|
+
alias: {
|
|
23
|
+
'@sysvale/cuida-icons': path.resolve(
|
|
24
|
+
__dirname,
|
|
25
|
+
'node_modules/@sysvale/cuida-icons/dist/index.js',
|
|
26
|
+
),
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Akoma docs and library build already use this alias.
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { AkIcon, AkIconButton } from '@rafael_dias/akoma'
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<template>
|
|
42
|
+
<AkIcon name="home-outline" :size="20" />
|
|
43
|
+
|
|
44
|
+
<AkIconButton label="Delete" icon="trash-outline" variant="danger" />
|
|
45
|
+
|
|
46
|
+
<AkButton>
|
|
47
|
+
<template #icon>
|
|
48
|
+
<AkIcon name="plus-outline" :size="18" />
|
|
49
|
+
</template>
|
|
50
|
+
Add item
|
|
51
|
+
</AkButton>
|
|
52
|
+
</template>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Naming
|
|
56
|
+
|
|
57
|
+
Icon names match Cuida Icons exports: `kebab-case` with suffix, e.g. `edit-outline`, `check-circle-outline`, `open-book-outline`.
|
|
58
|
+
|
|
59
|
+
Browse the full set: [cuida.sysvale.com — Iconografia](https://cuida.sysvale.com/foundation/iconografia.html) or the [GitHub repo](https://github.com/Sysvale/cuida-icons).
|
|
60
|
+
|
|
61
|
+
## TypeScript
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import type { CuidaIconName } from '@rafael_dias/akoma'
|
|
65
|
+
|
|
66
|
+
const icon: CuidaIconName = 'calendar-outline'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Accessibility
|
|
70
|
+
|
|
71
|
+
- Decorative icons inside labelled buttons: omit `label` on `AkIcon` (uses `aria-hidden`)
|
|
72
|
+
- Standalone icons: pass `label` for screen readers
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<AkIcon name="warning-outline" label="Warning" />
|
|
76
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Implementation checklist
|
|
2
|
+
|
|
3
|
+
Use when migrating an app to Akoma or briefing an agent.
|
|
4
|
+
|
|
5
|
+
1. Install `@rafael_dias/akoma`, `@sysvale/cuida-icons`, and import `@rafael_dias/akoma/style.css` once at entry
|
|
6
|
+
2. Pick mood at root: App for products, Site for finance/B2B
|
|
7
|
+
3. Map buttons, inputs, cards, lists, badges, chips to Akoma components
|
|
8
|
+
4. Replace loose hex/radius/shadow with tokens (`--bg`, `--accent`, `--space-*`, etc.)
|
|
9
|
+
5. Use `AkEmptyState` and `AkShimmer` instead of one-off empty/loading UI
|
|
10
|
+
6. Use `.numeric` for financial figures (tabular nums)
|
|
11
|
+
7. Map domain colors to `--cat-1` … `--cat-6` in app `:root` if needed
|
|
12
|
+
8. Do **not** refactor stores, routes, or API during UI-only work
|
|
13
|
+
|
|
14
|
+
## Setup example (finance app)
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
document.documentElement.dataset.mood = 'site'
|
|
18
|
+
|
|
19
|
+
import { createApp } from 'vue'
|
|
20
|
+
import { Akoma } from '@rafael_dias/akoma'
|
|
21
|
+
import '@rafael_dias/akoma/style.css'
|
|
22
|
+
|
|
23
|
+
createApp(App).use(Akoma).mount('#app')
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Reading guides in your app
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import philosophy from '@rafael_dias/akoma/content/philosophy.md?raw'
|
|
30
|
+
import checklist from '@rafael_dias/akoma/content/implementation.md?raw'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Use in dev panels, onboarding, or agent prompts — versioned with the package.
|
package/content/moods.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# App vs Site
|
|
2
|
+
|
|
3
|
+
Same components. Different tokens. Pick once per product.
|
|
4
|
+
|
|
5
|
+
## App (default)
|
|
6
|
+
|
|
7
|
+
- **Activate:** no attribute needed
|
|
8
|
+
- **Use when:** daily-use products, personal tools, creative apps, mobile-first PWAs
|
|
9
|
+
- **Character:** tactile, optimistic, relaxed
|
|
10
|
+
- **Accent:** soft violet on warm stone
|
|
11
|
+
- **Shape:** pill buttons, round chips, 16px cards
|
|
12
|
+
- **Surfaces:** soft fills, minimal shadow, light borders on cards
|
|
13
|
+
|
|
14
|
+
## Site
|
|
15
|
+
|
|
16
|
+
- **Activate:** `<html data-mood="site">`
|
|
17
|
+
- **Use when:** finance, operations, dashboards, institutional marketing
|
|
18
|
+
- **Character:** composed, precise, trustworthy
|
|
19
|
+
- **Accent:** evergreen on mineral white
|
|
20
|
+
- **Shape:** 8–12px radii, structured controls
|
|
21
|
+
- **Surfaces:** white cards with hairline borders, almost no shadow
|
|
22
|
+
|
|
23
|
+
## Dark mode
|
|
24
|
+
|
|
25
|
+
Both moods support warm dark themes:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
document.documentElement.dataset.theme = 'dark'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Never use cold pure black — backgrounds stay mineral or forest-toned.
|
|
32
|
+
|
|
33
|
+
## Accent palettes
|
|
34
|
+
|
|
35
|
+
Brand color is independent from mood. Without `data-accent`, App defaults to **violet** and Site to **evergreen**.
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<html data-mood="app" data-accent="teal">
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Available: `violet`, `evergreen`, `teal`, `ocean`, `amber`, `rose`, `coral`, `slate`.
|
|
42
|
+
|
|
43
|
+
See [colors.md](./colors.md) for the full guide.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Philosophy
|
|
2
|
+
|
|
3
|
+
## North star
|
|
4
|
+
|
|
5
|
+
Software for real life should feel **clear enough to trust** and **warm enough to return to**. Akoma helps teams ship both — without choosing between friendly and professional.
|
|
6
|
+
|
|
7
|
+
## Pillars
|
|
8
|
+
|
|
9
|
+
### Human first
|
|
10
|
+
|
|
11
|
+
Interfaces should feel made for people, not demos. Calm, proximity, clarity, and trust come before visual novelty.
|
|
12
|
+
|
|
13
|
+
### Rhythm over decoration
|
|
14
|
+
|
|
15
|
+
Hierarchy is built with spacing, type scale, and surface tone — not heavy borders, dense grids, or loud contrast for its own sake.
|
|
16
|
+
|
|
17
|
+
### Warm, never cold
|
|
18
|
+
|
|
19
|
+
Neutrals stay mineral and natural. Accents are botanical, not neon. Even serious products should feel approachable, not clinical.
|
|
20
|
+
|
|
21
|
+
### Flat before float
|
|
22
|
+
|
|
23
|
+
Surfaces sit close to the page. Prefer subtle borders and background steps over stacked shadows. Elevation is rare and intentional — closer to Asana than to glassy SaaS dashboards.
|
|
24
|
+
|
|
25
|
+
### One family, two expressions
|
|
26
|
+
|
|
27
|
+
App and Site moods share components and anatomy. Only tokens change — teams do not maintain two design systems.
|
|
28
|
+
|
|
29
|
+
## What we avoid
|
|
30
|
+
|
|
31
|
+
- Engineering-first aesthetics (Linear, Vercel, Cursor, OpenAI-style cold UI)
|
|
32
|
+
- Heavy drop shadows on every card and button
|
|
33
|
+
- Hard borders as the only way to separate content
|
|
34
|
+
- Decorative motion without purpose
|
|
35
|
+
- Hardcoded hex when a token exists
|
|
36
|
+
- Childish UI in finance and operations contexts
|
|
37
|
+
- Refactoring business logic during visual migrations
|
|
38
|
+
|
|
39
|
+
## References (principles, not pixels)
|
|
40
|
+
|
|
41
|
+
**Warm & human:** Headspace, old Dovetail, Canva, Mailchimp, Zendesk Garden
|
|
42
|
+
|
|
43
|
+
**Trust & clarity:** Asana, old Help Scout, finance-friendly B2B surfaces
|
package/dist/akoma.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};let n=require("vue");var r=[`type`,`disabled`,`aria-busy`],i={key:0,class:`ak-button__spinner`,"aria-hidden":`true`},a={key:1,class:`ak-button__icon`},o={class:`ak-button__label`},s=(0,n.defineComponent)({__name:`AkButton`,props:{variant:{default:`primary`},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:`button`},block:{type:Boolean,default:!1}},setup(e){return(t,s)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{class:(0,n.normalizeClass)([`ak-button tap-scale`,[`ak-button--${e.variant}`,`ak-button--${e.size}`,{"ak-button--block":e.block,"ak-button--loading":e.loading}]]),type:e.type,disabled:e.disabled||e.loading,"aria-busy":e.loading||void 0},[e.loading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,i)):(0,n.createCommentVNode)(``,!0),t.$slots.icon&&!e.loading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,a,[(0,n.renderSlot)(t.$slots,`icon`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,o,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)])],10,r))}}),c=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},l=c(s,[[`__scopeId`,`data-v-78a39ccd`]]),u=c((0,n.defineComponent)({__name:`AkBadge`,props:{variant:{default:`neutral`},label:{}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{class:(0,n.normalizeClass)([`ak-badge`,`ak-badge--${e.variant}`])},[(0,n.renderSlot)(t.$slots,`default`,{},()=>[(0,n.createTextVNode)((0,n.toDisplayString)(e.label),1)],!0)],2))}}),[[`__scopeId`,`data-v-02933f09`]]),d=[`disabled`,`aria-pressed`],f=c((0,n.defineComponent)({__name:`AkChip`,props:{active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},color:{}},emits:[`click`],setup(e,{emit:t}){let r=t;return(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{type:`button`,class:(0,n.normalizeClass)([`ak-chip tap-scale`,{"ak-chip--active":e.active}]),style:(0,n.normalizeStyle)(e.active&&e.color?{"--ak-chip-active-bg":e.color}:void 0),disabled:e.disabled,"aria-pressed":e.active,onClick:i[0]||=e=>r(`click`,e)},[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)],14,d))}}),[[`__scopeId`,`data-v-c782362c`]]),p={key:0,class:`ak-card__media`},m={key:1,class:`ak-card__header`},h={key:2,class:`ak-card__body`},g={key:3,class:`ak-card__footer`},_=c((0,n.defineComponent)({__name:`AkCard`,props:{interactive:{type:Boolean,default:!1},padding:{default:`md`}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`article`,{class:(0,n.normalizeClass)([`ak-card`,[`ak-card--pad-${e.padding}`,{"ak-card--interactive tap-scale":e.interactive}]])},[t.$slots.media?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,p,[(0,n.renderSlot)(t.$slots,`media`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.header?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,m,[(0,n.renderSlot)(t.$slots,`header`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.default?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,h,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.footer?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,g,[(0,n.renderSlot)(t.$slots,`footer`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-0eb2f676`]]),v={key:0,class:`ak-field__label`},y={key:0,class:`ak-field__required`,"aria-hidden":`true`},b=[`id`,`type`,`value`,`placeholder`,`disabled`,`required`,`name`,`autocomplete`,`aria-invalid`,`aria-describedby`],x=[`id`],S=c((0,n.defineComponent)({__name:`AkInput`,props:{modelValue:{default:``},label:{},placeholder:{},hint:{},error:{},type:{default:`text`},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},size:{default:`md`},autocomplete:{},name:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.useId)(),o=(0,n.computed)(()=>`ak-input-${a}`),s=(0,n.computed)(()=>r.hint||r.error?`ak-input-hint-${a}`:void 0);function c(e){let t=e.target;i(`update:modelValue`,t.value)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`label`,{class:(0,n.normalizeClass)([`ak-field`,{"ak-field--disabled":e.disabled,"ak-field--error":!!e.error}])},[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,v,[(0,n.createTextVNode)((0,n.toDisplayString)(e.label)+` `,1),e.required?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,y,`*`)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`input`,{id:o.value,class:(0,n.normalizeClass)([`ak-field__control`,`ak-field__control--${e.size}`]),type:e.type,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,required:e.required,name:e.name,autocomplete:e.autocomplete,"aria-invalid":!!e.error||void 0,"aria-describedby":s.value,onInput:c},null,42,b),e.error||e.hint?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:1,id:s.value,class:`ak-field__hint`},(0,n.toDisplayString)(e.error||e.hint),9,x)):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-60d7d2d0`]]),C={key:0,class:`ak-field__label`},w={key:0,class:`ak-field__required`,"aria-hidden":`true`},T=[`id`,`value`,`placeholder`,`disabled`,`required`,`name`,`rows`,`aria-invalid`,`aria-describedby`],E=[`id`],D=c((0,n.defineComponent)({__name:`AkTextarea`,props:{modelValue:{default:``},label:{},placeholder:{},hint:{},error:{},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},rows:{default:4},name:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.useId)(),o=(0,n.computed)(()=>`ak-textarea-${a}`),s=(0,n.computed)(()=>r.hint||r.error?`ak-textarea-hint-${a}`:void 0);function c(e){let t=e.target;i(`update:modelValue`,t.value)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`label`,{class:(0,n.normalizeClass)([`ak-field`,{"ak-field--disabled":e.disabled,"ak-field--error":!!e.error}])},[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,C,[(0,n.createTextVNode)((0,n.toDisplayString)(e.label)+` `,1),e.required?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,w,`*`)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`textarea`,{id:o.value,class:`ak-field__control`,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,required:e.required,name:e.name,rows:e.rows,"aria-invalid":!!e.error||void 0,"aria-describedby":s.value,onInput:c},null,40,T),e.error||e.hint?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:1,id:s.value,class:`ak-field__hint`},(0,n.toDisplayString)(e.error||e.hint),9,E)):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-d34da198`]]),O={class:`ak-empty`},k={class:`ak-empty__icon`,"aria-hidden":`true`},A={key:0,class:`ak-empty__glyph`},j={class:`ak-empty__title`},M={key:0,class:`ak-empty__description`},N={key:1,class:`ak-empty__action`},P=c((0,n.defineComponent)({__name:`AkEmptyState`,props:{title:{},description:{}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,O,[(0,n.createElementVNode)(`div`,k,[r[0]||=(0,n.createElementVNode)(`span`,{class:`ak-empty__ring ak-empty__ring--outer`},null,-1),r[1]||=(0,n.createElementVNode)(`span`,{class:`ak-empty__ring ak-empty__ring--inner`},null,-1),t.$slots.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,A,[(0,n.renderSlot)(t.$slots,`icon`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),(0,n.createElementVNode)(`h3`,j,(0,n.toDisplayString)(e.title),1),e.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,M,(0,n.toDisplayString)(e.description),1)):(0,n.createCommentVNode)(``,!0),t.$slots.action?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,N,[(0,n.renderSlot)(t.$slots,`action`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]))}}),[[`__scopeId`,`data-v-b8b16929`]]),F=c((0,n.defineComponent)({__name:`AkShimmer`,props:{width:{default:`100%`},height:{default:`16px`},radius:{default:`md`}},setup(e){function t(e){return e===`sm`||e===`md`||e===`lg`||e===`full`?`var(--radius-${e})`:e}return(r,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:`ak-shimmer`,style:(0,n.normalizeStyle)({width:e.width,height:e.height,borderRadius:t(e.radius)}),"aria-hidden":`true`},null,4))}}),[[`__scopeId`,`data-v-de7bd16d`]]),I=c((0,n.defineComponent)({__name:`AkAmbientBg`,props:{contained:{type:Boolean,default:!1}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`ambient`,{"ambient--contained":e.contained}]),"aria-hidden":`true`},[...r[0]||=[(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--1`},null,-1),(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--2`},null,-1),(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--3`},null,-1)]],2))}}),[[`__scopeId`,`data-v-b34dece3`]]),L=t({AkAmbientBg:()=>I,AkBadge:()=>u,AkButton:()=>l,AkCard:()=>_,AkChip:()=>f,AkEmptyState:()=>P,AkInput:()=>S,AkShimmer:()=>F,AkTextarea:()=>D}),R={install(e,t={}){let n=t.prefix??``;for(let[t,r]of Object.entries(L))e.component(`${n}${t}`,r)}};exports.AkAmbientBg=I,exports.AkBadge=u,exports.AkButton=l,exports.AkCard=_,exports.AkChip=f,exports.AkEmptyState=P,exports.AkInput=S,exports.AkShimmer=F,exports.AkTextarea=D,exports.Akoma=R;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};let n=require("vue"),r=require("@sysvale/cuida-icons");var i=[`type`,`disabled`,`aria-busy`],a={key:0,class:`ak-button__spinner`,"aria-hidden":`true`},o={key:1,class:`ak-button__icon`},s={class:`ak-button__label`},c=(0,n.defineComponent)({__name:`AkButton`,props:{variant:{default:`primary`},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:`button`},block:{type:Boolean,default:!1}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{class:(0,n.normalizeClass)([`ak-button tap-scale`,[`ak-button--${e.variant}`,`ak-button--${e.size}`,{"ak-button--block":e.block,"ak-button--loading":e.loading}]]),type:e.type,disabled:e.disabled||e.loading,"aria-busy":e.loading||void 0},[e.loading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,a)):(0,n.createCommentVNode)(``,!0),t.$slots.icon&&!e.loading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,o,[(0,n.renderSlot)(t.$slots,`icon`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,s,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)])],10,i))}}),l=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},u=l(c,[[`__scopeId`,`data-v-7786dae9`]]),d=l((0,n.defineComponent)({__name:`AkBadge`,props:{variant:{default:`neutral`},label:{}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{class:(0,n.normalizeClass)([`ak-badge`,`ak-badge--${e.variant}`])},[(0,n.renderSlot)(t.$slots,`default`,{},()=>[(0,n.createTextVNode)((0,n.toDisplayString)(e.label),1)],!0)],2))}}),[[`__scopeId`,`data-v-02933f09`]]),f=[`disabled`,`aria-pressed`],p=l((0,n.defineComponent)({__name:`AkChip`,props:{active:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},color:{}},emits:[`click`],setup(e,{emit:t}){let r=t;return(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{type:`button`,class:(0,n.normalizeClass)([`ak-chip tap-scale`,{"ak-chip--active":e.active}]),style:(0,n.normalizeStyle)(e.active&&e.color?{"--ak-chip-active-bg":e.color}:void 0),disabled:e.disabled,"aria-pressed":e.active,onClick:i[0]||=e=>r(`click`,e)},[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)],14,f))}}),[[`__scopeId`,`data-v-c782362c`]]),m={key:0,class:`ak-card__media`},ee={key:1,class:`ak-card__header`},te={key:2,class:`ak-card__body`},ne={key:3,class:`ak-card__footer`},h=l((0,n.defineComponent)({__name:`AkCard`,props:{interactive:{type:Boolean,default:!1},padding:{default:`md`}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`article`,{class:(0,n.normalizeClass)([`ak-card`,[`ak-card--pad-${e.padding}`,{"ak-card--interactive":e.interactive}]])},[t.$slots.media?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,m,[(0,n.renderSlot)(t.$slots,`media`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.header?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,ee,[(0,n.renderSlot)(t.$slots,`header`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.default?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,te,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),t.$slots.footer?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,ne,[(0,n.renderSlot)(t.$slots,`footer`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-73ac6197`]]),g={key:0,class:`ak-field__label`},_={key:0,class:`ak-field__required`,"aria-hidden":`true`},v=[`id`,`type`,`value`,`placeholder`,`disabled`,`required`,`name`,`autocomplete`,`aria-invalid`,`aria-describedby`],y=[`id`],b=l((0,n.defineComponent)({__name:`AkInput`,props:{modelValue:{default:``},label:{},placeholder:{},hint:{},error:{},type:{default:`text`},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},size:{default:`md`},autocomplete:{},name:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.useId)(),o=(0,n.computed)(()=>`ak-input-${a}`),s=(0,n.computed)(()=>r.hint||r.error?`ak-input-hint-${a}`:void 0);function c(e){let t=e.target;i(`update:modelValue`,t.value)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`label`,{class:(0,n.normalizeClass)([`ak-field`,{"ak-field--disabled":e.disabled,"ak-field--error":!!e.error}])},[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,g,[(0,n.createTextVNode)((0,n.toDisplayString)(e.label)+` `,1),e.required?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,_,`*`)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`input`,{id:o.value,class:(0,n.normalizeClass)([`ak-field__control`,`ak-field__control--${e.size}`]),type:e.type,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,required:e.required,name:e.name,autocomplete:e.autocomplete,"aria-invalid":!!e.error||void 0,"aria-describedby":s.value,onInput:c},null,42,v),e.error||e.hint?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:1,id:s.value,class:`ak-field__hint`},(0,n.toDisplayString)(e.error||e.hint),9,y)):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-60d7d2d0`]]),x={key:0,class:`ak-field__label`},re={key:0,class:`ak-field__required`,"aria-hidden":`true`},ie=[`id`,`value`,`placeholder`,`disabled`,`required`,`name`,`rows`,`aria-invalid`,`aria-describedby`],ae=[`id`],S=l((0,n.defineComponent)({__name:`AkTextarea`,props:{modelValue:{default:``},label:{},placeholder:{},hint:{},error:{},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},rows:{default:4},name:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.useId)(),o=(0,n.computed)(()=>`ak-textarea-${a}`),s=(0,n.computed)(()=>r.hint||r.error?`ak-textarea-hint-${a}`:void 0);function c(e){let t=e.target;i(`update:modelValue`,t.value)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`label`,{class:(0,n.normalizeClass)([`ak-field`,{"ak-field--disabled":e.disabled,"ak-field--error":!!e.error}])},[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,x,[(0,n.createTextVNode)((0,n.toDisplayString)(e.label)+` `,1),e.required?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,re,`*`)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`textarea`,{id:o.value,class:`ak-field__control`,value:e.modelValue,placeholder:e.placeholder,disabled:e.disabled,required:e.required,name:e.name,rows:e.rows,"aria-invalid":!!e.error||void 0,"aria-describedby":s.value,onInput:c},null,40,ie),e.error||e.hint?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{key:1,id:s.value,class:`ak-field__hint`},(0,n.toDisplayString)(e.error||e.hint),9,ae)):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-d34da198`]]),oe={class:`ak-empty`},se={class:`ak-empty__icon`,"aria-hidden":`true`},ce={key:0,class:`ak-empty__glyph`},le={class:`ak-empty__title`},ue={key:0,class:`ak-empty__description`},de={key:1,class:`ak-empty__action`},C=l((0,n.defineComponent)({__name:`AkEmptyState`,props:{title:{},description:{}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,oe,[(0,n.createElementVNode)(`div`,se,[r[0]||=(0,n.createElementVNode)(`span`,{class:`ak-empty__ring ak-empty__ring--outer`},null,-1),r[1]||=(0,n.createElementVNode)(`span`,{class:`ak-empty__ring ak-empty__ring--inner`},null,-1),t.$slots.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ce,[(0,n.renderSlot)(t.$slots,`icon`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),(0,n.createElementVNode)(`h3`,le,(0,n.toDisplayString)(e.title),1),e.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,ue,(0,n.toDisplayString)(e.description),1)):(0,n.createCommentVNode)(``,!0),t.$slots.action?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,de,[(0,n.renderSlot)(t.$slots,`action`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]))}}),[[`__scopeId`,`data-v-ab81ece0`]]),w=l((0,n.defineComponent)({__name:`AkShimmer`,props:{width:{default:`100%`},height:{default:`16px`},radius:{default:`md`}},setup(e){function t(e){return e===`sm`||e===`md`||e===`lg`||e===`full`?`var(--radius-${e})`:e}return(r,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:`ak-shimmer`,style:(0,n.normalizeStyle)({width:e.width,height:e.height,borderRadius:t(e.radius)}),"aria-hidden":`true`},null,4))}}),[[`__scopeId`,`data-v-de7bd16d`]]),T=l((0,n.defineComponent)({__name:`AkAmbientBg`,props:{contained:{type:Boolean,default:!1}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`ambient`,{"ambient--contained":e.contained}]),"aria-hidden":`true`},[...r[0]||=[(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--1`},null,-1),(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--2`},null,-1),(0,n.createElementVNode)(`span`,{class:`ambient__orb ambient__orb--3`},null,-1)]],2))}}),[[`__scopeId`,`data-v-b34dece3`]]),E=new Map(r.completeIconSet.map(e=>[e.name,D(e.data)]));function D(e){let t=e.match(/<path\b[^>]*\/>/g);return t?.length?`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">${t.map(e=>e.replace(/\sfill="[^"]*"/g,``).replace(/\s(fill-rule|clip-rule)="[^"]*"/g,``)).join(``)}</svg>`:e}function O(e){return E.get(e)??``}var k=[`role`,`aria-label`,`aria-hidden`,`innerHTML`],A=l((0,n.defineComponent)({__name:`AkIcon`,props:{name:{},size:{default:20},label:{}},setup(e){let t=e,r=(0,n.computed)(()=>typeof t.size==`number`?`${t.size}px`:t.size),i=(0,n.computed)(()=>O(t.name));return(t,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`span`,{class:(0,n.normalizeClass)([`ak-icon`,{"ak-icon--missing":!i.value}]),style:(0,n.normalizeStyle)({width:r.value,height:r.value}),role:e.label?`img`:void 0,"aria-label":e.label,"aria-hidden":!e.label||void 0,innerHTML:i.value},null,14,k))}}),[[`__scopeId`,`data-v-083f6c55`]]),j=[`aria-orientation`],M={key:0,class:`ak-divider__label`},N=l((0,n.defineComponent)({__name:`AkDivider`,props:{spacing:{default:`md`},label:{},vertical:{type:Boolean,default:!1}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`ak-divider`,[e.vertical?`ak-divider--vertical`:`ak-divider--horizontal`,`ak-divider--spacing-${e.spacing}`]]),role:`separator`,"aria-orientation":e.vertical?`vertical`:`horizontal`},[e.label&&!e.vertical?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,M,(0,n.toDisplayString)(e.label),1)):(0,n.createCommentVNode)(``,!0)],10,j))}}),[[`__scopeId`,`data-v-17bc7513`]]),P={key:0,class:`ak-progress__meta`},F={key:0,class:`ak-progress__label`},I={key:1,class:`ak-progress__value numeric`},L=[`aria-valuenow`,`aria-valuemax`,`aria-label`],R=l((0,n.defineComponent)({__name:`AkProgress`,props:{value:{default:0},max:{default:100},size:{default:`md`},color:{},label:{},showValue:{type:Boolean,default:!1}},setup(e){let t=e,r=(0,n.computed)(()=>t.max<=0?0:Math.min(100,Math.max(0,t.value/t.max*100))),i=(0,n.computed)(()=>({width:`${r.value}%`,...t.color?{background:t.color}:{}}));return(t,a)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:(0,n.normalizeClass)([`ak-progress`,`ak-progress--${e.size}`])},[e.label||e.showValue?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,P,[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,F,(0,n.toDisplayString)(e.label),1)):(0,n.createCommentVNode)(``,!0),e.showValue?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,I,(0,n.toDisplayString)(Math.round(r.value))+`%`,1)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`div`,{class:`ak-progress__track`,role:`progressbar`,"aria-valuenow":e.value,"aria-valuemin":0,"aria-valuemax":e.max,"aria-label":e.label},[(0,n.createElementVNode)(`span`,{class:`ak-progress__fill`,style:(0,n.normalizeStyle)(i.value)},null,4)],8,L)],2))}}),[[`__scopeId`,`data-v-ed0a6fcd`]]),z={class:`ak-section-header`},B={class:`ak-section-header__title`},V={key:0,class:`ak-section-header__action`},H=l((0,n.defineComponent)({__name:`AkSectionHeader`,props:{title:{}},setup(e){return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`header`,z,[(0,n.createElementVNode)(`h2`,B,[(0,n.renderSlot)(t.$slots,`default`,{},()=>[(0,n.createTextVNode)((0,n.toDisplayString)(e.title),1)],!0)]),t.$slots.action?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,V,[(0,n.renderSlot)(t.$slots,`action`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]))}}),[[`__scopeId`,`data-v-65fca8d1`]]),fe={class:`ak-list`},U=l((0,n.defineComponent)({__name:`AkList`,setup(e){return(0,n.provide)(`ak-list`,!0),(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`ul`,fe,[(0,n.renderSlot)(e.$slots,`default`,{},void 0,!0)]))}}),[[`__scopeId`,`data-v-708bdd68`]]),pe=[`disabled`],me={key:0,class:`ak-list-row__leading`},he={class:`ak-list-row__content`},ge={class:`ak-list-row__title`},_e={key:0,class:`ak-list-row__subtitle`},ve={key:1,class:`ak-list-row__trailing`},ye={key:0,class:`ak-list-row__leading`},be={class:`ak-list-row__content`},xe={class:`ak-list-row__title`},Se={key:0,class:`ak-list-row__subtitle`},Ce={key:1,class:`ak-list-row__trailing`},we=[`disabled`],Te={key:0,class:`ak-list-row__leading`},Ee={class:`ak-list-row__content`},De={class:`ak-list-row__title`},Oe={key:0,class:`ak-list-row__subtitle`},ke={key:1,class:`ak-list-row__trailing`},Ae={key:0,class:`ak-list-row__leading`},je={class:`ak-list-row__content`},Me={class:`ak-list-row__title`},Ne={key:0,class:`ak-list-row__subtitle`},Pe={key:1,class:`ak-list-row__trailing`},W=l((0,n.defineComponent)({__name:`AkListRow`,props:{interactive:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},padding:{default:`md`},divider:{type:Boolean,default:!0}},setup(e){let t=e,r=(0,n.inject)(`ak-list`,!1),i=(0,n.computed)(()=>[`ak-list-row`,`ak-list-row--pad-${t.padding}`,{"ak-list-row--interactive":t.interactive,"ak-list-row--disabled":t.disabled}]);return(t,a)=>(0,n.unref)(r)?((0,n.openBlock)(),(0,n.createElementBlock)(`li`,{key:0,class:(0,n.normalizeClass)([`ak-list-row-item`,{"ak-list-row-item--divider":e.divider}])},[e.interactive?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:(0,n.normalizeClass)(i.value),disabled:e.disabled},[t.$slots.leading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,me,[(0,n.renderSlot)(t.$slots,`leading`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,he,[(0,n.createElementVNode)(`span`,ge,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)]),t.$slots.subtitle?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,_e,[(0,n.renderSlot)(t.$slots,`subtitle`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),t.$slots.trailing?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ve,[(0,n.renderSlot)(t.$slots,`trailing`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],10,pe)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:1,class:(0,n.normalizeClass)(i.value)},[t.$slots.leading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ye,[(0,n.renderSlot)(t.$slots,`leading`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,be,[(0,n.createElementVNode)(`span`,xe,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)]),t.$slots.subtitle?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Se,[(0,n.renderSlot)(t.$slots,`subtitle`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),t.$slots.trailing?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Ce,[(0,n.renderSlot)(t.$slots,`trailing`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],2))],2)):e.interactive?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:1,type:`button`,class:(0,n.normalizeClass)(i.value),disabled:e.disabled},[t.$slots.leading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Te,[(0,n.renderSlot)(t.$slots,`leading`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,Ee,[(0,n.createElementVNode)(`span`,De,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)]),t.$slots.subtitle?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Oe,[(0,n.renderSlot)(t.$slots,`subtitle`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),t.$slots.trailing?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ke,[(0,n.renderSlot)(t.$slots,`trailing`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],10,we)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:2,class:(0,n.normalizeClass)(i.value)},[t.$slots.leading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Ae,[(0,n.renderSlot)(t.$slots,`leading`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,je,[(0,n.createElementVNode)(`span`,Me,[(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0)]),t.$slots.subtitle?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Ne,[(0,n.renderSlot)(t.$slots,`subtitle`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)]),t.$slots.trailing?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Pe,[(0,n.renderSlot)(t.$slots,`trailing`,{},void 0,!0)])):(0,n.createCommentVNode)(``,!0)],2))}}),[[`__scopeId`,`data-v-9f8ea96f`]]),Fe=[`type`,`disabled`,`aria-label`,`aria-busy`],Ie={key:0,class:`ak-icon-button__spinner`,"aria-hidden":`true`},Le={key:1,class:`ak-icon-button__icon`},G=l((0,n.defineComponent)({__name:`AkIconButton`,props:{variant:{default:`ghost`},size:{default:`md`},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:`button`},label:{},icon:{}},setup(e){let t=e,r=(0,n.computed)(()=>({sm:18,md:20,lg:22})[t.size]);return(t,i)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{class:(0,n.normalizeClass)([`ak-icon-button tap-scale`,[`ak-icon-button--${e.variant}`,`ak-icon-button--${e.size}`,{"ak-icon-button--loading":e.loading}]]),type:e.type,disabled:e.disabled||e.loading,"aria-label":e.label,"aria-busy":e.loading||void 0},[e.loading?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Ie)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Le,[e.icon?((0,n.openBlock)(),(0,n.createBlock)(A,{key:0,name:e.icon,size:r.value},null,8,[`name`,`size`])):(0,n.renderSlot)(t.$slots,`default`,{},void 0,!0,1)]))],10,Fe))}}),[[`__scopeId`,`data-v-b4833b10`]]),Re={key:0,class:`ak-switch__copy`},ze={key:0,class:`ak-switch__label`},Be={key:1,class:`ak-switch__description`},Ve={class:`ak-switch__control`},He=[`id`,`checked`,`disabled`],K=l((0,n.defineComponent)({__name:`AkSwitch`,props:{modelValue:{type:Boolean,default:!1},label:{},description:{},disabled:{type:Boolean,default:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=t,i=(0,n.useId)(),a=(0,n.computed)(()=>`ak-switch-${i}`);function o(e){let t=e.target;r(`update:modelValue`,t.checked)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`label`,{class:(0,n.normalizeClass)([`ak-switch`,{"ak-switch--disabled":e.disabled,"ak-switch--on":e.modelValue}])},[e.label||e.description?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Re,[e.label?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,ze,(0,n.toDisplayString)(e.label),1)):(0,n.createCommentVNode)(``,!0),e.description?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,Be,(0,n.toDisplayString)(e.description),1)):(0,n.createCommentVNode)(``,!0)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,Ve,[(0,n.createElementVNode)(`input`,{id:a.value,class:`ak-switch__input`,type:`checkbox`,role:`switch`,checked:e.modelValue,disabled:e.disabled,onChange:o},null,40,He),r[0]||=(0,n.createElementVNode)(`span`,{class:`ak-switch__track`,"aria-hidden":`true`},[(0,n.createElementVNode)(`span`,{class:`ak-switch__thumb`})],-1)])],2))}}),[[`__scopeId`,`data-v-d49f3b2e`]]),q=Symbol(`ak-tab-bar`),Ue={class:`ak-tab-bar`,"aria-label":`Primary`},J=l((0,n.defineComponent)({__name:`AkTabBar`,props:{modelValue:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,a=(0,n.ref)(null),o=(0,n.reactive)(new Map),s=(0,n.ref)({x:0,y:0,w:0,h:0,ready:!1});function c(){let e=a.value,t=o.get(r.modelValue);if(!e||!t){s.value.ready=!1;return}let n=e.getBoundingClientRect(),i=(t.querySelector(`.ak-tab-bar__icon`)??t).getBoundingClientRect();s.value={x:i.left-n.left,y:i.top-n.top,w:i.width,h:i.height,ready:!0}}function l(e,t){o.set(e,t),(0,n.nextTick)(c)}function u(e){o.delete(e),(0,n.nextTick)(c)}let d;return(0,n.onMounted)(()=>{(0,n.nextTick)(c),d=new ResizeObserver(()=>c()),a.value&&d.observe(a.value)}),(0,n.onUnmounted)(()=>d?.disconnect()),(0,n.watch)(()=>r.modelValue,()=>void(0,n.nextTick)(c)),(0,n.provide)(q,{active:(0,n.toRef)(r,`modelValue`),select:e=>i(`update:modelValue`,e),register:l,unregister:u}),(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`nav`,Ue,[(0,n.createElementVNode)(`div`,{ref_key:`trackRef`,ref:a,class:`ak-tab-bar__track`,role:`tablist`},[(0,n.createElementVNode)(`span`,{class:(0,n.normalizeClass)([`ak-tab-bar__indicator`,{"ak-tab-bar__indicator--ready":s.value.ready}]),style:(0,n.normalizeStyle)({transform:`translate(${s.value.x}px, ${s.value.y}px)`,width:`${s.value.w}px`,height:`${s.value.h}px`}),"aria-hidden":`true`},null,6),(0,n.renderSlot)(e.$slots,`default`,{},void 0,!0)],512)]))}}),[[`__scopeId`,`data-v-636977ec`]]),We=[`aria-selected`,`aria-label`,`disabled`],Ge={class:`ak-tab-bar__icon`,"aria-hidden":`true`},Y={class:`ak-tab-bar__label`},X=l((0,n.defineComponent)({__name:`AkTabBarItem`,props:{value:{},label:{},icon:{},disabled:{type:Boolean,default:!1}},setup(e){let t=e,r=(0,n.inject)(q);if(!r)throw Error(`AkTabBarItem must be used inside AkTabBar`);let i=r,a=(0,n.ref)(null),o=(0,n.computed)(()=>i.active.value===t.value);(0,n.onMounted)(()=>{a.value&&i.register(t.value,a.value)}),(0,n.onUnmounted)(()=>{i.unregister(t.value)});function s(){t.disabled||i.select(t.value)}return(t,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{ref_key:`itemRef`,ref:a,type:`button`,class:(0,n.normalizeClass)([`ak-tab-bar__item`,{"ak-tab-bar__item--active":o.value}]),role:`tab`,"aria-selected":o.value,"aria-label":e.label,disabled:e.disabled,onClick:s},[(0,n.createElementVNode)(`span`,Ge,[(0,n.renderSlot)(t.$slots,`icon`,{},()=>[e.icon?((0,n.openBlock)(),(0,n.createBlock)(A,{key:0,name:e.icon,size:20},null,8,[`name`])):(0,n.createCommentVNode)(``,!0)],!0)]),(0,n.createElementVNode)(`span`,Y,(0,n.toDisplayString)(e.label),1)],10,We))}}),[[`__scopeId`,`data-v-2a73a441`]]),Ke=t({AkAmbientBg:()=>T,AkBadge:()=>d,AkButton:()=>u,AkCard:()=>h,AkChip:()=>p,AkDivider:()=>N,AkEmptyState:()=>C,AkIcon:()=>A,AkIconButton:()=>G,AkInput:()=>b,AkList:()=>U,AkListRow:()=>W,AkProgress:()=>R,AkSectionHeader:()=>H,AkShimmer:()=>w,AkSwitch:()=>K,AkTabBar:()=>J,AkTabBarItem:()=>X,AkTextarea:()=>S}),qe={install(e,t={}){let n=t.prefix??``;for(let[t,r]of Object.entries(Ke))e.component(`${n}${t}`,r)}},Z={violet:{label:`Violet`,description:`Mineral violet — default for App mood.`,sample:`#6658b8`},evergreen:{label:`Evergreen`,description:`Confident green — default for Site mood.`,sample:`#2e684f`},teal:{label:`Teal`,description:`Calm mineral teal for productivity and wellness apps.`,sample:`#3a7d85`},ocean:{label:`Ocean`,description:`Trustworthy blue for data-heavy products.`,sample:`#3d6a94`},amber:{label:`Amber`,description:`Warm gold for optimistic, human interfaces.`,sample:`#9a702d`},rose:{label:`Rose`,description:`Dusty rose for lifestyle and creative tools.`,sample:`#a8586a`},coral:{label:`Coral`,description:`Terracotta warmth without feeling playful.`,sample:`#b5644a`},slate:{label:`Slate`,description:`Blue-gray for neutral B2B surfaces.`,sample:`#4a5d73`}},Je=Object.keys(Z),Q=`violet`,$=`evergreen`;function Ye(e,t){if(t===`auto`){delete e.dataset.accent;return}e.dataset.accent=t}function Xe(e,t){return t||(e===`site`?$:Q)}exports.AkAmbientBg=T,exports.AkBadge=d,exports.AkButton=u,exports.AkCard=h,exports.AkChip=p,exports.AkDivider=N,exports.AkEmptyState=C,exports.AkIcon=A,exports.AkIconButton=G,exports.AkInput=b,exports.AkList=U,exports.AkListRow=W,exports.AkProgress=R,exports.AkSectionHeader=H,exports.AkShimmer=w,exports.AkSwitch=K,exports.AkTabBar=J,exports.AkTabBarItem=X,exports.AkTextarea=S,exports.Akoma=qe,exports.accentPaletteIds=Je,exports.accentPalettes=Z,exports.appDefaultAccent=Q,exports.applyAccentPalette=Ye,exports.cuidaIconMap=E,exports.getCuidaIconMarkup=O,exports.resolveAccentPalette=Xe,exports.siteDefaultAccent=$;
|