@ziyarago/ui 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +2 -2
  4. package/assets/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext.woff2 +0 -0
  5. package/assets/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2 +0 -0
  6. package/assets/fonts/jetbrains-mono/jetbrains-mono-latin-ext.woff2 +0 -0
  7. package/assets/fonts/jetbrains-mono/jetbrains-mono-latin.woff2 +0 -0
  8. package/assets/fonts/manrope/manrope-cyrillic-ext.woff2 +0 -0
  9. package/assets/fonts/manrope/manrope-cyrillic.woff2 +0 -0
  10. package/assets/fonts/manrope/manrope-latin-ext.woff2 +0 -0
  11. package/assets/fonts/manrope/manrope-latin.woff2 +0 -0
  12. package/dist/llms-full.txt +89 -2
  13. package/dist/llms.txt +8 -3
  14. package/dist/manifest.json +745 -1
  15. package/dist/style.css +30 -5
  16. package/docs/INTEGRATION.md +3 -3
  17. package/docs/MIGRATION.md +3 -1
  18. package/package.json +2 -2
  19. package/src/compat/index.js +3 -2
  20. package/src/compat/vite.js +1 -1
  21. package/src/core/bools.js +1 -1
  22. package/src/core/components2.js +3 -3
  23. package/src/core/components7.js +13 -0
  24. package/src/core/pages.js +5 -1
  25. package/src/i18n/components/QiblaCompass.js +5 -0
  26. package/src/i18n/components/index.js +2 -0
  27. package/src/meta/domain.js +10 -0
  28. package/src/meta/forms.js +4 -0
  29. package/src/meta/groups.js +2 -2
  30. package/src/meta/pages.js +53 -0
  31. package/src/meta/templates.json +549 -1
  32. package/src/react/index.js +5 -0
  33. package/src/styles/components5.css +1 -1
  34. package/src/styles/components8.css +17 -1
  35. package/src/styles/effects.css +2 -1
  36. package/src/styles/fonts.css +9 -1
  37. package/src/vue/index.js +1 -1
  38. package/types/react.d.ts +291 -0
  39. package/types/vue-global.d.ts +5 -0
  40. package/types/vue.d.ts +208 -0
@@ -4706,6 +4706,554 @@
4706
4706
  "use": "<UiCard title=\"Summary\">…</UiCard>"
4707
4707
  }
4708
4708
  ]
