@fkui/vue-labs 5.43.0 → 5.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -158,7 +158,7 @@ const validators = [hoursMinutesValidator, greaterThanTimeValidator, lessThanTim
158
158
  for (const validator of validators) {
159
159
  logic.ValidationService.registerValidator(validator);
160
160
  }
161
- const _sfc_main$1 = vue.defineComponent({
161
+ const _sfc_main = vue.defineComponent({
162
162
  name: "XTimeTextField",
163
163
  extends: vue$1.FTextField,
164
164
  mixins: [vue$1.TranslationMixin],
@@ -174,10 +174,8 @@ const _sfc_main$1 = vue.defineComponent({
174
174
  default: parseTimeToNumber
175
175
  }
176
176
  },
177
- setup() {
178
- return {
179
- textFieldTableMode: vue.inject("textFieldTableMode", false)
180
- };
177
+ setup(props) {
178
+ return vue$1.useTextFieldSetup(props);
181
179
  },
182
180
  mounted() {
183
181
  const inputElement = this.$el.querySelector("input");
@@ -194,73 +192,10 @@ const _sfc_main$1 = vue.defineComponent({
194
192
  logic.ValidationService.validateElement(inputElement);
195
193
  }
196
194
  });
197
- const _sfc_main = vue.defineComponent({
198
- name: "XSearchBar",
199
- components: {
200
- FIcon: vue$1.FIcon,
201
- FSearchTextField: vue$1.FSearchTextField
202
- },
203
- props: {
204
- modelValue: {
205
- type: String,
206
- required: true
207
- },
208
- maxLength: {
209
- type: Number,
210
- default: 20
211
- }
212
- },
213
- emits: ["update:modelValue", "changedValue"],
214
- computed: {
215
- value: {
216
- get() {
217
- return this.modelValue;
218
- },
219
- set(value) {
220
- if (this.value !== value) {
221
- this.$emit("changedValue", [this.value, value]);
222
- }
223
- this.$emit("update:modelValue", value);
224
- }
225
- }
226
- }
227
- });
228
- const _export_sfc = (sfc, props) => {
229
- const target = sfc.__vccOpts || sfc;
230
- for (const [key, val] of props) {
231
- target[key] = val;
232
- }
233
- return target;
234
- };
235
- const _hoisted_1 = {
236
- class: "button button--primary search-bar-button",
237
- type: "submit",
238
- "data-test": "search-bar-submit"
239
- };
240
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
241
- const _component_f_icon = vue.resolveComponent("f-icon");
242
- const _component_f_search_text_field = vue.resolveComponent("f-search-text-field");
243
- return vue.openBlock(), vue.createBlock(_component_f_search_text_field, {
244
- modelValue: _ctx.value,
245
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
246
- class: "x-search-bar",
247
- maxlength: _ctx.maxLength
248
- }, {
249
- default: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "default")]),
250
- tooltip: vue.withCtx(() => [vue.renderSlot(_ctx.$slots, "tooltip")]),
251
- "input-right": vue.withCtx(() => [vue.createElementVNode("button", _hoisted_1, [vue.createVNode(_component_f_icon, {
252
- name: "search",
253
- library: "f"
254
- }), _cache[2] || (_cache[2] = vue.createTextVNode()), vue.createElementVNode("span", null, [vue.renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = vue.createTextVNode(" Sök "))])])])]),
255
- _: 3
256
- }, 8, ["modelValue", "maxlength"]);
257
- }
258
- const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
259
195
  exports.HOURS_MINUTES_REGEXP = HOURS_MINUTES_REGEXP;
260
196
  exports.HOURS_MINUTES_WITHOUT_COLON_REGEXP = HOURS_MINUTES_WITHOUT_COLON_REGEXP;
261
197
  exports.HoursMinutesValidatorUtils = HoursMinutesValidatorUtils;
262
- exports.XSearchBar = XSearchBar;
263
- exports.XTimeTextField = _sfc_main$1;
198
+ exports.XTimeTextField = _sfc_main;
264
199
  exports.forgivingParseTimeToNumber = forgivingParseTimeToNumber;
265
200
  exports.formatNumberToTime = formatNumberToTime;
