@fremtind/jokul 0.15.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/build-stats.html +1 -1
- package/build/cjs/components/datepicker/DatePicker.js +1 -1
- package/build/cjs/components/datepicker/DatePicker.js.map +1 -1
- package/build/cjs/components/datepicker/internal/Calendar.js +1 -1
- package/build/cjs/components/datepicker/internal/Calendar.js.map +1 -1
- package/build/cjs/components/popover/Popover.js +1 -1
- package/build/cjs/components/popover/Popover.js.map +1 -1
- package/build/cjs/components/popover/utils.js.map +1 -1
- package/build/cjs/components/text-input/BaseTextInput.js +1 -1
- package/build/cjs/components/text-input/BaseTextInput.js.map +1 -1
- package/build/cjs/components/toggle-switch/documentation/Example.js +2 -0
- package/build/cjs/components/toggle-switch/documentation/Example.js.map +1 -0
- package/build/cjs/components/toggle-switch/documentation/main.js +2 -0
- package/build/cjs/components/toggle-switch/documentation/main.js.map +1 -0
- package/build/cjs/components/toggle-switch/documentation/vite.dev.config.js +2 -0
- package/build/cjs/components/toggle-switch/documentation/vite.dev.config.js.map +1 -0
- package/build/es/components/datepicker/DatePicker.js +1 -1
- package/build/es/components/datepicker/DatePicker.js.map +1 -1
- package/build/es/components/datepicker/internal/Calendar.js +1 -1
- package/build/es/components/datepicker/internal/Calendar.js.map +1 -1
- package/build/es/components/popover/Popover.js +1 -1
- package/build/es/components/popover/Popover.js.map +1 -1
- package/build/es/components/popover/utils.js.map +1 -1
- package/build/es/components/text-input/BaseTextInput.js +1 -1
- package/build/es/components/text-input/BaseTextInput.js.map +1 -1
- package/build/es/components/toggle-switch/documentation/Example.js +2 -0
- package/build/es/components/toggle-switch/documentation/Example.js.map +1 -0
- package/build/es/components/toggle-switch/documentation/main.js +2 -0
- package/build/es/components/toggle-switch/documentation/main.js.map +1 -0
- package/build/es/components/toggle-switch/documentation/vite.dev.config.js +2 -0
- package/build/es/components/toggle-switch/documentation/vite.dev.config.js.map +1 -0
- package/build/packages/jokul/src/components/datepicker/internal/Calendar.d.ts +0 -1
- package/build/packages/jokul/src/components/popover/Popover.d.ts +61 -21
- package/build/packages/jokul/src/components/popover/utils.d.ts +1 -1
- package/build/packages/jokul/src/components/text-input/BaseTextInput.d.ts +8 -0
- package/build/packages/jokul/src/components/toggle-switch/documentation/Example.d.ts +2 -0
- package/build/packages/jokul/src/components/toggle-switch/documentation/main.d.ts +1 -0
- package/build/packages/jokul/src/components/toggle-switch/documentation/vite.dev.config.d.ts +2 -0
- package/build/style.css +1 -1
- package/package.json +2 -2
- package/src/components/button/styles/button.css +2 -2
- package/src/components/button/styles/button.min.css +1 -1
- package/src/components/checkbox/styles/checkbox.css +4 -4
- package/src/components/checkbox/styles/checkbox.min.css +1 -1
- package/src/components/datepicker/styles/_calendar.scss +11 -32
- package/src/components/datepicker/styles/datepicker.css +8 -33
- package/src/components/datepicker/styles/datepicker.min.css +1 -1
- package/src/components/feedback/styles/feedback.css +2 -2
- package/src/components/feedback/styles/feedback.min.css +1 -1
- package/src/components/input-group/styles/input-group.css +2 -2
- package/src/components/input-group/styles/input-group.min.css +1 -1
- package/src/components/loader/styles/loader.css +6 -6
- package/src/components/loader/styles/loader.min.css +1 -1
- package/src/components/loader/styles/skeleton-loader.css +5 -5
- package/src/components/loader/styles/skeleton-loader.min.css +1 -1
- package/src/components/message/styles/message.css +2 -2
- package/src/components/message/styles/message.min.css +1 -1
- package/src/components/progress-bar/styles/progress-bar.css +2 -2
- package/src/components/progress-bar/styles/progress-bar.min.css +1 -1
- package/src/components/radio-button/styles/radio-button.css +2 -2
- package/src/components/radio-button/styles/radio-button.min.css +1 -1
- package/src/components/system-message/styles/system-message.css +2 -2
- package/src/components/system-message/styles/system-message.min.css +1 -1
- package/src/components/toast/styles/toast.css +4 -4
- package/src/components/toast/styles/toast.min.css +1 -1
- package/src/components/toggle-switch/styles/toggle-switch.css +301 -0
- package/src/components/toggle-switch/styles/toggle-switch.min.css +1 -0
- package/src/components/toggle-switch/styles/toggle-switch.scss +138 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as o,jsxs as
|
|
1
|
+
import{jsx as o,jsxs as n}from"react/jsx-runtime";import{c as e}from"../../../clsx-BeLtu-UY.js";import t from"date-fns/startOfDay";import{forwardRef as r,useState as i,useRef as s,useCallback as a}from"react";import{flushSync as c}from"react-dom";import"../icon/Icon.js";import"../icon/icons/animated/ArrowVerticalAnimated.js";import"../icon/icons/animated/ArrowHorizontalAnimated.js";import"../icon/icons/animated/PlusRemoveAnimated.js";import"../icon/icons/ArrowDownIcon.js";import"../icon/icons/ArrowLeftIcon.js";import"../icon/icons/ArrowNorthEastIcon.js";import"../icon/icons/ArrowRightIcon.js";import"../icon/icons/ArrowUpIcon.js";import{CalendarIcon as l}from"../icon/icons/CalendarIcon.js";import"../icon/icons/CheckIcon.js";import"../icon/icons/ChevronDownIcon.js";import"../icon/icons/ChevronLeftIcon.js";import"../icon/icons/ChevronRightIcon.js";import"../icon/icons/ChevronUpIcon.js";import"../icon/icons/CloseIcon.js";import"../icon/icons/CopyIcon.js";import"../icon/icons/DotsIcon.js";import"../icon/icons/DragIcon.js";import"../icon/icons/ErrorIcon.js";import"../icon/icons/GreenCheckIcon.js";import"../icon/icons/HamburgerIcon.js";import"../icon/icons/InfoIcon.js";import"../icon/icons/LinkIcon.js";import"../icon/icons/PlusIcon.js";import"../icon/icons/QuestionIcon.js";import"../icon/icons/RedCrossIcon.js";import"../icon/icons/SearchIcon.js";import"../icon/icons/SuccessIcon.js";import"../icon/icons/WarningIcon.js";import"../icon/icons/MinusIcon.js";import"../icon/icons/ThumbDownIcon.js";import"../icon/icons/ThumbUpIcon.js";import"../icon/icons/TrashCanIcon.js";import"../icon/icons/PenIcon.js";import{IconButton as p}from"../icon-button/IconButton.js";import"../../hooks/useScreen/useScreen.js";import"../../hooks/useId/useId.js";import"../tooltip/Tooltip.js";import"../tooltip/TooltipContent.js";import"../tooltip/TooltipTrigger.js";import{InputGroup as u}from"../input-group/InputGroup.js";import m from"../popover/Popover.js";import"../text-input/BaseTextArea.js";import{BaseTextInput as d}from"../text-input/BaseTextInput.js";import"../text-input/TextArea.js";import"../text-input/TextInput.js";import{Calendar as j}from"./internal/Calendar.js";import{getInitialDate as I}from"./internal/utils.js";import{parseDateString as f,formatInput as h}from"./utils.js";import{isWithinLowerBound as v,isWithinUpperBound as k}from"./validation.js";const b=r(((r,b)=>{const{"data-testautoid":g,id:D,className:C="",label:w="Velg dato",labelProps:y,defaultValue:T,defaultShow:L=!1,value:x,disableBeforeDate:P,disableAfterDate:A,yearsToShow:S,name:B,helpLabel:E,errorLabel:_,invalid:N,density:O,days:R,months:U,monthLabel:V,yearLabel:W,placeholder:F="dd.mm.åååå",width:G="11.25rem",onChange:H,onBlur:K,onFocus:M,onKeyDown:q,action:z,showCalendarLabel:Q="Åpne kalender",hideCalendarLabel:J="Lukk kalender",supportLabelProps:X,tooltipProps:Y,...Z}=r;"production"!==process.env.NODE_ENV&&x&&T&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const $=f(P),oo=$?t($):void 0,no=f(A),eo=no?t(no):void 0,[to,ro]=i(I(x,T,oo,eo)),[io,so]=i(null),[ao,co]=i(L),lo=s(null),po=s(null),uo=s(null),mo=s(null),jo=a((o=>{mo.current=o,b&&("function"==typeof b?b(o):b.current=o)}),[mo,b]),Io=a((o=>{M&&po.current&&(po.current.contains(o.relatedTarget)||M(o,to,{error:io,value:o.target.value}))}),[M,to,io]),fo=a((o=>{K&&K(o,to,{error:io,value:o.target.value})}),[K,to,io]),ho=a((o=>{"Escape"===o.key&&(co(!1),o.preventDefault(),o.stopPropagation()),null!=z&&z.onKeyDown&&z.onKeyDown(o)}),[co,z]),vo=a((o=>{let n=null,e=null;if(o.target.value){const t=f(o.target.value);t?oo&&!v(t,oo)?e="OUTSIDE_LOWER_BOUND":eo&&!k(t,eo)?e="OUTSIDE_UPPER_BOUND":co(!1):e="WRONG_FORMAT",n=t||null}so(e),ro(n),H&&H(o,n,{error:e,value:o.target.value})}),[H,so,ro,co,oo,eo]),ko=a((o=>{c((()=>{co(!ao)}));const n=lo.current,e=n&&n.querySelector('[aria-pressed="true"]');e&&e.focus(),null!=z&&z.onClick&&z.onClick(o)}),[co,ao,z,lo]),bo=a((({date:o})=>{if(co(!1),ro(o),mo.current){const n=mo.current;n.value=h(o);const e=document.createEvent("HTMLEvents");e.initEvent("input",!0,!1),n.dispatchEvent(e),n.focus(),H&&H(e,o,{error:null,value:n.value})}}),[co,ro,H]),go=a((o=>{o.preventDefault(),co(!1),uo.current&&uo.current.focus()}),[co]);return o(u,{id:D,className:e("jkl-datepicker",C,{"jkl-datepicker--open":ao}),...Z,ref:po,label:w,labelProps:y,density:O,helpLabel:E,errorLabel:_,supportLabelProps:X,tooltipProps:Y,render:e=>o(d,{ref:jo,"data-testid":"jkl-datepicker__input","data-testautoid":g,className:"jkl-datepicker__input",name:B,defaultValue:T,density:O,value:x,type:"text",placeholder:F,width:G,onFocus:Io,onBlur:fo,onChange:vo,actionButton:n(m,{positionReference:mo,open:ao,onOpenChange:()=>co(!ao),offset:8,children:[o(m.Trigger,{"data-testid":"jkl-datepicker__trigger",title:ao?J:Q,className:"jkl-text-input-action-button",onClick:ko,onKeyDown:ho,tabIndex:0,asChild:!0,children:o(p,{...z,children:o(l,{})})}),o(m.Content,{initialFocus:-1,padding:24,children:o(j,{ref:lo,density:O,date:to,minDate:oo,maxDate:eo,days:R,months:U,monthLabel:V,yearLabel:W,yearsToShow:S,onDateSelected:bo,onTabOutside:go})})]}),...e})})}));b.displayName="DatePicker";export{b as DatePicker};
|
|
2
2
|
//# sourceMappingURL=DatePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport startOfDay from \"date-fns/startOfDay\";\nimport React, {\n ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useAnimatedHeight, useClickOutside, useFocusOutside, useKeyListener } from \"../../hooks\";\nimport { CalendarIcon } from \"../icon\";\nimport { InputGroup } from \"../input-group\";\nimport { BaseTextInput } from \"../text-input\";\nimport { Calendar } from \"./internal/Calendar\";\nimport { getInitialDate, DateInfo } from \"./internal/utils\";\nimport { DatePickerProps, DateValidationError } from \"./types\";\nimport { formatInput, parseDateString } from \"./utils\";\nimport { isWithinLowerBound, isWithinUpperBound } from \"./validation\";\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((props, forwardedInputRef) => {\n const {\n \"data-testautoid\": testAutoId,\n id,\n className = \"\",\n label = \"Velg dato\",\n labelProps,\n defaultValue,\n defaultShow = false,\n value,\n disableBeforeDate: disableBefore,\n disableAfterDate: disableAfter,\n yearsToShow,\n name,\n helpLabel,\n errorLabel,\n invalid,\n density,\n days,\n months,\n monthLabel,\n yearLabel,\n placeholder = \"dd.mm.åååå\",\n width = \"11.25rem\",\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n action,\n showCalendarLabel = \"Åpne kalender\",\n hideCalendarLabel = \"Lukk kalender\",\n supportLabelProps,\n tooltipProps,\n ...rest\n } = props;\n\n if (process.env.NODE_ENV !== \"production\" && value && defaultValue) {\n console.warn(\n \"DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.\",\n );\n }\n /// Input state\n\n const disableBeforeDate = parseDateString(disableBefore);\n const minDate = disableBeforeDate ? startOfDay(disableBeforeDate) : undefined;\n const disableAfterDate = parseDateString(disableAfter);\n const maxDate = disableAfterDate ? startOfDay(disableAfterDate) : undefined;\n\n const [date, setDate] = useState(getInitialDate(value, defaultValue, minDate, maxDate));\n const [error, setError] = useState<DateValidationError | null>(null);\n\n /// Calendar state\n\n const [showCalendar, setShowCalendar] = useState(defaultShow);\n const [calendarRef] = useAnimatedHeight<HTMLDivElement>(showCalendar);\n\n /// Input events\n\n const iconButtonRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Hjelper for å gjøre det enklere å både forwarde refen men også bruke den selv internt\n const unifiedInputRef = useCallback(\n (instance: HTMLInputElement | null) => {\n inputRef.current = instance;\n if (forwardedInputRef) {\n if (typeof forwardedInputRef === \"function\") {\n forwardedInputRef(instance);\n } else {\n forwardedInputRef.current = instance;\n }\n }\n },\n [inputRef, forwardedInputRef],\n );\n\n const datepickerRef = useRef<HTMLDivElement>(null);\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (!onFocus || !datepickerRef.current) {\n return;\n }\n\n const nextFocusIsInside = datepickerRef.current.contains(e.relatedTarget as Node);\n if (!nextFocusIsInside) {\n onFocus(e, date, { error, value: e.target.value });\n }\n },\n [onFocus, date, error],\n );\n\n const handleBlur = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(e, date, { error, value: e.target.value });\n }\n },\n [onBlur, date, error],\n );\n\n const handleKeyDownAction = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") {\n setShowCalendar(false);\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (action?.onKeyDown) {\n action.onKeyDown(e);\n }\n },\n [setShowCalendar, action],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n setShowCalendar(false);\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (onKeyDown) {\n let nextValue = e.currentTarget.value;\n if (/[\\d.]/.test(e.key)) {\n nextValue += e.key;\n }\n onKeyDown(e, date, { error, value: nextValue });\n }\n },\n [onKeyDown, setShowCalendar, date, error],\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let nextDate: Date | null = null;\n let nextError: DateValidationError | null = null;\n\n if (e.target.value) {\n const val = parseDateString(e.target.value);\n if (!val) {\n nextError = \"WRONG_FORMAT\";\n } else if (minDate && !isWithinLowerBound(val, minDate)) {\n nextError = \"OUTSIDE_LOWER_BOUND\";\n } else if (maxDate && !isWithinUpperBound(val, maxDate)) {\n nextError = \"OUTSIDE_UPPER_BOUND\";\n } else {\n setShowCalendar(false);\n }\n nextDate = val || null;\n }\n\n setError(nextError);\n setDate(nextDate);\n\n if (onChange) {\n onChange(e, nextDate, { error: nextError, value: e.target.value });\n }\n },\n [onChange, setError, setDate, setShowCalendar, minDate, maxDate],\n );\n\n /// Calendar events\n\n const clickCalendar = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n flushSync(() => {\n setShowCalendar(!showCalendar);\n });\n\n const calendarEl = calendarRef.current;\n const button = calendarEl && (calendarEl.querySelector('[aria-pressed=\"true\"]') as HTMLButtonElement);\n button && button.focus();\n\n if (action?.onClick) {\n action.onClick(e);\n }\n },\n [setShowCalendar, showCalendar, action, calendarRef],\n );\n\n const clickInput = useCallback(() => {\n setShowCalendar(!showCalendar);\n }, [setShowCalendar, showCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowCalendar(false);\n }, [setShowCalendar]);\n\n const handleClickCalendarDay = useCallback(\n ({ date }: DateInfo) => {\n setShowCalendar(false);\n setDate(date);\n\n if (inputRef.current) {\n const node = inputRef.current;\n\n node.value = formatInput(date);\n\n // Simulér et change-event så APIet blir så likt som mulig en endring av inputfeltet\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"input\", true, false);\n node.dispatchEvent(event);\n\n node.focus();\n\n if (onChange) {\n // Det er ikke helt sant at dette er et React.SyntheticEvent, men it's fine – probably?\n // Den har tingene man kan forvente, men hvis du gjør serdeles fancy ting med events\n // så kan det hende du må utvide denne for å dekke behovet ditt.\n onChange(event as unknown as ChangeEvent<HTMLInputElement>, date, {\n error: null,\n value: node.value,\n });\n }\n }\n },\n [setShowCalendar, setDate, onChange],\n );\n\n const handleTabOutsideCalendar = useCallback(\n (e: KeyboardEvent) => {\n e.preventDefault();\n setShowCalendar(false);\n iconButtonRef.current && iconButtonRef.current.focus();\n },\n [setShowCalendar],\n );\n\n useClickOutside(datepickerRef, hideCalendar);\n useFocusOutside(datepickerRef, hideCalendar);\n useKeyListener(calendarRef, [\"Escape\"], () => {\n setShowCalendar(false);\n inputRef.current && inputRef.current.focus();\n });\n\n return (\n <InputGroup\n id={id}\n className={clsx(\"jkl-datepicker\", className, {\n \"jkl-datepicker--open\": showCalendar,\n })}\n {...rest}\n ref={datepickerRef}\n label={label}\n labelProps={labelProps}\n density={density}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n supportLabelProps={supportLabelProps}\n tooltipProps={tooltipProps}\n render={(inputProps) => (\n // The <div> element handles keyboard events that bubble up from <button> elements inside\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n data-testid=\"jkl-datepicker__input-wrapper\"\n className=\"jkl-datepicker__input-wrapper\"\n data-density={density}\n tabIndex={-1} // Må være her for Safari onBlur quirk! https://bugs.webkit.org/show_bug.cgi?id=22261\n onKeyDown={handleKeyDown}\n >\n <BaseTextInput\n ref={unifiedInputRef}\n data-testid=\"jkl-datepicker__input\"\n data-testautoid={testAutoId}\n className=\"jkl-datepicker__input\"\n name={name}\n defaultValue={defaultValue}\n density={density}\n value={value}\n type=\"text\"\n placeholder={placeholder}\n width={width}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={clickInput}\n onChange={handleChange}\n {...inputProps}\n action={{\n buttonRef: iconButtonRef,\n icon: <CalendarIcon />,\n label: showCalendar ? hideCalendarLabel : showCalendarLabel,\n ...action,\n onClick: clickCalendar,\n onKeyDown: handleKeyDownAction,\n }}\n />\n <div className=\"jkl-datepicker__calendar-wrapper\">\n <Calendar\n ref={calendarRef}\n density={density}\n date={date}\n minDate={minDate}\n maxDate={maxDate}\n days={days}\n months={months}\n monthLabel={monthLabel}\n yearLabel={yearLabel}\n yearsToShow={yearsToShow}\n hidden={!showCalendar}\n onDateSelected={handleClickCalendarDay}\n onTabOutside={handleTabOutsideCalendar}\n />\n </div>\n </div>\n )}\n />\n );\n});\n\nDatePicker.displayName = \"DatePicker\";\n"],"names":["DatePicker","forwardRef","props","forwardedInputRef","testAutoId","id","className","label","labelProps","defaultValue","defaultShow","value","disableBeforeDate","disableBefore","disableAfterDate","disableAfter","yearsToShow","name","helpLabel","errorLabel","invalid","density","days","months","monthLabel","yearLabel","placeholder","width","onChange","onBlur","onFocus","onKeyDown","action","showCalendarLabel","hideCalendarLabel","supportLabelProps","tooltipProps","rest","process","env","NODE_ENV","console","warn","parseDateString","minDate","startOfDay","maxDate","date","setDate","useState","getInitialDate","error","setError","showCalendar","setShowCalendar","calendarRef","useAnimatedHeight","iconButtonRef","useRef","inputRef","unifiedInputRef","useCallback","instance","current","datepickerRef","handleFocus","e","contains","relatedTarget","target","handleBlur","handleKeyDownAction","key","preventDefault","stopPropagation","handleKeyDown","nextValue","currentTarget","test","handleChange","nextDate","nextError","val","isWithinLowerBound","isWithinUpperBound","clickCalendar","flushSync","calendarEl","button","querySelector","focus","onClick","clickInput","hideCalendar","handleClickCalendarDay","node","formatInput","event","document","createEvent","initEvent","dispatchEvent","handleTabOutsideCalendar","useClickOutside","useFocusOutside","useKeyListener","jsx","InputGroup","clsx","ref","render","inputProps","jsxs","tabIndex","children","BaseTextInput","type","buttonRef","icon","CalendarIcon","Calendar","hidden","onDateSelected","onTabOutside","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport startOfDay from \"date-fns/startOfDay\";\nimport React, {\n ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { CalendarIcon } from \"../icon\";\nimport { IconButton } from \"../icon-button\";\nimport { InputGroup } from \"../input-group\";\nimport { Popover } from \"../popover\";\nimport { BaseTextInput } from \"../text-input\";\nimport { Calendar } from \"./internal/Calendar\";\nimport { getInitialDate, DateInfo } from \"./internal/utils\";\nimport { DatePickerProps, DateValidationError } from \"./types\";\nimport { formatInput, parseDateString } from \"./utils\";\nimport { isWithinLowerBound, isWithinUpperBound } from \"./validation\";\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((props, forwardedInputRef) => {\n const {\n \"data-testautoid\": testAutoId,\n id,\n className = \"\",\n label = \"Velg dato\",\n labelProps,\n defaultValue,\n defaultShow = false,\n value,\n disableBeforeDate: disableBefore,\n disableAfterDate: disableAfter,\n yearsToShow,\n name,\n helpLabel,\n errorLabel,\n invalid,\n density,\n days,\n months,\n monthLabel,\n yearLabel,\n placeholder = \"dd.mm.åååå\",\n width = \"11.25rem\",\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n action,\n showCalendarLabel = \"Åpne kalender\",\n hideCalendarLabel = \"Lukk kalender\",\n supportLabelProps,\n tooltipProps,\n ...rest\n } = props;\n\n if (process.env.NODE_ENV !== \"production\" && value && defaultValue) {\n console.warn(\n \"DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.\",\n );\n }\n /// Input state\n\n const disableBeforeDate = parseDateString(disableBefore);\n const minDate = disableBeforeDate ? startOfDay(disableBeforeDate) : undefined;\n const disableAfterDate = parseDateString(disableAfter);\n const maxDate = disableAfterDate ? startOfDay(disableAfterDate) : undefined;\n\n const [date, setDate] = useState(getInitialDate(value, defaultValue, minDate, maxDate));\n const [error, setError] = useState<DateValidationError | null>(null);\n\n /// Calendar state\n\n const [showCalendar, setShowCalendar] = useState(defaultShow);\n\n const calendarRef = useRef<HTMLDivElement>(null);\n const datepickerRef = useRef<HTMLDivElement>(null);\n\n /// Input events\n\n const iconButtonRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Hjelper for å gjøre det enklere å både forwarde refen men også bruke den selv internt\n const unifiedInputRef = useCallback(\n (instance: HTMLInputElement | null) => {\n inputRef.current = instance;\n if (forwardedInputRef) {\n if (typeof forwardedInputRef === \"function\") {\n forwardedInputRef(instance);\n } else {\n forwardedInputRef.current = instance;\n }\n }\n },\n [inputRef, forwardedInputRef],\n );\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (!onFocus || !datepickerRef.current) {\n return;\n }\n\n const nextFocusIsInside = datepickerRef.current.contains(e.relatedTarget as Node);\n if (!nextFocusIsInside) {\n onFocus(e, date, { error, value: e.target.value });\n }\n },\n [onFocus, date, error],\n );\n\n const handleBlur = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(e, date, { error, value: e.target.value });\n }\n },\n [onBlur, date, error],\n );\n\n const handleKeyDownAction = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") {\n setShowCalendar(false);\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (action?.onKeyDown) {\n action.onKeyDown(e);\n }\n },\n [setShowCalendar, action],\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let nextDate: Date | null = null;\n let nextError: DateValidationError | null = null;\n\n if (e.target.value) {\n const val = parseDateString(e.target.value);\n if (!val) {\n nextError = \"WRONG_FORMAT\";\n } else if (minDate && !isWithinLowerBound(val, minDate)) {\n nextError = \"OUTSIDE_LOWER_BOUND\";\n } else if (maxDate && !isWithinUpperBound(val, maxDate)) {\n nextError = \"OUTSIDE_UPPER_BOUND\";\n } else {\n setShowCalendar(false);\n }\n nextDate = val || null;\n }\n\n setError(nextError);\n setDate(nextDate);\n\n if (onChange) {\n onChange(e, nextDate, { error: nextError, value: e.target.value });\n }\n },\n [onChange, setError, setDate, setShowCalendar, minDate, maxDate],\n );\n\n /// Calendar events\n\n const clickCalendar = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n flushSync(() => {\n setShowCalendar(!showCalendar);\n });\n\n const calendarEl = calendarRef.current;\n const button = calendarEl && (calendarEl.querySelector('[aria-pressed=\"true\"]') as HTMLButtonElement);\n button && button.focus();\n\n if (action?.onClick) {\n action.onClick(e);\n }\n },\n [setShowCalendar, showCalendar, action, calendarRef],\n );\n\n const handleClickCalendarDay = useCallback(\n ({ date }: DateInfo) => {\n setShowCalendar(false);\n setDate(date);\n\n if (inputRef.current) {\n const node = inputRef.current;\n\n node.value = formatInput(date);\n\n // Simulér et change-event så APIet blir så likt som mulig en endring av inputfeltet\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"input\", true, false);\n node.dispatchEvent(event);\n\n node.focus();\n\n if (onChange) {\n // Det er ikke helt sant at dette er et React.SyntheticEvent, men it's fine – probably?\n // Den har tingene man kan forvente, men hvis du gjør serdeles fancy ting med events\n // så kan det hende du må utvide denne for å dekke behovet ditt.\n onChange(event as unknown as ChangeEvent<HTMLInputElement>, date, {\n error: null,\n value: node.value,\n });\n }\n }\n },\n [setShowCalendar, setDate, onChange],\n );\n\n const handleTabOutsideCalendar = useCallback(\n (e: KeyboardEvent) => {\n e.preventDefault();\n setShowCalendar(false);\n iconButtonRef.current && iconButtonRef.current.focus();\n },\n [setShowCalendar],\n );\n\n return (\n <InputGroup\n id={id}\n className={clsx(\"jkl-datepicker\", className, {\n \"jkl-datepicker--open\": showCalendar,\n })}\n {...rest}\n ref={datepickerRef}\n label={label}\n labelProps={labelProps}\n density={density}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n supportLabelProps={supportLabelProps}\n tooltipProps={tooltipProps}\n render={(inputProps) => (\n <BaseTextInput\n ref={unifiedInputRef}\n data-testid=\"jkl-datepicker__input\"\n data-testautoid={testAutoId}\n className=\"jkl-datepicker__input\"\n name={name}\n defaultValue={defaultValue}\n density={density}\n value={value}\n type=\"text\"\n placeholder={placeholder}\n width={width}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n actionButton={\n <Popover\n positionReference={inputRef}\n open={showCalendar}\n onOpenChange={() => setShowCalendar(!showCalendar)}\n offset={8}\n >\n <Popover.Trigger\n data-testid=\"jkl-datepicker__trigger\"\n title={showCalendar ? hideCalendarLabel : showCalendarLabel}\n className=\"jkl-text-input-action-button\"\n onClick={clickCalendar}\n onKeyDown={handleKeyDownAction}\n tabIndex={0}\n asChild\n >\n <IconButton {...action}>\n <CalendarIcon />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content initialFocus={-1} padding={24}>\n <Calendar\n ref={calendarRef}\n density={density}\n date={date}\n minDate={minDate}\n maxDate={maxDate}\n days={days}\n months={months}\n monthLabel={monthLabel}\n yearLabel={yearLabel}\n yearsToShow={yearsToShow}\n onDateSelected={handleClickCalendarDay}\n onTabOutside={handleTabOutsideCalendar}\n />\n </Popover.Content>\n </Popover>\n }\n {...inputProps}\n />\n )}\n />\n );\n});\n\nDatePicker.displayName = \"DatePicker\";\n"],"names":["DatePicker","forwardRef","props","forwardedInputRef","testAutoId","id","className","label","labelProps","defaultValue","defaultShow","value","disableBeforeDate","disableBefore","disableAfterDate","disableAfter","yearsToShow","name","helpLabel","errorLabel","invalid","density","days","months","monthLabel","yearLabel","placeholder","width","onChange","onBlur","onFocus","onKeyDown","action","showCalendarLabel","hideCalendarLabel","supportLabelProps","tooltipProps","rest","process","env","NODE_ENV","console","warn","parseDateString","minDate","startOfDay","maxDate","date","setDate","useState","getInitialDate","error","setError","showCalendar","setShowCalendar","calendarRef","useRef","datepickerRef","iconButtonRef","inputRef","unifiedInputRef","useCallback","instance","current","handleFocus","e","contains","relatedTarget","target","handleBlur","handleKeyDownAction","key","preventDefault","stopPropagation","handleChange","nextDate","nextError","val","isWithinLowerBound","isWithinUpperBound","clickCalendar","flushSync","calendarEl","button","querySelector","focus","onClick","handleClickCalendarDay","node","formatInput","event","document","createEvent","initEvent","dispatchEvent","handleTabOutsideCalendar","jsx","InputGroup","clsx","ref","render","inputProps","BaseTextInput","type","actionButton","jsxs","Popover","positionReference","open","onOpenChange","offset","children","Trigger","title","tabIndex","asChild","IconButton","CalendarIcon","Content","initialFocus","padding","Calendar","onDateSelected","onTabOutside","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{
|
|
1
|
+
import{jsx as e,jsxs as t}from"react/jsx-runtime";import{forwardRef as n,useReducer as a,useEffect as o,useCallback as r,useRef as c}from"react";import{flushSync as i}from"react-dom";import"../../../hooks/useScreen/useScreen.js";import{useId as s}from"../../../hooks/useId/useId.js";import"../../icon/Icon.js";import"../../icon/icons/animated/ArrowVerticalAnimated.js";import"../../icon/icons/animated/ArrowHorizontalAnimated.js";import"../../icon/icons/animated/PlusRemoveAnimated.js";import"../../icon/icons/ArrowDownIcon.js";import{ArrowLeftIcon as l}from"../../icon/icons/ArrowLeftIcon.js";import"../../icon/icons/ArrowNorthEastIcon.js";import{ArrowRightIcon as d}from"../../icon/icons/ArrowRightIcon.js";import"../../icon/icons/ArrowUpIcon.js";import"../../icon/icons/CalendarIcon.js";import"../../icon/icons/CheckIcon.js";import{ChevronDownIcon as u}from"../../icon/icons/ChevronDownIcon.js";import"../../icon/icons/ChevronLeftIcon.js";import"../../icon/icons/ChevronRightIcon.js";import"../../icon/icons/ChevronUpIcon.js";import"../../icon/icons/CloseIcon.js";import"../../icon/icons/CopyIcon.js";import"../../icon/icons/DotsIcon.js";import"../../icon/icons/DragIcon.js";import"../../icon/icons/ErrorIcon.js";import"../../icon/icons/GreenCheckIcon.js";import"../../icon/icons/HamburgerIcon.js";import"../../icon/icons/InfoIcon.js";import"../../icon/icons/LinkIcon.js";import"../../icon/icons/PlusIcon.js";import"../../icon/icons/QuestionIcon.js";import"../../icon/icons/RedCrossIcon.js";import"../../icon/icons/SearchIcon.js";import"../../icon/icons/SuccessIcon.js";import"../../icon/icons/WarningIcon.js";import"../../icon/icons/MinusIcon.js";import"../../icon/icons/ThumbDownIcon.js";import"../../icon/icons/ThumbUpIcon.js";import"../../icon/icons/TrashCanIcon.js";import"../../icon/icons/PenIcon.js";import{calendarReducer as m,calendarInitializer as h}from"./calendarReducer.js";import{useCalendar as p}from"./useCalendar.js";import{getInitialDateShown as g,isBackDisabled as f,subtractMonth as j,isForwardDisabled as b,addMonth as v,getYearSelectOptions as k,getMonthSelectOptions as w,DEFAULT_YEARS_TO_SHOW as D}from"./utils.js";const I=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],y=["man","tir","ons","tor","fre","lør","søn"],A=n(((n,A)=>{const{date:S,defaultSelected:_,density:M,minDate:C,maxDate:F,days:N=y,months:E=I,monthLabel:Y="Velg måned",yearLabel:x="Velg år",yearsToShow:O=D,onTabOutside:T,...$}=n,R=s("jkl-calendar"),[{offset:L,selectedDate:q,shownDate:P},U]=a(m,g(S,_,C,F),h),K=P.getMonth(),H=P.getFullYear();o((()=>{U({type:"SET_SELECTED_DATE",newDate:g(S,_,C,F)})}),[S,_,C,F]);const J=r((e=>{U({type:"SET_OFFSET",newOffset:e})}),[]),{calendars:V,getBackProps:W,getDateProps:z,getForwardProps:B,handleOffsetChanged:G}=p({date:q,selected:q,minDate:C,maxDate:F,offset:L,onOffsetChanged:J,firstDayOfWeek:1,...$}),Q=c(null),X=r((e=>{if(!Q.current)return;const t=document.activeElement,n=Q.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]'),a=async e=>{null==t||t.setAttribute("tabindex","-1"),e.setAttribute("tabindex","0"),e.focus()};n.forEach(((o,r)=>{const c=r+e;if(o==t)if(c<=n.length-1&&c>=0)a(n[c]);else if(e<0){if(f({calendars:V,minDate:C})||(i((()=>{G(L-j({calendars:V,offset:1,minDate:C}))})),!Q.current))return;const e=Q.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[e.length+c]&&(e[0].setAttribute("tabindex","-1"),a(e[e.length+c]))}else{if(b({calendars:V,maxDate:F})||(i((()=>{G(L+v({calendars:V,offset:1,maxDate:F}))})),!Q.current))return;const e=Q.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[c-n.length]&&(e[0].setAttribute("tabindex","-1"),a(e[c-n.length]))}}))}),[G,Q,L,V,F,C]),Z=r((e=>{switch(e.key){case"ArrowUp":X(-7),e.preventDefault();break;case"ArrowRight":X(1),e.preventDefault();break;case"ArrowDown":X(7),e.preventDefault();break;case"ArrowLeft":X(-1),e.preventDefault()}}),[X]),ee=r((e=>{var t;if("Tab"!==e.key)return;const n=null==(t=Q.current)?void 0:t.querySelectorAll('button:not([disabled]):not([tabindex="-1"]), select');if(!n)return;const a=n[0],o=n[n.length-1];e.shiftKey||document.activeElement!==o?e.shiftKey&&document.activeElement===a&&(o.focus(),e.preventDefault()):(a.focus(),e.preventDefault())}),[]),te=r((e=>{const{date:t,selected:n,selectable:a,prevMonth:o,nextMonth:r}=e;return!!a&&!(!n&&t.toString()!==(null==C?void 0:C.toString())&&(o||r||P.getFullYear()!==t.getFullYear()||q.getMonth()===t.getMonth()||1!==t.getDate()))}),[P,C,q]),ne=r((()=>{C&&P.getFullYear()-C.getFullYear()==0&&P.getMonth()-C.getMonth()==1?document.querySelectorAll(".jkl-calendar-navigation__arrow")[1].focus():F&&F.getFullYear()-P.getFullYear()==0&&F.getMonth()-P.getMonth()==1&&document.querySelectorAll(".jkl-calendar-navigation__arrow")[0].focus()}),[C,F,P]),ae=r((e=>{if(4!==e.target.value.length)return;const t=Number.parseInt(e.target.value);if(Number.isNaN(t))return;let n=12*(t-P.getFullYear());const a=new Date(P.getFullYear(),P.getMonth()+n,P.getDate());F&&F.getFullYear()===a.getFullYear()&&F.getMonth()<a.getMonth()?n-=a.getMonth()-F.getMonth():C&&C.getFullYear()===a.getFullYear()&&C.getMonth()>a.getMonth()&&(n+=C.getMonth()-a.getMonth()),U({type:"ADD_OFFSET",addedOffset:n})}),[P,C,F]),oe=r((e=>{if(!q&&!S)return;const t=P.getFullYear()-(q||new Date).getFullYear(),n=Number.parseInt(e.target.value)-(q||new Date).getMonth();U({type:"SET_OFFSET",newOffset:12*t+n})}),[q,S,P]),re=k(H,C,F,O),ce=w(H,E,C,F);return e("div",{ref:A,id:R,className:"jkl-calendar","data-testid":"jkl-calendar",children:t("div",{className:"jkl-calendar__padding",ref:Q,onKeyDown:ee,children:[t("fieldset",{className:"jkl-calendar-navigation",children:[t("div",{children:[e("button",{...W({calendars:V,onClick:ne}),className:"jkl-calendar-navigation__arrow",type:"button",children:e(l,{variant:"medium",bold:!0})}),e("button",{...B({calendars:V,onClick:ne}),className:"jkl-calendar-navigation__arrow",type:"button",children:e(d,{variant:"medium",bold:!0})})]}),t("div",{children:[t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:oe,className:"jkl-calendar-navigation-dropdown__select","aria-label":Y,value:K.toString(),children:ce.map((({label:t,value:n})=>e("option",{value:n,children:t},n)))}),e(u,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]}),t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:ae,className:"jkl-calendar-navigation-dropdown__select","aria-label":x,value:H.toString(),children:re.map((t=>e("option",{value:t,children:t},t)))}),e(u,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]})]})]}),V.map((n=>t("table",{className:"jkl-calendar-table","data-testid":"jkl-datepicker-calendar",children:[t("caption",{className:"jkl-sr-only",children:[E[n.month],", ",n.year]}),e("thead",{children:e("tr",{children:N.map((t=>e("th",{children:t},`${n.month}${n.year}${t}`)))})}),e("tbody",{"data-testid":"jkl-datepicker-dates",children:n.weeks.map(((t,a)=>e("tr",{children:t.map(((t,o)=>{const r=`${n.month}${n.year}${a}${o}`;if("string"==typeof t)return e("td",{className:"jkl-calendar__date jkl-calendar__date--empty",children:t},r);const{date:c,selectable:i,today:s,prevMonth:l,nextMonth:d}=t;return e("td",{children:e("button",{...z({dateObj:t}),type:"button",className:"jkl-calendar-date-button",tabIndex:te(t)?0:-1,"aria-label":`${c.getDate()}. ${E[c.getMonth()].toLowerCase()}`,"aria-current":s?"date":void 0,"data-adjacent":l||d?"true":void 0,disabled:!i,onKeyDown:Z,children:e("span",{"aria-hidden":"true",children:c.getDate()})})},r)}))},`${n.month}${n.year}${a}`)))})]},`${n.month}${n.year}`)))]})})}));A.displayName="Calendar";export{A as Calendar};
|
|
2
2
|
//# sourceMappingURL=Calendar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","sources":["../../../../../src/components/datepicker/internal/Calendar.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { forwardRef, useCallback, useEffect, useReducer, useRef } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Density } from \"../../../core\";\nimport { useId } from \"../../../hooks\";\nimport { ArrowLeftIcon, ArrowRightIcon, ChevronDownIcon } from \"../../icon\";\nimport type { YearsToShow } from \"../types\";\nimport { calendarInitializer, calendarReducer } from \"./calendarReducer\";\nimport { useCalendar, UseCalendarProps } from \"./useCalendar\";\nimport {\n addMonth,\n subtractMonth,\n isBackDisabled,\n isForwardDisabled,\n getYearSelectOptions,\n getMonthSelectOptions,\n DateInfo,\n getInitialDateShown,\n DEFAULT_YEARS_TO_SHOW,\n} from \"./utils\";\n\ninterface CalendarProps\n extends Omit<UseCalendarProps, \"date\" | \"onOffsetChanged\" | \"offset\" | \"firstDayOfWeek\" | \"selected\"> {\n date: Date | null;\n density?: Density;\n defaultSelected?: Date;\n hidden?: boolean;\n days?: string[];\n months?: string[];\n monthLabel?: string;\n yearLabel?: string;\n yearsToShow?: YearsToShow;\n onTabOutside: React.KeyboardEventHandler;\n}\n\nconst defaultMonths = [\n \"Januar\",\n \"Februar\",\n \"Mars\",\n \"April\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"August\",\n \"September\",\n \"Oktober\",\n \"November\",\n \"Desember\",\n];\n\nconst defaultDays = [\"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"lør\", \"søn\"];\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>((props, ref) => {\n const {\n hidden,\n date,\n defaultSelected,\n density,\n minDate,\n maxDate,\n days = defaultDays,\n months = defaultMonths,\n monthLabel = \"Velg måned\",\n yearLabel = \"Velg år\",\n yearsToShow = DEFAULT_YEARS_TO_SHOW,\n onTabOutside,\n ...rest\n } = props;\n\n const id = useId(\"jkl-calendar\");\n\n const [{ offset, selectedDate, shownDate }, dispatch] = useReducer(\n calendarReducer,\n getInitialDateShown(date, defaultSelected, minDate, maxDate),\n calendarInitializer,\n );\n\n const shownMonth = shownDate.getMonth();\n const shownYear = shownDate.getFullYear();\n\n useEffect(() => {\n dispatch({\n type: \"SET_SELECTED_DATE\",\n newDate: getInitialDateShown(date, defaultSelected, minDate, maxDate),\n });\n }, [date, defaultSelected, minDate, maxDate]);\n\n const onOffsetChanged = useCallback((newOffset: number) => {\n dispatch({\n type: \"SET_OFFSET\",\n newOffset,\n });\n }, []);\n\n const { calendars, getBackProps, getDateProps, getForwardProps, handleOffsetChanged } = useCalendar({\n date: selectedDate,\n selected: selectedDate,\n minDate,\n maxDate,\n offset,\n onOffsetChanged,\n firstDayOfWeek: 1,\n ...rest,\n });\n\n /// Calendar keyboard navigation\n\n const calendarPaddingRef = useRef<HTMLDivElement>(null);\n const doFocusChange = useCallback(\n (offsetDiff: number) => {\n if (!calendarPaddingRef.current) {\n return;\n }\n\n const e = document.activeElement;\n const buttons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n\n const changeFocusTo = async (nextButton: HTMLButtonElement) => {\n e?.setAttribute(\"tabindex\", \"-1\");\n nextButton.setAttribute(\"tabindex\", \"0\");\n nextButton.focus();\n };\n\n buttons.forEach((el, i) => {\n const newNodeKey = i + offsetDiff;\n\n if (el == e) {\n if (newNodeKey <= buttons.length - 1 && newNodeKey >= 0) {\n changeFocusTo(buttons[newNodeKey]);\n } else if (offsetDiff < 0) {\n if (isBackDisabled({ calendars, minDate })) {\n return;\n }\n\n // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n // en dag utenfor måneden. Er offsetDiff negativ så har vi gått tilbake en\n // måned.\n flushSync(() => {\n handleOffsetChanged(offset - subtractMonth({ calendars, offset: 1, minDate }));\n });\n if (!calendarPaddingRef.current) {\n return;\n }\n const newButtons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n // + - = -\n if (newButtons[newButtons.length + newNodeKey]) {\n // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n newButtons[0].setAttribute(\"tabindex\", \"-1\");\n changeFocusTo(newButtons[newButtons.length + newNodeKey]);\n }\n } else {\n if (isForwardDisabled({ calendars, maxDate })) {\n return;\n }\n\n // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n // en dag utenfor måneden. Er offsetDiff positiv så har vi gått frem en\n // måned.\n flushSync(() => {\n handleOffsetChanged(offset + addMonth({ calendars, offset: 1, maxDate }));\n });\n if (!calendarPaddingRef.current) {\n return;\n }\n const newButtons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n // NewNodeKey er basert på forrige måneds liste med knapper. For at verdien skal bli\n // riktig i vår nye måned må vi trekke fra anntal dager fra forrige måned.\n if (newButtons[newNodeKey - buttons.length]) {\n // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n newButtons[0].setAttribute(\"tabindex\", \"-1\");\n changeFocusTo(newButtons[newNodeKey - buttons.length]);\n }\n }\n }\n });\n },\n [handleOffsetChanged, calendarPaddingRef, offset, calendars, maxDate, minDate],\n );\n\n const handleArrowNavigation = useCallback(\n (event: React.KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowUp\":\n doFocusChange(-7);\n event.preventDefault();\n break;\n case \"ArrowRight\":\n doFocusChange(1);\n event.preventDefault();\n break;\n case \"ArrowDown\":\n doFocusChange(7);\n event.preventDefault();\n break;\n case \"ArrowLeft\":\n doFocusChange(-1);\n event.preventDefault();\n break;\n default:\n break;\n }\n },\n [doFocusChange],\n );\n\n const handleTabInside: React.KeyboardEventHandler = useCallback((event) => {\n if (event.key !== \"Tab\") return;\n\n const focusableElements = calendarPaddingRef.current?.querySelectorAll<HTMLElement>(\n 'button:not([disabled]):not([tabindex=\"-1\"]), select',\n );\n\n if (!focusableElements) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (!event.shiftKey && document.activeElement === lastElement) {\n firstElement.focus();\n event.preventDefault();\n } else if (event.shiftKey && document.activeElement === firstElement) {\n lastElement.focus();\n event.preventDefault();\n }\n }, []);\n\n const isFocusableDate = useCallback(\n (dateInfo: DateInfo) => {\n const { date, selected, selectable, prevMonth, nextMonth } = dateInfo;\n\n // Datoen kan ikke velges\n if (!selectable) {\n return false;\n }\n // Datoen er valgt dato\n if (selected) {\n return true;\n }\n // Datoen er første valgbare dato\n if (date.toString() === minDate?.toString()) {\n return true;\n }\n\n // Datoen er første i måneden som vises\n if (\n !prevMonth &&\n !nextMonth &&\n shownDate.getFullYear() === date.getFullYear() &&\n selectedDate.getMonth() !== date.getMonth() &&\n date.getDate() === 1\n ) {\n return true;\n }\n\n return false;\n },\n [shownDate, minDate, selectedDate],\n );\n\n const handleGotoEdgeMonth = useCallback(() => {\n if (\n // Vi er i ferd med å gå til første måned\n minDate &&\n shownDate.getFullYear() - minDate.getFullYear() === 0 &&\n shownDate.getMonth() - minDate.getMonth() === 1\n ) {\n // Fokuser på \"neste månded\"-knappen\n document.querySelectorAll<HTMLButtonElement>(\".jkl-calendar-navigation__arrow\")[1].focus();\n } else if (\n // Vi er i ferd med å gå til siste måned\n maxDate &&\n maxDate.getFullYear() - shownDate.getFullYear() === 0 &&\n maxDate.getMonth() - shownDate.getMonth() === 1\n ) {\n // Fokuser på \"forrige månded\"-knappen\n document.querySelectorAll<HTMLButtonElement>(\".jkl-calendar-navigation__arrow\")[0].focus();\n }\n }, [minDate, maxDate, shownDate]);\n\n /// Extended variant events\n\n const handleYearChange = useCallback<React.ChangeEventHandler<HTMLSelectElement>>(\n (event) => {\n if (event.target.value.length !== 4) {\n return;\n }\n\n const year: number = Number.parseInt(event.target.value);\n if (Number.isNaN(year)) {\n return;\n }\n\n let offset = (year - shownDate.getFullYear()) * 12;\n const expectedDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + offset, shownDate.getDate());\n\n // Pass på at vi ikke hopper forbi maks. eller min. dato\n if (\n maxDate &&\n maxDate.getFullYear() === expectedDate.getFullYear() &&\n maxDate.getMonth() < expectedDate.getMonth()\n ) {\n offset -= expectedDate.getMonth() - maxDate.getMonth();\n } else if (\n minDate &&\n minDate.getFullYear() === expectedDate.getFullYear() &&\n minDate.getMonth() > expectedDate.getMonth()\n ) {\n offset += minDate.getMonth() - expectedDate.getMonth();\n }\n\n dispatch({\n type: \"ADD_OFFSET\",\n addedOffset: offset,\n });\n\n return;\n },\n [shownDate, minDate, maxDate],\n );\n\n const handleMonthChange = useCallback<React.ChangeEventHandler<HTMLSelectElement>>(\n (event) => {\n if (!selectedDate && !date) {\n return;\n }\n\n const yearDiff = shownDate.getFullYear() - (selectedDate || new Date()).getFullYear();\n const monthDiff = Number.parseInt(event.target.value) - (selectedDate || new Date()).getMonth();\n\n dispatch({\n type: \"SET_OFFSET\",\n newOffset: yearDiff * 12 + monthDiff,\n });\n\n return;\n },\n [selectedDate, date, shownDate],\n );\n\n const yearSelectOptions = getYearSelectOptions(shownYear, minDate, maxDate, yearsToShow);\n const monthSelectOptions = getMonthSelectOptions(shownYear, months, minDate, maxDate);\n\n return (\n <div\n ref={ref}\n id={id}\n className={clsx(\"jkl-calendar\", {\n \"jkl-calendar--hidden\": hidden,\n })}\n data-testid=\"jkl-calendar\"\n >\n {/* Vi lytter på på trykk på Tab inne i kalenderen for å håndtere fokus */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div className=\"jkl-calendar__padding\" ref={calendarPaddingRef} onKeyDown={handleTabInside}>\n <fieldset className=\"jkl-calendar-navigation\">\n <div>\n <button\n {...getBackProps({ calendars, onClick: handleGotoEdgeMonth })}\n className=\"jkl-calendar-navigation__arrow\"\n type=\"button\"\n >\n <ArrowLeftIcon variant=\"medium\" bold />\n </button>\n <button\n {...getForwardProps({ calendars, onClick: handleGotoEdgeMonth })}\n className=\"jkl-calendar-navigation__arrow\"\n type=\"button\"\n >\n <ArrowRightIcon variant=\"medium\" bold />\n </button>\n </div>\n <div>\n <div className=\"jkl-calendar-navigation-dropdown\">\n <select\n onChange={handleMonthChange}\n className=\"jkl-calendar-navigation-dropdown__select\"\n aria-label={monthLabel}\n value={shownMonth.toString()}\n >\n {monthSelectOptions.map(({ label, value }) => (\n <option key={value} value={value}>\n {label}\n </option>\n ))}\n </select>\n <ChevronDownIcon bold className=\"jkl-calendar-navigation-dropdown__chevron\" />\n </div>\n <div className=\"jkl-calendar-navigation-dropdown\">\n <select\n onChange={handleYearChange}\n className=\"jkl-calendar-navigation-dropdown__select\"\n aria-label={yearLabel}\n value={shownYear.toString()}\n >\n {yearSelectOptions.map((year) => (\n <option key={year} value={year}>\n {year}\n </option>\n ))}\n </select>\n <ChevronDownIcon bold className=\"jkl-calendar-navigation-dropdown__chevron\" />\n </div>\n </div>\n </fieldset>\n {calendars.map((calendar) => (\n <table\n className=\"jkl-calendar-table\"\n key={`${calendar.month}${calendar.year}`}\n data-testid=\"jkl-datepicker-calendar\"\n >\n <caption className=\"jkl-sr-only\">\n {months[calendar.month]}, {calendar.year}\n </caption>\n <thead>\n <tr>\n {days.map((weekday) => (\n <th key={`${calendar.month}${calendar.year}${weekday}`}>{weekday}</th>\n ))}\n </tr>\n </thead>\n <tbody data-testid=\"jkl-datepicker-dates\">\n {calendar.weeks.map((week, weekIndex) => (\n <tr key={`${calendar.month}${calendar.year}${weekIndex}`}>\n {week.map((dateInfo, index) => {\n const key = `${calendar.month}${calendar.year}${weekIndex}${index}`;\n if (typeof dateInfo === \"string\") {\n return (\n <td className=\"jkl-calendar__date jkl-calendar__date--empty\" key={key}>\n {dateInfo}\n </td>\n );\n }\n const { date, selectable, today, prevMonth, nextMonth } = dateInfo;\n\n return (\n <td key={key}>\n <button\n {...getDateProps({\n dateObj: dateInfo,\n })}\n type=\"button\"\n className=\"jkl-calendar-date-button\"\n tabIndex={isFocusableDate(dateInfo) ? 0 : -1}\n aria-label={`${date.getDate()}. ${months[\n date.getMonth()\n ].toLowerCase()}`}\n aria-current={today ? \"date\" : undefined}\n data-adjacent={prevMonth || nextMonth ? \"true\" : undefined}\n disabled={!selectable}\n onKeyDown={handleArrowNavigation}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n </div>\n );\n});\n\nCalendar.displayName = \"Calendar\";\n"],"names":["defaultMonths","defaultDays","Calendar","forwardRef","props","ref","hidden","date","defaultSelected","density","minDate","maxDate","days","months","monthLabel","yearLabel","yearsToShow","DEFAULT_YEARS_TO_SHOW","onTabOutside","rest","id","useId","offset","selectedDate","shownDate","dispatch","useReducer","calendarReducer","getInitialDateShown","calendarInitializer","shownMonth","getMonth","shownYear","getFullYear","useEffect","type","newDate","onOffsetChanged","useCallback","newOffset","calendars","getBackProps","getDateProps","getForwardProps","handleOffsetChanged","useCalendar","selected","firstDayOfWeek","calendarPaddingRef","useRef","doFocusChange","offsetDiff","current","e","document","activeElement","buttons","querySelectorAll","changeFocusTo","async","nextButton","setAttribute","focus","forEach","el","i","newNodeKey","length","isBackDisabled","flushSync","subtractMonth","newButtons","isForwardDisabled","addMonth","handleArrowNavigation","event","key","preventDefault","handleTabInside","focusableElements","_a","firstElement","lastElement","shiftKey","isFocusableDate","dateInfo","selectable","prevMonth","nextMonth","toString","getDate","handleGotoEdgeMonth","handleYearChange","target","value","year","Number","parseInt","isNaN","expectedDate","Date","addedOffset","handleMonthChange","yearDiff","monthDiff","yearSelectOptions","getYearSelectOptions","monthSelectOptions","getMonthSelectOptions","jsx","className","clsx","children","onKeyDown","jsxs","onClick","ArrowLeftIcon","variant","bold","ArrowRightIcon","onChange","map","label","ChevronDownIcon","calendar","month","weekday","weeks","week","weekIndex","index","today","dateObj","tabIndex","toLowerCase","disabled","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Calendar.js","sources":["../../../../../src/components/datepicker/internal/Calendar.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect, useReducer, useRef } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Density } from \"../../../core\";\nimport { useId } from \"../../../hooks\";\nimport { ArrowLeftIcon, ArrowRightIcon, ChevronDownIcon } from \"../../icon\";\nimport type { YearsToShow } from \"../types\";\nimport { calendarInitializer, calendarReducer } from \"./calendarReducer\";\nimport { useCalendar, UseCalendarProps } from \"./useCalendar\";\nimport {\n addMonth,\n subtractMonth,\n isBackDisabled,\n isForwardDisabled,\n getYearSelectOptions,\n getMonthSelectOptions,\n DateInfo,\n getInitialDateShown,\n DEFAULT_YEARS_TO_SHOW,\n} from \"./utils\";\n\ninterface CalendarProps\n extends Omit<UseCalendarProps, \"date\" | \"onOffsetChanged\" | \"offset\" | \"firstDayOfWeek\" | \"selected\"> {\n date: Date | null;\n density?: Density;\n defaultSelected?: Date;\n days?: string[];\n months?: string[];\n monthLabel?: string;\n yearLabel?: string;\n yearsToShow?: YearsToShow;\n onTabOutside: React.KeyboardEventHandler;\n}\n\nconst defaultMonths = [\n \"Januar\",\n \"Februar\",\n \"Mars\",\n \"April\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"August\",\n \"September\",\n \"Oktober\",\n \"November\",\n \"Desember\",\n];\n\nconst defaultDays = [\"man\", \"tir\", \"ons\", \"tor\", \"fre\", \"lør\", \"søn\"];\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>((props, ref) => {\n const {\n date,\n defaultSelected,\n density,\n minDate,\n maxDate,\n days = defaultDays,\n months = defaultMonths,\n monthLabel = \"Velg måned\",\n yearLabel = \"Velg år\",\n yearsToShow = DEFAULT_YEARS_TO_SHOW,\n onTabOutside,\n ...rest\n } = props;\n\n const id = useId(\"jkl-calendar\");\n\n const [{ offset, selectedDate, shownDate }, dispatch] = useReducer(\n calendarReducer,\n getInitialDateShown(date, defaultSelected, minDate, maxDate),\n calendarInitializer,\n );\n\n const shownMonth = shownDate.getMonth();\n const shownYear = shownDate.getFullYear();\n\n useEffect(() => {\n dispatch({\n type: \"SET_SELECTED_DATE\",\n newDate: getInitialDateShown(date, defaultSelected, minDate, maxDate),\n });\n }, [date, defaultSelected, minDate, maxDate]);\n\n const onOffsetChanged = useCallback((newOffset: number) => {\n dispatch({\n type: \"SET_OFFSET\",\n newOffset,\n });\n }, []);\n\n const { calendars, getBackProps, getDateProps, getForwardProps, handleOffsetChanged } = useCalendar({\n date: selectedDate,\n selected: selectedDate,\n minDate,\n maxDate,\n offset,\n onOffsetChanged,\n firstDayOfWeek: 1,\n ...rest,\n });\n\n /// Calendar keyboard navigation\n\n const calendarPaddingRef = useRef<HTMLDivElement>(null);\n const doFocusChange = useCallback(\n (offsetDiff: number) => {\n if (!calendarPaddingRef.current) {\n return;\n }\n\n const e = document.activeElement;\n const buttons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n\n const changeFocusTo = async (nextButton: HTMLButtonElement) => {\n e?.setAttribute(\"tabindex\", \"-1\");\n nextButton.setAttribute(\"tabindex\", \"0\");\n nextButton.focus();\n };\n\n buttons.forEach((el, i) => {\n const newNodeKey = i + offsetDiff;\n\n if (el == e) {\n if (newNodeKey <= buttons.length - 1 && newNodeKey >= 0) {\n changeFocusTo(buttons[newNodeKey]);\n } else if (offsetDiff < 0) {\n if (isBackDisabled({ calendars, minDate })) {\n return;\n }\n\n // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n // en dag utenfor måneden. Er offsetDiff negativ så har vi gått tilbake en\n // måned.\n flushSync(() => {\n handleOffsetChanged(offset - subtractMonth({ calendars, offset: 1, minDate }));\n });\n if (!calendarPaddingRef.current) {\n return;\n }\n const newButtons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n // + - = -\n if (newButtons[newButtons.length + newNodeKey]) {\n // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n newButtons[0].setAttribute(\"tabindex\", \"-1\");\n changeFocusTo(newButtons[newButtons.length + newNodeKey]);\n }\n } else {\n if (isForwardDisabled({ calendars, maxDate })) {\n return;\n }\n\n // Hvis newNodeKey er utenfor samlingen med knapper så har vi prøvd å gå til\n // en dag utenfor måneden. Er offsetDiff positiv så har vi gått frem en\n // måned.\n flushSync(() => {\n handleOffsetChanged(offset + addMonth({ calendars, offset: 1, maxDate }));\n });\n if (!calendarPaddingRef.current) {\n return;\n }\n const newButtons = calendarPaddingRef.current.querySelectorAll<HTMLButtonElement>(\n 'button.jkl-calendar-date-button:not([data-adjacent=\"true\"]',\n );\n // NewNodeKey er basert på forrige måneds liste med knapper. For at verdien skal bli\n // riktig i vår nye måned må vi trekke fra anntal dager fra forrige måned.\n if (newButtons[newNodeKey - buttons.length]) {\n // Sørg for at ikke både 1. i måneden og valgt dag er fokuserbare\n newButtons[0].setAttribute(\"tabindex\", \"-1\");\n changeFocusTo(newButtons[newNodeKey - buttons.length]);\n }\n }\n }\n });\n },\n [handleOffsetChanged, calendarPaddingRef, offset, calendars, maxDate, minDate],\n );\n\n const handleArrowNavigation = useCallback(\n (event: React.KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowUp\":\n doFocusChange(-7);\n event.preventDefault();\n break;\n case \"ArrowRight\":\n doFocusChange(1);\n event.preventDefault();\n break;\n case \"ArrowDown\":\n doFocusChange(7);\n event.preventDefault();\n break;\n case \"ArrowLeft\":\n doFocusChange(-1);\n event.preventDefault();\n break;\n default:\n break;\n }\n },\n [doFocusChange],\n );\n\n const handleTabInside: React.KeyboardEventHandler = useCallback((event) => {\n if (event.key !== \"Tab\") return;\n\n const focusableElements = calendarPaddingRef.current?.querySelectorAll<HTMLElement>(\n 'button:not([disabled]):not([tabindex=\"-1\"]), select',\n );\n\n if (!focusableElements) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (!event.shiftKey && document.activeElement === lastElement) {\n firstElement.focus();\n event.preventDefault();\n } else if (event.shiftKey && document.activeElement === firstElement) {\n lastElement.focus();\n event.preventDefault();\n }\n }, []);\n\n const isFocusableDate = useCallback(\n (dateInfo: DateInfo) => {\n const { date, selected, selectable, prevMonth, nextMonth } = dateInfo;\n\n // Datoen kan ikke velges\n if (!selectable) {\n return false;\n }\n // Datoen er valgt dato\n if (selected) {\n return true;\n }\n // Datoen er første valgbare dato\n if (date.toString() === minDate?.toString()) {\n return true;\n }\n\n // Datoen er første i måneden som vises\n if (\n !prevMonth &&\n !nextMonth &&\n shownDate.getFullYear() === date.getFullYear() &&\n selectedDate.getMonth() !== date.getMonth() &&\n date.getDate() === 1\n ) {\n return true;\n }\n\n return false;\n },\n [shownDate, minDate, selectedDate],\n );\n\n const handleGotoEdgeMonth = useCallback(() => {\n if (\n // Vi er i ferd med å gå til første måned\n minDate &&\n shownDate.getFullYear() - minDate.getFullYear() === 0 &&\n shownDate.getMonth() - minDate.getMonth() === 1\n ) {\n // Fokuser på \"neste månded\"-knappen\n document.querySelectorAll<HTMLButtonElement>(\".jkl-calendar-navigation__arrow\")[1].focus();\n } else if (\n // Vi er i ferd med å gå til siste måned\n maxDate &&\n maxDate.getFullYear() - shownDate.getFullYear() === 0 &&\n maxDate.getMonth() - shownDate.getMonth() === 1\n ) {\n // Fokuser på \"forrige månded\"-knappen\n document.querySelectorAll<HTMLButtonElement>(\".jkl-calendar-navigation__arrow\")[0].focus();\n }\n }, [minDate, maxDate, shownDate]);\n\n /// Extended variant events\n\n const handleYearChange = useCallback<React.ChangeEventHandler<HTMLSelectElement>>(\n (event) => {\n if (event.target.value.length !== 4) {\n return;\n }\n\n const year: number = Number.parseInt(event.target.value);\n if (Number.isNaN(year)) {\n return;\n }\n\n let offset = (year - shownDate.getFullYear()) * 12;\n const expectedDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + offset, shownDate.getDate());\n\n // Pass på at vi ikke hopper forbi maks. eller min. dato\n if (\n maxDate &&\n maxDate.getFullYear() === expectedDate.getFullYear() &&\n maxDate.getMonth() < expectedDate.getMonth()\n ) {\n offset -= expectedDate.getMonth() - maxDate.getMonth();\n } else if (\n minDate &&\n minDate.getFullYear() === expectedDate.getFullYear() &&\n minDate.getMonth() > expectedDate.getMonth()\n ) {\n offset += minDate.getMonth() - expectedDate.getMonth();\n }\n\n dispatch({\n type: \"ADD_OFFSET\",\n addedOffset: offset,\n });\n\n return;\n },\n [shownDate, minDate, maxDate],\n );\n\n const handleMonthChange = useCallback<React.ChangeEventHandler<HTMLSelectElement>>(\n (event) => {\n if (!selectedDate && !date) {\n return;\n }\n\n const yearDiff = shownDate.getFullYear() - (selectedDate || new Date()).getFullYear();\n const monthDiff = Number.parseInt(event.target.value) - (selectedDate || new Date()).getMonth();\n\n dispatch({\n type: \"SET_OFFSET\",\n newOffset: yearDiff * 12 + monthDiff,\n });\n\n return;\n },\n [selectedDate, date, shownDate],\n );\n\n const yearSelectOptions = getYearSelectOptions(shownYear, minDate, maxDate, yearsToShow);\n const monthSelectOptions = getMonthSelectOptions(shownYear, months, minDate, maxDate);\n\n return (\n <div ref={ref} id={id} className=\"jkl-calendar\" data-testid=\"jkl-calendar\">\n {/* Vi lytter på på trykk på Tab inne i kalenderen for å håndtere fokus */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div className=\"jkl-calendar__padding\" ref={calendarPaddingRef} onKeyDown={handleTabInside}>\n <fieldset className=\"jkl-calendar-navigation\">\n <div>\n <button\n {...getBackProps({ calendars, onClick: handleGotoEdgeMonth })}\n className=\"jkl-calendar-navigation__arrow\"\n type=\"button\"\n >\n <ArrowLeftIcon variant=\"medium\" bold />\n </button>\n <button\n {...getForwardProps({ calendars, onClick: handleGotoEdgeMonth })}\n className=\"jkl-calendar-navigation__arrow\"\n type=\"button\"\n >\n <ArrowRightIcon variant=\"medium\" bold />\n </button>\n </div>\n <div>\n <div className=\"jkl-calendar-navigation-dropdown\">\n <select\n onChange={handleMonthChange}\n className=\"jkl-calendar-navigation-dropdown__select\"\n aria-label={monthLabel}\n value={shownMonth.toString()}\n >\n {monthSelectOptions.map(({ label, value }) => (\n <option key={value} value={value}>\n {label}\n </option>\n ))}\n </select>\n <ChevronDownIcon bold className=\"jkl-calendar-navigation-dropdown__chevron\" />\n </div>\n <div className=\"jkl-calendar-navigation-dropdown\">\n <select\n onChange={handleYearChange}\n className=\"jkl-calendar-navigation-dropdown__select\"\n aria-label={yearLabel}\n value={shownYear.toString()}\n >\n {yearSelectOptions.map((year) => (\n <option key={year} value={year}>\n {year}\n </option>\n ))}\n </select>\n <ChevronDownIcon bold className=\"jkl-calendar-navigation-dropdown__chevron\" />\n </div>\n </div>\n </fieldset>\n {calendars.map((calendar) => (\n <table\n className=\"jkl-calendar-table\"\n key={`${calendar.month}${calendar.year}`}\n data-testid=\"jkl-datepicker-calendar\"\n >\n <caption className=\"jkl-sr-only\">\n {months[calendar.month]}, {calendar.year}\n </caption>\n <thead>\n <tr>\n {days.map((weekday) => (\n <th key={`${calendar.month}${calendar.year}${weekday}`}>{weekday}</th>\n ))}\n </tr>\n </thead>\n <tbody data-testid=\"jkl-datepicker-dates\">\n {calendar.weeks.map((week, weekIndex) => (\n <tr key={`${calendar.month}${calendar.year}${weekIndex}`}>\n {week.map((dateInfo, index) => {\n const key = `${calendar.month}${calendar.year}${weekIndex}${index}`;\n if (typeof dateInfo === \"string\") {\n return (\n <td className=\"jkl-calendar__date jkl-calendar__date--empty\" key={key}>\n {dateInfo}\n </td>\n );\n }\n const { date, selectable, today, prevMonth, nextMonth } = dateInfo;\n\n return (\n <td key={key}>\n <button\n {...getDateProps({\n dateObj: dateInfo,\n })}\n type=\"button\"\n className=\"jkl-calendar-date-button\"\n tabIndex={isFocusableDate(dateInfo) ? 0 : -1}\n aria-label={`${date.getDate()}. ${months[\n date.getMonth()\n ].toLowerCase()}`}\n aria-current={today ? \"date\" : undefined}\n data-adjacent={prevMonth || nextMonth ? \"true\" : undefined}\n disabled={!selectable}\n onKeyDown={handleArrowNavigation}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n ))}\n </div>\n </div>\n );\n});\n\nCalendar.displayName = \"Calendar\";\n"],"names":["defaultMonths","defaultDays","Calendar","forwardRef","props","ref","date","defaultSelected","density","minDate","maxDate","days","months","monthLabel","yearLabel","yearsToShow","DEFAULT_YEARS_TO_SHOW","onTabOutside","rest","id","useId","offset","selectedDate","shownDate","dispatch","useReducer","calendarReducer","getInitialDateShown","calendarInitializer","shownMonth","getMonth","shownYear","getFullYear","useEffect","type","newDate","onOffsetChanged","useCallback","newOffset","calendars","getBackProps","getDateProps","getForwardProps","handleOffsetChanged","useCalendar","selected","firstDayOfWeek","calendarPaddingRef","useRef","doFocusChange","offsetDiff","current","e","document","activeElement","buttons","querySelectorAll","changeFocusTo","async","nextButton","setAttribute","focus","forEach","el","i","newNodeKey","length","isBackDisabled","flushSync","subtractMonth","newButtons","isForwardDisabled","addMonth","handleArrowNavigation","event","key","preventDefault","handleTabInside","focusableElements","_a","firstElement","lastElement","shiftKey","isFocusableDate","dateInfo","selectable","prevMonth","nextMonth","toString","getDate","handleGotoEdgeMonth","handleYearChange","target","value","year","Number","parseInt","isNaN","expectedDate","Date","addedOffset","handleMonthChange","yearDiff","monthDiff","yearSelectOptions","getYearSelectOptions","monthSelectOptions","getMonthSelectOptions","jsx","className","children","jsxs","onKeyDown","onClick","ArrowLeftIcon","variant","bold","ArrowRightIcon","onChange","map","label","ChevronDownIcon","calendar","month","weekday","weeks","week","weekIndex","index","today","dateObj","tabIndex","toLowerCase","disabled","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e}from"react/jsx-runtime";import{useMergeRefs as n,FloatingPortal as t,FloatingFocusManager as o,useFloating as s,offset as
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{useMergeRefs as n,FloatingPortal as t,FloatingFocusManager as o,useFloating as s,offset as r,flip as a,shift as i,autoUpdate as l,useClick as c,useHover as u,useFocus as d,useDismiss as p,useRole as f,useInteractions as m}from"@floating-ui/react";import{c as g}from"../../../clsx-BeLtu-UY.js";import*as h from"react";import{getThemeAndDensity as v}from"./utils.js";const x=h.createContext(null),F=()=>{const e=h.useContext(x);if(null==e)throw new Error("Popover komponenter må brukes innenfor en <Popover /> komponent");return e},k=({children:n,...t})=>{const o=(({open:e,onOpenChange:n,placement:t="bottom-start",strategy:o="absolute",modal:g=!0,offset:v=4,positionReference:x,hoverOptions:F,focusOptions:k,clickOptions:y,roleOptions:C,dismissOptions:b})=>{const[O,P]=h.useState(e),R=e??O,j=n??P,E=s({open:R,onOpenChange:j,placement:t,strategy:o,middleware:[r(v),a({padding:5,fallbackPlacements:["bottom","top"]}),i({padding:12})],whileElementsMounted:l}),w=E.context,M=c(w,{enabled:!1,...y}),D=u(w,{enabled:!1,...F}),N=d(w,{enabled:!1,...k}),S=p(w,b),T=f(w,C),A=m([M,S,N,D,T]);return h.useLayoutEffect((()=>{x&&E.refs.setPositionReference(null==x?void 0:x.current)}),[x,E.refs]),h.useMemo((()=>({open:R,onOpenChange:j,modal:g,...A,...E})),[R,j,g,A,E])})({...t});return e(x.Provider,{value:o,children:n})},y=h.forwardRef((function({children:t,asChild:o=!1,...s},r){const{refs:a,getReferenceProps:i,open:l,onOpenChange:c}=F(),u=t.ref,d=n([a.setReference,r,u]);return o&&h.isValidElement(t)?h.cloneElement(t,i({ref:d,...s,...t.props})):e("button",{ref:d,onClick:()=>null==c?void 0:c(!l),"aria-expanded":l,...i(s),children:t})})),C=h.forwardRef((function({style:s,className:r,padding:a=0,initialFocus:i=0,returnFocus:l=!0,...c},u){const{context:d,modal:p,refs:f,open:m,floatingStyles:h,getFloatingProps:x}=F(),k=n([f.setFloating,u]),y=f.reference.current,{theme:C,density:b}=v((O=y)&&"contextElement"in O?y.contextElement:y);var O;return m?e(t,{children:e(o,{context:d,modal:p,initialFocus:i,returnFocus:l,children:e("div",{"data-theme":C,"data-layout-density":b,className:g("jkl jkl-popover",r),ref:k,style:{...s,...h,"--popover-padding":`var(--jkl-spacing-${a})`},...x(c),children:c.children})})}):null}));k.Trigger=y,k.Content=C;export{k as default};
|
|
2
2
|
//# sourceMappingURL=Popover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.js","sources":["../../../../src/components/popover/Popover.tsx"],"sourcesContent":["import {\n useFloating,\n useFocus,\n useHover,\n useClick,\n useDismiss,\n autoUpdate,\n useRole,\n useMergeRefs,\n offset,\n flip,\n shift,\n useInteractions,\n FloatingPortal,\n FloatingFocusManager,\n UseFloatingOptions,\n} from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport { getThemeAndDensity } from \"./utils\";\n\ntype ClickOptions = Parameters<typeof useClick>[1];\ntype DismissOptions = Parameters<typeof useDismiss>[1];\ntype FocusOptions = Parameters<typeof useFocus>[1];\ntype HoverOptions = Parameters<typeof useHover>[1];\ntype RoleOptions = Parameters<typeof useRole>[1];\n\ninterface PopoverOptions {\n /**\n * Angir om popoveren er åpen eller lukket.\n * @see https://floating-ui.com/docs/useFloating#open\n */\n open?: boolean;\n /**\n * Callback som trigges når popoveren åpnes eller lukkes.\n * @see https://floating-ui.com/docs/useFloating#onOpenChange\n */\n onOpenChange?: UseFloatingOptions[\"onOpenChange\"];\n /**\n * Bestemmer plasseringen av popoveren.\n * @default \"bottom-start\"\n * @see https://floating-ui.com/docs/useFloating#placement\n */\n placement?: UseFloatingOptions[\"placement\"];\n /**\n * Definerer strategien for posisjonering av popoveren.\n * @default \"absolute\"\n * @see https://floating-ui.com/docs/useFloating#strategy\n */\n strategy?: UseFloatingOptions[\"strategy\"];\n /**\n * Angir om popoveren skal fungere som en modal, der fokus er låst til det flytende elementet\n * og innhold utenfor ikke kan interageres med.\n * @default true\n * @see https://floating-ui.com/docs/useFloating#modal\n */\n modal?: boolean;\n /**\n * Offset til det flytende elementet.\n * @see https://floating-ui.com/docs/offset\n * @default 4\n * */\n /**\n * Justerer avstanden mellom referanse-elementet og popoveren.\n * @see https://floating-ui.com/docs/offset\n * @default 4\n */\n offset?: number;\n /**\n * Options for hover-interaksjoner.\n * @see https://floating-ui.com/docs/useHover\n * @default { enabled: false }\n */\n hoverOptions?: HoverOptions;\n /**\n * Options for fokus-interaksjoner.\n * @see https://floating-ui.com/docs/useFocus\n * @default { enabled: false }\n */\n focusOptions?: FocusOptions;\n /**\n * Options for klikk-interaksjoner.\n * @see https://floating-ui.com/docs/useClick\n * @default { enabled: false }\n */\n clickOptions?: ClickOptions;\n /**\n * Konfigurerer rollen for popoveren.\n * @see https://floating-ui.com/docs/useRole\n * @default { enabled: true, role: \"dialog\" }\n */\n roleOptions?: RoleOptions;\n /**\n * Options for å lukke popoveren når en dismissal skjer,\n * som ved å klikke utenfor eller trykke på \"Escape\"-tasten.\n * @see https://floating-ui.com/docs/useDismiss\n * @default { enabled: true }\n */\n dismissOptions?: DismissOptions;\n}\n\nconst usePopover = ({\n open: _open,\n onOpenChange: _onOpenChange,\n placement = \"bottom-start\",\n strategy = \"absolute\",\n modal = true,\n offset: _offset = 4,\n hoverOptions,\n focusOptions,\n clickOptions,\n roleOptions,\n dismissOptions,\n}: PopoverOptions) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(_open);\n\n const open = _open ?? uncontrolledOpen;\n const onOpenChange = _onOpenChange ?? setUncontrolledOpen;\n\n const data = useFloating({\n open,\n onOpenChange,\n placement,\n strategy,\n middleware: [\n offset(_offset),\n flip({ padding: 5, fallbackPlacements: [\"bottom\", \"top\"] }),\n shift({ padding: 12 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const context = data.context;\n\n const click = useClick(context, {\n enabled: false,\n ...clickOptions,\n });\n const hover = useHover(context, { enabled: false, ...hoverOptions });\n const focus = useFocus(context, { enabled: false, ...focusOptions });\n const dismiss = useDismiss(context, dismissOptions);\n const role = useRole(context, roleOptions);\n\n const interactions = useInteractions([click, dismiss, focus, hover, role]);\n\n return React.useMemo(\n () => ({\n open,\n onOpenChange,\n modal,\n ...interactions,\n ...data,\n }),\n [open, onOpenChange, modal, interactions, data],\n );\n};\n\ntype PopoverContextType = ReturnType<typeof usePopover> | null;\n\nconst PopoverContext = React.createContext<PopoverContextType>(null);\n\nconst usePopoverContext = () => {\n const context = React.useContext(PopoverContext);\n\n if (context == null) {\n throw new Error(\"Popover komponenter må brukes innenfor en <Popover /> komponent\");\n }\n\n return context;\n};\n\nconst Popover = ({\n children,\n ...restOptions\n}: {\n children: React.ReactNode;\n} & PopoverOptions) => {\n const popover = usePopover({ ...restOptions });\n return <PopoverContext.Provider value={popover}>{children}</PopoverContext.Provider>;\n};\n\ninterface PopoverTriggerProps {\n children: React.ReactNode;\n /**\n * Rendrer komponenten som child-elementet sitt, og slår\n * sammen egenskaper og props.\n * @example\n * ```tsx\n * <Component asChild foo=\"bar\">\n * <Child baz=\"qux\" />\n * </Component>\n *\n * // Rendrer følgende:\n * <Child foo=\"bar\" baz=\"qux\" />\n * ```\n *\n * @default false\n */\n asChild?: boolean;\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLElement, React.HTMLProps<HTMLElement> & PopoverTriggerProps>(\n function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const { refs, getReferenceProps, open, onOpenChange } = usePopoverContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([refs.setReference, propRef, childrenRef]);\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n ...props,\n ...children.props,\n }),\n );\n }\n\n return (\n <button ref={ref} onClick={() => onOpenChange?.(!open)} aria-expanded={open} {...getReferenceProps(props)}>\n {children}\n </button>\n );\n },\n);\n\ninterface PopoverContentProps {\n /**\n * Padding rundt innholdet i popoveren.\n * @default 0\n */\n padding?: 0 | 8 | 16 | 24;\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement> & PopoverContentProps>(\n function PopoverContent({ style, className, padding, ...props }, propRef) {\n const { context, modal, refs, open, floatingStyles, getFloatingProps } = usePopoverContext();\n const ref = useMergeRefs([refs.setFloating, propRef]);\n\n const { theme, density } = getThemeAndDensity(refs.reference.current as HTMLElement);\n\n if (!open) return null;\n\n return (\n <FloatingPortal>\n <FloatingFocusManager context={context} modal={modal}>\n <div\n data-theme={theme}\n data-layout-density={density}\n className={clsx(\"jkl jkl-popover\", className)}\n ref={ref}\n style={\n {\n ...style,\n ...floatingStyles,\n \"--popover-padding\": `var(--jkl-spacing-${padding})`,\n } as React.CSSProperties\n }\n {...getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n );\n },\n);\n\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n\nexport default Popover;\n"],"names":["PopoverContext","React","createContext","usePopoverContext","context","useContext","Error","Popover","children","restOptions","popover","open","_open","onOpenChange","_onOpenChange","placement","strategy","modal","offset","_offset","hoverOptions","focusOptions","clickOptions","roleOptions","dismissOptions","uncontrolledOpen","setUncontrolledOpen","useState","data","useFloating","middleware","flip","padding","fallbackPlacements","shift","whileElementsMounted","autoUpdate","click","useClick","enabled","hover","useHover","focus","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","useMemo","usePopover","Provider","value","PopoverTrigger","forwardRef","asChild","props","propRef","refs","getReferenceProps","childrenRef","ref","useMergeRefs","setReference","isValidElement","cloneElement","jsx","onClick","PopoverContent","style","className","floatingStyles","getFloatingProps","setFloating","theme","density","getThemeAndDensity","reference","current","FloatingPortal","FloatingFocusManager","clsx","Trigger","Content"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../../src/components/popover/Popover.tsx"],"sourcesContent":["import {\n useFloating,\n useFocus,\n useHover,\n useClick,\n useDismiss,\n autoUpdate,\n useRole,\n useMergeRefs,\n offset,\n flip,\n shift,\n useInteractions,\n FloatingPortal,\n FloatingFocusManager,\n UseFloatingOptions,\n VirtualElement,\n ReferenceElement,\n ReferenceType,\n} from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport { getThemeAndDensity } from \"./utils\";\n\ntype ClickOptions = Parameters<typeof useClick>[1];\ntype DismissOptions = Parameters<typeof useDismiss>[1];\ntype FocusOptions = Parameters<typeof useFocus>[1];\ntype HoverOptions = Parameters<typeof useHover>[1];\ntype RoleOptions = Parameters<typeof useRole>[1];\n\ninterface PopoverOptions {\n /**\n * Angir om popoveren er åpen eller lukket.\n *\n * @see https://floating-ui.com/docs/usefloating#open\n */\n open?: boolean;\n /**\n * Callback som trigges når popoveren åpnes eller lukkes.\n *\n * @see https://floating-ui.com/docs/usefloating#onopenchange\n */\n onOpenChange?: UseFloatingOptions[\"onOpenChange\"];\n /**\n * Bestemmer plasseringen av popoveren.\n *\n * @see https://floating-ui.com/docs/usefloating#placement\n *\n * @default \"bottom-start\"\n */\n placement?: UseFloatingOptions[\"placement\"];\n /**\n * Definerer strategien for posisjonering av popoveren.\n *\n * @see https://floating-ui.com/docs/usefloating#strategy\n *\n * @default \"absolute\"\n */\n strategy?: UseFloatingOptions[\"strategy\"];\n /**\n * Angir om popoveren skal fungere som en modal, der fokus er låst til det flytende elementet\n * og innhold utenfor ikke kan interageres med.\n *\n * @see https://floating-ui.com/docs/usefloating#modal\n *\n * @default true\n */\n modal?: boolean;\n /**\n * Justerer avstanden mellom referanse-elementet og popoveren.\n *\n * @see https://floating-ui.com/docs/offset\n *\n * @default 4\n */\n offset?: number;\n /**\n * Referanse til elementet som popoveren skal posisjoneres i forhold til.\n *\n * @see https://floating-ui.com/docs/usefloating#setpositionreference\n *\n * @default Popover.Trigger\n */\n positionReference?: React.RefObject<ReferenceType>;\n /**\n * Options for hover-interaksjoner.\n *\n * @see https://floating-ui.com/docs/usehover\n *\n * @default { enabled: false }\n */\n hoverOptions?: HoverOptions;\n /**\n * Options for fokus-interaksjoner.\n *\n * @see https://floating-ui.com/docs/usefocus\n *\n * @default { enabled: false }\n */\n focusOptions?: FocusOptions;\n /**\n * Options for klikk-interaksjoner.\n *\n * @see https://floating-ui.com/docs/useclick\n *\n * @default { enabled: false }\n */\n clickOptions?: ClickOptions;\n /**\n * Konfigurerer rollen for popoveren.\n *\n * @see https://floating-ui.com/docs/userole\n *\n * @default { enabled: true, role: \"dialog\" }\n */\n roleOptions?: RoleOptions;\n /**\n * Options for å lukke popoveren når en dismissal skjer,\n * som ved å klikke utenfor eller trykke på \"Escape\"-tasten.\n *\n * @see https://floating-ui.com/docs/usedismiss\n *\n * @default { enabled: true }\n */\n dismissOptions?: DismissOptions;\n}\n\nconst usePopover = ({\n open: _open,\n onOpenChange: _onOpenChange,\n placement = \"bottom-start\",\n strategy = \"absolute\",\n modal = true,\n offset: _offset = 4,\n positionReference,\n hoverOptions,\n focusOptions,\n clickOptions,\n roleOptions,\n dismissOptions,\n}: PopoverOptions) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(_open);\n\n const open = _open ?? uncontrolledOpen;\n const onOpenChange = _onOpenChange ?? setUncontrolledOpen;\n\n const data = useFloating({\n open,\n onOpenChange,\n placement,\n strategy,\n middleware: [\n offset(_offset),\n flip({ padding: 5, fallbackPlacements: [\"bottom\", \"top\"] }),\n shift({ padding: 12 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const context = data.context;\n\n const click = useClick(context, {\n enabled: false,\n ...clickOptions,\n });\n const hover = useHover(context, { enabled: false, ...hoverOptions });\n const focus = useFocus(context, { enabled: false, ...focusOptions });\n const dismiss = useDismiss(context, dismissOptions);\n const role = useRole(context, roleOptions);\n\n const interactions = useInteractions([click, dismiss, focus, hover, role]);\n\n React.useLayoutEffect(() => {\n if (positionReference) {\n data.refs.setPositionReference(positionReference?.current);\n }\n }, [positionReference, data.refs]);\n\n return React.useMemo(\n () => ({\n open,\n onOpenChange,\n modal,\n ...interactions,\n ...data,\n }),\n [open, onOpenChange, modal, interactions, data],\n );\n};\n\ntype PopoverContextType = ReturnType<typeof usePopover> | null;\n\nconst PopoverContext = React.createContext<PopoverContextType>(null);\n\nconst usePopoverContext = () => {\n const context = React.useContext(PopoverContext);\n\n if (context == null) {\n throw new Error(\"Popover komponenter må brukes innenfor en <Popover /> komponent\");\n }\n\n return context;\n};\n\nconst Popover = ({\n children,\n ...restOptions\n}: {\n children: React.ReactNode;\n} & PopoverOptions) => {\n const popover = usePopover({ ...restOptions });\n return <PopoverContext.Provider value={popover}>{children}</PopoverContext.Provider>;\n};\n\ninterface PopoverTriggerProps {\n children: React.ReactNode;\n /**\n * Rendrer komponenten som child-elementet sitt, og slår sammen egenskaper og props.\n *\n * Default er `false`.\n *\n * @example\n * ```tsx\n * <Component asChild foo=\"bar\">\n * <Child baz=\"qux\" />\n * </Component>\n *\n * // Rendrer følgende:\n * <Child foo=\"bar\" baz=\"qux\" />\n * ```\n */\n asChild?: boolean;\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLElement, React.HTMLProps<HTMLElement> & PopoverTriggerProps>(\n function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const { refs, getReferenceProps, open, onOpenChange } = usePopoverContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([refs.setReference, propRef, childrenRef]);\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n ...props,\n ...children.props,\n }),\n );\n }\n\n return (\n <button ref={ref} onClick={() => onOpenChange?.(!open)} aria-expanded={open} {...getReferenceProps(props)}>\n {children}\n </button>\n );\n },\n);\n\ninterface PopoverContentProps {\n /**\n * Padding rundt innholdet i popoveren.\n *\n * Default er `0`.\n */\n padding?: 0 | 8 | 16 | 24;\n /**\n *\n * Angir hvilket element som skal motta fokus ved åpning.\n * Kan være en tabbar index eller en referanse til et element.\"\n *\n * Default er `0`, som betyr at det første fokuserbare elementet i popoveren får fokus.\n * @see https://floating-ui.com/docs/FloatingFocusManager#initialfocus\n */\n initialFocus?: number | React.RefObject<HTMLElement>;\n /**\n * Angir om fokus skal returneres til triggeren når popoveren lukkes.\n *\n * Default er `true`.\n * @see https://floating-ui.com/docs/FloatingFocusManager#returnfocus\n */\n returnFocus?: boolean;\n}\n\n// Er popover-elementet posisjonert i forhold til et annet element enn triggeren?\nconst isCustomPositioned = (referenceElement: ReferenceElement): referenceElement is VirtualElement => {\n if (!referenceElement) return false;\n\n return \"contextElement\" in referenceElement;\n};\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement> & PopoverContentProps>(\n function PopoverContent(\n { style, className, padding = 0, initialFocus = 0, returnFocus = true, ...props },\n propRef,\n ) {\n const { context, modal, refs, open, floatingStyles, getFloatingProps } = usePopoverContext();\n const ref = useMergeRefs([refs.setFloating, propRef]);\n\n const referenceElement = refs.reference.current as ReferenceElement;\n\n const { theme, density } = isCustomPositioned(referenceElement)\n ? getThemeAndDensity(referenceElement.contextElement)\n : getThemeAndDensity(referenceElement);\n\n if (!open) return null;\n\n return (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={modal}\n initialFocus={initialFocus}\n returnFocus={returnFocus}\n >\n <div\n data-theme={theme}\n data-layout-density={density}\n className={clsx(\"jkl jkl-popover\", className)}\n ref={ref}\n style={\n {\n ...style,\n ...floatingStyles,\n \"--popover-padding\": `var(--jkl-spacing-${padding})`,\n } as React.CSSProperties\n }\n {...getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n );\n },\n);\n\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n\nexport default Popover;\n"],"names":["PopoverContext","React","createContext","usePopoverContext","context","useContext","Error","Popover","children","restOptions","popover","open","_open","onOpenChange","_onOpenChange","placement","strategy","modal","offset","_offset","positionReference","hoverOptions","focusOptions","clickOptions","roleOptions","dismissOptions","uncontrolledOpen","setUncontrolledOpen","useState","data","useFloating","middleware","flip","padding","fallbackPlacements","shift","whileElementsMounted","autoUpdate","click","useClick","enabled","hover","useHover","focus","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","useLayoutEffect","refs","setPositionReference","current","useMemo","usePopover","Provider","value","PopoverTrigger","forwardRef","asChild","props","propRef","getReferenceProps","childrenRef","ref","useMergeRefs","setReference","isValidElement","cloneElement","jsx","onClick","PopoverContent","style","className","initialFocus","returnFocus","floatingStyles","getFloatingProps","setFloating","referenceElement","reference","theme","density","getThemeAndDensity","contextElement","FloatingPortal","FloatingFocusManager","clsx","Trigger","Content"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/components/popover/utils.ts"],"sourcesContent":["export const getThemeAndDensity = (element:
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/popover/utils.ts"],"sourcesContent":["export const getThemeAndDensity = (element: Element | undefined): { theme?: string; density?: string } => {\n if (!element) return {};\n\n const computedStyles = getComputedStyle(element);\n\n const theme =\n parseInt(computedStyles.getPropertyValue(\"--jkl-background-color\").replace(\"#\", \"\"), 16) < 0xffffff / 2\n ? \"dark\"\n : \"light\";\n\n const density = computedStyles.getPropertyValue(\"--jkl-density\") === '\"compact\"' ? \"compact\" : \"comfortable\";\n\n return { theme, density };\n};\n"],"names":["getThemeAndDensity","element","computedStyles","getComputedStyle","theme","parseInt","getPropertyValue","replace","density"],"mappings":"AAAa,MAAAA,EAAsBC,IAC3B,IAACA,EAAS,MAAO,GAEfC,MAAAA,EAAiBC,iBAAiBF,GASjC,MAAA,CAAEG,MANLC,SAASH,EAAeI,iBAAiB,0BAA0BC,QAAQ,IAAK,IAAK,IAAM,UACrF,OACA,QAIMC,QAFqD,cAArDN,EAAeI,iBAAiB,iBAAmC,UAAY"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as t,jsx as n}from"react/jsx-runtime";import{c as i}from"../../../clsx-BeLtu-UY.js";import{forwardRef as a}from"react";import{IconButton as e}from"../icon-button/IconButton.js";function
|
|
1
|
+
import{jsxs as t,jsx as n}from"react/jsx-runtime";import{c as i}from"../../../clsx-BeLtu-UY.js";import{forwardRef as a}from"react";import{IconButton as e}from"../icon-button/IconButton.js";function o(t,n){return t?{width:t}:n?{width:`calc(${Math.min(n,40)}ch + 24px)`}:void 0}const s=a(((a,s)=>{const{action:l,align:r="left","aria-invalid":c,className:u="",density:p,maxLength:m,style:d,type:x="text",unit:h,width:f,actionButton:j,...y}=a;return t("div",{className:"jkl-text-input-wrapper","data-invalid":c,style:{...d,...o(f,m)},children:[n("input",{"aria-invalid":c,ref:s,className:i("jkl-text-input__input",u,{"jkl-text-input__input--align-right":"right"===r}),maxLength:m,type:x,...y}),h&&n("span",{className:"jkl-text-input__unit",children:h}),!l&&j&&j,l&&!j&&n(e,{density:p,className:i("jkl-text-input-action-button",l.className),title:l.label,onClick:l.onClick,onFocus:l.onFocus,onBlur:l.onBlur,ref:l.buttonRef,type:l.type||"button",children:l.icon})]})}));s.displayName="BaseInputField";export{s as BaseTextInput};
|
|
2
2
|
//# sourceMappingURL=BaseTextInput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseTextInput.js","sources":["../../../../src/components/text-input/BaseTextInput.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type CSSProperties,\n forwardRef,\n type MouseEventHandler,\n type ReactNode,\n InputHTMLAttributes,\n HTMLProps,\n} from \"react\";\nimport { Density } from \"../../core\";\nimport { IconProps } from \"../icon\";\nimport { IconButton } from \"../icon-button\";\n\nfunction getWidthAsStyle(width?: string, maxLength?: number): CSSProperties | undefined {\n if (width) {\n return { width }; // prioritize width prop\n }\n\n if (maxLength) {\n // adapt to maxLength, but capped at 40ch\n const length = `${Math.min(maxLength, 40)}ch`;\n const padding = \"24px\"; // left + right padding\n return { width: `calc(${length} + ${padding})` };\n }\n\n return undefined;\n}\n\ninterface ActionBaseProps extends Exclude<HTMLProps<HTMLButtonElement>, \"disabled\"> {\n icon: React.ReactElement<IconProps>;\n label: string;\n buttonRef?: React.Ref<HTMLButtonElement>;\n}\n\nexport interface ActionButton extends ActionBaseProps {\n type?: \"button\" | \"reset\";\n onClick: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport interface ActionSubmit extends ActionBaseProps {\n type: \"submit\";\n onClick?: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport type Action = ActionButton | ActionSubmit;\n\nexport interface BaseTextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"children\"> {\n /**\n * Brukes til inputfelter hvor det brukes maskering, for formatering av store tall. Brukes typisk bare til valuta.\n * @default \"left\"\n */\n align?: \"left\" | \"right\";\n action?: Action;\n density?: Density;\n /**\n * Benevnelse for feltet. Unngå å bruke både benevnelse og handling samtidig\n * @example \"kr\"\n * */\n unit?: ReactNode;\n width?: string;\n}\n\nexport const BaseTextInput = forwardRef<HTMLInputElement, BaseTextInputProps>((props, ref) => {\n const {\n action,\n align = \"left\",\n \"aria-invalid\": ariaInvalid,\n className = \"\",\n density,\n maxLength,\n style,\n type = \"text\",\n unit,\n width,\n ...rest\n } = props;\n\n return (\n <div\n className=\"jkl-text-input-wrapper\"\n data-invalid={ariaInvalid}\n style={{ ...style, ...getWidthAsStyle(width, maxLength) }}\n >\n <input\n aria-invalid={ariaInvalid}\n ref={ref}\n className={clsx(\"jkl-text-input__input\", className, {\n \"jkl-text-input__input--align-right\": align === \"right\",\n })}\n maxLength={maxLength}\n type={type}\n {...rest}\n />\n {unit && <span className=\"jkl-text-input__unit\">{unit}</span>}\n {action && (\n <IconButton\n density={density}\n className={clsx(\"jkl-text-input-action-button\", action.className)}\n title={action.label}\n onClick={action.onClick}\n onFocus={action.onFocus}\n onBlur={action.onBlur}\n ref={action.buttonRef}\n type={action.type || \"button\"}\n >\n {action.icon}\n </IconButton>\n )}\n </div>\n );\n});\n\nBaseTextInput.displayName = \"BaseInputField\";\n"],"names":["getWidthAsStyle","width","maxLength","Math","min","BaseTextInput","forwardRef","props","ref","action","align","ariaInvalid","className","density","style","type","unit","rest","jsxs","children","jsx","clsx","IconButton","title","label","onClick","onFocus","onBlur","buttonRef","icon","displayName"],"mappings":"6LAaA,SAASA,EAAgBC,EAAgBC,GACjCD,OAAAA,EACO,CAAEA,MAAAA,GAGTC,EAIO,CAAED,MAAO,QAFEE,KAAKC,IAAIF,EAAW,sBAFtCA,CAQR,
|
|
1
|
+
{"version":3,"file":"BaseTextInput.js","sources":["../../../../src/components/text-input/BaseTextInput.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type CSSProperties,\n forwardRef,\n type MouseEventHandler,\n type ReactNode,\n InputHTMLAttributes,\n HTMLProps,\n} from \"react\";\nimport { Density } from \"../../core\";\nimport { IconProps } from \"../icon\";\nimport { IconButton } from \"../icon-button\";\n\nfunction getWidthAsStyle(width?: string, maxLength?: number): CSSProperties | undefined {\n if (width) {\n return { width }; // prioritize width prop\n }\n\n if (maxLength) {\n // adapt to maxLength, but capped at 40ch\n const length = `${Math.min(maxLength, 40)}ch`;\n const padding = \"24px\"; // left + right padding\n return { width: `calc(${length} + ${padding})` };\n }\n\n return undefined;\n}\n\ninterface ActionBaseProps extends Exclude<HTMLProps<HTMLButtonElement>, \"disabled\"> {\n icon: React.ReactElement<IconProps>;\n label: string;\n buttonRef?: React.Ref<HTMLButtonElement>;\n}\n\nexport interface ActionButton extends ActionBaseProps {\n type?: \"button\" | \"reset\";\n onClick: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport interface ActionSubmit extends ActionBaseProps {\n type: \"submit\";\n onClick?: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport type Action = ActionButton | ActionSubmit;\n\nexport interface BaseTextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"children\"> {\n /**\n * Brukes til inputfelter hvor det brukes maskering, for formatering av store tall. Brukes typisk bare til valuta.\n * @default \"left\"\n */\n align?: \"left\" | \"right\";\n /**\n * @deprecated Bruk heller actionButton\n *\n */\n action?: Action;\n density?: Density;\n /**\n * Benevnelse for feltet. Unngå å bruke både benevnelse og handling samtidig\n * @example \"kr\"\n * */\n unit?: ReactNode;\n width?: string;\n /**\n * Element som vises til høyre for inputfeltet. Brukes typisk til å trigge en handling som f.eks. å vise/skjule passord.\n */\n actionButton?: React.ReactElement<IconProps>;\n}\n\nexport const BaseTextInput = forwardRef<HTMLInputElement, BaseTextInputProps>((props, ref) => {\n const {\n action,\n align = \"left\",\n \"aria-invalid\": ariaInvalid,\n className = \"\",\n density,\n maxLength,\n style,\n type = \"text\",\n unit,\n width,\n actionButton,\n ...rest\n } = props;\n\n return (\n <div\n className=\"jkl-text-input-wrapper\"\n data-invalid={ariaInvalid}\n style={{ ...style, ...getWidthAsStyle(width, maxLength) }}\n >\n <input\n aria-invalid={ariaInvalid}\n ref={ref}\n className={clsx(\"jkl-text-input__input\", className, {\n \"jkl-text-input__input--align-right\": align === \"right\",\n })}\n maxLength={maxLength}\n type={type}\n {...rest}\n />\n {unit && <span className=\"jkl-text-input__unit\">{unit}</span>}\n {!action && actionButton && actionButton}\n {action && !actionButton && (\n <IconButton\n density={density}\n className={clsx(\"jkl-text-input-action-button\", action.className)}\n title={action.label}\n onClick={action.onClick}\n onFocus={action.onFocus}\n onBlur={action.onBlur}\n ref={action.buttonRef}\n type={action.type || \"button\"}\n >\n {action.icon}\n </IconButton>\n )}\n </div>\n );\n});\n\nBaseTextInput.displayName = \"BaseInputField\";\n"],"names":["getWidthAsStyle","width","maxLength","Math","min","BaseTextInput","forwardRef","props","ref","action","align","ariaInvalid","className","density","style","type","unit","actionButton","rest","jsxs","children","jsx","clsx","IconButton","title","label","onClick","onFocus","onBlur","buttonRef","icon","displayName"],"mappings":"6LAaA,SAASA,EAAgBC,EAAgBC,GACjCD,OAAAA,EACO,CAAEA,MAAAA,GAGTC,EAIO,CAAED,MAAO,QAFEE,KAAKC,IAAIF,EAAW,sBAFtCA,CAQR,CA4CO,MAAMG,EAAgBC,GAAiD,CAACC,EAAOC,KAC5E,MACFC,OAAAA,EACAC,MAAAA,EAAQ,OACR,eAAgBC,EAChBC,UAAAA,EAAY,GACZC,QAAAA,EACAX,UAAAA,EACAY,MAAAA,EACAC,KAAAA,EAAO,OACPC,KAAAA,EACAf,MAAAA,EACAgB,aAAAA,KACGC,GACHX,EAGA,OAAAY,EAAC,MAAA,CACGP,UAAU,yBACV,eAAcD,EACdG,MAAO,IAAKA,KAAUd,EAAgBC,EAAOC,IAE7CkB,SAAA,CAAAC,EAAC,QAAA,CACG,eAAcV,EACdH,IAAAA,EACAI,UAAWU,EAAK,wBAAyBV,EAAW,CAChD,qCAAgD,UAAVF,IAE1CR,UAAAA,EACAa,KAAAA,KACIG,IAEPF,GAAQK,EAAC,OAAK,CAAAT,UAAU,uBAAwBQ,SAAKJ,KACpDP,GAAUQ,GAAgBA,EAC3BR,IAAWQ,GACRI,EAACE,EAAA,CACGV,QAAAA,EACAD,UAAWU,EAAK,+BAAgCb,EAAOG,WACvDY,MAAOf,EAAOgB,MACdC,QAASjB,EAAOiB,QAChBC,QAASlB,EAAOkB,QAChBC,OAAQnB,EAAOmB,OACfpB,IAAKC,EAAOoB,UACZd,KAAMN,EAAOM,MAAQ,SAEpBK,SAAOX,EAAAqB,SACZ,IAMhBzB,EAAc0B,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{f as o,u as t,I as n}from"../../../../formatCode-BE8lQWf_.js";import"react";import"../ToggleSwitch.js";import"../../../hooks/useScreen/useScreen.js";import"../../../hooks/useId/useId.js";import"../../button/Button.js";const s=[{type:"bool",label:"Deaktivert",boolOptions:{trueValue:!0,falseValue:!1}}],r=o('import React from "react";\nimport { ToggleSwitch } from "..";\nimport { PrimaryButton } from "../../button";\n\nexport const knobs = [\n {\n type: "bool",\n label: "Deaktivert",\n boolOptions: {\n trueValue: true,\n falseValue: false,\n },\n },\n];\n\nexport const ToggleSwitchExample = () => {\n /* -- EXAMPLE CODE START -- */\n const isDisabled = boolKnob("Deaktivert");\n\n const handleToggle = (event, pressed) => console.log("Mørk modus satt til: ", pressed, event);\n\n return (\n <ToggleSwitch disabled={isDisabled} onChange={handleToggle}>\n Mørk modus\n </ToggleSwitch>\n );\n /* -- EXAMPLE CODE END -- */\n};\n');function l(){const o=t(r,s);return e("div",{className:"jkl",children:e(n,{title:"Loader",defaultCode:r,defaultShowEditor:!0,noInline:!0,controls:o})})}export{l as default};
|
|
2
|
+
//# sourceMappingURL=Example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Example.js","sources":["../../../../../src/components/toggle-switch/documentation/ToggleSwitchExample.jsx","../../../../../src/components/toggle-switch/documentation/Example.tsx","../../../../../src/components/toggle-switch/documentation/ToggleSwitchExample.jsx?raw"],"sourcesContent":["import React from \"react\";\nimport { ToggleSwitch } from \"..\";\nimport { PrimaryButton } from \"../../button\";\n\nexport const knobs = [\n {\n type: \"bool\",\n label: \"Deaktivert\",\n boolOptions: {\n trueValue: true,\n falseValue: false,\n },\n },\n];\n\nexport const ToggleSwitchExample = () => {\n /* -- EXAMPLE CODE START -- */\n const isDisabled = boolKnob(\"Deaktivert\");\n\n const handleToggle = (event, pressed) => console.log(\"Mørk modus satt til: \", pressed, event);\n\n return (\n <ToggleSwitch disabled={isDisabled} onChange={handleToggle}>\n Mørk modus\n </ToggleSwitch>\n );\n /* -- EXAMPLE CODE END -- */\n};\n","import React from \"react\";\nimport { formatCode, InteractiveCode, useInteractiveCodeControls } from \"../../../../../../utils/interactive-code\";\n// @ts-ignore\nimport { knobs } from \"./ToggleSwitchExample\";\n// @ts-ignore\nimport ToggleSwitchExample from \"./ToggleSwitchExample?raw\";\n\nimport \"../styles/toggle-switch.scss\";\n\nconst code = formatCode(ToggleSwitchExample);\n\nexport default function Example() {\n const controls = useInteractiveCodeControls(code, knobs);\n\n return (\n <div className={\"jkl\"}>\n <InteractiveCode\n title={\"Loader\"}\n defaultCode={code}\n defaultShowEditor={true}\n noInline={true}\n controls={controls}\n />\n </div>\n );\n}\n","export default \"import React from \\\"react\\\";\\nimport { ToggleSwitch } from \\\"..\\\";\\nimport { PrimaryButton } from \\\"../../button\\\";\\n\\nexport const knobs = [\\n {\\n type: \\\"bool\\\",\\n label: \\\"Deaktivert\\\",\\n boolOptions: {\\n trueValue: true,\\n falseValue: false,\\n },\\n },\\n];\\n\\nexport const ToggleSwitchExample = () => {\\n /* -- EXAMPLE CODE START -- */\\n const isDisabled = boolKnob(\\\"Deaktivert\\\");\\n\\n const handleToggle = (event, pressed) => console.log(\\\"Mørk modus satt til: \\\", pressed, event);\\n\\n return (\\n <ToggleSwitch disabled={isDisabled} onChange={handleToggle}>\\n Mørk modus\\n </ToggleSwitch>\\n );\\n /* -- EXAMPLE CODE END -- */\\n};\\n\""],"names":["knobs","type","label","boolOptions","trueValue","falseValue","code","formatCode","Example","controls","useInteractiveCodeControls","jsx","className","children","InteractiveCode","title","defaultCode","defaultShowEditor","noInline"],"mappings":"yQAIO,MAAMA,EAAQ,CACjB,CACIC,KAAM,OACNC,MAAO,aACPC,YAAa,CACTC,WAAW,EACXC,YAAY,KCDlBC,EAAOC,ECTE,otBDWf,SAAwBC,IACdC,MAAAA,EAAWC,EAA2BJ,EAAMN,GAG9C,OAAAW,EAAC,MAAI,CAAAC,UAAW,MACZC,SAAAF,EAACG,EAAA,CACGC,MAAO,SACPC,YAAaV,EACbW,mBAAmB,EACnBC,UAAU,EACVT,SAAAA,KAIhB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as o}from"react/jsx-runtime";import t from"react-dom/client";import"react";import"../../../hooks/useScreen/useScreen.js";import"../../../hooks/useId/useId.js";import"../../icon/Icon.js";import"../../icon/icons/animated/ArrowVerticalAnimated.js";import"../../icon/icons/animated/ArrowHorizontalAnimated.js";import"../../icon/icons/animated/PlusRemoveAnimated.js";import"../../icon/icons/ArrowDownIcon.js";import"../../icon/icons/ArrowLeftIcon.js";import"../../icon/icons/ArrowNorthEastIcon.js";import"../../icon/icons/ArrowRightIcon.js";import"../../icon/icons/ArrowUpIcon.js";import"../../icon/icons/CalendarIcon.js";import"../../icon/icons/CheckIcon.js";import"../../icon/icons/ChevronDownIcon.js";import"../../icon/icons/ChevronLeftIcon.js";import"../../icon/icons/ChevronRightIcon.js";import"../../icon/icons/ChevronUpIcon.js";import"../../icon/icons/CloseIcon.js";import"../../icon/icons/CopyIcon.js";import"../../icon/icons/DotsIcon.js";import"../../icon/icons/DragIcon.js";import"../../icon/icons/ErrorIcon.js";import"../../icon/icons/GreenCheckIcon.js";import"../../icon/icons/HamburgerIcon.js";import"../../icon/icons/InfoIcon.js";import"../../icon/icons/LinkIcon.js";import"../../icon/icons/PlusIcon.js";import"../../icon/icons/QuestionIcon.js";import"../../icon/icons/RedCrossIcon.js";import"../../icon/icons/SearchIcon.js";import"../../icon/icons/SuccessIcon.js";import"../../icon/icons/WarningIcon.js";import"../../icon/icons/MinusIcon.js";import"../../icon/icons/ThumbDownIcon.js";import"../../icon/icons/ThumbUpIcon.js";import"../../icon/icons/TrashCanIcon.js";import"../../icon/icons/PenIcon.js";import"../../button/Button.js";import"../../card/Card.js";import"../../card/CardImage.js";import"../../card/NavCard.js";import"../../checkbox/Checkbox.js";import"../../combobox/Combobox.js";import"../../cookie-consent/CookieConsentContext.js";import"react-dom";import"../../modal/Modal.js";import"react-a11y-dialog";import"../../list/List.js";import"../../list/ListItem.js";import"../../datepicker/DatePicker.js";import"../../feedback/feedbackContext.js";import"../../message/Message.js";import"../../message/FormErrorMessage.js";import"../../tooltip/Tooltip.js";import"../../tooltip/TooltipContent.js";import"../../tooltip/TooltipTrigger.js";import"../../input-group/InputGroup.js";import"../../feedback/followup/followupContext.js";import"../../feedback/main-question/mainQuestionContext.js";import"../../radio-button/RadioButton.js";import"../../radio-button/radioGroupContext.js";import"../../radio-button/BaseRadioButton.js";import"../../text-input/BaseTextArea.js";import"../../text-input/BaseTextInput.js";import"../../text-input/TextArea.js";import"../../text-input/TextInput.js";import"../../../utilities/polymorphism/SlotComponent.js";import{initTabListener as i}from"../../../utilities/tabListener.js";import"../../../../ExpandableTableRow-BJSqC_Jo.js";import"../../icon-button/IconButton.js";import"../../link/Link.js";import"../../link/NavLink.js";import"../../link-list/LinkList.js";import"../../logo/text-paths/ForsikringLevertAvFremtind.js";import"../../logo/text-paths/FraSB1ogDNB.js";import"../../logo/text-paths/InnovasjonFraFremtind.js";import"../../logo/text-paths/TeknologiFraFremtind.js";import"../../logo/text-paths/VartEgetForsikringsselskap.js";import"../../logo/text-paths/VartForsikringsselskap.js";import"../../popover/Popover.js";import"../../system-message/SystemMessage.js";import"../../table/DataTable.js";import"../../table/Table.js";import"../../table/TableBody.js";import"../../table/TableCaption.js";import"../../table/TableCell.js";import"../../table/TableColumn.js";import"../../table/TableColumnGroup.js";import"../../table/tableContext.js";import"../../table/tableSectionContext.js";import"../../table/TableFooter.js";import"../../table/TableHead.js";import"../../table/TableHeader.js";import"../../table/TableRow.js";import"../../tabs/NavTab.js";import"../../tabs/tabsContext.js";import"../../tabs/Tab.js";import"../../tag/Tag.js";import"../../toast/toastContext.js";import"../ToggleSwitch.js";import s from"./Example.js";i(),t.createRoot(document.getElementById("root")).render(o(s,{}));
|
|
2
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../../../../../src/components/toggle-switch/documentation/main.tsx"],"sourcesContent":["import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { initTabListener } from \"../../..\";\nimport Example from \"./Example\";\n\ninitTabListener();\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(<Example />);\n"],"names":["initTabListener","ReactDOM","createRoot","document","getElementById","render","jsx","Example"],"mappings":"s/HAKAA,IAEAC,EAASC,WAAWC,SAASC,eAAe,SAAUC,OAAQC,EAAAC,EAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{resolve as o}from"node:path";import t from"@vitejs/plugin-react-swc";import{defineConfig as i}from"vite";import{c as r}from"../../../../copy-jkl-fonts-Yd-mZnP9.js";const s=i({plugins:[t(),r(o(__dirname,"public","fonts"))]});export{s as default};
|
|
2
|
+
//# sourceMappingURL=vite.dev.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.dev.config.js","sources":["../../../../../src/components/toggle-switch/documentation/vite.dev.config.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport react from \"@vitejs/plugin-react-swc\";\nimport { defineConfig } from \"vite\";\nimport { copyJklFonts } from \"../../../../../../utils/vite\";\n\nexport default defineConfig({\n plugins: [react(), copyJklFonts(resolve(__dirname, \"public\", \"fonts\"))],\n});\n"],"names":["vite_dev_config","defineConfig","plugins","react","copyJklFonts","resolve","__dirname"],"mappings":"2KAKA,MAAAA,EAAeC,EAAa,CACxBC,QAAS,CAACC,IAASC,EAAaC,EAAQC,UAAW,SAAU"}
|