4709
+ },
4710
+ {
4711
+ "key": "itinerary",
4712
+ "route": "itinerary",
4713
+ "label": "Itinerary",
4714
+ "icon": "map",
4715
+ "desc": "Itinerary: day tabs, a timeline of stops, transport and hotel blocks and a sticky trip summary.",
4716
+ "component": "PageItinerary",
4717
+ "tpl": "TplItinerary",
4718
+ "shell": true,
4719
+ "slots": [
4720
+ {
4721
+ "id": "header",
4722
+ "title": "Page heading",
4723
+ "desc": "Breadcrumbs, heading, caption and action buttons on the right.",
4724
+ "accepts": [
4725
+ "PageHeader",
4726
+ "Breadcrumbs",
4727
+ "Button",
4728
+ "SegmentedControl"
4729
+ ],
4730
+ "props": [
4731
+ {
4732
+ "name": "title",
4733
+ "type": "string",
4734
+ "desc": "H1, up to 60 characters"
4735
+ },
4736
+ {
4737
+ "name": "subtitle",
4738
+ "type": "string?",
4739
+ "desc": "Gray caption below the heading"
4740
+ },
4741
+ {
4742
+ "name": "crumbs",
4743
+ "type": "{label,href?}[]",
4744
+ "desc": "Breadcrumbs"
4745
+ },
4746
+ {
4747
+ "name": "actions",
4748
+ "type": "VNode",
4749
+ "desc": "Buttons on the right; wrap below on a narrow screen"
4750
+ }
4751
+ ],
4752
+ "use": "<UiPageHeader title=\"Dashboard\" :crumbs=\"crumbs\">\n <template #actions><UiButton variant=\"primary\">Export</UiButton></template>\n</UiPageHeader>"
4753
+ },
4754
+ {
4755
+ "id": "days",
4756
+ "title": "Days",
4757
+ "desc": "Switch between the days of the trip.",
4758
+ "accepts": [
4759
+ "Tabs",
4760
+ "PillTabs"
4761
+ ],
4762
+ "props": [
4763
+ {
4764
+ "name": "content",
4765
+ "type": "VNode",
4766
+ "desc": ""
4767
+ }
4768
+ ],
4769
+ "use": "<UiTabs v-model=\"day\" :items=\"days\" />"
4770
+ },
4771
+ {
4772
+ "id": "timeline",
4773
+ "title": "Day timeline",
4774
+ "desc": "Stops of the active day with times, places and durations.",
4775
+ "accepts": [
4776
+ "Card",
4777
+ "Timeline",
4778
+ "StatRow"
4779
+ ],
4780
+ "props": [
4781
+ {
4782
+ "name": "content",
4783
+ "type": "VNode",
4784
+ "desc": ""
4785
+ }
4786
+ ],
4787
+ "use": "<UiCard title=\"Day 2 · Makkah\">…</UiCard>"
4788
+ },
4789
+ {
4790
+ "id": "transport",
4791
+ "title": "Transport",
4792
+ "desc": "Flights, buses and transfers of the day.",
4793
+ "accepts": [
4794
+ "Card",
4795
+ "StatRow"
4796
+ ],
4797
+ "props": [
4798
+ {
4799
+ "name": "content",
4800
+ "type": "VNode",
4801
+ "desc": ""
4802
+ }
4803
+ ],
4804
+ "use": "<UiCard title=\"Transport\">…</UiCard>"
4805
+ },
4806
+ {
4807
+ "id": "hotel",
4808
+ "title": "Hotel",
4809
+ "desc": "Where the group stays.",
4810
+ "accepts": [
4811
+ "Card",
4812
+ "Badge",
4813
+ "IconTile"
4814
+ ],
4815
+ "props": [
4816
+ {
4817
+ "name": "content",
4818
+ "type": "VNode",
4819
+ "desc": ""
4820
+ }
4821
+ ],
4822
+ "use": "<UiCard>…</UiCard>"
4823
+ },
4824
+ {
4825
+ "id": "summary",
4826
+ "title": "Trip summary",
4827
+ "desc": "Dates, group size and what is booked.",
4828
+ "accepts": [
4829
+ "Card",
4830
+ "Descriptions",
4831
+ "Progress"
4832
+ ],
4833
+ "props": [
4834
+ {
4835
+ "name": "content",
4836
+ "type": "VNode",
4837
+ "desc": ""
4838
+ }
4839
+ ],
4840
+ "use": "<UiCard title=\"Trip summary\">…</UiCard>"
4841
+ }
4842
+ ]
4843
+ },
4844
+ {
4845
+ "key": "prayer",
4846
+ "route": "prayer",
4847
+ "label": "Prayer times",
4848
+ "icon": "clock",
4849
+ "desc": "Prayer times: location picker, today with the next prayer, a month table and a sticky Qibla compass.",
4850
+ "component": "PagePrayer",
4851
+ "tpl": "TplPrayer",
4852
+ "shell": true,
4853
+ "slots": [
4854
+ {
4855
+ "id": "header",
4856
+ "title": "Page heading",
4857
+ "desc": "Breadcrumbs, heading, caption and action buttons on the right.",
4858
+ "accepts": [
4859
+ "PageHeader",
4860
+ "Breadcrumbs",
4861
+ "Button",
4862
+ "SegmentedControl"
4863
+ ],
4864
+ "props": [
4865
+ {
4866
+ "name": "title",
4867
+ "type": "string",
4868
+ "desc": "H1, up to 60 characters"
4869
+ },
4870
+ {
4871
+ "name": "subtitle",
4872
+ "type": "string?",
4873
+ "desc": "Gray caption below the heading"
4874
+ },
4875
+ {
4876
+ "name": "crumbs",
4877
+ "type": "{label,href?}[]",
4878
+ "desc": "Breadcrumbs"
4879
+ },
4880
+ {
4881
+ "name": "actions",
4882
+ "type": "VNode",
4883
+ "desc": "Buttons on the right; wrap below on a narrow screen"
4884
+ }
4885
+ ],
4886
+ "use": "<UiPageHeader title=\"Dashboard\" :crumbs=\"crumbs\">\n <template #actions><UiButton variant=\"primary\">Export</UiButton></template>\n</UiPageHeader>"
4887
+ },
4888
+ {
4889
+ "id": "location",
4890
+ "title": "Location",
4891
+ "desc": "City and calculation method.",
4892
+ "accepts": [
4893
+ "Select",
4894
+ "PillSelect",
4895
+ "SegmentedControl"
4896
+ ],
4897
+ "props": [
4898
+ {
4899
+ "name": "content",
4900
+ "type": "VNode",
4901
+ "desc": ""
4902
+ }
4903
+ ],
4904
+ "use": "<UiSelect v-model=\"city\" :options=\"cities\" />"
4905
+ },
4906
+ {
4907
+ "id": "today",
4908
+ "title": "Today",
4909
+ "desc": "Five prayers with the next one highlighted and a countdown.",
4910
+ "accepts": [
4911
+ "Card",
4912
+ "PrayerTimes"
4913
+ ],
4914
+ "props": [
4915
+ {
4916
+ "name": "content",
4917
+ "type": "VNode",
4918
+ "desc": ""
4919
+ }
4920
+ ],
4921
+ "use": "<UiPrayerTimes :items=\"times\" :next=\"2\" />"
4922
+ },
4923
+ {
4924
+ "id": "month",
4925
+ "title": "Month table",
4926
+ "desc": "Prayer times for every day of the month.",
4927
+ "accepts": [
4928
+ "Card",
4929
+ "DataTable"
4930
+ ],
4931
+ "props": [
4932
+ {
4933
+ "name": "content",
4934
+ "type": "VNode",
4935
+ "desc": ""
4936
+ }
4937
+ ],
4938
+ "use": "<UiDataTable :columns=\"cols\" :rows=\"days\" />"
4939
+ },
4940
+ {
4941
+ "id": "qibla",
4942
+ "title": "Qibla",
4943
+ "desc": "Direction to the Kaaba.",
4944
+ "accepts": [
4945
+ "Card",
4946
+ "QiblaCompass"
4947
+ ],
4948
+ "props": [
4949
+ {
4950
+ "name": "content",
4951
+ "type": "VNode",
4952
+ "desc": ""
4953
+ }
4954
+ ],
4955
+ "use": "<UiQiblaCompass :bearing=\"248\" />"
4956
+ }
4957
+ ]
4958
+ },
4959
+ {
4960
+ "key": "group-manager",
4961
+ "route": "group-manager",
4962
+ "label": "Group manager",
4963
+ "icon": "users-round",
4964
+ "desc": "Group manager: trip summary, pilgrims with documents and visa, bulk actions, rooming and payments.",
4965
+ "component": "PageGroupManager",
4966
+ "tpl": "TplGroupManager",
4967
+ "shell": true,
4968
+ "slots": [
4969
+ {
4970
+ "id": "header",
4971
+ "title": "Page heading",
4972
+ "desc": "Breadcrumbs, heading, caption and action buttons on the right.",
4973
+ "accepts": [
4974
+ "PageHeader",
4975
+ "Breadcrumbs",
4976
+ "Button",
4977
+ "SegmentedControl"
4978
+ ],
4979
+ "props": [
4980
+ {
4981
+ "name": "title",
4982
+ "type": "string",
4983
+ "desc": "H1, up to 60 characters"
4984
+ },
4985
+ {
4986
+ "name": "subtitle",
4987
+ "type": "string?",
4988
+ "desc": "Gray caption below the heading"
4989
+ },
4990
+ {
4991
+ "name": "crumbs",
4992
+ "type": "{label,href?}[]",
4993
+ "desc": "Breadcrumbs"
4994
+ },
4995
+ {
4996
+ "name": "actions",
4997
+ "type": "VNode",
4998
+ "desc": "Buttons on the right; wrap below on a narrow screen"
4999
+ }
5000
+ ],
5001
+ "use": "<UiPageHeader title=\"Dashboard\" :crumbs=\"crumbs\">\n <template #actions><UiButton variant=\"primary\">Export</UiButton></template>\n</UiPageHeader>"
5002
+ },
5003
+ {
5004
+ "id": "trip",
5005
+ "title": "Trip summary",
5006
+ "desc": "Dates, route, seats and readiness counters.",
5007
+ "accepts": [
5008
+ "Card",
5009
+ "StatStrip",
5010
+ "Progress"
5011
+ ],
5012
+ "props": [
5013
+ {
5014
+ "name": "content",
5015
+ "type": "VNode",
5016
+ "desc": ""
5017
+ }
5018
+ ],
5019
+ "use": "<UiStatStrip :items=\"stats\" />"
5020
+ },
5021
+ {
5022
+ "id": "toolbar",
5023
+ "title": "Toolbar",
5024
+ "desc": "Search and status filters.",
5025
+ "accepts": [
5026
+ "SearchInput",
5027
+ "FilterChips"
5028
+ ],
5029
+ "props": [
5030
+ {
5031
+ "name": "content",
5032
+ "type": "VNode",
5033
+ "desc": ""
5034
+ }
5035
+ ],
5036
+ "use": "<UiSearchInput v-model=\"q\" />"
5037
+ },
5038
+ {
5039
+ "id": "bulk",
5040
+ "title": "Bulk actions",
5041
+ "desc": "Shown when pilgrims are selected.",
5042
+ "accepts": [
5043
+ "Button",
5044
+ "Badge"
5045
+ ],
5046
+ "props": [
5047
+ {
5048
+ "name": "content",
5049
+ "type": "VNode",
5050
+ "desc": ""
5051
+ }
5052
+ ],
5053
+ "use": "<UiButton icon=\"send\">Remind selected</UiButton>"
5054
+ },
5055
+ {
5056
+ "id": "pilgrims",
5057
+ "title": "Pilgrims",
5058
+ "desc": "Table with passport, visa and payment status.",
5059
+ "accepts": [
5060
+ "Card",
5061
+ "DataTable",
5062
+ "Badge"
5063
+ ],
5064
+ "props": [
5065
+ {
5066
+ "name": "content",
5067
+ "type": "VNode",
5068
+ "desc": ""
5069
+ }
5070
+ ],
5071
+ "use": "<UiDataTable :columns=\"cols\" :rows=\"rows\" />"
5072
+ },
5073
+ {
5074
+ "id": "rooms",
5075
+ "title": "Rooming",
5076
+ "desc": "Room assignment for the hotel.",
5077
+ "accepts": [
5078
+ "Card",
5079
+ "RoomGrid"
5080
+ ],
5081
+ "props": [
5082
+ {
5083
+ "name": "content",
5084
+ "type": "VNode",
5085
+ "desc": ""
5086
+ }
5087
+ ],
5088
+ "use": "<UiRoomGrid :rooms=\"rooms\" />"
5089
+ },
5090
+ {
5091
+ "id": "payments",
5092
+ "title": "Payments",
5093
+ "desc": "Collected, outstanding and the manager contact.",
5094
+ "accepts": [
5095
+ "Card",
5096
+ "Progress",
5097
+ "ContactPanel"
5098
+ ],
5099
+ "props": [
5100
+ {
5101
+ "name": "content",
5102
+ "type": "VNode",
5103
+ "desc": ""
5104
+ }
5105
+ ],
5106
+ "use": "<UiCard title=\"Payments\">…</UiCard>"
5107
+ }
5108
+ ]
5109
+ },
5110
+ {
5111
+ "key": "tour-public",
5112
+ "route": "tour-public",
5113
+ "label": "Tour page",
5114
+ "icon": "plane",
5115
+ "desc": "Public tour page without the shell: gradient gallery, highlights, itinerary, inclusions, reviews and a sticky booking card.",
5116
+ "component": "PageTourPublic",
5117
+ "tpl": "TplTourPublic",
5118
+ "shell": false,
5119
+ "slots": [
5120
+ {
5121
+ "id": "header",
5122
+ "title": "Page heading",
5123
+ "desc": "Breadcrumbs, heading, caption and action buttons on the right.",
5124
+ "accepts": [
5125
+ "PageHeader",
5126
+ "Breadcrumbs",
5127
+ "Button",
5128
+ "SegmentedControl"
5129
+ ],
5130
+ "props": [
5131
+ {
5132
+ "name": "title",
5133
+ "type": "string",
5134
+ "desc": "H1, up to 60 characters"
5135
+ },
5136
+ {
5137
+ "name": "subtitle",
5138
+ "type": "string?",
5139
+ "desc": "Gray caption below the heading"
5140
+ },
5141
+ {
5142
+ "name": "crumbs",
5143
+ "type": "{label,href?}[]",
5144
+ "desc": "Breadcrumbs"
5145
+ },
5146
+ {
5147
+ "name": "actions",
5148
+ "type": "VNode",
5149
+ "desc": "Buttons on the right; wrap below on a narrow screen"
5150
+ }
5151
+ ],
5152
+ "use": "<UiPageHeader title=\"Dashboard\" :crumbs=\"crumbs\">\n <template #actions><UiButton variant=\"primary\">Export</UiButton></template>\n</UiPageHeader>"
5153
+ },
5154
+ {
5155
+ "id": "gallery",
5156
+ "title": "Gallery",
5157
+ "desc": "Hero area made of gradients or photos.",
5158
+ "accepts": [
5159
+ "Gallery",
5160
+ "Card"
5161
+ ],
5162
+ "props": [
5163
+ {
5164
+ "name": "content",
5165
+ "type": "VNode",
5166
+ "desc": ""
5167
+ }
5168
+ ],
5169
+ "use": "<UiCard>…</UiCard>"
5170
+ },
5171
+ {
5172
+ "id": "highlights",
5173
+ "title": "Highlights",
5174
+ "desc": "Key facts: nights, hotels, flights.",
5175
+ "accepts": [
5176
+ "StatStrip",
5177
+ "IconTile"
5178
+ ],
5179
+ "props": [
5180
+ {
5181
+ "name": "content",
5182
+ "type": "VNode",
5183
+ "desc": ""
5184
+ }
5185
+ ],
5186
+ "use": "<UiStatStrip :items=\"facts\" />"
5187
+ },
5188
+ {
5189
+ "id": "itinerary",
5190
+ "title": "Itinerary",
5191
+ "desc": "Day by day program in an accordion.",
5192
+ "accepts": [
5193
+ "Accordion"
5194
+ ],
5195
+ "props": [
5196
+ {
5197
+ "name": "content",
5198
+ "type": "VNode",
5199
+ "desc": ""
5200
+ }
5201
+ ],
5202
+ "use": "<UiAccordion :items=\"days\" />"
5203
+ },
5204
+ {
5205
+ "id": "included",
5206
+ "title": "Included",
5207
+ "desc": "What the price includes and excludes.",
5208
+ "accepts": [
5209
+ "Card",
5210
+ "Descriptions"
5211
+ ],
5212
+ "props": [
5213
+ {
5214
+ "name": "content",
5215
+ "type": "VNode",
5216
+ "desc": ""
5217
+ }
5218
+ ],
5219
+ "use": "<UiCard title=\"Included\">…</UiCard>"
5220
+ },
5221
+ {
5222
+ "id": "reviews",
5223
+ "title": "Reviews",
5224
+ "desc": "What pilgrims say.",
5225
+ "accepts": [
5226
+ "Card",
5227
+ "Rating",
5228
+ "Avatar"
5229
+ ],
5230
+ "props": [
5231
+ {
5232
+ "name": "content",
5233
+ "type": "VNode",
5234
+ "desc": ""
5235
+ }
5236
+ ],
5237
+ "use": "<UiCard title=\"Reviews\">…</UiCard>"
5238
+ },
5239
+ {
5240
+ "id": "booking",
5241
+ "title": "Booking",
5242
+ "desc": "Price, dates, seats and the booking button.",
5243
+ "accepts": [
5244
+ "Card",
5245
+ "Button"
5246
+ ],
5247
+ "props": [
5248
+ {
5249
+ "name": "content",
5250
+ "type": "VNode",
5251
+ "desc": ""
5252
+ }
5253
+ ],
5254
+ "use": "<UiCard title=\"Book\">…</UiCard>"
5255
+ }
5256
+ ]
4709
5257
  }
