stimeo-ui 0.1.0.pre.alpha.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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +72 -0
- data/dist/controllers/accordion_controller.js +76 -0
- data/dist/controllers/announcer_controller.js +184 -0
- data/dist/controllers/aspect_ratio_controller.js +36 -0
- data/dist/controllers/auto_submit_controller.js +147 -0
- data/dist/controllers/avatar_controller.js +66 -0
- data/dist/controllers/breadcrumb_controller.js +123 -0
- data/dist/controllers/bulk_select_controller.js +104 -0
- data/dist/controllers/calendar_controller.js +394 -0
- data/dist/controllers/character_counter_controller.js +179 -0
- data/dist/controllers/checkbox_controller.js +73 -0
- data/dist/controllers/combobox_controller.js +186 -0
- data/dist/controllers/command_palette_controller.js +381 -0
- data/dist/controllers/conditional_fields_controller.js +112 -0
- data/dist/controllers/confirm_controller.js +276 -0
- data/dist/controllers/context_menu_controller.js +112 -0
- data/dist/controllers/countdown_controller.js +202 -0
- data/dist/controllers/dialog_controller.js +207 -0
- data/dist/controllers/direct_upload_controller.js +212 -0
- data/dist/controllers/dirty_form_controller.js +128 -0
- data/dist/controllers/dropdown_controller.js +66 -0
- data/dist/controllers/empty_state_controller.js +67 -0
- data/dist/controllers/flash_controller.js +221 -0
- data/dist/controllers/focus_controller.js +216 -0
- data/dist/controllers/form_field_controller.js +154 -0
- data/dist/controllers/form_validation_controller.js +202 -0
- data/dist/controllers/frame_loading_controller.js +177 -0
- data/dist/controllers/highlight_controller.js +107 -0
- data/dist/controllers/hover_card_controller.js +165 -0
- data/dist/controllers/idle_controller.js +141 -0
- data/dist/controllers/input_mask_controller.js +166 -0
- data/dist/controllers/lazy_frame_controller.js +68 -0
- data/dist/controllers/listbox_controller.js +256 -0
- data/dist/controllers/local_time_controller.js +81 -0
- data/dist/controllers/menu_controller.js +134 -0
- data/dist/controllers/meter_controller.js +96 -0
- data/dist/controllers/nested_form_controller.js +131 -0
- data/dist/controllers/network_status_controller.js +126 -0
- data/dist/controllers/number_input_controller.js +306 -0
- data/dist/controllers/otp_controller.js +201 -0
- data/dist/controllers/overflow_indicator_controller.js +169 -0
- data/dist/controllers/overflow_menu_controller.js +274 -0
- data/dist/controllers/pagination_controller.js +89 -0
- data/dist/controllers/password_strength_controller.js +175 -0
- data/dist/controllers/persist_controller.js +259 -0
- data/dist/controllers/popover_controller.js +94 -0
- data/dist/controllers/portal_controller.js +63 -0
- data/dist/controllers/preview_guard_controller.js +69 -0
- data/dist/controllers/progress_controller.js +93 -0
- data/dist/controllers/radio_group_controller.js +128 -0
- data/dist/controllers/rating_controller.js +179 -0
- data/dist/controllers/relative_time_controller.js +129 -0
- data/dist/controllers/reset_before_cache_controller.js +62 -0
- data/dist/controllers/resizable_controller.js +163 -0
- data/dist/controllers/roving_controller.js +116 -0
- data/dist/controllers/scroll_area_controller.js +183 -0
- data/dist/controllers/scroll_visibility_controller.js +103 -0
- data/dist/controllers/scrollspy_controller.js +171 -0
- data/dist/controllers/skeleton_controller.js +125 -0
- data/dist/controllers/slider_controller.js +109 -0
- data/dist/controllers/spinner_controller.js +164 -0
- data/dist/controllers/step_indicator_controller.js +55 -0
- data/dist/controllers/stepper_controller.js +78 -0
- data/dist/controllers/stick_to_bottom_controller.js +100 -0
- data/dist/controllers/sticky_observer_controller.js +53 -0
- data/dist/controllers/submit_once_controller.js +206 -0
- data/dist/controllers/switch_controller.js +50 -0
- data/dist/controllers/tabs_controller.js +63 -0
- data/dist/controllers/textarea_autosize_controller.js +72 -0
- data/dist/controllers/theme_controller.js +154 -0
- data/dist/controllers/toast_controller.js +310 -0
- data/dist/controllers/toggle_group_controller.js +130 -0
- data/dist/controllers/toolbar_controller.js +113 -0
- data/dist/controllers/tooltip_controller.js +165 -0
- data/dist/controllers/transition_controller.js +203 -0
- data/dist/index.js +12241 -0
- data/dist/positioning/index.js +145 -0
- data/lib/generators/stimeo/install/install_generator.rb +114 -0
- data/lib/generators/stimeo/install/templates/stimeo.js +12 -0
- data/lib/stimeo/ui/version.rb +10 -0
- data/lib/stimeo/ui.rb +19 -0
- data/lib/stimeo-ui.rb +4 -0
- metadata +152 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Controller } from '@hotwired/stimulus';
|
|
2
|
+
|
|
3
|
+
// src/controllers/tooltip_controller.ts
|
|
4
|
+
|
|
5
|
+
// src/utils/safe_timeout.ts
|
|
6
|
+
var TimerRegistry = class {
|
|
7
|
+
/** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
|
|
8
|
+
ids = /* @__PURE__ */ new Set();
|
|
9
|
+
/**
|
|
10
|
+
* Cancels a single tracked timer.
|
|
11
|
+
*
|
|
12
|
+
* No-ops if the id is unknown (already cleared, fired, or never owned by this
|
|
13
|
+
* registry), so callers can clear defensively without guarding.
|
|
14
|
+
*/
|
|
15
|
+
clear(id) {
|
|
16
|
+
if (this.ids.delete(id)) {
|
|
17
|
+
this.cancel(id);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Cancels every tracked timer. Call this from a controller's `disconnect()`
|
|
22
|
+
* to guarantee no timer outlives the element.
|
|
23
|
+
*/
|
|
24
|
+
clearAll() {
|
|
25
|
+
for (const id of this.ids) {
|
|
26
|
+
this.cancel(id);
|
|
27
|
+
}
|
|
28
|
+
this.ids.clear();
|
|
29
|
+
}
|
|
30
|
+
/** Number of timers currently tracked (pending). */
|
|
31
|
+
get size() {
|
|
32
|
+
return this.ids.size;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var SafeTimeout = class extends TimerRegistry {
|
|
36
|
+
/**
|
|
37
|
+
* Schedules `callback` after `delay` ms and returns the timer id.
|
|
38
|
+
*
|
|
39
|
+
* The id is removed from the registry automatically when the timeout fires,
|
|
40
|
+
* so {@link TimerRegistry.size | size} reflects only still-pending timers.
|
|
41
|
+
*/
|
|
42
|
+
set(callback, delay) {
|
|
43
|
+
const id = this.schedule(() => {
|
|
44
|
+
this.ids.delete(id);
|
|
45
|
+
callback();
|
|
46
|
+
}, delay);
|
|
47
|
+
this.ids.add(id);
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
schedule(callback, delay) {
|
|
51
|
+
return window.setTimeout(callback, delay);
|
|
52
|
+
}
|
|
53
|
+
cancel(id) {
|
|
54
|
+
window.clearTimeout(id);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// src/controllers/tooltip_controller.ts
|
|
59
|
+
var TooltipController = class extends Controller {
|
|
60
|
+
static targets = ["trigger", "content"];
|
|
61
|
+
static values = {
|
|
62
|
+
showDelay: { type: Number, default: 0 },
|
|
63
|
+
hideDelay: { type: Number, default: 0 }
|
|
64
|
+
};
|
|
65
|
+
static actions = ["hide", "onKeydown", "show"];
|
|
66
|
+
/** Pending show/hide timers, torn down together on disconnect. */
|
|
67
|
+
#timers = new SafeTimeout();
|
|
68
|
+
/** The id of the currently pending show or hide timer, if any. */
|
|
69
|
+
#pendingShow = null;
|
|
70
|
+
#pendingHide = null;
|
|
71
|
+
/** Starts hidden. */
|
|
72
|
+
connect() {
|
|
73
|
+
this.#conceal();
|
|
74
|
+
}
|
|
75
|
+
/** Clears timers and the document `Escape` listener so nothing outlives the element. */
|
|
76
|
+
disconnect() {
|
|
77
|
+
this.#timers.clearAll();
|
|
78
|
+
document.removeEventListener("keydown", this.#onDocumentKeydown);
|
|
79
|
+
}
|
|
80
|
+
/** Shows the tooltip, after `showDelay` ms (or immediately at 0). Cancels a pending hide. */
|
|
81
|
+
show() {
|
|
82
|
+
this.#cancelHide();
|
|
83
|
+
if (this.#isVisible || this.#pendingShow !== null) return;
|
|
84
|
+
if (this.showDelayValue <= 0) {
|
|
85
|
+
this.#reveal();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.#pendingShow = this.#timers.set(() => {
|
|
89
|
+
this.#pendingShow = null;
|
|
90
|
+
this.#reveal();
|
|
91
|
+
}, this.showDelayValue);
|
|
92
|
+
}
|
|
93
|
+
/** Hides the tooltip, after `hideDelay` ms (or immediately at 0). Cancels a pending show. */
|
|
94
|
+
hide() {
|
|
95
|
+
this.#cancelShow();
|
|
96
|
+
if (!this.#isVisible || this.#pendingHide !== null) return;
|
|
97
|
+
if (this.hideDelayValue <= 0) {
|
|
98
|
+
this.#conceal();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.#pendingHide = this.#timers.set(() => {
|
|
102
|
+
this.#pendingHide = null;
|
|
103
|
+
this.#conceal();
|
|
104
|
+
}, this.hideDelayValue);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Dismisses the tooltip on `Escape` from the trigger. The authoritative
|
|
108
|
+
* dismissal path is the document-level listener (added while shown) so a
|
|
109
|
+
* hover-triggered tooltip is dismissible regardless of focus; this handler
|
|
110
|
+
* keeps the documented `keydown->#onKeydown` binding meaningful too.
|
|
111
|
+
*/
|
|
112
|
+
onKeydown(event) {
|
|
113
|
+
if (event.key === "Escape" && this.#isVisible) {
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
this.#cancelShow();
|
|
116
|
+
this.#cancelHide();
|
|
117
|
+
this.#conceal();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Reveals the content and starts watching for a dismissing `Escape`. */
|
|
121
|
+
#reveal() {
|
|
122
|
+
if (!this.hasContentTarget) return;
|
|
123
|
+
this.contentTarget.hidden = false;
|
|
124
|
+
this.contentTarget.setAttribute("data-state", "open");
|
|
125
|
+
document.addEventListener("keydown", this.#onDocumentKeydown);
|
|
126
|
+
}
|
|
127
|
+
/** Hides the content and stops watching for `Escape`. */
|
|
128
|
+
#conceal() {
|
|
129
|
+
if (!this.hasContentTarget) return;
|
|
130
|
+
this.contentTarget.hidden = true;
|
|
131
|
+
this.contentTarget.setAttribute("data-state", "closed");
|
|
132
|
+
document.removeEventListener("keydown", this.#onDocumentKeydown);
|
|
133
|
+
}
|
|
134
|
+
/** Document-level `Escape` watcher (active only while shown). */
|
|
135
|
+
#onDocumentKeydown = (event) => {
|
|
136
|
+
if (event.key === "Escape") {
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
this.#cancelShow();
|
|
139
|
+
this.#cancelHide();
|
|
140
|
+
this.#conceal();
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
/** Cancels any pending show timer. */
|
|
144
|
+
#cancelShow() {
|
|
145
|
+
if (this.#pendingShow !== null) {
|
|
146
|
+
this.#timers.clear(this.#pendingShow);
|
|
147
|
+
this.#pendingShow = null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Cancels any pending hide timer. */
|
|
151
|
+
#cancelHide() {
|
|
152
|
+
if (this.#pendingHide !== null) {
|
|
153
|
+
this.#timers.clear(this.#pendingHide);
|
|
154
|
+
this.#pendingHide = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Whether the tooltip is currently shown. */
|
|
158
|
+
get #isVisible() {
|
|
159
|
+
return this.hasContentTarget && !this.contentTarget.hidden;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export { TooltipController };
|
|
164
|
+
//# sourceMappingURL=tooltip_controller.js.map
|
|
165
|
+
//# sourceMappingURL=tooltip_controller.js.map
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { Controller } from '@hotwired/stimulus';
|
|
2
|
+
|
|
3
|
+
// src/controllers/transition_controller.ts
|
|
4
|
+
|
|
5
|
+
// src/utils/safe_timeout.ts
|
|
6
|
+
var TimerRegistry = class {
|
|
7
|
+
/** Live timer ids that have not yet been cleared (or, for timeouts, fired). */
|
|
8
|
+
ids = /* @__PURE__ */ new Set();
|
|
9
|
+
/**
|
|
10
|
+
* Cancels a single tracked timer.
|
|
11
|
+
*
|
|
12
|
+
* No-ops if the id is unknown (already cleared, fired, or never owned by this
|
|
13
|
+
* registry), so callers can clear defensively without guarding.
|
|
14
|
+
*/
|
|
15
|
+
clear(id) {
|
|
16
|
+
if (this.ids.delete(id)) {
|
|
17
|
+
this.cancel(id);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Cancels every tracked timer. Call this from a controller's `disconnect()`
|
|
22
|
+
* to guarantee no timer outlives the element.
|
|
23
|
+
*/
|
|
24
|
+
clearAll() {
|
|
25
|
+
for (const id of this.ids) {
|
|
26
|
+
this.cancel(id);
|
|
27
|
+
}
|
|
28
|
+
this.ids.clear();
|
|
29
|
+
}
|
|
30
|
+
/** Number of timers currently tracked (pending). */
|
|
31
|
+
get size() {
|
|
32
|
+
return this.ids.size;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var SafeTimeout = class extends TimerRegistry {
|
|
36
|
+
/**
|
|
37
|
+
* Schedules `callback` after `delay` ms and returns the timer id.
|
|
38
|
+
*
|
|
39
|
+
* The id is removed from the registry automatically when the timeout fires,
|
|
40
|
+
* so {@link TimerRegistry.size | size} reflects only still-pending timers.
|
|
41
|
+
*/
|
|
42
|
+
set(callback, delay) {
|
|
43
|
+
const id = this.schedule(() => {
|
|
44
|
+
this.ids.delete(id);
|
|
45
|
+
callback();
|
|
46
|
+
}, delay);
|
|
47
|
+
this.ids.add(id);
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
schedule(callback, delay) {
|
|
51
|
+
return window.setTimeout(callback, delay);
|
|
52
|
+
}
|
|
53
|
+
cancel(id) {
|
|
54
|
+
window.clearTimeout(id);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// src/controllers/transition_controller.ts
|
|
59
|
+
var tokensOf = (value) => value.split(/\s+/).filter(Boolean);
|
|
60
|
+
var firstTimeMs = (value) => {
|
|
61
|
+
const first = value.split(",")[0]?.trim() ?? "";
|
|
62
|
+
const amount = Number.parseFloat(first);
|
|
63
|
+
if (Number.isNaN(amount)) return 0;
|
|
64
|
+
return first.endsWith("ms") ? amount : amount * 1e3;
|
|
65
|
+
};
|
|
66
|
+
var TransitionController = class extends Controller {
|
|
67
|
+
static values = {
|
|
68
|
+
enter: { type: String, default: "" },
|
|
69
|
+
enterFrom: { type: String, default: "" },
|
|
70
|
+
enterTo: { type: String, default: "" },
|
|
71
|
+
leave: { type: String, default: "" },
|
|
72
|
+
leaveFrom: { type: String, default: "" },
|
|
73
|
+
leaveTo: { type: String, default: "" },
|
|
74
|
+
timeout: { type: Number, default: 0 }
|
|
75
|
+
};
|
|
76
|
+
static actions = ["enter", "leave", "toggle"];
|
|
77
|
+
static events = ["entered", "left"];
|
|
78
|
+
#timers = new SafeTimeout();
|
|
79
|
+
#rafId = null;
|
|
80
|
+
#endListener = null;
|
|
81
|
+
connect() {
|
|
82
|
+
this.#strip();
|
|
83
|
+
this.element.setAttribute("data-transition-state", this.element.hidden ? "left" : "entered");
|
|
84
|
+
}
|
|
85
|
+
disconnect() {
|
|
86
|
+
this.#cancel();
|
|
87
|
+
}
|
|
88
|
+
/** Shows the element with the enter transition. */
|
|
89
|
+
enter() {
|
|
90
|
+
this.#run("enter");
|
|
91
|
+
}
|
|
92
|
+
/** Hides the element with the leave transition. */
|
|
93
|
+
leave() {
|
|
94
|
+
this.#run("leave");
|
|
95
|
+
}
|
|
96
|
+
/** Reverses the current direction (enter when hidden/leaving, else leave). */
|
|
97
|
+
toggle() {
|
|
98
|
+
const state = this.element.getAttribute("data-transition-state");
|
|
99
|
+
if (state === "entered" || state === "entering") this.leave();
|
|
100
|
+
else this.enter();
|
|
101
|
+
}
|
|
102
|
+
#run(kind) {
|
|
103
|
+
this.#cancel();
|
|
104
|
+
const isEnter = kind === "enter";
|
|
105
|
+
if (isEnter) this.element.hidden = false;
|
|
106
|
+
this.element.setAttribute("data-transition-state", isEnter ? "entering" : "leaving");
|
|
107
|
+
if (this.#prefersReducedMotion()) {
|
|
108
|
+
this.#finish(kind);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const base = isEnter ? this.enterValue : this.leaveValue;
|
|
112
|
+
const from = isEnter ? this.enterFromValue : this.leaveFromValue;
|
|
113
|
+
const to = isEnter ? this.enterToValue : this.leaveToValue;
|
|
114
|
+
this.#add(base, from);
|
|
115
|
+
this.#rafId = this.#raf(() => {
|
|
116
|
+
this.#rafId = null;
|
|
117
|
+
this.#remove(from);
|
|
118
|
+
this.#add(to);
|
|
119
|
+
this.#awaitEnd(() => this.#finish(kind));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** Settles the element into the completed state, clearing the stage classes. */
|
|
123
|
+
#finish(kind) {
|
|
124
|
+
this.#cleanupEnd();
|
|
125
|
+
this.#strip();
|
|
126
|
+
if (kind === "enter") {
|
|
127
|
+
this.element.setAttribute("data-transition-state", "entered");
|
|
128
|
+
this.dispatch("entered", { detail: {} });
|
|
129
|
+
} else {
|
|
130
|
+
this.element.hidden = true;
|
|
131
|
+
this.element.setAttribute("data-transition-state", "left");
|
|
132
|
+
this.dispatch("left", { detail: {} });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Resolves on the element's own `transitionend`, with a safety timeout fallback. */
|
|
136
|
+
#awaitEnd(done) {
|
|
137
|
+
this.#endListener = (event) => {
|
|
138
|
+
if (event.target === this.element) done();
|
|
139
|
+
};
|
|
140
|
+
this.element.addEventListener("transitionend", this.#endListener);
|
|
141
|
+
const ms = this.timeoutValue > 0 ? this.timeoutValue : this.#duration();
|
|
142
|
+
this.#timers.set(done, ms);
|
|
143
|
+
}
|
|
144
|
+
#cleanupEnd() {
|
|
145
|
+
if (this.#endListener) {
|
|
146
|
+
this.element.removeEventListener("transitionend", this.#endListener);
|
|
147
|
+
this.#endListener = null;
|
|
148
|
+
}
|
|
149
|
+
this.#timers.clearAll();
|
|
150
|
+
}
|
|
151
|
+
/** Cancels any in-flight transition (interruption / teardown). */
|
|
152
|
+
#cancel() {
|
|
153
|
+
if (this.#rafId !== null) {
|
|
154
|
+
this.#cancelRaf(this.#rafId);
|
|
155
|
+
this.#rafId = null;
|
|
156
|
+
}
|
|
157
|
+
this.#cleanupEnd();
|
|
158
|
+
this.#strip();
|
|
159
|
+
}
|
|
160
|
+
#add(...lists) {
|
|
161
|
+
const tokens = lists.flatMap(tokensOf);
|
|
162
|
+
if (tokens.length > 0) this.element.classList.add(...tokens);
|
|
163
|
+
}
|
|
164
|
+
#remove(...lists) {
|
|
165
|
+
const tokens = lists.flatMap(tokensOf);
|
|
166
|
+
if (tokens.length > 0) this.element.classList.remove(...tokens);
|
|
167
|
+
}
|
|
168
|
+
/** Removes every stage class so no half-applied state lingers. */
|
|
169
|
+
#strip() {
|
|
170
|
+
this.#remove(
|
|
171
|
+
this.enterValue,
|
|
172
|
+
this.enterFromValue,
|
|
173
|
+
this.enterToValue,
|
|
174
|
+
this.leaveValue,
|
|
175
|
+
this.leaveFromValue,
|
|
176
|
+
this.leaveToValue
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
/** Auto-computed safety duration (transition time + delay, with a small buffer). */
|
|
180
|
+
#duration() {
|
|
181
|
+
if (typeof window.getComputedStyle !== "function") return 0;
|
|
182
|
+
const style = window.getComputedStyle(this.element);
|
|
183
|
+
const total = firstTimeMs(style.transitionDuration) + firstTimeMs(style.transitionDelay);
|
|
184
|
+
return total > 0 ? total + 50 : 0;
|
|
185
|
+
}
|
|
186
|
+
#raf(callback) {
|
|
187
|
+
if (typeof window.requestAnimationFrame === "function") {
|
|
188
|
+
return window.requestAnimationFrame(() => callback());
|
|
189
|
+
}
|
|
190
|
+
return window.setTimeout(callback, 0);
|
|
191
|
+
}
|
|
192
|
+
#cancelRaf(id) {
|
|
193
|
+
if (typeof window.cancelAnimationFrame === "function") window.cancelAnimationFrame(id);
|
|
194
|
+
else window.clearTimeout(id);
|
|
195
|
+
}
|
|
196
|
+
#prefersReducedMotion() {
|
|
197
|
+
return typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export { TransitionController };
|
|
202
|
+
//# sourceMappingURL=transition_controller.js.map
|
|
203
|
+
//# sourceMappingURL=transition_controller.js.map
|