@pinuts/bsr-uikit-relaunch 0.3.8 → 0.4.3
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/config-overrides.js +1 -0
- package/dist/hooks/useValidationMessage.d.ts.map +1 -1
- package/dist/hooks/useValidationMessage.js +8 -1
- package/dist/hooks/withFieldGroup.d.ts.map +1 -1
- package/dist/hooks/withFieldGroup.js +35 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts +25 -0
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts.map +1 -0
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.js +77 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts +7 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts.map +1 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.js +117 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts +26 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts.map +1 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.js +73 -0
- package/dist/items/BSRAddressSelector/BSRAddressButtons.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAddressButtons.js +10 -0
- package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts +1 -0
- package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAddressSelector.js +21 -2
- package/dist/items/BSRAddressSelector/BSRAutocompleteField.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAutocompleteField.js +14 -3
- package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.js +6 -0
- package/dist/items/BSRAddressSelector/HouseNumberSelectField.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/HouseNumberSelectField.js +5 -0
- package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.d.ts.map +1 -1
- package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.js +2 -1
- package/dist/items/DateInputField/DateInputField.d.ts.map +1 -1
- package/dist/items/DateInputField/DateInputField.js +2 -1
- package/dist/items/FileUploadField/FileUploadField.d.ts +4 -0
- package/dist/items/FileUploadField/FileUploadField.d.ts.map +1 -0
- package/dist/items/FileUploadField/FileUploadField.js +271 -0
- package/dist/items/FileUploadField/uploadedFileStore.d.ts +4 -0
- package/dist/items/FileUploadField/uploadedFileStore.d.ts.map +1 -0
- package/dist/items/FileUploadField/uploadedFileStore.js +31 -0
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts +1 -0
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts.map +1 -1
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.js +1 -0
- package/dist/items/GroupInputField/GroupInputField.d.ts.map +1 -1
- package/dist/items/GroupInputField/GroupInputField.js +41 -4
- package/dist/items/Modal/Modal.d.ts.map +1 -1
- package/dist/items/Modal/Modal.js +6 -1
- package/dist/items/MultiSelectField/MultiSelectField.d.ts.map +1 -1
- package/dist/items/MultiSelectField/MultiSelectField.js +15 -2
- package/dist/items/NumberInputField/NumberInputField.d.ts.map +1 -1
- package/dist/items/NumberInputField/NumberInputField.js +2 -1
- package/dist/items/ReviewValue/ReviewValueList.d.ts +17 -0
- package/dist/items/ReviewValue/ReviewValueList.d.ts.map +1 -0
- package/dist/items/ReviewValue/ReviewValueList.js +36 -0
- package/dist/items/SectionSpinner/SectionSpinner.d.ts +1 -0
- package/dist/items/SectionSpinner/SectionSpinner.d.ts.map +1 -1
- package/dist/items/SelectField/SelectField.d.ts.map +1 -1
- package/dist/items/SelectField/SelectField.js +3 -2
- package/dist/items/StaticAlert/StaticAlert.d.ts +1 -0
- package/dist/items/StaticAlert/StaticAlert.d.ts.map +1 -1
- package/dist/items/TextAreaField/TextAreaField.d.ts.map +1 -1
- package/dist/items/TextAreaField/TextAreaField.js +8 -0
- package/dist/items/TextBox/TextBox.d.ts +1 -0
- package/dist/items/TextBox/TextBox.d.ts.map +1 -1
- package/dist/items/TextBox/TextBox.js +11 -2
- package/dist/items/TextInputField/TextInputField.d.ts.map +1 -1
- package/dist/items/TextInputField/TextInputField.js +8 -1
- package/dist/items/Toast/Toast.d.ts +1 -0
- package/dist/items/Toast/Toast.d.ts.map +1 -1
- package/dist/items/ToggleSwitchField/ToggleSwitchField.d.ts.map +1 -1
- package/dist/items/ToggleSwitchField/ToggleSwitchField.js +2 -1
- package/dist/items/index.d.ts +4 -1
- package/dist/items/index.d.ts.map +1 -1
- package/dist/items/index.js +22 -1
- package/dist/items/validations.d.ts.map +1 -0
- package/dist/items/validations.js +27 -0
- package/dist/locales.d.ts +73 -2
- package/dist/locales.js +64 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts +16 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts.map +1 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.js +144 -0
- package/dist/shared/FormWidget/FormWidget.d.ts +30 -0
- package/dist/shared/FormWidget/FormWidget.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidget.js +165 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.d.ts +29 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.js +84 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.d.ts +26 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.js +55 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts +20 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.js +37 -0
- package/dist/shared/FormWidget/captions.d.ts +33 -0
- package/dist/shared/FormWidget/captions.d.ts.map +1 -0
- package/dist/shared/FormWidget/captions.js +43 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts +23 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts.map +1 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.js +173 -0
- package/dist/styles/_errorMessagesInfoBox.scss +42 -0
- package/dist/styles/_forcedColors.scss +159 -0
- package/dist/styles/_form.scss +104 -0
- package/dist/styles/_review.scss +29 -0
- package/dist/styles/main.scss +63 -49
- package/dist/styles/variables/_buttons.scss +4 -3
- package/dist/styles/variables/_variables.scss +15 -2
- package/dist/utils/files/convertFilesToUploadFiles.d.ts +8 -0
- package/dist/utils/files/convertFilesToUploadFiles.d.ts.map +1 -0
- package/dist/utils/files/convertFilesToUploadFiles.js +33 -0
- package/dist/utils/files/formatFileSize.d.ts +3 -0
- package/dist/utils/files/formatFileSize.d.ts.map +1 -0
- package/dist/utils/files/formatFileSize.js +44 -0
- package/dist/utils/files/generateUniqueFilename.d.ts +3 -0
- package/dist/utils/files/generateUniqueFilename.d.ts.map +1 -0
- package/dist/utils/files/generateUniqueFilename.js +32 -0
- package/dist/utils/files/index.d.ts +7 -0
- package/dist/utils/files/index.d.ts.map +1 -0
- package/dist/utils/files/index.js +71 -0
- package/dist/utils/files/validateFiles.d.ts +9 -0
- package/dist/utils/files/validateFiles.d.ts.map +1 -0
- package/dist/utils/files/validateFiles.js +28 -0
- package/dist/utils/files/validateFilesBySize.d.ts +6 -0
- package/dist/utils/files/validateFilesBySize.d.ts.map +1 -0
- package/dist/utils/files/validateFilesBySize.js +31 -0
- package/dist/utils/files/validateFilesByType.d.ts +9 -0
- package/dist/utils/files/validateFilesByType.d.ts.map +1 -0
- package/dist/utils/files/validateFilesByType.js +79 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/reviewValue.d.ts +3 -0
- package/dist/utils/reviewValue.d.ts.map +1 -0
- package/dist/utils/reviewValue.js +16 -0
- package/package.json +1 -1
- package/webpack.config.js +3 -0
- package/dist/items/eventWizardItems/validations.d.ts.map +0 -1
- package/dist/items/eventWizardItems/validations.js +0 -7
- /package/dist/items/{eventWizardItems/validations.d.ts → validations.d.ts} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _reactI18next = require("react-i18next");
|
|
10
|
+
var _HTMLParserSanitized = require("../../items/HTMLParserSanitized/HTMLParserSanitized.jsx");
|
|
11
|
+
var _SectionSpinner = _interopRequireDefault(require("../../items/SectionSpinner/SectionSpinner.jsx"));
|
|
12
|
+
var _isWindowAvailable = require("../../utils/isWindowAvailable.js");
|
|
13
|
+
var _FormWidget = _interopRequireDefault(require("../FormWidget/FormWidget.jsx"));
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
|
+
const WIDGET_CONFIG_PATH = '/de.bsr.kehrenbuerger.widget/formConfig';
|
|
18
|
+
const AKTION_PATH = '/de.bsr.kehrenbuerger.aktionen/aktion';
|
|
19
|
+
|
|
20
|
+
// Leere Captions rausfiltern, damit die Defaults des FormWidget greifen
|
|
21
|
+
const withoutEmpty = caption => Object.fromEntries(Object.entries(caption).filter(_ref => {
|
|
22
|
+
let [, text] = _ref;
|
|
23
|
+
return Boolean(text);
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
// Das Backend liefert die Kehrenbürger-Struktur (formPage/confirmPage/...),
|
|
27
|
+
// das FormWidget erwartet formPage/controlPage/successPage.
|
|
28
|
+
const mapCaptions = function () {
|
|
29
|
+
let captions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
30
|
+
return {
|
|
31
|
+
formPage: withoutEmpty({
|
|
32
|
+
header: captions.formPage?.header,
|
|
33
|
+
text: captions.formPage?.text,
|
|
34
|
+
submitBtn: captions.formPage?.nextBtn
|
|
35
|
+
}),
|
|
36
|
+
controlPage: withoutEmpty({
|
|
37
|
+
header: captions.confirmPage?.header,
|
|
38
|
+
text: captions.confirmPage?.text,
|
|
39
|
+
backBtn: captions.confirmPage?.backBtn,
|
|
40
|
+
submitBtn: captions.confirmPage?.saveBtn
|
|
41
|
+
}),
|
|
42
|
+
successPage: withoutEmpty({
|
|
43
|
+
header: captions.successPage?.header,
|
|
44
|
+
text: captions.successPage?.text
|
|
45
|
+
})
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Das Backend erwartet die Werte unter "data"
|
|
50
|
+
const transformPayload = values => ({
|
|
51
|
+
data: values
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Bestätigungs-Link (Double-Opt-In): ?c=<aktionId> in der URL.
|
|
55
|
+
// Prod nutzt normale URLs (?c=... vor dem #), die CMS-Vorschau Hash-URLs
|
|
56
|
+
// (#/pfad?c=...) - deshalb beide Stellen prüfen.
|
|
57
|
+
const getDoiAktionId = () => {
|
|
58
|
+
if (!(0, _isWindowAvailable.isWindowAvailable)()) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const fromSearch = new URLSearchParams(window.location.search).get('c');
|
|
62
|
+
if (fromSearch) {
|
|
63
|
+
return fromSearch;
|
|
64
|
+
}
|
|
65
|
+
const hash = window.location.hash || '';
|
|
66
|
+
const queryIndex = hash.indexOf('?');
|
|
67
|
+
return queryIndex === -1 ? null : new URLSearchParams(hash.slice(queryIndex + 1)).get('c');
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Kehrenbürger-Anmeldeformular als eigenständige Komponente (ohne HTML-Rahmen).
|
|
72
|
+
* Lädt FormConfig und Captions vom RestProxy und rendert das FormWidget.
|
|
73
|
+
*
|
|
74
|
+
* Enthält die URL einen `c`-Parameter, ist es ein DOI-Bestätigungslink: dann
|
|
75
|
+
* wird die Anmeldung per PUT bestätigt und nur die Bestätigungsmeldung gezeigt.
|
|
76
|
+
*/
|
|
77
|
+
const KehrenbuergerForm = _ref2 => {
|
|
78
|
+
let {
|
|
79
|
+
restUrl = '/p',
|
|
80
|
+
showControlPage = true,
|
|
81
|
+
className
|
|
82
|
+
} = _ref2;
|
|
83
|
+
const [t] = (0, _reactI18next.useTranslation)();
|
|
84
|
+
const configUrl = `${restUrl}${WIDGET_CONFIG_PATH}`;
|
|
85
|
+
const submitUrl = `${restUrl}${AKTION_PATH}`;
|
|
86
|
+
const doiAktionId = (0, _react.useMemo)(() => getDoiAktionId(), []);
|
|
87
|
+
const isDoiMode = Boolean(doiAktionId);
|
|
88
|
+
const [formConfig, setFormConfig] = (0, _react.useState)(null);
|
|
89
|
+
const [rawCaptions, setRawCaptions] = (0, _react.useState)(null);
|
|
90
|
+
const [loadError, setLoadError] = (0, _react.useState)(false);
|
|
91
|
+
const [doiMessage, setDoiMessage] = (0, _react.useState)('');
|
|
92
|
+
|
|
93
|
+
// FormConfig + Captions laden (Captions werden auch im DOI-Modus gebraucht)
|
|
94
|
+
(0, _react.useEffect)(() => {
|
|
95
|
+
let aborted = false;
|
|
96
|
+
fetch(configUrl).then(response => {
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`${configUrl} antwortete mit Status ${response.status}`);
|
|
99
|
+
}
|
|
100
|
+
return response.json();
|
|
101
|
+
}).then(json => {
|
|
102
|
+
if (aborted) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const formConfigs = json?.data?.formConfigs;
|
|
106
|
+
if (!formConfigs?.anmeldung) {
|
|
107
|
+
throw new Error('In der Antwort fehlt data.formConfigs.anmeldung');
|
|
108
|
+
}
|
|
109
|
+
setFormConfig(formConfigs.anmeldung);
|
|
110
|
+
setRawCaptions(formConfigs.captions || {});
|
|
111
|
+
}).catch(() => {
|
|
112
|
+
if (!aborted) {
|
|
113
|
+
setLoadError(true);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return () => {
|
|
117
|
+
aborted = true;
|
|
118
|
+
};
|
|
119
|
+
}, [configUrl]);
|
|
120
|
+
|
|
121
|
+
// DOI: Anmeldung per PUT bestätigen, sobald die Captions da sind
|
|
122
|
+
const doiConfirmed = (0, _react.useRef)(false);
|
|
123
|
+
(0, _react.useEffect)(() => {
|
|
124
|
+
if (!isDoiMode || !rawCaptions || doiConfirmed.current) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
doiConfirmed.current = true;
|
|
128
|
+
const doiCaption = rawCaptions.doiPage || {};
|
|
129
|
+
fetch(`${submitUrl}/doi/${doiAktionId}`, {
|
|
130
|
+
method: 'PUT',
|
|
131
|
+
credentials: 'include',
|
|
132
|
+
headers: {
|
|
133
|
+
'X-CSRF-Safe': 'yes'
|
|
134
|
+
}
|
|
135
|
+
}).then(response => response.json().catch(() => ({}))).then(json => {
|
|
136
|
+
setDoiMessage(json?.success ? doiCaption.success : doiCaption.failed);
|
|
137
|
+
}).catch(() => {
|
|
138
|
+
setDoiMessage(doiCaption.failed);
|
|
139
|
+
});
|
|
140
|
+
}, [isDoiMode, rawCaptions, doiAktionId, submitUrl]);
|
|
141
|
+
const captions = (0, _react.useMemo)(() => mapCaptions(rawCaptions || {}), [rawCaptions]);
|
|
142
|
+
if (loadError) {
|
|
143
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
144
|
+
className: "alert alert-danger"
|
|
145
|
+
}, t('bsrItems.kehrenbuerger.loadError'));
|
|
146
|
+
}
|
|
147
|
+
if (!formConfig || !rawCaptions) {
|
|
148
|
+
return /*#__PURE__*/_react.default.createElement(_SectionSpinner.default, null);
|
|
149
|
+
}
|
|
150
|
+
if (isDoiMode) {
|
|
151
|
+
const doiCaption = rawCaptions.doiPage || {};
|
|
152
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
153
|
+
className: className
|
|
154
|
+
}, doiCaption.header && /*#__PURE__*/_react.default.createElement("h1", null, doiCaption.header), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, doiMessage || t('bsrItems.kehrenbuerger.waitDoi'))));
|
|
155
|
+
}
|
|
156
|
+
return /*#__PURE__*/_react.default.createElement(_FormWidget.default, {
|
|
157
|
+
className: className,
|
|
158
|
+
formId: "kehrenbuerger",
|
|
159
|
+
formConfig: formConfig,
|
|
160
|
+
captions: captions,
|
|
161
|
+
submitUrl: submitUrl,
|
|
162
|
+
method: "POST",
|
|
163
|
+
showControlPage: showControlPage,
|
|
164
|
+
transformPayload: transformPayload
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
KehrenbuergerForm.propTypes = {
|
|
168
|
+
// Basis-URL des RestProxy, z.B. '/p'
|
|
169
|
+
restUrl: _propTypes.default.string,
|
|
170
|
+
showControlPage: _propTypes.default.bool,
|
|
171
|
+
className: _propTypes.default.string
|
|
172
|
+
};
|
|
173
|
+
var _default = exports.default = KehrenbuergerForm;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Fehlerbox über dem Formular. Klassen und Styles entsprechen den BSR-Formularen
|
|
2
|
+
// (vgl. sepa-basis-lastschriftmandat-cf2), damit die Box in Consumer-Projekten
|
|
3
|
+
// mit BSR-Styles identisch aussieht - und ohne sie ebenfalls korrekt.
|
|
4
|
+
.pi-form-control__has-error {
|
|
5
|
+
display: block;
|
|
6
|
+
|
|
7
|
+
.pi-message-text {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
margin: 0 0 ($base-gap * 4);
|
|
11
|
+
padding: ($base-gap * 3) ($base-gap * 5); // 12px 20px
|
|
12
|
+
border: $bsr-border-width-l solid $error;
|
|
13
|
+
border-radius: $border-radius;
|
|
14
|
+
background-color: $white;
|
|
15
|
+
color: $error;
|
|
16
|
+
box-shadow: $bsr-shadow-default;
|
|
17
|
+
|
|
18
|
+
// leere Elemente (z.B. Caption ohne Text) nicht als Lücke rendern
|
|
19
|
+
> *:empty {
|
|
20
|
+
display: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
p {
|
|
24
|
+
margin: 0 0 ($base-gap * 4);
|
|
25
|
+
font-weight: $fontweight-bold;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ul {
|
|
29
|
+
margin: 0;
|
|
30
|
+
padding-inline-start: $base-gap * 2;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
li {
|
|
34
|
+
color: $error;
|
|
35
|
+
|
|
36
|
+
a {
|
|
37
|
+
color: $bsr-black-90;
|
|
38
|
+
text-decoration: underline;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
|
|
3
|
+
// =========================================================================
|
|
4
|
+
// FORCED COLORS / HIGH CONTRAST
|
|
5
|
+
// (Windows-Kontrastdesigns, Firefox "Website contrast: Custom")
|
|
6
|
+
//
|
|
7
|
+
// Der Browser erzwingt dann eigene Farben. Zwei Fehlerbilder:
|
|
8
|
+
// 1. Indikator als url()-SVG -> wird NICHT umgefaerbt, bleibt orange
|
|
9
|
+
// 2. Indikator als background-color -> wird auf Canvas geflacht, verschwindet
|
|
10
|
+
// Reine box-shadow-Fokusringe verschwinden ebenfalls.
|
|
11
|
+
//
|
|
12
|
+
// Loesung: Box mit forced-color-adjust: none aus der Automatik nehmen und mit
|
|
13
|
+
// System-Keywords neu zeichnen (CanvasText = "Text", Canvas = "Hintergrund",
|
|
14
|
+
// GrayText = deaktiviert, Highlight = Auswahl/Fokus).
|
|
15
|
+
//
|
|
16
|
+
// ZWEI FALLEN:
|
|
17
|
+
// - forced-color-adjust VERERBT. Nur auf die Indikator-Box setzen, nie auf
|
|
18
|
+
// label oder Wrapper - sonst faellt der Labeltext aus der Nutzerpalette.
|
|
19
|
+
// - Wer es setzt, besitzt ALLE Farben des Elements inkl. outline-color.
|
|
20
|
+
// Bestehende Fokusregeln muessen mit fc-focus-ring gespiegelt werden.
|
|
21
|
+
//
|
|
22
|
+
// KEIN nativer Fallback (appearance: auto): Firefox malt native Controls im
|
|
23
|
+
// HCM in seiner eigenen Schwarz/Weiss-Palette und ignoriert die Nutzerfarben.
|
|
24
|
+
// Die Mixins funktionieren auf echten <input> wie auf Pseudo-Elementen.
|
|
25
|
+
// =========================================================================
|
|
26
|
+
|
|
27
|
+
/// Einziger Ansatzpunkt fuer die Media Query.
|
|
28
|
+
@mixin forced-colors {
|
|
29
|
+
@media (forced-colors: active) {
|
|
30
|
+
@content;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@mixin fc-control-box($border: CanvasText, $surface: Canvas) {
|
|
35
|
+
forced-color-adjust: none;
|
|
36
|
+
border-color: $border;
|
|
37
|
+
background-color: $surface;
|
|
38
|
+
background-image: none;
|
|
39
|
+
box-shadow: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@mixin fc-control-box-disabled($border: GrayText, $surface: Canvas) {
|
|
43
|
+
@include fc-control-box($border, $surface);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Radio-Punkt als Gradient auf der Box selbst - kein zusaetzliches Element,
|
|
47
|
+
/// kein Positionierungskontext. Setzt fc-control-box voraus, sonst wuerde der
|
|
48
|
+
/// Gradient auf none gezwungen. background-origin macht die Geometrie
|
|
49
|
+
/// unabhaengig von der Border-Breite (1,4px normal / 2px bei Hover, Fehler).
|
|
50
|
+
/// $size in px fuer bekannte Boxgroessen, oder ein Prozentwert, wenn die Box
|
|
51
|
+
/// unbekannt ist (dann skaliert der Punkt mit - der Gradient liegt ueber der
|
|
52
|
+
/// ganzen Box, `circle at center` mit Prozent-Stops).
|
|
53
|
+
@mixin fc-indicator-radio($color: CanvasText, $size: 16px) {
|
|
54
|
+
@if unit($size) == "%" {
|
|
55
|
+
$radius: $size * 0.5;
|
|
56
|
+
|
|
57
|
+
background-image: radial-gradient(
|
|
58
|
+
circle at center,
|
|
59
|
+
#{$color} 0,
|
|
60
|
+
#{$color} #{$radius},
|
|
61
|
+
transparent #{$radius + 1%}
|
|
62
|
+
);
|
|
63
|
+
} @else {
|
|
64
|
+
$radius: $size * 0.5;
|
|
65
|
+
|
|
66
|
+
background-image: radial-gradient(
|
|
67
|
+
circle at center,
|
|
68
|
+
#{$color} 0,
|
|
69
|
+
#{$color} #{$radius - 0.5px},
|
|
70
|
+
transparent #{$radius}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
background-repeat: no-repeat;
|
|
74
|
+
background-position: center;
|
|
75
|
+
background-origin: border-box;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Haken aus zwei beschnittenen Gradient-Baendern.
|
|
79
|
+
///
|
|
80
|
+
/// Groesse und Position sind in Prozent der Box ausgedrueckt, der Haken passt
|
|
81
|
+
/// sich also JEDER Boxgroesse an - noetig, weil die vom UM gelieferten
|
|
82
|
+
/// Formulare unterschiedlich grosse Controls verwenden.
|
|
83
|
+
///
|
|
84
|
+
/// Herleitung gegen die urspruengliche 24x24-Geometrie (kurzer Strich 8x8 bei
|
|
85
|
+
/// 3/10, langer 12x12 bei 9/6). background-position in Prozent bedeutet
|
|
86
|
+
/// Offset = p * (Box - Bild), daraus:
|
|
87
|
+
/// kurz: 8/24 = 33.333%, p_x = 3/(24-8) = 18.75%, p_y = 10/16 = 62.5%
|
|
88
|
+
/// lang: 12/24 = 50%, p_x = 9/(24-12) = 75%, p_y = 6/12 = 50%
|
|
89
|
+
/// Bei 24px ergibt das exakt die alten Pixelwerte.
|
|
90
|
+
///
|
|
91
|
+
/// Die Strichstaerke bleibt bewusst in px, damit der Haken auch in grossen
|
|
92
|
+
/// Boxen nicht fett wird.
|
|
93
|
+
@mixin fc-indicator-check($color: CanvasText, $stroke: 3.2px) {
|
|
94
|
+
$half: $stroke * 0.5; // deckende Haelfte
|
|
95
|
+
$soft: $half + 0.4px; // weiche Kante gegen Treppchen auf den Diagonalen
|
|
96
|
+
|
|
97
|
+
background-image:
|
|
98
|
+
// kurzer Strich, oben links -> Scheitelpunkt ("\")
|
|
99
|
+
linear-gradient(
|
|
100
|
+
45deg,
|
|
101
|
+
transparent calc(50% - #{$soft}),
|
|
102
|
+
#{$color} calc(50% - #{$half}),
|
|
103
|
+
#{$color} calc(50% + #{$half}),
|
|
104
|
+
transparent calc(50% + #{$soft})
|
|
105
|
+
),
|
|
106
|
+
// langer Strich, Scheitelpunkt -> oben rechts ("/")
|
|
107
|
+
linear-gradient(
|
|
108
|
+
135deg,
|
|
109
|
+
transparent calc(50% - #{$soft}),
|
|
110
|
+
#{$color} calc(50% - #{$half}),
|
|
111
|
+
#{$color} calc(50% + #{$half}),
|
|
112
|
+
transparent calc(50% + #{$soft})
|
|
113
|
+
);
|
|
114
|
+
background-size: 33.333% 33.333%, 50% 50%;
|
|
115
|
+
background-position: 18.75% 62.5%, 75% 50%;
|
|
116
|
+
background-repeat: no-repeat;
|
|
117
|
+
background-origin: border-box;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Pflicht auf jedem Element mit forced-color-adjust: none.
|
|
121
|
+
@mixin fc-focus-ring($color: Highlight) {
|
|
122
|
+
outline-color: $color;
|
|
123
|
+
box-shadow: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Wie fc-focus-ring, aber fuer Elemente ohne eigene outline-Deklaration
|
|
127
|
+
/// (Basiszustand setzt outline: none oder nutzt nur box-shadow).
|
|
128
|
+
@mixin fc-focus-ring-full($color: Highlight, $width: 2px, $offset: 2px) {
|
|
129
|
+
outline: $width solid $color;
|
|
130
|
+
outline-offset: $offset;
|
|
131
|
+
box-shadow: none;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// -------------------------------------------------------------------------
|
|
135
|
+
// KACHEL- / PILL-SELEKTOREN
|
|
136
|
+
// "Ausgewaehlt" allein ueber background-color wird auf Canvas geflacht und
|
|
137
|
+
// damit ununterscheidbar (WCAG 1.4.1). Systempaar dafuer: Highlight /
|
|
138
|
+
// HighlightText.
|
|
139
|
+
//
|
|
140
|
+
// Anders als bei fc-control-box vererbt forced-color-adjust hier BEWUSST an
|
|
141
|
+
// den Labeltext - der steht auf der Highlight-Flaeche. Icons folgen nur mit
|
|
142
|
+
// fill/stroke="currentColor".
|
|
143
|
+
// -------------------------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
@mixin fc-selected($surface: Highlight, $ink: HighlightText) {
|
|
146
|
+
forced-color-adjust: none;
|
|
147
|
+
background-color: $surface;
|
|
148
|
+
border-color: $surface;
|
|
149
|
+
color: $ink;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/// Gegenstueck zu fc-selected - noetig, weil der Container in beiden
|
|
153
|
+
/// Zustaenden aus der Automatik faellt.
|
|
154
|
+
@mixin fc-unselected($surface: Canvas, $ink: CanvasText) {
|
|
155
|
+
forced-color-adjust: none;
|
|
156
|
+
background-color: $surface;
|
|
157
|
+
border-color: $ink;
|
|
158
|
+
color: $ink;
|
|
159
|
+
}
|
package/dist/styles/_form.scss
CHANGED
|
@@ -228,6 +228,15 @@ textarea {
|
|
|
228
228
|
line-height: $input-label-line-height;
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
+
// Adresse des gewählten Abholorts, unterhalb der Selectbox
|
|
232
|
+
.abholort-adresse {
|
|
233
|
+
display: block;
|
|
234
|
+
margin-block-start: $base-gap * 2;
|
|
235
|
+
color: $bsr-black-90;
|
|
236
|
+
font-size: $input-label-font-size;
|
|
237
|
+
line-height: $input-label-line-height;
|
|
238
|
+
}
|
|
239
|
+
|
|
231
240
|
[aria-disabled="true"] {
|
|
232
241
|
input,
|
|
233
242
|
label {
|
|
@@ -342,6 +351,61 @@ input[type="radio"] {
|
|
|
342
351
|
outline: 2px solid white;
|
|
343
352
|
outline-offset: $bsr-border-width-m * -1 - 3px;
|
|
344
353
|
}
|
|
354
|
+
|
|
355
|
+
// FORCED COLORS: Der Punkt entsteht oben aus background-color plus einem
|
|
356
|
+
// weissen outline mit negativem Offset als Innenring. background-color wird
|
|
357
|
+
// im Kontrastmodus auf Canvas geflacht und outline-color ohnehin ersetzt -
|
|
358
|
+
// der Punkt verschwindet also. Innenring-Trick deshalb abschalten und den
|
|
359
|
+
// Punkt als Gradient in Nutzerfarben zeichnen.
|
|
360
|
+
@include forced-colors {
|
|
361
|
+
@include fc-control-box;
|
|
362
|
+
|
|
363
|
+
outline: none;
|
|
364
|
+
|
|
365
|
+
&:hover,
|
|
366
|
+
&:active {
|
|
367
|
+
@include fc-control-box;
|
|
368
|
+
|
|
369
|
+
outline: none;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
&:checked {
|
|
373
|
+
@include fc-control-box;
|
|
374
|
+
@include fc-indicator-radio;
|
|
375
|
+
|
|
376
|
+
outline: none;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
&:disabled {
|
|
380
|
+
@include fc-control-box-disabled;
|
|
381
|
+
|
|
382
|
+
outline: none;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
&:disabled:checked {
|
|
386
|
+
@include fc-control-box-disabled;
|
|
387
|
+
@include fc-indicator-radio($color: GrayText);
|
|
388
|
+
|
|
389
|
+
outline: none;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
&:focus,
|
|
393
|
+
&:focus-visible {
|
|
394
|
+
@include fc-focus-ring-full;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Kein Rot in der Palette: Fehler bleibt ueber die dickere Kontur
|
|
400
|
+
// (border-width wird nicht ueberschrieben) + Fehlermeldung erkennbar.
|
|
401
|
+
// Bewusst NICHT in den Block oben verschachtelt: `.formInput.error &` wuerde
|
|
402
|
+
// unter dem .bsr-uikit-Wrapper `.formInput.error .bsr-uikit input` ergeben,
|
|
403
|
+
// und .formInput liegt innerhalb des Wrappers.
|
|
404
|
+
@include forced-colors {
|
|
405
|
+
.formInput.error input[type="radio"] {
|
|
406
|
+
border-color: CanvasText;
|
|
407
|
+
outline: none;
|
|
408
|
+
}
|
|
345
409
|
}
|
|
346
410
|
button {
|
|
347
411
|
text-underline-offset: 3px;
|
|
@@ -479,6 +543,46 @@ form input[type="checkbox"]:focus + label:before {
|
|
|
479
543
|
box-shadow: 0 0 0 0.2rem rgba(255, 124.95, 38.25, 0.5);
|
|
480
544
|
}
|
|
481
545
|
|
|
546
|
+
// FORCED COLORS: Der Haken oben ist ein url()-SVG und wird nicht umgefaerbt,
|
|
547
|
+
// Hover und Fokus sind reine box-shadow und verschwinden. Der Input selbst ist
|
|
548
|
+
// visuell versteckt, Box und Indikator liegen auf label:before - deshalb muss
|
|
549
|
+
// auch der Fokusring dorthin.
|
|
550
|
+
@include forced-colors {
|
|
551
|
+
form input[type="checkbox"] + label:before {
|
|
552
|
+
@include fc-control-box;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Keine graue Hover-Vorschau: Hover zeigt oben nur eine dickere Kontur
|
|
556
|
+
// (border-width, keine Farbe - bleibt im Kontrastmodus erhalten). Ein Haken
|
|
557
|
+
// bei Hover wuerde einen nicht gesetzten Zustand vortaeuschen.
|
|
558
|
+
|
|
559
|
+
form input[type="checkbox"]:checked + label:before,
|
|
560
|
+
form input[type="checkbox"]:checked + label:hover:before {
|
|
561
|
+
@include fc-control-box;
|
|
562
|
+
@include fc-indicator-check;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// NICHT :read-only mitnehmen - das matcht JEDE Checkbox, weil :read-write
|
|
566
|
+
// nur fuer textuell editierbare Elemente gilt.
|
|
567
|
+
form input[type="checkbox"]:disabled + label:before {
|
|
568
|
+
@include fc-control-box-disabled;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
form input[type="checkbox"]:disabled:checked + label:before {
|
|
572
|
+
@include fc-control-box-disabled;
|
|
573
|
+
@include fc-indicator-check($color: GrayText);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
form input[type="checkbox"]:focus + label:before,
|
|
577
|
+
form input[type="checkbox"]:focus-visible + label:before {
|
|
578
|
+
@include fc-focus-ring-full;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
.formInput.error input[type="checkbox"] + label:before {
|
|
582
|
+
border-color: CanvasText;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
482
586
|
/* TAG */
|
|
483
587
|
.tag {
|
|
484
588
|
position: relative;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Kontrollseite (reviewMode). Bewusst minimal: die visuelle Feinabstimmung
|
|
2
|
+
// (Kontraste, Abstände) folgt in einem eigenen Schritt.
|
|
3
|
+
.pi-review {
|
|
4
|
+
.pi-review-item {
|
|
5
|
+
margin: 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.pi-review-pair {
|
|
9
|
+
margin-bottom: $base-gap * 3;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
dt {
|
|
13
|
+
font-weight: $fontweight-bold;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
dd {
|
|
17
|
+
margin: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Zeilenumbrüche aus Textarea-Eingaben sichtbar halten
|
|
21
|
+
.pi-review-multiline {
|
|
22
|
+
white-space: pre-line;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.pi-review-values {
|
|
26
|
+
margin: 0;
|
|
27
|
+
padding-inline-start: $base-gap * 4;
|
|
28
|
+
}
|
|
29
|
+
}
|
package/dist/styles/main.scss
CHANGED
|
@@ -1,92 +1,106 @@
|
|
|
1
1
|
@use "sass:math";
|
|
2
2
|
@import "./variables/_variables.scss";
|
|
3
|
-
@import "./
|
|
4
|
-
@import "./form";
|
|
3
|
+
@import "./forcedColors";
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
// All CSS-emitting styles are scoped under `.bsr-uikit` so the UI-KIT's
|
|
6
|
+
// global styles (element selectors like h1/body/p and class rules) do not
|
|
7
|
+
// leak into consumer projects. Consumers opt in by adding the class
|
|
8
|
+
// `bsr-uikit` to a wrapping element (e.g. the app root or a container
|
|
9
|
+
// around UI-KIT components).
|
|
10
|
+
//
|
|
11
|
+
// Note: _variables.scss above only defines SCSS variables/functions and
|
|
12
|
+
// emits no CSS, so it stays outside the wrapper.
|
|
13
|
+
.bsr-uikit {
|
|
14
|
+
@import "./ariakit_combobox";
|
|
15
|
+
@import "./form";
|
|
16
|
+
@import "./errorMessagesInfoBox";
|
|
17
|
+
@import "./review";
|
|
18
|
+
@import "./variables/_buttons.scss";
|
|
19
|
+
@import "./variables/_images.scss";
|
|
9
20
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
input {
|
|
18
|
-
background: $bsr-black-10;
|
|
21
|
+
// Base font previously applied to `body`; scoped to the wrapper element
|
|
22
|
+
// itself so it does not leak to the consumer's <body>.
|
|
23
|
+
font-family: $fontfamily-base;
|
|
24
|
+
font-size: $defaultBrowserFontSize;
|
|
25
|
+
|
|
26
|
+
.sr-only {
|
|
27
|
+
display: none;
|
|
19
28
|
}
|
|
20
|
-
}
|
|
21
29
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
[aria-disabled="true"] {
|
|
31
|
+
input,
|
|
32
|
+
label {
|
|
33
|
+
color: $bsr-black-40;
|
|
34
|
+
border-color: $bsr-black-40;
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
input {
|
|
38
|
+
background: $bsr-black-10;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
26
41
|
|
|
27
|
-
p, span {
|
|
42
|
+
p, span {
|
|
28
43
|
font-family: $fontfamily-base;
|
|
29
|
-
}
|
|
44
|
+
}
|
|
30
45
|
|
|
31
|
-
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
|
46
|
+
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
|
|
32
47
|
font-family: $fontfamily-heading;
|
|
33
48
|
color: $bsr-black-90;
|
|
34
49
|
font-weight: $fontweight-bold;
|
|
35
50
|
scroll-margin-top: $base-gap * 18;
|
|
36
|
-
}
|
|
51
|
+
}
|
|
37
52
|
|
|
38
|
-
h1, .h1 {
|
|
53
|
+
h1, .h1 {
|
|
39
54
|
font-size: $h1-fontsize;
|
|
40
55
|
line-height: $h1-lineheight;
|
|
41
56
|
letter-spacing: $letter-spacing-lg;
|
|
42
|
-
margin-bottom: $base-gap * 10;
|
|
43
57
|
|
|
44
58
|
@media screen and (max-width: $screen-sm-max) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
margin-bottom: $base-gap * 3;
|
|
59
|
+
font-size: $h1-fontsize-sm;
|
|
60
|
+
line-height: $h1-lineheight-sm;
|
|
61
|
+
letter-spacing: $letter-spacing-sm;
|
|
49
62
|
}
|
|
50
|
-
}
|
|
63
|
+
}
|
|
51
64
|
|
|
52
|
-
h2, .h2 {
|
|
65
|
+
h2, .h2 {
|
|
53
66
|
font-size: $h2-fontsize;
|
|
54
67
|
line-height: $h2-lineheight;
|
|
55
68
|
letter-spacing: $letter-spacing-md;
|
|
56
69
|
margin-bottom: $base-gap * 5;
|
|
57
70
|
|
|
58
71
|
@media screen and (max-width: $screen-sm-max) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
font-size: $h2-fontsize-sm;
|
|
73
|
+
line-height: $h2-lineheight-sm;
|
|
74
|
+
margin-bottom: $base-gap * 3;
|
|
62
75
|
}
|
|
63
|
-
}
|
|
76
|
+
}
|
|
64
77
|
|
|
65
|
-
h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
|
|
78
|
+
h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
|
|
66
79
|
margin-bottom: $base-gap * 5;
|
|
67
80
|
margin-top: $base-gap * 10;
|
|
68
81
|
color: $bsr-black-90;
|
|
69
82
|
|
|
70
83
|
@media screen and (max-width: $screen-sm-max) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
font-size: $h3-fontsize-sm;
|
|
85
|
+
line-height: $h3-lineheight-sm;
|
|
86
|
+
margin-bottom: $base-gap * 3;
|
|
87
|
+
margin-top: $base-gap * 8;
|
|
75
88
|
}
|
|
76
|
-
}
|
|
89
|
+
}
|
|
77
90
|
|
|
78
|
-
q {
|
|
91
|
+
q {
|
|
79
92
|
font-family: $fontfamily-heading;
|
|
80
|
-
}
|
|
93
|
+
}
|
|
81
94
|
|
|
82
|
-
footer {
|
|
95
|
+
footer {
|
|
83
96
|
font-family: $fontfamily-heading;
|
|
84
|
-
}
|
|
97
|
+
}
|
|
85
98
|
|
|
86
|
-
.rbc-wrapper .rbc-calendar {
|
|
99
|
+
.rbc-wrapper .rbc-calendar {
|
|
87
100
|
font-family: $fontfamily-base;
|
|
88
|
-
}
|
|
101
|
+
}
|
|
89
102
|
|
|
90
|
-
.rbc-date-cell.rbc-now span {
|
|
103
|
+
.rbc-date-cell.rbc-now span {
|
|
91
104
|
color: $bsr-brick-100;
|
|
92
|
-
}
|
|
105
|
+
}
|
|
106
|
+
}
|