@olenbetong/appframe-ds 1.2.0 → 1.3.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.
Files changed (177) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +7 -7
  3. package/scripts/copyAssets.mjs +27 -27
  4. package/src/AfLookup/Lookup.css +129 -129
  5. package/src/AfLookup/Lookup.tsx +184 -184
  6. package/src/AfLookup/LookupCombobox.css +78 -78
  7. package/src/AfLookup/LookupCombobox.tsx +237 -237
  8. package/src/AfLookup/LookupEdit.tsx +130 -130
  9. package/src/AfLookup/LookupGrid.tsx +124 -124
  10. package/src/AfLookup/index.ts +5 -5
  11. package/src/autocomplete/Autocomplete.css +256 -256
  12. package/src/autocomplete/Autocomplete.tsx +320 -320
  13. package/src/autocomplete/AutocompleteFrame.tsx +168 -168
  14. package/src/autocomplete/Combobox.tsx +286 -286
  15. package/src/autocomplete/index.ts +4 -4
  16. package/src/autocomplete/types.ts +204 -204
  17. package/src/autocomplete/utils.ts +183 -183
  18. package/src/binding/BoundNumericTextField.tsx +102 -102
  19. package/src/binding/BoundTextField.tsx +49 -49
  20. package/src/binding/CancelButton.tsx +30 -30
  21. package/src/binding/CancelIconButton.tsx +30 -30
  22. package/src/binding/DataEditToolbar.css +23 -0
  23. package/src/binding/DataEditToolbar.tsx +84 -92
  24. package/src/binding/DeleteButton.tsx +35 -35
  25. package/src/binding/DeleteIconButton.tsx +35 -35
  26. package/src/binding/RefreshButton.tsx +31 -31
  27. package/src/binding/RefreshIconButton.tsx +33 -33
  28. package/src/binding/RefreshRowIconButton.tsx +33 -33
  29. package/src/binding/SaveButton.tsx +37 -37
  30. package/src/binding/SaveIconButton.tsx +38 -38
  31. package/src/container/Container.tsx +49 -49
  32. package/src/container/index.ts +1 -1
  33. package/src/cutoff/CutOffPicker.css +12 -12
  34. package/src/cutoff/CutOffPicker.tsx +165 -165
  35. package/src/cutoff/context.tsx +194 -194
  36. package/src/cutoff/dsCutOffDates.ts +21 -21
  37. package/src/cutoff/index.ts +4 -4
  38. package/src/cutoff/utils.test.ts +59 -59
  39. package/src/cutoff/utils.ts +276 -276
  40. package/src/filter/ChipListInput.tsx +79 -79
  41. package/src/filter/FieldFilterPanel.css +150 -150
  42. package/src/filter/FieldFilterPanel.tsx +309 -309
  43. package/src/filter/FilterBuilder.css +152 -152
  44. package/src/filter/FilterBuilder.test.tsx +153 -153
  45. package/src/filter/FilterBuilder.tsx +435 -435
  46. package/src/filter/FilterEditor.css +231 -231
  47. package/src/filter/FilterEditor.test.tsx +259 -259
  48. package/src/filter/FilterEditor.tsx +75 -75
  49. package/src/filter/FilterGroupEditor.tsx +160 -160
  50. package/src/filter/FilterNameDialog.css +22 -22
  51. package/src/filter/FilterNameDialog.tsx +81 -81
  52. package/src/filter/FilterRow.tsx +117 -117
  53. package/src/filter/FilterShareDialog.css +28 -28
  54. package/src/filter/FilterShareDialog.tsx +201 -201
  55. package/src/filter/FilterStringField.tsx +78 -78
  56. package/src/filter/FilterValueEditor.tsx +220 -220
  57. package/src/filter/SavedFilterTree.css +107 -107
  58. package/src/filter/SavedFilterTree.test.tsx +94 -94
  59. package/src/filter/SavedFilterTree.tsx +218 -218
  60. package/src/filter/fieldFilter.test.ts +158 -158
  61. package/src/filter/fieldFilter.ts +139 -139
  62. package/src/filter/index.ts +27 -27
  63. package/src/filter/types.ts +38 -38
  64. package/src/filter/useDistinctValues.test.ts +102 -102
  65. package/src/filter/useDistinctValues.ts +230 -230
  66. package/src/global.d.ts +11 -11
  67. package/src/grid/AfGridColumnsPanel.tsx +118 -118
  68. package/src/grid/AfGridContext.tsx +51 -51
  69. package/src/grid/AfGridError.tsx +46 -46
  70. package/src/grid/AfHeaderFilterCell.tsx +147 -147
  71. package/src/grid/AfHeaderFilterPanel.tsx +111 -111
  72. package/src/grid/GridEditLookup.css +12 -12
  73. package/src/grid/GridEditLookup.tsx +121 -121
  74. package/src/grid/Toolbar.tsx +233 -233
  75. package/src/grid/editing.ts +100 -100
  76. package/src/grid/filter.ts +78 -78
  77. package/src/grid/formatters.ts +48 -48
  78. package/src/grid/index.css +245 -245
  79. package/src/grid/index.tsx +503 -489
  80. package/src/grid/license.ts +48 -48
  81. package/src/grid/localization.ts +369 -369
  82. package/src/grid/slots/index.tsx +307 -307
  83. package/src/grid/slots/slots.css +64 -64
  84. package/src/grid/theme.tsx +138 -138
  85. package/src/grid/useAfColumns.tsx +371 -371
  86. package/src/grid/useAfCurrentIndex.ts +63 -63
  87. package/src/grid/useAfData.ts +20 -20
  88. package/src/grid/useAfFilter.ts +160 -160
  89. package/src/grid/useAfFilterFields.ts +55 -55
  90. package/src/grid/useAfGridApi.ts +71 -71
  91. package/src/grid/useAfKeyBindings.ts +36 -36
  92. package/src/grid/useAfNewItemRow.ts +258 -258
  93. package/src/grid/useAfPagination.ts +53 -53
  94. package/src/grid/useAfPersistedState.ts +230 -230
  95. package/src/grid/useAfRowEditModel.ts +145 -145
  96. package/src/grid/useAfRowGrouping.ts +47 -47
  97. package/src/grid/useAfServerAggregation.test.ts +68 -0
  98. package/src/grid/useAfServerAggregation.ts +158 -145
  99. package/src/grid/useAfSortModel.ts +84 -84
  100. package/src/i18n.ts +13 -13
  101. package/src/index.ts +14 -14
  102. package/src/input/InputAdornments.css +84 -75
  103. package/src/input/InputAdornments.tsx +102 -102
  104. package/src/input/index.ts +1 -1
  105. package/src/layout/AppMenu.tsx +74 -74
  106. package/src/layout/AppMenuDrawer.css +70 -70
  107. package/src/layout/AppMenuDrawer.tsx +122 -122
  108. package/src/layout/ErrorBoundary.tsx +162 -162
  109. package/src/layout/PageContainer.css +21 -2
  110. package/src/layout/PageContainer.tsx +18 -2
  111. package/src/layout/ResponsiveDialog.css +86 -86
  112. package/src/layout/ResponsiveDialog.tsx +55 -55
  113. package/src/layout/index.tsx +69 -69
  114. package/src/link/Link.tsx +23 -23
  115. package/src/link/index.ts +1 -1
  116. package/src/mdi/Mdi.css +138 -138
  117. package/src/mdi/Mdi.test.tsx +91 -91
  118. package/src/mdi/Mdi.tsx +141 -141
  119. package/src/mdi/MdiConfirmCloseDialog.tsx +47 -47
  120. package/src/mdi/MdiContext.tsx +59 -59
  121. package/src/mdi/MdiDocumentContext.tsx +60 -60
  122. package/src/mdi/MdiPanel.tsx +61 -61
  123. package/src/mdi/MdiRestore.test.tsx +86 -86
  124. package/src/mdi/MdiTab.tsx +30 -30
  125. package/src/mdi/controller.test.ts +382 -382
  126. package/src/mdi/controller.ts +656 -656
  127. package/src/mdi/dockviewHost.ts +132 -132
  128. package/src/mdi/fakeHost.ts +200 -200
  129. package/src/mdi/host.ts +44 -44
  130. package/src/mdi/ids.test.ts +20 -20
  131. package/src/mdi/ids.ts +18 -18
  132. package/src/mdi/index.ts +31 -31
  133. package/src/mdi/layoutRestore.test.ts +156 -156
  134. package/src/mdi/layoutRestore.ts +311 -311
  135. package/src/mdi/layoutSpec.test.ts +143 -143
  136. package/src/mdi/layoutSpec.ts +214 -214
  137. package/src/mdi/layoutStore.test.ts +93 -93
  138. package/src/mdi/layoutStore.ts +99 -99
  139. package/src/mdi/memorySettingsStore.ts +21 -21
  140. package/src/mdi/registry.ts +34 -34
  141. package/src/mdi/testTypes.ts +37 -37
  142. package/src/mdi/theme.ts +22 -22
  143. package/src/mdi/types.ts +214 -214
  144. package/src/page/Page.css +53 -53
  145. package/src/page/PageBlock.css +64 -64
  146. package/src/page/PageBlock.tsx +92 -92
  147. package/src/page/PageHeader.css +88 -88
  148. package/src/page/PageHeader.tsx +115 -115
  149. package/src/page/PageTitle.css +5 -5
  150. package/src/page/PageTitle.tsx +21 -21
  151. package/src/page/index.ts +4 -4
  152. package/src/paper/Paper.tsx +52 -52
  153. package/src/progress/LinearProgress.css +93 -93
  154. package/src/progress/LinearProgress.tsx +104 -104
  155. package/src/progress/index.ts +1 -1
  156. package/src/report-downloader/ReportDownloader.css +67 -67
  157. package/src/report-downloader/components/StatusItem.tsx +87 -87
  158. package/src/report-downloader/components/StatusList.tsx +28 -28
  159. package/src/report-downloader/index.ts +41 -41
  160. package/src/report-downloader/status.tsx +92 -92
  161. package/src/sortable/DropIndicator.css +51 -51
  162. package/src/sortable/DropIndicator.tsx +27 -27
  163. package/src/sortable/SortableItemList.css +21 -21
  164. package/src/sortable/SortableItemList.tsx +264 -264
  165. package/src/sortable/index.ts +8 -8
  166. package/src/sortable/reorderSortOrder.ts +126 -126
  167. package/src/sortable/sortOrder.ts +101 -101
  168. package/src/sortable/types.ts +9 -9
  169. package/src/sortable/useSortableContainer.ts +53 -53
  170. package/src/sortable/useSortableItem.ts +95 -95
  171. package/src/sortable/useSortableList.ts +117 -117
  172. package/src/test/happy-dom-document-class.ts +24 -24
  173. package/src/test/setup.ts +12 -12
  174. package/src/theme/useDsColorScheme.ts +53 -53
  175. package/tsconfig.build.json +9 -9
  176. package/tsconfig.json +8 -8
  177. package/vitest.config.ts +10 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @olenbetong/appframe-ds