266
201
  exports.hoursMinutesStringToMinutes = hoursMinutesStringToMinutes;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue","../../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\n/**\n * @public\n */\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\n/**\n * @public\n */\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\n/**\n * @public\n */\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n *\n * @public\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\n */\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\n */\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/**\n * @public\n */\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","_resolveComponent","_openBlock","_ctx","_cache","$event","maxlength","_renderSlot","$slots","_withCtx","_createElementVNode","_createVNode","_component_f_icon","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\n/**\n * @public\n */\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\n/**\n * @public\n */\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\n/**\n * @public\n */\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n *\n * @public\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\n */\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\n */\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/**\n * @public\n */\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup(props) {\n return useTextFieldSetup(props);\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","useTextFieldSetup","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { isEmpty, stripWhitespace, TranslationService, isSet, ValidationService } from "@fkui/logic";
2
- import { defineComponent, inject, resolveComponent, openBlock, createBlock, withCtx, renderSlot, createElementVNode, createVNode, createTextVNode } from "vue";
3
- import { FTextField, TranslationMixin, FIcon, FSearchTextField } from "@fkui/vue";
2
+ import { defineComponent } from "vue";
3
+ import { FTextField, TranslationMixin, useTextFieldSetup } from "@fkui/vue";
4
4
  const HOURS_MINUTES_REGEXP = /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;
5
5
  const HOURS_MINUTES_WITHOUT_COLON_REGEXP = /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;
6
6
  function findMatch(regexps, value) {
@@ -156,7 +156,7 @@ const validators = [hoursMinutesValidator, greaterThanTimeValidator, lessThanTim
156
156
  for (const validator of validators) {
157
157
  ValidationService.registerValidator(validator);
158
158
  }
159
- const _sfc_main$1 = defineComponent({
159
+ const _sfc_main = defineComponent({
160
160
  name: "XTimeTextField",
161
161
  extends: FTextField,
162
162
  mixins: [TranslationMixin],
@@ -172,10 +172,8 @@ const _sfc_main$1 = defineComponent({
172
172
  default: parseTimeToNumber
173
173
  }
174
174
  },
175
- setup() {
176
- return {
177
- textFieldTableMode: inject("textFieldTableMode", false)
178
- };
175
+ setup(props) {
176
+ return useTextFieldSetup(props);
179
177
  },
180
178
  mounted() {
181
179
  const inputElement = this.$el.querySelector("input");
@@ -192,74 +190,11 @@ const _sfc_main$1 = defineComponent({
192
190
  ValidationService.validateElement(inputElement);
193
191
  }
194
192
  });
195
- const _sfc_main = defineComponent({
196
- name: "XSearchBar",
197
- components: {
198
- FIcon,
199
- FSearchTextField
200
- },
201
- props: {
202
- modelValue: {
203
- type: String,
204
- required: true
205
- },
206
- maxLength: {
207
- type: Number,
208
- default: 20
209
- }
210
- },
211
- emits: ["update:modelValue", "changedValue"],
212
- computed: {
213
- value: {
214
- get() {
215
- return this.modelValue;
216
- },
217
- set(value) {
218
- if (this.value !== value) {
219
- this.$emit("changedValue", [this.value, value]);
220
- }
221
- this.$emit("update:modelValue", value);
222
- }
223
- }
224
- }
225
- });
226
- const _export_sfc = (sfc, props) => {
227
- const target = sfc.__vccOpts || sfc;
228
- for (const [key, val] of props) {
229
- target[key] = val;
230
- }
231
- return target;
232
- };
233
- const _hoisted_1 = {
234
- class: "button button--primary search-bar-button",
235
- type: "submit",
236
- "data-test": "search-bar-submit"
237
- };
238
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
239
- const _component_f_icon = resolveComponent("f-icon");
240
- const _component_f_search_text_field = resolveComponent("f-search-text-field");
241
- return openBlock(), createBlock(_component_f_search_text_field, {
242
- modelValue: _ctx.value,
243
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.value = $event),
244
- class: "x-search-bar",
245
- maxlength: _ctx.maxLength
246
- }, {
247
- default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
248
- tooltip: withCtx(() => [renderSlot(_ctx.$slots, "tooltip")]),
249
- "input-right": withCtx(() => [createElementVNode("button", _hoisted_1, [createVNode(_component_f_icon, {
250
- name: "search",
251
- library: "f"
252
- }), _cache[2] || (_cache[2] = createTextVNode()), createElementVNode("span", null, [renderSlot(_ctx.$slots, "button-text", {}, () => [_cache[1] || (_cache[1] = createTextVNode(" Sök "))])])])]),
253
- _: 3
254
- }, 8, ["modelValue", "maxlength"]);
255
- }
256
- const XSearchBar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
257
193
  export {
258
194
  HOURS_MINUTES_REGEXP,
259
195
  HOURS_MINUTES_WITHOUT_COLON_REGEXP,
260
196
  HoursMinutesValidatorUtils,
261
- XSearchBar,
262
- _sfc_main$1 as XTimeTextField,
197
+ _sfc_main as XTimeTextField,
263
198
  forgivingParseTimeToNumber,
264
199
  formatNumberToTime,
265
200
  hoursMinutesStringToMinutes,
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue","../../src/components/XSearchBar/XSearchBar.vue"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\n/**\n * @public\n */\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\n/**\n * @public\n */\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\n/**\n * @public\n */\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n *\n * @public\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\n */\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\n */\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/**\n * @public\n */\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent, inject } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup() {\n return {\n textFieldTableMode: inject(\"textFieldTableMode\", false) as boolean,\n };\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n","<template>\n <f-search-text-field v-model=\"value\" class=\"x-search-bar\" :maxlength=\"maxLength\">\n <template #default>\n <!-- @slot Slot for input label -->\n <slot></slot>\n </template>\n <template #tooltip>\n <!-- @slot Slot for tooltip -->\n <slot name=\"tooltip\"></slot>\n </template>\n <template #input-right>\n <button class=\"button button--primary search-bar-button\" type=\"submit\" data-test=\"search-bar-submit\">\n <f-icon name=\"search\" library=\"f\"></f-icon>\n <span>\n <!-- @slot Slot for text in button -->\n <slot name=\"button-text\"> Sök </slot>\n </span>\n </button>\n </template>\n </f-search-text-field>\n</template>\n<script lang=\"ts\">\nimport { FIcon, FSearchTextField } from \"@fkui/vue\";\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"XSearchBar\",\n components: {\n FIcon,\n FSearchTextField,\n },\n props: {\n modelValue: {\n type: String,\n required: true,\n },\n maxLength: {\n type: Number,\n default: 20,\n },\n },\n emits: [\"update:modelValue\", \"changedValue\"],\n computed: {\n value: {\n get() {\n return this.modelValue;\n },\n set(value: string) {\n if (this.value !== value) {\n /**\n * Event that is dispatched when the value is changed and differs from the previous value.\n *\n * @event changedValue\n */\n this.$emit(\"changedValue\", [this.value, value]);\n }\n /**\n * V-model event.\n *\n * @event update:modelValue\n * @type {string}\n */\n this.$emit(\"update:modelValue\", value);\n },\n },\n },\n});\n</script>\n<style lang=\"scss\">\n@import \"./XSearchBar.scss\";\n</style>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","textFieldTableMode","inject","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement","components","FIcon","FSearchTextField","modelValue","emits","computed","get","set","$emit","_hoisted_1","class","_component_f_search_text_field","_resolveComponent","_openBlock","_ctx","_cache","$event","maxlength","_renderSlot","$slots","_withCtx","_createElementVNode","_createVNode","_component_f_icon","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/components/XTimeTextField/utils/constants.ts","../../src/components/XTimeTextField/utils/HoursMinutesNumberUtils.ts","../../src/components/XTimeTextField/converters/HoursMinutesConverter.ts","../../src/components/XTimeTextField/utils/HoursMinutesValidatorUtils.ts","../../src/components/XTimeTextField/validators/HoursMinutesValidator.ts","../../src/components/XTimeTextField/validators/GreaterThanTimeValidator.ts","../../src/components/XTimeTextField/validators/LessThanTimeValidator.ts","../../src/components/XTimeTextField/validators/MaxTimeValidator.ts","../../src/components/XTimeTextField/validators/MinTimeValidator.ts","../../src/components/XTimeTextField/validators/index.ts","../../src/components/XTimeTextField/XTimeTextField.vue"],"sourcesContent":["/**\n * @public\n */\nexport const HOURS_MINUTES_REGEXP =\n /^(?<hours>[0-9]+)?(:(?<minutes>[0-5][0-9]))?$/;\n\n/**\n * @public\n */\nexport const HOURS_MINUTES_WITHOUT_COLON_REGEXP =\n /^(?<hours>[0-9]{2})(?<minutes>[0-5][0-9])$/;\n","import {\n TranslationService,\n isEmpty,\n isSet,\n stripWhitespace,\n} from \"@fkui/logic\";\nimport { HoursMinutesString } from \"../converters\";\nimport {\n HOURS_MINUTES_REGEXP,\n HOURS_MINUTES_WITHOUT_COLON_REGEXP,\n} from \"./constants\";\n\nfunction findMatch(regexps: RegExp[], value: string): RegExpMatchArray | null {\n for (const regexp of regexps) {\n const match = value.match(regexp);\n\n if (match) {\n return match;\n }\n }\n\n return null;\n}\n\nfunction padInitialZeros(value: string | undefined, maxLength = 2): string {\n value = value ?? \"\";\n return value.padStart(maxLength, \"0\");\n}\n\n/**\n * @public\n */\nexport function hoursMinutesStringToMinutes(\n valueString: string,\n extraForgiving = false,\n): number | undefined {\n if (isEmpty(valueString.trim())) {\n return undefined;\n }\n\n const [hours, minutes] = splitHoursMinutes(valueString, extraForgiving).map(\n (value) => parseInt(value, 10),\n );\n const totalMinutes = hours * 60 + minutes;\n\n return !isNaN(totalMinutes) ? totalMinutes : undefined;\n}\n\n/**\n * @public\n */\nexport function minutesToHoursMinutesString(\n value?: number,\n): HoursMinutesString {\n let valueString = \"\";\n const safeValue = value ?? NaN;\n if (!isNaN(safeValue)) {\n const { hours, minutes } = minutesToObject(safeValue);\n valueString = [hours, minutes]\n .map((value) => String(value).padStart(2, \"0\"))\n .join(\":\");\n }\n\n return stripWhitespace(valueString);\n}\n\n/**\n * @public\n */\nexport function splitHoursMinutes(\n valueString: string,\n extraForgiving = false,\n): string[] {\n const regexps = extraForgiving\n ? [HOURS_MINUTES_WITHOUT_COLON_REGEXP, HOURS_MINUTES_REGEXP]\n : [HOURS_MINUTES_REGEXP];\n const match = findMatch(regexps, stripWhitespace(valueString));\n\n if (!match) {\n return [\"\", \"\"];\n }\n\n const hours = padInitialZeros(match?.groups?.hours);\n const minutes = padInitialZeros(match?.groups?.minutes);\n\n return [hours, minutes];\n}\n\n/**\n * Accepts time as a number and returns a user friendly string (to be used in i.e. review mode)\n * Example:\n * Input: 13.5\n * Output: '13 timmar och 30 minuter'\n *\n * @public\n */\nexport function minutesToUserFriendlyString(value: number): string {\n const [hours, minutes] = splitHoursMinutes(\n minutesToHoursMinutesString(value),\n ).map(Number);\n\n return TranslationService.provider.translate(\n \"ARBE.RW.generell.etikett.timmarochminuter\",\n \"{{hours}} timmar och {{minutes}} minuter\",\n { hours, minutes },\n );\n}\n\n/**\n * Helper for converting AgeTimeTextField values into hours. For convienence,\n * it is possible to provide multiple values and get their sum. The actual\n * conversion will be performed as a last step, to minimize the amount of rounding\n * errors.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value in hours.\n * @returns The sum of all values divided by 60. E.g., `150` becomes `2.5`.\n */\nexport function minutesToHoursFloat(\n ...values: Array<number | undefined>\n): number {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return minutes / 60;\n}\n\n/**\n * Helper for converting AgeTimeTextField values into an object. For\n * convenience, it is possible to provide multiple values and get their sum.\n *\n * Parameters that are undefined or NaN will be ignored and add 0 to the sum.\n *\n * @public\n * @param values - Values in minutes, to be converted into a value into an\n * hour minute object.\n * @returns The sum of all values in an object representation. E.g.,\n * `150` becomes `{ hours: 2, minutes: 30 }`\n */\nexport function minutesToObject(...values: Array<number | undefined>): {\n hours: number;\n minutes: number;\n} {\n const minutes = values\n .filter((value): value is number => isSet(value) && !isNaN(value))\n .reduce((sum, value) => sum + value, 0);\n\n return {\n hours: Math.floor(minutes / 60),\n minutes: minutes % 60,\n };\n}\n","import {\n minutesToHoursMinutesString,\n hoursMinutesStringToMinutes,\n} from \"../utils\";\n\n/**\n * A string in the format hh:mm (hours may exceed two digits), e.g., 08:15, 16:00 and 900:12.\n *\n * @public\n */\nexport type HoursMinutesString = string;\n\n/**\n * @public\n */\nexport function formatNumberToTime(\n value?: number,\n): HoursMinutesString | undefined {\n if (typeof value !== \"number\" || isNaN(value)) {\n return undefined;\n }\n\n return minutesToHoursMinutesString(value);\n}\n\nfunction parseTimeToNumberUsingConfig(\n value: string | null | undefined,\n extraForgiving: boolean,\n): number | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsedValue =\n hoursMinutesStringToMinutes(value, extraForgiving) ?? NaN;\n\n return !isNaN(parsedValue) ? parsedValue : undefined;\n}\n\n/**\n * @public\n */\nexport function parseTimeToNumber(value?: string | null): number | undefined {\n return parseTimeToNumberUsingConfig(value, false);\n}\n\n/**\n * @public\n */\nexport function forgivingParseTimeToNumber(\n value?: string | null,\n): number | undefined {\n return parseTimeToNumberUsingConfig(value, true);\n}\n","import { type ValidatorConfig, isSet } from \"@fkui/logic\";\nimport { parseTimeToNumber } from \"../converters\";\n\n/**\n * @public\n */\n/* eslint-disable-next-line @typescript-eslint/no-extraneous-class -- technical\n * debt, should be refactored to vanilla functions */\nexport class HoursMinutesValidatorUtils {\n public static validate(\n value: string,\n config: ValidatorConfig,\n name: string,\n compare: (value: number, limit: number) => boolean,\n ): boolean {\n if (value === \"\") {\n return true;\n }\n\n const limit = config[name];\n if (!isSet(limit)) {\n return false;\n }\n\n const parseFunction =\n HoursMinutesValidatorUtils.getParserFromConfig(config);\n const limitAsNumber = parseFunction(String(config[name]));\n if (!isSet(limitAsNumber)) {\n throw new Error(`config.${name} must be a number`);\n }\n\n const valueAsNumber = parseFunction(value);\n if (!isSet(valueAsNumber)) {\n return false;\n }\n\n return compare(valueAsNumber, limitAsNumber);\n }\n\n public static getParserFromConfig(\n config?: ValidatorConfig,\n ): (viewValue: string | null | undefined) => number | undefined {\n if (\n !isSet(config) ||\n !Array.isArray(config.parser) ||\n !isSet(config.parser?.[0]) ||\n typeof config.parser[0] !== \"function\"\n ) {\n return parseTimeToNumber;\n }\n\n return config.parser[0] as (\n viewValue: string | null | undefined,\n ) => number | undefined;\n }\n}\n","import {\n type ValidatableHTMLElement,\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n isEmpty,\n isSet,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const hoursMinutesValidator: Validator = {\n name: \"hoursMinutes\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return (\n isEmpty(value) ||\n isSet(HoursMinutesValidatorUtils.getParserFromConfig(config)(value))\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const greaterThanTimeValidator: Validator = {\n name: \"greaterThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value > limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const lessThanTimeValidator: Validator = {\n name: \"lessThanTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n \"limit\",\n (value: number, limit: number) => {\n return value < limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatableHTMLElement,\n type ValidatorConfig,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const maxTimeValidator: Validator = {\n name: \"maxTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value <= limit;\n },\n );\n },\n};\n","import {\n type Validator,\n type ValidatorName,\n type ValidatorConfig,\n type ValidatableHTMLElement,\n} from \"@fkui/logic\";\nimport { HoursMinutesValidatorUtils } from \"../utils\";\n\nexport const minTimeValidator: Validator = {\n name: \"minTime\" as ValidatorName,\n validation(\n value: string,\n _element: ValidatableHTMLElement,\n config: ValidatorConfig,\n ): boolean {\n return HoursMinutesValidatorUtils.validate(\n value,\n config,\n this.name,\n (value: number, limit: number) => {\n return value >= limit;\n },\n );\n },\n};\n","import { ValidationService, type Validator } from \"@fkui/logic\";\nimport { hoursMinutesValidator } from \"./HoursMinutesValidator\";\nimport { greaterThanTimeValidator } from \"./GreaterThanTimeValidator\";\nimport { lessThanTimeValidator } from \"./LessThanTimeValidator\";\nimport { maxTimeValidator } from \"./MaxTimeValidator\";\nimport { minTimeValidator } from \"./MinTimeValidator\";\n\nconst validators: Validator[] = [\n hoursMinutesValidator,\n greaterThanTimeValidator,\n lessThanTimeValidator,\n maxTimeValidator,\n minTimeValidator,\n];\n\nfor (const validator of validators) {\n ValidationService.registerValidator(validator);\n}\n","<script lang=\"ts\">\nimport { type PropType, defineComponent } from \"vue\";\nimport { FTextField, TranslationMixin, type ParseFunction, type FormatFunction, useTextFieldSetup } from \"@fkui/vue\";\nimport { isSet, ValidationService } from \"@fkui/logic\";\nimport { HoursMinutesString, formatNumberToTime, parseTimeToNumber } from \"./converters\";\nimport \"./validators\";\n\nexport default defineComponent({\n name: \"XTimeTextField\",\n extends: FTextField,\n mixins: [TranslationMixin],\n props: {\n formatter: {\n type: Function as PropType<FormatFunction<HoursMinutesString>>,\n required: false,\n default: formatNumberToTime,\n },\n parser: {\n type: Function as PropType<ParseFunction<number>>,\n required: false,\n default: parseTimeToNumber,\n },\n },\n setup(props) {\n return useTextFieldSetup(props);\n },\n mounted() {\n const inputElement: HTMLInputElement = this.$el.querySelector(\"input\");\n\n if (!isSet(inputElement)) {\n throw new Error(`Could not find input element in XTimeTextField with id ${this.$el.id}`);\n }\n\n ValidationService.addValidatorsToElement(\n inputElement,\n {\n maxLength: { length: 10 },\n hoursMinutes: {},\n },\n true,\n );\n\n inputElement.setAttribute(\"inputmode\", \"numeric\");\n\n ValidationService.validateElement(inputElement);\n },\n});\n</script>\n"],"names":["HOURS_MINUTES_REGEXP","HOURS_MINUTES_WITHOUT_COLON_REGEXP","findMatch","regexps","value","regexp","match","padInitialZeros","maxLength","_value","padStart","hoursMinutesStringToMinutes","valueString","extraForgiving","isEmpty","trim","hours","minutes","splitHoursMinutes","map","parseInt","totalMinutes","isNaN","minutesToHoursMinutesString","safeValue","NaN","minutesToObject","String","join","stripWhitespace","groups","minutesToUserFriendlyString","Number","TranslationService","provider","translate","minutesToHoursFloat","values","filter","isSet","reduce","sum","Math","floor","formatNumberToTime","parseTimeToNumberUsingConfig","_hoursMinutesStringTo","parsedValue","parseTimeToNumber","forgivingParseTimeToNumber","HoursMinutesValidatorUtils","validate","config","name","compare","limit","parseFunction","getParserFromConfig","limitAsNumber","Error","valueAsNumber","Array","isArray","parser","hoursMinutesValidator","validation","_element","greaterThanTimeValidator","lessThanTimeValidator","maxTimeValidator","minTimeValidator","validators","validator","ValidationService","registerValidator","defineComponent","extends","FTextField","mixins","TranslationMixin","props","formatter","type","Function","required","default","setup","useTextFieldSetup","mounted","inputElement","$el","querySelector","id","addValidatorsToElement","length","hoursMinutes","setAttribute","validateElement"],"mappings":"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"}
@@ -8,6 +8,7 @@ import { IPopupErrorData } from '@fkui/vue';
8
8
  import { ParseFunction } from '@fkui/vue';
9
9
  import { PropType } from 'vue';
10
10
  import { PublicProps } from 'vue';
11
+ import { Ref } from 'vue';
11
12
  import { ValidatorConfig } from '@fkui/logic';
12
13
  import { ValidityEvent } from '@fkui/logic';
13
14
 
@@ -107,574 +108,6 @@ export declare function parseTimeToNumber(value?: string | null): number | undef
107
108
  */
108
109
  export declare function splitHoursMinutes(valueString: string, extraForgiving?: boolean): string[];
109
110
 
110
- export declare const XSearchBar: DefineComponent<ExtractPropTypes< {
111
- modelValue: {
112
- type: StringConstructor;
113
- required: true;
114
- };
115
- maxLength: {
116
- type: NumberConstructor;
117
- default: number;
118
- };
119
- }>, {}, {}, {
120
- value: {
121
- get(): string;
122
- set(value: string): void;
123
- };
124
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("update:modelValue" | "changedValue")[], "update:modelValue" | "changedValue", PublicProps, Readonly<ExtractPropTypes< {
125
- modelValue: {
126
- type: StringConstructor;
127
- required: true;
128
- };
129
- maxLength: {
130
- type: NumberConstructor;
131
- default: number;
132
- };
133
- }>> & Readonly<{
134
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
135
- onChangedValue?: ((...args: any[]) => any) | undefined;
136
- }>, {
137
- maxLength: number;
138
- }, {}, {
139
- FIcon: DefineComponent<ExtractPropTypes< {
140
- name: {
141
- type: StringConstructor;
142
- required: true;
143
- };
144
- library: {
145
- type: StringConstructor;
146
- required: false;
147
- default: string;
148
- };
149
- flip: {
150
- type: PropType<string>;
151
- default: null;
152
- required: false;
153
- validator(value: string): boolean;
154
- };
155
- rotate: {
156
- type: PropType<string>;
157
- default: null;
158
- required: false;
159
- validator(value: string): boolean;
160
- };
161
- }>, {}, {}, {
162
- spriteKey(): string;
163
- spriteId(): string;
164
- modifiers(): string[];
165
- ariaHidden(): "true" | undefined;
166
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
167
- name: {
168
- type: StringConstructor;
169
- required: true;
170
- };
171
- library: {
172
- type: StringConstructor;
173
- required: false;
174
- default: string;
175
- };
176
- flip: {
177
- type: PropType<string>;
178
- default: null;
179
- required: false;
180
- validator(value: string): boolean;
181
- };
182
- rotate: {
183
- type: PropType<string>;
184
- default: null;
185
- required: false;
186
- validator(value: string): boolean;
187
- };
188
- }>> & Readonly<{}>, {
189
- library: string;
190
- flip: string;
191
- rotate: string;
192
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
193
- FSearchTextField: DefineComponent<ExtractPropTypes< {
194
- id: {
195
- type: StringConstructor;
196
- required: false;
197
- default: () => string;
198
- };
199
- modelValue: {
200
- type: StringConstructor;
201
- required: false;
202
- default: string;
203
- };
204
- clearableScreenReaderText: {
205
- type: StringConstructor;
206
- required: false;
207
- default: string;
208
- };
209
- maxLength: {
210
- type: NumberConstructor;
211
- default: number;
212
- };
213
- }>, {}, {
214
- defaultText: string;
215
- }, {
216
- canClear(): boolean;
217
- }, {
218
- clear(): void;
219
- onInput(event: Event): void;
220
- onChange(event: Event): void;
221
- onBlur(event: Event): void;
222
- onUpdate(event: Event): void;
223
- }, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
224
- id: {
225
- type: StringConstructor;
226
- required: false;
227
- default: () => string;
228
- };
229
- modelValue: {
230
- type: StringConstructor;
231
- required: false;
232
- default: string;
233
- };
234
- clearableScreenReaderText: {
235
- type: StringConstructor;
236
- required: false;
237
- default: string;
238
- };
239
- maxLength: {
240
- type: NumberConstructor;
241
- default: number;
242
- };
243
- }>> & Readonly<{
244
- onBlur?: ((...args: any[]) => any) | undefined;
245
- onChange?: ((...args: any[]) => any) | undefined;
246
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
247
- onUpdate?: ((...args: any[]) => any) | undefined;
248
- }>, {
249
- id: string;
250
- modelValue: string;
251
- maxLength: number;
252
- clearableScreenReaderText: string;
253
- }, {}, {
254
- FTextField: DefineComponent<ExtractPropTypes< {
255
- id: {
256
- type: StringConstructor;
257
- required: false;
258
- default: () => string;
259
- };
260
- inline: {
261
- type: BooleanConstructor;
262
- required: false;
263
- default: boolean;
264
- };
265
- modelValue: {
266
- type: (StringConstructor | NumberConstructor)[];
267
- required: false;
268
- default: string;
269
- };
270
- type: {
271
- type: StringConstructor;
272
- required: false;
273
- default: string;
274
- };
275
- formatter: {
276
- type: PropType<FormatFunction<any>>;
277
- required: false;
278
- default: undefined;
279
- };
280
- parser: {
281
- type: PropType<ParseFunction<any>>;
282
- required: false;
283
- default: undefined;
284
- };
285
- labelWidth: {
286
- type: StringConstructor;
287
- required: false;
288
- default: string;
289
- };
290
- inputWidth: {
291
- type: StringConstructor;
292
- required: false;
293
- default: string;
294
- };
295
- }>, {
296
- textFieldTableMode: boolean;
297
- }, {
298
- showErrorPopup: boolean;
299
- viewValue: string;
300
- lastModelValue: unknown;
301
- validationMessage: string;
302
- validityMode: string;
303
- isAfterInitialRender: boolean;
304
- defaultText: string;
305
- descriptionText: string;
306
- descriptionScreenReaderText: string;
307
- discreteDescriptionText: string;
308
- discreteDescriptionScreenReaderText: string;
309
- }, {
310
- showPopupError(): boolean;
311
- labelClass(): string;
312
- isValid(): boolean;
313
- hasError(): boolean;
314
- rootClass(): Record<string, boolean>;
315
- labelWrapperClass(): string | undefined;
316
- inputWrapperClass(): string | undefined;
317
- isModelUpdatedProgrammatically(): boolean;
318
- }, {
319
- getErrorPopupAnchor(): HTMLElement;
320
- closePopupError(): void;
321
- onChange(): Promise<void>;
322
- onFocus(): void;
323
- onBlur(): Promise<void>;
324
- onValidity({ detail }: CustomEvent<ValidityEvent>): Promise<void>;
325
- onPendingValidity(): void;
326
- onValidationConfigUpdate(): Promise<void>;
327
- resolveNewModelValue(viewValue: string): unknown;
328
- syncViewValueAfterModelUpdate(newModelValue: unknown): void | never;
329
- triggerComponentValidityEvent(validityEvent: ValidityEvent): void;
330
- setViewValueToFormattedValueOrFallbackToValue(): void;
331
- }, ComponentOptionsMixin, ComponentOptionsMixin, ("blur" | "change" | "update:modelValue" | "update")[], "blur" | "change" | "update:modelValue" | "update", PublicProps, Readonly<ExtractPropTypes< {
332
- id: {
333
- type: StringConstructor;
334
- required: false;
335
- default: () => string;
336
- };
337
- inline: {
338
- type: BooleanConstructor;
339
- required: false;
340
- default: boolean;
341
- };
342
- modelValue: {
343
- type: (StringConstructor | NumberConstructor)[];
344
- required: false;
345
- default: string;
346
- };
347
- type: {
348
- type: StringConstructor;
349
- required: false;
350
- default: string;
351
- };
352
- formatter: {
353
- type: PropType<FormatFunction<any>>;
354
- required: false;
355
- default: undefined;
356
- };
357
- parser: {
358
- type: PropType<ParseFunction<any>>;
359
- required: false;
360
- default: undefined;
361
- };
362
- labelWidth: {
363
- type: StringConstructor;
364
- required: false;
365
- default: string;
366
- };
367
- inputWidth: {
368
- type: StringConstructor;
369
- required: false;
370
- default: string;
371
- };
372
- }>> & Readonly<{
373
- onBlur?: ((...args: any[]) => any) | undefined;
374
- onChange?: ((...args: any[]) => any) | undefined;
375
- "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
376
- onUpdate?: ((...args: any[]) => any) | undefined;
377
- }>, {
378
- type: string;
379
- id: string;
380
- modelValue: string | number;
381
- inline: boolean;
382
- labelWidth: string;
383
- formatter: FormatFunction<any>;
384
- parser: ParseFunction<any>;
385
- inputWidth: string;
386
- }, {}, {
387
- FLabel: DefineComponent<ExtractPropTypes< {
388
- for: {
389
- type: PropType<string | undefined>;
390
- required: false;
391
- default: undefined;
392
- };
393
- }>, void, {
394
- descriptionClass: string[];
395
- discreteDescriptionClass: string[];
396
- }, {
397
- forProperty(): string | undefined;
398
- hasDefaultSlot(): boolean;
399
- hasErrorMessageSlot(): boolean;
400
- hasDescriptionSlot(): boolean;
401
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
402
- for: {
403
- type: PropType<string | undefined>;
404
- required: false;
405
- default: undefined;
406
- };
407
- }>> & Readonly<{}>, {
408
- for: string | undefined;
409
- }, {}, {
410
- FIcon: DefineComponent<ExtractPropTypes< {
411
- name: {
412
- type: StringConstructor;
413
- required: true;
414
- };
415
- library: {
416
- type: StringConstructor;
417
- required: false;
418
- default: string;
419
- };
420
- flip: {
421
- type: PropType<string>;
422
- default: null;
423
- required: false;
424
- validator(value: string): boolean;
425
- };
426
- rotate: {
427
- type: PropType<string>;
428
- default: null;
429
- required: false;
430
- validator(value: string): boolean;
431
- };
432
- }>, {}, {}, {
433
- spriteKey(): string;
434
- spriteId(): string;
435
- modifiers(): string[];
436
- ariaHidden(): "true" | undefined;
437
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
438
- name: {
439
- type: StringConstructor;
440
- required: true;
441
- };
442
- library: {
443
- type: StringConstructor;
444
- required: false;
445
- default: string;
446
- };
447
- flip: {
448
- type: PropType<string>;
449
- default: null;
450
- required: false;
451
- validator(value: string): boolean;
452
- };
453
- rotate: {
454
- type: PropType<string>;
455
- default: null;
456
- required: false;
457
- validator(value: string): boolean;
458
- };
459
- }>> & Readonly<{}>, {
460
- library: string;
461
- flip: string;
462
- rotate: string;
463
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
464
- }, {}, string, ComponentProvideOptions, true, {}, any>;
465
- FIcon: DefineComponent<ExtractPropTypes< {
466
- name: {
467
- type: StringConstructor;
468
- required: true;
469
- };
470
- library: {
471
- type: StringConstructor;
472
- required: false;
473
- default: string;
474
- };
475
- flip: {
476
- type: PropType<string>;
477
- default: null;
478
- required: false;
479
- validator(value: string): boolean;
480
- };
481
- rotate: {
482
- type: PropType<string>;
483
- default: null;
484
- required: false;
485
- validator(value: string): boolean;
486
- };
487
- }>, {}, {}, {
488
- spriteKey(): string;
489
- spriteId(): string;
490
- modifiers(): string[];
491
- ariaHidden(): "true" | undefined;
492
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
493
- name: {
494
- type: StringConstructor;
495
- required: true;
496
- };
497
- library: {
498
- type: StringConstructor;
499
- required: false;
500
- default: string;
501
- };
502
- flip: {
503
- type: PropType<string>;
504
- default: null;
505
- required: false;
506
- validator(value: string): boolean;
507
- };
508
- rotate: {
509
- type: PropType<string>;
510
- default: null;
511
- required: false;
512
- validator(value: string): boolean;
513
- };
514
- }>> & Readonly<{}>, {
515
- library: string;
516
- flip: string;
517
- rotate: string;
518
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
519
- IPopupError: DefineComponent<ExtractPropTypes< {
520
- isOpen: {
521
- type: BooleanConstructor;
522
- required: true;
523
- };
524
- errorMessage: {
525
- type: StringConstructor;
526
- required: false;
527
- default: string;
528
- };
529
- anchor: {
530
- type: PropType<HTMLElement | null | undefined>;
531
- required: false;
532
- default: undefined;
533
- };
534
- }>, {}, IPopupErrorData, {
535
- popupClasses(): string[];
536
- arrowClass(): string;
537
- errorStyle(): string;
538
- }, {
539
- onResize(): void;
540
- onKeyEsc(event: KeyboardEvent): void;
541
- onClose(): void;
542
- setArrowOffset(): void;
543
- toggleIsOpen(isOpen: boolean): Promise<void>;
544
- }, ComponentOptionsMixin, ComponentOptionsMixin, "close"[], "close", PublicProps, Readonly<ExtractPropTypes< {
545
- isOpen: {
546
- type: BooleanConstructor;
547
- required: true;
548
- };
549
- errorMessage: {
550
- type: StringConstructor;
551
- required: false;
552
- default: string;
553
- };
554
- anchor: {
555
- type: PropType<HTMLElement | null | undefined>;
556
- required: false;
557
- default: undefined;
558
- };
559
- }>> & Readonly<{
560
- onClose?: ((...args: any[]) => any) | undefined;
561
- }>, {
562
- anchor: HTMLElement | null | undefined;
563
- errorMessage: string;
564
- }, {}, {
565
- FIcon: DefineComponent<ExtractPropTypes< {
566
- name: {
567
- type: StringConstructor;
568
- required: true;
569
- };
570
- library: {
571
- type: StringConstructor;
572
- required: false;
573
- default: string;
574
- };
575
- flip: {
576
- type: PropType<string>;
577
- default: null;
578
- required: false;
579
- validator(value: string): boolean;
580
- };
581
- rotate: {
582
- type: PropType<string>;
583
- default: null;
584
- required: false;
585
- validator(value: string): boolean;
586
- };
587
- }>, {}, {}, {
588
- spriteKey(): string;
589
- spriteId(): string;
590
- modifiers(): string[];
591
- ariaHidden(): "true" | undefined;
592
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
593
- name: {
594
- type: StringConstructor;
595
- required: true;
596
- };
597
- library: {
598
- type: StringConstructor;
599
- required: false;
600
- default: string;
601
- };
602
- flip: {
603
- type: PropType<string>;
604
- default: null;
605
- required: false;
606
- validator(value: string): boolean;
607
- };
608
- rotate: {
609
- type: PropType<string>;
610
- default: null;
611
- required: false;
612
- validator(value: string): boolean;
613
- };
614
- }>> & Readonly<{}>, {
615
- library: string;
616
- flip: string;
617
- rotate: string;
618
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
619
- }, {}, string, ComponentProvideOptions, true, {}, any>;
620
- }, {}, string, ComponentProvideOptions, true, {}, any>;
621
- FIcon: DefineComponent<ExtractPropTypes< {
622
- name: {
623
- type: StringConstructor;
624
- required: true;
625
- };
626
- library: {
627
- type: StringConstructor;
628
- required: false;
629
- default: string;
630
- };
631
- flip: {
632
- type: PropType<string>;
633
- default: null;
634
- required: false;
635
- validator(value: string): boolean;
636
- };
637
- rotate: {
638
- type: PropType<string>;
639
- default: null;
640
- required: false;
641
- validator(value: string): boolean;
642
- };
643
- }>, {}, {}, {
644
- spriteKey(): string;
645
- spriteId(): string;
646
- modifiers(): string[];
647
- ariaHidden(): "true" | undefined;
648
- }, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
649
- name: {
650
- type: StringConstructor;
651
- required: true;
652
- };
653
- library: {
654
- type: StringConstructor;
655
- required: false;
656
- default: string;
657
- };
658
- flip: {
659
- type: PropType<string>;
660
- default: null;
661
- required: false;
662
- validator(value: string): boolean;
663
- };
664
- rotate: {
665
- type: PropType<string>;
666
- default: null;
667
- required: false;
668
- validator(value: string): boolean;
669
- };
670
- }>> & Readonly<{}>, {
671
- library: string;
672
- flip: string;
673
- rotate: string;
674
- }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
675
- }, {}, string, ComponentProvideOptions, true, {}, any>;
676
- }, {}, string, ComponentProvideOptions, true, {}, any>;
677
-
678
111
  export declare const XTimeTextField: DefineComponent<ExtractPropTypes< {
679
112
  formatter: {
680
113
  type: PropType<FormatFunction<HoursMinutesString>>;
@@ -688,6 +121,16 @@ default: typeof parseTimeToNumber;
688
121
  };
689
122
  }>, {
690
123
  textFieldTableMode: boolean;
124
+ viewValue: Ref<string>;
125
+ onOptionSelected: (value: string) => void;
126
+ dropdownId: string;
127
+ dropdownIsOpen: Readonly<Ref<boolean>>;
128
+ dropdownOptions: Readonly<Ref<string[]>>;
129
+ activeOptionId: string;
130
+ activeOption: Readonly<Ref<string | null>>;
131
+ toggleDropdown: () => void;
132
+ selectOption: (value: string) => void;
133
+ closeDropdown: () => void;
691
134
  }, {}, {}, {}, ComponentOptions, DefineComponent<ExtractPropTypes< {
692
135
  id: {
693
136
  type: StringConstructor;
@@ -729,11 +172,30 @@ type: StringConstructor;
729
172
  required: false;
730
173
  default: string;
731
174
  };
175
+ options: {
176
+ type: PropType<string[] | undefined>;
177
+ required: false;
178
+ default: () => undefined;
179
+ };
180
+ disabled: {
181
+ type: BooleanConstructor;
182
+ required: false;
183
+ default: boolean;
184
+ };
732
185
  }>, {
733
186
  textFieldTableMode: boolean;
187
+ viewValue: Ref<string, string>;
188
+ onOptionSelected: (value: string) => void;
189
+ dropdownId: string;
190
+ dropdownIsOpen: Readonly<Ref<boolean, boolean>>;
191
+ dropdownOptions: Readonly<Ref<string[], string[]>>;
192
+ activeOptionId: string;
193
+ activeOption: Readonly<Ref<string | null, string | null>>;
194
+ toggleDropdown: () => void;
195
+ selectOption: (value: string) => void;
196
+ closeDropdown: () => void;
734
197
  }, {
735
198
  showErrorPopup: boolean;
736
- viewValue: string;
737
199
  lastModelValue: unknown;
738
200
  validationMessage: string;
739
201
  validityMode: string;
@@ -753,6 +215,8 @@ labelWrapperClass(): string | undefined;
753
215
  inputWrapperClass(): string | undefined;
754
216
  isModelUpdatedProgrammatically(): boolean;
755
217
  }, {
218
+ onDropdownSelect(value: string): void;
219
+ onDropdownClose(): void;
756
220
  getErrorPopupAnchor(): HTMLElement;
757
221
  closePopupError(): void;
758
222
  onChange(): Promise<void>;
@@ -806,6 +270,16 @@ type: StringConstructor;
806
270
  required: false;
807
271
  default: string;
808
272
  };
273
+ options: {
274
+ type: PropType<string[] | undefined>;
275
+ required: false;
276
+ default: () => undefined;
277
+ };
278
+ disabled: {
279
+ type: BooleanConstructor;
280
+ required: false;
281
+ default: boolean;
282
+ };
809
283
  }>> & Readonly<{
810
284
  onBlur?: ((...args: any[]) => any) | undefined;
811
285
  onChange?: ((...args: any[]) => any) | undefined;
@@ -816,6 +290,8 @@ type: string;
816
290
  id: string;
817
291
  modelValue: string | number;
818
292
  inline: boolean;
293
+ disabled: boolean;
294
+ options: string[] | undefined;
819
295
  labelWidth: string;
820
296
  formatter: FormatFunction<any>;
821
297
  parser: ParseFunction<any>;
@@ -1054,6 +530,34 @@ flip: string;
1054
530
  rotate: string;
1055
531
  }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
1056
532
  }, {}, string, ComponentProvideOptions, true, {}, any>;
533
+ IComboboxDropdown: DefineComponent< {
534
+ id: string;
535
+ isOpen: boolean;
536
+ options: string[];
537
+ activeOption: string | null;
538
+ activeOptionId: string;
539
+ inputNode: HTMLInputElement;
540
+ }, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
541
+ close: () => any;
542
+ select: (option: string) => any;
543
+ }, string, PublicProps, Readonly<{
544
+ id: string;
545
+ isOpen: boolean;
546
+ options: string[];
547
+ activeOption: string | null;
548
+ activeOptionId: string;
549
+ inputNode: HTMLInputElement;
550
+ }> & Readonly<{
551
+ onClose?: (() => any) | undefined;
552
+ onSelect?: ((option: string) => any) | undefined;
553
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
554
+ listbox: HTMLUListElement;
555
+ }, HTMLDivElement>;
556
+ IComboboxToggleButton: DefineComponent< {}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
557
+ toggle: () => any;
558
+ }, string, PublicProps, Readonly<{}> & Readonly<{
559
+ onToggle?: (() => any) | undefined;
560
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, true, {}, HTMLButtonElement>;
1057
561
  }, {}, string, ComponentProvideOptions, true, {}, any>, {}, string, PublicProps, Readonly<ExtractPropTypes< {
1058
562
  formatter: {
1059
563
  type: PropType<FormatFunction<HoursMinutesString>>;
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.48.0"
8
+ "packageVersion": "7.48.1"
9
9
  }
10
10
  ]
11
11
  }
package/dummy.css ADDED
@@ -0,0 +1 @@
1
+ /* dummy css file while there is no actual style generated by any component */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fkui/vue-labs",
3
- "version": "5.43.0",
3
+ "version": "5.45.0",
4
4
  "description": "Experimental and unstable FKUI components",
5
5
  "keywords": [
6
6
  "fkui",
@@ -23,13 +23,14 @@
23
23
  "import": "./dist/esm/index.esm.js"
24
24
  },
25
25
  "./pageobject/*": "./pageobject/*",
26
- "./style.css": "./dist/esm/vue-labs.css"
26
+ "./style.css": "./dummy.css"
27
27
  },
28
28
  "main": "./dist/cjs/index.cjs.js",
29
29
  "module": "./dist/esm/index.esm.js",
30
30
  "types": "./dist/types/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
+ "dummy.css",
33
34
  "htmlvalidate",
34
35
  "pageobject/**/*.{js,js.map,d.ts}",
35
36
  "!**/examples/**",
@@ -71,5 +72,5 @@
71
72
  "node": ">= 20",
72
73
  "npm": ">= 7"
73
74
  },
74
- "gitHead": "ba47827ac97cfa01defc879b00bb07c5b01ca5b0"
75
+ "gitHead": "8acf0ec98104671d8411346256fa664abf2e94af"
75
76
  }