4710
5258
  ]
4711
- }
5259
+ }
@@ -75,6 +75,7 @@ export const UiHotelCard = C.HotelCard;
75
75
  export const UiTourCard = C.TourCard;
76
76
  export const UiPrayerTimes = C.PrayerTimes;
77
77
  export const UiRamadanTracker = C.RamadanTracker;
78
+ export const UiQiblaCompass = C.QiblaCompass;
78
79
  export const UiCallRow = C.CallRow;
79
80
  export const UiAlert = C.Alert;
80
81
  export const UiBanner = C.Banner;
@@ -212,6 +213,10 @@ export const UiPageStates = C.PageStates;
212
213
  export const UiPageLegal = C.PageLegal;
213
214
  export const UiPageLocations = C.PageLocations;
214
215
  export const UiPageBookingFlow = C.PageBookingFlow;
216
+ export const UiPageItinerary = C.PageItinerary;
217
+ export const UiPagePrayer = C.PagePrayer;
218
+ export const UiPageGroupManager = C.PageGroupManager;
219
+ export const UiPageTourPublic = C.PageTourPublic;
215
220
  export const UiPageNotifications = C.PageNotifications;
216
221
  export const UiPageInbox = C.PageInbox;
217
222
  export const UiPageCheckout = C.PageCheckout;