2
2
 
3
+ ## 1.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 2c2ed02: `DataEditToolbar`: the previous/next buttons no longer stack (Designsystemet buttons are `display: flex`, so the navigation group is a flex row now), and the toolbar is a tinted bar with a bottom border in the theme's tokens instead of black-at-12% top and bottom borders, which were invisible in dark mode and doubled up against a tab list above it.
8
+ - c28f772: `InputAdornments`: the hover style is drawn on the wrapper like the focus style (Designsystemet's inner outline, on the whole control), and the inner input no longer shows its own hover outline.
9
+ - Updated dependencies [a4158e8]
10
+ - @olenbetong/appframe-react@2.2.2
11
+
12
+ ## 1.3.0
13
+
14
+ ### Minor Changes
15
+
16
+ - 16232b8: The 1.2.0 on npm was published from a checkout that predates its own changelog: it carries neither the cut-off family (`CutOffPicker`, `CutOffProvider`, `useCutOff`, the period helpers), `ResponsiveDialog`, `PageTitle`, `Link`, `GridEditLookup` and the `DataGrid` namespace on the grid entry, nor the `PageContainer` `maxWidth` fix and the server-side grid totals following the filters on paged data objects. This version is the first on npm with all of it.
17
+
3
18
  ## 1.2.0
4
19
 
5
20
  ### Minor Changes
@@ -7,6 +22,11 @@
7
22
  - b38f806: Three more `@olenbetong/appframe-mui` equivalents, so apps can drop that package: the cut-off period family (`CutOffPicker`, `CutOffProvider`, `useCutOff`, `cutOffToPlainDate`, `plainDateToCutOff`, `getPeriodLabel`, the range helpers and `PeriodType`), `ResponsiveDialog` (a Designsystemet `Dialog` that fills small screens, decided by CSS), and `PageTitle` (a Designsystemet `Heading`). Also `Link` (a Designsystemet link that navigates with react-router), `GridEditLookup` for `@olenbetong/appframe-ds/grid`, and MUI X re-exported from the grid entry as the `DataGrid` namespace, so a platform app never bundles its own copy. The cut-off utilities use Temporal for ISO weeks; the package now depends on `temporal-polyfill`.
8
23
  - cd7fc4f: Add label tag support with optional and required indicators.
9
24
 
25
+ ### Patch Changes
26
+
27
+ - cc4bdf4: `PageContainer` honours its `maxWidth` prop again. The prop was accepted and dropped, so every page that asked for `sm`, `md`, `lg` or `xl` rendered full width; it now limits the content to the MUI Container scale (36/48/64/80rem plus the gutters), against the leading edge as before.
28
+ - 91838e7: Server-side grid totals now follow the filters on a dynamically loading data object. `useAfServerAggregation` reloaded only on `onDataLoaded`, which a paged data object never fires, so the totals kept the values from the first load; it now also reloads when a paged load starts over (`onPartialDataLoaded` with `skip` 0). `AfGrid` also passes MUI's default `getAggregationPosition`, the one prop that makes the grid re-aggregate when the aggregation functions change, so the footer shows the totals as they arrive instead of those of the previous load.
29
+
10
30
  ## 1.1.0
11
31
 
12
32
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olenbetong/appframe-ds",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Components that bind Designsystemet components to Appframe data objects",
5
5
  "type": "module",
6
6
  "types": "./es/index.d.ts",
@@ -63,17 +63,17 @@
63
63
  "@atlaskit/pragmatic-drag-and-drop": "3.1.0",
64
64
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "2.2.2",
65
65
  "@base-ui/react": "1.8.0",
66
+ "@olenbetong/appframe-core": "2.14.0",
67
+ "@olenbetong/appframe-data": "1.7.2",
68
+ "@olenbetong/appframe-react": "2.2.2",
66
69
  "clsx": "^2.1.1",
67
70
  "dockview-react": "8.3.1",
68
71
  "localforage": "^1.10.0",
69
72
  "mitt": "^3.0.1",
70
73
  "react": "19.3.0",
71
74
  "react-dom": "19.3.0",
72
- "react-window": "2.3.1",
73
- "temporal-polyfill": "1.0.5",
74
- "@olenbetong/appframe-core": "2.14.0",
75
- "@olenbetong/appframe-data": "1.7.2",
76
- "@olenbetong/appframe-react": "2.2.1"
75
+ "react-window": "2.3.3",
76
+ "temporal-polyfill": "1.0.5"
77
77
  },
