@youcan/celeste 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai/component-registry.json +49 -2
- package/ai/component-registry.md +24 -2
- package/ai/icons.md +1 -1
- package/ai/tokens.md +1 -1
- package/dist/celeste.css +213 -0
- package/dist/cjs/chunks/components.cjs +2 -0
- package/dist/cjs/chunks/mochi.cjs +168 -0
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/mochi.cjs +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/mochi/index.d.ts +2 -0
- package/dist/components/mochi/mochi.d.ts +22 -0
- package/dist/es/chunks/components.js +2 -0
- package/dist/es/chunks/mochi.js +162 -0
- package/dist/es/index.js +2 -1
- package/dist/es/mochi.js +2 -0
- package/package.json +3 -3
- package/src/components/index.ts +1 -0
- package/src/components/mochi/index.ts +2 -0
- package/src/components/mochi/mochi.vue +480 -0
- package/src/components/mochi/stories/mochi.stories.ts +105 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "0.
|
|
4
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"version": "0.14.0",
|
|
4
|
+
"generatedAt": "2026-09-14T14:40:49.235Z",
|
|
5
5
|
"components": {
|
|
6
6
|
"Alert": {
|
|
7
7
|
"name": "Alert",
|
|
@@ -4261,6 +4261,53 @@
|
|
|
4261
4261
|
"story": "src/components/button/stories/link-button.stories.ts",
|
|
4262
4262
|
"hasStory": true
|
|
4263
4263
|
},
|
|
4264
|
+
"Mochi": {
|
|
4265
|
+
"name": "Mochi",
|
|
4266
|
+
"group": "mochi",
|
|
4267
|
+
"file": "src/components/mochi/mochi.vue",
|
|
4268
|
+
"import": "@youcan/celeste",
|
|
4269
|
+
"props": [
|
|
4270
|
+
{
|
|
4271
|
+
"name": "animate",
|
|
4272
|
+
"type": "boolean",
|
|
4273
|
+
"required": false,
|
|
4274
|
+
"default": "false"
|
|
4275
|
+
},
|
|
4276
|
+
{
|
|
4277
|
+
"name": "class",
|
|
4278
|
+
"type": "ClassValue",
|
|
4279
|
+
"required": false
|
|
4280
|
+
},
|
|
4281
|
+
{
|
|
4282
|
+
"name": "idle",
|
|
4283
|
+
"type": "boolean",
|
|
4284
|
+
"required": false,
|
|
4285
|
+
"default": "false"
|
|
4286
|
+
},
|
|
4287
|
+
{
|
|
4288
|
+
"name": "size",
|
|
4289
|
+
"type": "number",
|
|
4290
|
+
"required": false,
|
|
4291
|
+
"default": "40"
|
|
4292
|
+
},
|
|
4293
|
+
{
|
|
4294
|
+
"name": "thinking",
|
|
4295
|
+
"type": "boolean",
|
|
4296
|
+
"required": false,
|
|
4297
|
+
"default": "false"
|
|
4298
|
+
}
|
|
4299
|
+
],
|
|
4300
|
+
"events": [
|
|
4301
|
+
{
|
|
4302
|
+
"name": "update:idle",
|
|
4303
|
+
"type": "[value: boolean]"
|
|
4304
|
+
}
|
|
4305
|
+
],
|
|
4306
|
+
"slots": [],
|
|
4307
|
+
"siblings": [],
|
|
4308
|
+
"story": "src/components/mochi/stories/mochi.stories.ts",
|
|
4309
|
+
"hasStory": true
|
|
4310
|
+
},
|
|
4264
4311
|
"Modal": {
|
|
4265
4312
|
"name": "Modal",
|
|
4266
4313
|
"group": "modal",
|
package/ai/component-registry.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Celeste Component Registry
|
|
2
2
|
|
|
3
|
-
> Generated from source for `@youcan/celeste@0.
|
|
3
|
+
> Generated from source for `@youcan/celeste@0.14.0`. Do not edit.
|
|
4
4
|
> Regenerate with `pnpm --filter @youcan/celeste codegen:registry`.
|
|
5
5
|
|
|
6
6
|
Every component below is imported from `@youcan/celeste`:
|
|
@@ -9,7 +9,7 @@ Every component below is imported from `@youcan/celeste`:
|
|
|
9
9
|
import { Badge, Button } from '@youcan/celeste';
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
**
|
|
12
|
+
**147 components** in 40 groups.
|
|
13
13
|
|
|
14
14
|
This file describes what each component _accepts_. For which component to
|
|
15
15
|
reach for when several look similar, see the `celeste-ui` skill.
|
|
@@ -1386,6 +1386,28 @@ reach for when several look similar, see the `celeste-ui` skill.
|
|
|
1386
1386
|
|
|
1387
1387
|
---
|
|
1388
1388
|
|
|
1389
|
+
## mochi
|
|
1390
|
+
|
|
1391
|
+
### Mochi
|
|
1392
|
+
|
|
1393
|
+
**Props**
|
|
1394
|
+
|
|
1395
|
+
- `animate`: `boolean` — default `false`
|
|
1396
|
+
- `class`: `ClassValue`
|
|
1397
|
+
- `idle`: `boolean` — default `false`
|
|
1398
|
+
- `size`: `number` — default `40`
|
|
1399
|
+
- `thinking`: `boolean` — default `false`
|
|
1400
|
+
|
|
1401
|
+
**Events**
|
|
1402
|
+
|
|
1403
|
+
- `update:idle`: `[value: boolean]`
|
|
1404
|
+
|
|
1405
|
+
**Source:** `src/components/mochi/mochi.vue`
|
|
1406
|
+
|
|
1407
|
+
**Example:** `src/components/mochi/stories/mochi.stories.ts`
|
|
1408
|
+
|
|
1409
|
+
---
|
|
1410
|
+
|
|
1389
1411
|
## modal
|
|
1390
1412
|
|
|
1391
1413
|
### Modal
|
package/ai/icons.md
CHANGED
package/ai/tokens.md
CHANGED
package/dist/celeste.css
CHANGED
|
@@ -4615,6 +4615,219 @@ to {
|
|
|
4615
4615
|
.celeste-label[aria-disabled=true][data-v-5ae119db]::after, .celeste-label[aria-disabled=true][data-v-5ae119db] > a,
|
|
4616
4616
|
.celeste-label[aria-disabled=true] .celeste-sublabel[data-v-5ae119db] {
|
|
4617
4617
|
color: inherit;
|
|
4618
|
+
}.celeste-mochi[data-v-ce7048d3] {
|
|
4619
|
+
--mochi-size: var(--v51b30026);
|
|
4620
|
+
--mochi-rotate: var(--v54792142);
|
|
4621
|
+
position: relative;
|
|
4622
|
+
flex: none;
|
|
4623
|
+
width: var(--mochi-size);
|
|
4624
|
+
height: var(--mochi-size);
|
|
4625
|
+
overflow: hidden;
|
|
4626
|
+
border-radius: calc(var(--mochi-size) * 0.2222);
|
|
4627
|
+
background: linear-gradient(180deg, var(--color-brand-300) 0%, #f90171 100%);
|
|
4628
|
+
isolation: isolate;
|
|
4629
|
+
}
|
|
4630
|
+
.celeste-mochi[data-v-ce7048d3]::after {
|
|
4631
|
+
content: "";
|
|
4632
|
+
position: absolute;
|
|
4633
|
+
inset: 0;
|
|
4634
|
+
border-radius: inherit;
|
|
4635
|
+
box-shadow: inset 0 0 0 max(1px, var(--mochi-size) * 0.0278) var(--color-brand-200);
|
|
4636
|
+
pointer-events: none;
|
|
4637
|
+
}
|
|
4638
|
+
.celeste-mochi[data-v-ce7048d3] > * {
|
|
4639
|
+
position: absolute;
|
|
4640
|
+
}
|
|
4641
|
+
.celeste-mochi-stage[data-v-ce7048d3] {
|
|
4642
|
+
inset: 0;
|
|
4643
|
+
transform: rotate(var(--mochi-rotate));
|
|
4644
|
+
}
|
|
4645
|
+
.celeste-mochi-chan[data-v-ce7048d3] {
|
|
4646
|
+
position: absolute;
|
|
4647
|
+
top: 24%;
|
|
4648
|
+
left: -15%;
|
|
4649
|
+
width: 129.4%;
|
|
4650
|
+
height: 140.9%;
|
|
4651
|
+
transition: transform 0.38s cubic-bezier(0.3, -0.4, 0.7, 0.2);
|
|
4652
|
+
}
|
|
4653
|
+
.celeste-mochi-body[data-v-ce7048d3] {
|
|
4654
|
+
position: absolute;
|
|
4655
|
+
inset: 0;
|
|
4656
|
+
border-radius: 50%;
|
|
4657
|
+
background: var(--color-brand-400);
|
|
4658
|
+
box-shadow: inset 0 calc(var(--mochi-size) * 0.242) calc(var(--mochi-size) * 0.4015) rgba(255, 255, 255, 0.8), inset 0 calc(var(--mochi-size) * 0.363) calc(var(--mochi-size) * 0.2826) var(--color-brand-300);
|
|
4659
|
+
}
|
|
4660
|
+
.celeste-mochi-eyes[data-v-ce7048d3] {
|
|
4661
|
+
--eye-top: 12.8%;
|
|
4662
|
+
--eye-h: 19.4%;
|
|
4663
|
+
position: absolute;
|
|
4664
|
+
transform-origin: 50% calc(var(--eye-top) + var(--eye-h) / 2);
|
|
4665
|
+
transition: transform 0.7s ease-in-out;
|
|
4666
|
+
pointer-events: none;
|
|
4667
|
+
inset: 0;
|
|
4668
|
+
}
|
|
4669
|
+
.celeste-mochi-eye[data-v-ce7048d3] {
|
|
4670
|
+
position: absolute;
|
|
4671
|
+
top: var(--eye-top);
|
|
4672
|
+
width: 13.6%;
|
|
4673
|
+
height: var(--eye-h);
|
|
4674
|
+
overflow: hidden;
|
|
4675
|
+
border-radius: var(--radius-full);
|
|
4676
|
+
background: linear-gradient(180deg, var(--color-static-white) 0%, rgba(255, 255, 255, 0.6) 100%);
|
|
4677
|
+
filter: drop-shadow(0 calc(var(--mochi-size) * 0.0305) calc(var(--mochi-size) * 0.0153) var(--color-pink-500));
|
|
4678
|
+
}
|
|
4679
|
+
.celeste-mochi-eye-l[data-v-ce7048d3] {
|
|
4680
|
+
left: 31.5%;
|
|
4681
|
+
}
|
|
4682
|
+
.celeste-mochi-eye-r[data-v-ce7048d3] {
|
|
4683
|
+
right: 31.5%;
|
|
4684
|
+
}
|
|
4685
|
+
.celeste-mochi-peek-drop .celeste-mochi-eye[data-v-ce7048d3],
|
|
4686
|
+
.celeste-mochi-peek-hidden .celeste-mochi-eye[data-v-ce7048d3],
|
|
4687
|
+
.celeste-mochi-peek-out .celeste-mochi-eye[data-v-ce7048d3] {
|
|
4688
|
+
height: calc(var(--eye-h) * 80 / 112);
|
|
4689
|
+
border-bottom-right-radius: 0;
|
|
4690
|
+
border-bottom-left-radius: 0;
|
|
4691
|
+
}
|
|
4692
|
+
.celeste-mochi-peek-drop .celeste-mochi-eye[data-v-ce7048d3] {
|
|
4693
|
+
animation: celeste-mochi-squint-ce7048d3 0.25s ease-in-out 1s both;
|
|
4694
|
+
}
|
|
4695
|
+
.celeste-mochi[data-anim=blink-twice] .celeste-mochi-eye[data-v-ce7048d3],
|
|
4696
|
+
.celeste-mochi[data-anim=look-blink-twice] .celeste-mochi-eye[data-v-ce7048d3] {
|
|
4697
|
+
animation: celeste-mochi-blink-twice-ce7048d3 3.5s linear both;
|
|
4698
|
+
}
|
|
4699
|
+
.celeste-mochi[data-anim=blink-once] .celeste-mochi-eye[data-v-ce7048d3],
|
|
4700
|
+
.celeste-mochi[data-anim=look-blink-once] .celeste-mochi-eye[data-v-ce7048d3] {
|
|
4701
|
+
animation: celeste-mochi-blink-once-ce7048d3 3.5s linear both;
|
|
4702
|
+
}
|
|
4703
|
+
.celeste-mochi[data-anim=look-blink-twice] .celeste-mochi-eyes[data-v-ce7048d3] {
|
|
4704
|
+
animation: celeste-mochi-look-after-blink-twice-ce7048d3 3.5s linear both;
|
|
4705
|
+
}
|
|
4706
|
+
.celeste-mochi[data-anim=look-blink-once] .celeste-mochi-eyes[data-v-ce7048d3] {
|
|
4707
|
+
animation: celeste-mochi-look-after-blink-once-ce7048d3 3.5s linear both;
|
|
4708
|
+
}
|
|
4709
|
+
.celeste-mochi-thinking .celeste-mochi-eyes[data-v-ce7048d3] {
|
|
4710
|
+
transform: translate(3.77%, -3.118%) rotate(-7deg);
|
|
4711
|
+
transition: transform 0.6s ease-out;
|
|
4712
|
+
}
|
|
4713
|
+
.celeste-mochi-thinking .celeste-mochi-eye[data-v-ce7048d3] {
|
|
4714
|
+
animation: celeste-mochi-blink-twice-ce7048d3 3.5s linear 1s infinite;
|
|
4715
|
+
}
|
|
4716
|
+
.celeste-mochi-peek-drop .celeste-mochi-chan[data-v-ce7048d3] {
|
|
4717
|
+
animation: celeste-mochi-drop-ce7048d3 2.01s linear both;
|
|
4718
|
+
}
|
|
4719
|
+
.celeste-mochi-peek-hidden .celeste-mochi-chan[data-v-ce7048d3] {
|
|
4720
|
+
transform: translateY(calc(var(--mochi-size) * 0.754));
|
|
4721
|
+
}
|
|
4722
|
+
.celeste-mochi-peek-out .celeste-mochi-chan[data-v-ce7048d3] {
|
|
4723
|
+
transform: translateY(calc(var(--mochi-size) * 0.295));
|
|
4724
|
+
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
4725
|
+
}
|
|
4726
|
+
.celeste-mochi-peek-home .celeste-mochi-chan[data-v-ce7048d3] {
|
|
4727
|
+
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
4728
|
+
}
|
|
4729
|
+
@media (prefers-reduced-motion: reduce) {
|
|
4730
|
+
.celeste-mochi[data-v-ce7048d3] * {
|
|
4731
|
+
transition-duration: 1ms !important;
|
|
4732
|
+
animation-duration: 1ms !important;
|
|
4733
|
+
animation-delay: 0s !important;
|
|
4734
|
+
animation-iteration-count: 1 !important;
|
|
4735
|
+
}
|
|
4736
|
+
}
|
|
4737
|
+
@keyframes celeste-mochi-blink-twice-ce7048d3 {
|
|
4738
|
+
0%, 4.57%, 8% {
|
|
4739
|
+
top: var(--eye-top);
|
|
4740
|
+
height: var(--eye-h);
|
|
4741
|
+
animation-timing-function: ease-in;
|
|
4742
|
+
}
|
|
4743
|
+
2.29%, 10.29% {
|
|
4744
|
+
top: calc(var(--eye-top) + var(--eye-h) / 2);
|
|
4745
|
+
height: 0;
|
|
4746
|
+
animation-timing-function: ease-out;
|
|
4747
|
+
}
|
|
4748
|
+
12.57%, 100% {
|
|
4749
|
+
top: var(--eye-top);
|
|
4750
|
+
height: var(--eye-h);
|
|
4751
|
+
}
|
|
4752
|
+
}
|
|
4753
|
+
@keyframes celeste-mochi-blink-once-ce7048d3 {
|
|
4754
|
+
0% {
|
|
4755
|
+
top: var(--eye-top);
|
|
4756
|
+
height: var(--eye-h);
|
|
4757
|
+
animation-timing-function: ease-in;
|
|
4758
|
+
}
|
|
4759
|
+
2.29% {
|
|
4760
|
+
top: calc(var(--eye-top) + var(--eye-h) / 2);
|
|
4761
|
+
height: 0;
|
|
4762
|
+
animation-timing-function: ease-out;
|
|
4763
|
+
}
|
|
4764
|
+
4.57%, 100% {
|
|
4765
|
+
top: var(--eye-top);
|
|
4766
|
+
height: var(--eye-h);
|
|
4767
|
+
}
|
|
4768
|
+
}
|
|
4769
|
+
@keyframes celeste-mochi-look-after-blink-twice-ce7048d3 {
|
|
4770
|
+
0%, 14.29% {
|
|
4771
|
+
transform: translate(0, 0);
|
|
4772
|
+
animation-timing-function: ease-out;
|
|
4773
|
+
}
|
|
4774
|
+
22.86%, 42.86% {
|
|
4775
|
+
transform: translate(3.393%, 1.386%);
|
|
4776
|
+
animation-timing-function: ease-in-out;
|
|
4777
|
+
}
|
|
4778
|
+
54.29%, 74.29% {
|
|
4779
|
+
transform: translate(-3.393%, 1.386%);
|
|
4780
|
+
animation-timing-function: ease-in-out;
|
|
4781
|
+
}
|
|
4782
|
+
85.71%, 100% {
|
|
4783
|
+
transform: translate(0, 0);
|
|
4784
|
+
}
|
|
4785
|
+
}
|
|
4786
|
+
@keyframes celeste-mochi-look-after-blink-once-ce7048d3 {
|
|
4787
|
+
0%, 8.57% {
|
|
4788
|
+
transform: translate(0, 0);
|
|
4789
|
+
animation-timing-function: ease-out;
|
|
4790
|
+
}
|
|
4791
|
+
17.14%, 37.14% {
|
|
4792
|
+
transform: translate(3.393%, 1.386%);
|
|
4793
|
+
animation-timing-function: ease-in-out;
|
|
4794
|
+
}
|
|
4795
|
+
48.57%, 68.57% {
|
|
4796
|
+
transform: translate(-3.393%, 1.386%);
|
|
4797
|
+
animation-timing-function: ease-in-out;
|
|
4798
|
+
}
|
|
4799
|
+
80%, 100% {
|
|
4800
|
+
transform: translate(0, 0);
|
|
4801
|
+
}
|
|
4802
|
+
}
|
|
4803
|
+
@keyframes celeste-mochi-squint-ce7048d3 {
|
|
4804
|
+
from {
|
|
4805
|
+
height: var(--eye-h);
|
|
4806
|
+
border-bottom-right-radius: var(--radius-full);
|
|
4807
|
+
border-bottom-left-radius: var(--radius-full);
|
|
4808
|
+
}
|
|
4809
|
+
to {
|
|
4810
|
+
height: calc(var(--eye-h) * 80 / 112);
|
|
4811
|
+
border-bottom-right-radius: 0;
|
|
4812
|
+
border-bottom-left-radius: 0;
|
|
4813
|
+
}
|
|
4814
|
+
}
|
|
4815
|
+
@keyframes celeste-mochi-drop-ce7048d3 {
|
|
4816
|
+
0% {
|
|
4817
|
+
transform: translateY(0);
|
|
4818
|
+
animation-timing-function: cubic-bezier(0.43, -0.3, 0.74, 0.33);
|
|
4819
|
+
}
|
|
4820
|
+
21.4% {
|
|
4821
|
+
transform: translateY(calc(var(--mochi-size) * -0.0082));
|
|
4822
|
+
animation-timing-function: cubic-bezier(0.3, -0.05, 0.7, -0.5);
|
|
4823
|
+
}
|
|
4824
|
+
44.28%, 68.15% {
|
|
4825
|
+
transform: translateY(calc(var(--mochi-size) * 0.754));
|
|
4826
|
+
animation-timing-function: linear(0, 0.048, 0.168, 0.326, 0.497, 0.66, 0.804, 0.921, 1.009, 1.068, 1.103, 1.118, 1.118, 1.107, 1.089, 1.069, 1.049, 1.031, 1.015, 1.003, 0.995, 0.989, 0.986, 0.986, 0.987, 0.988, 0.991, 0.993, 0.995, 0.997, 0.999, 1, 1.001, 1.002, 1.002, 1.002, 1.001, 1.001, 1.001, 1.001, 1);
|
|
4827
|
+
}
|
|
4828
|
+
100% {
|
|
4829
|
+
transform: translateY(calc(var(--mochi-size) * 0.295));
|
|
4830
|
+
}
|
|
4618
4831
|
}.celeste-modal-body[data-v-8872ed90] {
|
|
4619
4832
|
padding: var(--spacing-16);
|
|
4620
4833
|
}
|
|
@@ -91,6 +91,7 @@ const require_tooltip_provider = require("./tooltip-provider.cjs");
|
|
|
91
91
|
const require_tooltip_root = require("./tooltip-root.cjs");
|
|
92
92
|
const require_tooltip = require("./tooltip.cjs");
|
|
93
93
|
const require_label = require("./label2.cjs");
|
|
94
|
+
const require_mochi = require("./mochi.cjs");
|
|
94
95
|
const require_modal_body = require("./modal-body.cjs");
|
|
95
96
|
const require_modal_close = require("./modal-close.cjs");
|
|
96
97
|
const require_modal_content = require("./modal-content.cjs");
|
|
@@ -222,6 +223,7 @@ var components_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
|
222
223
|
HueSlider: () => require_hue_slider.hue_slider_default,
|
|
223
224
|
Label: () => require_label.label_default,
|
|
224
225
|
LinkButton: () => require_link_button.link_button_default,
|
|
226
|
+
Mochi: () => require_mochi.mochi_default,
|
|
225
227
|
Modal: () => require_modal.modal_default,
|
|
226
228
|
ModalBody: () => require_modal_body.modal_body_default,
|
|
227
229
|
ModalClose: () => require_modal_close.modal_close_default,
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
const require_clsx = require("./clsx.cjs");
|
|
2
|
+
const require__plugin_vue_export_helper = require("./_plugin-vue_export-helper.cjs");
|
|
3
|
+
let vue = require("vue");
|
|
4
|
+
//#region src/components/mochi/mochi.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
+
var _hoisted_1 = ["data-anim"];
|
|
6
|
+
var DROP_DURATION = 2010;
|
|
7
|
+
var HIDE_DURATION = 420;
|
|
8
|
+
var SETTLE_DURATION = 500;
|
|
9
|
+
var mochi_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
|
|
10
|
+
__name: "mochi",
|
|
11
|
+
props: /*@__PURE__*/ (0, vue.mergeModels)({
|
|
12
|
+
class: { type: [
|
|
13
|
+
Boolean,
|
|
14
|
+
null,
|
|
15
|
+
String,
|
|
16
|
+
Object,
|
|
17
|
+
Array
|
|
18
|
+
] },
|
|
19
|
+
size: { default: 40 },
|
|
20
|
+
animate: {
|
|
21
|
+
type: Boolean,
|
|
22
|
+
default: false
|
|
23
|
+
},
|
|
24
|
+
thinking: {
|
|
25
|
+
type: Boolean,
|
|
26
|
+
default: false
|
|
27
|
+
}
|
|
28
|
+
}, {
|
|
29
|
+
"idle": {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: false
|
|
32
|
+
},
|
|
33
|
+
"idleModifiers": {}
|
|
34
|
+
}),
|
|
35
|
+
emits: ["update:idle"],
|
|
36
|
+
setup(__props) {
|
|
37
|
+
(0, vue.useCssVars)((_ctx) => ({
|
|
38
|
+
"v51b30026": sizePx.value,
|
|
39
|
+
"v54792142": rotate.value
|
|
40
|
+
}));
|
|
41
|
+
const props = __props;
|
|
42
|
+
const idle = (0, vue.useModel)(__props, "idle");
|
|
43
|
+
const durations = {
|
|
44
|
+
"blink-twice": 440,
|
|
45
|
+
"blink-once": 160,
|
|
46
|
+
"look-blink-twice": 3e3,
|
|
47
|
+
"look-blink-once": 2800
|
|
48
|
+
};
|
|
49
|
+
const weights = [
|
|
50
|
+
["blink-twice", 35],
|
|
51
|
+
["blink-once", 35],
|
|
52
|
+
["look-blink-twice", 15],
|
|
53
|
+
["look-blink-once", 15]
|
|
54
|
+
];
|
|
55
|
+
const rotation = {
|
|
56
|
+
bottom: "0deg",
|
|
57
|
+
right: "-90deg",
|
|
58
|
+
top: "180deg",
|
|
59
|
+
left: "90deg"
|
|
60
|
+
};
|
|
61
|
+
const order = [
|
|
62
|
+
"bottom",
|
|
63
|
+
"right",
|
|
64
|
+
"top",
|
|
65
|
+
"left"
|
|
66
|
+
];
|
|
67
|
+
const anim = (0, vue.ref)("");
|
|
68
|
+
const peek = (0, vue.ref)("");
|
|
69
|
+
const peekSide = (0, vue.ref)("bottom");
|
|
70
|
+
const sizePx = (0, vue.computed)(() => `${props.size}px`);
|
|
71
|
+
const rotate = (0, vue.computed)(() => rotation[peekSide.value]);
|
|
72
|
+
let retired = false;
|
|
73
|
+
let frame;
|
|
74
|
+
let timer;
|
|
75
|
+
let peekTimer;
|
|
76
|
+
function pick() {
|
|
77
|
+
let r = Math.random() * 100;
|
|
78
|
+
for (const [name, weight] of weights) {
|
|
79
|
+
r -= weight;
|
|
80
|
+
if (r <= 0) return name;
|
|
81
|
+
}
|
|
82
|
+
return "blink-twice";
|
|
83
|
+
}
|
|
84
|
+
function cycle() {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
cancelAnimationFrame(frame ?? 0);
|
|
87
|
+
anim.value = "";
|
|
88
|
+
if (!props.animate || peek.value) return;
|
|
89
|
+
frame = requestAnimationFrame(() => {
|
|
90
|
+
const next = pick();
|
|
91
|
+
anim.value = next;
|
|
92
|
+
timer = setTimeout(cycle, durations[next] + 800 + Math.random() * 1600);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function later(fn, ms) {
|
|
96
|
+
clearTimeout(peekTimer);
|
|
97
|
+
peekTimer = setTimeout(fn, ms);
|
|
98
|
+
}
|
|
99
|
+
function drop() {
|
|
100
|
+
peekSide.value = "bottom";
|
|
101
|
+
peek.value = "drop";
|
|
102
|
+
cycle();
|
|
103
|
+
later(() => {
|
|
104
|
+
peek.value = "out";
|
|
105
|
+
}, DROP_DURATION);
|
|
106
|
+
}
|
|
107
|
+
function settle() {
|
|
108
|
+
peekSide.value = "bottom";
|
|
109
|
+
peek.value = "home";
|
|
110
|
+
later(() => {
|
|
111
|
+
peek.value = "";
|
|
112
|
+
cycle();
|
|
113
|
+
}, SETTLE_DURATION);
|
|
114
|
+
}
|
|
115
|
+
function hop() {
|
|
116
|
+
peek.value = "hidden";
|
|
117
|
+
later(() => {
|
|
118
|
+
const next = order[(order.indexOf(peekSide.value) + 1) % order.length];
|
|
119
|
+
if (next === "bottom") {
|
|
120
|
+
retired = true;
|
|
121
|
+
settle();
|
|
122
|
+
idle.value = false;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
peekSide.value = next;
|
|
126
|
+
peek.value = "out";
|
|
127
|
+
}, HIDE_DURATION);
|
|
128
|
+
}
|
|
129
|
+
function poke() {
|
|
130
|
+
if (peek.value === "out") hop();
|
|
131
|
+
else if (!peek.value && props.animate && !retired) idle.value = true;
|
|
132
|
+
}
|
|
133
|
+
(0, vue.watch)(() => idle.value && props.animate, (active) => {
|
|
134
|
+
if (active && !retired && !peek.value) drop();
|
|
135
|
+
else if (!active && peek.value && peek.value !== "home") {
|
|
136
|
+
peek.value = "hidden";
|
|
137
|
+
later(settle, HIDE_DURATION);
|
|
138
|
+
}
|
|
139
|
+
}, { immediate: true });
|
|
140
|
+
(0, vue.watch)(() => props.animate, cycle);
|
|
141
|
+
(0, vue.onMounted)(cycle);
|
|
142
|
+
(0, vue.onBeforeUnmount)(() => {
|
|
143
|
+
cancelAnimationFrame(frame ?? 0);
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
clearTimeout(peekTimer);
|
|
146
|
+
});
|
|
147
|
+
return (_ctx, _cache) => {
|
|
148
|
+
return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
149
|
+
class: (0, vue.normalizeClass)((0, vue.unref)(require_clsx.clsx)("celeste-mochi", peek.value && `celeste-mochi-peek-${peek.value}`, props.thinking && "celeste-mochi-thinking", props.class)),
|
|
150
|
+
"data-anim": anim.value || void 0,
|
|
151
|
+
"aria-hidden": "true"
|
|
152
|
+
}, [(0, vue.createElementVNode)("div", { class: "celeste-mochi-stage" }, [(0, vue.createElementVNode)("div", { class: "celeste-mochi-chan" }, [(0, vue.createElementVNode)("div", {
|
|
153
|
+
class: "celeste-mochi-body",
|
|
154
|
+
onClick: poke
|
|
155
|
+
}), _cache[0] || (_cache[0] = (0, vue.createElementVNode)("div", { class: "celeste-mochi-eyes" }, [(0, vue.createElementVNode)("div", { class: "celeste-mochi-eye celeste-mochi-eye-l" }), (0, vue.createElementVNode)("div", { class: "celeste-mochi-eye celeste-mochi-eye-r" })], -1))])])], 10, _hoisted_1);
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/components/mochi/mochi.vue
|
|
161
|
+
var mochi_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(mochi_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ce7048d3"]]);
|
|
162
|
+
//#endregion
|
|
163
|
+
Object.defineProperty(exports, "mochi_default", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
get: function() {
|
|
166
|
+
return mochi_default;
|
|
167
|
+
}
|
|
168
|
+
});
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -99,6 +99,7 @@ const require_tooltip_provider = require("./chunks/tooltip-provider.cjs");
|
|
|
99
99
|
const require_tooltip_root = require("./chunks/tooltip-root.cjs");
|
|
100
100
|
const require_tooltip = require("./chunks/tooltip.cjs");
|
|
101
101
|
const require_label = require("./chunks/label2.cjs");
|
|
102
|
+
const require_mochi = require("./chunks/mochi.cjs");
|
|
102
103
|
const require_modal_body = require("./chunks/modal-body.cjs");
|
|
103
104
|
const require_modal_close = require("./chunks/modal-close.cjs");
|
|
104
105
|
const require_modal_content = require("./chunks/modal-content.cjs");
|
|
@@ -281,6 +282,7 @@ exports.HintText = require_hint_text.hint_text_default;
|
|
|
281
282
|
exports.HueSlider = require_hue_slider.hue_slider_default;
|
|
282
283
|
exports.Label = require_label.label_default;
|
|
283
284
|
exports.LinkButton = require_link_button.link_button_default;
|
|
285
|
+
exports.Mochi = require_mochi.mochi_default;
|
|
284
286
|
exports.Modal = require_modal.modal_default;
|
|
285
287
|
exports.ModalBody = require_modal_body.modal_body_default;
|
|
286
288
|
exports.ModalClose = require_modal_close.modal_close_default;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'vue';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
class?: HTMLAttributes['class'];
|
|
4
|
+
size?: number;
|
|
5
|
+
animate?: boolean;
|
|
6
|
+
thinking?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type __VLS_ModelProps = {
|
|
9
|
+
'idle'?: boolean;
|
|
10
|
+
};
|
|
11
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
12
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
13
|
+
"update:idle": (value: boolean) => any;
|
|
14
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
15
|
+
"onUpdate:idle"?: ((value: boolean) => any) | undefined;
|
|
16
|
+
}>, {
|
|
17
|
+
size: number;
|
|
18
|
+
animate: boolean;
|
|
19
|
+
thinking: boolean;
|
|
20
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
21
|
+
declare const _default: typeof __VLS_export;
|
|
22
|
+
export default _default;
|
|
@@ -91,6 +91,7 @@ import { t as tooltip_provider_default } from "./tooltip-provider.js";
|
|
|
91
91
|
import { t as tooltip_root_default } from "./tooltip-root.js";
|
|
92
92
|
import { t as tooltip_default } from "./tooltip.js";
|
|
93
93
|
import { t as label_default } from "./label2.js";
|
|
94
|
+
import { t as mochi_default } from "./mochi.js";
|
|
94
95
|
import { t as modal_body_default } from "./modal-body.js";
|
|
95
96
|
import { t as modal_close_default } from "./modal-close.js";
|
|
96
97
|
import { t as modal_content_default } from "./modal-content.js";
|
|
@@ -222,6 +223,7 @@ var components_exports = /* @__PURE__ */ __exportAll({
|
|
|
222
223
|
HueSlider: () => hue_slider_default,
|
|
223
224
|
Label: () => label_default,
|
|
224
225
|
LinkButton: () => link_button_default,
|
|
226
|
+
Mochi: () => mochi_default,
|
|
225
227
|
Modal: () => modal_default,
|
|
226
228
|
ModalBody: () => modal_body_default,
|
|
227
229
|
ModalClose: () => modal_close_default,
|