@@ -2,4 +2,4 @@
2
2
  .zg-pgroot{display:block;min-width:0;width:100%}.zg-pg{display:flex;flex-direction:column;gap:16px;min-width:0}.zg-pg__r{min-width:0}
3
3
  .zg-pg__auto{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--min,340px)),1fr));gap:16px;align-items:start;min-width:0}
4
4
  .zg-pg__two{display:flex;flex-wrap:wrap;gap:16px;align-items:flex-start;min-width:0}.zg-pg__main{flex:999 1 460px;min-width:0;display:flex;flex-direction:column;gap:16px}.zg-pg__side{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:16px}.zg-pg__aside{flex:1 1 260px;min-width:0;max-width:100%;display:flex;flex-direction:column;gap:16px}
5
- .zg-pgauth{position:relative;min-height:100%;display:grid;place-items:center;padding:24px}.zg-pgauth__bg{position:absolute;inset:0;overflow:hidden}.zg-pgauth__c{position:relative;width:100%;max-width:440px}
5
+ .zg-pgauth{position:relative;min-height:100vh;min-height:100dvh;display:grid}.zg-pgauth__bg{position:absolute;inset:0;overflow:hidden}.zg-pgauth__c{position:relative;display:grid;place-items:center;padding:24px;min-height:inherit}.zg-pgauth .zg-auth{min-height:0;padding:0;width:100%;background:transparent;display:grid;place-items:center}.zg-pgauth .zg-auth__card{margin-inline:auto}
@@ -45,8 +45,10 @@
45
45
  /* CommandPalette active row, dialog focus */