@@ -1,18 +0,0 @@
1
- .x-search-bar .text-field__input-wrapper {
2
- gap: 0;
3
- }
4
- .x-search-bar input {
5
- border-right: 0;
6
- border-top-right-radius: 0;
7
- border-bottom-right-radius: 0;
8
- }
9
- .x-search-bar .button.button--primary {
10
- margin-bottom: 0;
11
- margin-top: 0;
12
- border-top-left-radius: 0;
13
- border-bottom-left-radius: 0;
14
- width: auto;
15
- padding: 0.25rem 0.75rem;
16
- height: var(--f-height-large);
17
- min-width: 6rem;
18
- }
@@ -1,18 +0,0 @@
1
- .x-search-bar .text-field__input-wrapper {
2
- gap: 0;
3
- }
4
- .x-search-bar input {
5
- border-right: 0;
6
- border-top-right-radius: 0;
7
- border-bottom-right-radius: 0;
8
- }
9
- .x-search-bar .button.button--primary {
10
- margin-bottom: 0;
11
- margin-top: 0;
12
- border-top-left-radius: 0;
13
- border-bottom-left-radius: 0;
14
- width: auto;
15
- padding: 0.25rem 0.75rem;
16
- height: var(--f-height-large);
17
- min-width: 6rem;
18
- }