@nadicodeai/ui 9.2.1 → 10.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/AGENTS.md +1 -0
- package/README.md +4 -29
- package/dist/agent-orb.d.ts +3 -0
- package/dist/agent-orb.d.ts.map +1 -0
- package/dist/agent-orb.js +2 -0
- package/dist/assets/brand/aionlabs.svg +2 -0
- package/dist/assets/brand/airtable.svg +2 -0
- package/dist/assets/brand/apple.svg +2 -0
- package/dist/assets/brand/arcee.svg +2 -0
- package/dist/assets/brand/asana.svg +2 -0
- package/dist/assets/brand/atlassian.svg +2 -0
- package/dist/assets/brand/baidu.svg +2 -0
- package/dist/assets/brand/bytedance.svg +2 -0
- package/dist/assets/brand/claude.svg +2 -0
- package/dist/assets/brand/cohere.svg +2 -0
- package/dist/assets/brand/datadog.svg +2 -0
- package/dist/assets/brand/deepseek.svg +2 -0
- package/dist/assets/brand/discord.svg +2 -0
- package/dist/assets/brand/dolphin.svg +2 -0
- package/dist/assets/brand/dotsstudio.svg +2 -0
- package/dist/assets/brand/figma.svg +2 -0
- package/dist/assets/brand/gemini.svg +2 -0
- package/dist/assets/brand/github.svg +2 -0
- package/dist/assets/brand/gitlab.svg +2 -0
- package/dist/assets/brand/gmail.svg +2 -0
- package/dist/assets/brand/google-calendar.svg +2 -0
- package/dist/assets/brand/google-drive.svg +2 -0
- package/dist/assets/brand/grok.svg +2 -0
- package/dist/assets/brand/huggingface.svg +2 -0
- package/dist/assets/brand/ibm.svg +2 -0
- package/dist/assets/brand/inception.svg +2 -0
- package/dist/assets/brand/inclusionai.svg +2 -0
- package/dist/assets/brand/index.json +778 -0
- package/dist/assets/brand/inference.svg +2 -0
- package/dist/assets/brand/intercom.svg +2 -0
- package/dist/assets/brand/jira.svg +2 -0
- package/dist/assets/brand/kwaipilot.svg +2 -0
- package/dist/assets/brand/linear.svg +2 -0
- package/dist/assets/brand/linux.svg +2 -0
- package/dist/assets/brand/liquid.svg +2 -0
- package/dist/assets/brand/longcat.svg +2 -0
- package/dist/assets/brand/mattermost.svg +2 -0
- package/dist/assets/brand/meta.svg +2 -0
- package/dist/assets/brand/microsoft.svg +2 -0
- package/dist/assets/brand/minimax.svg +2 -0
- package/dist/assets/brand/mistral.svg +2 -0
- package/dist/assets/brand/moonshot.svg +2 -0
- package/dist/assets/brand/morph.svg +2 -0
- package/dist/assets/brand/n8n.svg +2 -0
- package/dist/assets/brand/netlify.svg +2 -0
- package/dist/assets/brand/nexagi.svg +2 -0
- package/dist/assets/brand/notion.svg +2 -0
- package/dist/assets/brand/nousresearch.svg +2 -0
- package/dist/assets/brand/nova.svg +2 -0
- package/dist/assets/brand/nvidia.svg +2 -0
- package/dist/assets/brand/openai.svg +2 -0
- package/dist/assets/brand/openrouter.svg +2 -0
- package/dist/assets/brand/paypal.svg +2 -0
- package/dist/assets/brand/perceptron.svg +2 -0
- package/dist/assets/brand/perplexity.svg +2 -0
- package/dist/assets/brand/poolside.svg +2 -0
- package/dist/assets/brand/postgresql.svg +2 -0
- package/dist/assets/brand/qwen.svg +2 -0
- package/dist/assets/brand/reka.svg +2 -0
- package/dist/assets/brand/relace.svg +2 -0
- package/dist/assets/brand/sakana.svg +2 -0
- package/dist/assets/brand/sentry.svg +2 -0
- package/dist/assets/brand/signal.svg +2 -0
- package/dist/assets/brand/slack.svg +2 -0
- package/dist/assets/brand/spotify.svg +2 -0
- package/dist/assets/brand/square.svg +2 -0
- package/dist/assets/brand/stepfun.svg +2 -0
- package/dist/assets/brand/stripe.svg +2 -0
- package/dist/assets/brand/supabase.svg +2 -0
- package/dist/assets/brand/telegram.svg +2 -0
- package/dist/assets/brand/tencent.svg +2 -0
- package/dist/assets/brand/the-drummer.svg +2 -0
- package/dist/assets/brand/thinkingmachines.svg +2 -0
- package/dist/assets/brand/todoist.svg +2 -0
- package/dist/assets/brand/unbiased.svg +2 -0
- package/dist/assets/brand/unreal-engine.svg +2 -0
- package/dist/assets/brand/upstage.svg +2 -0
- package/dist/assets/brand/vercel.svg +2 -0
- package/dist/assets/brand/webflow.svg +2 -0
- package/dist/assets/brand/whatsapp.svg +2 -0
- package/dist/assets/brand/windows.svg +2 -0
- package/dist/assets/brand/writer.svg +2 -0
- package/dist/assets/brand/xiaomimimo.svg +2 -0
- package/dist/assets/brand/youtube.svg +2 -0
- package/dist/assets/brand/yuanbao.svg +2 -0
- package/dist/assets/brand/zai.svg +2 -0
- package/dist/assets/brand/zapier.svg +2 -0
- package/dist/components/action-status.d.ts +5 -0
- package/dist/components/action-status.d.ts.map +1 -1
- package/dist/components/action-status.js +6 -2
- package/dist/components/agent-orb-appearance.d.ts +16 -2
- package/dist/components/agent-orb-appearance.d.ts.map +1 -1
- package/dist/components/agent-orb-appearance.js +28 -5
- package/dist/components/agent-orb.d.ts +6 -3
- package/dist/components/agent-orb.d.ts.map +1 -1
- package/dist/components/agent-orb.js +20 -7
- package/dist/components/app-mark-aliases.d.ts +16 -0
- package/dist/components/app-mark-aliases.d.ts.map +1 -0
- package/dist/components/app-mark-aliases.js +84 -0
- package/dist/components/app-mark.d.ts +4 -0
- package/dist/components/app-mark.d.ts.map +1 -1
- package/dist/components/app-mark.js +14 -31
- package/dist/components/automation-section.d.ts.map +1 -1
- package/dist/components/automation-section.js +2 -2
- package/dist/components/badge.js +1 -1
- package/dist/components/brand.d.ts +3 -2
- package/dist/components/brand.d.ts.map +1 -1
- package/dist/components/brand.js +18 -28
- package/dist/components/button.js +1 -1
- package/dist/components/collection-filters.js +2 -2
- package/dist/components/confirm-dialog.d.ts +3 -1
- package/dist/components/confirm-dialog.d.ts.map +1 -1
- package/dist/components/confirm-dialog.js +3 -3
- package/dist/components/drawer.js +5 -5
- package/dist/components/feedback-state.d.ts.map +1 -1
- package/dist/components/feedback-state.js +6 -9
- package/dist/components/footer.js +2 -2
- package/dist/components/house-icons.d.ts.map +1 -1
- package/dist/components/house-icons.js +9 -1
- package/dist/components/input-otp.js +1 -1
- package/dist/components/installer-shell.d.ts.map +1 -1
- package/dist/components/installer-shell.js +5 -6
- package/dist/components/navigation-menu.js +2 -2
- package/dist/components/pending-label.d.ts +15 -0
- package/dist/components/pending-label.d.ts.map +1 -0
- package/dist/components/pending-label.js +14 -0
- package/dist/components/sheet.js +1 -1
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton.js +5 -1
- package/dist/components/sonner.d.ts.map +1 -1
- package/dist/components/sonner.js +5 -2
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/waiting-line.d.ts +30 -0
- package/dist/components/waiting-line.d.ts.map +1 -0
- package/dist/components/waiting-line.js +33 -0
- package/dist/eslint/rules/no-invalid-token-utility.js +1 -1
- package/dist/index.d.ts +3 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -38
- package/dist/internal/agent-orb-motion.d.ts +9 -1
- package/dist/internal/agent-orb-motion.d.ts.map +1 -1
- package/dist/internal/agent-orb-motion.js +23 -11
- package/dist/internal/agent-orb.d.ts +14 -1
- package/dist/internal/agent-orb.d.ts.map +1 -1
- package/dist/internal/agent-orb.js +78 -22
- package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
- package/dist/internal/assistant-ui/attachment.js +3 -2
- package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
- package/dist/internal/assistant-ui/reasoning.js +4 -4
- package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-fallback.js +5 -4
- package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-group.js +4 -3
- package/dist/lib/motion.d.ts +18 -4
- package/dist/lib/motion.d.ts.map +1 -1
- package/dist/lib/motion.js +18 -4
- package/dist/styles/globals.css +0 -1
- package/docs/activity.md +99 -119
- package/docs/agent-orb.md +71 -20
- package/docs/component-classification.md +4 -4
- package/docs/consuming-cross-repo.md +8 -10
- package/docs/contract.md +10 -9
- package/docs/icon-assets.md +106 -0
- package/docs/migration/10.0.0.md +144 -0
- package/package.json +8 -7
- package/dist/activity.d.ts +0 -2
- package/dist/activity.d.ts.map +0 -1
- package/dist/activity.js +0 -2
- package/dist/components/action-band.d.ts +0 -12
- package/dist/components/action-band.d.ts.map +0 -1
- package/dist/components/action-band.js +0 -48
- package/dist/components/activity-orb.d.ts +0 -21
- package/dist/components/activity-orb.d.ts.map +0 -1
- package/dist/components/activity-orb.js +0 -26
- package/dist/components/benefits-bento.d.ts +0 -15
- package/dist/components/benefits-bento.d.ts.map +0 -1
- package/dist/components/benefits-bento.js +0 -6
- package/dist/components/bento.d.ts +0 -39
- package/dist/components/bento.d.ts.map +0 -1
- package/dist/components/bento.js +0 -70
- package/dist/components/card-marketing.d.ts +0 -30
- package/dist/components/card-marketing.d.ts.map +0 -1
- package/dist/components/card-marketing.js +0 -48
- package/dist/components/code-editor-mockup.d.ts +0 -25
- package/dist/components/code-editor-mockup.d.ts.map +0 -1
- package/dist/components/code-editor-mockup.js +0 -47
- package/dist/components/contact.d.ts +0 -32
- package/dist/components/contact.d.ts.map +0 -1
- package/dist/components/contact.js +0 -46
- package/dist/components/faq-item.d.ts +0 -25
- package/dist/components/faq-item.d.ts.map +0 -1
- package/dist/components/faq-item.js +0 -25
- package/dist/components/faq.d.ts +0 -20
- package/dist/components/faq.d.ts.map +0 -1
- package/dist/components/faq.js +0 -23
- package/dist/components/feature-grid.d.ts +0 -23
- package/dist/components/feature-grid.d.ts.map +0 -1
- package/dist/components/feature-grid.js +0 -33
- package/dist/components/feature-rows.d.ts +0 -23
- package/dist/components/feature-rows.d.ts.map +0 -1
- package/dist/components/feature-rows.js +0 -27
- package/dist/components/glyph-spinner.d.ts +0 -10
- package/dist/components/glyph-spinner.d.ts.map +0 -1
- package/dist/components/glyph-spinner.js +0 -101
- package/dist/components/hero-split.d.ts +0 -23
- package/dist/components/hero-split.d.ts.map +0 -1
- package/dist/components/hero-split.js +0 -35
- package/dist/components/hero.d.ts +0 -28
- package/dist/components/hero.d.ts.map +0 -1
- package/dist/components/hero.js +0 -45
- package/dist/components/integration-flow.d.ts +0 -36
- package/dist/components/integration-flow.d.ts.map +0 -1
- package/dist/components/integration-flow.js +0 -36
- package/dist/components/live-demo.d.ts +0 -31
- package/dist/components/live-demo.d.ts.map +0 -1
- package/dist/components/live-demo.js +0 -30
- package/dist/components/logo-band.d.ts +0 -33
- package/dist/components/logo-band.d.ts.map +0 -1
- package/dist/components/logo-band.js +0 -49
- package/dist/components/logo-tile.d.ts +0 -21
- package/dist/components/logo-tile.d.ts.map +0 -1
- package/dist/components/logo-tile.js +0 -28
- package/dist/components/media-mount.d.ts +0 -13
- package/dist/components/media-mount.d.ts.map +0 -1
- package/dist/components/media-mount.js +0 -15
- package/dist/components/nav-bar.d.ts +0 -24
- package/dist/components/nav-bar.d.ts.map +0 -1
- package/dist/components/nav-bar.js +0 -35
- package/dist/components/newsletter.d.ts +0 -24
- package/dist/components/newsletter.d.ts.map +0 -1
- package/dist/components/newsletter.js +0 -31
- package/dist/components/page-frame.d.ts +0 -30
- package/dist/components/page-frame.d.ts.map +0 -1
- package/dist/components/page-frame.js +0 -30
- package/dist/components/pricing-card.d.ts +0 -30
- package/dist/components/pricing-card.d.ts.map +0 -1
- package/dist/components/pricing-card.js +0 -44
- package/dist/components/pricing.d.ts +0 -25
- package/dist/components/pricing.d.ts.map +0 -1
- package/dist/components/pricing.js +0 -11
- package/dist/components/proof-slot.d.ts +0 -8
- package/dist/components/proof-slot.d.ts.map +0 -1
- package/dist/components/proof-slot.js +0 -8
- package/dist/components/quote-card.d.ts +0 -31
- package/dist/components/quote-card.d.ts.map +0 -1
- package/dist/components/quote-card.js +0 -48
- package/dist/components/seam-grid.d.ts +0 -30
- package/dist/components/seam-grid.d.ts.map +0 -1
- package/dist/components/seam-grid.js +0 -30
- package/dist/components/section-intro.d.ts +0 -18
- package/dist/components/section-intro.d.ts.map +0 -1
- package/dist/components/section-intro.js +0 -22
- package/dist/components/security-grid.d.ts +0 -25
- package/dist/components/security-grid.d.ts.map +0 -1
- package/dist/components/security-grid.js +0 -28
- package/dist/components/shift-band.d.ts +0 -14
- package/dist/components/shift-band.d.ts.map +0 -1
- package/dist/components/shift-band.js +0 -11
- package/dist/components/spinner.d.ts +0 -3
- package/dist/components/spinner.d.ts.map +0 -1
- package/dist/components/spinner.js +0 -7
- package/dist/components/statement.d.ts +0 -32
- package/dist/components/statement.d.ts.map +0 -1
- package/dist/components/statement.js +0 -40
- package/dist/components/steps.d.ts +0 -34
- package/dist/components/steps.d.ts.map +0 -1
- package/dist/components/steps.js +0 -40
- package/dist/components/team-grid.d.ts +0 -27
- package/dist/components/team-grid.d.ts.map +0 -1
- package/dist/components/team-grid.js +0 -30
- package/dist/components/testimonials.d.ts +0 -48
- package/dist/components/testimonials.d.ts.map +0 -1
- package/dist/components/testimonials.js +0 -58
- package/dist/components/texture-strip.d.ts +0 -22
- package/dist/components/texture-strip.d.ts.map +0 -1
- package/dist/components/texture-strip.js +0 -32
- package/dist/components/use-case-bento.d.ts +0 -13
- package/dist/components/use-case-bento.d.ts.map +0 -1
- package/dist/components/use-case-bento.js +0 -8
- package/dist/internal/activity-orb.d.ts +0 -27
- package/dist/internal/activity-orb.d.ts.map +0 -1
- package/dist/internal/activity-orb.js +0 -150
- package/dist/lib/seam.d.ts +0 -29
- package/dist/lib/seam.d.ts.map +0 -1
- package/dist/lib/seam.js +0 -30
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Migrating to `@nadicodeai/ui` 10.0.0
|
|
2
|
+
|
|
3
|
+
This release carries the nadicode design system settled in
|
|
4
|
+
[the ADR](https://github.com/nadicodeai/nadicodeai/blob/main/docs/adr/2026-09-23-the-nadicode-design-system.md):
|
|
5
|
+
the new logo and name, twelve type tokens named by role, two greens, one motion
|
|
6
|
+
law, activity without spinners, the stepped dark ring, three Agent colours, and
|
|
7
|
+
the website's page grammar retired. `@nadicodeai/ui` 10.0.0 requires
|
|
8
|
+
`@nadicodeai/design-system` 10.0.0; the two packages are released in lockstep.
|
|
9
|
+
The type renames are the largest break for consumers; start there.
|
|
10
|
+
|
|
11
|
+
## Type tokens
|
|
12
|
+
|
|
13
|
+
Twelve sizes named by the role they play, Geist and Geist Mono only. Strong is
|
|
14
|
+
a weight, not a token: a 500 run of body copy is `body-md` with
|
|
15
|
+
`font-weight: 500`. Rename the `.nc-type-*` class and the `--nc-type-*` tokens
|
|
16
|
+
at every call site.
|
|
17
|
+
|
|
18
|
+
| Removed | Use instead |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `title-lg` | `display-md` |
|
|
21
|
+
| `title-md` | `heading-lg` |
|
|
22
|
+
| `title-sm` | `heading-md` |
|
|
23
|
+
| `display-md` | `heading-md` |
|
|
24
|
+
| `display-sm` | `heading-sm` |
|
|
25
|
+
| `body-md-strong` | `body-md` plus `font-weight: 500` |
|
|
26
|
+
| `body-sm-strong` | `body-sm` plus `font-weight: 500` |
|
|
27
|
+
| `caption-strong` | `caption` plus `font-weight: 500` |
|
|
28
|
+
| `button-lg` | `body-md` plus `font-weight: 500` |
|
|
29
|
+
| `button-md` | `body-sm` plus `font-weight: 500` |
|
|
30
|
+
| `caption-mono` | `label-mono` |
|
|
31
|
+
|
|
32
|
+
`display-xl`, `display-lg`, `body-lg`, `body-md`, `body-sm`, `caption` and
|
|
33
|
+
`code` keep their names. `display-md` is now 40/42 rather than 24/32, so a call
|
|
34
|
+
site that used the old small display tier moves to `heading-md`. Tracking is a
|
|
35
|
+
display-tier exception and nothing else: the three display sizes run from
|
|
36
|
+
-0.035em at 72px to -0.025em at 40px, and every other tier is `0px`.
|
|
37
|
+
|
|
38
|
+
## Colour tokens
|
|
39
|
+
|
|
40
|
+
Two greens, and only two: `link` carries text, identity verde carries marks.
|
|
41
|
+
|
|
42
|
+
| Removed | Use instead |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| `--nc-primary` | `--nc-identity-cobalto` for a brand mark, `--nc-link` for text, or the shadcn `--primary` role for the neutral action |
|
|
45
|
+
| `--nc-dark-primary` | as above; the mode layer maps `--nc-identity-cobalto` in both themes |
|
|
46
|
+
| `--nc-verde-vivo` | `--nc-identity-verde` |
|
|
47
|
+
| `--nc-dark-verde-vivo` | `--nc-identity-verde` |
|
|
48
|
+
|
|
49
|
+
The shadcn `primary` role is unchanged and still resolves to the neutral action
|
|
50
|
+
family. `success` and `state-complete` are unchanged.
|
|
51
|
+
|
|
52
|
+
## Motion tokens
|
|
53
|
+
|
|
54
|
+
| Removed | Use instead |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| `--nc-duration-spin` | nothing; a busy spinner is not an Agent |
|
|
57
|
+
| `--nc-duration-typing` | nothing; the typewriter line is retired |
|
|
58
|
+
| `--nc-duration-shimmer` | nothing; the shimmer systems are retired |
|
|
59
|
+
| `--nc-duration-pulse` | `--nc-duration-wait`, for the one waiting line |
|
|
60
|
+
| `.nc-anim-typing`, `.nc-anim-pulse`, `.nc-anim-shimmer` | nothing; only Agents move on their own |
|
|
61
|
+
|
|
62
|
+
One default transition in every product, `confirm` on `out-strong`, is declared
|
|
63
|
+
once in the shipped `motion.css`. One reduced-motion policy replaces the
|
|
64
|
+
per-component switches: movement stops and paint continues, so an overlay keeps
|
|
65
|
+
its fade and only the transform or scale it would have travelled is dropped. A
|
|
66
|
+
component that answered reduced motion with `motion-reduce:transition-none` on a
|
|
67
|
+
paint-only transition should drop that class; one on a mixed transition should
|
|
68
|
+
narrow to `motion-reduce:transition-opacity` instead.
|
|
69
|
+
|
|
70
|
+
## Elevation
|
|
71
|
+
|
|
72
|
+
In dark mode the four rungs step their ring: resting 12%, raised 16%, floating
|
|
73
|
+
22%, modal 28% white, in place of one 18% ring on every rung. Light mode and the
|
|
74
|
+
shadow falloff are unchanged, and the `nc-elevation-*` utilities are unchanged,
|
|
75
|
+
so a consumer that uses the rung by name needs no edit.
|
|
76
|
+
|
|
77
|
+
## Agent colours
|
|
78
|
+
|
|
79
|
+
`agentOrbColors` is `cobalto`, `verde` and `arancio`, beside the inherited
|
|
80
|
+
default. Rosso left the picker because it is exactly the error red, and a red
|
|
81
|
+
Agent beside a red status badge read as a broken Agent. `agentOrbColorValues`
|
|
82
|
+
and `agentOrbColorTokens` lose their `rosso` entry with it, so a caller that
|
|
83
|
+
indexed either by a stored string must go through `resolveAgentOrb`, which maps
|
|
84
|
+
a stored rosso, by name or by the `#d3302f` hex, to arancio. The retired
|
|
85
|
+
spelling is exported as `retiredAgentOrbColorValues` for fixtures and tests.
|
|
86
|
+
Nadia's ribbon keeps its rosso stripe.
|
|
87
|
+
|
|
88
|
+
## Removed components
|
|
89
|
+
|
|
90
|
+
| Removed | Use instead |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| `components/brand` (`BrandLockup`) | `BrandWordmark` |
|
|
93
|
+
|
|
94
|
+
There is no lockup any more. The wordmark names the company in full and the n
|
|
95
|
+
is already inside it, so a placement carrying `BrandMark` and `BrandWordmark`
|
|
96
|
+
together draws the letter twice; pick the one form the space allows.
|
|
97
|
+
`BrandMark` and `BrandWordmark` keep their props, and their default accessible
|
|
98
|
+
name is now `nadicode`.
|
|
99
|
+
|
|
100
|
+
## Removed assets
|
|
101
|
+
|
|
102
|
+
The design system publishes seven files, as SVG and as transparent PNG, under
|
|
103
|
+
the names the ADR gives them. Append `.png` to any route for the raster.
|
|
104
|
+
|
|
105
|
+
| Removed | Use instead |
|
|
106
|
+
| --- | --- |
|
|
107
|
+
| `assets/logo-lockup`, `assets/logo-wordmark` | `assets/logo` |
|
|
108
|
+
| `assets/logo-lockup-inverse`, `assets/logo-wordmark-inverse` | `assets/logo-white` |
|
|
109
|
+
| `assets/logo-lockup-mono`, `assets/logo-wordmark-mono` | `assets/logo-one-ink` |
|
|
110
|
+
| `assets/logo-mark` | `assets/mark` |
|
|
111
|
+
| `assets/logo-mark-inverse` | `assets/mark-white` |
|
|
112
|
+
| `assets/logo-mark-mono` | `assets/mark`; the n is one ink already |
|
|
113
|
+
| `assets/logo-lockup-on-verde`, `assets/logo-mark-on-verde`, `assets/logo-wordmark-on-verde` | No replacement. The logo is never mounted on a verde field. |
|
|
114
|
+
|
|
115
|
+
Added: `assets/logo-one-ink-white`, the one-ink wordmark on a dark ground, and
|
|
116
|
+
`assets/app-icon`, the white n on the cobalto tile at 1024 for an application
|
|
117
|
+
icon slot. The one-ink files exist for embossing, stamps and one-colour print,
|
|
118
|
+
where a second colour cannot be laid down.
|
|
119
|
+
|
|
120
|
+
`assets/logo-geometry` keeps its route and changes shape. `LogoPaints` is now a
|
|
121
|
+
record of paint roles, `ink` for every stroked letter, `dot` for the dot over
|
|
122
|
+
the i and `tile` for the icon's field, and a geometry that names a role the
|
|
123
|
+
caller did not supply throws instead of rendering an unpainted shape.
|
|
124
|
+
`resolveLogoGeometry` no longer takes `idPrefix`: the geometry emits no DOM id,
|
|
125
|
+
so two logos on a page cannot collide. `logoLockupGeometry` is removed;
|
|
126
|
+
`logoWordmarkGeometry` and `logoMarkGeometry` remain and `logoIconGeometry`
|
|
127
|
+
is added.
|
|
128
|
+
|
|
129
|
+
## Tokens
|
|
130
|
+
|
|
131
|
+
| Added | Why |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| `--nc-logo-dot` | The dot's colour, #1e3cff, and the only token a consumer paints it with. |
|
|
134
|
+
| `--nc-logo-dot` under `.dark` | #4d6bff, so the dot does not sink into black. |
|
|
135
|
+
|
|
136
|
+
A consumer that painted the logo with `--nc-primary` moves to `--nc-logo-dot`.
|
|
137
|
+
The generated mode layer flips it under any dark ancestor, so one rendered form
|
|
138
|
+
serves both grounds.
|
|
139
|
+
|
|
140
|
+
## The name
|
|
141
|
+
|
|
142
|
+
The company is nadicode, lowercase. Package names and domains are unchanged;
|
|
143
|
+
the accessible name of every shipped logo file and both React adapters is now
|
|
144
|
+
`nadicode`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nadicodeai/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"types": "./dist/agents.d.ts",
|
|
21
21
|
"import": "./dist/agents.js"
|
|
22
22
|
},
|
|
23
|
-
"./
|
|
24
|
-
"types": "./dist/
|
|
25
|
-
"import": "./dist/
|
|
23
|
+
"./agent-orb": {
|
|
24
|
+
"types": "./dist/agent-orb.d.ts",
|
|
25
|
+
"import": "./dist/agent-orb.js"
|
|
26
26
|
},
|
|
27
27
|
"./hooks": {
|
|
28
28
|
"types": "./dist/hooks/index.d.ts",
|
|
@@ -43,7 +43,9 @@
|
|
|
43
43
|
"./components/*": {
|
|
44
44
|
"types": "./dist/components/*.d.ts",
|
|
45
45
|
"import": "./dist/components/*.js"
|
|
46
|
-
}
|
|
46
|
+
},
|
|
47
|
+
"./assets/brand/index.json": "./dist/assets/brand/index.json",
|
|
48
|
+
"./assets/brand/*": "./dist/assets/brand/*"
|
|
47
49
|
},
|
|
48
50
|
"files": [
|
|
49
51
|
"dist",
|
|
@@ -70,7 +72,7 @@
|
|
|
70
72
|
"@assistant-ui/react": "0.15.21",
|
|
71
73
|
"@assistant-ui/react-markdown": "0.14.16",
|
|
72
74
|
"@base-ui/react": "^1.8.0",
|
|
73
|
-
"@nadicodeai/design-system": "
|
|
75
|
+
"@nadicodeai/design-system": "10.0.1",
|
|
74
76
|
"class-variance-authority": "^0.7.1",
|
|
75
77
|
"clsx": "^2.1.1",
|
|
76
78
|
"cmdk": "^1.1.1",
|
|
@@ -89,7 +91,6 @@
|
|
|
89
91
|
"tailwind-merge": "^3.7.0",
|
|
90
92
|
"thinking-orbs": "0.3.1",
|
|
91
93
|
"tw-animate-css": "^1.4.0",
|
|
92
|
-
"tw-shimmer": "0.4.13",
|
|
93
94
|
"zustand": "^5.0.14"
|
|
94
95
|
},
|
|
95
96
|
"peerDependencies": {
|
package/dist/activity.d.ts
DELETED
package/dist/activity.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/activity.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
type ActionBandProps = React.ComponentProps<"section"> & {
|
|
3
|
-
/** Retained for consumer compatibility; the V5 band has a single fixed layout. */
|
|
4
|
-
active?: "inset" | "full";
|
|
5
|
-
};
|
|
6
|
-
declare function ActionBand({ active, className, children, ...props }: ActionBandProps): React.JSX.Element;
|
|
7
|
-
declare function ActionBandContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
8
|
-
declare function ActionBandCopy({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
9
|
-
declare function ActionBandHeading({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
|
|
10
|
-
declare function ActionBandVisual({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
11
|
-
export { ActionBand, ActionBandContent, ActionBandCopy, ActionBandHeading, ActionBandVisual };
|
|
12
|
-
//# sourceMappingURL=action-band.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"action-band.d.ts","sourceRoot":"","sources":["../../src/components/action-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA8C/B,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG;IACvD,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,iBAAS,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,qBA0B7E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW9E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAE3E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAW7E;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ7E;AAED,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from "../lib/utils.js";
|
|
3
|
-
/**
|
|
4
|
-
* action-band — the full-bleed on-verde conversion band (V5 · B19).
|
|
5
|
-
*
|
|
6
|
-
* A solid brand-verde field (`bg-primary`) carrying one statement and one action,
|
|
7
|
-
* one statement, one button. The band bleeds full width; a
|
|
8
|
-
* centred rail (`max-w-[1200px]`, left/right hairlines) holds the content, and a
|
|
9
|
-
* crosshair marks the STRUCTURAL intersection of the rail's top edge and left edge
|
|
10
|
-
* — it is never decorative. A fractal-noise overlay adds grain TEXTURE only (an
|
|
11
|
-
* inline feTurbulence data-URI, carrying no colour value), layered under the copy.
|
|
12
|
-
*
|
|
13
|
-
* Every mark on the verde field — text, heading, crosshair, and rail hairlines —
|
|
14
|
-
* is the ink primary-foreground role, NOT `text-foreground`. `foreground` flips to
|
|
15
|
-
* near-white under a dark ancestor while `bg-primary` stays a bright verde field, so
|
|
16
|
-
* ink text would turn near-white-on-verde (≈1.7:1). `primary-foreground` is ink in
|
|
17
|
-
* both modes and the build gate guarantees it clears on the primary field. Token-only;
|
|
18
|
-
* no raw colour values, no gradients, and no `dark:` styling.
|
|
19
|
-
*
|
|
20
|
-
* COMPAT: the `active` prop and the `ActionBand{Content,Copy,Visual}` parts are kept
|
|
21
|
-
* so existing consumers still compile; their roles are re-cut for the V5 band
|
|
22
|
-
* (Content = padded stack, Copy = rich-content wrapper, Visual = the trailing
|
|
23
|
-
* action/media slot). `ActionBandHeading` owns the simple V5 statement treatment.
|
|
24
|
-
* The prior two-cell ink stage is retired.
|
|
25
|
-
*/
|
|
26
|
-
// Grain texture only — feTurbulence fractal noise, no colour literal (`#` encoded
|
|
27
|
-
// as `%23`), so the raw-colour ban has nothing to report here.
|
|
28
|
-
const GRAIN_TEXTURE = "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)'/%3E%3C/svg%3E\")";
|
|
29
|
-
function ActionBandCrosshair() {
|
|
30
|
-
return (_jsxs("span", { "data-slot": "action-band-crosshair", "aria-hidden": "true", className: "pointer-events-none absolute left-0 top-0 z-20 size-4 -translate-x-1/2 -translate-y-1/2", children: [_jsx("span", { className: "absolute left-1/2 top-0 h-full w-px -translate-x-1/2 bg-primary-foreground" }), _jsx("span", { className: "absolute left-0 top-1/2 h-px w-full -translate-y-1/2 bg-primary-foreground" })] }));
|
|
31
|
-
}
|
|
32
|
-
function ActionBand({ active, className, children, ...props }) {
|
|
33
|
-
void active;
|
|
34
|
-
return (_jsxs("section", { "data-slot": "action-band", className: cn("relative isolate overflow-hidden bg-primary text-primary-foreground", className), ...props, children: [_jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 z-0 opacity-20", style: { backgroundImage: GRAIN_TEXTURE } }), _jsxs("div", { "data-slot": "action-band-rail", className: "relative z-10 mx-auto w-full max-w-[1200px] border-x border-primary-foreground/15", children: [_jsx(ActionBandCrosshair, {}), children] })] }));
|
|
35
|
-
}
|
|
36
|
-
function ActionBandContent({ className, ...props }) {
|
|
37
|
-
return (_jsx("div", { "data-slot": "action-band-content", className: cn("flex flex-col items-start gap-6 px-[clamp(24px,5vw,64px)] py-[clamp(64px,10vw,144px)]", className), ...props }));
|
|
38
|
-
}
|
|
39
|
-
function ActionBandCopy({ className, ...props }) {
|
|
40
|
-
return _jsx("div", { "data-slot": "action-band-copy", className: cn("min-w-0", className), ...props });
|
|
41
|
-
}
|
|
42
|
-
function ActionBandHeading({ className, ...props }) {
|
|
43
|
-
return (_jsx("h2", { "data-slot": "action-band-heading", className: cn("nc-type-display-md max-w-[24ch] text-balance text-primary-foreground", className), ...props }));
|
|
44
|
-
}
|
|
45
|
-
function ActionBandVisual({ className, ...props }) {
|
|
46
|
-
return (_jsx("div", { "data-slot": "action-band-visual", className: cn("flex flex-wrap items-center gap-3", className), ...props }));
|
|
47
|
-
}
|
|
48
|
-
export { ActionBand, ActionBandContent, ActionBandCopy, ActionBandHeading, ActionBandVisual };
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type CSSProperties } from "react";
|
|
2
|
-
import { type ActivityKind, type ActivityOrbSize } from "../internal/activity-orb.js";
|
|
3
|
-
export type { ActivityKind, ActivityOrbSize } from "../internal/activity-orb.js";
|
|
4
|
-
export type ActivityOrbProps = {
|
|
5
|
-
activity: ActivityKind;
|
|
6
|
-
className?: string;
|
|
7
|
-
style?: CSSProperties;
|
|
8
|
-
/** Freeze the animation for a preview or a user-controlled motion pause. */
|
|
9
|
-
paused?: boolean;
|
|
10
|
-
/** 20 inline, 64 within a region, 88 on an application's entry screen. */
|
|
11
|
-
size?: ActivityOrbSize;
|
|
12
|
-
} & ({
|
|
13
|
-
decorative: true;
|
|
14
|
-
label?: never;
|
|
15
|
-
} | {
|
|
16
|
-
decorative?: false;
|
|
17
|
-
label: string;
|
|
18
|
-
});
|
|
19
|
-
/** The shared system-activity family. The consumer owns the actual operation. */
|
|
20
|
-
export declare function ActivityOrb({ activity, className, decorative, label, paused, size, style, ...props }: ActivityOrbProps): import("react").JSX.Element;
|
|
21
|
-
//# sourceMappingURL=activity-orb.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity-orb.d.ts","sourceRoot":"","sources":["../../src/components/activity-orb.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAoB,MAAM,yBAAyB,CAAC;AAGpG,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE7E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,GAAG,CAAC;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElF,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,UAAkB,EAClB,KAAK,EACL,MAAc,EACd,IAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAmClB"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useRef } from "react";
|
|
4
|
-
import { mountActivityOrb } from "../internal/activity-orb.js";
|
|
5
|
-
import { cn } from "../lib/utils.js";
|
|
6
|
-
/** The shared system-activity family. The consumer owns the actual operation. */
|
|
7
|
-
export function ActivityOrb({ activity, className, decorative = false, label, paused = false, size = 20, style, ...props }) {
|
|
8
|
-
const canvas = useRef(null);
|
|
9
|
-
const renderer = useRef(null);
|
|
10
|
-
const initiallyPaused = useRef(paused);
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
if (!canvas.current)
|
|
13
|
-
return;
|
|
14
|
-
const mounted = mountActivityOrb(canvas.current, activity, size, initiallyPaused.current);
|
|
15
|
-
renderer.current = mounted;
|
|
16
|
-
return () => {
|
|
17
|
-
mounted.destroy();
|
|
18
|
-
renderer.current = null;
|
|
19
|
-
};
|
|
20
|
-
}, [activity, size]);
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
initiallyPaused.current = paused;
|
|
23
|
-
renderer.current?.setPaused(paused);
|
|
24
|
-
}, [activity, paused, size]);
|
|
25
|
-
return (_jsx("canvas", { ...props, "aria-hidden": decorative || undefined, "aria-label": decorative ? undefined : label, className: cn("inline-block shrink-0 align-middle", className), "data-activity": activity, "data-slot": "activity-orb", height: size, ref: canvas, role: decorative ? undefined : "img", style: { ...style, height: size, width: size }, width: size, children: decorative ? null : label }));
|
|
26
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
type BenefitItem = {
|
|
3
|
-
title: string;
|
|
4
|
-
body: string;
|
|
5
|
-
};
|
|
6
|
-
declare function BenefitsBento({ kicker, title, body, image, benefits, ...props }: React.ComponentProps<"div"> & {
|
|
7
|
-
kicker: string;
|
|
8
|
-
title: string;
|
|
9
|
-
body: string;
|
|
10
|
-
image: React.ReactNode;
|
|
11
|
-
benefits: BenefitItem[];
|
|
12
|
-
}): React.JSX.Element;
|
|
13
|
-
export { BenefitsBento };
|
|
14
|
-
export type { BenefitItem };
|
|
15
|
-
//# sourceMappingURL=benefits-bento.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benefits-bento.d.ts","sourceRoot":"","sources":["../../src/components/benefits-bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,iBAAS,aAAa,CAAC,EACrB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,qBAuBA;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Bento, BentoItem } from "./bento.js";
|
|
3
|
-
function BenefitsBento({ kicker, title, body, image, benefits, ...props }) {
|
|
4
|
-
return (_jsx("div", { "data-slot": "benefits-bento", ...props, children: _jsxs(Bento, { columns: 2, children: [_jsx(BentoItem, { flush: true, stretch: true, children: image }), _jsxs(BentoItem, { children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: kicker }), _jsx("h2", { className: "nc-type-title-md text-foreground", children: title }), _jsx("p", { className: "nc-type-body-md text-[var(--nc-body)]", children: body }), _jsx("div", { className: "grid gap-4 pt-2 sm:grid-cols-2", children: benefits.map((benefit) => (_jsxs("div", { className: "grid gap-1", children: [_jsx("h3", { className: "nc-type-body-md-strong text-foreground", children: benefit.title }), _jsx("p", { className: "nc-type-body-sm text-[var(--nc-body)]", children: benefit.body })] }, benefit.title))) })] })] }) }));
|
|
5
|
-
}
|
|
6
|
-
export { BenefitsBento };
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
/**
|
|
3
|
-
* bento — NadicodeAI's bordered marketing grid grammar.
|
|
4
|
-
*
|
|
5
|
-
* This is the reusable shadcn-style source component for bento sections. The
|
|
6
|
-
* grid owns seams once (`gap-px bg-border`, via `SeamGrid` with no `surface`);
|
|
7
|
-
* cells are borderless fills. Pages choose content and spans, not border math.
|
|
8
|
-
*
|
|
9
|
-
* `tone="night"` renders the always-dark V5 bento: rather than a `dark:` utility
|
|
10
|
-
* (forbidden) it sets the `dark` ancestor class on the grid root, so the seam
|
|
11
|
-
* (`bg-border`), the `bg-card` cell fills, and the `BentoIndex`/`BentoTitle`/
|
|
12
|
-
* `BentoBody` roles all resolve to their dark values. Only standard shadcn role
|
|
13
|
-
* utilities are composed. Token-only.
|
|
14
|
-
*/
|
|
15
|
-
declare const spanClasses: Record<number, string>;
|
|
16
|
-
declare const columnClasses: Record<number, string>;
|
|
17
|
-
declare function Bento({ className, height, columns, tone, ...props }: React.ComponentProps<"div"> & {
|
|
18
|
-
height?: "auto" | "primary" | "secondary";
|
|
19
|
-
columns?: keyof typeof columnClasses;
|
|
20
|
-
tone?: "canvas" | "night";
|
|
21
|
-
}): React.JSX.Element;
|
|
22
|
-
declare function BentoItem({ className, span, surface, flush, stretch, hover, ...props }: React.ComponentProps<"div"> & {
|
|
23
|
-
span?: keyof typeof spanClasses;
|
|
24
|
-
surface?: "card" | "soft" | "transparent";
|
|
25
|
-
flush?: boolean;
|
|
26
|
-
stretch?: boolean;
|
|
27
|
-
hover?: boolean;
|
|
28
|
-
}): React.JSX.Element;
|
|
29
|
-
declare function BentoIndex({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
30
|
-
declare function BentoTitle({ className, ...props }: React.ComponentProps<"h3">): React.JSX.Element;
|
|
31
|
-
declare function BentoBody({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
32
|
-
declare function BentoCopy({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
33
|
-
declare function BentoMedia({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
34
|
-
declare function BentoDemo({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
35
|
-
declare function BentoDivider({ label, className, ...props }: React.ComponentProps<"div"> & {
|
|
36
|
-
label?: string;
|
|
37
|
-
}): React.JSX.Element;
|
|
38
|
-
export { Bento, BentoItem, BentoIndex, BentoTitle, BentoBody, BentoCopy, BentoMedia, BentoDemo, BentoDivider, };
|
|
39
|
-
//# sourceMappingURL=bento.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bento.d.ts","sourceRoot":"","sources":["../../src/components/bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAavC,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKzC,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,MAAe,EACf,OAAY,EACZ,IAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,OAAO,aAAa,CAAC;IACrC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC3B,qBAkBA;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,IAAI,EACJ,OAAgB,EAChB,KAAa,EACb,OAAe,EACf,KAAa,EACb,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,OAAO,WAAW,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,qBAoBA;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQtE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQpE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAItE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQvE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAUlD;AAED,OAAO,EACL,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,GACb,CAAC"}
|
package/dist/components/bento.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from "../lib/utils.js";
|
|
3
|
-
import { SeamGrid } from "./seam-grid.js";
|
|
4
|
-
/**
|
|
5
|
-
* bento — NadicodeAI's bordered marketing grid grammar.
|
|
6
|
-
*
|
|
7
|
-
* This is the reusable shadcn-style source component for bento sections. The
|
|
8
|
-
* grid owns seams once (`gap-px bg-border`, via `SeamGrid` with no `surface`);
|
|
9
|
-
* cells are borderless fills. Pages choose content and spans, not border math.
|
|
10
|
-
*
|
|
11
|
-
* `tone="night"` renders the always-dark V5 bento: rather than a `dark:` utility
|
|
12
|
-
* (forbidden) it sets the `dark` ancestor class on the grid root, so the seam
|
|
13
|
-
* (`bg-border`), the `bg-card` cell fills, and the `BentoIndex`/`BentoTitle`/
|
|
14
|
-
* `BentoBody` roles all resolve to their dark values. Only standard shadcn role
|
|
15
|
-
* utilities are composed. Token-only.
|
|
16
|
-
*/
|
|
17
|
-
const spanClasses = {
|
|
18
|
-
1: "lg:col-span-1",
|
|
19
|
-
2: "lg:col-span-2",
|
|
20
|
-
3: "lg:col-span-3",
|
|
21
|
-
4: "lg:col-span-4",
|
|
22
|
-
5: "lg:col-span-5",
|
|
23
|
-
6: "lg:col-span-6",
|
|
24
|
-
7: "lg:col-span-7",
|
|
25
|
-
8: "lg:col-span-8",
|
|
26
|
-
9: "lg:col-span-9",
|
|
27
|
-
10: "lg:col-span-10",
|
|
28
|
-
11: "lg:col-span-11",
|
|
29
|
-
12: "lg:col-span-12",
|
|
30
|
-
};
|
|
31
|
-
const columnClasses = {
|
|
32
|
-
2: "grid-cols-1 md:grid-cols-2",
|
|
33
|
-
3: "grid-cols-1 md:grid-cols-3",
|
|
34
|
-
4: "grid-cols-1 md:grid-cols-4",
|
|
35
|
-
12: "grid-cols-1 lg:grid-cols-12",
|
|
36
|
-
};
|
|
37
|
-
function Bento({ className, height = "auto", columns = 12, tone = "canvas", ...props }) {
|
|
38
|
-
return (_jsx(SeamGrid, { "data-slot": "bento", "data-height": height, "data-tone": tone, className: cn("items-stretch",
|
|
39
|
-
// always-dark V5 bento: flip roles via the ancestor class, not `dark:`.
|
|
40
|
-
tone === "night" && "dark", columnClasses[columns], height === "primary" && "lg:h-[var(--nc-h-bento-primary)]", height === "secondary" && "lg:h-[var(--nc-h-bento-secondary)]", className), ...props }));
|
|
41
|
-
}
|
|
42
|
-
function BentoItem({ className, span, surface = "card", flush = false, stretch = false, hover = false, ...props }) {
|
|
43
|
-
return (_jsx("div", { "data-slot": "bento-item", "data-surface": surface, className: cn("nc-panel-cell relative min-w-0 overflow-hidden", span ? spanClasses[span] : null, surface === "card" && "bg-card",
|
|
44
|
-
// `muted` (== canvas-soft) flips with any `.dark` ancestor.
|
|
45
|
-
surface === "soft" && "bg-muted",
|
|
46
|
-
// V5 hover surface shift: card fill lifts toward the muted role.
|
|
47
|
-
hover && "transition-colors hover:bg-muted", flush && "!p-0", stretch && "items-stretch ![align-content:stretch] ![grid-template-rows:minmax(0,1fr)]", className), ...props }));
|
|
48
|
-
}
|
|
49
|
-
function BentoIndex({ className, ...props }) {
|
|
50
|
-
return (_jsx("span", { "data-slot": "bento-index", className: cn("nc-type-caption-mono text-primary", className), ...props }));
|
|
51
|
-
}
|
|
52
|
-
function BentoTitle({ className, ...props }) {
|
|
53
|
-
return (_jsx("h3", { "data-slot": "bento-title", className: cn("nc-type-body-md-strong text-foreground", className), ...props }));
|
|
54
|
-
}
|
|
55
|
-
function BentoBody({ className, ...props }) {
|
|
56
|
-
return (_jsx("p", { "data-slot": "bento-body", className: cn("nc-type-body-sm text-muted-foreground", className), ...props }));
|
|
57
|
-
}
|
|
58
|
-
function BentoCopy({ className, ...props }) {
|
|
59
|
-
return (_jsx("div", { "data-slot": "bento-copy", className: cn("relative z-10 grid gap-4", className), ...props }));
|
|
60
|
-
}
|
|
61
|
-
function BentoMedia({ className, ...props }) {
|
|
62
|
-
return (_jsx("div", { "data-slot": "bento-media", className: cn("grid min-h-0 items-stretch", className), ...props }));
|
|
63
|
-
}
|
|
64
|
-
function BentoDemo({ className, ...props }) {
|
|
65
|
-
return (_jsx("div", { "data-slot": "bento-demo", className: cn("grid min-h-0 items-stretch", className), ...props }));
|
|
66
|
-
}
|
|
67
|
-
function BentoDivider({ label, className, ...props }) {
|
|
68
|
-
return (_jsx("div", { "data-slot": "bento-divider", className: cn("grid bg-card", className), ...props, children: _jsx("div", { className: "nc-dotted-field grid min-h-[calc(var(--nc-h-bento-strip)*2)] place-items-center bg-card", children: label ? (_jsx("span", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: label })) : null }) }));
|
|
69
|
-
}
|
|
70
|
-
export { Bento, BentoItem, BentoIndex, BentoTitle, BentoBody, BentoCopy, BentoMedia, BentoDemo, BentoDivider, };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
/**
|
|
3
|
-
* card-marketing — the self-contained marketing feature card (replaces the retired
|
|
4
|
-
* `.nc-card-marketing` + its `data-size="lg"` / `data-surface="soft"` / media-slot
|
|
5
|
-
* variants).
|
|
6
|
-
*
|
|
7
|
-
* Unlike the seam-free grid fills (stat-block / quote-card / logo-tile / fact-cell,
|
|
8
|
-
* which are square-cornered for a holding grid), card-marketing is a SELF-CONTAINED
|
|
9
|
-
* rounded card: it owns its full outline — exactly one `line` hairline border and
|
|
10
|
-
* its own `rounded-md` radius — and is laid out in a flow/flex layout with
|
|
11
|
-
* transparent gaps, never inside a seam-painting grid. The optional media slot draws
|
|
12
|
-
* exactly one inner seam (its own bottom border); `overflow-hidden` clips the media's
|
|
13
|
-
* square top corners to the card radius (the card owns the outer radius; the media
|
|
14
|
-
* never re-rounds it). No other layer repeats either coordinate.
|
|
15
|
-
*
|
|
16
|
-
* `size="lg"` steps up to larger padding; `surface="soft"` uses the
|
|
17
|
-
* `canvas-soft` fill. Server-renderable: the media-present padding compression is a
|
|
18
|
-
* `:has()` variant and the title/media sizing is driven by `data-size` descendant
|
|
19
|
-
* selectors on the parent — no client context. Token-only; no `dark:` styling.
|
|
20
|
-
*/
|
|
21
|
-
declare function CardMarketing({ className, size, surface, ...props }: React.ComponentProps<"div"> & {
|
|
22
|
-
size?: "default" | "lg";
|
|
23
|
-
surface?: "canvas" | "soft";
|
|
24
|
-
}): React.JSX.Element;
|
|
25
|
-
declare function CardMarketingMedia({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
26
|
-
declare function CardMarketingEyebrow({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
27
|
-
declare function CardMarketingTitle({ className, ...props }: React.ComponentProps<"h3">): React.JSX.Element;
|
|
28
|
-
declare function CardMarketingBody({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
29
|
-
export { CardMarketing, CardMarketingMedia, CardMarketingEyebrow, CardMarketingTitle, CardMarketingBody, };
|
|
30
|
-
//# sourceMappingURL=card-marketing.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card-marketing.d.ts","sourceRoot":"","sources":["../../src/components/card-marketing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAgB,EAChB,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B,qBA2BA;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW/E;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ/E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ9E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ5E;AAED,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAClB,CAAC"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from "../lib/utils.js";
|
|
3
|
-
/**
|
|
4
|
-
* card-marketing — the self-contained marketing feature card (replaces the retired
|
|
5
|
-
* `.nc-card-marketing` + its `data-size="lg"` / `data-surface="soft"` / media-slot
|
|
6
|
-
* variants).
|
|
7
|
-
*
|
|
8
|
-
* Unlike the seam-free grid fills (stat-block / quote-card / logo-tile / fact-cell,
|
|
9
|
-
* which are square-cornered for a holding grid), card-marketing is a SELF-CONTAINED
|
|
10
|
-
* rounded card: it owns its full outline — exactly one `line` hairline border and
|
|
11
|
-
* its own `rounded-md` radius — and is laid out in a flow/flex layout with
|
|
12
|
-
* transparent gaps, never inside a seam-painting grid. The optional media slot draws
|
|
13
|
-
* exactly one inner seam (its own bottom border); `overflow-hidden` clips the media's
|
|
14
|
-
* square top corners to the card radius (the card owns the outer radius; the media
|
|
15
|
-
* never re-rounds it). No other layer repeats either coordinate.
|
|
16
|
-
*
|
|
17
|
-
* `size="lg"` steps up to larger padding; `surface="soft"` uses the
|
|
18
|
-
* `canvas-soft` fill. Server-renderable: the media-present padding compression is a
|
|
19
|
-
* `:has()` variant and the title/media sizing is driven by `data-size` descendant
|
|
20
|
-
* selectors on the parent — no client context. Token-only; no `dark:` styling.
|
|
21
|
-
*/
|
|
22
|
-
function CardMarketing({ className, size = "default", surface = "canvas", ...props }) {
|
|
23
|
-
return (_jsx("div", { "data-slot": "card-marketing", "data-size": size, "data-surface": surface, className: cn("grid content-start overflow-hidden rounded-md border border-border text-foreground", surface === "soft" ? "bg-[var(--nc-canvas-soft)]" : "bg-card", size === "default" && [
|
|
24
|
-
"gap-3 p-6",
|
|
25
|
-
// media present -> compress padding; the media insets follow (below).
|
|
26
|
-
"has-[[data-slot=card-marketing-media]]:gap-3 has-[[data-slot=card-marketing-media]]:p-4",
|
|
27
|
-
"[&_[data-slot=card-marketing-title]]:text-xl",
|
|
28
|
-
"[&_[data-slot=card-marketing-media]]:-mx-4 [&_[data-slot=card-marketing-media]]:-mt-4 [&_[data-slot=card-marketing-media]]:mb-1",
|
|
29
|
-
], size === "lg" && [
|
|
30
|
-
"gap-4 p-8",
|
|
31
|
-
"has-[[data-slot=card-marketing-media]]:p-6",
|
|
32
|
-
"[&_[data-slot=card-marketing-title]]:text-2xl",
|
|
33
|
-
"[&_[data-slot=card-marketing-media]]:-mx-6 [&_[data-slot=card-marketing-media]]:-mt-6 [&_[data-slot=card-marketing-media]]:mb-1.5",
|
|
34
|
-
], className), ...props }));
|
|
35
|
-
}
|
|
36
|
-
function CardMarketingMedia({ className, ...props }) {
|
|
37
|
-
return (_jsx("div", { "data-slot": "card-marketing-media", className: cn("grid min-h-[132px] place-items-center border-b border-border bg-[var(--nc-canvas-soft)] text-muted-foreground", className), ...props }));
|
|
38
|
-
}
|
|
39
|
-
function CardMarketingEyebrow({ className, ...props }) {
|
|
40
|
-
return (_jsx("p", { "data-slot": "card-marketing-eyebrow", className: cn("m-0 font-mono text-xs font-medium uppercase text-muted-foreground", className), ...props }));
|
|
41
|
-
}
|
|
42
|
-
function CardMarketingTitle({ className, ...props }) {
|
|
43
|
-
return (_jsx("h3", { "data-slot": "card-marketing-title", className: cn("m-0 font-semibold text-foreground", className), ...props }));
|
|
44
|
-
}
|
|
45
|
-
function CardMarketingBody({ className, ...props }) {
|
|
46
|
-
return (_jsx("p", { "data-slot": "card-marketing-body", className: cn("m-0 text-[var(--nc-body)]", className), ...props }));
|
|
47
|
-
}
|
|
48
|
-
export { CardMarketing, CardMarketingMedia, CardMarketingEyebrow, CardMarketingTitle, CardMarketingBody, };
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
/**
|
|
3
|
-
* code-editor-mockup — dark code/terminal preview surface (replaces the retired
|
|
4
|
-
* `.nc-code-editor-mockup`). The brand's technical marketing visual: a dark window
|
|
5
|
-
* (the ink/primary role) with a chrome/title bar over a mono code body. For
|
|
6
|
-
* technical examples, not generic decoration.
|
|
7
|
-
*
|
|
8
|
-
* SINGLE-OWNER SEAMS: the chrome row owns exactly ONE inner hairline — its own
|
|
9
|
-
* bottom border — between itself and the code body. The outer `rounded-md` radius
|
|
10
|
-
* is owned once by the root, and `overflow-hidden` clips the chrome's square top
|
|
11
|
-
* corners to it. The on-dark hairline + dots + muted-on-dark tints are all DERIVED
|
|
12
|
-
* from the brand `line` / `canvas` / `ink` tokens via `color-mix` (the same family
|
|
13
|
-
* the retired dark sections use), so no raw literal is introduced. The dots are
|
|
14
|
-
* NadicodeAI-monochrome, never the macOS traffic-light colours. Token-only;
|
|
15
|
-
* no `dark:` styling.
|
|
16
|
-
*/
|
|
17
|
-
declare function CodeEditorMockup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
18
|
-
declare function CodeEditorMockupChrome({ className, children, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
19
|
-
declare function CodeEditorMockupTitle({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
20
|
-
declare function CodeEditorMockupBody({ className, ...props }: React.ComponentProps<"pre">): React.JSX.Element;
|
|
21
|
-
declare function CodeEditorMockupLine({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
22
|
-
declare function CodeEditorMockupGutter({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
23
|
-
declare function CodeEditorMockupComment({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
24
|
-
export { CodeEditorMockup, CodeEditorMockupChrome, CodeEditorMockupTitle, CodeEditorMockupBody, CodeEditorMockupLine, CodeEditorMockupGutter, CodeEditorMockupComment, };
|
|
25
|
-
//# sourceMappingURL=code-editor-mockup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"code-editor-mockup.d.ts","sourceRoot":"","sources":["../../src/components/code-editor-mockup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;GAcG;AAWH,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7E;AAED,iBAAS,sBAAsB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAkB7F;AAED,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAWnF;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWjF;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAElF;AAED,iBAAS,sBAAsB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAYpF;AAED,iBAAS,uBAAuB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQrF;AAED,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,CAAC"}
|