46
46
  .zg-menu__i.is-active,.zg-menu__i[aria-selected="true"]{background:var(--zg-s2)}
47
47
  .zg-modal:focus,.zg-sheet:focus,.zg-fsd:focus,.zg-saver:focus{outline:0}
48
+ /* auth page templates fill the viewport */
49
+ .zg-split2{min-height:100vh;min-height:100dvh}
48
50
  /* AuthShowcase: photo (dark framed card), light (gradient card + proof pill + glass caption), tint (coloured panel, pill fields) */
49
- .zg-ash{min-height:100%;padding:clamp(12px,3vw,40px);display:grid;place-items:center;--ash-r:28px;--ash-acc:var(--zg-brand)}
51
+ .zg-ash{min-height:100vh;min-height:100dvh;padding:clamp(12px,3vw,40px);display:grid;place-items:center;--ash-r:28px;--ash-acc:var(--zg-brand)}
50
52
  .zg-ash--tint{--ash-acc:oklch(.7 .13 215)}
51
53
  .zg-ash__title{margin:0;font:300 clamp(28px,3.4vw,40px)/1.1 var(--zg-font);letter-spacing:-.03em}
52
54
  .zg-ash__sub{margin:10px 0 0;color:var(--zg-text-2);line-height:1.55}
@@ -94,3 +96,17 @@
94
96
 
95
97
  /* page templates: sticky region */
96
98
  .zg-pg__two--sticky{align-items:stretch}.zg-pg__stick{position:sticky;inset-block-start:16px;align-self:flex-start;width:100%}
99
+
100
+ /* QiblaCompass */
101
+ .zg-qb{display:flex;flex-direction:column;align-items:center;gap:8px;max-width:100%;direction:ltr}
102
+ .zg-qb__svg{width:100%;height:auto;display:block}
103
+ .zg-qb__ring{fill:var(--zg-s1);stroke:var(--zg-stroke);stroke-width:1}
104
+ .zg-qb__tk{stroke:var(--zg-text-3);stroke-width:1;stroke-linecap:round}.zg-qb__tk--m{stroke:var(--zg-text-2);stroke-width:1.8}
105
+ .zg-qb__n{fill:var(--zg-red)}.zg-qb__ln{stroke:var(--zg-brand);stroke-width:3;stroke-linecap:round}
106
+ .zg-qb__kb{fill:var(--zg-bg);stroke:var(--zg-brand);stroke-width:2}.zg-qb__kg{fill:var(--zg-brand)}
107
+ .zg-qb__hub{fill:var(--zg-brand)}
108
+ .zg-qb__dial,.zg-qb__ptr{transition:transform .6s cubic-bezier(.2,.8,.2,1)}
109
+ .zg-qb__txt{display:flex;flex-direction:column;align-items:center;line-height:1.2;color:var(--zg-text-2);font-size:calc(13px*var(--dz,1))}
110
+ .zg-qb__txt b{font-size:calc(22px*var(--dz,1));font-weight:600;color:var(--zg-text-1)}.zg-qb__txt small{color:var(--zg-text-3)}
111
+ /* Numbers: tabular figures with a plain zero (no slashed or dotted zero) in KPI values, tables and code cells */
112
+ .zg-num,.zg-mono,.zg-kpi__value,.zg-table .num{font-feature-settings:"zero" 0,"tnum" 1}
@@ -4,7 +4,7 @@
4
4
  [data-motion="off"] *,[data-motion="off"] *::before,[data-motion="off"] *::after{animation-duration:.001ms!important;animation-delay:0s!important;animation-iteration-count:1!important;transition-duration:.001ms!important;transition-delay:0s!important;scroll-behavior:auto!important}
5
5
 
6
6
  /* ── effects lite: flat surfaces for weak browsers and devices ── */
