origam 2.17.1 → 2.18.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/CHANGELOG.md +895 -0
- package/dist/src/assets/css/main.css +1 -1
- package/dist/src/assets/css/tokens/dark.css +193 -26
- package/dist/src/assets/css/tokens/light.css +78 -11
- package/dist/src/assets/locales/en.json +21 -6
- package/dist/src/assets/locales/fr.json +21 -6
- package/dist/src/assets/scss/main.scss +10 -2
- package/dist/src/assets/scss/tokens/_dark.scss +2914 -13
- package/dist/src/assets/scss/tokens/_light.scss +78 -11
- package/dist/src/components/Alert/OrigamAlert.vue +6 -6
- package/dist/src/components/Avatar/OrigamAvatar.vue +15 -2
- package/dist/src/components/Badge/OrigamBadge.vue +7 -7
- package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +23 -4
- package/dist/src/components/Btn/OrigamBtn.vue +22 -16
- package/dist/src/components/Btn/OrigamBtnGroup.vue +1 -1
- package/dist/src/components/Calendar/OrigamCalendar.vue +1 -1
- package/dist/src/components/Card/OrigamCard.vue +2 -0
- package/dist/src/components/Card/OrigamCardHeader.vue +7 -7
- package/dist/src/components/Carousel/OrigamCarousel.vue +14 -1
- package/dist/src/components/Chart/OrigamChartBoxPlot.vue +1 -1
- package/dist/src/components/Chart/OrigamChartBullet.vue +3 -2
- package/dist/src/components/Chart/OrigamChartCandlestick.vue +2 -2
- package/dist/src/components/Chart/OrigamChartCartesian.vue +49 -4
- package/dist/src/components/Chart/OrigamChartLegend.vue +39 -18
- package/dist/src/components/Chart/OrigamChartPareto.vue +7 -1
- package/dist/src/components/Chart/OrigamChartPictorial.vue +2 -2
- package/dist/src/components/Chart/OrigamChartRadar.vue +3 -1
- package/dist/src/components/Chart/OrigamChartSparkline.vue +3 -1
- package/dist/src/components/Chart/OrigamChartStreamgraph.vue +2 -1
- package/dist/src/components/Checkbox/OrigamCheckbox.vue +2 -0
- package/dist/src/components/Checkbox/OrigamCheckboxGroup.vue +36 -11
- package/dist/src/components/Chip/OrigamChip.vue +19 -4
- package/dist/src/components/Code/OrigamCode.vue +20 -3
- package/dist/src/components/ColorPickerField/OrigamColorPickerField.vue +30 -5
- package/dist/src/components/CommandPalette/OrigamCommandPalette.vue +3 -3
- package/dist/src/components/ConfirmWrapper/OrigamConfirmWrapper.vue +6 -6
- package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +0 -4
- package/dist/src/components/DataList/OrigamDataList.vue +2 -0
- package/dist/src/components/DataList/OrigamDataText.vue +6 -6
- package/dist/src/components/DataList/OrigamDataTitle.vue +6 -6
- package/dist/src/components/DataTable/OrigamDataTableHeaderCell.vue +1 -1
- package/dist/src/components/DataTable/OrigamDataTableHeadersCell.vue +4 -1
- package/dist/src/components/DatePicker/OrigamDatePicker.vue +2 -0
- package/dist/src/components/DatePicker/OrigamDatePickerHeader.vue +6 -6
- package/dist/src/components/DatePickerField/OrigamDatePickerField.vue +21 -1
- package/dist/src/components/Dialog/OrigamDialog.vue +25 -0
- package/dist/src/components/Dialog/OrigamDialogConfirmation.vue +6 -0
- package/dist/src/components/ExpansionPanel/OrigamExpansionPanel.vue +2 -0
- package/dist/src/components/ExpansionPanel/OrigamExpansionPanelHeader.vue +6 -6
- package/dist/src/components/Field/OrigamField.vue +47 -15
- package/dist/src/components/FileField/OrigamFileField.vue +5 -1
- package/dist/src/components/Icon/OrigamSvgIcon.vue +3 -1
- package/dist/src/components/Img/OrigamImg.vue +9 -2
- package/dist/src/components/InfiniteScroll/OrigamInfiniteScroll.vue +34 -18
- package/dist/src/components/InlineEdit/OrigamInlineEdit.vue +46 -5
- package/dist/src/components/Input/OrigamInput.vue +6 -6
- package/dist/src/components/List/OrigamListGroup.vue +4 -0
- package/dist/src/components/List/OrigamListItem.vue +68 -4
- package/dist/src/components/Masonry/OrigamMasonry.vue +18 -2
- package/dist/src/components/Menu/OrigamMenu.vue +79 -9
- package/dist/src/components/NumberField/OrigamNumberField.vue +13 -3
- package/dist/src/components/OtpInputField/OrigamOtpInputField.vue +35 -11
- package/dist/src/components/PasswordField/OrigamPasswordField.vue +5 -1
- package/dist/src/components/Radio/OrigamRadio.vue +2 -0
- package/dist/src/components/Radio/OrigamRadioGroup.vue +36 -11
- package/dist/src/components/RatingField/OrigamRatingField.vue +58 -7
- package/dist/src/components/RatingField/OrigamRatingFieldItem.vue +78 -30
- package/dist/src/components/Select/OrigamSelect.vue +44 -21
- package/dist/src/components/SliderField/OrigamSliderField.vue +20 -10
- package/dist/src/components/Snackbar/OrigamSnackbarGroup.vue +1 -1
- package/dist/src/components/Switch/OrigamSwitch.vue +2 -0
- package/dist/src/components/Tabs/OrigamTab.vue +7 -4
- package/dist/src/components/Tabs/OrigamTabPanel.vue +4 -2
- package/dist/src/components/Tabs/OrigamTabs.vue +7 -5
- package/dist/src/components/TextField/OrigamTextField.vue +5 -1
- package/dist/src/components/TextareaField/OrigamTextareaField.vue +5 -1
- package/dist/src/components/Transition/OrigamExpandX.vue +19 -3
- package/dist/src/components/Transition/OrigamExpandY.vue +19 -3
- package/dist/src/components/Transition/OrigamTranslateScale.vue +26 -4
- package/dist/src/components/Video/OrigamVideo.vue +3 -2
- package/dist/src/components/Window/OrigamWindow.vue +20 -3
- package/dist/src/composables/Commons/accessibleCommand.composable.cjs +26 -0
- package/dist/src/composables/Commons/accessibleCommand.composable.d.ts +78 -0
- package/dist/src/composables/Commons/accessibleCommand.composable.js +20 -0
- package/dist/src/composables/Commons/activator.composable.cjs +10 -1
- package/dist/src/composables/Commons/activator.composable.js +11 -2
- package/dist/src/composables/Commons/adjacent.composable.cjs +17 -0
- package/dist/src/composables/Commons/adjacent.composable.d.ts +12 -0
- package/dist/src/composables/Commons/adjacent.composable.js +17 -0
- package/dist/src/composables/Commons/adjacentInner.composable.cjs +20 -0
- package/dist/src/composables/Commons/adjacentInner.composable.d.ts +24 -5
- package/dist/src/composables/Commons/adjacentInner.composable.js +20 -0
- package/dist/src/composables/Commons/audio.composable.cjs +14 -1
- package/dist/src/composables/Commons/audio.composable.js +14 -1
- package/dist/src/composables/Commons/backButton.composable.cjs +3 -1
- package/dist/src/composables/Commons/backButton.composable.js +3 -1
- package/dist/src/composables/Commons/border.composable.d.ts +13 -0
- package/dist/src/composables/Commons/colorEffect.composable.cjs +58 -46
- package/dist/src/composables/Commons/colorEffect.composable.d.ts +10 -5
- package/dist/src/composables/Commons/colorEffect.composable.js +70 -46
- package/dist/src/composables/Commons/createLayout.composable.cjs +21 -12
- package/dist/src/composables/Commons/createLayout.composable.js +21 -12
- package/dist/src/composables/Commons/delay.composable.d.ts +16 -0
- package/dist/src/composables/Commons/dimension.composable.d.ts +11 -0
- package/dist/src/composables/Commons/elevation.composable.cjs +6 -2
- package/dist/src/composables/Commons/elevation.composable.d.ts +37 -1
- package/dist/src/composables/Commons/elevation.composable.js +7 -2
- package/dist/src/composables/Commons/goTo.composable.cjs +4 -2
- package/dist/src/composables/Commons/goTo.composable.js +5 -3
- package/dist/src/composables/Commons/group.composable.cjs +14 -14
- package/dist/src/composables/Commons/group.composable.js +14 -14
- package/dist/src/composables/Commons/hotkey.composable.d.ts +18 -7
- package/dist/src/composables/Commons/hydration.composable.d.ts +8 -0
- package/dist/src/composables/Commons/link.composable.d.ts +20 -0
- package/dist/src/composables/Commons/locationStrategies.composable.d.ts +17 -0
- package/dist/src/composables/Commons/message.composable.d.ts +19 -5
- package/dist/src/composables/Commons/position.composable.d.ts +17 -6
- package/dist/src/composables/Commons/refs.composable.d.ts +11 -5
- package/dist/src/composables/Commons/rounded.composable.d.ts +11 -1
- package/dist/src/composables/Commons/scrolling.composable.cjs +15 -12
- package/dist/src/composables/Commons/scrolling.composable.js +15 -12
- package/dist/src/composables/Commons/size.composable.d.ts +15 -0
- package/dist/src/composables/Commons/ssrBoot.composable.cjs +9 -1
- package/dist/src/composables/Commons/ssrBoot.composable.js +10 -2
- package/dist/src/composables/Commons/stack.composable.cjs +13 -1
- package/dist/src/composables/Commons/stack.composable.js +13 -1
- package/dist/src/composables/Commons/theme-props-resolver.composable.cjs +41 -32
- package/dist/src/composables/Commons/theme-props-resolver.composable.js +41 -32
- package/dist/src/composables/Commons/validation.composable.cjs +3 -3
- package/dist/src/composables/Commons/validation.composable.js +3 -3
- package/dist/src/composables/Commons/virtual.composable.cjs +24 -8
- package/dist/src/composables/Commons/virtual.composable.js +24 -8
- package/dist/src/composables/Masonry/masonry.composable.cjs +18 -11
- package/dist/src/composables/Masonry/masonry.composable.js +18 -11
- package/dist/src/composables/Parallax/parallax.composable.cjs +1 -1
- package/dist/src/composables/Parallax/parallax.composable.js +1 -1
- package/dist/src/composables/index.cjs +36 -0
- package/dist/src/composables/index.d.ts +3 -0
- package/dist/src/composables/index.js +3 -0
- package/dist/src/consts/Chart/chart-cartesian.const.cjs +5 -2
- package/dist/src/consts/Chart/chart-cartesian.const.d.ts +42 -0
- package/dist/src/consts/Chart/chart-cartesian.const.js +3 -0
- package/dist/src/consts/Commons/elevation.const.cjs +5 -1
- package/dist/src/consts/Commons/elevation.const.d.ts +52 -2
- package/dist/src/consts/Commons/elevation.const.js +4 -0
- package/dist/src/consts/Commons/ripple.const.cjs +13 -3
- package/dist/src/consts/Commons/ripple.const.js +13 -3
- package/dist/src/consts/RatingField/rating-field.const.cjs +10 -0
- package/dist/src/consts/RatingField/rating-field.const.d.ts +36 -0
- package/dist/src/consts/RatingField/rating-field.const.js +12 -0
- package/dist/src/consts/index.cjs +11 -0
- package/dist/src/consts/index.d.ts +1 -0
- package/dist/src/consts/index.js +1 -0
- package/dist/src/directives/ClickOutside/clickOutside.directive.cjs +2 -0
- package/dist/src/directives/ClickOutside/clickOutside.directive.js +2 -0
- package/dist/src/directives/Ripple/ripple.directive.cjs +2 -0
- package/dist/src/directives/Ripple/ripple.directive.js +2 -0
- package/dist/src/enums/Commons/color.enum.cjs +0 -1
- package/dist/src/enums/Commons/color.enum.d.ts +14 -5
- package/dist/src/enums/Commons/color.enum.js +0 -1
- package/dist/src/enums/Sheet/sheet.enum.d.ts +1 -1
- package/dist/src/interfaces/Btn/btn.interface.d.ts +7 -10
- package/dist/src/interfaces/Chart/chart-cartesian.interface.d.ts +6 -2
- package/dist/src/interfaces/Commons/activator.interface.d.ts +3 -2
- package/dist/src/interfaces/Commons/adjacent.interface.d.ts +29 -0
- package/dist/src/interfaces/Commons/group.interface.d.ts +13 -2
- package/dist/src/interfaces/Commons/ripple.interface.d.ts +16 -0
- package/dist/src/interfaces/Commons/scroll.interface.d.ts +3 -2
- package/dist/src/interfaces/DataTable/data-table-header.interface.d.ts +2 -2
- package/dist/src/interfaces/DatePicker/date-picker-month.interface.d.ts +2 -1
- package/dist/src/interfaces/Menu/menu.interface.d.ts +28 -1
- package/dist/src/interfaces/OtpInputField/otp-input-field.interface.d.ts +21 -1
- package/dist/src/interfaces/RatingField/rating-field-item.interface.d.ts +16 -1
- package/dist/src/interfaces/index.cjs +11 -0
- package/dist/src/interfaces/index.d.ts +1 -0
- package/dist/src/interfaces/index.js +1 -0
- package/dist/src/nuxt/module.cjs +2 -1
- package/dist/src/nuxt/module.js +2 -1
- package/dist/src/origam.cjs +1 -2
- package/dist/src/origam.js +1 -2
- package/dist/src/themes/origam.theme.cjs +8 -14
- package/dist/src/themes/origam.theme.js +6 -8
- package/dist/src/types/Commons/color.type.d.ts +4 -3
- package/dist/src/types/Commons/commons.type.d.ts +33 -0
- package/dist/src/types/Commons/theme.type.d.ts +2 -1
- package/dist/src/types/Sheet/sheet.type.d.ts +2 -1
- package/dist/src/types/index.cjs +22 -0
- package/dist/src/types/index.d.ts +2 -0
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/tokens.type.d.ts +1 -1
- package/dist/src/utils/Commons/a11y.util.cjs +35 -0
- package/dist/src/utils/Commons/a11y.util.d.ts +63 -0
- package/dist/src/utils/Commons/a11y.util.js +33 -0
- package/dist/src/utils/Commons/clickOutside.util.cjs +5 -1
- package/dist/src/utils/Commons/clickOutside.util.js +5 -1
- package/dist/src/utils/Commons/color.util.cjs +10 -15
- package/dist/src/utils/Commons/color.util.d.ts +34 -28
- package/dist/src/utils/Commons/color.util.js +9 -16
- package/dist/src/utils/Commons/goTo.util.cjs +31 -14
- package/dist/src/utils/Commons/goTo.util.d.ts +1 -1
- package/dist/src/utils/Commons/goTo.util.js +31 -16
- package/dist/src/utils/Commons/location.util.cjs +18 -3
- package/dist/src/utils/Commons/location.util.js +18 -3
- package/dist/src/utils/Commons/ripple.util.cjs +5 -1
- package/dist/src/utils/Commons/ripple.util.js +5 -1
- package/dist/src/utils/index.cjs +11 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.js +1 -0
- package/package.json +13 -2
- package/dist/src/consts/Btn/btn.const.cjs +0 -7
- package/dist/src/consts/Btn/btn.const.d.ts +0 -32
- package/dist/src/consts/Btn/btn.const.js +0 -1
- package/dist/src/types/Commons/locale.type.cjs +0 -1
- package/dist/src/types/Commons/locale.type.d.ts +0 -0
- package/dist/src/types/Commons/locale.type.js +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.warnMissingAccessibleName = warnMissingAccessibleName;
|
|
7
|
+
exports.warnMissingLandmarkName = warnMissingLandmarkName;
|
|
8
|
+
exports.warnMissingNativeControlName = warnMissingNativeControlName;
|
|
9
|
+
const _warnedCommandNameKeys = /* @__PURE__ */new Set();
|
|
10
|
+
function warnMissingAccessibleName(component, zone, prop) {
|
|
11
|
+
if (typeof console === "undefined") return;
|
|
12
|
+
if (!process.env?.DEV) return;
|
|
13
|
+
const key = `${component}::${zone}`;
|
|
14
|
+
if (_warnedCommandNameKeys.has(key)) return;
|
|
15
|
+
_warnedCommandNameKeys.add(key);
|
|
16
|
+
console.warn(`[origam] <${component}> the "${zone}" zone has a click listener but no accessible name, so it is NOT exposed as a button and NOT reachable by keyboard \u2014 a screen reader would announce "button" and nothing else (WCAG 2.1 4.1.2). Set "${prop}" to an i18n key or a literal label to make it a real control.`);
|
|
17
|
+
}
|
|
18
|
+
const _warnedNativeCommandKeys = /* @__PURE__ */new Set();
|
|
19
|
+
function warnMissingNativeControlName(component, hint) {
|
|
20
|
+
if (typeof console === "undefined") return;
|
|
21
|
+
if (!process.env?.DEV) return;
|
|
22
|
+
const key = `${component}::${hint}`;
|
|
23
|
+
if (_warnedNativeCommandKeys.has(key)) return;
|
|
24
|
+
_warnedNativeCommandKeys.add(key);
|
|
25
|
+
console.warn(`[origam] <${component}> renders a control with no accessible name: ${hint}. Add aria-label (or aria-labelledby) \u2014 an unnamed button announces as "button" and nothing else (WCAG 2.1 4.1.2).`);
|
|
26
|
+
}
|
|
27
|
+
const _warnedLandmarkKeys = /* @__PURE__ */new Set();
|
|
28
|
+
function warnMissingLandmarkName(component, role, roleDescription) {
|
|
29
|
+
if (typeof console === "undefined") return;
|
|
30
|
+
if (!process.env?.DEV) return;
|
|
31
|
+
const key = `${component}::${role}`;
|
|
32
|
+
if (_warnedLandmarkKeys.has(key)) return;
|
|
33
|
+
_warnedLandmarkKeys.add(key);
|
|
34
|
+
console.warn(`[origam] <${component}> has no accessible name, so it does NOT declare role="${role}" / aria-roledescription="${roleDescription}". An unnamed "${role}" is not a navigable landmark (WAI-ARIA 1.2 \u2014 name required), and a roledescription with no name describes nothing. Pass aria-label (or aria-labelledby) to <${component}> \u2014 it falls through to the root element.`);
|
|
35
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*********************************************************
|
|
2
|
+
* a11y.util — dev-time accessibility warnings
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* ⛔ issues #747 / #653 / #660. Same once-per-key, `import.meta.env.DEV`-gated
|
|
6
|
+
* shape as `warnUnsupportedProp` (`color.util.ts`), but filed here rather
|
|
7
|
+
* than grown as a fifth warning inside a colour utility — these two say
|
|
8
|
+
* nothing about colour.
|
|
9
|
+
*
|
|
10
|
+
* Both warnings are SILENT in production builds. They exist to tell the
|
|
11
|
+
* developer what to add, at the moment they can still add it; shipping the
|
|
12
|
+
* string to an end user's console would help nobody.
|
|
13
|
+
********************************************************/
|
|
14
|
+
/*********************************************************
|
|
15
|
+
* warnMissingAccessibleName
|
|
16
|
+
*
|
|
17
|
+
* @description
|
|
18
|
+
* A zone the DS would have promoted to `role="button"` has no accessible
|
|
19
|
+
* name, so `useAccessibleCommand` emitted no role and no tab stop. Names
|
|
20
|
+
* the exact prop that restores it.
|
|
21
|
+
********************************************************/
|
|
22
|
+
export declare function warnMissingAccessibleName(component: string, zone: string, prop: string): void;
|
|
23
|
+
/*********************************************************
|
|
24
|
+
* warnMissingNativeControlName
|
|
25
|
+
*
|
|
26
|
+
* @description
|
|
27
|
+
* A NATIVE control (`<button>`, `<a href>`) renders with no text and no
|
|
28
|
+
* `aria-label` / `aria-labelledby`. Unlike a `role="button"` the DS added
|
|
29
|
+
* itself, this one cannot be withdrawn — the element IS a control. All the
|
|
30
|
+
* DS can do is say so, loudly, in development.
|
|
31
|
+
*
|
|
32
|
+
* @description
|
|
33
|
+
* No label is fabricated: a guessed string would silence axe while telling
|
|
34
|
+
* the user nothing (#622 shipped exactly that once, an auto-label that
|
|
35
|
+
* overwrote a visible `<label for>`).
|
|
36
|
+
********************************************************/
|
|
37
|
+
export declare function warnMissingNativeControlName(component: string, hint: string): void;
|
|
38
|
+
/*********************************************************
|
|
39
|
+
* warnMissingLandmarkName
|
|
40
|
+
*
|
|
41
|
+
* @description
|
|
42
|
+
* ⛔ issue #781 — same rule as `warnMissingAccessibleName`, one rung up: a
|
|
43
|
+
* LANDMARK the DS would have declared has no accessible name, so the DS
|
|
44
|
+
* declared nothing.
|
|
45
|
+
*
|
|
46
|
+
* @description
|
|
47
|
+
* `region` is one of the few roles whose ARIA definition marks the
|
|
48
|
+
* accessible name as REQUIRED (WAI-ARIA 1.2, role `region`: "Name Required:
|
|
49
|
+
* True"), and HTML-AAM says the same thing from the other side — a
|
|
50
|
+
* `<section>` maps to `region` only when it is named, and to `generic`
|
|
51
|
+
* otherwise. An unnamed `role="region"` is therefore not a landmark a user
|
|
52
|
+
* can usefully navigate to; it is an authoring error that puts a nameless
|
|
53
|
+
* entry in the landmark list. `aria-roledescription` riding along makes it
|
|
54
|
+
* worse, not better: it replaces the role name a screen reader would have
|
|
55
|
+
* announced with a description attached to nothing.
|
|
56
|
+
*
|
|
57
|
+
* @description
|
|
58
|
+
* No name is fabricated. "Carousel" as a default label would name every
|
|
59
|
+
* carousel on a page identically — exactly the defect `OrigamCode`'s
|
|
60
|
+
* scroller was corrected for (five homonymous regions in one landmark
|
|
61
|
+
* list). The consumer holds the only string that distinguishes them.
|
|
62
|
+
********************************************************/
|
|
63
|
+
export declare function warnMissingLandmarkName(component: string, role: string, roleDescription: string): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const _warnedCommandNameKeys = /* @__PURE__ */ new Set();
|
|
2
|
+
export function warnMissingAccessibleName(component, zone, prop) {
|
|
3
|
+
if (typeof console === "undefined") return;
|
|
4
|
+
if (!import.meta.env?.DEV) return;
|
|
5
|
+
const key = `${component}::${zone}`;
|
|
6
|
+
if (_warnedCommandNameKeys.has(key)) return;
|
|
7
|
+
_warnedCommandNameKeys.add(key);
|
|
8
|
+
console.warn(
|
|
9
|
+
`[origam] <${component}> the "${zone}" zone has a click listener but no accessible name, so it is NOT exposed as a button and NOT reachable by keyboard \u2014 a screen reader would announce "button" and nothing else (WCAG 2.1 4.1.2). Set "${prop}" to an i18n key or a literal label to make it a real control.`
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
const _warnedNativeCommandKeys = /* @__PURE__ */ new Set();
|
|
13
|
+
export function warnMissingNativeControlName(component, hint) {
|
|
14
|
+
if (typeof console === "undefined") return;
|
|
15
|
+
if (!import.meta.env?.DEV) return;
|
|
16
|
+
const key = `${component}::${hint}`;
|
|
17
|
+
if (_warnedNativeCommandKeys.has(key)) return;
|
|
18
|
+
_warnedNativeCommandKeys.add(key);
|
|
19
|
+
console.warn(
|
|
20
|
+
`[origam] <${component}> renders a control with no accessible name: ${hint}. Add aria-label (or aria-labelledby) \u2014 an unnamed button announces as "button" and nothing else (WCAG 2.1 4.1.2).`
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
const _warnedLandmarkKeys = /* @__PURE__ */ new Set();
|
|
24
|
+
export function warnMissingLandmarkName(component, role, roleDescription) {
|
|
25
|
+
if (typeof console === "undefined") return;
|
|
26
|
+
if (!import.meta.env?.DEV) return;
|
|
27
|
+
const key = `${component}::${role}`;
|
|
28
|
+
if (_warnedLandmarkKeys.has(key)) return;
|
|
29
|
+
_warnedLandmarkKeys.add(key);
|
|
30
|
+
console.warn(
|
|
31
|
+
`[origam] <${component}> has no accessible name, so it does NOT declare role="${role}" / aria-roledescription="${roleDescription}". An unnamed "${role}" is not a navigable landmark (WAI-ARIA 1.2 \u2014 name required), and a roledescription with no name describes nothing. Pass aria-label (or aria-labelledby) to <${component}> \u2014 it falls through to the root element.`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -26,11 +26,15 @@ function checkIsActive(e, binding) {
|
|
|
26
26
|
function directive(e, el, binding) {
|
|
27
27
|
const handler = typeof binding.value === "function" ? binding.value : binding.value.handler;
|
|
28
28
|
if (el._clickOutside?.lastMousedownWasOutside && checkEvent(e, el, binding)) {
|
|
29
|
-
|
|
29
|
+
const store = el._clickOutside;
|
|
30
|
+
const id = setTimeout(() => {
|
|
31
|
+
store.timers?.delete(id);
|
|
30
32
|
if (checkIsActive(e, binding) && handler) {
|
|
31
33
|
handler(e);
|
|
32
34
|
}
|
|
33
35
|
}, 0);
|
|
36
|
+
store.timers ??= /* @__PURE__ */new Set();
|
|
37
|
+
store.timers.add(id);
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
function handleShadow(el, callback) {
|
|
@@ -17,11 +17,15 @@ export function checkIsActive(e, binding) {
|
|
|
17
17
|
export function directive(e, el, binding) {
|
|
18
18
|
const handler = typeof binding.value === "function" ? binding.value : binding.value.handler;
|
|
19
19
|
if (el._clickOutside?.lastMousedownWasOutside && checkEvent(e, el, binding)) {
|
|
20
|
-
|
|
20
|
+
const store = el._clickOutside;
|
|
21
|
+
const id = setTimeout(() => {
|
|
22
|
+
store.timers?.delete(id);
|
|
21
23
|
if (checkIsActive(e, binding) && handler) {
|
|
22
24
|
handler(e);
|
|
23
25
|
}
|
|
24
26
|
}, 0);
|
|
27
|
+
store.timers ??= /* @__PURE__ */ new Set();
|
|
28
|
+
store.timers.add(id);
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
export function handleShadow(el, callback) {
|
|
@@ -27,6 +27,7 @@ exports.getLuma = getLuma;
|
|
|
27
27
|
exports.intentBgExpr = intentBgExpr;
|
|
28
28
|
exports.intentFgExpr = intentFgExpr;
|
|
29
29
|
exports.intentTokenBase = intentTokenBase;
|
|
30
|
+
exports.isCompleteCssColor = isCompleteCssColor;
|
|
30
31
|
exports.isCssColor = isCssColor;
|
|
31
32
|
exports.isIntent = isIntent;
|
|
32
33
|
exports.isParsableColor = isParsableColor;
|
|
@@ -39,7 +40,6 @@ exports.rawBgExprWithState = rawBgExprWithState;
|
|
|
39
40
|
exports.toHex = toHex;
|
|
40
41
|
exports.tokenForegroundForIntent = tokenForegroundForIntent;
|
|
41
42
|
exports.tokenStylesForIntent = tokenStylesForIntent;
|
|
42
|
-
exports.warnDeprecatedEmit = warnDeprecatedEmit;
|
|
43
43
|
exports.warnDeprecatedProp = warnDeprecatedProp;
|
|
44
44
|
exports.warnLegacyColor = warnLegacyColor;
|
|
45
45
|
exports.warnUnsupportedProp = warnUnsupportedProp;
|
|
@@ -53,6 +53,13 @@ function isCssColor(color) {
|
|
|
53
53
|
function isParsableColor(color) {
|
|
54
54
|
return isCssColor(color) && !/^((rgb|hsl)a?\()?var\(--/.test(color) && !/^color-mix\(/i.test(color);
|
|
55
55
|
}
|
|
56
|
+
function isCompleteCssColor(color) {
|
|
57
|
+
if (!color) return false;
|
|
58
|
+
if (color.startsWith("#")) {
|
|
59
|
+
return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color);
|
|
60
|
+
}
|
|
61
|
+
return isCssColor(color);
|
|
62
|
+
}
|
|
56
63
|
function parseColor(color) {
|
|
57
64
|
if (typeof color === "number") {
|
|
58
65
|
if (isNaN(color) || color < 0 || color > 16777215) {
|
|
@@ -368,15 +375,13 @@ function intentBgExpr(intent, role) {
|
|
|
368
375
|
const base = intentTokenBase(intent);
|
|
369
376
|
const baseVar = `var(--origam-color__${base}---bg)`;
|
|
370
377
|
if (role === "default") return baseVar;
|
|
371
|
-
if (role === "disabled") return `var(--origam-color__${base}---bgDisabled)`;
|
|
372
378
|
const pct = role === "hover" ? _color.COLOR_HOVER_MIX_PCT : _color.COLOR_ACTIVE_MIX_PCT;
|
|
373
379
|
const slot = role === "hover" ? "bgHover" : "bgActive";
|
|
374
380
|
return `var(--origam-color__${base}---${slot}, color-mix(in srgb, ${baseVar}, black ${pct}%))`;
|
|
375
381
|
}
|
|
376
|
-
function intentFgExpr(intent,
|
|
382
|
+
function intentFgExpr(intent, _role) {
|
|
377
383
|
const base = intentTokenBase(intent);
|
|
378
|
-
|
|
379
|
-
return `var(--origam-color__${base}---${slot})`;
|
|
384
|
+
return `var(--origam-color__${base}---fg)`;
|
|
380
385
|
}
|
|
381
386
|
function tokenStylesForIntent(intent, role = _color2.BG_FG_ROLE.DEFAULT) {
|
|
382
387
|
return {
|
|
@@ -386,7 +391,6 @@ function tokenStylesForIntent(intent, role = _color2.BG_FG_ROLE.DEFAULT) {
|
|
|
386
391
|
}
|
|
387
392
|
function rawBgExprWithState(raw, role) {
|
|
388
393
|
if (role === "default") return raw;
|
|
389
|
-
if (role === "disabled") return raw;
|
|
390
394
|
const pct = role === "hover" ? _color.COLOR_HOVER_MIX_PCT : _color.COLOR_ACTIVE_MIX_PCT;
|
|
391
395
|
return `color-mix(in srgb, ${raw}, black ${pct}%)`;
|
|
392
396
|
}
|
|
@@ -426,13 +430,4 @@ function warnUnsupportedProp(component, prop, reason) {
|
|
|
426
430
|
if (_warnedUnsupportedPropKeys.has(key)) return;
|
|
427
431
|
_warnedUnsupportedPropKeys.add(key);
|
|
428
432
|
console.warn(`[origam] <${component}> prop "${prop}" has no effect on this component: ${reason}`);
|
|
429
|
-
}
|
|
430
|
-
const _warnedDeprecatedEmitKeys = /* @__PURE__ */new Set();
|
|
431
|
-
function warnDeprecatedEmit(component, emit, replacement, removalVersion = "v3.0.0") {
|
|
432
|
-
if (typeof console === "undefined") return;
|
|
433
|
-
if (!process.env?.DEV) return;
|
|
434
|
-
const key = `${component}::${emit}`;
|
|
435
|
-
if (_warnedDeprecatedEmitKeys.has(key)) return;
|
|
436
|
-
_warnedDeprecatedEmitKeys.add(key);
|
|
437
|
-
console.warn(`[origam] <${component}> emit "${emit}" is deprecated and will be removed in ${removalVersion}. ${replacement}`);
|
|
438
433
|
}
|
|
@@ -49,6 +49,30 @@ export declare function isCssColor(color?: string | null | false): boolean;
|
|
|
49
49
|
* @returns …
|
|
50
50
|
********************************************************/
|
|
51
51
|
export declare function isParsableColor(color: string): boolean;
|
|
52
|
+
/*********************************************************
|
|
53
|
+
* isCompleteCssColor
|
|
54
|
+
*
|
|
55
|
+
* @description
|
|
56
|
+
* Is complete css color — a strictER sibling of `isCssColor`, meant to
|
|
57
|
+
* gate a COMMIT (a user's typed keystroke reaching the model), not a
|
|
58
|
+
* style-consumption path.
|
|
59
|
+
*
|
|
60
|
+
* @description
|
|
61
|
+
* `isCssColor`'s hex branch deliberately only checks the `#` prefix
|
|
62
|
+
* (`/^#/`) — a value that fails to paint at the CSS-consumption layer is
|
|
63
|
+
* harmless, so `#f`, `#ff`, `#fffff` (5 digits) all pass it today. That
|
|
64
|
+
* tolerance is wrong for a commit gate: a user mid-typing `#ff00aa`
|
|
65
|
+
* passes through `#f`, `#ff`, `#ff0`… and only a SYNTACTICALLY COMPLETE
|
|
66
|
+
* hex (3, 4, 6 or 8 digits) should actually reach `modelValue` — #859
|
|
67
|
+
* (`OrigamColorPickerField` / `OrigamDatePickerField` direct-typing
|
|
68
|
+
* wiring). Every other category (functional notation, named colors,
|
|
69
|
+
* `var()`) reuses `isCssColor` unchanged — its check is already exact
|
|
70
|
+
* there.
|
|
71
|
+
*
|
|
72
|
+
* @param color …
|
|
73
|
+
* @returns …
|
|
74
|
+
********************************************************/
|
|
75
|
+
export declare function isCompleteCssColor(color: string): boolean;
|
|
52
76
|
/*********************************************************
|
|
53
77
|
* parseColor
|
|
54
78
|
*
|
|
@@ -384,18 +408,23 @@ export declare function intentTokenBase(intent: TIntent): string;
|
|
|
384
408
|
* • `default` → `var(--…-bg)`
|
|
385
409
|
* • `hover` → `var(--…-bgHover, color-mix(in srgb, var(--…-bg), black 20%))`
|
|
386
410
|
* • `active` → `var(--…-bgActive, color-mix(in srgb, var(--…-bg), black 30%))`
|
|
387
|
-
*
|
|
411
|
+
*
|
|
412
|
+
* @description
|
|
413
|
+
* There is no `disabled` rung — disabled is an opacity veil, not a token
|
|
414
|
+
* swap. See `BG_FG_ROLE` (#823) for why emitting one would erase the
|
|
415
|
+
* surface rather than repaint it.
|
|
388
416
|
********************************************************/
|
|
389
417
|
export declare function intentBgExpr(intent: TIntent, role: TBgFgRole): string;
|
|
390
418
|
/*********************************************************
|
|
391
419
|
* intentFgExpr
|
|
392
420
|
*
|
|
393
421
|
* @description
|
|
394
|
-
* Foreground stays the same hue across
|
|
395
|
-
*
|
|
396
|
-
*
|
|
422
|
+
* Foreground stays the same hue across every role by design — we darken
|
|
423
|
+
* the surface around the text, the text itself keeps the WCAG-paired
|
|
424
|
+
* contrast token. `role` is therefore accepted for signature symmetry with
|
|
425
|
+
* `intentBgExpr` and does not branch (there is no `disabled` rung — #823).
|
|
397
426
|
********************************************************/
|
|
398
|
-
export declare function intentFgExpr(intent: TIntent,
|
|
427
|
+
export declare function intentFgExpr(intent: TIntent, _role: TBgFgRole): string;
|
|
399
428
|
/*********************************************************
|
|
400
429
|
* tokenStylesForIntent
|
|
401
430
|
*
|
|
@@ -463,26 +492,3 @@ export declare function warnDeprecatedProp(component: string, oldProp: string, n
|
|
|
463
492
|
* bullishColor/bearishColor").
|
|
464
493
|
********************************************************/
|
|
465
494
|
export declare function warnUnsupportedProp(component: string, prop: string, reason: string): void;
|
|
466
|
-
/*********************************************************
|
|
467
|
-
* warnDeprecatedEmit
|
|
468
|
-
*
|
|
469
|
-
* @description
|
|
470
|
-
* Warn (once per component / emit, dev builds only) that the consumer
|
|
471
|
-
* attached a listener to an emit scheduled for removal. The emit KEEPS
|
|
472
|
-
* FIRING until the removal version — this announces the break instead of
|
|
473
|
-
* shipping it. `replacement` should name what to do instead, not merely
|
|
474
|
-
* say the emit is going away. Same once-per-key cache as the three
|
|
475
|
-
* warnings above, but for a public EMIT rather than a prop.
|
|
476
|
-
*
|
|
477
|
-
* @description
|
|
478
|
-
* First use case: `click:prepend` / `click:append` on `<OrigamBtn>` (#443).
|
|
479
|
-
* Those two were reachable by MOUSE ONLY — the emit is bound to a
|
|
480
|
-
* descendant span, while keyboard activation synthesises its click on the
|
|
481
|
-
* button root. The `role="button"` + tab-stop remedy `useAdjacent` applies
|
|
482
|
-
* on the other ten consumers is ILLEGAL here: Btn's root is a
|
|
483
|
-
* `<button>`/`<a>`, whose content model forbids both an interactive
|
|
484
|
-
* descendant and any descendant carrying `tabindex`. A control that already
|
|
485
|
-
* owns one action cannot host a second — two actions are two buttons
|
|
486
|
-
* (`origam-btn-group`).
|
|
487
|
-
********************************************************/
|
|
488
|
-
export declare function warnDeprecatedEmit(component: string, emit: string, replacement: string, removalVersion?: string): void;
|
|
@@ -8,6 +8,13 @@ export function isCssColor(color) {
|
|
|
8
8
|
export function isParsableColor(color) {
|
|
9
9
|
return isCssColor(color) && !/^((rgb|hsl)a?\()?var\(--/.test(color) && !/^color-mix\(/i.test(color);
|
|
10
10
|
}
|
|
11
|
+
export function isCompleteCssColor(color) {
|
|
12
|
+
if (!color) return false;
|
|
13
|
+
if (color.startsWith("#")) {
|
|
14
|
+
return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color);
|
|
15
|
+
}
|
|
16
|
+
return isCssColor(color);
|
|
17
|
+
}
|
|
11
18
|
export function parseColor(color) {
|
|
12
19
|
if (typeof color === "number") {
|
|
13
20
|
if (isNaN(color) || color < 0 || color > 16777215) {
|
|
@@ -274,15 +281,13 @@ export function intentBgExpr(intent, role) {
|
|
|
274
281
|
const base = intentTokenBase(intent);
|
|
275
282
|
const baseVar = `var(--origam-color__${base}---bg)`;
|
|
276
283
|
if (role === "default") return baseVar;
|
|
277
|
-
if (role === "disabled") return `var(--origam-color__${base}---bgDisabled)`;
|
|
278
284
|
const pct = role === "hover" ? COLOR_HOVER_MIX_PCT : COLOR_ACTIVE_MIX_PCT;
|
|
279
285
|
const slot = role === "hover" ? "bgHover" : "bgActive";
|
|
280
286
|
return `var(--origam-color__${base}---${slot}, color-mix(in srgb, ${baseVar}, black ${pct}%))`;
|
|
281
287
|
}
|
|
282
|
-
export function intentFgExpr(intent,
|
|
288
|
+
export function intentFgExpr(intent, _role) {
|
|
283
289
|
const base = intentTokenBase(intent);
|
|
284
|
-
|
|
285
|
-
return `var(--origam-color__${base}---${slot})`;
|
|
290
|
+
return `var(--origam-color__${base}---fg)`;
|
|
286
291
|
}
|
|
287
292
|
export function tokenStylesForIntent(intent, role = BG_FG_ROLE.DEFAULT) {
|
|
288
293
|
return {
|
|
@@ -292,7 +297,6 @@ export function tokenStylesForIntent(intent, role = BG_FG_ROLE.DEFAULT) {
|
|
|
292
297
|
}
|
|
293
298
|
export function rawBgExprWithState(raw, role) {
|
|
294
299
|
if (role === "default") return raw;
|
|
295
|
-
if (role === "disabled") return raw;
|
|
296
300
|
const pct = role === "hover" ? COLOR_HOVER_MIX_PCT : COLOR_ACTIVE_MIX_PCT;
|
|
297
301
|
return `color-mix(in srgb, ${raw}, black ${pct}%)`;
|
|
298
302
|
}
|
|
@@ -339,14 +343,3 @@ export function warnUnsupportedProp(component, prop, reason) {
|
|
|
339
343
|
`[origam] <${component}> prop "${prop}" has no effect on this component: ${reason}`
|
|
340
344
|
);
|
|
341
345
|
}
|
|
342
|
-
const _warnedDeprecatedEmitKeys = /* @__PURE__ */ new Set();
|
|
343
|
-
export function warnDeprecatedEmit(component, emit, replacement, removalVersion = "v3.0.0") {
|
|
344
|
-
if (typeof console === "undefined") return;
|
|
345
|
-
if (!import.meta.env?.DEV) return;
|
|
346
|
-
const key = `${component}::${emit}`;
|
|
347
|
-
if (_warnedDeprecatedEmitKeys.has(key)) return;
|
|
348
|
-
_warnedDeprecatedEmitKeys.add(key);
|
|
349
|
-
console.warn(
|
|
350
|
-
`[origam] <${component}> emit "${emit}" is deprecated and will be removed in ${removalVersion}. ${replacement}`
|
|
351
|
-
);
|
|
352
|
-
}
|
|
@@ -68,7 +68,7 @@ function clampTarget(container, value, horizontal) {
|
|
|
68
68
|
}
|
|
69
69
|
return Math.max(Math.min(value, max), min);
|
|
70
70
|
}
|
|
71
|
-
async function scrollTo(_target, _options, horizontal, goTo) {
|
|
71
|
+
async function scrollTo(_target, _options, horizontal, goTo, signal) {
|
|
72
72
|
const rtl = goTo?.rtl.value;
|
|
73
73
|
const property = horizontal ? "scrollLeft" : "scrollTop";
|
|
74
74
|
const options = (0, _commons.mergeDeep)(goTo?.options ?? genDefaults(), _options);
|
|
@@ -95,17 +95,34 @@ async function scrollTo(_target, _options, horizontal, goTo) {
|
|
|
95
95
|
if (targetLocation === startLocation) return Promise.resolve(targetLocation);
|
|
96
96
|
const startTime = performance.now();
|
|
97
97
|
const duration = options.duration;
|
|
98
|
-
return new Promise(resolve =>
|
|
99
|
-
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
98
|
+
return new Promise(resolve => {
|
|
99
|
+
let frame = -1;
|
|
100
|
+
const onAbort = () => {
|
|
101
|
+
if (frame !== -1) {
|
|
102
|
+
cancelAnimationFrame(frame);
|
|
103
|
+
frame = -1;
|
|
104
|
+
}
|
|
105
|
+
resolve(container[property] ?? startLocation);
|
|
106
|
+
};
|
|
107
|
+
frame = requestAnimationFrame(function step(currentTime) {
|
|
108
|
+
frame = -1;
|
|
109
|
+
if (signal?.aborted) return;
|
|
110
|
+
const timeElapsed = currentTime - startTime;
|
|
111
|
+
const progress = timeElapsed / duration;
|
|
112
|
+
const location = Math.floor(startLocation + (targetLocation - startLocation) * ease((0, _commons.clamp)(progress, 0, 1)));
|
|
113
|
+
container[property] = location;
|
|
114
|
+
if (progress >= 1 && Math.abs(location - container[property]) < 10) {
|
|
115
|
+
signal?.removeEventListener("abort", onAbort);
|
|
116
|
+
return resolve(targetLocation);
|
|
117
|
+
} else if (progress > 2) {
|
|
118
|
+
(0, _console.consoleWarn)("Scroll target is not reachable");
|
|
119
|
+
signal?.removeEventListener("abort", onAbort);
|
|
120
|
+
return resolve(container[property]);
|
|
121
|
+
}
|
|
122
|
+
frame = requestAnimationFrame(step);
|
|
123
|
+
});
|
|
124
|
+
signal?.addEventListener("abort", onAbort, {
|
|
125
|
+
once: true
|
|
126
|
+
});
|
|
127
|
+
});
|
|
111
128
|
}
|
|
@@ -40,4 +40,4 @@ export declare function clampTarget(container: HTMLElement, value: number, horiz
|
|
|
40
40
|
* @param horizontal …
|
|
41
41
|
* @param goTo …
|
|
42
42
|
*/
|
|
43
|
-
export declare function scrollTo(_target: ComponentPublicInstance | HTMLElement | number | string, _options: Partial<IGoToOptions>, horizontal?: boolean, goTo?: IGoToInstance): Promise<unknown>;
|
|
43
|
+
export declare function scrollTo(_target: ComponentPublicInstance | HTMLElement | number | string, _options: Partial<IGoToOptions>, horizontal?: boolean, goTo?: IGoToInstance, signal?: AbortSignal): Promise<unknown>;
|
|
@@ -54,7 +54,7 @@ export function clampTarget(container, value, horizontal) {
|
|
|
54
54
|
}
|
|
55
55
|
return Math.max(Math.min(value, max), min);
|
|
56
56
|
}
|
|
57
|
-
export async function scrollTo(_target, _options, horizontal, goTo) {
|
|
57
|
+
export async function scrollTo(_target, _options, horizontal, goTo, signal) {
|
|
58
58
|
const rtl = goTo?.rtl.value;
|
|
59
59
|
const property = horizontal ? "scrollLeft" : "scrollTop";
|
|
60
60
|
const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
|
|
@@ -81,19 +81,34 @@ export async function scrollTo(_target, _options, horizontal, goTo) {
|
|
|
81
81
|
if (targetLocation === startLocation) return Promise.resolve(targetLocation);
|
|
82
82
|
const startTime = performance.now();
|
|
83
83
|
const duration = options.duration;
|
|
84
|
-
return new Promise((resolve) =>
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
84
|
+
return new Promise((resolve) => {
|
|
85
|
+
let frame = -1;
|
|
86
|
+
const onAbort = () => {
|
|
87
|
+
if (frame !== -1) {
|
|
88
|
+
cancelAnimationFrame(frame);
|
|
89
|
+
frame = -1;
|
|
90
|
+
}
|
|
91
|
+
resolve(container[property] ?? startLocation);
|
|
92
|
+
};
|
|
93
|
+
frame = requestAnimationFrame(function step(currentTime) {
|
|
94
|
+
frame = -1;
|
|
95
|
+
if (signal?.aborted) return;
|
|
96
|
+
const timeElapsed = currentTime - startTime;
|
|
97
|
+
const progress = timeElapsed / duration;
|
|
98
|
+
const location = Math.floor(
|
|
99
|
+
startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1))
|
|
100
|
+
);
|
|
101
|
+
container[property] = location;
|
|
102
|
+
if (progress >= 1 && Math.abs(location - container[property]) < 10) {
|
|
103
|
+
signal?.removeEventListener("abort", onAbort);
|
|
104
|
+
return resolve(targetLocation);
|
|
105
|
+
} else if (progress > 2) {
|
|
106
|
+
consoleWarn("Scroll target is not reachable");
|
|
107
|
+
signal?.removeEventListener("abort", onAbort);
|
|
108
|
+
return resolve(container[property]);
|
|
109
|
+
}
|
|
110
|
+
frame = requestAnimationFrame(step);
|
|
111
|
+
});
|
|
112
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
113
|
+
});
|
|
99
114
|
}
|
|
@@ -63,6 +63,17 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
63
63
|
}
|
|
64
64
|
return typeof props.offset === "number" ? [props.offset, 0] : [0, 0];
|
|
65
65
|
});
|
|
66
|
+
let disposed = false;
|
|
67
|
+
const frames = /* @__PURE__ */new Set();
|
|
68
|
+
const scheduleFrame = cb => {
|
|
69
|
+
if (disposed || typeof requestAnimationFrame === "undefined") return;
|
|
70
|
+
const id = requestAnimationFrame(() => {
|
|
71
|
+
frames.delete(id);
|
|
72
|
+
if (disposed) return;
|
|
73
|
+
cb();
|
|
74
|
+
});
|
|
75
|
+
frames.add(id);
|
|
76
|
+
};
|
|
66
77
|
let observe = false;
|
|
67
78
|
const observer = new ResizeObserver(() => {
|
|
68
79
|
if (observe) updateLocation();
|
|
@@ -76,11 +87,14 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
76
87
|
immediate: true
|
|
77
88
|
});
|
|
78
89
|
(0, _vue.onScopeDispose)(() => {
|
|
90
|
+
disposed = true;
|
|
91
|
+
for (const id of frames) cancelAnimationFrame(id);
|
|
92
|
+
frames.clear();
|
|
79
93
|
observer.disconnect();
|
|
80
94
|
});
|
|
81
95
|
const updateLocation = () => {
|
|
82
96
|
observe = false;
|
|
83
|
-
|
|
97
|
+
scheduleFrame(() => observe = true);
|
|
84
98
|
if (!data.target.value || !data.contentEl.value) return;
|
|
85
99
|
const targetBox = (0, _box2.getTargetBox)(data.target.value);
|
|
86
100
|
const contentBox = getIntrinsicSize(data.contentEl.value);
|
|
@@ -265,6 +279,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
265
279
|
};
|
|
266
280
|
(0, _vue.watch)(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation());
|
|
267
281
|
(0, _vue.nextTick)(() => {
|
|
282
|
+
if (disposed) return;
|
|
268
283
|
const result = updateLocation();
|
|
269
284
|
if (!result) return;
|
|
270
285
|
const {
|
|
@@ -272,9 +287,9 @@ function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
272
287
|
contentBox
|
|
273
288
|
} = result;
|
|
274
289
|
if (contentBox.height > available.y) {
|
|
275
|
-
|
|
290
|
+
scheduleFrame(() => {
|
|
276
291
|
updateLocation();
|
|
277
|
-
|
|
292
|
+
scheduleFrame(() => {
|
|
278
293
|
updateLocation();
|
|
279
294
|
});
|
|
280
295
|
});
|
|
@@ -50,6 +50,17 @@ export function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
50
50
|
}
|
|
51
51
|
return typeof props.offset === "number" ? [props.offset, 0] : [0, 0];
|
|
52
52
|
});
|
|
53
|
+
let disposed = false;
|
|
54
|
+
const frames = /* @__PURE__ */ new Set();
|
|
55
|
+
const scheduleFrame = (cb) => {
|
|
56
|
+
if (disposed || typeof requestAnimationFrame === "undefined") return;
|
|
57
|
+
const id = requestAnimationFrame(() => {
|
|
58
|
+
frames.delete(id);
|
|
59
|
+
if (disposed) return;
|
|
60
|
+
cb();
|
|
61
|
+
});
|
|
62
|
+
frames.add(id);
|
|
63
|
+
};
|
|
53
64
|
let observe = false;
|
|
54
65
|
const observer = new ResizeObserver(() => {
|
|
55
66
|
if (observe) updateLocation();
|
|
@@ -63,11 +74,14 @@ export function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
63
74
|
immediate: true
|
|
64
75
|
});
|
|
65
76
|
onScopeDispose(() => {
|
|
77
|
+
disposed = true;
|
|
78
|
+
for (const id of frames) cancelAnimationFrame(id);
|
|
79
|
+
frames.clear();
|
|
66
80
|
observer.disconnect();
|
|
67
81
|
});
|
|
68
82
|
const updateLocation = () => {
|
|
69
83
|
observe = false;
|
|
70
|
-
|
|
84
|
+
scheduleFrame(() => observe = true);
|
|
71
85
|
if (!data.target.value || !data.contentEl.value) return;
|
|
72
86
|
const targetBox = getTargetBox(data.target.value);
|
|
73
87
|
const contentBox = getIntrinsicSize(data.contentEl.value);
|
|
@@ -237,13 +251,14 @@ export function connectedLocationStrategy(data, props, contentStyles) {
|
|
|
237
251
|
() => updateLocation()
|
|
238
252
|
);
|
|
239
253
|
nextTick(() => {
|
|
254
|
+
if (disposed) return;
|
|
240
255
|
const result = updateLocation();
|
|
241
256
|
if (!result) return;
|
|
242
257
|
const { available, contentBox } = result;
|
|
243
258
|
if (contentBox.height > available.y) {
|
|
244
|
-
|
|
259
|
+
scheduleFrame(() => {
|
|
245
260
|
updateLocation();
|
|
246
|
-
|
|
261
|
+
scheduleFrame(() => {
|
|
247
262
|
updateLocation();
|
|
248
263
|
});
|
|
249
264
|
});
|
|
@@ -149,11 +149,15 @@ function rippleHide(e) {
|
|
|
149
149
|
});
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
|
-
|
|
152
|
+
const store = element._ripple;
|
|
153
|
+
const resetTouched = setTimeout(() => {
|
|
154
|
+
store.timers?.delete(resetTouched);
|
|
153
155
|
if (element._ripple) {
|
|
154
156
|
element._ripple.touched = false;
|
|
155
157
|
}
|
|
156
158
|
});
|
|
159
|
+
store.timers ??= /* @__PURE__ */new Set();
|
|
160
|
+
store.timers.add(resetTouched);
|
|
157
161
|
_ripple.RIPPLES.hide(element);
|
|
158
162
|
}
|
|
159
163
|
function rippleCancelShow(e) {
|
|
@@ -110,11 +110,15 @@ export function rippleHide(e) {
|
|
|
110
110
|
});
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
|
-
|
|
113
|
+
const store = element._ripple;
|
|
114
|
+
const resetTouched = setTimeout(() => {
|
|
115
|
+
store.timers?.delete(resetTouched);
|
|
114
116
|
if (element._ripple) {
|
|
115
117
|
element._ripple.touched = false;
|
|
116
118
|
}
|
|
117
119
|
});
|
|
120
|
+
store.timers ??= /* @__PURE__ */ new Set();
|
|
121
|
+
store.timers.add(resetTouched);
|
|
118
122
|
RIPPLES.hide(element);
|
|
119
123
|
}
|
|
120
124
|
export function rippleCancelShow(e) {
|