78
78
  "devDependencies": {
79
79
  "@digdir/designsystemet-react": "1.22.0",
@@ -90,7 +90,7 @@
90
90
  "@types/react": "19.3.0",
91
91
  "@types/react-dom": "19.3.0",
92
92
  "happy-dom": "20.14.5",
93
- "react-error-boundary": "6.1.5",
93
+ "react-error-boundary": "6.1.6",
94
94
  "react-router": "8.4.0",
95
95
  "typescript": "7.0.2"
96
96
  },
@@ -1,27 +1,27 @@
1
- /*
2
- * tsc emits the JavaScript into es/ but not the stylesheets the components import next to
3
- * themselves. Copy every .css under src/ to the same path under es/, so a new component's
4
- * stylesheet is published without anyone remembering a list.
5
- */
6
- import { cpSync, mkdirSync, readdirSync } from "node:fs";
7
- import { dirname, join, relative } from "node:path";
8
-
9
- function* cssFiles(dir) {
10
- for (let entry of readdirSync(dir, { withFileTypes: true })) {
11
- let path = join(dir, entry.name);
12
- if (entry.isDirectory()) {
13
- yield* cssFiles(path);
14
- } else if (entry.name.endsWith(".css")) {
15
- yield path;
16
- }
17
- }
18
- }
19
-
20
- let count = 0;
21
- for (let src of cssFiles("src")) {
22
- let dest = join("es", relative("src", src));
23
- mkdirSync(dirname(dest), { recursive: true });
24
- cpSync(src, dest);
25
- count++;
26
- }
27
- console.log(`Copied ${count} stylesheets from src/ to es/`);
1
+ /*
2
+ * tsc emits the JavaScript into es/ but not the stylesheets the components import next to
3
+ * themselves. Copy every .css under src/ to the same path under es/, so a new component's
4
+ * stylesheet is published without anyone remembering a list.
5
+ */
6
+ import { cpSync, mkdirSync, readdirSync } from "node:fs";
7
+ import { dirname, join, relative } from "node:path";
8
+
9
+ function* cssFiles(dir) {
10
+ for (let entry of readdirSync(dir, { withFileTypes: true })) {
11
+ let path = join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ yield* cssFiles(path);
14
+ } else if (entry.name.endsWith(".css")) {
15
+ yield path;
16
+ }
17
+ }
18
+ }
19
+
20
+ let count = 0;
21
+ for (let src of cssFiles("src")) {
22
+ let dest = join("es", relative("src", src));
23
+ mkdirSync(dirname(dest), { recursive: true });
24
+ cpSync(src, dest);
25
+ count++;
26
+ }
27
+ console.log(`Copied ${count} stylesheets from src/ to es/`);
@@ -1,129 +1,129 @@
1
- .ObLookup-inputWrap {
2
- position: relative;
3
-
4
- .ds-input {
5
- padding-inline-end: var(--ObLookup-buttons-width, 3rem);
6
- }
7
- }
8
-
9
- .ObLookup-labelTag {
10
- margin-inline-start: var(--ds-size-2, 0.5rem);
11
- }
12
-
13
- .ObLookup-buttons {
14
- position: absolute;
15
- inset-inline-end: 0;
16
- inset-block-end: 0;
17
- /* Match the .ds-input height so the buttons center on the input row,
18
- also when a label or description is rendered above the input */
19
- height: var(--ds-size-12, 3rem);
20
- display: flex;
21
- align-items: center;
22
- padding-inline-end: var(--ds-size-1, 0.25rem);
23
- }
24
-
25
- .ObLookup-dialog {
26
- border: 0;
27
- margin-block-start: 0;
28
- padding: 1rem;
29
- overflow: hidden;
30
-
31
- background-color: whitesmoke;
32
-
33
- transition:
34
- display 0.2s allow-discrete,
35
- transform 0.2s ease-out,
36
- scale 0.2s ease-out,
37
- opacity 0.2s ease-out;
38
-
39
- &::backdrop {
40
- opacity: 0;
41
- background: rgb(0 0 0 / 0.2);
42
- transition:
43
- display 0.2s allow-discrete,
44
- opacity 0.2s ease-out;
45
- }
46
-
47
- &[open]::backdrop {
48
- opacity: 1;
49
-
50
- @starting-style {
51
- opacity: 0;
52
- }
53
- }
54
-
55
- @media (width < 768px) {
56
- inset: 10vh 0.5rem 0;
57
-
58
- border-radius: 1rem 1rem 0 0;
59
- height: 90vh;
60
- width: calc(100vw - 1rem);
61
- max-width: 100vw;
62
- transform: translateY(100%);
63
- z-index: 1500;
64
-
65
- opacity: 0;
66
-
67
- &[open] {
68
- transform: translateY(0);
69
- opacity: 1;
70
-
71
- @starting-style {
72
- transform: translateY(100%);
73
- opacity: 0;
74
- }
75
- }
76
- }
77
-
78
- @media (width >= 768px) {
79
- inset-block-start: 50%;
80
- inset-inline-start: 50%;
81
- translate: -50% -50%;
82
- scale: 1 0;
83
- opacity: 0;
84
-
85
- border-radius: 0.25rem;
86
-
87
- height: clamp(300px, 80vh, 500px);
88
- min-width: 320px;
89
- width: var(--default-width, 400px);
90
-
91
- &[open] {
92
- scale: 1;
93
- opacity: 1;
94
-
95
- @starting-style {
96
- scale: 1 0;
97
- opacity: 0;
98
- }
99
- }
100
- }
101
-
102
- @supports (inset-block-start: anchor(bottom)) {
103
- @media (width < 768px) or (pointer: coarse) {
104
- anchor-name: unset !important;
105
- }
106
-
107
- @media screen and (width >= 768px) and (pointer: fine) {
108
- inset-block-start: anchor(bottom);
109
- inset-block-end: unset;
110
-
111
- inset-inline-start: anchor(left);
112
- inset-inline-end: unset;
113
-
114
- translate: unset;
115
- transform-origin: top left;
116
-
117
- resize: both;
118
- }
119
- }
120
-
121
- &[data-anchor="manual"] {
122
- inset: unset;
123
- position: fixed;
124
- inset-inline-start: var(--lookup-anchor-inline-start, 50%);
125
- inset-block-start: var(--lookup-anchor-block-start, 50%);
126
- translate: unset;
127
- transform: none;
128
- }
129
- }
1
+ .ObLookup-inputWrap {
2
+ position: relative;
3
+
4
+ .ds-input {
5
+ padding-inline-end: var(--ObLookup-buttons-width, 3rem);
6
+ }
7
+ }
8
+
9
+ .ObLookup-labelTag {
10
+ margin-inline-start: var(--ds-size-2, 0.5rem);
11
+ }
12
+
13
+ .ObLookup-buttons {
14
+ position: absolute;
15
+ inset-inline-end: 0;
16
+ inset-block-end: 0;
17
+ /* Match the .ds-input height so the buttons center on the input row,
18
+ also when a label or description is rendered above the input */
19
+ height: var(--ds-size-12, 3rem);
20
+ display: flex;
21
+ align-items: center;
22
+ padding-inline-end: var(--ds-size-1, 0.25rem);
23
+ }
24
+
25
+ .ObLookup-dialog {
26
+ border: 0;
27
+ margin-block-start: 0;
28
+ padding: 1rem;
29
+ overflow: hidden;
30
+
31
+ background-color: whitesmoke;
32
+
33
+ transition:
34
+ display 0.2s allow-discrete,
35
+ transform 0.2s ease-out,
36
+ scale 0.2s ease-out,
37
+ opacity 0.2s ease-out;
38
+
39
+ &::backdrop {
40
+ opacity: 0;
41
+ background: rgb(0 0 0 / 0.2);
42
+ transition:
43
+ display 0.2s allow-discrete,
44
+ opacity 0.2s ease-out;
45
+ }
46
+
47
+ &[open]::backdrop {
48
+ opacity: 1;
49
+
50
+ @starting-style {
51
+ opacity: 0;
52
+ }
53
+ }
54
+
55
+ @media (width < 768px) {
56
+ inset: 10vh 0.5rem 0;
57
+
58
+ border-radius: 1rem 1rem 0 0;
59
+ height: 90vh;
60
+ width: calc(100vw - 1rem);
61
+ max-width: 100vw;
62
+ transform: translateY(100%);
63
+ z-index: 1500;
64
+
65
+ opacity: 0;
66
+
67
+ &[open] {
68
+ transform: translateY(0);
69
+ opacity: 1;
70
+
71
+ @starting-style {
72
+ transform: translateY(100%);
73
+ opacity: 0;
74
+ }
75
+ }
76
+ }
77
+
78
+ @media (width >= 768px) {
79
+ inset-block-start: 50%;
80
+ inset-inline-start: 50%;
81
+ translate: -50% -50%;
82
+ scale: 1 0;
83
+ opacity: 0;
84
+
85
+ border-radius: 0.25rem;
86
+
87
+ height: clamp(300px, 80vh, 500px);
88
+ min-width: 320px;
89
+ width: var(--default-width, 400px);
90
+
91
+ &[open] {
92
+ scale: 1;
93
+ opacity: 1;
94
+
95
+ @starting-style {
96
+ scale: 1 0;
97
+ opacity: 0;
98
+ }
99
+ }
100
+ }
101
+
102
+ @supports (inset-block-start: anchor(bottom)) {
103
+ @media (width < 768px) or (pointer: coarse) {
104
+ anchor-name: unset !important;
105
+ }
106
+
107
+ @media screen and (width >= 768px) and (pointer: fine) {
108
+ inset-block-start: anchor(bottom);
109
+ inset-block-end: unset;
110
+
111
+ inset-inline-start: anchor(left);
112
+ inset-inline-end: unset;
113
+
114
+ translate: unset;
115
+ transform-origin: top left;
116
+
117
+ resize: both;
118
+ }
119
+ }
120
+
121
+ &[data-anchor="manual"] {
122
+ inset: unset;
123
+ position: fixed;
124
+ inset-inline-start: var(--lookup-anchor-inline-start, 50%);
125
+ inset-block-start: var(--lookup-anchor-block-start, 50%);
126
+ translate: unset;
127
+ transform: none;
128
+ }
129
+ }