7
- [data-fx="lite"] *,[data-fx="lite"] *::before,[data-fx="lite"] *::after{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
7
+ [data-fx="lite"]:not([data-effects="full"]) *,[data-fx="lite"]:not([data-effects="full"]) *::before,[data-fx="lite"]:not([data-effects="full"]) *::after{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
8
8
  [data-fx="lite"]{--zg-shadow-1:0 2px 8px oklch(0 0 0 / .18);--zg-shadow-2:0 6px 20px oklch(0 0 0 / .28);--zg-brand-glow:transparent}
9
9
  [data-fx="lite"][data-theme="light"]{--zg-shadow-1:0 2px 8px oklch(0.4 0.03 60 / .12);--zg-shadow-2:0 6px 20px oklch(0.4 0.03 60 / .18)}
10
10
  [data-fx="lite"] .zg-glass{background:var(--zg-pop)}
@@ -22,6 +22,7 @@ html[data-bg]:not([data-bg="none"]),.zg-bg:not([data-bg="none"]){background-colo
22
22
  .zg-bg:not([data-bg="none"]){background-attachment:scroll}
23
23
  html[data-bg]:not([data-bg="none"]) .zg-root{background:transparent}
24
24
  html[data-motion="on"][data-bg]:not([data-bg="none"]){background-image:none}
25
+ html[data-motion="on"][data-bg]:not([data-bg="none"]){overflow-x:clip}
25
26
  html[data-motion="on"][data-bg]:not([data-bg="none"])::before{content:"";position:fixed;inset:-25%;z-index:-1;pointer-events:none;background-image:var(--zg-bg-image);background-repeat:no-repeat;animation:zg-bg-float 18s ease-in-out infinite alternate,zg-bg-hue 40s linear infinite;will-change:transform,filter}
26
27
  @keyframes zg-bg-hue{from{filter:hue-rotate(0deg) saturate(1.15)}to{filter:hue-rotate(360deg) saturate(1.15)}}
27
28
  @keyframes zg-bg-float{0%{transform:translate3d(-3%,-2%,0) scale(1) rotate(0deg)}50%{transform:translate3d(4%,3%,0) scale(1.18) rotate(3deg)}100%{transform:translate3d(-2%,5%,0) scale(1.08) rotate(-3deg)}}
@@ -1,4 +1,12 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200;300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
1
+ /* Manrope and JetBrains Mono (SIL OFL 1.1), self-hosted variable fonts from Google Fonts, latin and cyrillic subsets. No request to Google, works under a strict CSP. */
2
+ @font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('../../assets/fonts/jetbrains-mono/jetbrains-mono-cyrillic-ext.woff2') format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F}
3
+ @font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('../../assets/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
4
+ @font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('../../assets/fonts/jetbrains-mono/jetbrains-mono-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF}
5
+ @font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 600;font-display:swap;src:url('../../assets/fonts/jetbrains-mono/jetbrains-mono-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
6
+ @font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;src:url('../../assets/fonts/manrope/manrope-cyrillic-ext.woff2') format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F}
7
+ @font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;src:url('../../assets/fonts/manrope/manrope-cyrillic.woff2') format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
8
+ @font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;src:url('../../assets/fonts/manrope/manrope-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF}
9
+ @font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:swap;src:url('../../assets/fonts/manrope/manrope-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
2
10
  /* Thmanyah — free incl. commercial, https://font.thmanyah.com. Files in assets/fonts/thmanyah. Adjust URLs to your bundler.
3
11
  Thmanyah is visually heavier than Manrope at the same weight and has no 600 face. Weight ranges map the UI weights (300-900) so Arabic does not look bold:
4
12
  200-300 Light, 400-600 Regular, 700 Medium, 800 Bold, 900 Black. */
package/src/vue/index.js CHANGED
@@ -29,7 +29,7 @@ const wrap = (name, def) => defineComponent({
29
29
  });
30
30
  for (const [name, def] of Object.entries(components)) C[name] = wrap(name, def);
31
31
 
32
- export const { Button: UiButton, IconButton: UiIconButton, Badge: UiBadge, Avatar: UiAvatar, Switch: UiSwitch, Checkbox: UiCheckbox, SegmentedControl: UiSegmentedControl, Tabs: UiTabs, FilterChips: UiFilterChips, TextField: UiTextField, Select: UiSelect, CodeInput: UiCodeInput, Stepper: UiStepper, Card: UiCard, Modal: UiModal, Drawer: UiDrawer, Toast: UiToast, Breadcrumbs: UiBreadcrumbs, Pagination: UiPagination, Progress: UiProgress, Ring: UiRing, KpiTile: UiKpiTile, DataTable: UiDataTable, KanbanColumn: UiKanbanColumn, KanbanCard: UiKanbanCard, Timeline: UiTimeline, TopNav: UiTopNav, SideNav: UiSideNav, AppShell: UiAppShell, PageHeader: UiPageHeader, AuthLayout: UiAuthLayout, LeadCard: UiLeadCard, HotelCard: UiHotelCard, TourCard: UiTourCard, PrayerTimes: UiPrayerTimes, RamadanTracker: UiRamadanTracker, CallRow: UiCallRow, Alert: UiAlert, Banner: UiBanner, Accordion: UiAccordion, Skeleton: UiSkeleton, Spinner: UiSpinner, Divider: UiDivider, EmptyState: UiEmptyState, ErrorPage: UiErrorPage, DataState: UiDataState, LoadingOverlay: UiLoadingOverlay, ConfirmDialog: UiConfirmDialog, Popconfirm: UiPopconfirm, Carousel: UiCarousel, Gallery: UiGallery, Code: UiCode, PricingCard: UiPricingCard, IntegrationCard: UiIntegrationCard, IncomingCall: UiIncomingCall, CallCard: UiCallCard, Dropdown: UiDropdown, Menu: UiMenu, Tooltip: UiTooltip, HoverCard: UiHoverCard, Popover: UiPopover, CopyButton: UiCopyButton, CommandBar: UiCommandBar, CommandPalette: UiCommandPalette, NotificationBell: UiNotificationBell, ToggleGroup: UiToggleGroup, Fab: UiFab, Textarea: UiTextarea, NumberInput: UiNumberInput, PasswordInput: UiPasswordInput, SearchInput: UiSearchInput, RadioGroup: UiRadioGroup, Slider: UiSlider, Rating: UiRating, ChipInput: UiChipInput, InlineEdit: UiInlineEdit, ColorPicker: UiColorPicker, FileUpload: UiFileUpload, Combobox: UiCombobox, MultiSelect: UiMultiSelect, GroupedSelect: UiGroupedSelect, PhoneInput: UiPhoneInput, Calendar: UiCalendar, DatePicker: UiDatePicker, TimePicker: UiTimePicker, FormField: UiFormField, LoginForm: UiLoginForm, StepForm: UiStepForm, Tag: UiTag, Kbd: UiKbd, StatsCard: UiStatsCard, KpiInline: UiKpiInline, MiniChart: UiMiniChart, Descriptions: UiDescriptions, LazyImage: UiLazyImage, SystemStatus: UiSystemStatus, TreeView: UiTreeView, CalendarView: UiCalendarView, SubNav: UiSubNav, ActionRail: UiActionRail, SplitLayout: UiSplitLayout, SettingsSection: UiSettingsSection, ScrollArea: UiScrollArea, DealCard: UiDealCard, PipelineBoard: UiPipelineBoard, ContactPanel: UiContactPanel, SalesFunnel: UiSalesFunnel, BookingCard: UiBookingCard, GuestCard: UiGuestCard, RoomGrid: UiRoomGrid, RoomCalendar: UiRoomCalendar, OccupancyChart: UiOccupancyChart, Chip: UiChip, IconTile: UiIconTile, StatusIcon: UiStatusIcon, UserCell: UiUserCell, StatRow: UiStatRow, CountryRow: UiCountryRow, StatLine: UiStatLine, StatStrip: UiStatStrip, VersusBar: UiVersusBar, SegBar: UiSegBar, HeroBanner: UiHeroBanner, TabTiles: UiTabTiles, PillTabs: UiPillTabs, PillSelect: UiPillSelect, ChartCard: UiChartCard, ActionCard: UiActionCard, Snackbar: UiSnackbar, TourPopover: UiTourPopover, ProfileHeader: UiProfileHeader, AuthSplit: UiAuthSplit, AuthShowcase: UiAuthShowcase, SocialAuth: UiSocialAuth, StatusPage: UiStatusPage, ValidatedField: UiValidatedField, Footer: UiFooter, DataGroup: UiDataGroup, OptionCard: UiOptionCard, OptionCards: UiOptionCards, RichEditor: UiRichEditor, RangeSlider: UiRangeSlider, RangeCalendar: UiRangeCalendar, StepDialog: UiStepDialog, FullscreenDialog: UiFullscreenDialog, PageDashboard: UiPageDashboard, PagePatterns: UiPagePatterns, PageCrm: UiPageCrm, PageBookings: UiPageBookings, PageCatalog: UiPageCatalog, PageDetail: UiPageDetail, PageSettings: UiPageSettings, PageUserList: UiPageUserList, PageProfile: UiPageProfile, PageForm: UiPageForm, PageOrder: UiPageOrder, PageAccount: UiPageAccount, PagePricing: UiPagePricing, PageFaq: UiPageFaq, PageAnalytics: UiPageAnalytics, PageCalendar: UiPageCalendar, PageKanban: UiPageKanban, PageBilling: UiPageBilling, PageTeam: UiPageTeam, PageIntegrations: UiPageIntegrations, PageSearch: UiPageSearch, PageArticle: UiPageArticle, PageChangelog: UiPageChangelog, PageHelp: UiPageHelp, PageStates: UiPageStates, PageLegal: UiPageLegal, PageLocations: UiPageLocations, PageBookingFlow: UiPageBookingFlow, PageNotifications: UiPageNotifications, PageInbox: UiPageInbox, PageCheckout: UiPageCheckout, PageOnboarding: UiPageOnboarding, PageLanding: UiPageLanding, PageAuth: UiPageAuth, PageStatus: UiPageStatus, TreeSelect: UiTreeSelect, ContextMenu: UiContextMenu, Sortable: UiSortable, Map: UiMap, ImageUpload: UiImageUpload, Screensaver: UiScreensaver, Tour: UiTour, Heading: UiHeading, Text: UiText, Box: UiBox, Center: UiCenter, HStack: UiHStack, VStack: UiVStack, Grid: UiGrid, Link: UiLink, Pressable: UiPressable, Icon: UiIcon, Portal: UiPortal, LiquidGlass: UiLiquidGlass, BottomSheet: UiBottomSheet, Actionsheet: UiActionsheet, ImageViewer: UiImageViewer, ChatAi: UiChatAi } = C;
32
+ export const { Button: UiButton, IconButton: UiIconButton, Badge: UiBadge, Avatar: UiAvatar, Switch: UiSwitch, Checkbox: UiCheckbox, SegmentedControl: UiSegmentedControl, Tabs: UiTabs, FilterChips: UiFilterChips, TextField: UiTextField, Select: UiSelect, CodeInput: UiCodeInput, Stepper: UiStepper, Card: UiCard, Modal: UiModal, Drawer: UiDrawer, Toast: UiToast, Breadcrumbs: UiBreadcrumbs, Pagination: UiPagination, Progress: UiProgress, Ring: UiRing, KpiTile: UiKpiTile, DataTable: UiDataTable, KanbanColumn: UiKanbanColumn, KanbanCard: UiKanbanCard, Timeline: UiTimeline, TopNav: UiTopNav, SideNav: UiSideNav, AppShell: UiAppShell, PageHeader: UiPageHeader, AuthLayout: UiAuthLayout, LeadCard: UiLeadCard, HotelCard: UiHotelCard, TourCard: UiTourCard, PrayerTimes: UiPrayerTimes, RamadanTracker: UiRamadanTracker, QiblaCompass: UiQiblaCompass, CallRow: UiCallRow, Alert: UiAlert, Banner: UiBanner, Accordion: UiAccordion, Skeleton: UiSkeleton, Spinner: UiSpinner, Divider: UiDivider, EmptyState: UiEmptyState, ErrorPage: UiErrorPage, DataState: UiDataState, LoadingOverlay: UiLoadingOverlay, ConfirmDialog: UiConfirmDialog, Popconfirm: UiPopconfirm, Carousel: UiCarousel, Gallery: UiGallery, Code: UiCode, PricingCard: UiPricingCard, IntegrationCard: UiIntegrationCard, IncomingCall: UiIncomingCall, CallCard: UiCallCard, Dropdown: UiDropdown, Menu: UiMenu, Tooltip: UiTooltip, HoverCard: UiHoverCard, Popover: UiPopover, CopyButton: UiCopyButton, CommandBar: UiCommandBar, CommandPalette: UiCommandPalette, NotificationBell: UiNotificationBell, ToggleGroup: UiToggleGroup, Fab: UiFab, Textarea: UiTextarea, NumberInput: UiNumberInput, PasswordInput: UiPasswordInput, SearchInput: UiSearchInput, RadioGroup: UiRadioGroup, Slider: UiSlider, Rating: UiRating, ChipInput: UiChipInput, InlineEdit: UiInlineEdit, ColorPicker: UiColorPicker, FileUpload: UiFileUpload, Combobox: UiCombobox, MultiSelect: UiMultiSelect, GroupedSelect: UiGroupedSelect, PhoneInput: UiPhoneInput, Calendar: UiCalendar, DatePicker: UiDatePicker, TimePicker: UiTimePicker, FormField: UiFormField, LoginForm: UiLoginForm, StepForm: UiStepForm, Tag: UiTag, Kbd: UiKbd, StatsCard: UiStatsCard, KpiInline: UiKpiInline, MiniChart: UiMiniChart, Descriptions: UiDescriptions, LazyImage: UiLazyImage, SystemStatus: UiSystemStatus, TreeView: UiTreeView, CalendarView: UiCalendarView, SubNav: UiSubNav, ActionRail: UiActionRail, SplitLayout: UiSplitLayout, SettingsSection: UiSettingsSection, ScrollArea: UiScrollArea, DealCard: UiDealCard, PipelineBoard: UiPipelineBoard, ContactPanel: UiContactPanel, SalesFunnel: UiSalesFunnel, BookingCard: UiBookingCard, GuestCard: UiGuestCard, RoomGrid: UiRoomGrid, RoomCalendar: UiRoomCalendar, OccupancyChart: UiOccupancyChart, Chip: UiChip, IconTile: UiIconTile, StatusIcon: UiStatusIcon, UserCell: UiUserCell, StatRow: UiStatRow, CountryRow: UiCountryRow, StatLine: UiStatLine, StatStrip: UiStatStrip, VersusBar: UiVersusBar, SegBar: UiSegBar, HeroBanner: UiHeroBanner, TabTiles: UiTabTiles, PillTabs: UiPillTabs, PillSelect: UiPillSelect, ChartCard: UiChartCard, ActionCard: UiActionCard, Snackbar: UiSnackbar, TourPopover: UiTourPopover, ProfileHeader: UiProfileHeader, AuthSplit: UiAuthSplit, AuthShowcase: UiAuthShowcase, SocialAuth: UiSocialAuth, StatusPage: UiStatusPage, ValidatedField: UiValidatedField, Footer: UiFooter, DataGroup: UiDataGroup, OptionCard: UiOptionCard, OptionCards: UiOptionCards, RichEditor: UiRichEditor, RangeSlider: UiRangeSlider, RangeCalendar: UiRangeCalendar, StepDialog: UiStepDialog, FullscreenDialog: UiFullscreenDialog, PageDashboard: UiPageDashboard, PagePatterns: UiPagePatterns, PageCrm: UiPageCrm, PageBookings: UiPageBookings, PageCatalog: UiPageCatalog, PageDetail: UiPageDetail, PageSettings: UiPageSettings, PageUserList: UiPageUserList, PageProfile: UiPageProfile, PageForm: UiPageForm, PageOrder: UiPageOrder, PageAccount: UiPageAccount, PagePricing: UiPagePricing, PageFaq: UiPageFaq, PageAnalytics: UiPageAnalytics, PageCalendar: UiPageCalendar, PageKanban: UiPageKanban, PageBilling: UiPageBilling, PageTeam: UiPageTeam, PageIntegrations: UiPageIntegrations, PageSearch: UiPageSearch, PageArticle: UiPageArticle, PageChangelog: UiPageChangelog, PageHelp: UiPageHelp, PageStates: UiPageStates, PageLegal: UiPageLegal, PageLocations: UiPageLocations, PageBookingFlow: UiPageBookingFlow, PageItinerary: UiPageItinerary, PagePrayer: UiPagePrayer, PageGroupManager: UiPageGroupManager, PageTourPublic: UiPageTourPublic, PageNotifications: UiPageNotifications, PageInbox: UiPageInbox, PageCheckout: UiPageCheckout, PageOnboarding: UiPageOnboarding, PageLanding: UiPageLanding, PageAuth: UiPageAuth, PageStatus: UiPageStatus, TreeSelect: UiTreeSelect, ContextMenu: UiContextMenu, Sortable: UiSortable, Map: UiMap, ImageUpload: UiImageUpload, Screensaver: UiScreensaver, Tour: UiTour, Heading: UiHeading, Text: UiText, Box: UiBox, Center: UiCenter, HStack: UiHStack, VStack: UiVStack, Grid: UiGrid, Link: UiLink, Pressable: UiPressable, Icon: UiIcon, Portal: UiPortal, LiquidGlass: UiLiquidGlass, BottomSheet: UiBottomSheet, Actionsheet: UiActionsheet, ImageViewer: UiImageViewer, ChatAi: UiChatAi } = C;
33
33
  export const install = app => { for (const [n, c] of Object.entries(C)) app.component('Ui' + n, c); };
34
34
  export { fmt, setIconBase, rules } from '../core/index.js';
35
35
  export { useUiTheme } from '../theme.js';