@hanzo/ui 8.0.61 → 8.0.62
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/dist/backends/gui/input.cjs +4 -3
- package/dist/backends/gui/input.d.ts +10 -2
- package/dist/backends/gui/input.d.ts.map +1 -1
- package/dist/backends/gui/input.js +4 -3
- package/dist/backends/gui/input.js.map +1 -1
- package/dist/backends/gui/mask.cjs +20 -0
- package/dist/backends/gui/mask.d.ts +17 -0
- package/dist/backends/gui/mask.d.ts.map +1 -0
- package/dist/backends/gui/mask.js +17 -0
- package/dist/backends/gui/mask.js.map +1 -0
- package/dist/backends/gui/switch.cjs +16 -2
- package/dist/backends/gui/switch.d.ts +14 -0
- package/dist/backends/gui/switch.d.ts.map +1 -1
- package/dist/backends/gui/switch.js +16 -2
- package/dist/backends/gui/switch.js.map +1 -1
- package/dist/chat/Code.cjs +1 -1
- package/dist/chat/Code.d.ts.map +1 -1
- package/dist/chat/Code.js +1 -1
- package/dist/chat/Code.js.map +1 -1
- package/dist/core/css.cjs +114 -0
- package/dist/core/css.d.ts +46 -0
- package/dist/core/css.d.ts.map +1 -0
- package/dist/core/css.js +112 -0
- package/dist/core/css.js.map +1 -0
- package/dist/product/CopyButton.cjs +16 -2
- package/dist/product/CopyButton.d.ts +30 -3
- package/dist/product/CopyButton.d.ts.map +1 -1
- package/dist/product/CopyButton.js +18 -4
- package/dist/product/CopyButton.js.map +1 -1
- package/dist/product/DataTable.cjs +4 -4
- package/dist/product/DataTable.js +4 -4
- package/dist/product/DataTable.js.map +1 -1
- package/dist/product/FadeIn.cjs +1 -1
- package/dist/product/FadeIn.js +1 -1
- package/dist/product/FadeIn.js.map +1 -1
- package/dist/product/Field.cjs +3 -3
- package/dist/product/Field.d.ts +21 -1
- package/dist/product/Field.d.ts.map +1 -1
- package/dist/product/Field.js +3 -3
- package/dist/product/Field.js.map +1 -1
- package/dist/product/Fieldset.cjs +10 -2
- package/dist/product/Fieldset.d.ts +12 -1
- package/dist/product/Fieldset.d.ts.map +1 -1
- package/dist/product/Fieldset.js +10 -2
- package/dist/product/Fieldset.js.map +1 -1
- package/dist/product/Metric.cjs +7 -4
- package/dist/product/Metric.d.ts +8 -1
- package/dist/product/Metric.d.ts.map +1 -1
- package/dist/product/Metric.js +7 -4
- package/dist/product/Metric.js.map +1 -1
- package/dist/product/Pagination.cjs +9 -49
- package/dist/product/Pagination.d.ts +2 -10
- package/dist/product/Pagination.d.ts.map +1 -1
- package/dist/product/Pagination.js +6 -46
- package/dist/product/Pagination.js.map +1 -1
- package/dist/product/Palette.cjs +65 -0
- package/dist/product/Palette.d.ts +67 -0
- package/dist/product/Palette.d.ts.map +1 -0
- package/dist/product/Palette.js +63 -0
- package/dist/product/Palette.js.map +1 -0
- package/dist/product/Reorder.cjs +1 -1
- package/dist/product/Reorder.js +1 -1
- package/dist/product/Reorder.js.map +1 -1
- package/dist/product/SecretInput.cjs +3 -13
- package/dist/product/SecretInput.d.ts +2 -11
- package/dist/product/SecretInput.d.ts.map +1 -1
- package/dist/product/SecretInput.js +6 -11
- package/dist/product/SecretInput.js.map +1 -1
- package/dist/product/SlideOver.cjs +2 -2
- package/dist/product/SlideOver.js +2 -2
- package/dist/product/SlideOver.js.map +1 -1
- package/dist/product/StatusTag.cjs +10 -39
- package/dist/product/StatusTag.d.ts +6 -2
- package/dist/product/StatusTag.d.ts.map +1 -1
- package/dist/product/StatusTag.js +10 -39
- package/dist/product/StatusTag.js.map +1 -1
- package/dist/product/UserMenu.cjs +4 -10
- package/dist/product/UserMenu.d.ts +2 -3
- package/dist/product/UserMenu.d.ts.map +1 -1
- package/dist/product/UserMenu.js +5 -8
- package/dist/product/UserMenu.js.map +1 -1
- package/dist/product/animatedLogo.logic.cjs +1 -1
- package/dist/product/animatedLogo.logic.js +1 -1
- package/dist/product/brand.cjs +1 -1
- package/dist/product/brand.js +1 -1
- package/dist/product/combobox/filter.cjs +1 -1
- package/dist/product/combobox/filter.js +1 -1
- package/dist/product/index.cjs +21 -3
- package/dist/product/index.d.ts +4 -1
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +20 -1
- package/dist/product/index.js.map +1 -1
- package/dist/product/match.cjs +76 -0
- package/dist/product/match.d.ts +78 -0
- package/dist/product/match.d.ts.map +1 -0
- package/dist/product/match.js +72 -0
- package/dist/product/match.js.map +1 -0
- package/dist/product/name.cjs +17 -0
- package/dist/product/name.d.ts +10 -0
- package/dist/product/name.d.ts.map +1 -0
- package/dist/product/name.js +15 -0
- package/dist/product/name.js.map +1 -0
- package/dist/product/pages.cjs +57 -0
- package/dist/product/pages.d.ts +28 -0
- package/dist/product/pages.d.ts.map +1 -0
- package/dist/product/pages.js +54 -0
- package/dist/product/pages.js.map +1 -0
- package/dist/product/pure.cjs +63 -0
- package/dist/product/pure.d.ts +9 -0
- package/dist/product/pure.d.ts.map +1 -0
- package/dist/product/pure.js +38 -0
- package/dist/product/pure.js.map +1 -0
- package/dist/product/scope.cjs +1 -1
- package/dist/product/scope.js +1 -1
- package/dist/product/social/SocialResource.cjs +1 -1
- package/dist/product/social/SocialResource.js +1 -1
- package/dist/product/social/SocialResource.js.map +1 -1
- package/dist/product/social/SocialSummaryBar.cjs +1 -1
- package/dist/product/social/SocialSummaryBar.js +1 -1
- package/dist/product/social/SocialSummaryBar.js.map +1 -1
- package/dist/product/tone.cjs +105 -0
- package/dist/product/tone.d.ts +52 -0
- package/dist/product/tone.d.ts.map +1 -0
- package/dist/product/tone.js +102 -0
- package/dist/product/tone.js.map +1 -0
- package/dist/product/useCommandK.cjs +46 -0
- package/dist/product/useCommandK.d.ts +4 -0
- package/dist/product/useCommandK.d.ts.map +1 -0
- package/dist/product/useCommandK.js +44 -0
- package/dist/product/useCommandK.js.map +1 -0
- package/dist/styles/motion.css +52 -17
- package/dist/styles.css +62 -29
- package/dist/theme.css +9 -9
- package/package.json +31 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What a status string MEANS, and how a monochrome ladder says it.
|
|
4
|
+
*
|
|
5
|
+
* Provisioned things report free-form lifecycle strings — a cluster is
|
|
6
|
+
* `provisioning`, an invoice is `past_due`, a deploy is `succeeded` — and every
|
|
7
|
+
* list that renders them invented its own vocabulary. This is the one mapping.
|
|
8
|
+
*
|
|
9
|
+
* There are four tones and they are named for the STATE, not for a colour,
|
|
10
|
+
* because this system has no colour to spend: the pills are rungs of the grey
|
|
11
|
+
* ladder. `settled` is the steady state, `moving` is in flight, `stopped` will
|
|
12
|
+
* not proceed without you, `quiet` has nothing to report.
|
|
13
|
+
*
|
|
14
|
+
* `stopped` is set apart by an EDGE rather than a heavier fill, which is the
|
|
15
|
+
* same choice `Fieldset` makes for its destructive register: with hue
|
|
16
|
+
* unavailable, an outline is what distinguishes "this one" from its neighbours.
|
|
17
|
+
* Every tone therefore carries a border — transparent on three of them — so
|
|
18
|
+
* turning one on shifts no layout in a table of fifty rows.
|
|
19
|
+
*
|
|
20
|
+
* Pure data and one pure function: `@hanzo/ui/product/pure` exports both, so a
|
|
21
|
+
* billing surface can assert that `past_due` reads as an alarm without mounting
|
|
22
|
+
* a pill.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.tone = exports.TONE = void 0;
|
|
26
|
+
/** The gui tokens each tone paints with. `as const` keeps the literal types the
|
|
27
|
+
* `bg`/`color`/`borderColor` unions require. */
|
|
28
|
+
exports.TONE = {
|
|
29
|
+
settled: { bg: '$color5', color: '$color12', borderColor: 'transparent' },
|
|
30
|
+
moving: { bg: '$color4', color: '$color12', borderColor: 'transparent' },
|
|
31
|
+
stopped: { bg: '$color4', color: '$color12', borderColor: '$color9' },
|
|
32
|
+
quiet: { bg: '$color3', color: '$color11', borderColor: 'transparent' },
|
|
33
|
+
};
|
|
34
|
+
/** `Past Due`, `past-due` and `PAST_DUE` are the same status. Fold the shapes a
|
|
35
|
+
* dozen backends spell it in down to one key before looking it up. */
|
|
36
|
+
const key = (status) => status.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
37
|
+
const OF = {
|
|
38
|
+
// Platform health verdicts arrive as the traffic-light words themselves (the
|
|
39
|
+
// apps inventory reports green/yellow/red directly), so they are inputs here
|
|
40
|
+
// even though nothing downstream is coloured.
|
|
41
|
+
green: 'settled',
|
|
42
|
+
yellow: 'moving',
|
|
43
|
+
red: 'stopped',
|
|
44
|
+
// Resources and deploys — reached a steady state.
|
|
45
|
+
ready: 'settled',
|
|
46
|
+
active: 'settled',
|
|
47
|
+
running: 'settled',
|
|
48
|
+
available: 'settled',
|
|
49
|
+
ok: 'settled',
|
|
50
|
+
live: 'settled',
|
|
51
|
+
succeeded: 'settled',
|
|
52
|
+
connected: 'settled',
|
|
53
|
+
synced: 'settled',
|
|
54
|
+
imported: 'settled',
|
|
55
|
+
// Resources and deploys — in flight.
|
|
56
|
+
creating: 'moving',
|
|
57
|
+
provisioning: 'moving',
|
|
58
|
+
pending: 'moving',
|
|
59
|
+
updating: 'moving',
|
|
60
|
+
attaching: 'moving',
|
|
61
|
+
building: 'moving',
|
|
62
|
+
deploying: 'moving',
|
|
63
|
+
queued: 'moving',
|
|
64
|
+
importing: 'moving',
|
|
65
|
+
// Resources and deploys — stopped.
|
|
66
|
+
error: 'stopped',
|
|
67
|
+
failed: 'stopped',
|
|
68
|
+
degraded: 'stopped',
|
|
69
|
+
down: 'stopped',
|
|
70
|
+
canceled: 'stopped',
|
|
71
|
+
conflict: 'stopped',
|
|
72
|
+
// Money. An invoice, a charge or a subscription reports its own lifecycle and
|
|
73
|
+
// every billing surface in the fleet re-derived it: `paid` is done, `open` is
|
|
74
|
+
// waiting on the customer, `past_due` is waiting on someone to act, and a
|
|
75
|
+
// `draft` or a `void` invoice is a record of something that never happened.
|
|
76
|
+
paid: 'settled',
|
|
77
|
+
settled: 'settled',
|
|
78
|
+
complete: 'settled',
|
|
79
|
+
completed: 'settled',
|
|
80
|
+
fulfilled: 'settled',
|
|
81
|
+
trialing: 'settled',
|
|
82
|
+
open: 'moving',
|
|
83
|
+
processing: 'moving',
|
|
84
|
+
scheduled: 'moving',
|
|
85
|
+
incomplete: 'moving',
|
|
86
|
+
authorized: 'moving',
|
|
87
|
+
past_due: 'stopped',
|
|
88
|
+
overdue: 'stopped',
|
|
89
|
+
unpaid: 'stopped',
|
|
90
|
+
uncollectible: 'stopped',
|
|
91
|
+
disputed: 'stopped',
|
|
92
|
+
chargeback: 'stopped',
|
|
93
|
+
declined: 'stopped',
|
|
94
|
+
expired: 'stopped',
|
|
95
|
+
draft: 'quiet',
|
|
96
|
+
void: 'quiet',
|
|
97
|
+
voided: 'quiet',
|
|
98
|
+
refunded: 'quiet',
|
|
99
|
+
paused: 'quiet',
|
|
100
|
+
archived: 'quiet',
|
|
101
|
+
};
|
|
102
|
+
/** The tone a status reports in. Anything unrecognised is `quiet` — a status
|
|
103
|
+
* this table has never seen is not an alarm, it is an unknown. */
|
|
104
|
+
const tone = (status) => OF[key(status)] ?? 'quiet';
|
|
105
|
+
exports.tone = tone;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a status string MEANS, and how a monochrome ladder says it.
|
|
3
|
+
*
|
|
4
|
+
* Provisioned things report free-form lifecycle strings — a cluster is
|
|
5
|
+
* `provisioning`, an invoice is `past_due`, a deploy is `succeeded` — and every
|
|
6
|
+
* list that renders them invented its own vocabulary. This is the one mapping.
|
|
7
|
+
*
|
|
8
|
+
* There are four tones and they are named for the STATE, not for a colour,
|
|
9
|
+
* because this system has no colour to spend: the pills are rungs of the grey
|
|
10
|
+
* ladder. `settled` is the steady state, `moving` is in flight, `stopped` will
|
|
11
|
+
* not proceed without you, `quiet` has nothing to report.
|
|
12
|
+
*
|
|
13
|
+
* `stopped` is set apart by an EDGE rather than a heavier fill, which is the
|
|
14
|
+
* same choice `Fieldset` makes for its destructive register: with hue
|
|
15
|
+
* unavailable, an outline is what distinguishes "this one" from its neighbours.
|
|
16
|
+
* Every tone therefore carries a border — transparent on three of them — so
|
|
17
|
+
* turning one on shifts no layout in a table of fifty rows.
|
|
18
|
+
*
|
|
19
|
+
* Pure data and one pure function: `@hanzo/ui/product/pure` exports both, so a
|
|
20
|
+
* billing surface can assert that `past_due` reads as an alarm without mounting
|
|
21
|
+
* a pill.
|
|
22
|
+
*/
|
|
23
|
+
/** The register a status reports in. */
|
|
24
|
+
export type Tone = 'settled' | 'moving' | 'stopped' | 'quiet';
|
|
25
|
+
/** The gui tokens each tone paints with. `as const` keeps the literal types the
|
|
26
|
+
* `bg`/`color`/`borderColor` unions require. */
|
|
27
|
+
export declare const TONE: {
|
|
28
|
+
readonly settled: {
|
|
29
|
+
readonly bg: "$color5";
|
|
30
|
+
readonly color: "$color12";
|
|
31
|
+
readonly borderColor: "transparent";
|
|
32
|
+
};
|
|
33
|
+
readonly moving: {
|
|
34
|
+
readonly bg: "$color4";
|
|
35
|
+
readonly color: "$color12";
|
|
36
|
+
readonly borderColor: "transparent";
|
|
37
|
+
};
|
|
38
|
+
readonly stopped: {
|
|
39
|
+
readonly bg: "$color4";
|
|
40
|
+
readonly color: "$color12";
|
|
41
|
+
readonly borderColor: "$color9";
|
|
42
|
+
};
|
|
43
|
+
readonly quiet: {
|
|
44
|
+
readonly bg: "$color3";
|
|
45
|
+
readonly color: "$color11";
|
|
46
|
+
readonly borderColor: "transparent";
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/** The tone a status reports in. Anything unrecognised is `quiet` — a status
|
|
50
|
+
* this table has never seen is not an alarm, it is an unknown. */
|
|
51
|
+
export declare const tone: (status: string) => Tone;
|
|
52
|
+
//# sourceMappingURL=tone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tone.d.ts","sourceRoot":"","sources":["../../src/product/tone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wCAAwC;AACxC,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;AAE7D;iDACiD;AACjD,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;CAKP,CAAA;AA+EV;mEACmE;AACnE,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,KAAG,IAAkC,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a status string MEANS, and how a monochrome ladder says it.
|
|
3
|
+
*
|
|
4
|
+
* Provisioned things report free-form lifecycle strings — a cluster is
|
|
5
|
+
* `provisioning`, an invoice is `past_due`, a deploy is `succeeded` — and every
|
|
6
|
+
* list that renders them invented its own vocabulary. This is the one mapping.
|
|
7
|
+
*
|
|
8
|
+
* There are four tones and they are named for the STATE, not for a colour,
|
|
9
|
+
* because this system has no colour to spend: the pills are rungs of the grey
|
|
10
|
+
* ladder. `settled` is the steady state, `moving` is in flight, `stopped` will
|
|
11
|
+
* not proceed without you, `quiet` has nothing to report.
|
|
12
|
+
*
|
|
13
|
+
* `stopped` is set apart by an EDGE rather than a heavier fill, which is the
|
|
14
|
+
* same choice `Fieldset` makes for its destructive register: with hue
|
|
15
|
+
* unavailable, an outline is what distinguishes "this one" from its neighbours.
|
|
16
|
+
* Every tone therefore carries a border — transparent on three of them — so
|
|
17
|
+
* turning one on shifts no layout in a table of fifty rows.
|
|
18
|
+
*
|
|
19
|
+
* Pure data and one pure function: `@hanzo/ui/product/pure` exports both, so a
|
|
20
|
+
* billing surface can assert that `past_due` reads as an alarm without mounting
|
|
21
|
+
* a pill.
|
|
22
|
+
*/
|
|
23
|
+
/** The gui tokens each tone paints with. `as const` keeps the literal types the
|
|
24
|
+
* `bg`/`color`/`borderColor` unions require. */
|
|
25
|
+
export const TONE = {
|
|
26
|
+
settled: { bg: '$color5', color: '$color12', borderColor: 'transparent' },
|
|
27
|
+
moving: { bg: '$color4', color: '$color12', borderColor: 'transparent' },
|
|
28
|
+
stopped: { bg: '$color4', color: '$color12', borderColor: '$color9' },
|
|
29
|
+
quiet: { bg: '$color3', color: '$color11', borderColor: 'transparent' },
|
|
30
|
+
};
|
|
31
|
+
/** `Past Due`, `past-due` and `PAST_DUE` are the same status. Fold the shapes a
|
|
32
|
+
* dozen backends spell it in down to one key before looking it up. */
|
|
33
|
+
const key = (status) => status.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
34
|
+
const OF = {
|
|
35
|
+
// Platform health verdicts arrive as the traffic-light words themselves (the
|
|
36
|
+
// apps inventory reports green/yellow/red directly), so they are inputs here
|
|
37
|
+
// even though nothing downstream is coloured.
|
|
38
|
+
green: 'settled',
|
|
39
|
+
yellow: 'moving',
|
|
40
|
+
red: 'stopped',
|
|
41
|
+
// Resources and deploys — reached a steady state.
|
|
42
|
+
ready: 'settled',
|
|
43
|
+
active: 'settled',
|
|
44
|
+
running: 'settled',
|
|
45
|
+
available: 'settled',
|
|
46
|
+
ok: 'settled',
|
|
47
|
+
live: 'settled',
|
|
48
|
+
succeeded: 'settled',
|
|
49
|
+
connected: 'settled',
|
|
50
|
+
synced: 'settled',
|
|
51
|
+
imported: 'settled',
|
|
52
|
+
// Resources and deploys — in flight.
|
|
53
|
+
creating: 'moving',
|
|
54
|
+
provisioning: 'moving',
|
|
55
|
+
pending: 'moving',
|
|
56
|
+
updating: 'moving',
|
|
57
|
+
attaching: 'moving',
|
|
58
|
+
building: 'moving',
|
|
59
|
+
deploying: 'moving',
|
|
60
|
+
queued: 'moving',
|
|
61
|
+
importing: 'moving',
|
|
62
|
+
// Resources and deploys — stopped.
|
|
63
|
+
error: 'stopped',
|
|
64
|
+
failed: 'stopped',
|
|
65
|
+
degraded: 'stopped',
|
|
66
|
+
down: 'stopped',
|
|
67
|
+
canceled: 'stopped',
|
|
68
|
+
conflict: 'stopped',
|
|
69
|
+
// Money. An invoice, a charge or a subscription reports its own lifecycle and
|
|
70
|
+
// every billing surface in the fleet re-derived it: `paid` is done, `open` is
|
|
71
|
+
// waiting on the customer, `past_due` is waiting on someone to act, and a
|
|
72
|
+
// `draft` or a `void` invoice is a record of something that never happened.
|
|
73
|
+
paid: 'settled',
|
|
74
|
+
settled: 'settled',
|
|
75
|
+
complete: 'settled',
|
|
76
|
+
completed: 'settled',
|
|
77
|
+
fulfilled: 'settled',
|
|
78
|
+
trialing: 'settled',
|
|
79
|
+
open: 'moving',
|
|
80
|
+
processing: 'moving',
|
|
81
|
+
scheduled: 'moving',
|
|
82
|
+
incomplete: 'moving',
|
|
83
|
+
authorized: 'moving',
|
|
84
|
+
past_due: 'stopped',
|
|
85
|
+
overdue: 'stopped',
|
|
86
|
+
unpaid: 'stopped',
|
|
87
|
+
uncollectible: 'stopped',
|
|
88
|
+
disputed: 'stopped',
|
|
89
|
+
chargeback: 'stopped',
|
|
90
|
+
declined: 'stopped',
|
|
91
|
+
expired: 'stopped',
|
|
92
|
+
draft: 'quiet',
|
|
93
|
+
void: 'quiet',
|
|
94
|
+
voided: 'quiet',
|
|
95
|
+
refunded: 'quiet',
|
|
96
|
+
paused: 'quiet',
|
|
97
|
+
archived: 'quiet',
|
|
98
|
+
};
|
|
99
|
+
/** The tone a status reports in. Anything unrecognised is `quiet` — a status
|
|
100
|
+
* this table has never seen is not an alarm, it is an unknown. */
|
|
101
|
+
export const tone = (status) => OF[key(status)] ?? 'quiet';
|
|
102
|
+
//# sourceMappingURL=tone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tone.js","sourceRoot":"","sources":["../../src/product/tone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH;iDACiD;AACjD,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IACzE,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IACxE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE;IACrE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;CAC/D,CAAA;AAEV;uEACuE;AACvE,MAAM,GAAG,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;AAE/F,MAAM,EAAE,GAAyB;IAC/B,6EAA6E;IAC7E,6EAA6E;IAC7E,8CAA8C;IAC9C,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,SAAS;IAEd,kDAAkD;IAClD,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IAEnB,qCAAqC;IACrC,QAAQ,EAAE,QAAQ;IAClB,YAAY,EAAE,QAAQ;IACtB,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,QAAQ;IAEnB,mCAAmC;IACnC,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IAEnB,8EAA8E;IAC9E,8EAA8E;IAC9E,0EAA0E;IAC1E,4EAA4E;IAC5E,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,SAAS;IAEnB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,UAAU,EAAE,QAAQ;IAEpB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,SAAS;IAElB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;CAClB,CAAA;AAED;mEACmE;AACnE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAc,EAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.useCommandK = useCommandK;
|
|
5
|
+
/**
|
|
6
|
+
* useCommandK — the ONE keybinding for the command palette.
|
|
7
|
+
*
|
|
8
|
+
* ⌘K / Ctrl-K always toggles (even from a text field — it is the universal
|
|
9
|
+
* palette shortcut and nothing else may claim it). `/` also opens it, but ONLY
|
|
10
|
+
* when the user is NOT typing in a field, so a slash inside an input, a textarea
|
|
11
|
+
* or a contenteditable types a slash. Pass `slash: false` to bind ⌘K alone.
|
|
12
|
+
*
|
|
13
|
+
* That second rule is why chat needs no exception written for it. Its composer is
|
|
14
|
+
* a TEXTAREA, so the global `/` never fires there and the composer's own prompts
|
|
15
|
+
* popover keeps the key it has. The same rule makes a `/` typed into the palette's
|
|
16
|
+
* own input a literal slash. There is no precedence to encode — the one condition
|
|
17
|
+
* already answers all three, and the instinct to add an exception would be adding
|
|
18
|
+
* dead code.
|
|
19
|
+
*
|
|
20
|
+
* One hook, so every surface that hosts the palette shares identical behaviour
|
|
21
|
+
* instead of a divergent inline listener each. It moved here from hanzo.app,
|
|
22
|
+
* which is where it was already correct.
|
|
23
|
+
*/
|
|
24
|
+
const react_1 = require("react");
|
|
25
|
+
function isEditable(target) {
|
|
26
|
+
const el = target;
|
|
27
|
+
if (!el || typeof HTMLElement === "undefined" || !(el instanceof HTMLElement))
|
|
28
|
+
return false;
|
|
29
|
+
const tag = el.tagName;
|
|
30
|
+
return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || el.isContentEditable;
|
|
31
|
+
}
|
|
32
|
+
function useCommandK(onTrigger, opts) {
|
|
33
|
+
const slash = opts?.slash !== false;
|
|
34
|
+
(0, react_1.useEffect)(() => {
|
|
35
|
+
const onKey = (e) => {
|
|
36
|
+
const cmdK = (e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === "k";
|
|
37
|
+
const slashKey = slash && e.key === "/" && !e.metaKey && !e.ctrlKey && !e.altKey && !isEditable(e.target);
|
|
38
|
+
if (cmdK || slashKey) {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
onTrigger();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
window.addEventListener("keydown", onKey);
|
|
44
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
45
|
+
}, [onTrigger, slash]);
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommandK.d.ts","sourceRoot":"","sources":["../../src/product/useCommandK.ts"],"names":[],"mappings":"AA8BA,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAenF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* useCommandK — the ONE keybinding for the command palette.
|
|
4
|
+
*
|
|
5
|
+
* ⌘K / Ctrl-K always toggles (even from a text field — it is the universal
|
|
6
|
+
* palette shortcut and nothing else may claim it). `/` also opens it, but ONLY
|
|
7
|
+
* when the user is NOT typing in a field, so a slash inside an input, a textarea
|
|
8
|
+
* or a contenteditable types a slash. Pass `slash: false` to bind ⌘K alone.
|
|
9
|
+
*
|
|
10
|
+
* That second rule is why chat needs no exception written for it. Its composer is
|
|
11
|
+
* a TEXTAREA, so the global `/` never fires there and the composer's own prompts
|
|
12
|
+
* popover keeps the key it has. The same rule makes a `/` typed into the palette's
|
|
13
|
+
* own input a literal slash. There is no precedence to encode — the one condition
|
|
14
|
+
* already answers all three, and the instinct to add an exception would be adding
|
|
15
|
+
* dead code.
|
|
16
|
+
*
|
|
17
|
+
* One hook, so every surface that hosts the palette shares identical behaviour
|
|
18
|
+
* instead of a divergent inline listener each. It moved here from hanzo.app,
|
|
19
|
+
* which is where it was already correct.
|
|
20
|
+
*/
|
|
21
|
+
import { useEffect } from "react";
|
|
22
|
+
function isEditable(target) {
|
|
23
|
+
const el = target;
|
|
24
|
+
if (!el || typeof HTMLElement === "undefined" || !(el instanceof HTMLElement))
|
|
25
|
+
return false;
|
|
26
|
+
const tag = el.tagName;
|
|
27
|
+
return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT" || el.isContentEditable;
|
|
28
|
+
}
|
|
29
|
+
export function useCommandK(onTrigger, opts) {
|
|
30
|
+
const slash = opts?.slash !== false;
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const onKey = (e) => {
|
|
33
|
+
const cmdK = (e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === "k";
|
|
34
|
+
const slashKey = slash && e.key === "/" && !e.metaKey && !e.ctrlKey && !e.altKey && !isEditable(e.target);
|
|
35
|
+
if (cmdK || slashKey) {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
onTrigger();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
window.addEventListener("keydown", onKey);
|
|
41
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
42
|
+
}, [onTrigger, slash]);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=useCommandK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommandK.js","sourceRoot":"","sources":["../../src/product/useCommandK.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,SAAS,UAAU,CAAC,MAA0B;IAC5C,MAAM,EAAE,GAAG,MAA4B,CAAA;IACvC,IAAI,CAAC,EAAE,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,CAAC,CAAC,EAAE,YAAY,WAAW,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3F,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAA;IACtB,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,IAAI,EAAE,CAAC,iBAAiB,CAAA;AAC1F,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAqB,EAAE,IAA0B;IAC3E,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,KAAK,CAAA;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAA;YACjF,MAAM,QAAQ,GACZ,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YAC1F,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACrB,CAAC,CAAC,cAAc,EAAE,CAAA;gBAClB,SAAS,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAA;QACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACzC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;AACxB,CAAC"}
|
package/dist/styles/motion.css
CHANGED
|
@@ -4,11 +4,25 @@
|
|
|
4
4
|
transitions the Gui-driven inline width/transform/opacity. Every animation is
|
|
5
5
|
guarded by `prefers-reduced-motion: reduce`.
|
|
6
6
|
|
|
7
|
-
Import once at the app root: import '@hanzo/ui/styles/motion.css'
|
|
7
|
+
Import once at the app root: import '@hanzo/ui/styles/motion.css'
|
|
8
|
+
|
|
9
|
+
── EVERY CLASS HERE IS `hz-` PREFIXED, and it was not always ────────────────
|
|
10
|
+
This sheet used to claim `.row`, `.skeleton`, `.fade`, `.mono`, `.drag` and
|
|
11
|
+
`.tnum` — six of the most ordinary words in anyone's CSS — at the document
|
|
12
|
+
level, in a package an app imports once at its root. An app with its own
|
|
13
|
+
`.row` did not get a warning; it got whichever rule the cascade preferred, in
|
|
14
|
+
a stylesheet it never opened. A library's utility classes are its namespace,
|
|
15
|
+
so they carry its name.
|
|
16
|
+
|
|
17
|
+
The unprefixed selectors are kept as aliases on the SAME rule for one minor
|
|
18
|
+
version so nothing breaks mid-flight, and are REMOVED IN 8.1.0. Nothing in
|
|
19
|
+
this package emits them any more — they exist only for a consumer who typed
|
|
20
|
+
`className="skeleton"` against the old sheet. Keyframe names are prefixed too
|
|
21
|
+
and have no alias: nothing outside this file ever referenced them. */
|
|
8
22
|
|
|
9
23
|
/* Fade-up entrance — <FadeIn> applies the class + a per-item stagger delay.
|
|
10
24
|
~0.4s ease-out, small upward travel (matches the hanzo.ai marketing feel). */
|
|
11
|
-
@keyframes fade-up {
|
|
25
|
+
@keyframes hz-fade-up {
|
|
12
26
|
from {
|
|
13
27
|
opacity: 0;
|
|
14
28
|
transform: translateY(10px);
|
|
@@ -19,12 +33,14 @@
|
|
|
19
33
|
}
|
|
20
34
|
}
|
|
21
35
|
|
|
36
|
+
.hz-fade-up,
|
|
22
37
|
.fade-up {
|
|
23
|
-
animation: fade-up 0.4s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
38
|
+
animation: hz-fade-up 0.4s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
24
39
|
will-change: transform, opacity;
|
|
25
40
|
}
|
|
26
41
|
|
|
27
42
|
@media (prefers-reduced-motion: reduce) {
|
|
43
|
+
.hz-fade-up,
|
|
28
44
|
.fade-up {
|
|
29
45
|
animation: none;
|
|
30
46
|
}
|
|
@@ -32,27 +48,32 @@
|
|
|
32
48
|
|
|
33
49
|
/* Shell chrome motion — sidebar collapse (width) and the Linear-style two-level
|
|
34
50
|
nav slide (transform); backdrop cross-fade behind a SlideOver / dialog. */
|
|
51
|
+
.hz-collapse,
|
|
35
52
|
.collapse {
|
|
36
53
|
transition: width 220ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
37
54
|
will-change: width;
|
|
38
55
|
}
|
|
39
56
|
|
|
57
|
+
.hz-slide,
|
|
40
58
|
.slide {
|
|
41
59
|
transition: transform 260ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
42
60
|
will-change: transform;
|
|
43
61
|
}
|
|
44
62
|
|
|
63
|
+
.hz-fade,
|
|
45
64
|
.fade {
|
|
46
65
|
transition: opacity 240ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
47
66
|
will-change: opacity;
|
|
48
67
|
}
|
|
49
68
|
|
|
50
69
|
/* Drag-to-reorder — a pinned row while it is being dragged (pointer DnD). The
|
|
51
|
-
lifted row gets a subtle lift; siblings ease into place via `.slide`. */
|
|
70
|
+
lifted row gets a subtle lift; siblings ease into place via `.hz-slide`. */
|
|
71
|
+
.hz-drag,
|
|
52
72
|
.drag {
|
|
53
73
|
touch-action: none;
|
|
54
74
|
transition: transform 180ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
55
75
|
}
|
|
76
|
+
.hz-drag[data-dragging='true'],
|
|
56
77
|
.drag[data-dragging='true'] {
|
|
57
78
|
transition: none;
|
|
58
79
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
|
|
@@ -61,9 +82,13 @@
|
|
|
61
82
|
}
|
|
62
83
|
|
|
63
84
|
@media (prefers-reduced-motion: reduce) {
|
|
85
|
+
.hz-collapse,
|
|
64
86
|
.collapse,
|
|
87
|
+
.hz-slide,
|
|
65
88
|
.slide,
|
|
89
|
+
.hz-fade,
|
|
66
90
|
.fade,
|
|
91
|
+
.hz-drag,
|
|
67
92
|
.drag {
|
|
68
93
|
transition: none;
|
|
69
94
|
}
|
|
@@ -75,7 +100,7 @@
|
|
|
75
100
|
a brief highlight when a freshly-arrived row lands. */
|
|
76
101
|
|
|
77
102
|
/* Skeleton shimmer — an honest "loading", never fabricated content. */
|
|
78
|
-
@keyframes shimmer {
|
|
103
|
+
@keyframes hz-shimmer {
|
|
79
104
|
0% {
|
|
80
105
|
background-position: -160px 0;
|
|
81
106
|
}
|
|
@@ -84,6 +109,7 @@
|
|
|
84
109
|
}
|
|
85
110
|
}
|
|
86
111
|
|
|
112
|
+
.hz-skeleton,
|
|
87
113
|
.skeleton {
|
|
88
114
|
background-color: var(--color3, rgba(148, 163, 184, 0.14));
|
|
89
115
|
background-image: linear-gradient(
|
|
@@ -94,11 +120,11 @@
|
|
|
94
120
|
);
|
|
95
121
|
background-size: 160px 100%;
|
|
96
122
|
background-repeat: no-repeat;
|
|
97
|
-
animation: shimmer 1.2s ease-in-out infinite;
|
|
123
|
+
animation: hz-shimmer 1.2s ease-in-out infinite;
|
|
98
124
|
}
|
|
99
125
|
|
|
100
126
|
/* Live-feed pulse — the "Live" dot on a streaming panel. */
|
|
101
|
-
@keyframes pulse {
|
|
127
|
+
@keyframes hz-pulse {
|
|
102
128
|
0%,
|
|
103
129
|
100% {
|
|
104
130
|
opacity: 1;
|
|
@@ -111,7 +137,7 @@
|
|
|
111
137
|
}
|
|
112
138
|
|
|
113
139
|
/* Entrance for a freshly-arrived activity row (staggerless — one row at a time). */
|
|
114
|
-
@keyframes row-in {
|
|
140
|
+
@keyframes hz-row-in {
|
|
115
141
|
from {
|
|
116
142
|
opacity: 0;
|
|
117
143
|
transform: translateY(-6px);
|
|
@@ -122,27 +148,31 @@
|
|
|
122
148
|
}
|
|
123
149
|
}
|
|
124
150
|
|
|
151
|
+
.hz-row-in,
|
|
125
152
|
.row-in {
|
|
126
|
-
animation: row-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
153
|
+
animation: hz-row-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
127
154
|
}
|
|
128
155
|
|
|
129
156
|
@media (prefers-reduced-motion: reduce) {
|
|
157
|
+
.hz-skeleton,
|
|
130
158
|
.skeleton {
|
|
131
159
|
animation: none;
|
|
132
160
|
}
|
|
161
|
+
.hz-row-in,
|
|
133
162
|
.row-in {
|
|
134
163
|
animation: none;
|
|
135
164
|
}
|
|
136
165
|
}
|
|
137
166
|
|
|
138
167
|
/* ── Typography + surface classes the product layer's components reference ──────
|
|
139
|
-
DataTable/Metric typeset numeric cells with `mono`/`tnum`; ComboBox and
|
|
140
|
-
SelectMenu paint their popovers with `paper menu-in`; DataTable rows use
|
|
141
|
-
`row`. They travel WITH the components (this is the package's one
|
|
142
|
-
so any host that imports `@hanzo/ui/styles/motion.css` renders them
|
|
143
|
-
The elevation/ring variables fall back to sane values, so a host
|
|
144
|
-
own `--hz-*` theme tokens (the console does) still wins. */
|
|
168
|
+
DataTable/Metric typeset numeric cells with `hz-mono`/`hz-tnum`; ComboBox and
|
|
169
|
+
SelectMenu paint their popovers with `hz-paper hz-menu-in`; DataTable rows use
|
|
170
|
+
`hz-row`. They travel WITH the components (this is the package's one
|
|
171
|
+
stylesheet) so any host that imports `@hanzo/ui/styles/motion.css` renders them
|
|
172
|
+
correctly. The elevation/ring variables fall back to sane values, so a host
|
|
173
|
+
that defines its own `--hz-*` theme tokens (the console does) still wins. */
|
|
145
174
|
|
|
175
|
+
.hz-tnum,
|
|
146
176
|
.tnum {
|
|
147
177
|
font-variant-numeric: tabular-nums;
|
|
148
178
|
font-feature-settings: 'tnum' 1;
|
|
@@ -150,6 +180,7 @@
|
|
|
150
180
|
|
|
151
181
|
/* Data/numeric face — Geist Mono + tabular figures for metric values, prices, IDs
|
|
152
182
|
and counts, so numbers read as precise, column-aligned data. */
|
|
183
|
+
.hz-mono,
|
|
153
184
|
.mono {
|
|
154
185
|
font-family: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
155
186
|
font-variant-numeric: tabular-nums;
|
|
@@ -170,13 +201,14 @@
|
|
|
170
201
|
order — so paper lost its drop on dark exactly the way the rungs did. The
|
|
171
202
|
fallback stays because this sheet ships on its own: a host that imports
|
|
172
203
|
motion.css without glass.css has no ladder to read. */
|
|
204
|
+
.hz-paper,
|
|
173
205
|
.paper {
|
|
174
206
|
box-shadow: var(--shadow-inset-hairline, inset 0 0 0 1px rgb(255 255 255 / .10)),
|
|
175
207
|
var(--edge-highlight, inset 0 1px 0 0 rgb(255 255 255 / .10)),
|
|
176
208
|
var(--glass-shadow-2, 0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55));
|
|
177
209
|
}
|
|
178
210
|
|
|
179
|
-
@keyframes menu-in {
|
|
211
|
+
@keyframes hz-menu-in {
|
|
180
212
|
from {
|
|
181
213
|
opacity: 0;
|
|
182
214
|
}
|
|
@@ -185,16 +217,19 @@
|
|
|
185
217
|
}
|
|
186
218
|
}
|
|
187
219
|
|
|
220
|
+
.hz-menu-in,
|
|
188
221
|
.menu-in {
|
|
189
|
-
animation: menu-in 140ms ease-out both;
|
|
222
|
+
animation: hz-menu-in 140ms ease-out both;
|
|
190
223
|
will-change: opacity;
|
|
191
224
|
}
|
|
192
225
|
|
|
226
|
+
.hz-row,
|
|
193
227
|
.row {
|
|
194
228
|
transition: background-color 140ms ease-out;
|
|
195
229
|
}
|
|
196
230
|
|
|
197
231
|
@media (prefers-reduced-motion: reduce) {
|
|
232
|
+
.hz-menu-in,
|
|
198
233
|
.menu-in {
|
|
199
234
|
animation: none;
|
|
200
235
|
}
|